Upgrade to Pro — share decks privately, control downloads, hide ads and more …

入門 Prometheus / Introduction to Prometheus

入門 Prometheus / Introduction to Prometheus

Prometheus Tokyo Meetup #2 - 2019/6/3

Kazuki Suda

June 03, 2019
Tweet

More Decks by Kazuki Suda

Other Decks in Technology

Transcript

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

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

    サーバ - exporter - クライアントライブラリ - サービスディスカバリ - ダッシュボード - レコーディングルールとアラートルール - アラート管理 - ⻑期記憶ストレージ 3. より詳しく知るには
  3. @superbrothers Prometheus ▶ https://github.com/prometheus/prometheus (Apache 2.0) ▶ オープンソースのメトリクスベースモニタリングシステム + プル型で単純なテキストのメトリクス形式

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

    + 問題に対処するために必要な情報の提供 ▶ トレンド調査 + 現時点では問題ではないが時間経過とともにどのように変化していくかを知る + キャパシティプランニング ▶ 他のシステムへの情報提供 + オートスケーリングなど、⾃動化のために必要な情報を提供する
  5. @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 などのコンテキストをエントリとして記録する + アクセスログ ▶ サンプリングしないので、記録できるコンテキストに⼤きな制限がなく、特定のイベントにどの ような問題があるのかを正確に特定できる ▶ ⼀⽅で⼤量のストレージと帯域が必要になる
  6. @superbrothers Tracing / トレーシング ▶ 1つのリクエストといった区切られたスコープのなかで関数呼び出しなどの
 複数のイベントを記録し、ボトルネックがどこにあるのかを明らかにする + スタックトレース +

    プロセスをまたぐと分散トレーシングと呼ばれる ▶ サンプリングによってデータ量を⼀定に保ちつつ、
 パフォーマンスに及ぼす影響を合理的な範囲に留める 12.94ms 11.95ms 6.91ms 6.71ms 1.27ms 0.04ms
  7. @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
  8. @superbrothers 
 Prometheus サーバ サービス
 ディスカバリ スクレイ
 ピング PromQL DNS,

    EC2, Kubernetes, Consul, file クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション exporter exporter exporter exporter exporter サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション TSDB Alertmanager Alertmanager ノード HDD / SSD ダッシュボード Web UI Pushgateway ジョブ ジョブ ジョブ ジョブ メール, Slack
 PagerDuty
  9. @superbrothers ▶ https://github.com/prometheus/tsdb ▶ 時系列データベース / Time Series Database ストレージ

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


    Prometheus サーバ サービス
 ディスカバリ スクレイ
 ピング PromQL TSDB HDD / SSD ノード クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション exporter exporter exporter exporter exporter サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション
  11. @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
  12. @superbrothers ▶ ゲージ / Gauge + 状態のスナップショットで、集計により合計、平均の計算と最⼩値、最⼤値の検出を⾏う + CPU やメモリ、ストレージといったリソース使⽤量など

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

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

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

    Go、Python、Java/JVM、Ruby ▶ サードパーティ + C#/.Net、Node.js、Haskell、Erlang、Rustなど サービス
 ディスカバリ スクレイ
 ピング TSDB クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション
  16. @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
  17. @superbrothers プッシュゲートウェイ / Pushgateway サービスレベルバッチジョブのメトリクスキャッシュ ▶ バッチは短命なワークロードであり、スクレイプできない ▶ Pushgateway は、バッチの終了時にプッシュされた


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

    kubernetes_sd ▶ consul_sd ▶ etc 
 Prometheus サーバ サービス
 ディスカバリ スクレイ
 ピング PromQL file, DNS, EC2, Kubernetes, Consul TSDB
  19. @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]))
  20. @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)
  21. @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
  22. @superbrothers 
 Prometheus サーバ サービス
 ディスカバリ スクレイ
 ピング PromQL DNS,

    EC2, Kubernetes, Consul, file クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション exporter exporter exporter exporter exporter サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション TSDB Alertmanager Alertmanager ノード HDD / SSD ダッシュボード Web UI Pushgateway ジョブ ジョブ ジョブ ジョブ メール, Slack
 PagerDuty