じゃあ、おうちで学べる

本能を呼び覚ますこのコードに、君は抗えるか

FaaSにおけるPrometheus について

最近,Prometheusを扱う機会が増えた.それにしても, 監視/計測 は難しい.システムがきちんと動いていると言えますか?本ブログは自信を持って動いていると言えるようにするために,システムのどの部分をどのように監視すべきか,また監視をどのように改善していくべきかについて解説するようなモノではなく様々なソフトウェアにサードパーティーとして実装されていたりOpenFaaSKnativeといったサーバーレスフレームワークで用いられているような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.gorequests.goで利用されている

Knative

Knativeでも,多くの場面でPrometheusが使われていてOpenFaaS 同様動作しているFunctionに関する監視を主に行っているようですね.そもそも,前提としているIstioで利用されています.

GoDocにあるコードも結構参考になるのでぜひ,ご一読お願いします. godoc.org

参照

入門 監視 ―モダンなモニタリングのためのデザインパターン

Prometheus - Monitoring system & time series database