最近,Prometheusを扱う機会が増えた.それにしても, 監視/計測 は難しい.システムがきちんと動いていると言えますか?本ブログは自信を持って動いていると言えるようにするために,システムのどの部分をどのように監視すべきか,また監視をどのように改善していくべきかについて解説するようなモノではなく様々なソフトウェアにサードパーティーとして実装されていたりOpenFaaSやKnativeといったサーバーレスフレームワークで用いられているようなOSSでも用いられる監視ツールであるPrometheusの利用方法や具体的な実装方法を説明していく.
既出を知ることで車輪の再開発を防ぐ
Prometheusは2012年に始まり,2016年7月にバージョン1.0がリリースされた,音楽共有サービスを手がけるSoundCloudが開発したもので,現在は独立したプロジェクトとしてLinux Foundationのクラウド関連オープンソースプロジェクト”Cloud Native Computing Foundation”の支援の下活発な開発が続けられており,2017年11月9日にはメジャーアップデート版となるバージョン2.0がリリースされており.また,2018年9月にはCloud Native Computing Foundation Announces Prometheus Graduationが発表された.そのドキュメント化,ガバナンス,コミュニティの持続性と包括性に対する強い献身を実証してきました.PromConなどのコミュニティやOpenMetricsなどの標準化向けた取り組みもあるためほとんどの監視には既存のExporterが存在してほとんどのことは対応できる.
その中でPrometheus 公式のサポートを受けているexpoterであるものもかなり多くメンテナンスも活発であり有名なものにnode_exporterなどがある.Kubernetesなどでも使われているので実装の際にはすごく参考になるので楽しんで読んでもらいたい
Prometheus Pushgateway
一時的なバッチジョブがPrometheusにメトリクスを公開するために,Prometheus Pushgatewayがあるらしい.
docker pull prom/pushgateway docker run -d -p 9091:9091 prom/pushgateway echo "bench_press 120" | curl --data-binary @- http://127.0.0.1:9091/metrics/job/bench_press_work
# curl -s localhost:9091/metrics | grep bench # TYPE bench_press untyped bench_press{instance="",job="bench_press_work"} 120 push_time_seconds{instance="",job="bench_press_work"} 1.545110075085184e+09
Prometheusに設定すれば良い
Prometheus 本体に以下のような設定を入れればPrometheus側で値を保持できます.
scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['pushgateway_URL:9091']
expoterを書く
Promtheusは,Prometheus本体とexporterからなります.Prometheusがexporterを叩いて回って,メトリクスを溜めてくれる形になっています.今回は(WRITING EXPORTERS)https://prometheus.io/docs/instrumenting/writing_exporters/をあまり考慮せずに雑にサンプルコードを書きますが皆さんが何か書きたいときはぜひ,ご一読お願いします.
実装としてはこんな感じにチャンネルを引数に取る関数で、そこにMetricインタフェースを実装した構造体を投入していけばいい感じに集計してくれます.
type prometheus.Collector interface { Describe(chan<- *prometheus.Desc) Collect(chan<- prometheus.Metric) }
Kuberntes におけるPrometheusの利用
PrometheusはKubernetes APIを使ってターゲットを発見します.Kubernetes Service Discoveryには,現在5種類あります.
- Node
- Endpoint
- Service
- Pod
- Input
FaaSにおけるPrometheusの利用
余談はこの辺にして
OpenFaaS
OpenFaaSはgatewayなどにおいて動作しているFunctionの監視などを行っている. metrics.goやrequests.goで利用されている
Knative
Knativeでも,多くの場面でPrometheusが使われていてOpenFaaS 同様動作しているFunctionに関する監視を主に行っているようですね.そもそも,前提としているIstioで利用されています.
GoDocにあるコードも結構参考になるのでぜひ,ご一読お願いします. godoc.org