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
    Prometheus Tokyo Meetup #2 (2019/6/3)
    ⼊⾨ Prometheus

    View full-size slide

  2. @superbrothers
    Kazuki Suda / @superbrothers
    ▶ ソフトウェアエンジニア
    ▶ Kubernetes Meetup Tokyo, Cloud Native Deep Dive 共同主催者
    ▶ Kubernetes Active Contributor
    ▶ CNCF Ambassador
    ▶ 「Kubernetes実践⼊⾨」、「みんなのDocker/Kubernetes」共著書
    ▶ 「⼊⾨ Prometheus」監訳書

    View full-size slide

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

    View full-size slide

  4. @superbrothers
    Prometheus とは何か

    View full-size slide

  5. @superbrothers
    Prometheus
    ▶ https://github.com/prometheus/prometheus (Apache 2.0)
    ▶ オープンソースのメトリクスベースモニタリングシステム
    + プル型で単純なテキストのメトリクス形式
    + 柔軟なクエリ⾔語
    + サービスディスカバリ機構との連携で動的な環境のモニタリングが得意
    + ダッシュボードとアラート通知
    ▶ 2012年に SoundCloud の数名のエンジニアが開発
    + 2015年のオープンソースとして公開
    ▶ 2016年に Cloud Native Computing Foundation の2番⽬のプロジェクトのメンバになる
    + 2018年8⽉に “卒業” (Graduated) プロジェクトとなる

    View full-size slide

  6. @superbrothers
    モニタリング
    本番環境でアプリケーションやツール、データベース、ネットワークの問題を知り、
    それに対処するための情報を得て、問題に対処すること。
    ▶ アラートと問題の特定
    + システムの状態が悪くなっていることを知り、問題への対処を始める
    ▶ デバッグ情報の提供
    + 問題に対処するために必要な情報の提供
    ▶ トレンド調査
    + 現時点では問題ではないが時間経過とともにどのように変化していくかを知る
    + キャパシティプランニング
    ▶ 他のシステムへの情報提供
    + オートスケーリングなど、⾃動化のために必要な情報を提供する

    View full-size slide

  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

    View full-size slide

  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 などのコンテキストをエントリとして記録する
    + アクセスログ
    ▶ サンプリングしないので、記録できるコンテキストに⼤きな制限がなく、特定のイベントにどの
    ような問題があるのかを正確に特定できる
    ▶ ⼀⽅で⼤量のストレージと帯域が必要になる

    View full-size slide

  9. @superbrothers
    Tracing / トレーシング
    ▶ 1つのリクエストといった区切られたスコープのなかで関数呼び出しなどの

    複数のイベントを記録し、ボトルネックがどこにあるのかを明らかにする
    + スタックトレース
    + プロセスをまたぐと分散トレーシングと呼ばれる
    ▶ サンプリングによってデータ量を⼀定に保ちつつ、

    パフォーマンスに及ぼす影響を合理的な範囲に留める
    12.94ms
    11.95ms
    6.91ms
    6.71ms
    1.27ms
    0.04ms

    View full-size slide

  10. @superbrothers
    Metrics / メトリクス
    ▶ イベントの集計した結果が経時的にどのように変化しているかを明らかにする
    ▶ よく使われるメトリクスとしては、HTTP リクエスト数やリクエストの処理にかかった時間、リ
    ソース使⽤量など
    ▶ できる限りのコンテキストを無視することで、データ量と処理を合理的な範囲に維持する
    + カーディナリティ

    View full-size slide

  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

    View full-size slide

  12. @superbrothers
    Prometheus のアーキテクチャ

    View full-size slide

  13. @superbrothers

    Prometheus サーバ
    サービス

    ディスカバリ
    スクレイ

    ピング
    PromQL
    DNS, EC2, Kubernetes, Consul, file
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション
    exporter
    exporter
    exporter
    exporter
    exporter
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション
    TSDB
    Alertmanager
    Alertmanager
    ノード HDD / SSD
    ダッシュボード
    Web UI
    Pushgateway
    ジョブ
    ジョブ
    ジョブ
    ジョブ
    メール, Slack

    PagerDuty

    View full-size slide

  14. @superbrothers
    ▶ 設定ファイルを持つ1個の静的リンクされたバイナリ
    Prometheus サーバ

    Prometheus サーバ
    サービス

    ディスカバリ
    スクレイ

    ピング
    PromQL
    TSDB
    HDD / SSD
    ノード
    $ prometheus \
    --config.file ./prometheus.yml

    View full-size slide

  15. @superbrothers
    ▶ https://github.com/prometheus/tsdb
    ▶ 時系列データベース / Time Series Database
    ストレージ / TSDB

    Prometheus サーバ
    サービス

    ディスカバリ
    スクレイ

    ピング
    PromQL
    TSDB
    HDD / SSD
    ノード

    View full-size slide

  16. @superbrothers
    ▶ HTTP リクエストによるメトリクスの取得
    ▶ 通常ターゲットごとに10秒から60秒に1回定期的に実⾏
    スクレイピング / Scraping

    Prometheus サーバ
    サービス

    ディスカバリ
    スクレイ

    ピング
    PromQL
    TSDB
    HDD / SSD
    ノード
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション
    exporter
    exporter
    exporter
    exporter
    exporter
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション

    View full-size slide

  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://:/metrics
    @superbrothers

    View full-size slide

  18. @superbrothers
    ▶ ゲージ / Gauge
    + 状態のスナップショットで、集計により合計、平均の計算と最⼩値、最⼤値の検出を⾏う
    + CPU やメモリ、ストレージといったリソース使⽤量など
    ▶ カウンタ / Counter
    + イベントの数やサイズを追跡し、アプリケーションが開⽰する値は、開始時からの合計となる
    + ゲージと異なり値⾃体に意味がなく、カウンタがいかに早く増えていくかに意味がある
    + ノードのネットワークトラフィックの量
    メトリクスタイプ / Metric Types
    @superbrothers

    View full-size slide

  19. @superbrothers
    ▶ ヒストグラム / Histogram
    + イベントのサイズの分布を追跡でき、そこから分位数も計算できる
    + 0.9分位数 (90パーセンタイル) など
    ▶ サマリ / Summary
    + 通常_sum、_count のふたつのデータが含み、quantile ラベルを持つ時系列データが含ま
    れている場合も
    + _sum、_count は、ともにカウンタ
    + HTTPレスポンスボディサイズなど
    メトリクスタイプ / Metric Types
    @superbrothers

    View full-size slide

  20. @superbrothers
    エクスポータ / exporter
    他の形式のメトリクスデータを Prometheus で処理できる形式に変換する
    ▶ Node exporter
    + マシンに関するメトリクスを提供する
    ▶ HA Proxy exporter, Blackbox exporter, cAdvisor, kube-state-metrics
    ▶ 数百の exporter がオープンソースで公開されており、すぐに利⽤できる
    サービス

    ディスカバリ
    スクレイ

    ピング
    exporter
    exporter
    exporter
    exporter
    exporter
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション
    TSDB
    ノード HDD / SSD

    View full-size slide

  21. @superbrothers
    クライアントライブラリ / Client library
    ⾃⾝のアプリケーションにメトリクス⽣成装置を追加する (ダイレクトインストルメンテーション)
    ▶ 公式ライブラリ
    + Go、Python、Java/JVM、Ruby
    ▶ サードパーティ
    + C#/.Net、Node.js、Haskell、Erlang、Rustなど
    サービス

    ディスカバリ
    スクレイ

    ピング
    TSDB
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション

    View full-size slide

  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

    View full-size slide

  23. @superbrothers
    プッシュゲートウェイ / Pushgateway
    サービスレベルバッチジョブのメトリクスキャッシュ
    ▶ バッチは短命なワークロードであり、スクレイプできない
    ▶ Pushgateway は、バッチの終了時にプッシュされた

    直近のメトリクスを開⽰する
    ▶ 性質上、特定のマシンやインスタンスに限らない

    1つのサービスに適⽤されることに注意

    サービス

    ディスカバリ
    スクレイ

    ピング
    TSDB
    ノード HDD / SSD
    Pushgateway
    ジョブ
    ジョブ
    ジョブ
    ジョブ

    View full-size slide

  24. @superbrothers
    サービスディスカバリ
    スクレイプターゲットの発⾒
    ▶ file_sd
    ▶ dns_sd
    ▶ ec2_sd
    ▶ kubernetes_sd
    ▶ consul_sd
    ▶ etc

    Prometheus サーバ
    サービス

    ディスカバリ
    スクレイ

    ピング
    PromQL
    file, DNS, EC2, Kubernetes, Consul
    TSDB

    View full-size slide

  25. @superbrothers
    https://kbild.ch/blog/2019-02-18-awsprometheus/

    View full-size slide

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

    View full-size slide

  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]))

    View full-size slide

  28. @superbrothers
    https://www.replex.io/blog/kubernetes-in-production-the-ultimate-guide-to-monitoring-resource-metrics-with-grafana

    View full-size slide

  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)

    View full-size slide

  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

    View full-size slide

  31. @superbrothers
    https://coreos.com/blog/developing-prometheus-alerts-for-etcd.html

    View full-size slide

  32. @superbrothers
    アラート管理 / Alertmanager
    Prometheus からアラートを受信し、それをアラート通知に変換する
    ▶ メール、Slack、PagerDuty
    ▶ クラスタリングのサポート
    + すでに通知済かどうかといった情報の交換
    Alertmanager
    Alertmanager
    メール, Slack

    PagerDuty

    View full-size slide

  33. @superbrothers
    ⻑期記憶ストレージ
    Prometheus はローカルディスクを利⽤するため、残せるデータはそのマシンのディスクサイズに
    制限され、数⽇から数週間のデータを扱う。しかし、キャパシティプランニングには数年単位の
    データが必要となる。
    ▶ Remote read/write API
    + ほかのシステムとの連携
    ▶ API に対応している⻑期記憶ストレージ
    + InfluxDB, Cortex, Thanos, M3DB

    View full-size slide

  34. @superbrothers

    Prometheus サーバ
    サービス

    ディスカバリ
    スクレイ

    ピング
    PromQL
    DNS, EC2, Kubernetes, Consul, file
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション
    クライアント

    ライブラリ
    アプリケーション
    exporter
    exporter
    exporter
    exporter
    exporter
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション
    サードパーティ

    アプリケーション
    TSDB
    Alertmanager
    Alertmanager
    ノード HDD / SSD
    ダッシュボード
    Web UI
    Pushgateway
    ジョブ
    ジョブ
    ジョブ
    ジョブ
    メール, Slack

    PagerDuty

    View full-size slide

  35. @superbrothers
    より詳しく知るには

    View full-size slide

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

    View full-size slide

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

    View full-size slide