LINE Engineering
Blog

Prometheusをサービスとして提供する

Paul Traylor 2017.12.25

現在、開発者向けの便利なサーバーモニタリングシステムと通知システムの構築に携わっています。

こんにちは。LINE Fukuoka開発チームのPaul Traylorです。LINEファミリーアプリを支えるたくさんのサーバーのモニタリングを担当しています。この記事はLINE Advent Calendar 2017の25日目の記事です。

ほとんどの開発者にとって興味深いことといえば、コード作成や新機能の追加ではないかと思います。しかし機能が正常に動作しないときは、原因がわかれば役に立ちますよね。とはいえ、開発者が自分自身でモニタリングの設定を行うのは、そう簡単ではないときもあります。そこで私は、最高のパフォーマンスのためあらゆるサービスをモニタリングできるように、モニタリングの設定管理を簡単にすることに取り組んでいます。その一環として開発されたのが、Prometheusの設定を管理するためのツールであるPromgenです。これを利用すれば、モニタリングターゲットを簡単に登録したり、担当サービスのアラートを購読したりできます。

モニタリングの設定

ほとんどのサービスは導入時にはシンプルで小規模なものですが、時間が経つにつれ、数百台のサーバーにまたがる数十ものコンポーネントで構成されるようになります。そうした中でモニタリングを設定するのは容易なことではありません。そこでPromgenは、あらゆる設定を1箇所でまとめて行い、一目で確認できるように開発されました。

targets

開発者が作業にかける手間をなるべく減らすため、多くのアクションをボタン1つで済ませられるようにしてあります。モニタリングターゲットの新規登録から、ハードウェア異常のためメンテナンスが必要なサーバーの停止、さらには、ターゲットが稼働しているかどうかの単なる確認まで、ワンクリックで作業できます。

通知の設定

登録したモニタリングターゲットで問題が発生したときは、通知を受け取りたいですよね。個人的にはLINE Notifyでの通知が好きですが、Promgenはメール通知にも対応しています。通知を設定したいプロジェクトの検索も、通知方法の設定も、Promgenでは数回のクリックで簡単にできます。

notifications

上に示すPromgenの通知設定ページでメールとLINE Notifyの通知を簡単に設定し、担当サービスでアラートが発生したときに通知を受け取れます。

ルールの設定

Prometheusには独自のクエリ言語であるPromQLがあり、メトリクスを調べるためのさまざまな関数や演算子を利用できます。 たとえば、ある値の変化の速さを見たいときは、rate()関数がよく使われます。以下にその使用例を示します。

# 過去5分間のアラートの受信レートを確認する。
rate(alertmanager_alerts_received_total[5m])

あるいは、max()avg()などの演算子を利用し、クエリ対象のメトリクスをサービスやプロジェクトごとにグループ分けできます。

# シャード内のサーバー間のドリフトが120秒以上かどうかを確認するため、
# 実行中の各Prometheusインスタンスでタイムスタンプの最大値と最小値を求め、
# プロジェクトごとにグループ化する。
max(prometheus_config_last_reload_success_timestamp_seconds{job="prometheus"}) BY (project)
  -
min(prometheus_config_last_reload_success_timestamp_seconds{job="prometheus"}) BY (project)
> 120

time()関数を利用すれば、タイムスタンプの値を比較してジョブの遅延有無、あるいはSSL/TLS証明書を更新するタイミングか否かを確認できます。

# 保有するSSL証明書のうち、30日以内に期限が切れるものがあるか調べる。
probe_ssl_earliest_cert_expiry{job="blackbox"} - time() < 86400 * 30

ルール作成はPrometheusを使う際に直面するハードルの1つです。ルールは多くのサービスを広くカバーする必要がありますが、あまり細かく設定されていても不要なアラートを発生させてしまいます。たとえば、Hadoopサービスを実行していてCPUを最大限に使いたい場合、デフォルトの設定では不要なCPU負荷アラームがどんどん届いてしまいます。あるいは、ファイルストレージノードを実行していて、その使用率が一定のペースで上昇することがわかっている場合、使用率が80%になったときより空き容量が10GBになったときに通知を受け取りたい、ということがあるかもしれません。メモリやディスクの使用量はあらゆるサービスと関係しています。すべてのサービスを満足させる共通のルールを作るのは難しいことです。ほとんどの場合をカバーできる妥当で一般的なルールを設定し、特定のサービスで必要なときは、それらのルールをオーバーライドできる必要があります。

Rules

Promgenにマクロを実装すると、設定をPrometheusにデプロイするときにルールの一部を動的に生成できます。

  • 親ルールで基本的なデフォルト設定をカバーしますが、このルールにPromgenに特有の<exclude>マクロを設定します。
  • 子サービスや子プロジェクトで「Overwrite」ボタンをクリックすると、既存のルールをコピーし、特定のサービスに合わせて編集できます。
  • Promgenはルールをレンダリングする際、親ルールからすべての子ルールを排除するマッチャーを使って<exclude>マクロ部分を埋めていきます。
# 子ルールは、オーバーライドしたい特定サービスだけをクエリするためだけに書かれる。
node_load1{service="monitoring"} > 50
# 親ルールは、特定のオーバーライドを持つ子ルール以外のすべてをクエリするために書き直される。
node_load1{service!~"monitoring|hadoop"} > 30

特定サービスについてアラートを受け取りたくない場合は、まず親ルールをオーバーライドして当該サービス専用の子ルールを作成します。するとサービスは親ルールの適用外となり、子ルールのみが適用されるようになります。そして子ルールを無効のままにしておけば、子ルールがPrometheusサーバーに送信されることはありません。

Prometheusの運用

社内のPrometheus利用のニーズは増加してきているため、私たちもサーバー数を増やしてきました。拡張性を考慮して、Prometheusはシンプルな構成にして、サーバー間で構成要素を共有しない設計になっています。高可用性を確保するため、各Prometheusサーバーは同じ構成のサーバーをペアで運用しています。そしてモニタリングターゲットをこれらのペアのいくつかに分け、数千種類のターゲットをモニタリングし、インターバルごとに数百万ものサンプルを収集しています。

Operation

上の図に示すPrometheus運用のフローは、以下のようにまとめることができます。

  1. Promgenは、すべてのPrometheusサーバーの設定管理に使われます。
  2. Prometheusは、ターゲットをスクレープしメトリクスを記録します。
  3. アラートが発動される際は、まずアラートマネージャ(Alertmanager)で重複するアラートを処理してから、Promgen経由でLINE Notifyやメールから通知が行われます。
  4. 開発者は通知内容のウェブリンクから直接Grafanaにアクセスし、問題を診断できます。

不適切な設定への対策

他のモニタリングソリューションに比べると、Prometheusはターゲットごとに数千種類におよぶさまざまなメトリクスを追跡できるのが特長です。また、Prometheusのクエリ言語を使うと、インフラの多様なレイヤーをクエリできます。ただ、Prometheusのその強力さゆえに、アプリケーションを計測する際、開発者が簡単にミスをしてしまう恐れもあります。

Samples
rate(prometheus_local_storage_out_of_order_samples_total[5m]) > 10

Prometheusはあくまでもメトリクスをドロップするだけで、直接の影響はありません。ただ、開発者はデータの欠落に困惑することでしょう。私たちはPrometheusをサービスとしてチーム外部に提供しているので、できるだけ使い方を簡単にし、ミスを事前に防止できるように努めています。そのため、開発者が新しいバージョンのサービスをデプロイする前に、発生しうる問題を事前に発見・解決してもらうためのセカンドテスト環境を提供しています。なお、開発者が問題点をいち早く見つけ出せるよう、Prometheus自体をモニタリングするルールもいくつか定義しています。

今後の計画

Prometheusは強力な分、習得は簡単ではありません。モニタリングターゲットからアラートメッセージの通知先まで、設定項目もさまざまです。それらの作業に役立ててもらおうとPromgenは開発されたわけですが、わかりやすいユーザーインターフェイスにするのは大変なときもあります。今後より多くの開発者が気軽にサービスのモニタリングを始められるよう、Promgenのさらなる改善に取り組んでいきたいと思います。

Prometheus Promgen AdventCalendar

Paul Traylor 2017.12.25

現在、開発者向けの便利なサーバーモニタリングシステムと通知システムの構築に携わっています。

Add this entry to Hatena bookmark

リストへ戻る