入門 Prometheus / Introduction to Prometheus

入門 Prometheus / Introduction to Prometheus

Prometheus Tokyo Meetup #2 - 2019/6/3

9f9df80ab6551776b49c4ad9432ba1b7?s=128

Kazuki Suda

June 03, 2019
Tweet

Transcript

  1. @superbrothers Prometheus Tokyo Meetup #2 (2019/6/3) ⼊⾨ Prometheus

  2. @superbrothers Kazuki Suda / @superbrothers ▶ ソフトウェアエンジニア ▶ Kubernetes Meetup

    Tokyo, Cloud Native Deep Dive 共同主催者 ▶ Kubernetes Active Contributor ▶ CNCF Ambassador ▶ 「Kubernetes実践⼊⾨」、「みんなのDocker/Kubernetes」共著書 ▶ 「⼊⾨ Prometheus」監訳書
  3. @superbrothers アジェンダ 1. Prometheus とは何か 2. Prometheus のアーキテクチャ - Prometheus

    サーバ - exporter - クライアントライブラリ - サービスディスカバリ - ダッシュボード - レコーディングルールとアラートルール - アラート管理 - ⻑期記憶ストレージ 3. より詳しく知るには
  4. @superbrothers Prometheus とは何か

  5. @superbrothers Prometheus ▶ https://github.com/prometheus/prometheus (Apache 2.0) ▶ オープンソースのメトリクスベースモニタリングシステム + プル型で単純なテキストのメトリクス形式

    + 柔軟なクエリ⾔語 + サービスディスカバリ機構との連携で動的な環境のモニタリングが得意 + ダッシュボードとアラート通知 ▶ 2012年に SoundCloud の数名のエンジニアが開発 + 2015年のオープンソースとして公開 ▶ 2016年に Cloud Native Computing Foundation の2番⽬のプロジェクトのメンバになる + 2018年8⽉に “卒業” (Graduated) プロジェクトとなる
  6. @superbrothers モニタリング 本番環境でアプリケーションやツール、データベース、ネットワークの問題を知り、 それに対処するための情報を得て、問題に対処すること。 ▶ アラートと問題の特定 + システムの状態が悪くなっていることを知り、問題への対処を始める ▶ デバッグ情報の提供

    + 問題に対処するために必要な情報の提供 ▶ トレンド調査 + 現時点では問題ではないが時間経過とともにどのように変化していくかを知る + キャパシティプランニング ▶ 他のシステムへの情報提供 + オートスケーリングなど、⾃動化のために必要な情報を提供する
  7. @superbrothers モニタリングのカテゴリ http://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html Logging
 Events Tracing
 Request scoped Metrics
 Aggregatable

    Low
 volume High
 volume
  8. @superbrothers 208.80.193.39 - - [25/May/2010:16:50:33 +0100] "GET / HTTP/1.0" 403

    323 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; mediacenter; STB; 560x384; MSNTV 82.80.249.160 - - [25/May/2010:22:48:54 +0100] "GET / HTTP/1.1" 403 267 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; InfoPath.1; . 198.186.192.44 - - [26/May/2010:02:13:20 +0100] "GET / HTTP/1.1" 403 327 "-" "-" 66.249.71.179 - - [26/May/2010:03:36:51 +0100] "GET /robots.txt HTTP/1.1" 403 269 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 66.249.71.179 - - [26/May/2010:03:36:52 +0100] "GET / HTTP/1.1" 403 263 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 198.186.192.44 - - [27/May/2010:01:56:54 +0100] "GET / HTTP/1.1" 403 327 "-" "-" 208.80.193.29 - - [27/May/2010:03:08:17 +0100] "GET / HTTP/1.0" 403 323 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; FunWebProducts; SIMBAR=0; .NET C 66.249.68.210 - - [27/May/2010:03:46:25 +0100] "GET /robots.txt HTTP/1.1" 403 269 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 66.249.68.210 - - [27/May/2010:03:46:25 +0100] "GET / HTTP/1.1" 403 263 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 198.186.192.44 - - [28/May/2010:02:04:30 +0100] "GET / HTTP/1.1" 403 327 "-" "-" 184.73.2.36 - - [28/May/2010:05:14:00 +0100] "GET /robots.txt HTTP/1.0" 403 272 "-" "SheenBot/SheenBot-1.0.4 (Sheen web crawler)" 184.73.2.36 - - [28/May/2010:05:14:00 +0100] "GET / HTTP/1.0" 403 267 "-" "SheenBot/SheenBot-1.0.4 (Sheen web crawler)" 208.80.193.42 - - [28/May/2010:12:56:12 +0100] "GET / HTTP/1.0" 403 323 "-" "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.0; Windows NT 5.1; FunWebProducts; InfoPat 208.80.193.43 - - [29/May/2010:21:54:59 +0100] "GET / HTTP/1.0" 403 323 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; SIMBAR={ED852896-9625-4d90- 188.140.124.209 - - [29/May/2010:23:04:22 +0100] "GET / HTTP/1.1" 403 263 "http://www.google.pt/url? sa=t&source=web&ct=res&cd=2&ved=0CBkQFjAB&url=http%3A%2F%2Ftransmsilverio.com%2F&rct=j&q=transportes+manuel+silverio&ei=YY8BTNzMMZKL4AbUpNTLDg&usg=AFQjCNGYg9Tda SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618; InfoPath.2)" 188.140.124.209 - - [29/May/2010:23:04:36 +0100] "GET / HTTP/1.1" 403 263 "http://www.google.pt/url? sa=t&source=web&ct=res&cd=2&ved=0CBkQFjAB&url=http%3A%2F%2Ftransmsilverio.com%2F&rct=j&q=transportes+manuel+silverio&ei=YY8BTNzMMZKL4AbUpNTLDg&usg=AFQjCNGYg9Tda SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618; InfoPath.2)" 188.140.124.209 - - [29/May/2010:23:05:56 +0100] "GET / HTTP/1.1" 403 263 "http://www.google.pt/url? sa=t&source=web&ct=res&cd=1&ved=0CBUQFjAA&url=http%3A%2F%2Ftransmsilverio.com%2F&rct=j&q=www.transmsilverio.com&ei=vI8BTKe6M4SV4gbjruzLDg&usg=AFQjCNGYg9TdafIh9k CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618; InfoPath.2)" 208.80.193.30 - - [31/May/2010:05:56:02 +0100] "GET / HTTP/1.0" 403 323 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; YPC 3.2.0; FunWebProducts; 207.44.204.87 - - [31/May/2010:14:35:45 +0100] "GET /wp-login.php HTTP/1.1" 403 274 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html 207.44.204.87 - - [31/May/2010:14:35:46 +0100] "GET /old/wp-login.php HTTP/1.1" 403 276 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot. 207.44.204.87 - - [31/May/2010:14:35:46 +0100] "GET /cms/wp-login.php HTTP/1.1" 403 276 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot. 207.44.204.87 - - [31/May/2010:14:35:47 +0100] "GET /blog/wp-login.php HTTP/1.1" 403 278 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot 207.44.204.87 - - [31/May/2010:14:35:47 +0100] "GET /blog_old/wp-login.php HTTP/1.1" 403 282 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com 207.44.204.87 - - [31/May/2010:14:35:48 +0100] "GET /blog-old/wp-login.php HTTP/1.1" 403 281 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com https://gist.github.com/pmcconnell-tc/9c3d57818d55ba7203d4e56f7142a43f Logging / ロギング ▶ イベントを対象として、イベント1つひとつのコンテキストの⼀部を記録する ▶ 例えば、HTTP リクエストをイベントとして、リクエスト時間、HTTP メソッド、パス、リクエ スト元 IP などのコンテキストをエントリとして記録する + アクセスログ ▶ サンプリングしないので、記録できるコンテキストに⼤きな制限がなく、特定のイベントにどの ような問題があるのかを正確に特定できる ▶ ⼀⽅で⼤量のストレージと帯域が必要になる
  9. @superbrothers Tracing / トレーシング ▶ 1つのリクエストといった区切られたスコープのなかで関数呼び出しなどの
 複数のイベントを記録し、ボトルネックがどこにあるのかを明らかにする + スタックトレース +

    プロセスをまたぐと分散トレーシングと呼ばれる ▶ サンプリングによってデータ量を⼀定に保ちつつ、
 パフォーマンスに及ぼす影響を合理的な範囲に留める 12.94ms 11.95ms 6.91ms 6.71ms 1.27ms 0.04ms
  10. @superbrothers Metrics / メトリクス ▶ イベントの集計した結果が経時的にどのように変化しているかを明らかにする ▶ よく使われるメトリクスとしては、HTTP リクエスト数やリクエストの処理にかかった時間、リ ソース使⽤量など

    ▶ できる限りのコンテキストを無視することで、データ量と処理を合理的な範囲に維持する + カーディナリティ
  11. @superbrothers Prometheus の領域 Logging
 Events Tracing
 Request scoped Metrics
 Aggregatable

    http://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html Low
 volume High
 volume
  12. @superbrothers Prometheus のアーキテクチャ

  13. @superbrothers 
 Prometheus サーバ サービス
 ディスカバリ スクレイ
 ピング PromQL DNS,

    EC2, Kubernetes, Consul, file クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション exporter exporter exporter exporter exporter サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション TSDB Alertmanager Alertmanager ノード HDD / SSD ダッシュボード Web UI Pushgateway ジョブ ジョブ ジョブ ジョブ メール, Slack
 PagerDuty
  14. @superbrothers ▶ 設定ファイルを持つ1個の静的リンクされたバイナリ Prometheus サーバ 
 Prometheus サーバ サービス
 ディスカバリ

    スクレイ
 ピング PromQL TSDB HDD / SSD ノード $ prometheus \ --config.file ./prometheus.yml
  15. @superbrothers ▶ https://github.com/prometheus/tsdb ▶ 時系列データベース / Time Series Database ストレージ

    / TSDB 
 Prometheus サーバ サービス
 ディスカバリ スクレイ
 ピング PromQL TSDB HDD / SSD ノード
  16. @superbrothers ▶ HTTP リクエストによるメトリクスの取得 ▶ 通常ターゲットごとに10秒から60秒に1回定期的に実⾏ スクレイピング / Scraping 


    Prometheus サーバ サービス
 ディスカバリ スクレイ
 ピング PromQL TSDB HDD / SSD ノード クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション exporter exporter exporter exporter exporter サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション
  17. @superbrothers メトリクス / Metrics @superbrothers # HELP go_gc_duration_seconds A summary

    of the GC invocation durations. # TYPE go_gc_duration_seconds summary go_gc_duration_seconds{quantile="0"} 0.000197882 go_gc_duration_seconds{quantile="0.25"} 0.000485779 go_gc_duration_seconds{quantile="0.5"} 0.006167069 go_gc_duration_seconds{quantile="0.75"} 0.013239405 go_gc_duration_seconds{quantile="1"} 0.013239405 go_gc_duration_seconds_sum 0.020090135 go_gc_duration_seconds_count 4 # HELP go_goroutines Number of goroutines that currently exist. # TYPE go_goroutines gauge go_goroutines 40 # HELP go_info Information about the Go environment. # TYPE go_info gauge go_info{version="go1.11.5"} 1 # HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. # TYPE go_memstats_alloc_bytes gauge go_memstats_alloc_bytes 1.325616e+07 # HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. # TYPE go_memstats_alloc_bytes_total counter go_memstats_alloc_bytes_total 1.7018552e+07 # HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. # TYPE go_memstats_buck_hash_sys_bytes gauge go_memstats_buck_hash_sys_bytes 1.452901e+06 $ curl http://<target>:<port>/metrics @superbrothers
  18. @superbrothers ▶ ゲージ / Gauge + 状態のスナップショットで、集計により合計、平均の計算と最⼩値、最⼤値の検出を⾏う + CPU やメモリ、ストレージといったリソース使⽤量など

    ▶ カウンタ / Counter + イベントの数やサイズを追跡し、アプリケーションが開⽰する値は、開始時からの合計となる + ゲージと異なり値⾃体に意味がなく、カウンタがいかに早く増えていくかに意味がある + ノードのネットワークトラフィックの量 メトリクスタイプ / Metric Types @superbrothers
  19. @superbrothers ▶ ヒストグラム / Histogram + イベントのサイズの分布を追跡でき、そこから分位数も計算できる + 0.9分位数 (90パーセンタイル)

    など ▶ サマリ / Summary + 通常_sum、_count のふたつのデータが含み、quantile ラベルを持つ時系列データが含ま れている場合も + _sum、_count は、ともにカウンタ + HTTPレスポンスボディサイズなど メトリクスタイプ / Metric Types @superbrothers
  20. @superbrothers エクスポータ / exporter 他の形式のメトリクスデータを Prometheus で処理できる形式に変換する ▶ Node exporter

    + マシンに関するメトリクスを提供する ▶ HA Proxy exporter, Blackbox exporter, cAdvisor, kube-state-metrics ▶ 数百の exporter がオープンソースで公開されており、すぐに利⽤できる サービス
 ディスカバリ スクレイ
 ピング exporter exporter exporter exporter exporter サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション TSDB ノード HDD / SSD
  21. @superbrothers クライアントライブラリ / Client library ⾃⾝のアプリケーションにメトリクス⽣成装置を追加する (ダイレクトインストルメンテーション) ▶ 公式ライブラリ +

    Go、Python、Java/JVM、Ruby ▶ サードパーティ + C#/.Net、Node.js、Haskell、Erlang、Rustなど サービス
 ディスカバリ スクレイ
 ピング TSDB クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション
  22. @superbrothers package main import ( "log" "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp"

    ) var ( requests = promauto.NewCounter( prometheus.CounterOpts{ Name: "hello_worlds_total", Help: "Hello Worlds requested.", }) ) func handler(w http.ResponseWriter, r *http.Request) { requests.Inc() w.Write([]byte("Hello World")) } func main() { http.HandleFunc("/", handler) http.Handle("/metrics", promhttp.Handler()) log.Fatal(http.ListenAndServe(":8000", nil)) } $ go run example.go & $ curl --silent http://localhost:8000/metrics \ | grep hello_worlds_total # HELP hello_worlds_total Hello Worlds requested. # TYPE hello_worlds_total counter hello_worlds_total 15
  23. @superbrothers プッシュゲートウェイ / Pushgateway サービスレベルバッチジョブのメトリクスキャッシュ ▶ バッチは短命なワークロードであり、スクレイプできない ▶ Pushgateway は、バッチの終了時にプッシュされた


    直近のメトリクスを開⽰する ▶ 性質上、特定のマシンやインスタンスに限らない
 1つのサービスに適⽤されることに注意
 サービス
 ディスカバリ スクレイ
 ピング TSDB ノード HDD / SSD Pushgateway ジョブ ジョブ ジョブ ジョブ
  24. @superbrothers サービスディスカバリ スクレイプターゲットの発⾒ ▶ file_sd ▶ dns_sd ▶ ec2_sd ▶

    kubernetes_sd ▶ consul_sd ▶ etc 
 Prometheus サーバ サービス
 ディスカバリ スクレイ
 ピング PromQL file, DNS, EC2, Kubernetes, Consul TSDB
  25. @superbrothers https://kbild.ch/blog/2019-02-18-awsprometheus/

  26. @superbrothers ダッシュボード PromQL を利⽤してメトリクスを集計し可視化する ▶ 式ブラウザ + Prometheus Web UI

    ▶ Grafana PromQL SD ダッシュボード Web UI
  27. @superbrothers PromQL ▶ セレクタ http_requests_total{job=“prometheus”,group=“canary"} ▶ マッチャ http_requests_total{environment=~"staging|development",method!="GET"} ▶ 直近5分間の1秒あたりの

    HTTP リクエスト数の平均 rate(http_requests_total{job=“api-server"}[5m]) ▶ 直近10分間のHTTP リクエストのレイテンシの90パーセンタイル histogram_quantile(0.9, rate(http_request_duration_seconds_bucket[10m]))
  28. @superbrothers https://www.replex.io/blog/kubernetes-in-production-the-ultimate-guide-to-monitoring-resource-metrics-with-grafana

  29. @superbrothers レコーディングルール 定期的に PromQL 式を実⾏し、事前にメトリクスを集計することで負荷を軽減する $ cat prometheus.yml global: scrape_interval:

    10s evaluation_interval: 10s rule_files: - rules.yml (略) $ cat rules.yml groups: - name: example rules: - record: job:process_cpu_seconds:rate5m expr: sum without(instance)(rate(process_cpu_seconds_total[5m])) - record: job:process_open_fds:max expr: max without(instance)(process_open_fds)
  30. @superbrothers アラートルール 定期的に PromQL 式を実⾏し、結果がそのままアラートとなる $ cat rules.yml groups: -

    name: node_rules rules: - record: job:up:avg expr: avg without(instance)(up{job="node"}) - alert: ManyInstancesDown expr: avg without(instance)(up{job="node"}) < 0.5 for: 5m
  31. @superbrothers https://coreos.com/blog/developing-prometheus-alerts-for-etcd.html

  32. @superbrothers アラート管理 / Alertmanager Prometheus からアラートを受信し、それをアラート通知に変換する ▶ メール、Slack、PagerDuty ▶ クラスタリングのサポート

    + すでに通知済かどうかといった情報の交換 Alertmanager Alertmanager メール, Slack
 PagerDuty
  33. @superbrothers ⻑期記憶ストレージ Prometheus はローカルディスクを利⽤するため、残せるデータはそのマシンのディスクサイズに 制限され、数⽇から数週間のデータを扱う。しかし、キャパシティプランニングには数年単位の データが必要となる。 ▶ Remote read/write API

    + ほかのシステムとの連携 ▶ API に対応している⻑期記憶ストレージ + InfluxDB, Cortex, Thanos, M3DB
  34. @superbrothers 
 Prometheus サーバ サービス
 ディスカバリ スクレイ
 ピング PromQL DNS,

    EC2, Kubernetes, Consul, file クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション exporter exporter exporter exporter exporter サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション TSDB Alertmanager Alertmanager ノード HDD / SSD ダッシュボード Web UI Pushgateway ジョブ ジョブ ジョブ ジョブ メール, Slack
 PagerDuty
  35. @superbrothers より詳しく知るには

  36. @superbrothers https://www.oreilly.co.jp/books/9784873118772/

  37. @superbrothers Thanks / Question? ▶ Kazuki Suda, @superbrothers ▶ Slide:

    https://speakerdeck.com/superbrothers/