Prometheus 3.0 ベータ版リリース

Prometheusチームは、Prometheusバージョン3.0-betaのリリースを発表できることを誇りに思います。 こちら からダウンロードできます。ベータ版リリースでは慣例として、重要な本番システムにPrometheus 3.0-betaをインストールすることはお勧めしませんが、皆様にテストしていただき、バグを見つけていただきたいと考えています。

一般的に、破壊的な変更は、非推奨の機能フラグの削除のみです。Prometheusチームは、下位互換性を確保し、既存のインストールを壊さないように努力しました。そのため、以下に説明するすべての新機能は、既存の機能に基づいて構築されています。ほとんどのユーザーは、設定を変更することなく、Prometheus 3.0をすぐに試すことができるはずです。

新機能

Prometheus 2.0のリリースからの7年間で7500以上のコミットがあり、個々の新機能や修正をすべてリストすることはできませんが、注目すべき大きな変更点と破壊的な変更点がいくつかあります。コミュニティの皆様に試していただき、発見した問題を報告していただく必要があります。フィードバックが増えるほど、最終的な3.0リリースはより安定したものになります。

新しいUI

Prometheus 3.0のハイライトの1つは、デフォルトで有効になっているまったく新しいUIです。

New UI query page

UIは、よりすっきりとした、よりモダンな外観、PromLensスタイルのツリービューなどの新機能で完全に書き直されており、よりモダンな技術スタックを使用することで、将来のメンテナンスが容易になります。

新しいUIの詳細については、PromLabsブログにあるJuliusの詳細な記事をご覧ください。ユーザーは、old-ui機能フラグを使用することで、一時的に古いUIを有効にすることができます。新しいUIはまだ実戦テストされていないため、バグが残っている可能性も非常に高いです。何かバグを見つけたら、GitHubで報告してください

Remote Write 2.0

Remote-Write 2.0は、メタデータ、エクゼンプラー、作成タイムスタンプ、ネイティブヒストグラムを含む、さまざまな新しい要素のネイティブサポートを追加することにより、以前のプロトコルバージョンを反復処理します。また、文字列のインターンを使用して、圧縮および解凍時のペイロードサイズとCPU使用率を削減します。詳細については、こちらをご覧ください。

OpenTelemetryのサポート

PrometheusはOpenTelemetryメトリクスを保存するためのデフォルトの選択肢となることを目指しており、3.0にはOpenTelemetryメトリクスデータのストレージバックエンドとしてさらに優れるようにするいくつかの大きな新機能が含まれています。

UTF-8

デフォルトでは、Prometheusは、バージョン2.xと同様に、メトリクス名とラベル名、およびラベル値で使用できるすべての有効なUTF-8文字を許可します。

ユーザーは、メトリクスの生成側がUTF-8の名前を渡すように設定されていることを確認する必要があります。どちらかの側がUTF-8をサポートしていない場合、メトリクス名は従来の下線置換メソッドを使用してエスケープされます。PromQLクエリは、UTF-8メトリクスを取得するために新しい引用符構文で記述するか、ユーザーが手動で__name__ラベル名を指定することができます。

すべての言語バインディングがUTF-8のサポートで更新されているわけではありませんが、主要なGoライブラリは更新されています。

OTLP取り込み

Prometheusは、/api/v1/otlp/v1/metricsエンドポイントでOTLPメトリクスを受信するOTLPメトリクスプロトコルのネイティブレシーバーとして構成できます。

ネイティブヒストグラム

ネイティブヒストグラムは、従来のヒストグラムよりも高い効率と低コストの代替手段を提供するPrometheusメトリックタイプです。データセットに基づいてバケット境界を選択(および更新の可能性)する必要があるのではなく、ネイティブヒストグラムには、指数関数的な成長に基づいた事前設定されたバケット境界があります。

ネイティブヒストグラムはまだ実験的なものであり、デフォルトでは有効になっていません。--enable-feature=native-histogramsを渡すことで有効にできます。テキスト形式やアクセサ関数/演算子など、ネイティブヒストグラムの一部の側面はまだ積極的に設計中です。

その他の破壊的な変更

次の機能フラグは削除され、代わりにデフォルトで有効になります。これらのフラグへの参照は構成から削除する必要があり、バージョン3.0以降のPrometheusでは無視されます。

  • promql-at-modifier
  • promql-negative-offset
  • remote-write-receiver
  • no-scrape-default-port
  • new-service-discovery-manager

範囲選択は、意図したよりも多くのポイントが操作に含まれるまれなケースを回避するために、左開きで右閉じになりました。

エージェントモードは安定し、機能フラグの代わりに独自の設定フラグを持つようになりました

OpenTelemetryへのコミットメント

OpenTelemetryプロジェクトは、トレース、メトリクス、ログなどのテレメトリデータを作成および管理するために設計されたオブザーバビリティフレームワークおよびツールキットです。シグナル間の仕様の一貫性があり、ベンダーロックインを削減できることから、広く採用されており、これは私たちが期待していることです。

2023年を振り返る

過去数年間、OpenTelemetryとPrometheusが双方向に互いにサポートできるように、OpenTelemetryコミュニティと協力してきました。これにより、2つのシステム間の変換を行うための公式仕様の策定、およびPrometheusメトリックをOpenTelemetryコレクターに取り込み、その逆も可能にする実装につながりました。

それ以来、Prometheusにメトリクスを保存する際のOpenTelemetryユーザーが直面する課題を理解するためにかなりの時間を費やし、それに基づいてそれらにどのように対処できるかを検討しました。提案された変更の一部は、たとえば、プッシュとプル両方のサポートなど、いずれかの側の動作保証を破らないように慎重な検討が必要です。PromCon Berlin 2023で、私たちは講演の1つでアイデアを要約しようとしました。

ベルリンでの開発サミットで、これらの変更とOpenTelemetryに関する一般的な見解について時間をかけて議論し、広く合意されたことは、「OpenTelemetryメトリクスのデフォルトストアになる」ということです!

このイニシアチブを主導する開発者のコアグループを形成し、OTelサポートをより重要な機能の1つとして、2024年にPrometheus 3.0をリリースする予定です。2024年に登場するもののプレビューをご紹介します。

今後の展望

OTLP取り込み GA

Prometheus v2.47.0(2023年9月6日リリース)では、PrometheusでのOTLP取り込みの実験的サポートを追加しました。これを継続的に改善しており、陳腐化のサポートを追加して安定した機能にする予定です。また、順序が異なる取り込みのサポートを安定版としてマークします。これには、ネイティブ/指数ヒストグラムのサポートをGAすることも含まれます。

UTF-8メトリック名とラベル名のサポート

OpenTelemetryセマンティック規約では、名前空間の文字として「.」を推奨しています。たとえば、http.server.request.durationです。ただし、Prometheusでは現在、より限定的な文字セットが必要なため、Prometheusに取り込む際にメトリックをhttp_server_request_durationに変換します。

これにより、不要な不協和音が生じるため、すべてのラベルとメトリクス名にUTF-8サポートを追加して、この制限を削除する作業を行っています。進捗状況はこちらで追跡されています。

リソース属性のネイティブサポート

OpenTelemetryは、メトリック属性(http.status_codeのようなメトリック自体を識別するためのラベル)とリソース属性(k8s.pod.nameのようなメトリックのソースを識別するためのラベル)を区別しますが、Prometheusにはよりフラットなラベルスキーマがあります。これにより、こちらで詳しく説明されている多くのユーザビリティの問題が発生します。

私たちは、さまざまな側面(クエリ、UX、ストレージなど)からこの問題のいくつかの解決策を検討していますが、私たちの目標は、リソース属性で簡単にフィルター処理およびグループ化できるようにすることです。これは進行中の作業であり、フィードバックと支援を求めています!

エコシステムでのOTLPエクスポート

Prometheusのリモート書き込みは、すでに主要なオブザーバビリティプロジェクトとベンダーのほとんどでサポートされています。ただし、OpenTelemetryプロトコル(OTLP)が注目を集めており、Prometheusエコシステム全体でサポートしたいと考えています。

Prometheusサーバー、SDK、およびエクスポーターへのサポートを追加したいと考えています。これは、Prometheus SDKでインストルメントされたサービスがOTLPをプッシュすることもでき、OpenTelemetryユーザー向けの豊富なPrometheusエクスポーターエコシステムを解放することを意味します。

ただし、Prometheusおよびプルベースのユースケース向けに最適化/簡略化された形式として、OpenMetrics Exposition形式を維持および開発する予定です。

デルタテンポラリティ

OpenTelemetryプロジェクトは、オブザーバビリティエコシステムにいくつかのユースケースがあるデルタテンポラリティもサポートしています。まだ多くのPrometheusユーザーがstatsdを実行しており、さまざまな理由でstatsd_exporterを使用しています。

私たちは、PrometheusサーバーでOpenTelemetryのDeltaテンポラリティをサポートしたいと考えており、その実現に向けて取り組んでいます

コントリビューション募集!

ご覧のとおり、Prometheusには多くの新しいエキサイティングなものが登場しています!オブザーバビリティに関する最も重要な2つのオープンソースプロジェクトの交差点で働くことに挑戦的で興味深いと感じるなら、ぜひ参加していただきたいと思っています!

今年はガバナンスの変更も予定されており、メンテナーになるプロセスがこれまでよりも簡単になります!Prometheusに影響を与えたいと思ったことがあるなら、今が始める絶好の機会です。

私たちの最初の焦点は、上記のすべての作業をどのように組織しているかを可能な限りオープンかつ透明にすることであり、これによりあなたも貢献できるようになります。このイニシアチブをサポートし、これらの機能を実装するのに協力してくれるコントリビューターを探しています。機能開発の進捗状況を追跡し、貢献できる方法を確認するには、Prometheus 3.0の公開ボードPrometheus OTelサポートマイルストーンを確認してください。コントリビューションも歓迎しています。

結論

提案されている変更の中には、大規模で侵襲的であったり、Prometheusの元のデータモデルからの根本的な逸脱を伴うものもあります。ただし、これらの変更は段階的に導入する予定であり、Prometheus 3.0には大きな破壊的な変更はなく、ほとんどのユーザーは影響を受けることなくアップグレードできます。

私たちは、Prometheusのこの新しい章に乗り出すことを楽しみにしています。提案された変更についてフィードバックをお寄せください。

PromCon Europe 2023のスケジュールが公開されました

PromCon Europeは、Prometheus監視システムに特化した8回目の会議です。

ドイツ、ベルリン – 2023年9月1日 – CNCFとPrometheusチームは、ドイツのベルリンで2023年9月28日から9月29日に開催されるシングルトラックのPromCon Europe 2023会議の2日間のスケジュールを発表しました。参加者は、Prometheusに関連する多様なトピックを網羅した21のフルレングス(25分)セッションと、最大20の5分間のライトニングトークセッションから選択できます。

8回目の開催となるPromConは、世界中のPrometheusユーザーと開発者が集まり、Prometheusの使用を通じて得られた知識、ベストプラクティス、経験を交換する場です。プログラム委員会は、現在のPrometheusに関する最も差し迫ったトピックについて、新鮮で有益な視点を提供する66件の提出物を審査しました。

「PromConがベルリンに帰ってくることを非常に嬉しく思っています。Prometheusは2012年にSoundcloudでベルリンで始まりました。最初のPromConはベルリンで開催され、その後ミュンヘンに移りました。今年は、ベルリンのフリードリヒスハインにあるRadialsystemで約300人の参加者を迎えます。ベルリンには活気のあるPrometheusコミュニティがあり、Prometheusチームのメンバーの多くが近所に住んでいます。システムとサービスの監視に情熱を注ぐPrometheusファミリーとネットワークを築き、つながる絶好の機会です」と、Polar Signalsのシニアソフトウェアエンジニアであり、今年のPromConプログラム委員会の責任者であるPrometheusチームメンバーのMatthias Loiblは述べています。「Prometheusチーム自体からの最新の開発について学び、大規模なPrometheusユーザーと密接につながる絶好の機会となるでしょう。」

コミュニティがキュレーションしたスケジュールには、オープンソースコミュニティメンバーからのセッションが含まれます。

PromCon Europe 2023の完全なプログラムについては、スケジュールをご覧ください。

登録

9月25日まで、登録して、対面参加の標準価格350米ドルをお支払いください。会場には300人分のスペースがあるので、お早めにお申し込みください!

スポンサーの皆様に感謝

PromCon Europe 2023は、Prometheusの素晴らしいコミュニティと、ダイヤモンドスポンサーであるGrafana Labs、プラチナスポンサーであるRed Hat、さらに多くのゴールドおよびスタートアップスポンサーの皆様のサポートのおかげで実現しました。今年の開催はPolar SignalsとCNCFによって組織されています。

Prometheusのドキュメンタリーを見る

連絡先

Jessie Adams-Shore - The Linux Foundation - [email protected]

PromCon主催者 - [email protected]

Prometheus 2.43の文字列ラベル最適化に関するFAQ

Prometheus 2.43がリリースされたばかりで、エキサイティングな機能と機能強化がいくつか含まれています。重要な改善点の1つは、ラベルに新しいデータ構造を使用するstringlabelsリリースです。このブログ投稿では、2.43リリースとstringlabels最適化に関するよくある質問に回答します。

stringlabelsリリースとは何ですか?

stringlabelsリリースは、ラベルに新しいデータ構造を使用するPrometheus 2.43バージョンです。すべてのラベル/値を単一の文字列に格納することで、ヒープサイズが小さくなり、ほとんどの場合で高速化が実現します。これらの最適化はデフォルトのバイナリには同梱されておらず、Goタグstringlabelsを使用してPrometheusをコンパイルする必要があります。

切り替え可能な機能フラグを使用しなかったのはなぜですか?

機能フラグを使用することも検討しましたが、メモリオーバーヘッドが発生するため、価値がないと判断しました。したがって、本番環境でのメリットをテストおよび測定することに関心のあるユーザー向けに、これらの最適化を施した個別のリリースを提供することにしました。

これらの最適化はいつ一般提供されるようになりますか?

これらの最適化は、次期Prometheus 2.44リリースでデフォルトで利用できるようになります。

2.43リリースを入手するにはどうすればよいですか?

Prometheus 2.43リリースは、Prometheusの公式GitHubリリースページで入手でき、ユーザーはそこからバイナリファイルを直接ダウンロードできます。さらに、コンテナを使用することを好むユーザー向けにDockerイメージも利用できます。

stringlabels最適化は、これらのデフォルトバイナリには含まれていません。この最適化を使用するには、2.43.0+stringlabelsリリースバイナリまたはv2.43.0-stringlabelsというタグの付いたDockerイメージを特別にダウンロードする必要があります。

なぜリリースがv2.43.0+stringlabelsで、Dockerタグがv2.43.0-stringlabelsなのですか?

セマンティックバージョニングでは、プラス記号(+)はビルドメタデータを表すために使用されます。したがって、stringlabels最適化を含むPrometheus 2.43リリースは、実験的なstringlabels機能が含まれていることを示すために2.43.0+stringlabelsという名前が付けられています。ただし、Dockerタグでは名前にプラス記号を使用することはできません。したがって、プラス記号はダッシュ(-)に置き換えられ、Dockerタグがv2.43.0-stringlabelsになりました。これにより、DockerタグはPrometheus Operatorなどのダウンストリームプロジェクトのセマンティックバージョニングチェックに合格できるようになります。

Prometheus 2.43リリースにおけるその他の注目すべき機能は何ですか?

stringlabels最適化に加えて、Prometheus 2.43リリースにはいくつかの新機能と機能強化が含まれています。重要な追加機能の一部を次に示します。

  • 異なるファイルからスクレイプ構成を含めるためにscrape_config_filesのサポートを追加しました。これにより、構成の管理と整理が容易になります。
  • HTTPクライアントには、2つの新しい構成オプションが含まれるようになりました。プロキシリクエストからURLを除外するno_proxyと、環境変数からプロキシを読み取るproxy_from_environmentです。これらの機能により、さまざまな環境でHTTPクライアントの動作を簡単に管理できます。

機能とバグ修正の詳細については、完全な変更履歴をご覧ください。

メトリック転送のための効率的でクラウドネイティブな方法であるPrometheusエージェントモードの紹介

Bartek Płotkaは、2019年からPrometheusのメンテナーであり、Red Hatの主席ソフトウェアエンジニアです。CNCF Thanosプロジェクトの共同作成者。CNCFアンバサダーおよびCNCF TAGオブザーバビリティの技術責任者。暇な時間には、O'Reillyで「Efficient Go」というタイトルの本を執筆しています。意見は私自身のものです!

私が個人的にPrometheusプロジェクトで気に入っていること、そして私がチームに参加した多くの理由の1つは、プロジェクトの目標にレーザーフォーカスしていることです。Prometheusは、実用的で信頼性が高く、安価でありながら、非常に価値のあるメトリックベースの監視を提供することに関して、常に境界を押し広げてきました。Prometheusの非常に安定した堅牢なAPI、クエリ言語、および統合プロトコル(リモート書き込みやOpenMetricsなど)により、Cloud Native Computing Foundation(CNCF)のメトリックエコシステムはこれらの強力な基盤の上に成長することができました。その結果、素晴らしいことが起こりました。

  • コンテナeBPFMinecraftサーバー統計、さらにはガーデニング中の植物の健康など、事実上すべてのメトリックを取得するためのコミュニティエクスポーターを見ることができます。
  • 今日では、ほとんどの人がクラウドネイティブソフトウェアに、PrometheusがスクレイプできるHTTP/HTTPS /metricsエンドポイントがあることを期待しています。Google内で秘密裏に開発され、Prometheusプロジェクトによって世界的に先駆けとなったコンセプトです。
  • オブザーバビリティのパラダイムは変化しました。SREや開発者が初日からメトリックに大きく依存し、ソフトウェアの回復力、デバッグのしやすさ、データ主導の意思決定が改善されていることがわかります。

結局のところ、Prometheusが稼働していないKubernetesクラスターはほとんど見られません。

Prometheusコミュニティの強力な焦点により、他のオープンソースプロジェクトも成長し、Prometheusのデプロイモデルを単一ノード(CortexThanosなど)を超えて拡張することができました。PrometheusのAPIとデータモデルを採用しているクラウドベンダー(Amazon Managed PrometheusGoogle Cloud Managed PrometheusGrafana Cloudなど)は言うまでもありません。Prometheusプロジェクトがこれほど成功している唯一の理由を探しているなら、それは次のとおりです。監視コミュニティが重要なことに焦点を当てる

この(長文の)ブログ投稿では、Prometheusの新しい運用モードである「エージェント」を紹介したいと思います。これはPrometheusバイナリに直接組み込まれています。エージェントモードでは、Prometheusの通常の機能の一部が無効になり、リモートロケーションへのスクレイピングとリモート書き込み用にバイナリが最適化されます。機能数を減らすモードを導入することで、新しい使用パターンが可能になります。このブログ投稿では、CNCFエコシステムにおける特定のデプロイメントにとって、これがなぜゲームチェンジャーなのかを説明します。私はこれにとても興奮しています!

転送ユースケースの歴史

Prometheus のコアデザインは、プロジェクトのライフタイム全体を通じて変更されていません。 Google の Borgmon 監視システム に触発され、監視したいアプリケーションとともに Prometheus サーバーをデプロイし、Prometheus にそれらに到達する方法を指示し、定期的にメトリクスの現在の値をスクレイピングすることを許可します。このような収集方法は、しばしば「プルモデル」と呼ばれ、Prometheus を軽量かつ信頼性の高いものにする 中核となる原則です。さらに、アプリケーションの計測とエクスポーターが、追跡されたすべてのメトリクスの現在の値を (OpenMetrics 形式で) 人間が読める単純な HTTP エンドポイントで提供するだけで済むため、非常にシンプルになります。複雑なプッシュインフラストラクチャや重要度の高いクライアントライブラリは必要ありません。全体として、簡略化された一般的な Prometheus 監視のデプロイメントは以下のようになります。

Prometheus high-level view

これは非常にうまく機能しており、長年にわたり、数千万のアクティブな時系列を処理するこのようなデプロイメントが数百万件も成功していることを確認しています。中には、約2年程度の長期保持を目的としたものもあります。これらはすべて、クラスター管理者と開発者の両方に役立つメトリクスのクエリ、アラート、記録を可能にします。

しかし、クラウドネイティブの世界は常に成長し、進化しています。マネージド Kubernetes ソリューションの成長と、数秒以内にオンデマンドで作成されるクラスターにより、私たちはついにクラスターを「ペット」ではなく「家畜」として扱うことができるようになりました (つまり、個々のインスタンスをあまり気にしなくなりました)。場合によっては、ソリューションにクラスターの概念すら存在しないこともあります。例えば、kcpFargate などのプラットフォームがあります。

Yoda

もう 1 つの興味深いユースケースとして、エッジ クラスターまたはネットワークの概念があります。電気通信、自動車、IoT デバイスなどの業界がクラウドネイティブ技術を採用するにつれて、リソースが制限された非常に小さなクラスターが増加しています。これにより、(可観測性を含む) すべてのデータをリモートのより大きなカウンターパートに転送する必要が生じています。ほとんどの場合、それらのリモートノードには何も保存できないためです。

これは何を意味するのでしょうか?それは、監視データを何らかの方法で集約し、ユーザーに提示し、場合によってはグローバルレベルで保存する必要があることを意味します。これはしばしば、グローバルビュー機能と呼ばれます。

単純に考えると、グローバルレベルに Prometheus を配置し、リモートネットワーク全体でメトリクスをスクレイピングするか、監視目的でアプリケーションから中央の場所にメトリクスを直接プッシュすることでこれを実装できると考えるかもしれません。なぜ両方とも一般的に非常に悪いアイデアなのかを説明しましょう。

🔥 ネットワーク境界を越えたスクレイピングは、監視パイプラインに新たな未知の要素を追加する場合、課題となる可能性があります。ローカルプルモデルにより、Prometheus はメトリクスターゲットに問題がある理由と時期を正確に把握できます。ダウンしている、設定が間違っている、再起動された、メトリクスを返すのが遅すぎる (例: CPU が飽和状態)、サービスディスカバリーで検出できない、アクセスするための資格情報がない、または DNS、ネットワーク、クラスター全体がダウンしているなどの可能性があります。スクレイパーをネットワークの外に配置すると、個々のターゲットとは関係のない信頼性の低いスクレイピングが発生し、これらの情報の一部を失うリスクがあります。さらに、ネットワークが一時的にダウンすると、重要な可視性を完全に失うリスクがあります。これを行わないでください。それだけの価値はありません。(

🔥 アプリケーションから中央の場所にメトリクスを直接プッシュすることも同様に悪いアイデアです。特に大規模なフリートを監視する場合、リモートアプリケーションからのメトリクスが表示されないときは、文字通り何もわかりません。アプリケーションがダウンしているのか?受信パイプラインがダウンしているのか?アプリケーションの認証に失敗したのか?リモートクラスターの IP アドレスを取得できなかったのか?遅すぎるのか?ネットワークがダウンしているのか?さらに悪いことに、一部のアプリケーションターゲットからのデータが欠落していることさえわからない可能性があります。また、データを送信するすべてのものの状態とステータスを追跡する必要があるため、多くのメリットを得ることもできません。このような設計は、あまりにも簡単に失敗を引き起こす可能性があるため、慎重な分析が必要です。

注: サーバーレス関数や短命のコンテナは、アプリケーションからのプッシュを救済策として考えることが多いケースです。しかし、現時点では、より長い時系列に集約したいイベントやメトリクスの断片について話しています。このトピックについては、こちらで議論されています。ご自由に貢献していただき、これらのケースをより良くサポートするためにご協力ください!

Prometheus は、グローバルビューケースをサポートするために 3 つの方法を導入しました。それぞれに独自の長所と短所があります。それらを簡単に見ていきましょう。それらは、以下の図ではオレンジ色で示されています。

Prometheus global view

  • フェデレーション は、集約を目的とした最初の機能として導入されました。これにより、グローバルレベルの Prometheus サーバーは、リーフ Prometheus からメトリクスのサブセットをスクレイピングできます。このような「フェデレーション」スクレイピングは、フェデレーションエンドポイントによって公開されるメトリクスに元のサンプルのタイムスタンプが含まれているため、ネットワーク全体の未知の要素をいくつか削減します。ただし、通常、すべてのメトリクスをフェデレートできず、長時間のネットワーク分断 (数分) 中にデータを失うという問題があります。
  • Prometheus リモート読み取り を使用すると、直接的な PromQL クエリなしで、リモート Prometheus サーバーのデータベースから生のメトリクスを選択できます。グローバルレベルで Prometheus やその他のソリューション (例: Thanos) をデプロイして、このデータに対して PromQL クエリを実行し、複数のリモートロケーションから必要なメトリクスをフェッチできます。これは、データを「ローカル」に保存し、必要なときにのみアクセスできるため、非常に強力です。残念ながら、短所もあります。クエリプッシュダウンなどの機能がない場合、極端なケースでは、単一のクエリに答えるために GB 単位の圧縮されたメトリクスデータをプルしています。また、ネットワークが分断されている場合は、一時的に盲目になります。最後に、特定のセキュリティガイドラインでは、イングレストラフィックは許可されず、エグレスのみが許可されます。
  • 最後に、Prometheus リモート書き込み があります。これは、今日最も人気のある選択肢のようです。エージェントモードはリモート書き込みのユースケースに焦点を当てているため、詳細に説明しましょう。

リモート書き込み

Prometheus リモート書き込みプロトコルを使用すると、Prometheus によって収集されたすべてのメトリクスまたはサブセットをリモートロケーションに転送 (ストリーム) できます。リモート書き込み API をサポートする 1 つ以上のロケーションに、一部のメトリクス (必要に応じて、すべてのメタデータとエグゼンプラーを含む!) を転送するように Prometheus を構成できます。実際、Prometheus はリモート書き込みの取り込みと送信の両方をサポートしているため、グローバルレベルで Prometheus をデプロイして、そのストリームを受信し、クラスター間でデータを集約できます。

公式の Prometheus リモート書き込み API 仕様はレビュー段階ですが、エコシステムはリモート書き込みプロトコルをデフォルトのメトリクスエクスポートプロトコルとして採用しました。たとえば、Cortex、Thanos、OpenTelemetry、および Amazon、Google、Grafana、Logz.io などのクラウドサービスはすべて、リモート書き込みを介したデータの取り込みをサポートしています。

Prometheus プロジェクトは、API の公式コンプライアンステストも提供しています。たとえば、リモート書き込みクライアント機能を提供するソリューション向けの リモート書き込み送信者コンプライアンスがあります。このプロトコルを正しく実装しているかどうかをすばやく判断できる優れた方法です。

このようなスクレイパーからのデータのストリーミングにより、メトリクスデータを集中化された場所に保存できるため、グローバルビューのユースケースが可能になります。これにより、懸念事項の分離も可能になります。これは、アプリケーションが可観測性や監視パイプラインとは異なるチームによって管理されている場合に役立ちます。さらに、リモート書き込みが、顧客からの作業をできるだけオフロードしたいベンダーによって選ばれる理由でもあります。

ちょっと待ってください、Bartek。アプリケーションからメトリクスを直接プッシュすることは最良のアイデアではないと前に言ったばかりですよね!

確かにそうですが、素晴らしい点は、リモート書き込みを使用した場合でも、Prometheus は依然としてプルモデルを使用してアプリケーションからメトリクスを収集し、さまざまな障害モードを理解していることです。その後、サンプルと時系列をバッチ処理し、リモート書き込みエンドポイントにデータをエクスポート、複製 (プッシュ) し、中央ポイントが持つ監視上の未知の要素の数を制限します!

信頼性が高く効率的なリモート書き込みの実装は、解決すべき重要な問題であることに注意することが重要です。Prometheus コミュニティは、安定したスケーラブルな実装を思いつくまでに約 3 年を費やしました。WAL (先行書き込みログ) を数回再実装し、内部キューイング、シャーディング、スマートバックオフなどを追加しました。これらはすべてユーザーからは隠されており、ユーザーは集中化された場所に保存された大量のメトリクスをストリーミングで快適に利用できます。

リモート書き込みの実践例: Katacoda チュートリアル

Prometheus では、これらはすべて新しいことではありません。私たちの多くはすでに、Prometheus を使用して必要なすべてのメトリクスをスクレイピングし、そのすべてまたは一部をリモートロケーションにリモート書き込みしています。

リモート書き込み機能の実践的な体験を試したい場合は、Prometheus からのリモート書き込みメトリクスの Thanos Katacoda チュートリアルをお勧めします。これには、すべてのメトリクスをリモートロケーションに転送するために必要なすべての手順が説明されています。無料です。アカウントにサインアップして、チュートリアルをお楽しみください!🤗

この例では、リモートストレージとして受信モードで Thanos を使用していることに注意してください。今日では、リモート書き込み API と互換性のある他の多くのプロジェクトを使用できます。

リモート書き込みが正常に機能するのであれば、なぜ Prometheus に特別なエージェントモードを追加したのでしょうか?

Prometheus エージェントモード

Prometheus v2.32.0 (次のリリース) から、誰もが実験的な --enable-feature=agent フラグを使用して Prometheus バイナリを実行できるようになります。リリース前に試したい場合は、Prometheus v2.32.0-beta.0 を使用するか、quay.io/prometheus/prometheus:v2.32.0-beta.0 イメージを使用してください。

エージェントモードは、リモート書き込みのユースケース向けに Prometheus を最適化します。クエリ、アラート、ローカルストレージを無効にし、カスタマイズされた TSDB WAL に置き換えます。それ以外はすべて同じです: スクレイピングロジック、サービスディスカバリー、関連する設定。データをリモートの Prometheus サーバーまたはその他のリモート書き込み対応プロジェクトに転送したい場合は、Prometheus のドロップイン代替として使用できます。本質的には、以下のようになります。

Prometheus agent

Prometheus エージェントの最も優れた点は、Prometheus に組み込まれていることです。同じスクレイピング API、同じセマンティクス、同じ設定とディスカバリーメカニズム。

データをローカルでクエリまたはアラートせず、外部にメトリクスをストリーミングする予定の場合、エージェントモードを使用するメリットは何ですか?いくつかあります。

まず第一に、効率性です。カスタム化された Agent TSDB WAL は、書き込みが成功するとすぐにデータを削除します。リモートエンドポイントに到達できない場合は、リモートエンドポイントがオンラインに戻るまで、データを一時的にディスクに保持します。これは現在、非エージェントの Prometheus と同様に、2 時間のバッファに制限されています。 近いうちに解決されることを願っています。つまり、メモリ内にデータのチャンクを構築する必要はありません。クエリのために完全なインデックスを維持する必要もありません。基本的に、Agent モードでは、通常の Prometheus サーバーが同様の状況で使用するリソースのほんの一部を使用します。

この効率性は重要でしょうか?はい、重要です!前述のように、エッジクラスタで使用されるメモリの 1 GB ごと、および CPU コア 1 つごとに、一部のデプロイメントでは重要になります。一方、メトリクスを使用して監視を実行するというパラダイムは、最近ではかなり成熟しています。つまり、同じコストでより多くのカーディナリティを持つ、より関連性の高いメトリクスを送信できればできるほど、より良いということです。

注意: Agent モードの導入に伴い、元の Prometheus サーバーモードは引き続き、推奨される安定した維持管理されたモードとして残ります。リモートストレージを使用した Agent モードは、複雑さが増します。慎重に使用してください。

第二に、新しい Agent モードの利点は、取り込みの水平スケーラビリティを容易にすることです。これは私が最も楽しみにしていることです。その理由を説明させてください。

夢:自動スケーリング可能なメトリクス取り込み

スクレイピングのための真に自動スケーリング可能なソリューションは、メトリクスのターゲットの量と、それらが公開するメトリクスの数に基づいている必要があります。スクレイピングする必要があるデータが増えるほど、より多くの Prometheus インスタンスを自動的にデプロイします。ターゲットの数やメトリクスの数が減ると、スケールダウンしていくつかのインスタンスを削除できます。これにより、Prometheus のサイズを手動で調整する負担がなくなり、クラスタが一時的に小さい場合に Prometheus を過剰に割り当てる必要がなくなります。

サーバーモードの Prometheus だけでは、これを実現するのは困難でした。これは、サーバーモードの Prometheus がステートフルであるためです。収集されたものはすべて、単一の場所にそのまま残ります。つまり、スケールダウン手順では、終了する前に収集されたデータを既存のインスタンスにバックアップする必要があります。そして、スクレイピングの重複、誤解を招く陳腐化マーカーなどの問題が発生します。

それに加えて、すべてのインスタンスにわたるすべてのサンプルを集計できるグローバルビュークエリ(例:Thanos Query や Promxy)が必要になります。最後に、サーバーモードの Prometheus のリソース使用量は、取り込みだけでなく、さまざまな要因に依存します。アラート、記録、クエリ、コンパクション、リモート書き込みなど、メトリクスのターゲットの数とは無関係に、より多くのリソースまたはより少ないリソースが必要になる場合があります。

Agent モードは、基本的にディスカバリ、スクレイピング、リモート書き込みを個別のマイクロサービスに移行します。これにより、取り込みのみに焦点を当てた運用モデルが可能になります。その結果、Agent モードの Prometheus はほぼステートレスになります。確かに、メトリクスの損失を避けるために、HA ペアのエージェントをデプロイし、永続ディスクをそれらに接続する必要があります。しかし、技術的に言えば、数千のメトリクスのターゲット(例:コンテナ)がある場合、複数の Prometheus エージェントをデプロイし、どのレプリカがどのターゲットをスクレイピングしているかを安全に変更できます。これは、最終的にすべてのサンプルが同じ中央ストレージにプッシュされるためです。

全体として、Agent モードの Prometheus は、メトリクスのターゲットの動的な変化に対応できる、Prometheus ベースのスクレイピングの容易な水平自動スケーリング機能を可能にします。これは、今後Prometheus Kubernetes Operatorコミュニティとともに検討していく価値のあるものです。

では、Prometheus で現在実装されている Agent モードの状態を見てみましょう。すぐに使用できますか?

Agent モードは大規模に実証済み

次の Prometheus のリリースには、実験的な機能として Agent モードが含まれます。フラグ、API、およびディスク上の WAL 形式は変更される可能性があります。しかし、実装のパフォーマンスは、Grafana Labs のオープンソースの取り組みのおかげで、すでに実戦でテストされています。

当社 Agent のカスタム WAL の最初の実装は、現在の Prometheus サーバーの TSDB WAL に触発され、Prometheus のメンテナーである Tom Wilkie の指導の下、2019 年に Robert Fratto によって作成されました。その後、多くの Grafana Cloud の顧客やコミュニティメンバーによって使用されているオープンソースの Grafana Agent プロジェクトで使用されました。ソリューションの成熟度を考慮して、ネイティブ統合とより大きな採用のために、実装を Prometheus に寄付する時が来ました。Robert(Grafana Labs)は、Srikrishna(Red Hat)とコミュニティの助けを借りて、コードを Prometheus コードベースに移植し、2 週間前に main にマージされました!

寄贈プロセスは非常にスムーズでした。一部の Prometheus メンテナーは、以前に Grafana Agent 内でこのコードに貢献しており、新しい WAL は Prometheus 自身の WAL に触発されているため、現在の Prometheus TSDB メンテナーがそれを完全にメンテナンスすることは難しくありませんでした。Robert が TSDB メンテナーとして Prometheus チームに加わっていることも非常に役立ちます(おめでとうございます!)。

では、その使い方を説明しましょう!(

Agent モードの詳細な使い方

今後は、Prometheus のヘルプ出力(--help フラグ)を表示すると、次のようなものが表示されるはずです。

usage: prometheus [<flags>]

The Prometheus monitoring server

Flags:
  -h, --help                     Show context-sensitive help (also try --help-long and --help-man).
      (... other flags)
      --storage.tsdb.path="data/"
                                 Base path for metrics storage. Use with server mode only.
      --storage.agent.path="data-agent/"
                                 Base path for metrics storage. Use with agent mode only.
      (... other flags)
      --enable-feature= ...      Comma separated feature names to enable. Valid options: agent, exemplar-storage, expand-external-labels, memory-snapshot-on-shutdown, promql-at-modifier, promql-negative-offset, remote-write-receiver,
                                 extra-scrape-metrics, new-service-discovery-manager. See https://prometheus.dokyumento.jp/docs/prometheus/latest/feature_flags/ for more details.

前述のように、Agent モードはフィーチャーフラグの背後にあるため、Agent モードで Prometheus を実行するには --enable-feature=agent フラグを使用します。残りのフラグは、サーバーと Agent の両方で使用できるか、特定のモード専用です。フラグのヘルプ文字列の最後の文を確認することで、どのフラグがどのモードで使用できるかを確認できます。「サーバーモードでのみ使用」は、サーバーモード専用であることを意味します。このような記述がない場合は、フラグが共有されていることを意味します。

Agent モードは、同じディスカバリオプションとリモート書き込みオプションを使用して、同じスクレイピング構成を受け入れます。

また、通常の Prometheus サーバーと同様に、クエリ機能を無効にした Web UI を公開しますが、ビルド情報、構成、ターゲット、およびサービスディスカバリ情報を表示します。

実践的な Prometheus Agent の例:Katacoda チュートリアル

Prometheus のリモート書き込みチュートリアルと同様に、Prometheus Agent の機能を実践的に試してみたい場合は、Prometheus Agent の Thanos Katacoda チュートリアル をお勧めします。ここでは、Prometheus Agent を実行することがどれほど簡単かを説明しています。

まとめ

この記事が興味深いものであったことを願っています!この記事では、次のような新たに浮上したケースについて説明しました。

  • エッジクラスタ
  • アクセスが制限されたネットワーク
  • 多数のクラスタ
  • 一時的で動的なクラスタ

次に、スクレイピングされたメトリクスをリモート書き込みエンドポイントに効率的に転送できる新しい Prometheus Agent モードについて説明しました。

いつものように、問題やフィードバックがある場合は、お気軽にGitHub でチケットを送信するか、メーリングリストで質問してください

このブログ投稿は、CNCF、Grafana、および Prometheus の間の調整されたリリースの一部です。また、CNCF の発表と、Prometheus Agent の基盤となる Grafana Agent に関する視点もお読みください。

Prometheus 適合性プログラム:最初の結果

本日、Prometheus モニタリング分野の異なるプロジェクトとベンダー間の相互運用性を確保することを目的として、Prometheus 適合性プログラムを開始します。法的な手続きはまだ完了する必要がありますが、テストを実行しており、以下を最初の結果と考えています。この開始の一環として、Julius Volz が PromQL テストの結果を更新しました

簡単に説明すると、このプログラムは Prometheus 適合性と呼ばれ、ソフトウェアは特定のテストに準拠でき、その結果、互換性評価になります。用語は複雑に思えるかもしれませんが、これにより、長々と説明することなくこのトピックについて話すことができます。

序文

新しいカテゴリ

どのソフトウェアに何を適用する必要があるかを推論するのが非常に難しいことがわかりました。考えを整理するために、ソフトウェアを分類できる 4 つの新しいカテゴリを導入する 概要 を作成しました。

  • メトリクスエクスポージャー
  • エージェント/コレクター
  • Prometheus ストレージバックエンド
  • 完全な Prometheus 互換性

行動の呼びかけ

フィードバックを歓迎します。直観に反するかもしれませんが、私たちは Prometheus チームだけでなく、コミュニティにもこの取り組みを形成してもらいたいと考えています。そのため、Prometheus 内で WG 適合性を立ち上げます。WG DocsWG Storage と同様に、これらは公開されており、積極的に参加を呼びかけます。

最近 ほのめかしたように、Prometheus のメンテナー/採用率は驚くほど低いか、衝撃的です。言い換えれば、Prometheus 互換性に関する経済的インセンティブが、ベンダーにリソースを割り当てて、私たちと一緒にテストを構築することを促すことを願っています。もしあなたが常に勤務時間中に Prometheus に貢献したいと思っていたなら、これがその方法かもしれません。そして、Prometheus の多くの非常に重要な側面に触れる方法です。連絡を取るためのさまざまな方法があります。

テスト登録

テスト登録をご希望の場合は、同じコミュニケーションチャネルを使用してご連絡ください。書類が整い次第、連絡先と契約業務を CNCF に引き渡します。

テスト結果

完全な Prometheus 互換性

構築したいテストはわかっていますが、まだそこには到達していません。以前に発表したように、これをプロジェクトやベンダーに対して不利にすることは不公平です。そのため、テストシムは合格として定義されています。たとえば、Julius が今週実行した PromQL テストの現在の半手動的な性質は、Julius が PromQL テストの一環として、ほとんどの場合、Prometheus Remote Write を介してデータを送信するテストを行ったことを意味します。ここで、彼の結果を複数の方法で再利用しています。これはすぐに解決され、さまざまな角度からのより多くのテストが要件を徐々に高め、エンドユーザーの信頼を高めていきます。

プロジェクトと aaS オファリングを 2 つのセットで見るのが理にかなっています。

プロジェクト

合格

  • Cortex 1.10.0
  • M3 1.3.0
  • Promscale 0.6.2
  • Thanos 0.23.1

不合格

VictoriaMetrics 1.67.0 は合格しておらず、合格する意図もありません。エンドユーザーの信頼のために、Prometheus のドロップイン代替として位置づけている間、その結果を追跡することにしました。

aaS

合格

  • Chronosphere
  • Grafana Cloud

不合格

  • Amazon Managed Service for Prometheus
  • Google Cloud Managed Service for Prometheus
  • New Relic
  • Sysdig Monitor

注: Amazon Managed Service for Prometheus は Grafana Cloud と同様に Cortex をベースにしているため、次回のアップデートサイクル後に合格すると予想されます。

エージェント/コレクター

合格

  • Grafana Agent 0.19.0
  • OpenTelemetry Collector 0.37.0
  • Prometheus 2.30.3

不合格

  • Telegraf 1.20.2
  • Timber Vector 0.16.1
  • VictoriaMetrics Agent 1.67.0

注: Vector 0.17.0 のバイナリダウンロードがないため、0.17.0 の代わりに Vector 0.16.1 をテストしました。また、当社のテストツールチェーンは現在バイナリを想定しています。

ランサムウェアの命名について

オスカー・ワイルドの言葉にあるように、模倣は最大の賛辞です。

「Prometheus」と「Thanos」という名前が、最近、ランサムウェアグループによって採用されました。この件についてできることは、この事態が発生していることを皆様に知らせることくらいです。皆様もこの件についてできることは、この事態が発生していることを認識しておくことくらいです。

このグループが当社のプロジェクトの偽のバイナリをダウンロードさせようと誰かを騙そうとするとは思っていませんが、それでも一般的なサプライチェーンとセキュリティの慣行に従うことをお勧めします。ソフトウェアをデプロイする際は、これらのメカニズムのいずれかを使用してください。

特定の出所とサプライチェーンを合理的に信頼できない場合は、ソフトウェアを使用しないでください。

ランサムウェアグループが意図的に名前を選択し、このブログ投稿を目にする可能性がゼロではないため、お願いです。やめてください。ランサムウェアも名前の選択も両方とも。

Prometheus 適合プログラム: リモート書き込み適合テスト結果

CNCF我々自身によって発表されたように、Prometheus 適合プログラムを開始します。

正式にテストを実行する前に、エコシステムの現状の概要を皆様にお伝えするために、当社のテストスイートの最新版をご紹介したいと思います。Prometheus Remote Write 適合テストスイートは、Remote Write プロトコルの送信側部分を、当社の 仕様に対してテストします。

月曜日の PromCon で、Tom Wilkie が数週間前の録画時点でのテスト結果を発表しました。ライブセクションでは、すでに アップデートがありました。2日後、さらに2つのアップデートがありました。可観測性パイプラインツール Vector の追加と、既存システムの新しいバージョンです。

それでは、現在の結果をアルファベット順に示します。

送信者 バージョン スコア
Grafana Agent 0.13.1 100%
Prometheus 2.26.0 100%
OpenTelemetry Collector 0.26.0 41%
Telegraf 1.18.2 65%
Timber Vector 0.13.1 35%
VictoriaMetrics Agent 1.59.0 76%

生の結果は

--- PASS: TestRemoteWrite/grafana (0.01s)
    --- PASS: TestRemoteWrite/grafana/Counter (10.02s)
    --- PASS: TestRemoteWrite/grafana/EmptyLabels (10.02s)
    --- PASS: TestRemoteWrite/grafana/Gauge (10.02s)
    --- PASS: TestRemoteWrite/grafana/Headers (10.02s)
    --- PASS: TestRemoteWrite/grafana/Histogram (10.02s)
    --- PASS: TestRemoteWrite/grafana/HonorLabels (10.02s)
    --- PASS: TestRemoteWrite/grafana/InstanceLabel (10.02s)
    --- PASS: TestRemoteWrite/grafana/Invalid (10.02s)
    --- PASS: TestRemoteWrite/grafana/JobLabel (10.02s)
    --- PASS: TestRemoteWrite/grafana/NameLabel (10.02s)
    --- PASS: TestRemoteWrite/grafana/Ordering (26.12s)
    --- PASS: TestRemoteWrite/grafana/RepeatedLabels (10.02s)
    --- PASS: TestRemoteWrite/grafana/SortedLabels (10.02s)
    --- PASS: TestRemoteWrite/grafana/Staleness (10.01s)
    --- PASS: TestRemoteWrite/grafana/Summary (10.01s)
    --- PASS: TestRemoteWrite/grafana/Timestamp (10.01s)
    --- PASS: TestRemoteWrite/grafana/Up (10.02s)
--- PASS: TestRemoteWrite/prometheus (0.01s)
    --- PASS: TestRemoteWrite/prometheus/Counter (10.02s)
    --- PASS: TestRemoteWrite/prometheus/EmptyLabels (10.02s)
    --- PASS: TestRemoteWrite/prometheus/Gauge (10.02s)
    --- PASS: TestRemoteWrite/prometheus/Headers (10.02s)
    --- PASS: TestRemoteWrite/prometheus/Histogram (10.02s)
    --- PASS: TestRemoteWrite/prometheus/HonorLabels (10.02s)
    --- PASS: TestRemoteWrite/prometheus/InstanceLabel (10.02s)
    --- PASS: TestRemoteWrite/prometheus/Invalid (10.02s)
    --- PASS: TestRemoteWrite/prometheus/JobLabel (10.02s)
    --- PASS: TestRemoteWrite/prometheus/NameLabel (10.03s)
    --- PASS: TestRemoteWrite/prometheus/Ordering (24.99s)
    --- PASS: TestRemoteWrite/prometheus/RepeatedLabels (10.02s)
    --- PASS: TestRemoteWrite/prometheus/SortedLabels (10.02s)
    --- PASS: TestRemoteWrite/prometheus/Staleness (10.02s)
    --- PASS: TestRemoteWrite/prometheus/Summary (10.02s)
    --- PASS: TestRemoteWrite/prometheus/Timestamp (10.02s)
    --- PASS: TestRemoteWrite/prometheus/Up (10.02s)
--- FAIL: TestRemoteWrite/otelcollector (0.00s)
    --- FAIL: TestRemoteWrite/otelcollector/Counter (10.01s)
    --- FAIL: TestRemoteWrite/otelcollector/Histogram (10.01s)
    --- FAIL: TestRemoteWrite/otelcollector/InstanceLabel (10.01s)
    --- FAIL: TestRemoteWrite/otelcollector/Invalid (10.01s)
    --- FAIL: TestRemoteWrite/otelcollector/JobLabel (10.01s)
    --- FAIL: TestRemoteWrite/otelcollector/Ordering (13.54s)
    --- FAIL: TestRemoteWrite/otelcollector/RepeatedLabels (10.01s)
    --- FAIL: TestRemoteWrite/otelcollector/Staleness (10.01s)
    --- FAIL: TestRemoteWrite/otelcollector/Summary (10.01s)
    --- FAIL: TestRemoteWrite/otelcollector/Up (10.01s)
    --- PASS: TestRemoteWrite/otelcollector/EmptyLabels (10.01s)
    --- PASS: TestRemoteWrite/otelcollector/Gauge (10.01s)
    --- PASS: TestRemoteWrite/otelcollector/Headers (10.01s)
    --- PASS: TestRemoteWrite/otelcollector/HonorLabels (10.01s)
    --- PASS: TestRemoteWrite/otelcollector/NameLabel (10.01s)
    --- PASS: TestRemoteWrite/otelcollector/SortedLabels (10.01s)
    --- PASS: TestRemoteWrite/otelcollector/Timestamp (10.01s)
--- FAIL: TestRemoteWrite/telegraf (0.01s)
    --- FAIL: TestRemoteWrite/telegraf/EmptyLabels (14.60s)
    --- FAIL: TestRemoteWrite/telegraf/HonorLabels (14.61s)
    --- FAIL: TestRemoteWrite/telegraf/Invalid (14.61s)
    --- FAIL: TestRemoteWrite/telegraf/RepeatedLabels (14.61s)
    --- FAIL: TestRemoteWrite/telegraf/Staleness (14.59s)
    --- FAIL: TestRemoteWrite/telegraf/Up (14.60s)
    --- PASS: TestRemoteWrite/telegraf/Counter (14.61s)
    --- PASS: TestRemoteWrite/telegraf/Gauge (14.60s)
    --- PASS: TestRemoteWrite/telegraf/Headers (14.61s)
    --- PASS: TestRemoteWrite/telegraf/Histogram (14.61s)
    --- PASS: TestRemoteWrite/telegraf/InstanceLabel (14.61s)
    --- PASS: TestRemoteWrite/telegraf/JobLabel (14.61s)
    --- PASS: TestRemoteWrite/telegraf/NameLabel (14.60s)
    --- PASS: TestRemoteWrite/telegraf/Ordering (14.61s)
    --- PASS: TestRemoteWrite/telegraf/SortedLabels (14.61s)
    --- PASS: TestRemoteWrite/telegraf/Summary (14.60s)
    --- PASS: TestRemoteWrite/telegraf/Timestamp (14.61s)
--- FAIL: TestRemoteWrite/vector (0.01s)
    --- FAIL: TestRemoteWrite/vector/Counter (10.02s)
    --- FAIL: TestRemoteWrite/vector/EmptyLabels (10.01s)
    --- FAIL: TestRemoteWrite/vector/Headers (10.02s)
    --- FAIL: TestRemoteWrite/vector/HonorLabels (10.02s)
    --- FAIL: TestRemoteWrite/vector/InstanceLabel (10.02s)
    --- FAIL: TestRemoteWrite/vector/Invalid (10.02s)
    --- FAIL: TestRemoteWrite/vector/JobLabel (10.01s)
    --- FAIL: TestRemoteWrite/vector/Ordering (13.01s)
    --- FAIL: TestRemoteWrite/vector/RepeatedLabels (10.02s)
    --- FAIL: TestRemoteWrite/vector/Staleness (10.02s)
    --- FAIL: TestRemoteWrite/vector/Up (10.02s)
    --- PASS: TestRemoteWrite/vector/Gauge (10.02s)
    --- PASS: TestRemoteWrite/vector/Histogram (10.02s)
    --- PASS: TestRemoteWrite/vector/NameLabel (10.02s)
    --- PASS: TestRemoteWrite/vector/SortedLabels (10.02s)
    --- PASS: TestRemoteWrite/vector/Summary (10.02s)
    --- PASS: TestRemoteWrite/vector/Timestamp (10.02s)
--- FAIL: TestRemoteWrite/vmagent (0.01s)
    --- FAIL: TestRemoteWrite/vmagent/Invalid (20.66s)
    --- FAIL: TestRemoteWrite/vmagent/Ordering (22.05s)
    --- FAIL: TestRemoteWrite/vmagent/RepeatedLabels (20.67s)
    --- FAIL: TestRemoteWrite/vmagent/Staleness (20.67s)
    --- PASS: TestRemoteWrite/vmagent/Counter (20.67s)
    --- PASS: TestRemoteWrite/vmagent/EmptyLabels (20.64s)
    --- PASS: TestRemoteWrite/vmagent/Gauge (20.66s)
    --- PASS: TestRemoteWrite/vmagent/Headers (20.64s)
    --- PASS: TestRemoteWrite/vmagent/Histogram (20.66s)
    --- PASS: TestRemoteWrite/vmagent/HonorLabels (20.66s)
    --- PASS: TestRemoteWrite/vmagent/InstanceLabel (20.66s)
    --- PASS: TestRemoteWrite/vmagent/JobLabel (20.66s)
    --- PASS: TestRemoteWrite/vmagent/NameLabel (20.66s)
    --- PASS: TestRemoteWrite/vmagent/SortedLabels (20.66s)
    --- PASS: TestRemoteWrite/vmagent/Summary (20.66s)
    --- PASS: TestRemoteWrite/vmagent/Timestamp (20.67s)
    --- PASS: TestRemoteWrite/vmagent/Up (20.66s)

テストスイートの改善にさらに取り組みます。テストの追加と、新しいテスト対象の追加の両方を行います。協力したい場合は、Remote Write インテグレーションのリストをさらに追加することを検討してください。

Prometheus 適合プログラムの紹介

Prometheus は、クラウドネイティブ空間およびそれ以外の場所におけるメトリクスモニタリングの標準です。相互運用性を確保し、ユーザーを驚きから守り、より並行的なイノベーションを可能にするために、Prometheus プロジェクトは CNCF の支援を受けて、Prometheus 適合プログラムを導入し、コンポーネントの適合性と Prometheus の互換性を認定します。

CNCF 理事会は、次回の会議でプログラムを正式にレビューおよび承認する予定です。この立ち上げ段階で、より幅広いコミュニティがテストの改善に協力してくれることを願っています。

当社の 広範で拡大し続けるテストスイートの助けを借りて、プロジェクトとベンダーは、当社の仕様への適合性と Prometheus エコシステム内の互換性を判断できます。

立ち上げ時に、3つのコンポーネントの適合性テストを提供します。

  • PromQL (手動による解釈が必要、ある程度完了)
  • リモート読み取り/書き込み (完全に自動化、WIP)
  • OpenMetrics (部分的に自動、ある程度完了、アンケートが必要)

さらにコンポーネントを追加する予定です。Prometheus Remote Read またはデータストレージ/TSDB のテストは、次の追加として有望です。既存のテストを拡張および改善し、新しいテストを提出することを、すべての方に明確にお願いします。

Prometheus 適合プログラムは次のように機能します。

すべてのコンポーネントに対して、「foo YYYY-MM 準拠」、たとえば、「OpenMetrics 2021-05 準拠」、「PromQL 2021-05 準拠」、「Prometheus Remote Write 2021-05 準拠」というマークが付けられます。どのプロジェクトまたはベンダーも、適合性ドキュメントを提出できます。100% に達すると、マークが付与されます。

すべての完成したソフトウェアに対して、「Prometheus x.y 互換」というマークが付けられます。たとえば、「Prometheus 2.26 互換」などです。関連するコンポーネントの適合性スコアが乗算されます。100% に達すると、マークが付与されます。

例として、Prometheus Agent は OpenMetrics と Prometheus Remote Write の両方をサポートしますが、PromQL はサポートしません。したがって、OpenMetrics と Prometheus Remote Write の適合性スコアのみが乗算されます。

適合マークと互換マークの両方が、2つのマイナーリリースまたは 12 週間のうち、どちらか長い方が有効です。

「@」修飾子の紹介

何かに対して上位 10 個の時系列を選択したのに、10 個ではなく 100 個になったことはありませんか?もしあれば、これはあなたのためです。根本的な問題が何であるか、そして私がそれをどのように修正したかを説明します。

現在、topk() クエリは、正確に k 個の結果を得るインスタントクエリとしてのみ意味がありますが、範囲クエリとして実行すると、すべてのステップが個別に評価されるため、k 個よりはるかに多くの結果を得ることができます。この @ 修飾子を使用すると、範囲クエリのすべてのステップでランキングを修正できます。

Prometheus v2.25.0 では、新しい PromQL 修飾子 @ が導入されました。offset 修飾子が、ベクターセレクター、範囲ベクターセレクター、およびサブクエリの評価を評価時間からの固定期間だけオフセットできるのと同じように、@ 修飾子を使用すると、クエリ評価時間に関係なく、これらのセレクターの評価を修正できます。この構文は Björn Rabenstein の功績です。

<vector-selector> @ <timestamp>
<range-vector-selector> @ <timestamp>
<subquery> @ <timestamp>

<timestamp> は UNIX タイムスタンプであり、浮動小数点リテラルで記述されます。

たとえば、クエリ http_requests_total @ 16097460002021-01-04T07:40:00+00:00 における http_requests_total の値を返します。クエリ rate(http_requests_total[5m] @ 1609746000) は、同じ時間における http_requests_total の 5 分間のレートを返します。

さらに、start()end() を特殊な値として @ 修飾子の値として使用することもできます。範囲クエリの場合、それらはそれぞれ範囲クエリの開始と終了に解決され、すべてのステップで同じままになります。インスタントクエリの場合、start()end() は両方とも評価時間に解決されます。

topk() の修正に戻ると、次のクエリは、最後の 1h レートが上位 5 位以内のシリーズの http_requests_total1m レートをプロットします。したがって、これで topk() を、正確に k 個の結果をプロットする範囲クエリとしても理解できます。

rate(http_requests_total[1m]) # This acts like the actual selector.
  and
topk(5, rate(http_requests_total[1h] @ end())) # This acts like a ranking function which filters the selector.

同様に、topk() ランキングは、現在インスタントクエリとしてのみ意味がある histogram_quantile() などの他の関数に置き換えることができます。rate()<aggregation>_over_time() などに置き換えることができます。この新しい修飾子をどのように使用するかお知らせください!

@ 修飾子はデフォルトで無効になっており、フラグ --enable-feature=promql-at-modifier を使用して有効にできます。機能フラグの詳細については、このブログ投稿を参照し、@ 修飾子のドキュメントは こちらにあります。

機能フラグの紹介

SemVer モデルに従って、安定性と破壊的変更について常に厳しい約束をしてきました。それは今後も変わることはありません。

実験にさらに大胆になりたいので、機能フラグをより多く使用する予定です。

v2.25.0 以降、--enable-feature フラグの背後に機能が隠されている、無効な機能という新しいセクションが導入されました。今後のリリースで、このセクションにますます多くの機能が追加されると予想されます。

このリストの機能は実験的であると見なされており、--enable-feature の背後にある限り、次の考慮事項が伴います。

  1. 機能に API (Web API、コードインターフェイスなど) がある場合、API 仕様が変更される可能性があります。
  2. 機能の動作が変更される可能性があります。
  3. Prometheus についてあなたが持っていたであろういくつかの仮定を破る可能性があります。
    • たとえば、クエリが評価時間のサンプルを先読みしないという仮定は、@ 修飾子と負のオフセットによって破られます。
  4. 不安定になる可能性がありますが、もちろん安定性を保つように努めます。

これらの考慮事項により、実験にさらに大胆になり、より迅速に革新することができます。いずれかの機能が広く使用され、API、動作、および実装に関して安定していると見なされると、無効な機能リストから移動し、デフォルトで有効になる場合があります。機能に価値がない、または破損していると判断した場合、完全に削除する可能性があります。一部の機能を有効にすることが Prometheus にとって大きな破壊的変更と見なされる場合、次のメジャーリリースまで無効のままになります。

すべてのリリースでこのリストに注目し、ぜひ試してみてください!

リモート読み取りがストリーミングに対応

新しい Prometheus バージョン 2.13.0 が利用可能になりました。いつものように、多くの修正と改善が含まれています。変更内容についてはこちらをご覧ください。しかし、いくつかのプロジェクトやユーザーが待ち望んでいた機能が1つあります。チャンク化された、ストリーム版のリモート読み取り APIです。

この記事では、リモートプロトコルの変更点、変更理由、そして効果的な使い方について詳しく解説したいと思います。

リモート API

Prometheus はバージョン 1.x 以降、リモート APIを使用してストレージと直接やり取りする機能を持っています。

この API により、サードパーティシステムは以下の 2 つのメソッドを通じてメトリクスデータとやり取りできます。

  • 書き込み - Prometheus によってプッシュされたサンプルを受信します。
  • 読み取り - Prometheus からサンプルをプルします。

Remote read and write architecture

どちらのメソッドも、protobufs でエンコードされたメッセージと HTTP を使用しています。両方のメソッドのリクエストとレスポンスは、snappy を使用して圧縮されます。

リモート書き込み

これは Prometheus データをサードパーティシステムに複製する最も一般的な方法です。このモードでは、Prometheus はサンプルをストリームし、指定されたエンドポイントに定期的にサンプルのバッチを送信します。

リモート書き込みは、3 月にWAL ベースのリモート書き込みによって大幅に改善され、信頼性とリソース消費が向上しました。また、リモート書き込みは、こちらに記載されているほとんどすべてのサードパーティ統合でサポートされていることに注意してください。

リモート読み取り

読み取りメソッドはあまり一般的ではありません。2017 年 3 月 (サーバー側) に追加されて以来、大きな開発は行われていません。

Prometheus 2.13.0 のリリースには、読み取り API の既知のリソースボトルネックの修正が含まれています。この記事では、これらの改善点に焦点を当てます。

リモート読み取りの重要な考え方は、PromQL 評価なしで Prometheus ストレージ (TSDB) を直接クエリできるようにすることです。これは、PromQL エンジンがストレージからデータを取得するために使用するQuerierインターフェースに似ています。

これにより、Prometheus が収集した TSDB の時系列への読み取りアクセスが可能になります。リモート読み取りの主なユースケースは次のとおりです。

  • Prometheus が別の Prometheus から読み取るように、異なる Prometheus データ形式間でのシームレスな Prometheus アップグレード。
  • Prometheus が InfluxDB などのサードパーティの長期ストレージシステムから読み取ることができる。
  • サードパーティシステムが Prometheus からデータをクエリする。例: Thanos

リモート読み取り API は、次の protobuf ペイロードを予期する単純な HTTP エンドポイントを公開します。

message ReadRequest {
  repeated Query queries = 1;
}

message Query {
  int64 start_timestamp_ms = 1;
  int64 end_timestamp_ms = 2;
  repeated prometheus.LabelMatcher matchers = 3;
  prometheus.ReadHints hints = 4;
}

このペイロードを使用すると、クライアントは指定された matchers に一致する特定の系列と、end および start を使用した時間範囲をリクエストできます。

レスポンスも同様にシンプルです。

message ReadResponse {
  // In same order as the request's queries.
  repeated QueryResult results = 1;
}

message Sample {
  double value    = 1;
  int64 timestamp = 2;
}

message TimeSeries {
  repeated Label labels   = 1;
  repeated Sample samples = 2;
}

message QueryResult {
  repeated prometheus.TimeSeries timeseries = 1;
}

リモート読み取りは、値とタイムスタンプの生のサンプルを含む一致した時系列を返します。

問題点

このような単純なリモート読み取りには 2 つの重要な問題がありました。使いやすく理解しやすいものでしたが、定義した protobuf 形式の単一の HTTP リクエスト内にはストリーミング機能がありませんでした。次に、レスポンスには、TSDB 内にメトリクスを保存するために使用される、エンコードされた圧縮されたサンプルのバッチである「チャンク」ではなく、生のサンプル (float64 値と int64 タイムスタンプ) が含まれていました。

ストリーミングなしのリモート読み取りのサーバーアルゴリズムは次のとおりでした。

  1. リクエストを解析します。
  2. TSDB からメトリクスを選択します。
  3. すべてのデコードされた系列に対して
    • すべてのサンプルに対して
      • レスポンス protobuf に追加します。
  4. レスポンスをマーシャリングします。
  5. Snappy で圧縮します。
  6. HTTP レスポンスを返送します。

リモート読み取りのレスポンス全体は、クライアントに送信する前に、潜在的に巨大な protobuf メッセージにマーシャリングするために、生の非圧縮形式でバッファリングする必要がありました。次に、レスポンス全体をクライアントで再度完全にバッファリングして、受信した protobuf からアンマーシャリングできるようにする必要があります。その後でのみ、クライアントは生のサンプルを使用できました。

これは何を意味するのでしょうか?たとえば、10,000 系列に一致する 8 時間のリクエストだけで、クライアントとサーバーの両方でそれぞれ最大 2.5GB のメモリが割り当てられる可能性があるということです!

以下は、リモート読み取りリクエスト時の Prometheus および Thanos Sidecar (リモート読み取りクライアント) の両方のメモリ使用量のメトリクスです。

Prometheus 2.12.0: RSS of single read 8h of 10k series

Prometheus 2.12.0: Heap-only allocations of single read 8h of 10k series

ブラウザが数百メガバイトのデータをフェッチ、保存、レンダリングすることに満足しないため、10,000 系列をクエリすることは、Prometheus ネイティブ HTTP query_range エンドポイントであっても、良いアイデアではないことに注意してください。さらに、ダッシュボードやレンダリングの目的では、人間が読み取ることはできないため、それほど多くのデータを持つことは実用的ではありません。そのため、通常は 20 系列以下のクエリを作成します。

これは素晴らしいことですが、非常に一般的なテクニックは、クエリが集計された 20 系列を返すようにクエリを構成することです。ただし、クエリエンジンは、レスポンスを評価するために、潜在的に数千の系列に触れる必要があります (例: アグリゲーターを使用する場合)。これが、他のデータの中でもリモート読み取りから TSDB データを使用する Thanos のようなシステムでは、リクエストが非常に重くなることが多い理由です。

ソリューション

この問題の解決策を説明するには、Prometheus がクエリ時にデータを反復処理する方法を理解することが役立ちます。コアコンセプトは、QuerierSelect メソッドの戻り値の型である SeriesSet で示すことができます。インターフェースを以下に示します。

// SeriesSet contains a set of series.
type SeriesSet interface {
    Next() bool
    At() Series
    Err() error
}

// Series represents a single time series.
type Series interface {
    // Labels returns the complete set of labels identifying the series.
    Labels() labels.Labels
    // Iterator returns a new iterator of the data of the series.
    Iterator() SeriesIterator
}

// SeriesIterator iterates over the data of a time series.
type SeriesIterator interface {
    // At returns the current timestamp/value pair.
    At() (t int64, v float64)
    // Next advances the iterator by one.
    Next() bool
    Err() error
}

これらのインターフェースのセットにより、プロセス内の「ストリーミング」フローが可能になります。サンプルを保持する事前に計算された系列のリストを持つ必要はなくなりました。このインターフェースを使用すると、各 SeriesSet.Next() 実装はオンデマンドで系列をフェッチできます。同様に、各系列内でも、SeriesIterator.Next を介して各サンプルを動的にフェッチできます。

このコントラクトにより、Prometheus は割り当てられたメモリを最小限に抑えることができます。PromQL エンジンは、クエリを評価するために最適にサンプルを反復処理できるためです。同様に、TSDB は、ファイルシステムに格納されているブロックから最適に 1 つずつ系列をフェッチして割り当てを最小限に抑える方法で、SeriesSet を実装します。

これはリモート読み取り API にとって重要です。イテレータを使用してストリーミングの同じパターンを再利用して、単一の系列のいくつかのチャンクの形式でレスポンスの一部をクライアントに送信できるためです。protobuf にはネイティブな区切りロジックがないため、拡張されたプロト定義により、単一の巨大なプロトコルバッファーメッセージではなく、小さなプロトコルバッファーメッセージのセットを送信できるようにしました。このモードを STREAMED_XOR_CHUNKS リモート読み取りと呼び、古いモードを SAMPLES と呼びます。拡張されたプロトコルとは、Prometheus がレスポンス全体をバッファリングする必要がなくなったことを意味します。代わりに、各系列を順番に処理し、各 SeriesSet.Next または SeriesIterator.Next イテレーションのバッチごとに 1 つのフレームを送信することで、次の系列に同じメモリページを再利用できる可能性があります!

これで、STREAMED_XOR_CHUNKS リモート読み取りのレスポンスは、以下に示すように、プロトコルバッファーメッセージ (フレーム) のセットになります。

// ChunkedReadResponse is a response when response_type equals STREAMED_XOR_CHUNKS.
// We strictly stream full series after series, optionally split by time. This means that a single frame can contain
// partition of the single series, but once a new series is started to be streamed it means that no more chunks will
// be sent for previous one.
message ChunkedReadResponse {
  repeated prometheus.ChunkedSeries chunked_series = 1;
}

// ChunkedSeries represents single, encoded time series.
message ChunkedSeries {
  // Labels should be sorted.
  repeated Label labels = 1 [(gogoproto.nullable) = false];
  // Chunks will be in start time order and may overlap.
  repeated Chunk chunks = 2 [(gogoproto.nullable) = false];
}

ご覧のとおり、フレームには生のサンプルは含まれなくなりました。これは、2 番目に行った改善です。メッセージ内でチャンクにバッチ処理されたサンプルを送信します (チャンクの詳細については、このビデオをご覧ください)。これらは、TSDB に格納するのと同じチャンクです。

最終的には、次のサーバーアルゴリズムになりました。

  1. リクエストを解析します。
  2. TSDB からメトリクスを選択します。
  3. すべての系列に対して
    • すべてのサンプルに対して
      • チャンクにエンコードします。
        • フレームが >= 1MB の場合、中断します。
    • ChunkedReadResponse メッセージをマーシャリングします。
    • Snappy で圧縮します。
    • メッセージを送信します。

完全な設計については、こちらをご覧ください。

ベンチマーク

この新しいアプローチのパフォーマンスは、古いソリューションと比較してどうでしょうか?

Prometheus 2.12.02.13.0 の間のリモート読み取り特性を比較してみましょう。この記事の冒頭で示した初期結果については、Prometheus をサーバーとして、Thanos Sidecar をリモート読み取りのクライアントとして使用しました。grpcurl を使用して Thanos Sidecar に対して gRPC 呼び出しを実行することで、テストリモート読み取りリクエストを呼び出しました。テストは、Docker の Kubernetes ( kindを使用) を搭載した私のラップトップ (Lenovo X1 16GB, i7 8th) から実行しました。

データは人工的に生成されたものであり、動的な 10,000 系列 (最悪のシナリオ) を表します。

完全なテストベンチは、thanosbench リポジトリで入手できます。

メモリ

ストリーミングなし

Prometheus 2.12.0: Heap-only allocations of single read 8h of 10k series

ストリーミングあり

Prometheus 2.13.0: Heap-only allocations of single read 8h of 10k series

メモリ削減は、ソリューションで目指した重要な項目でした。GB 単位のメモリを割り当てる代わりに、Prometheus はリクエスト全体で約 50MB をバッファリングしますが、Thanos のメモリ使用量はわずかです。ストリーミングされた Thanos gRPC StoreAPI のおかげで、Sidecar は非常に単純なプロキシになりました。

さらに、さまざまな時間範囲と系列数を試しましたが、予想どおり、Prometheus の割り当てで最大 50MB にとどまり、Thanos では何も確認できませんでした。これは、リモート読み取りが要求するサンプル数に関係なく、リクエストごとに一定のメモリを使用することを証明しています。リクエストごとに割り当てられるメモリは、以前のようにデータのカーディナリティ、つまりフェッチされる系列数にも大幅に影響されなくなりました。

これにより、同時実行制限を使用して、ユーザートラフィックに対する容量計画をより簡単にできます。

CPU

ストリーミングなし

Prometheus 2.12.0: CPU time of single read 8h of 10k series

ストリーミングあり

Prometheus 2.13.0: CPU time of single read 8h of 10k series

テスト中、CPU使用率も改善され、CPU使用時間は半分になりました。

レイテンシ

ストリーミングとエンコードの削減により、リモート読み取りリクエストのレイテンシも削減できました。

10,000シリーズでの8時間範囲のリモート読み取りリクエストレイテンシ

2.12.0: 平均時間 2.13.0: 平均時間
実時間 0分34.701秒 0分8.164秒
ユーザー時間 0分7.324秒 0分8.181秒
システム時間 0分1.172秒 0分0.749秒

また、2時間範囲の場合

2.12.0: 平均時間 2.13.0: 平均時間
実時間 0分10.904秒 0分4.145秒
ユーザー時間 0分6.236秒 0分4.322秒
システム時間 0分0.973秒 0分0.536秒

レイテンシが約2.5倍低下したことに加え、レスポンスはすぐにストリーミングされます。ストリーミングなしのバージョンでは、クライアントのレイテンシはPrometheusとThanos側での処理とマーシャリングだけで27秒(real時間からuser時間を引いた値)でした。

互換性

リモート読み取りは、後方互換性と前方互換性のある方法で拡張されました。これは、protobufとaccepted_response_typesフィールドのおかげです。古いサーバーではこのフィールドは無視されます。同時に、古いクライアントがaccepted_response_typesを提供しない場合でも、サーバーは古いSAMPLESリモート読み取りを想定して正常に動作します。

リモート読み取りプロトコルは、後方互換性と前方互換性のある方法で拡張されました

  • v2.13.0より前のPrometheusは、新しいクライアントによって提供されるaccepted_response_typesフィールドを安全に無視し、SAMPLESモードを想定します。
  • v2.13.0以降のPrometheusは、accepted_response_typesパラメーターを提供しない古いクライアントに対して、デフォルトでSAMPLESモードを使用します。

使用方法

Prometheus v2.13.0で新しいストリーミングリモート読み取りを使用するには、サードパーティシステムがリクエストにaccepted_response_types = [STREAMED_XOR_CHUNKS]を追加する必要があります。

すると、Prometheusは古いメッセージの代わりにChunkedReadResponseをストリーミングします。各ChunkedReadResponseメッセージには、可変長整数サイズと、CRC32 Castagnoliチェックサムの固定サイズのビッグエンディアンuint32が続きます。

Goの場合は、ストリームから直接読み取るためにChunkedReaderを使用することをお勧めします。

storage.remote.read-sample-limitフラグは、STREAMED_XOR_CHUNKSでは機能しなくなったことに注意してください。storage.remote.read-concurrent-limitは以前と同じように機能します。

また、各メッセージの最大サイズを制御する新しいオプションstorage.remote.read-max-bytes-in-frameがあります。protobufメッセージを1MB以下に保つことがGoogleによって推奨されているため、デフォルトの1MBを維持することをお勧めします。

前述のように、Thanosはこの改善から大きな恩恵を受けます。ストリーミングリモート読み取りはv0.7.0で追加されているため、このバージョン以降では、ThanosサイドカーでPrometheus 2.13.0以降が使用される場合は常に、自動的にストリーミングリモート読み取りを使用します。

次のステップ

リリース2.13.0では、拡張されたリモート読み取りとPrometheusサーバー側の実装が導入されています。ただし、この執筆時点では、拡張されたリモート読み取りプロトコルを最大限に活用するために、まだいくつか項目が残っています。

  • Prometheusリモート読み取りのクライアント側のサポート: 進行中
  • リモート読み取り中のブロックのチャンクの再エンコードの回避: 進行中

まとめ

要約すると、チャンク化されたリモート読み取りのストリーミングの主な利点は次のとおりです

  • クライアントとサーバーの両方が、リクエストごとにほぼ一定のメモリサイズを使用できます。これは、Prometheusがリモート読み取り中にレスポンス全体ではなく、小さなフレームを1つずつ送信するためです。これにより、特にメモリのような圧縮できないリソースのキャパシティプランニングが大幅に容易になります。
  • Prometheusサーバーは、リモート読み取り中にチャンクを生のサンプルにデコードする必要がなくなりました。システムが(Thanosのように)ネイティブTSDB XOR圧縮を再利用する場合、クライアント側でのエンコードについても同様です。

いつものように、問題やフィードバックがある場合は、GitHubでチケットを送信するか、メーリングリストで質問してください。

ForgeRockとのインタビュー

Prometheusのユーザーへのインタビューシリーズを継続して、ForgeRockのLudovic Poitouが彼らの監視の道のりについて語ります。

あなた自身とForgeRockの事業内容について教えていただけますか?

私は、フランスのグルノーブル近郊を拠点とするForgeRockのプロダクトマネジメントディレクターであるLudovic Poitouです。ForgeRockは、2010年にノルウェーで設立され、現在米国サンフランシスコに本社を置く、従業員数500人以上の国際的なアイデンティティおよびアクセス管理ソフトウェア企業です。顧客、従業員、デバイス、モノとのあらゆるオンラインインタラクションを保護するためのソリューションを提供しています。金融機関から政府機関まで、800を超える顧客がいます。

Prometheusを導入する前の監視経験について教えていただけますか?

ForgeRock Identity Platformは、常に監視インターフェースを提供してきました。ただし、このプラットフォームは4つの主要な製品で構成されており、それぞれに異なるオプションがありました。たとえば、Directory Services製品は、SNMP、JMX、またはLDAP、あるいは最新バージョンではHTTP経由のRESTful APIを介して監視情報を提供していました。他の製品はRESTまたはJMXのみを提供していました。その結果、プラットフォーム全体を監視するには複雑で、これらのプロトコルを統合できるツールが必要でした。

Prometheusに注目しようと思った理由は何ですか?

既存のインターフェースとの後方互換性を維持しながら、すべての製品を監視するための単一の共通インターフェースが必要でした。

すべての製品でメトリクスを収集するためにDropWizardの使用を開始しました。同時に、これらの製品をクラウドに移行し、DockerとKubernetesで実行し始めました。そのため、Kubernetesとの統合、デプロイの容易さ、Grafanaとの統合により、Prometheusが不可欠になりました。また、Graphiteも検討し、製品にサポートを追加しましたが、顧客による利用はほとんどありません。

どのように移行しましたか?

一部の製品ではすでにDropWizardライブラリを使用しており、すべての製品で共通のライブラリを使用することにしたため、DropWizardはインストルメンテーションをコーディングするための明白な選択肢でした。しかし、すぐにデータモデルの問題に直面しました。Prometheusインターフェースはディメンションを使用しますが、私たちはメトリクスの階層モデルを持つ傾向があります。また、Micrometerの使用も開始しましたが、すぐにいくつかの制約に直面しました。そこで、Micrometerインターフェースを使用してメトリクスを収集するカスタム実装を構築することになりました。DropWizard Metricsを要件に合わせて調整し、DropWizard Prometheusエクスポーターを調整しました。現在、単一のインストルメンテーションで、メトリクスをディメンションまたは階層的に公開できます。次に、顧客がインストールしてカスタマイズし、独自の監視ビューとアラートを設定できるサンプルGrafanaダッシュボードの構築を開始しました。

Access Management ForgeRock's Grafana dashboard

以前のインターフェースも引き続き提供していますが、PrometheusとGrafanaを使用することを強く推奨しています。

切り替え後、どのような改善が見られましたか?

最初のメリットは、品質エンジニアリングチームからもたらされました。Prometheusのサポートとさまざまなメトリクスのテストを開始したところ、すべてのストレステストとパフォーマンステストでデフォルトで有効にするようになりました。特定のテスト用にGrafanaダッシュボードをカスタマイズし始めました。その後すぐに、いくつかのパフォーマンスの問題を説明するために、さまざまなメトリクスを強調表示して指摘し始めました。

問題を理解して修正するために問題を再現する際に、エンジニアリングチームもPrometheusを使用し、いくつかのダッシュボードを拡張しました。このプロセス全体を通して、製品が改善され、どのメトリクスを監視して顧客に視覚化することが重要かをより深く理解することができました。

ForgeRockとPrometheusの将来はどうなると思いますか?

ForgeRockは、製品とソリューションをサービスとして提供する取り組みを開始しました。この動きに伴い、監視とアラートがさらに重要になり、もちろん監視インフラストラクチャはPrometheusに基づいています。現在、2つのレベルの監視があり、1つはテナントごとであり、Prometheusを使用して1つの顧客環境に関するデータを収集し、その顧客向けに一連のメトリクスを公開できます。また、デプロイされたすべてのテナントからのメトリクスがプッシュされる中央Prometheusサービスも構築しており、SREチームはすべての顧客環境がどのように実行されているかを非常に深く理解できます。全体として、Prometheusは私たちの主要な監視サービスになり、オンプレミスの顧客と、サービスとしてソリューションを実行する私たち自身の両方に役立っていると言えます。

Hostingerとのインタビュー

Prometheusのユーザーへのインタビューシリーズを継続して、HostingerのDonatas Abraitisが彼らの監視の道のりについて語ります。

あなた自身とHostingerの事業内容について教えていただけますか?

私はHostingerのシステムエンジニアであるDonatas Abraitisです。Hostingerは、名前が示すようにホスティング会社です。000webhost.comプロジェクト(無料のWebホスティングプロバイダー)を含め、2004年以降約3,000万人のクライアントがいます。

Prometheusを導入する前の監視経験について教えていただけますか?

Hostingerがまだ小さな会社だった頃、オープンソースの監視ツールとして、当時はNagios、Cacti、Gangliaしか存在しませんでした。これは、若い人にフロッピーディスクとは何かを説明するようなものですが、NagiosとCactiは現在も開発サイクルにあります。

自動化ツールは存在しませんでしたが。Bash + Perlで仕事をしていました。チームと自分自身をスケールしたい場合は、自動化を決して無視すべきではありません。自動化がない場合は、より多くの人間の手作業が必要になります。

当時、物理サーバーは約150台でした。比較すると、今日ではVMと物理サーバーを合わせて約2000台のサーバーがあります。

ネットワーク機器については、SNMPが依然として広く使用されています。「ホワイトボックス」スイッチの台頭により、通常のツールをインストールできるため、SNMPの必要性は低下しています。

SNMPの代わりに、スイッチ内でnode_exporterまたは他のエクスポーターを実行して、必要なメトリクスを人間が読める形式で公開できます。美しいは醜いよりも良いですよね?

当社ではCumulusOSを使用していますが、これはほとんどの場合x86であるため、あらゆる種類のLinuxのものを実行することにまったく問題はありません。

Prometheusに注目しようと思った理由は何ですか?

2015年に自動化できるものはすべて自動化し始めたとき、エコシステムにPrometheusを導入しました。当初は、Alertmanager、Pushgateway、Grafana、Graylog、rsyslogdが実行されている単一の監視ボックスがありました。

TICK(Telegraf/InfluxDB/Chronograf/Kapacitor)スタックも評価しましたが、当時の機能が限られていたため満足できず、Prometheusの方が実装がはるかにシンプルで成熟しているように見えました。

どのように移行しましたか?

古い監視スタック(NCG - Nagios/Cacti/Ganglia)からの移行期間中は、両方のシステムを使用し、最終的にPrometheusのみに依存することにしました。

当社では、約25個のコミュニティメトリクスエクスポーターと、当社で作成したlxc_exporterなどのいくつかを使用しています。主に、テキストファイルコレクターを使用して、ビジネス関連のカスタムメトリクスを公開しています。

切り替え後、どのような改善が見られましたか?

新しい設定により、時間分解能が5分から15秒に向上し、きめ細かく詳細な分析が可能になりました。平均検出時間(MTTD)も4分の1に短縮されました。

HostingerとPrometheusの将来はどうなると思いますか?

2015年以降、インフラストラクチャがN倍に成長するにつれて、主なボトルネックはPrometheusとAlertmanagerになりました。当社のPrometheusは約2TBのディスクスペースを消費します。したがって、メンテナンス中にノードを再起動または変更すると、しばらく監視データが失われます。現在、Prometheusバージョン2.4.2を実行していますが、近い将来、2.6にアップグレードする予定です。特に、パフォーマンスとWAL関連の機能に関心があります。Prometheusの再起動には約10〜15分かかります。これは許容できません。もう1つの問題は、単一の場所がダウンした場合、監視データも失われることです。したがって、高可用性の監視インフラストラクチャを実装することにしました。つまり、別の大陸に2つのPrometheusノードと2つのAlertmanagerを配置します。

当社の主な視覚化ツールはGrafanaです。プライマリがダウンした場合、GrafanaがバックアップPrometheusノードにクエリを実行できることが非常に重要です。これは簡単です。HAProxyを前面に配置し、ローカルで接続を受け入れるだけです。

もう1つの問題は、ユーザー(開発者やその他の内部スタッフ)がダッシュボードを過負荷にしてPrometheusノードに負担をかけるのを防ぐ方法です。

また、プライマリがダウンした場合のバックアップノードも、サンダリングハード問題があります。

目的の状態を実現するために、Tricksterを試してみました。これにより、ダッシュボードの読み込み時間が大幅に高速化されます。タイムシリーズをキャッシュします。当社の場合、キャッシュはメモリにありますが、保存場所の選択肢は他にもあります。プライマリがダウンしてダッシュボードを更新しても、Tricksterはメモリにキャッシュされているタイムシリーズのために2番目のノードにクエリを実行しません。TricksterはGrafanaとPrometheusの間に位置します。Prometheus APIとのみ通信します。

Hostinger Graphing Architecture

Prometheusノードは独立していますが、Alertmanagerノードはクラスターを形成します。両方のAlertmanagerが同じアラートを検出した場合、重複排除され、複数回ではなく1回のみ起動されます。

当社では、多数のblackbox_exportersを実行し、すべてのHostingerクライアントのWebサイトを監視する予定です。監視できないものは評価できないからです。

将来的には、複数のPrometheusインスタンス間でノードをシャーディングするために、さらに多くのPrometheusノードを実装することを楽しみにしています。これにより、地域ごとに1つのインスタンスがダウンした場合でもボトルネックが発生しなくなります。

サブクエリのサポート

はじめに

タイトルが示すように、サブクエリはクエリの一部であり、以前は不可能だったクエリ内で範囲クエリを実行できます。これは長年の機能リクエストでした:prometheus/prometheus/1227

サブクエリのサポートに関するプルリクエストは最近Prometheusにマージされ、Prometheus 2.7で利用可能になります。以下で詳細をご覧ください。

動機

場合によっては、rateをより低い解像度/範囲(例:5m)で使用して問題を特定し、このデータをより高い範囲(例:1hmax_over_time)で集計したい場合があります。

以前は、上記のことは単一のPromQLクエリでは不可能でした。アラートルールまたはグラフ表示のためにクエリで範囲選択を行いたい場合は、そのクエリに基づいて記録ルールを作成し、記録ルールによって作成されたメトリクスに対して範囲選択を実行する必要がありました。例:max_over_time(rate(my_counter_total[5m])[1h])

数日または数週間にわたるデータの簡単な結果が必要な場合、使用できるようになるまで、記録ルールに十分なデータが揃うのをかなり待つ必要があります。記録ルールを追加するのを忘れると、ストレスが溜まります。また、クエリの各ステップに対して記録ルールを作成するのは面倒です。

サブクエリのサポートにより、すべての待ち時間とストレスが解消されます。

サブクエリ

サブクエリは、/api/v1/query_range API呼び出しに似ていますが、インスタントクエリに組み込まれています。サブクエリの結果は、範囲ベクターです。

Prometheusチームは、ミュンヘンで開催されたPrometheus Dev Summit 2018で、サブクエリの構文について合意に達しました。これらはサブクエリサポートに関するサミットのメモと、サブクエリのサポートを実装するために使用される構文のデザインドキュメントです。

<instant_query> '[' <range> ':' [ <resolution> ] ']' [ offset <duration> ]
  • <instant_query>は、/query_range APIのqueryフィールドと同等です。
  • <range>offset <duration>は、範囲セレクターに似ています。
  • <resolution>はオプションであり、/query_range APIのstepと同等です。

解像度が指定されていない場合、グローバル評価間隔がサブクエリのデフォルトの解像度として採用されます。また、サブクエリのステップは独立して調整され、親クエリの評価時間に依存しません。

min_over_time関数内のサブクエリは、過去30分間のhttp_requests_totalメトリクスの5分間のレートを1分の解像度で返します。これは、query=rate(http_requests_total[5m]), end=<now>, start=<now>-30m, step=1mを使用した/query_range API呼び出しに相当し、受信したすべての値の最小値を取得します。

min_over_time( rate(http_requests_total[5m])[30m:1m] )

詳細

  • rate(http_requests_total[5m])[30m:1m]はサブクエリで、rate(http_requests_total[5m])は実行するクエリです。
  • rate(http_requests_total[5m])は、start=<now>-30mからend=<now>まで、1mの解像度で実行されます。start時間は1mのステップで独立して調整されることに注意してください(調整されたステップは0m 1m 2m 3m ...です)。
  • 最後に、上記すべての評価の結果がmin_over_time()に渡されます。

以下は、ネストされたサブクエリとデフォルトの解像度の使用例です。最も内側のサブクエリは、一定期間のdistance_covered_meters_totalのレートを取得します。これを使用して、再度一定期間のレートのderiv()を取得します。そして最後に、すべての導関数の最大値を取得します。最も内側のサブクエリの<now>時間は、deriv()の外部サブクエリの評価時間に対して相対的であることに注意してください。

max_over_time( deriv( rate(distance_covered_meters_total[1m])[5m:1m] )[10m:] )

ほとんどの場合、デフォルトでルールが評価される間隔であるデフォルトの評価間隔が必要です。カスタム解像度は、計算頻度を減らしたり増やしたりしたい場合に役立ちます。たとえば、あまり頻繁に計算したくないコストのかかるクエリなどです。

結び

サブクエリは記録ルールの代わりに使用すると非常に便利ですが、不必要に使用するとパフォーマンスに影響します。負荷の高いサブクエリは、効率を高めるために最終的に記録ルールに変換する必要があります。

記録ルール内でサブクエリを使用することも推奨されません。記録ルールでサブクエリを使用する必要がある場合は、代わりに複数の記録ルールを作成してください。

Presslabsとのインタビュー

Prometheusユーザーとのインタビューシリーズを継続し、PresslabsのMile Rosuが監視の旅について語ります。

自己紹介とPresslabsの業務内容について教えていただけますか?

Presslabsは、パブリッシャー、エンタープライズブランド、およびWebサイト訪問者に常にシームレスなエクスペリエンスを提供しようとするデジタルエージェンシーを対象とした、高性能のマネージドWordPressホスティングプラットフォームです。

最近、当社はコア製品であるWordPressビジネスインテリジェンスに革新的なコンポーネントを開発しました。ユーザーは、包括的なダッシュボードでリアルタイムで実用的なデータを取得して、短期的な問題からデプロイまでのプロセスとサイトの継続的な改善をサポートできます。

当社は、要求の厳しい顧客向けのマネージドWordPressホスティング専用の100台のマシンで、月間最大20億ページビューのシームレスな配信をサポートしています。

当社は現在、世界中のWordPressパブリッシャーに最高のエクスペリエンスをもたらすという使命に取り組んでいます。この過程で、Kubernetesは、高可用性WordPressホスティングインフラストラクチャにおける今後の標準への道を促進します。

Prometheusを導入する前の監視経験について教えていただけますか?

私たちは2009年にWordPressホスティングプラットフォームの構築を開始しました。当時、私たちはオープンソースのシステム、ネットワーク、インフラストラクチャ監視ツールであるMuninを使用していました。Muninは、メトリクスの公開、収集、集約、アラート、可視化など、必要なすべての操作を実行していました。うまく機能していましたが、1分ごとに収集し、5分ごとに集約するのは私たちにとっては遅すぎました。そのため、生成された出力ではプラットフォーム上のイベントを適切に分析するには不十分でした。

次に選択したのがGraphiteでした。これにより、Muninで課題だった時間的な問題を解決できました。メトリクスを公開するためにcollectdを追加し、Graphiteを使用して収集および集約しました。

次に、可視化とアラートのためにJavaScriptとPythonで記述したVizというツールを作成しました。しかし、このサービスの維持には多くの手間がかかるため、積極的に使用することをやめました。その後、最初のバージョンから非常に優れたGrafanaに取って代わられました。

Presslab's Viz

2017年後半から、私たちのPresslabsプラットフォームは大規模な移行段階に入りました。大きな変更点の1つは、Kubernetesへの移行でした。これは、高性能な監視システムの必要性を意味しました。そこで、Prometheusに注目しました。それ以来、Prometheusを使用しており、新しいプラットフォーム上のすべてのサービスに、メトリクスを抽出および公開するための中核として統合する予定です。

Prometheusに注目しようと思った理由は何ですか?

私たちは2014年にバルセロナで開催されたVelocity Europeで、Soundcloudのエンジニアチームと話をした後、Prometheusを検討し始めました。彼らが説明した利点は、私たちがPrometheusを試してみるのに十分な説得力がありました。

どのように移行しましたか?

まだ移行プロセス中であるため、PrometheusとGraphite-collectdの組み合わせという2つのシステムを並行して実行しています。クライアントダッシュボードとコアサービスにはPrometheusを使用していますが、クライアントサイトにはまだGraphite-collectdを使用しています。両方の上に、可視化のためのGrafanaがあります。

Presslab's Redis Grafana dashboards

Prometheusのドキュメント、GitHubのissue、およびソースコードは、Prometheusを統合するための頼りになるリソースでした。もちろん、StackOverflowはプロセスにスパイスを加え、私たちの多くの好奇心を満たしてくれました。

Prometheusの唯一の問題は、特定のメトリクスの長期ストレージを取得できないことです。私たちのホスティングインフラストラクチャプラットフォームでは、ページビューなどの使用状況メトリクスを少なくとも1年間保存する必要があります。ただし、Prometheusの状況は私たちが使い始めてから大幅に改善されており、可能な解決策をまだテストする必要があります。

切り替え後、どのような改善が見られましたか?

Prometheusに切り替えてから、以前に使用していた他の代替手段と比較して、リソース使用量が大幅に減少したことに気づきました。さらに、Kubernetesとの自動統合により多くの時間を節約できるため、インストールも簡単です。

PresslabsとPrometheusの未来はどうなると思いますか?

現在使用しているPrometheus Helmチャートを、新しいインフラストラクチャのPrometheus Operatorに置き換える作業を進めているため、Prometheusには大きな計画があります。この実装により、プラットフォームの顧客を分離し、限られた数のWebサイトに専用のPrometheusサーバーを割り当てる予定です。私たちは、WordPressをKubernetes化する取り組みの一環として、すでにその作業に取り組んでいます。

また、WordPressのメトリクスをPrometheus形式でエクスポートする作業も進めています。Grafanaは、可視化のニーズを解決するためにPrometheusと連携して使用するため、今後も継続して使用します。

PrometheusがCNCF内で卒業

本日より、PrometheusがCNCF内で卒業したことを発表できることを嬉しく思います。

Prometheusは、このティアに到達した2番目のプロジェクトです。Prometheusを卒業させることで、CNCFは私たちのコードと機能の速度、成熟度と安定性、およびガバナンスとコミュニティプロセスに自信があることを示しています。これは、監視ツールの選択に関する社内議論において、誰にとっても外部からの品質検証としても機能します。

インキュベーションレベルに到達してから、多くのことが起こりました。その中で際立っているものをいくつか紹介します。

  • サービスにおける高い変動をサポートするために、ストレージバックエンドを完全に書き直しました。
  • 特に2.3.2で安定化に向けて大きく推進しました。
  • Prometheusの導入とコミュニティへの参加を容易にすることに特に重点を置いて、ドキュメントの推進を開始しました。

特に最後の点は重要です。現在、私たちは4番目の導入段階に入っています。これらの段階は、次のユーザーによる導入でした。

  1. 監視に特化したユーザーで、監視で最高のものだけを積極的に探している人
  2. 監視状況が規模に追いついていないハイパースケールのユーザー
  3. 監視インフラストラクチャをやり直している中小企業からフォーチュン50企業
  4. 監視に注力するための資金やリソースが不足しているが、さまざまな場所でPrometheusのメリットについて聞いているユーザー

将来を見据えて、私たちはさらに幅広い導入を期待しており、今日の規模で明日の規模に対応することを約束します。

カスタムサービスディスカバリーの実装

カスタムサービスディスカバリーの実装

Prometheusには、Consul、Kubernetes、Azureなどのパブリッククラウドプロバイダーなど、多くのサービスディスカバリー(SD)システム用の組み込み統合が含まれています。ただし、すべてのサービスディスカバリーオプションに統合実装を提供することはできません。Prometheusチームは、現在のSD統合のセットをサポートするだけで手一杯なので、可能なすべてのSDオプションの統合を維持することは現実的ではありません。多くの場合、現在のSD実装はチーム外の人々によって提供されていますが、十分に維持またはテストされていません。私たちは、維持できることがわかっている、意図したとおりに動作するサービスディスカバリーメカニズムとのみ、直接統合を提供することをお約束します。このため、現在、新しいSD統合は一時停止されています。

ただし、Docker Swarmなど、他のSDメカニズムと統合したいという要望がまだあることはわかっています。最近、小さなコード変更と例が、Prometheusリポジトリ内のディレクトリのドキュメントにコミットされました。これは、メインのPrometheusバイナリにマージすることなく、カスタムサービスディスカバリー統合を実装するためのものです。コード変更により、内部のDiscovery Managerコードを使用して、新しいSDメカニズムと対話し、Prometheusのfile_sdと互換性のあるファイルを出力する別の実行可能ファイルを作成できます。Prometheusと新しい実行可能ファイルを同じ場所に配置することで、実行可能ファイルのfile_sd互換出力を読み取るようにPrometheusを構成し、そのサービスディスカバリーメカニズムからターゲットをスクレイプできます。将来的には、これにより、SD統合をメインのPrometheusバイナリから移動したり、アダプターを使用する安定したSD統合をPrometheusのdiscoveryパッケージに移動したりできます。

アダプターコードで実装されているものなど、file_sdを使用する統合はこちらにリストされています。

例のコードを見てみましょう。

アダプター

まず、ファイルadapter.goがあります。このファイルは、カスタムSD実装用にコピーできますが、ここで何が起こっているかを理解しておくと役立ちます。

// Adapter runs an unknown service discovery implementation and converts its target groups
// to JSON and writes to a file for file_sd.
type Adapter struct {
    ctx     context.Context
    disc    discovery.Discoverer
    groups  map[string]*customSD
    manager *discovery.Manager
    output  string
    name    string
    logger  log.Logger
}

// Run starts a Discovery Manager and the custom service discovery implementation.
func (a *Adapter) Run() {
    go a.manager.Run()
    a.manager.StartCustomProvider(a.ctx, a.name, a.disc)
    go a.runCustomSD(a.ctx)
}

アダプターは、discovery.Managerを使用して、カスタムSDプロバイダーのRun関数をゴルーチンで実際に開始します。Managerには、カスタムSDが更新を送信するチャネルがあります。これらの更新には、SDターゲットが含まれています。groupsフィールドには、カスタムSD実行可能ファイルがSDメカニズムから認識しているすべてのターゲットとラベルが含まれています。

type customSD struct {
    Targets []string          `json:"targets"`
    Labels  map[string]string `json:"labels"`
}

このcustomSD構造体は、主に内部のPrometheus targetgroup.Group構造体をfile_sd形式のJSONに変換するのに役立ちます。

実行時、アダプターはカスタムSD実装からの更新をチャネルでリッスンします。更新を受信すると、targetgroup.Groupsを別のmap[string]*customSDに解析し、アダプターのgroupsフィールドに格納されているものと比較します。2つが異なる場合は、新しいグループをアダプター構造体に割り当て、それらをJSONとして出力ファイルに書き込みます。この実装では、SD実装によってチャネルに送信される各更新に、SDが認識しているすべてのターゲットグループの完全なリストが含まれていることを前提としています。

カスタムSD実装

次に、アダプターを使用して独自のカスタムSDを実装します。完全に機能する例は、同じexamplesディレクトリこちらにあります。

ここでは、アダプターコード"github.com/prometheus/prometheus/documentation/examples/custom-sd/adapter"と他のPrometheusライブラリをいくつかインポートしていることがわかります。カスタムSDを作成するには、Discovererインターフェースの実装が必要です。

// Discoverer provides information about target groups. It maintains a set
// of sources from which TargetGroups can originate. Whenever a discovery provider
// detects a potential change, it sends the TargetGroup through its channel.
//
// Discoverer does not know if an actual change happened.
// It does guarantee that it sends the new TargetGroup whenever a change happens.
//
// Discoverers should initially send a full set of all discoverable TargetGroups.
type Discoverer interface {
    // Run hands a channel to the discovery provider(consul,dns etc) through which it can send
    // updated target groups.
    // Must returns if the context gets canceled. It should not close the update
    // channel on returning.
    Run(ctx context.Context, up chan<- []*targetgroup.Group)
}

実際には、1つの関数Run(ctx context.Context, up chan<- []*targetgroup.Group)を実装するだけです。これは、アダプターコード内のマネージャーがゴルーチン内で呼び出す関数です。Run関数は、終了時期を判断するためのコンテキストを使用し、ターゲットグループの更新を送信するためのチャネルを渡されます。

提供された例内のRun関数を見ると、別のSDの実装で必要になるいくつかの重要なことが起こっていることがわかります。この場合はConsulに対して定期的に呼び出しを行い(この例では、組み込みのConsul SD実装がまだないと仮定します)、応答をtargetgroup.Group構造体のセットに変換します。Consulの動作方法のため、最初に既知のすべてのサービスを取得するための呼び出しを行い、次にすべてのバックアップインスタンスに関する情報を取得するためにサービスごとに別の呼び出しを行う必要があります。

各サービスに対してConsulを呼び出しているループの上にあるコメントに注意してください。

// Note that we treat errors when querying specific consul services as fatal for for this
// iteration of the time.Tick loop. It's better to have some stale targets than an incomplete
// list of targets simply because there may have been a timeout. If the service is actually
// gone as far as consul is concerned, that will be picked up during the next iteration of
// the outer loop.

これで、すべてのターゲットの情報を取得できない場合は、不完全な更新を送信するよりも、更新をまったく送信しない方が良いと言っています。ネットワークの問題、プロセスの再起動、HTTPタイムアウトなどのために、わずかな時間だけ古いターゲットのリストを使用し、誤検知を防止したいと考えています。Consulからすべてのターゲットに関する応答を受信した場合は、それらのすべてのターゲットをチャネルに送信します。また、個々のサービスのConsul応答を受け取り、ラベル付きのバックアップノードからターゲットグループを作成するヘルパー関数parseServiceNodesもあります。

現在の例を使用する

独自のカスタムSD実装を書き始める前に、コードを確認した後、現在の例を実行することをお勧めします。簡単にするために、私は通常、例のコードを使用するときは、docker-composeを使用してConsulとPrometheusの両方をDockerコンテナとして実行します。

docker-compose.yml

version: '2'
services:
consul:
    image: consul:latest
    container_name: consul
    ports:
    - 8300:8300
    - 8500:8500
    volumes:
    - ${PWD}/consul.json:/consul/config/consul.json
prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
    - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
    - 9090:9090

consul.json

{
"service": {
    "name": "prometheus",
    "port": 9090,
    "checks": [
    {
        "id": "metrics",
        "name": "Prometheus Server Metrics",
        "http": "http://prometheus:9090/metrics",
        "interval": "10s"
    }
    ]

}
}

docker-composeを使用して両方のコンテナを起動し、例のmain.goを実行すると、localhost:8500でConsul HTTP APIをクエリし、ファイルsd互換ファイルがcustomsd.jsonとして書き込まれます。 Prometheusを構成して、file_sd構成を介してこのファイルを取得できます。

scrape_configs:
  - job_name: "custom-sd"
    scrape_interval: "15s"
    file_sd_configs:
    - files:
      - /path/to/custom_sd.json

Datawireとのインタビュー

Prometheusユーザーへのインタビューシリーズの続きとして、DatawireのRichard LiがPrometheusへの移行について語ります。

あなた自身とDatawireの事業内容について教えてください。

Datawireでは、開発者がKubernetes上でより迅速にコーディングできるようにするオープンソースツールを作成しています。当社のプロジェクトには、Kubernetesサービスのローカル開発用のTelepresenceEnvoy Proxy上に構築されたKubernetesネイティブAPIゲートウェイであるAmbassador、およびビルド/デプロイシステムであるForgeなどがあります。

当社は、オープンソースの取り組みをサポートするために、AWSのKubernetesで多くのミッションクリティカルなクラウドサービスを実行しています。これらのサービスは、自動テストインフラストラクチャで使用される1日に数十のKubernetesクラスターを動的にプロビジョニングするなどのユースケースをサポートしています。

Prometheusを導入する前の監視経験について教えていただけますか?

私たちはAWS CloudWatchを使用していました。これは簡単に設定できましたが、より分散型の開発モデル(マイクロサービス)を採用するにつれて、より柔軟性と制御が必要になりました。たとえば、各チームが運用支援を必要とせずに、必要に応じて監視をカスタマイズできるようにしたいと考えていました。

Prometheusに注目しようと思った理由は何ですか?

私たちには2つの主な要件がありました。1つ目は、ここのすべてのエンジニアが、自分のサービスに対する運用上の制御と可視性を持ちたいということです。私たちの開発モデルは設計上高度に分散化されており、エンジニアが何かを行うために別のエンジニアを待つ必要がある状況を回避しようとしています。監視については、エンジニアがメトリクスインフラストラクチャを柔軟かつ制御できるようにしたいと考えていました。2番目の要件は、強力なエコシステムでした。強力なエコシステムとは、一般的に、確立された(および文書化された)ベストプラクティス、継続的な開発、および困ったときに助けてくれる多くの人々を意味します。

Prometheus、特にPrometheus Operatorは、当社の要件を満たしました。Prometheus Operatorを使用すると、各開発者は運用からの支援なしに、必要に応じて独自のPrometheusインスタンスを作成できます(ボトルネックなし!)。また、CNCFのメンバーであり、KubernetesとEnvoyコミュニティでの豊富な経験があるため、Prometheusの別のCNCFコミュニティを検討するのは自然なことでした。

Datawire's Ambassador dashboards

どのように移行しましたか?

APIゲートウェイとPrometheusを統合することから始めたいと考えていました。APIゲートウェイはプロキシにEnvoyを使用しており、Envoyはstatsdプロトコルを使用してメトリクスを自動的に出力します。Prometheus Operatorをインストールし(詳細なメモはこちら)、Envoyから統計情報を収集するように構成しました。また、別のAmbassadorコントリビューターの一部の作業に基づいて、Grafanaダッシュボードを設定しました。

切り替え後、どのような改善が見られましたか?

当社のエンジニアは、現在L7トラフィックを可視化できます。また、Prometheusを使用して、カナリアデプロイメントのレイテンシーとスループットを比較し、新しいバージョンのサービスがパフォーマンスの低下を引き起こさないという確信を深めることができます。

DatawireとPrometheusの将来についてどう思いますか?

Prometheus Operatorの使用はまだ少し複雑です。サービスチーム向けの運用上のベストプラクティス(いつPrometheusをデプロイするか?)を理解する必要があります。次に、これらのベストプラクティスについてエンジニアを教育し、ニーズに合わせてOperatorを構成する方法についてトレーニングする必要があります。何がうまくいき、何がうまくいかないのかを理解するにつれて、これはある程度の実験の領域になると予想されます。

Scalefastrとのインタビュー

Prometheusユーザーへのインタビューシリーズの続きとして、ScalefastrのKevin BurtonがPrometheusの使用方法について語ります。

あなた自身とScalefastrの事業内容について教えてください。

私の名前はKevin Burtonで、ScalefastrのCEOです。私のバックグラウンドは分散システムであり、以前はペタバイトスケールの分散ソーシャルメディアクローラーおよび検索エンジンを構築したDatastreamerという会社を経営していました。

Datastreamerでは、インフラストラクチャに関するスケーラビリティの問題に遭遇し、Debian、Elasticsearch、Cassandra、およびKubernetesに基づく高性能クラスターを構築しました。

多くのお客様もインフラストラクチャに苦労していることがわかり、AWSとGoogle Cloudで大量のコンテンツをホストするためにどれだけのお金を払っているかに驚きました。

クラウドで実行するのにかかるコストを継続的に評価しており、私たちにとってホスティングコストは現在の支払い額の約5〜10倍になっていたでしょう。

Kubernetes、Prometheus、Elasticsearch、Cassandra、Grafana、Etcdなどのオープンソースおよびクラウドネイティブテクノロジーに基づく新しいクラウドプラットフォームを立ち上げることを決定しました。

現在、数ペタバイトスケールで数社のお客様をホストしており、今月新しいプラットフォームをソフトローンチしています。

Prometheusを導入する前の監視経験について教えていただけますか?

Datastreamerでは、メトリクスが迅速に反復する能力の鍵であることがわかりました。プラットフォームの可観測性は私たちが受け入れたものであり、Dropwizard Metricsのようなツールを統合して、プラットフォームの分析を簡単に開発できるようにしました。

KairosDB、Grafana、および独自の(シンプルな)視覚化エンジンに基づいてプラットフォームを構築し、これは非常に長い間うまくいきました。

KairosDBで私たちが確認した重要な問題は、Prometheusの採用率と顧客の需要でした。

さらに、Prometheusの良いところは、プロジェクト自体またはコミュニティによって実装されたエクスポーターのサポートです。

KairosDBでは、独自のエクスポーターを構築するのに苦労することがよくありました。KairosDBのエクスポーターがすでに存在している可能性は、Prometheusと比較してかなり低かったです。

たとえば、KairosDBのCollectDサポートがありますが、Debianではあまり適切にサポートされておらず、CollectDには本番環境で確実に動作することを妨げる実際的なバグがあります。

Prometheusを使用すると、非常に迅速に起動して実行でき(システムは非常に簡単にインストールできます)、プラットフォームのエクスポーターが準備できている可能性が非常に高いです。

さらに、Scalefastrのような標準化されたサポート付き製品として統合するホスト型プラットフォームが存在するようになると、顧客アプリケーションがPrometheusメトリクスを標準化し始めると予想しています。

アプリケーションのパフォーマンスを可視化することは不可欠であり、それを実現するためにはPrometheusの高いスケーラビリティが必要です。

Prometheusに注目しようと思った理由は何ですか?

私たちは最初、他の人がKubernetesとコンテナーアプリケーションをどのように監視しているのかに興味がありました。

コンテナーの主な課題の1つは、コンテナーが急速に出入りして、分析する必要があるログデータとメトリクスデータが残されるという事実です。

人々がコンテナーファーストアーキテクチャとともにPrometheusを本番環境で正常に使用していることを確認したら、エクスポーターとダッシュボードのサポートと同様に、Prometheusを分析バックエンドとして調査する必要があることは明らかでした。

One of Scalefastr's Grafana dashboards

どのように移行しましたか?

Scalefastrは新しい環境であるため、移行はやや容易でした。

アーキテクチャのほとんどは新しく、制限要因はほとんどありません。

私たちの主な目標は、ベアメタルにデプロイすることですが、既存の標準化されたハードウェアの上にクラウド機能を構築することです。

Prometheusに裏打ちされたクラスター内のすべての分析を行うことが目標です。

Prometheus、Grafana、Elasticsearch、Kibana、およびKubernetesコントロールプレーンを含む、独自の「管理」インフラストラクチャをお客様に提供します。このシステムは、初期マシンセットアップ(ssh、コアDebianパッケージなど)とベースライン構成を処理するAnsibleで調整します。

次に、Prometheus、顧客構成に必要なすべてのエクスポーター、およびGrafanaの追加ダッシュボードをデプロイします。

やや問題があることが判明したことの1つは、Grafana.comのいくつかのダッシュボードがPrometheus 1.x用に作成されており、2.xにスムーズに移植されなかったことです。2.xシリーズには存在しない関数はごくわずかであり、それらの多くはほんの少し微調整するだけでよいことがわかりました。また、一部のダッシュボードは、以前のバージョンのGrafana用に作成されていました。

この問題を解決するために、今週、Cassandra、Elasticsearch、OS、さらにはPrometheus自体のようなツールのPrometheusのダッシュボードを標準化および改善するためのプロジェクトを発表しました。これをオープンソース化し、先週Githubに公開しました

これにより、他の人がPrometheusに移行しやすくなることを願っています。

改善したいことの1つは、Grafanaバックエンドと自動的に同期させることですが、これらのダッシュボードをGrafana.comにアップロードすることです。

また、ラベルがGrafanaテンプレートで正しく機能するように、Prometheus構成も公開しました。これにより、プルダウンメニューを使用して、クラスター名、インスタンス名などのより具体的なメトリクスを選択できます。

Using template variables in Grafana dashboards

切り替え後、どのような改善が見られましたか?

展開の容易さ、高いパフォーマンス、および標準化されたエクスポーターにより、簡単に切り替えることができました。さらに、バックエンドは構成が非常に簡単で(基本的にはデーモン自体だけ)、可動部分が少ないため、簡単に決定できました。

ScalefastrとPrometheusの将来についてどう思いますか?

現在、ElasticsearchとCassandraをベアメタルに直接デプロイしています。これらをKubernetesの上に直接コンテナーで実行し、これを可能にするためにコンテナストレージインターフェイス(CSI)の使用に取り組んでいます。

これを実現するには、まずPrometheusのサービスディスカバリーを機能させる必要がありますが、これはまだ試していないものです。現在、PrometheusはAnsibleを使ってデプロイと設定を行っていますが、コンテナはワークロードの変化に応じて現れたり消えたりするため、Kubernetesでは明らかにスケールしません(あるいは機能すらしないでしょう)。

また、標準ダッシュボードとアラートの改善にも取り組んでいます。追加したい機能の一つ(おそらくコンテナとして)は、ホルト=ウィンタースの予測に基づくアラートのサポートです。

これにより、障害が発生する前に(ディスク容量の枯渇など)深刻なパフォーマンス問題を予測できるようになります。何か問題が発生してから対処するのではなく、事前に対応できるようになります。

ある程度、Kubernetesはこの問題の解決に役立ちます。リソースの使用率が高くなりすぎたら、ウォーターマークに基づいてクラスターにノードを追加するだけで、自動スケールできます。

特にPrometheus 2.xシリーズの開発が進み、CNCFとの連携も順調に進んでいるため、Prometheusの将来に非常に期待しています。

CloudNativeCon 2017でのPrometheus

CloudNativeCon 2017でのPrometheus

12月6日(水)はCloudNativeConオースティンでPrometheus Dayが開催され、素晴らしい講演とイベントが予定されています。Prometheusサロンでは、Kubernetesを最適にモニタリングする方法について実践的なアドバイスを受けたり、Prometheusのさまざまな側面に関する一連の講演に参加したり、CNCFブースでPrometheusの開発者たちと交流したり、その後はPrometheusハッピーアワーを楽しむことができます。詳細については以下をお読みください。

Prometheus 2.0を発表

Prometheus 2.0を発表

約1年半前、Prometheus 1.0を公開しました。このリリースは、プロジェクトにとって重要なマイルストーンとなりました。Prometheusのシンプルでありながら非常に強力なモニタリング哲学を構成する広範な機能群に到達しました。

それ以来、さまざまなサービスディスカバリー統合を追加・改善し、PromQLを拡張し、プラグ可能な長期ストレージソリューションを可能にするリモートAPIの最初のイテレーションを実験しました。

しかし、メジャーリリースに値する他の変更は何でしょうか?

PromCon 2017のまとめ

何が起こったか

2週間前、世界中のPrometheusユーザーと開発者が、ミュンヘンで開催されたPrometheusモニタリングシステムに関する2回目のカンファレンスであるPromCon 2017に集結しました。このイベントの目的は、Prometheusによるモニタリングに関する知識やベストプラクティスを交換し、専門的なつながりを築くことでした。今年はGoogleのミュンヘンオフィスがより広いスペースを提供してくれたため、参加者を80人から220人に増やすことができ、それでも完売しました!

イベントの様子をまとめたビデオをご覧ください。

新しいルール形式を搭載したPrometheus 2.0 Alpha.3

本日、Prometheus 2.0の3番目のアルファ版をリリースします。新しいストレージレイヤーにおけるさまざまなバグ修正に加えて、いくつかの計画的な破壊的変更が含まれています。

フラグの変更

まず、新しいフラグライブラリに移行しました。このライブラリでは、Prometheusがこれまで使用していた単一ダッシュの代わりに、より一般的な二重ダッシュ--プレフィックスをフラグに使用します。デプロイはそれに応じて適応する必要があります。さらに、このアルファ版でいくつかのフラグが削除されました。Prometheus 1.0.0以降の完全なリストは次のとおりです。

  • web.telemetry-path
  • すべてのstorage.remote.*フラグ
  • すべてのstorage.local.*フラグ
  • query.staleness-delta
  • alertmanager.url

レコーディングルールの変更

アラートとレコーディングルールは、Prometheusの重要な機能の1つです。しかし、それらにはいくつかの設計上の問題と欠落した機能もあります。具体的には、

  • すべてのルールが同じ間隔で実行されていました。10分間隔で実行する方が良い重いルールと、15秒間隔で実行できるルールがあるはずです。

  • すべてのルールが同時に評価されていましたが、これは実際にはPrometheusの最も古いオープンバグです。これにはいくつかの問題があり、明白なのは、ルールが多い場合、評価間隔ごとに負荷が急増することです。もう1つは、互いに依存するルールに古いデータが供給される可能性があることです。例えば、

instance:network_bytes:rate1m = sum by(instance) (rate(network_bytes_total[1m]))

ALERT HighNetworkTraffic
  IF instance:network_bytes:rate1m > 10e6
  FOR 5m

ここでは、instance:network_bytes:rate1mに関するアラートを出していますが、instance:network_bytes:rate1m自体が別のルールによって生成されています。アラートHighNetworkTrafficinstance:network_bytes:rate1mの現在の値が記録された後に実行された場合にのみ、期待どおりの結果を得ることができます。

  • ルールとアラートでは、ユーザーが別のDSLを学ぶ必要がありました。

上記の問題を解決するために、ルールのグループ化が以前から提案されていましたが、最近Prometheus 2.0の一部として実装されました。この実装の一環として、ルールをよく知られたYAML形式に移行しました。これにより、ユーザー環境における一般的なパターンに基づいてアラートルールを生成することも容易になります。

新しい形式は次のようになります。

groups:
- name: my-group-name
  interval: 30s   # defaults to global interval
  rules:
  - record: instance:errors:rate5m
    expr: rate(errors_total[5m])
  - record: instance:requests:rate5m
    expr: rate(requests_total[5m])
  - alert: HighErrors
    # Expressions remain PromQL as before and can be spread over
    # multiple lines via YAML’s multi-line strings.
    expr: |
      sum without(instance) (instance:errors:rate5m)
      / 
      sum without(instance) (instance:requests:rate5m)
    for: 5m
    labels:
      severity: critical
    annotations:
      description: "stuff's happening with {{ $labels.service }}"      

各グループのルールは順番に実行され、グループごとに評価間隔を設定できます。

この変更は破壊的なものであるため、2.0リリースでリリースし、移行のためにpromtoolにコマンドを追加しました。promtool update rules <filenames>変換されたファイルには.ymlサフィックスが付加され、Prometheus構成のrule_files句を適応させる必要があります。

この新しいアルファ版をテストして、Prometheus 2.0の安定版リリースに向けてご協力ください!バグはissue trackerで報告し、一般的なフィードバックはコミュニティチャンネルを通じて提供できます。

L’Atelier Animationへのインタビュー

Prometheusのユーザーへのインタビューシリーズの続きとして、L’Atelier AnimationのPhilippe PanaiteとBarthelemy Stevensが、彼らのアニメーションスタジオがNagios、Graphite、InfluxDBの混在からPrometheusに切り替えた方法について語ります。

あなた自身とL'Atelier Animationの事業内容について教えていただけますか?

L’Atelier Animationは、カナダの美しい都市モントリオールに拠点を置く3Dアニメーションスタジオです。私たちの最初の長編映画「バレリーナ」(「Leap」とも呼ばれます)は、2017年に世界中で公開され、米国での公開は今年後半に予定されています。

現在、私たちはアニメーションTVシリーズと2番目の長編映画に取り組んでいます。私たちのインフラストラクチャは、約300のレンダリングブレード、150のワークステーション、および20のさまざまなサーバーで構成されています。数台のMacを除いて、すべてLinux(CentOS)で実行され、Windowsマシンは1台もありません。

 

Prometheusを導入する前の監視経験について教えていただけますか?

  最初は、NagiosGraphite、およびInfluxDBの組み合わせを使用しました。初期設定は「まあまあ」でしたが、特別なものではなく、複雑すぎました(可動部分が多すぎる)。 

Prometheusに注目しようと思った理由は何ですか?

  すべてのサービスをCentOS 7に切り替えたとき、私たちは新しいモニタリングソリューションを検討しました。Prometheusが多くの理由で浮上しましたが、最も重要な理由は次のとおりです。

  • Node Exporter:カスタマイズ機能により、クライアントからあらゆるデータを取得できます。
  • SNMPサポート:サードパーティのSNMPサービスが不要になります。
  • アラートシステム:さようならNagios
  • Grafanaサポート

どのように移行しましたか?

最初の映画を完成させたとき、少しダウンタイムがあったので、IT部門が大幅な変更を加える絶好の機会でした。私たちは、満足できるものではなかったので、モニタリングシステム全体を刷新することにしました。

最も重要な部分の1つはネットワーク機器を監視することなので、まずスイッチの1つからデータを取得するようにsnmp_exporterを設定することから始めました。exporterが行うNetSNMPの呼び出しはCentOSでは異なるため、バイナリの一部を再コンパイルする必要がありました。あちこちで小さな問題が発生しましたが、Robust PerceptionのBrian Brazilの助けを借りて、すべてがすぐに解決しました。snmp_exporterが機能するようになったら、新しいデバイスを簡単に追加してSNMPデータを取得できるようになりました。現在、コアネットワーク(13個のスイッチ、10個のVLANを含む)をGrafanaで監視しています。

Switch metrics from SNMP data

その後、ワークステーション、レンダリングブレード、サーバーの分析が必要だったため、node_exporterを設定しました。この分野では、CPUが100%になっていないと問題です。可能な限りすべてのパワーを使用したいので、最終的には温度がより重要になります。さらに、可能な限り長い稼働時間が必要なので、すべてのステーションにPrometheusのAlertmanagerを介してメールアラートが設定されており、何か問題が発生したときにすぐに通知されます。

Dashboard for one workstation

私たちの特定のニーズでは、クライアントからのカスタムデータを監視する必要があります。これは、node_exporterのテキストファイルコレクター機能を使用することで簡単に行えます。cronジョブは、特定のツールからの特定のデータを、Prometheusが読み取り可能な形式で事前にフォーマットされたテキストファイルに出力します。

すべてのデータはHTTPプロトコル経由で利用できるため、Prometheusからデータを取得するPythonスクリプトを作成しました。これを、MySQLデータベースに保存し、Webアプリケーションを介してアクセスして、ライブフロアマップを作成します。これにより、マウスオーバーするだけで、どのユーザーがどのタイプのハードウェアでどこに座っているかを知ることができます。また、ユーザーの写真と部署情報を含む別のページも作成しました。これは、新入社員が隣の席の人が誰であるかを知るのに役立ちます。このウェブサイトはまだ進行中のプロジェクトなので、見た目で判断しないでください。私たちはシステム管理者であり、Webデザイナーではありませんので :-)

Floormap with workstation detail

切り替え後、どのような改善が見られましたか?

これにより、スタジオ内のすべての監視方法を変更する機会が得られ、Prometheusによって最初に取得されたすべてのデータを使用して新しいカスタムフロアマップを作成するきっかけになりました。セットアップは1つのサービスですべてを管理できるため、非常にシンプルです。

L’Atelier AnimationとPrometheusの将来はどうなると思いますか?

現在、Prometheusとのソフトウェアライセンスの使用状況の統合を進めています。この情報により、アーティストは誰が何をどこで使用しているかを把握できます。

ユーザーからの要望に応じて、Prometheusのカスタマイズと新機能の追加を継続します。私たちはアーティストと協力しているので、十分な要望があることはわかっています :-) SNMPとnode_exporterのカスタムテキストファイル入力により、可能性は無限大です。

iAdvizeへのインタビュー

Prometheusのユーザーへのインタビューシリーズの続きとして、iAdvizeのLaurent COMMARIEUが、従来のNagiosおよびCentreonのモニタリングをPrometheusに置き換えた方法について語ります。

iAdvizeが何をしているのか教えていただけますか?

私はiAdvizeのシステムエンジニアであるLaurent COMMARIEUです。私は60人のR&D部門の中で、5人のシステムエンジニアのチームで働いています。私たちの仕事は主に、アプリケーション、サービス、および基盤となるシステムが稼働し続けていることを保証することです。私たちは開発者と協力して、彼らのコードが本番環境に移行するまでの最も簡単な道筋を確保し、あらゆる段階で必要なフィードバックを提供します。そこでモニタリングが重要になります。

iAdvizeは、フルスタックの会話型コマースプラットフォームです。ブランドが、コミュニケーションチャネル(チャット、電話、ビデオ、Facebookページ、Facebook Messenger、Twitter、Instagram、WhatsApp、SMSなど)に関係なく、顧客と一元的に対話するための簡単な方法を提供しています。私たちの顧客は、eコマース、銀行、旅行、ファッションなどで、40か国で事業を展開しています。私たちは、フランス、イギリス、ドイツ、スペイン、イタリアにオフィスを持つ200人の従業員を擁する国際企業です。2015年に1,600万ドルを調達しました。

Prometheusを導入する前の監視経験について教えていただけますか?

私は2016年2月にiAdvizeに入社しました。以前は、ネットワークおよびアプリケーションモニタリングを専門とする企業で働いていました。私たちはNagiosCactiCentreonZabbixOpenNMSなどのオープンソースソフトウェアや、HP NNMIBM Netcool suiteBMC Patrolなどの非フリーのものを使用していました。

iAdvizeは以前、モニタリングを外部プロバイダーに委託していました。彼らはNagiosとCentreonを使用して24時間365日のモニタリングを保証していました。このツールセットは、レガシーの静的アーキテクチャ(ベアボーンサーバー、VMなし、コンテナなし)では正常に機能していました。このモニタリングスタックを完成させるために、Pingdomも使用しています。

私たちのモノリシックアプリケーションをマイクロサービスアーキテクチャ(Dockerを使用)に移行し、現在のワークロードをインフラストラクチャクラウドプロバイダーに移行したいという意向に伴い、モニタリングに対するより多くの制御と柔軟性が必要になりました。同時に、iAdvizeは3人を採用し、インフラストラクチャチームは2人から5人に増えました。古いシステムでは、Centreonに新しいメトリクスを追加するのに少なくとも数日または1週間かかり、実際のコスト(時間と費用)がかかっていました。

Prometheusに注目しようと思った理由は何ですか?

私たちは、Nagiosなどが良い選択肢ではないことを知っていました。当時、Prometheusが注目の的だったので、PoCを行うことにしました。Sensuも最初は候補リストにありましたが、Prometheusは私たちのユースケースにとってより有望に思えました。

私たちは、サービスディスカバリーシステムであるConsulと統合できるものが必要でした。私たちのマイクロサービスにはすでに/healthルートがありました。/metricsエンドポイントを追加するのは簡単でした。使用しているほとんどすべてのツールで、エクスポーターが利用可能でした(MySQL、Memcached、Redis、nginx、FPMなど)。

理論上は、良いように思えました。

One of iAdvize's Grafana dashboards

どのように移行しましたか?

まず、Prometheusがこの仕事に適したツールであり、アプリにエクスポーターを追加する必要があることを開発チーム(40人)に納得させる必要がありました。そこで、RabbitMQで簡単なデモを行い、RabbitMQエクスポーターをインストールし、開発者に使用状況メトリクスを表示するための簡単なGrafanaダッシュボードを構築しました。いくつかのキューを作成し、メッセージをパブリッシュ/コンシュームするためのPythonスクリプトを作成しました。

彼らはキューとメッセージがリアルタイムで表示されるのを見て、非常に感銘を受けました。それ以前は、開発者はモニタリングデータにアクセスできませんでした。Centreonはインフラストラクチャプロバイダーによって制限されていました。現在、Grafanaは、Google Auth統合を使用して認証を行うことで、iAdvizeの誰もが利用できます。(開発チームからCEOまで)78のアクティブアカウントがあります。

ConsulとcAdvisorで既存のサービスのモニタリングを開始した後、コンテナの実際の存在をモニタリングしました。これらはPingdomチェックを使用してモニタリングされていましたが、十分ではありませんでした。

データベース(MySQLとRedis)からいくつかのビジネスメトリクスをスクレイピングするために、Goでいくつかのカスタムエクスポーターを開発しました。

すぐに、レガシーモニタリング全体をPrometheusに置き換えることができました。

One of iAdvize's Grafana dashboards

切り替え後、どのような改善が見られましたか?

ビジネスメトリクスは非常に人気となり、セール期間中は、記録を更新できるかどうかを確認するために、誰もがGrafanaに接続しています。同時会話数、ルーティングエラー、接続されているエージェント数、iAdvizeタグをロードしている訪問者数、APIゲートウェイでの呼び出しなどを監視しています。

私たちは、NewrelicエクスポーターGrafana用のPerconaダッシュボードに基づいた分析を使用して、MySQLサーバーを最適化するために1か月間取り組みました。これは本当に成功し、非効率性を発見し、データベースサイズを45%、ピークレイテンシーを75%削減する最適化を実行することができました。

言うべきことはたくさんあります。AMQPキューにコンシューマーがない場合や、異常に充填されているかどうかがわかります。コンテナが再起動したときもわかります。

可視性はまさに素晴らしいです。

それはレガシープラットフォームの場合だけでした。

ますます多くのマイクロサービスがクラウドに展開される予定であり、それらを監視するためにPrometheusが使用されています。Consulを使用してサービスを登録し、Prometheusを使用してメトリクスルートを発見しています。すべてが魅力的に機能し、重要なビジネス、アプリケーション、およびシステムメトリクスを多数備えたGrafanaダッシュボードを構築できます。

Nomadを使用してサービスをデプロイするためのスケーラブルなアーキテクチャを構築しています。Nomadは、正常なサービスをConsulに登録し、いくつかのタグのリラベル付けを使用して、「metrics=true」というタグ名でそれらをフィルタリングできます。これにより、モニタリングのデプロイにかかる時間が大幅に短縮されます。私たちは何もする必要がありません^^。

また、EC2サービスディスカバリーも使用しています。これは、オートスケーリンググループを使用する場合に非常に役立ちます。インスタンスをスケーリングおよびリサイクルすると、すでに監視されています。本番環境で何が起こっているかを外部インフラストラクチャプロバイダーが認識するのを待つ必要はもうありません。

Alertmanagerを使用して、SMSまたはFlowdockにアラートを送信します。

iAdvizeとPrometheusの将来はどうなると思いますか?

  • 私たちは、キャパシティプランニングのために、長期的なスケーラブルなストレージを簡単に追加する方法を待っています。
  • いつの日か、私たちのオートスケーリングがPrometheusのアラートによってトリガーされることを夢見ています。応答時間とビジネスメトリクスに基づいた自律的なシステムを構築したいと考えています。
  • 以前はNetuitiveを使っていましたが、自動相関のある優れた異常検出機能がありました。Prometheusにも同じような機能があれば素晴らしいでしょう。

Prometheus 2.0のプレビュー

2016年7月、Prometheusは1.0リリースという大きなマイルストーンに到達しました。それ以来、新しいサービスディスカバリー統合や実験的なリモートAPIなどの多くの新機能が追加されました。また、インフラストラクチャ分野での新しい開発、特にKubernetesにより、監視対象環境が大幅に動的になることがわかりました。当然のことながら、これはPrometheusに新しい課題をもたらし、ストレージレイヤーにパフォーマンスのボトルネックがあることを特定しました。

過去数か月にわたって、これらのボトルネックに対処し、全体的に大幅なパフォーマンスの向上を示す新しいストレージコンセプトを設計および実装してきました。また、ホットバックアップなどの機能を追加するための道が開かれます。

変更は非常に根本的なものであるため、新しいメジャーリリースであるPrometheus 2.0がトリガーされます。
ストレージ以外にも、重要な機能と変更が安定版リリース前に計画されています。ただし、今日はPrometheus 2.0の初期アルファ版をリリースして、新しいストレージの安定化プロセスを開始します。

リリースtarballDockerコンテナが利用可能になりました。ストレージの新しいメカニズムに興味がある場合は、内部構造を詳しく解説した詳細なブログ記事を必ずお読みください。

このバージョンは古いストレージデータでは機能せず、既存の本番環境のデプロイメントを置き換えるべきではありません。実行するには、データディレクトリを空にする必要があり、-storage.local.retentionを除くすべての既存のストレージフラグを削除する必要があります。

例:以前

./prometheus -storage.local.retention=200h -storage.local.memory-chunks=1000000 -storage.local.max-chunks-to-persist=500000 -storage.local.chunk-encoding=2 -config.file=/etc/prometheus.yaml

./prometheus -storage.local.retention=200h -config.file=/etc/prometheus.yaml

これは非常に初期のバージョンであり、クラッシュ、データ破損、および一般的なバグが発生する可能性があります。安定版リリースに向けて、issue trackerに送信してご協力ください。

実験的なリモートストレージAPIは、このアルファリリースでは無効になっています。フェデレーションされたPrometheusサーバーなど、タイムスタンプを公開するスクレイピングターゲットはまだ機能しません。ストレージ形式は壊れており、その後のアルファリリース間で再び壊れます。安定版リリースに近づいたら、1.0から2.0へのアップグレードパスをドキュメント化する予定です。

Europaceとのインタビュー

Prometheusのユーザーとの一連のインタビューを継続して、EuropaceのTobias GesellchenがPrometheusをどのように発見したかについて語っています。

Europaceが何をしているのか教えていただけますか?

Europace AGは、ドイツ最大の住宅ローン、住宅金融商品、個人ローンのプラットフォームであるWebベースのEUROPACE金融市場を開発および運営しています。完全に統合されたシステムは、約400のパートナー(銀行、保険会社、金融商品販売業者)をリンクしています。数千人のユーザーが毎月、EUROPACEで合計最大40億ユーロ相当の約35,000件のトランザクションを実行しています。当社のエンジニアは、http://tech.europace.de/@EuropaceTechで定期的にブログを書いています。

Prometheusを導入する前の監視経験について教えていただけますか?

Nagios/Icingaは他のプロジェクトでも引き続き使用されていますが、サービスの増加と柔軟性へのより高い要求により、他のソリューションを探しました。NagiosとIcingaはより集中管理されているため、Prometheusはチームで完全なDevOpsスタックを持ち、インフラストラクチャチームからプロジェクトメンバーに特定の責任を移すという私たちの目標に合致しました。

Prometheusに注目しようと思った理由は何ですか?

Docker Berlinコミュニティでの活動を通じて、SoundCloudJulius Volzと連絡を取り、彼から概要を教えてもらいました。柔軟なDockerコンテナと、非常に柔軟なラベルベースのコンセプトの組み合わせにより、Prometheusを試してみることにしました。Prometheusのセットアップは非常に簡単で、Alertmanagerは私たちのニーズに対応していたため、代替案を試す理由はありませんでした。Docker環境およびメッセージングツールとの統合を改善するための私たちのささやかなプルリクエストさえ、非常に迅速にマージされました。時間が経つにつれて、スタックにいくつかのエクスポーターとGrafanaを追加しました。私たちは決して振り返ったり、代替案を探したりすることはありませんでした。

Grafana dashboard for Docker Registry

どのように移行しましたか?

私たちのチームは新しいプロジェクトでPrometheusを導入したため、チーム内での移行は発生しませんでした。他のチームは、既存のソリューションと並行してPrometheusを追加することから始め、メトリクスコレクターを段階的に移行しました。移行中には、カスタムエクスポーターやその他の一時的なサービスが役立ちました。Grafanaはすでに存在していたため、別のダッシュボードを検討する必要はありませんでした。一部のプロジェクトでは、IcingaとPrometheusの両方を並行して使用しています。

切り替え後、どのような改善が見られましたか?

スケーラビリティの問題でIcingaを使用していた問題がありました。複数のチームが集中管理されたソリューションを維持することはうまくいきませんでした。AlertmanagerとともにPrometheusスタックを使用すると、チームとプロジェクトが分離されました。Alertmanagerは現在、高可用性モードでデプロイできるようになりました。これは、モニタリングインフラストラクチャの中核に対する大きな改善です。

EuropaceとPrometheusの将来はどうなると思いますか?

当社内の他のチームも、プロジェクトでPrometheusを徐々に採用しています。より多くのプロジェクトがAlertmanagerとともにPrometheusを導入し、徐々にIcingaを置き換えることを期待しています。Prometheus固有の柔軟性により、ニーズに合わせて拡張でき、将来の要件に適応するのに問題はないと期待しています。

Weaveworksへのインタビュー

Prometheusユーザーへのインタビューシリーズとして、WeaveworksのTom Wilkie氏に、彼らがPrometheusをどのように選び、それを基盤に構築しているかについて語っていただきます。

Weaveworksについて教えていただけますか?

Weaveworksは、オープンソースプロジェクトとサービスとしてのソフトウェアを組み合わせることでマイクロサービスを「運用化」するサービスであるWeave Cloudを提供しています。

Weave Cloudは以下で構成されています。

  • Weave Scopeによる可視化
  • Weave Fluxによる継続的デプロイ
  • コンテナSDNであるWeave Netによるネットワーク
  • オープンソースの分散型Prometheus-as-a-ServiceであるWeave Cortexによる監視。

Weave Cloudは60日間無料で試すことができます。当社の製品に関する最新情報は、ブログTwitter、またはSlack招待)をご覧ください。

Prometheusを導入する前の監視経験について教えていただけますか?

Weave Cloudはゼロから実装されたため、以前の監視システムはありませんでした。過去には、チームはMuninやNagiosのような一般的なツールを使用していました。Weave Cloudは、Scopeのマルチテナント型ホストバージョンとして始まりました。Scopeには、CPUやメモリ使用量などの基本的な監視機能が含まれているため、それを使用していたと言うこともできます。しかし、Scope自体を監視する何かが必要でした...

Prometheusに注目しようと思った理由は何ですか?

当社にはGoogleの元SREが多数在籍しており、Borgmonの経験が豊富でした。また、Prometheusの経験を持つ元SoundClouderもいました。当社はKubernetes上でサービスを構築しており、動的にスケジュールされる性質に「適合」するものを探していたため、Prometheusは当然の選択でした。また、一連のブログ記事も執筆しており、その最初の記事はPrometheusとKubernetesがなぜそれほど相性が良いのかについてです。

どのように移行しましたか?

Prometheusを使い始めた当初、KubernetesのサービスディスカバリーはまだPR段階であり、ドキュメントもほとんどありませんでした。しばらくの間はカスタムビルドを実行し、自分たちで解決しながら進めていました。最終的に、ロンドンPrometheusミートアップ私たちの経験について講演し、一連のブログ記事公開しました。

Prometheusの実行に関するさまざまなオプションをほぼすべて試しました。最初は、組み込み設定で独自のコンテナイメージを作成し、GrafanaとAlert Managerと一緒に単一のPod内でまとめて実行しました。時系列データには一時的なPod内ストレージを使用しました。その後、ダッシュボードを変更するたびにPrometheusを再起動(および履歴を失う)する必要がないように、これを異なるPodに分割しました。最近では、アップストリームのイメージを使用し、構成をKubernetes構成マップに保存するように移行しました。構成マップは、変更時にCIシステムによって更新されます。Prometheus Pod内の小さなサイドカーコンテナを使用して、構成ファイルを監視し、変更時にPrometheusにpingを送信します。これは、Prometheusを頻繁に再起動する必要がなく、ストレージに関して特別なことをする必要がなく、履歴を失うこともないことを意味します。

それでも、Prometheusの履歴が定期的に失われるという問題は私たちを悩ませ、Kubernetesボリュームや定期的なS3バックアップなどの利用可能な解決策にはすべて欠点がありました。Scopeサービスを監視するためのPrometheusの使用経験と合わせて、これが、クラウドネイティブで分散型のPrometheusバージョンを構築する動機となりました。このバージョンでは、アップグレード、シャッフル、およびホスト障害が発生しても履歴を失うことなく存続できます。そして、それがWeave Cortex誕生のきっかけとなりました。

切り替え後、どのような改善が見られましたか?

Cortexを少し置いておくと、HA Alert Managerの導入には特に興奮しました。これは主に、当社のゴシップおよび調整レイヤーであるWeave Meshを使用した最初のWeaveworks以外のプロジェクトの1つだったためです。

また、Fabianによるバージョン2のKubernetesサービスディスカバリーの変更にも特に興味がありました。これは、同じPod上の複数のポートをスクレイピングする必要があったConsul Podの監視で抱えていた深刻な問題を解決しました。

また、リモート書き込み機能(私自身が取り組んだ機能)についても言及しておく必要があります。これにより、PrometheusはWeave Cortex自体の重要なコンポーネントとなり、ターゲットをスクレイピングしてサンプルを当社に送信します。

WeaveworksとPrometheusの将来はどうなると思いますか?

私にとって、当面の未来は、WeaveworksのPrometheus as a ServiceであるWeave Cortexです。当社では社内で幅広く使用しており、かなり優れたクエリパフォーマンスを実現し始めています。現在、実際のユーザーとともに本番環境で実行されており、まもなくアラートのサポートを導入し、アップストリームのPrometheusと同等の機能を実現します。そこから、今年半ばの一般提供に向けて、安定化のベータプログラムに入ります。

Cortexの一部として、PromQLのオートコンプリートとJupyterのようなノートブックを備えたインテリジェントなPrometheus式ブラウザーを開発しました。より多くの人々に利用してもらい、最終的にはオープンソース化することを楽しみにしています。

また、Lokiという小さなサイドプロジェクトもあります。これは、OpenTracingにPrometheusのサービスディスカバリーとスクレイピングをもたらし、分散トレースを簡単かつ堅牢にします。3月末にベルリンで開催されるKubeCon/CNCFConで、これに関する講演を行う予定です。

Canonicalへのインタビュー

Prometheusユーザーへのインタビューシリーズとして、CanonicalがPrometheusへの移行について語ります。

あなた自身とCanonicalの業務内容について教えていただけますか?

Canonicalは、おそらくUbuntu Linuxをスポンサーしている会社として最もよく知られています。また、MAAS、Juju、OpenStackなどの他の多数のオープンソースプロジェクトを制作または貢献しており、これらの製品の商用サポートも提供しています。Ubuntuは、本番環境クラウドの55%と大規模クラウド展開の58%で、OpenStack展開の大部分を動かしています。

私のグループであるBootStackは、当社の完全マネージドプライベートクラウドサービスです。Canonicalのお客様向けにOpenStackクラウドを構築および運用しています。

Prometheusを導入する前の監視経験について教えていただけますか?

以前は、NagiosGraphite/statsd、および社内Djangoアプリの組み合わせを使用していました。これらは、社内および顧客のクラウド環境の両方で必要な柔軟性とレポートのレベルを提供していませんでした。

Prometheusに注目しようと思った理由は何ですか?

InfluxDBやGraphiteの使用拡張など、いくつかの代替案を評価しましたが、Prometheusを最初に試したところ、求めていたシンプルさとパワーの組み合わせであることが証明されました。特に、ラベルの便利さ、シンプルなHTTPプロトコル、すぐに使える時系列アラートを高く評価しています。Prometheusが2つの異なるツール(アラートとトレンド)を1つで置き換える可能性は、特に魅力的です。

また、当社のスタッフの数人は、Googleでの勤務経験からBorgmonの経験があり、当社の関心が大きく高まりました!

どのように移行しましたか?

現在も移行プロセス中であり、Prometheusで再実装する必要のある既存のシステムで使用しているカスタムチェックの数により、これには時間がかかる見込みです。最も役立つリソースは、prometheus.ioサイトのドキュメントです。

エクスポートの選択には時間がかかりました。最初はcollectdを使用しましたが、これには限界がありました。現在、openstack-exporterの作成に取り組んでいますが、エクスポートをゼロから作成する方法の適切で機能する例がないことに少し驚きました。

私たちが直面した課題には、ダウンサンプリングのサポートがないこと、長期ストレージソリューションがないこと(まだ)、デフォルトの2週間の保持期間に驚いたことがあります。現在、Jujuとの連携はありませんが、取り組んでいます

切り替え後、どのような改善が見られましたか?

エクスポートのコツをつかんだら、それらが非常に簡単に記述できることがわかり、非常に役立つメトリクスが得られました。たとえば、クラウド環境向けのopenstack-exporterを開発しています。また、DevOps、WebOpsグループ、および開発者からのチームをまたいだ迅速な導入も見られました。まだアラートは導入されていませんが、移行のこの段階に到達すると、さらに多くのことが期待されます。

CanonicalとPrometheusの将来はどうなると思いますか?

Prometheusは、当社の監視およびレポートインフラストラクチャの重要な部分となり、現在および将来の多数のシステムのメトリクス収集とストレージを提供すると考えています。アラートについては、Nagiosに取って代わる可能性もあると考えています。

JustWatchへのインタビュー

Prometheusユーザーへのインタビューシリーズとして、JustWatchが監視をどのように確立したかについて語ります。

あなた自身とJustWatchの業務内容について教えていただけますか?

消費者向けに、JustWatchは、映画やテレビ番組をオンラインおよび劇場で合法的に視聴できる場所を見つけるのに役立つストリーミング検索エンジンです。Netflix、HBO、Amazon Video、iTunes、Google Playなどの主要なストリーミングプロバイダー全体で、17か国で映画コンテンツを検索できます。

映画スタジオやビデオオンデマンドプロバイダーなどのクライアントにとって、当社は国際的な映画マーケティング会社であり、コンシューマーアプリから世界中のファンの購入行動と映画の好みに関する匿名化されたデータを収集します。当社は、スタジオがコンテンツを適切な視聴者に宣伝し、デジタルビデオ広告の無駄なカバレッジを最小限に抑えて効率を高めることを支援します。

JustWatch logo

2014年のサービス開始以来、マーケティングに1ドルも費やすことなく、国際的に最大規模の20,000のウェブサイトの1つになり、2年足らずで世界最大のストリーミング検索エンジンになりました。現在、わずか10人のエンジニアチームで、主にKubernetesで実行される約50のマイクロサービスとマクロサービスの完全にDocker化されたスタックを構築および運用しています。

Prometheusを導入する前の監視経験について教えていただけますか?

以前の会社では、私たちの多くが、存在するほとんどのオープンソース監視製品を使用していました。当社は、NagiosIcingaZabbixMonitMuninGraphite、および他のいくつかのシステムの使用経験があります。ある会社では、Puppetを使用した分散型Nagiosセットアップの構築を支援しました。このセットアップは、新しいサービスが自動的にシステムに表示されるため便利でしたが、インスタンスを取り出すのは依然として困難でした。システムに多少のばらつきがあると、ホストおよびサービスベースの監視スイートはうまく適合しません。Prometheusが採用したラベルベースのアプローチは、私が常に望んでいたものですが、以前は見つけることができませんでした。

Prometheusに注目しようと思った理由は何ですか?

JustWatchでは、Prometheusの公式発表がまさに適切なタイミングでした。当社では、最初の数ヶ月間は主にブラックボックス監視を行っていました。最も重要な内部メトリクスについてはCloudWatchを使用し、サイト全体の障害検出にはPingdomのような外部サービスを組み合わせていました。また、従来のホストベースのソリューションはどれも満足できるものではありませんでした。コンテナやマイクロサービスの時代において、Icinga、Thruk、Zabbixのようなホストベースのツールは時代遅れで、その役割を果たす準備ができていないと感じました。ホワイトボックス監視を検討し始めたとき、幸運なことに、私たちの何人かがJuliusとBjörnがPrometheusを発表したGolang Meetupに参加しました。私たちはすぐにPrometheusサーバーをセットアップし、Goサービス(バックエンドにはほとんどGoのみを使用しています)を計測し始めました。その簡単さに驚きました。設計は、クラウドとサービス指向を第一原理としているように感じられ、決して邪魔になることはありませんでした。

どのように移行しましたか?

タイミングが良かったため、関連性の高い監視がない状態から直接Prometheusに移行できたため、移行はそれほど困難ではありませんでした。

Prometheusへの移行は、主にGoクライアントをアプリに組み込み、HTTPハンドラーをラップすることでした。また、node_exporterやクラウドプロバイダーAPI用のいくつかのエクスポーターを含む、いくつかのエクスポーターを作成してデプロイしました。私たちの経験では、監視とアラートは決して終わらないプロジェクトですが、ほとんどの作業は数週間以内に副業として完了しました。

Prometheusをデプロイして以来、何かを見逃した場合や、新しいサービスをゼロから設計するときは、メトリクスを調べる傾向があります。

PromQLとラベルの概念の優雅さを完全に理解するのに少し時間がかかりましたが、その努力は本当に報われました。

切り替え後、どのような改善が見られましたか?

Prometheusは、ホワイトボックス監視とラベルベースのカナリアデプロイメントから非常に簡単にメリットを得られるようにすることで、私たちを啓発しました。多くのGolangの側面(HTTPハンドラー、Goランタイム)の既製メトリクスは、非常に迅速に投資収益率を得るのに役立ちました。ゴルーチンメトリクスだけでも何度も危機を救いました。以前に実際に気に入っていた唯一の監視コンポーネントであるGrafanaは、Prometheusに自然に適合しているように感じられ、非常に役立つダッシュボードを作成することができました。Prometheusが車輪の再発明を試みるのではなく、既存の最良のソリューションに完璧に適合していることを高く評価しました。前身からのもう1つの大きな改善点は、Prometheusが実際に数学を正しく行うことに重点を置いていること(パーセンタイルなど)でした。他のシステムでは、提供されている操作が意味をなしているかどうかを確信できませんでした。特にパーセンタイルは、マイクロサービスのパフォーマンスについて推論するための自然で不可欠な方法であるため、それらがファーストクラスの扱いを受けることは素晴らしいと感じました。

Database Dashboard

統合されたサービスディスカバリーにより、スクレイプターゲットの管理が非常に簡単になります。Kubernetesの場合、すべてがそのまま機能します。まだKubernetesで実行されていない他のいくつかのシステムについては、Consulベースのアプローチを使用しています。Prometheusでアプリケーションを監視するために必要なのは、クライアントを追加し、/metricsを公開し、コンテナ/ポッドに1つの簡単なアノテーションを設定することだけです。この低い結合度により、開発と運用間の摩擦が大幅に軽減されます。シンプルで楽しいので、多くのサービスが最初からうまくオーケストレーションされています。

時系列と巧妙な関数の組み合わせにより、素晴らしいアラートの超能力が生まれます。サーバー上で実行される集計と、時系列、それらの組み合わせ、さらにはそれらの組み合わせに対する関数をファーストクラスの市民として扱うことで、アラートが非常に簡単になります。多くの場合、事後的にそうなることが多いです。

JustWatchとPrometheusの将来はどうなると思いますか?

私たちはPrometheusが派手なものになるのではなく、実際に動作し、デプロイと操作が比較的簡単でありながら価値を提供することに重点を置いていることを非常に高く評価していますが、特にAlertmanagerにはまだ多くの改善の余地があります。フロントエンドでのインタラクティブなアラートの構築と編集の簡略化のような簡単な改善だけでも、アラートの操作がさらに簡単になるでしょう。

リモートストレージを含むストレージレイヤーの継続的な改善を本当に楽しみにしています。また、Project PrismVulcanで採用されているアプローチの一部がコアPrometheusにバックポートされることを願っています。私たちにとって現在最も興味深いトピックは、GCEサービスディスカバリー、より簡単なスケーリング、および(古いイベントの場合はコールドストレージとクエリ時間が長くなるとしても)はるかに長い保持期間です。

また、Prometheusを非技術部門でも活用することを楽しみにしています。誰もが美しいダッシュボードやアラートを作成できるように、ほとんどのKPIをPrometheusでカバーしたいと考えています。現在、新しい社内ビジネスプロジェクトのために、素晴らしいアラートエンジンを悪用することも計画しています。ご期待ください!

Composeとのインタビュー

Prometheusユーザーへのインタビューシリーズを続け、ComposeはGraphiteおよびInfluxDBからPrometheusへの監視の旅について語ります。

あなた自身とComposeの業務内容について教えていただけますか?

Composeは、世界中の開発者に本番対応のデータベースクラスターをサービスとして提供しています。アプリ開発者は、私たちのところにアクセスし、数回のクリックで、複数ホスト、高可用性、自動バックアップ、安全なデータベースを数分で準備できます。これらのデータベースデプロイメントは、需要が増加すると自動的にスケールアップするため、開発者はデータベースの実行ではなく、優れたアプリの構築に時間を費やすことができます。

AWS、Google Cloud Platform、SoftLayerのそれぞれで、少なくとも2つのリージョンに数十のホストクラスターがあります。各クラスターは、サポートされている場合はアベイラビリティゾーンにまたがっており、独自のプライベートネットワークに約1000の高可用性データベースデプロイメントがあります。さらに多くのリージョンとプロバイダーが準備中です。

Prometheusを導入する前の監視経験について教えていただけますか?

Prometheus以前は、いくつかの異なるメトリクスシステムが試されました。最初に試したシステムはGraphiteで、最初はかなりうまく機能しましたが、保存する必要のあるさまざまなメトリクスの量が膨大であることと、Whisperファイルがディスクに保存およびアクセスされる方法が組み合わさって、システムがすぐに過負荷になりました。Graphiteは比較的簡単に水平にスケールできることは認識していましたが、コストのかかるクラスターになっていたでしょう。InfluxDBの方が有望に見えたので、初期バージョンのそれを試し始めましたが、しばらくの間はうまく機能するように見えました。さようならGraphite。

InfluxDBの初期バージョンには、時折データ破損の問題がありました。定期的にすべてのメトリクスをパージする必要がありました。通常、私たちにとって壊滅的な損失ではありませんでしたが、迷惑でした。実現しなかった機能の継続的な約束は、率直に言って私たちを疲れさせました。

Prometheusに注目しようと思った理由は何ですか?

他のオプションよりも優れた効率とよりシンプルな操作を組み合わせているように思われました。

プルベースのメトリクス収集は最初困惑しましたが、すぐにそのメリットに気づきました。最初は、各ホストに独自のメトリクスを持つ数百のコンテナがある環境では、スケールするのが非常に重いように思えましたが、Telegrafと組み合わせることで、各ホストが単一のPrometheusスクレイプターゲットを介してすべてのコンテナのメトリクス(および全体的なリソースメトリクス)をエクスポートするように手配できます。

どのように移行しましたか?

私たちはChefのショップなので、大きなEBSボリュームを備えた大規模なインスタンスを立ち上げ、Prometheus用のコミュニティChefクックブックをすぐに利用しました。

Prometheusがホストで起動したら、Chef APIを使用してすべてのホストをクエリし、Prometheusターゲット構成ファイルを書き出す小さなRubyスクリプトを作成しました。すべてのホストがChefに登録されるとすぐに検出およびスクレイプされるように、このファイルをfile_sd_configとともに使用します。Prometheusのオープンなエコシステムのおかげで、シンプルな構成でTelegrafをすぐに使用して、ホストレベルのメトリクスを直接エクスポートすることができました。

私たちは、単一のPrometheusがどこまでスケールするかをテストし、それが故障するのを待っていました。故障しませんでした!実際には、新しいインフラストラクチャ全体で約450台のホストに対して15秒ごとにスクレイプされたホストレベルのメトリクスの負荷を、非常に少ないリソース使用量で処理しました。

各ホストに多くのコンテナがあるため、それらのメモリ使用状況メトリクスもすべて追加したら、Prometheusのシャーディングを開始する必要があるだろうと予想していましたが、Prometheusはドラマもなく、リソースを飽和させることなく、継続的に動作し続けました。現在、450台のホスト上の約40,000のコンテナに対して、15秒ごとに400,000以上の個別のメトリクスを、1TBのストレージを備えた単一のm4.xlarge Prometheusインスタンスで監視しています。1TBのgp2 SSD EBSボリュームでのディスクIOは、おそらく最終的な制限要因になるでしょう。私たちの最初の推測では、当面は過剰にプロビジョニングされていますが、収集されるメトリクスと監視対象のホスト/コンテナの両方で急速に成長しています。

Prometheus Host Dashboard

この時点で、テスト用に投入したPrometheusサーバーは、以前に同じジョブを実行していたInfluxDBクラスターよりもはるかに信頼性が高かったため、単一障害点にならないようにいくつかの基本的な作業を行いました。同じターゲットをすべてスクレイプする別の同一ノードを追加し、keepalived + DNS更新による簡単なフェイルオーバースキームを追加しました。これは以前のシステムよりも高可用性になったため、顧客向けのグラフでPrometheusを使用するように切り替え、古いシステムを破棄しました。

Prometheus-powered memory metrics for PostgresSQL containers in our app

切り替え後、どのような改善が見られましたか?

以前の監視セットアップは信頼性が低く、管理が困難でした。Prometheusを使用すると、多くのメトリクスのグラフ化にうまく機能するシステムがあり、チームメンバーは以前使用していたメトリクスシステムに触れるのを警戒するのではなく、新しい方法でそれを使用することに突然興奮しています。

クラスターも、2つの同一ノードだけで構成されているため、よりシンプルです。成長するにつれて、より多くのPrometheusホストに作業をシャーディングする必要があり、それを行うためのいくつかの方法を検討しました。

ComposeとPrometheusの将来はどうなると思いますか?

現在、以前のシステムで既に収集していたメトリクス(顧客コンテナの基本的なメモリ使用量と、自社の運用に関するホストレベルのリソース使用量)のみを複製しました。次の論理的なステップは、DBコンテナ内からローカルTelegrafインスタンスにメトリクスをプッシュして、スクレイプするターゲット数を増やすことなく、データベースレベルの統計も記録できるようにすることです。

また、Prometheusに組み込んで可視性を向上させたい他のシステムもいくつかあります。私たちはアプリをMesos上で実行しており、以前よりも優れている基本的なDockerコンテナメトリクスを既に統合していますが、ロードバランサーからアプリメトリクスまで、システムの健全性をサポートするすべての要素を示す集中型ダッシュボードを作成できるように、Mesosクラスターのインフラストラクチャコンポーネントを中央のPrometheusに記録するようにしたいと考えています。

最終的には、Prometheusをシャーディングする必要があります。さまざまな理由で顧客のデプロイメントを多くの小さなクラスターに既に分割しているので、1つのグローバルなサーバーではなく、クラスターごとに小さなPrometheusサーバー(または冗長性のためのペア)に移行するのが1つの論理的なオプションでしょう。

通常、同じダッシュボードに異なるクラスターのホスト/コンテナを必要としないため、ほとんどのレポートニーズにとってこれは大きな問題ではありませんが、各クラスターのPrometheusからのダウンサンプリングおよび集計されたメトリクスを適度に少なくして、保持期間がはるかに長く、小規模なグローバルクラスターを維持する場合があります。Recording Rulesを使用します。

DigitalOceanとのインタビュー

Prometheusユーザーへのインタビューシリーズの次として、DigitalOceanはPrometheusの使用方法について語ります。Carlos Amedeeは、PromCon 2016でロールアウトの社会的側面についても語りました。

自己紹介と、DigitalOceanがどのような会社か教えていただけますか?

私の名前はイアン・ハンセンといい、プラットフォームメトリクスチームで働いています。DigitalOceanはシンプルなクラウドコンピューティングを提供しています。現在までに、13のリージョンで2,000万個のDroplet(SSDクラウドサーバー)を作成しました。また、最近新しいBlock Storage製品をリリースしました。

DigitalOcean logo

Prometheusを導入する前の監視経験について教えていただけますか?

Prometheus導入前は、GraphiteOpenTSDBを運用していました。Graphiteは小規模なアプリケーションに使用し、OpenTSDBはCollectd経由で全ての物理サーバーからメトリクスを収集するために使用していました。Nagiosがこれらのデータベースをポーリングしてアラートをトリガーしていました。Graphiteは今でも使用していますが、OpenTSDBはもう運用していません。

Prometheusに注目しようと思った理由は何ですか?

OpenTSDBには不満がありました。クラスターのオンライン維持を担当していましたが、メトリクスの急増を防ぐのが難しいと感じていました。チームが新しい(非常に饒舌な)サービスを立ち上げると、クラスターの総容量に影響し、私のSLAが損なわれることがありました。

OpenTSDBに入ってくる新しいメトリクスをブラックリスト/ホワイトリストに登録することはできましたが、饒舌なサービスを防ぐ良い方法がなく、組織的なプロセスに頼るしかありませんでした(これは変更/強制するのが難しかったです)。他のチームはクエリ言語と当時利用可能な可視化ツールに不満を持っていました。私がJulius Volzとプッシュ型とプル型のメトリクスシステムについて話していたとき、プルするものをどれくらいの頻度で決定できることで、自分のSLAを本当にコントロールできると分かり、Prometheusを試してみたいと思うようになりました。さらに、クエリ言語が本当に気に入りました。

どのように移行しましたか?

Collectdを使用してOpenTSDBにメトリクスを送信していましたが、既に稼働中のCollectd設定と並行してNode Exporterをインストールすることで、Prometheusを実験的に使い始めることができました。また、Dropletメトリクスを公開するカスタムエクスポーターも作成しました。すぐに、OpenTSDBサービスと同等の機能を持つようになり、Collectdを停止し、その後OpenTSDBクラスターを停止しました。

人々はPrometheusとそれに付属する可視化ツールを非常に気に入りました。突然、私の小規模なメトリクスチームは、人々を満足させるために急いで対応しきれないほどのバックログを抱えることになりました。そのため、人々のサービスのためにPrometheusを提供および維持するのではなく、他のチームが独自のPrometheusサーバーを実行し、当社で使用している共通のエクスポーターも実行することをできるだけ簡単にするツールを作成することにしました。

一部のチームはAlertmanagerの使用を開始しましたが、既存の監視ツールからPrometheusをプルするという概念はまだ残っています。

切り替え後、どのような改善が見られましたか?

ハイパーバイザーマシンの洞察が向上しました。CollectdとNode Exporterから得られるデータはほぼ同じですが、私たちのGo言語開発者チームが、各ハイパーバイザーで実行するサービスに固有のデータを公開する新しいカスタムエクスポーターを作成する方がはるかに簡単です。

より良いアプリケーションメトリクスを公開しています。Prometheusメトリクスを作成する方法を学び、後で正しく集計する方法を教えるのが容易になりました。Graphiteでは、ドットで区切られた名前が正しく構造化されていなかったため、後で特定の方法で集計できないメトリクスを簡単に作成できます。

アラートの作成は以前よりもはるかに迅速かつ簡単になり、使い慣れた言語で作成できます。これにより、チームは迅速に反復できるため、理解しているサービスに対してより良いアラートを作成できるようになりました。

DigitalOceanとPrometheusの将来はどうなると思いますか?

DigitalOceanのチームがメトリクスをできるだけ簡単に収集できるようにする方法を検討し続けています。現在、チームは自分たちが関心のあることのために独自のPrometheusサーバーを運用しており、そうでなければ迅速に得られなかったであろうオブザーバビリティを獲得できました。しかし、すべてのチームがPrometheusの実行方法を知っている必要はありません。Prometheusを可能な限り自動化して、チームが自分のサービスとデータベースに必要なクエリとアラートに集中できるようにするために何ができるかを検討しています。

また、Vulcanを作成して、長期的なデータストレージを確保しつつ、ツールを構築し、使い方をトレーニングしてきたPrometheus Query Languageを保持できるようにしました。

ShuttleCloudとのインタビュー

Prometheusユーザーへのインタビューシリーズを継続して、ShuttleCloudがどのようにPrometheusの使用を開始したかについてお話しします。ShuttleCloudのIgnacioは、PromCon 2016でPrometheus があなたの小さなスタートアップに良い理由についても説明しました。

ShuttleCloudは何をしている会社ですか?

ShuttleCloudは、世界で最もスケーラブルなメールと連絡先データのインポートシステムです。GoogleやComcastを含む主要なメールおよびアドレス帳プロバイダーが、データインポートを通じて切り替え体験を自動化することでユーザーの成長とエンゲージメントを向上させるのを支援しています。

当社のAPIをサービスに統合することで、お客様はユーザーが参加プロバイダー間でメールや連絡先を簡単に移行できるようにし、新しいプロバイダーに切り替える際にユーザーが直面する摩擦を軽減します。サポートされている24時間365日のメールプロバイダーには、米国の主要なインターネットサービスプロバイダー(Comcast、Time Warner Cable、AT&T、Verizonなど)が含まれます。

エンドユーザーにメール移行の簡単なパスを提供することで(インポートツールのUIを完全に制御しながら)、お客様はユーザーのアクティベーションとオンボーディングを劇的に改善します。

ShuttleCloudのGmailとの統合 ShuttleCloudとGoogleのGmailプラットフォームの統合 Gmailは、当社のAPIを使用して300万人のユーザーのデータをインポートしました。

ShuttleCloudのテクノロジーは、APIリクエストの機密性と整合性を確保するために、最も安全な標準(SSL、oAuth)に従うことに加えて、インポート処理に必要なすべてのデータを暗号化します。当社のテクノロジーにより、プラットフォームの高可用性を保証し、最大99.5%の稼働率を保証します。

ShuttleCloud by Numbers

Prometheusを導入する前の監視経験について教えていただけますか?

当初、インフラストラクチャの適切な監視システムは、私たちの主な優先事項の1つではありませんでした。現在ほど多くのプロジェクトとインスタンスがなかったため、何か問題が発生した場合にアラートを出し、制御下に置くために、他の単純なシステムを使用しました。

  • マシンのほとんどの運用メトリクスを監視するための自動スクリプトのセットがありました。これらはcronベースで、中央のマシンからAnsibleを使用して実行されました。アラートは、開発チーム全体に直接送信されるメールでした。
  • 外部のブラックボックス監視についてはPingdomを信頼しており、すべてのフロントエンドが稼働しているかどうかをチェックしていました。外部サービスが到達不能になった場合に備えて、簡単なインターフェイスとアラートシステムを提供してくれました。

幸運なことに、大口顧客が到着し、SLAがより厳しくなり始めました。したがって、パフォーマンスを測定し、すべてのSLAを遵守していることを保証するために、何か他のものが必要になりました。必要な機能の1つは、パフォーマンスとビジネスメトリクス(つまり、正しく完了した移行数)に関する正確な統計を持つことだったので、監視よりもレポート作成に重点が置かれていました。

次のシステムを開発しました。

Initial Shuttlecloud System

  • 必要なすべてのデータのソースは、CouchDBのステータスデータベースです。そこでは、各ドキュメントが操作の1つのステータスを表します。この情報はStatus Importerによって処理され、MySQLデータベースに関係性の高い方法で格納されます。

  • コンポーネントは、そのデータベースからデータを収集し、集計され、複数のビューに後処理された情報です。

    • ビューの1つは、レポート作成に必要なメールレポートです。これはメールで送信されます。
    • もう1つのビューは、データをダッシュボードにプッシュし、そこで簡単に制御できます。使用したダッシュボードサービスは外部のものでした。ダッシュボードのセットアップが簡単で見た目が美しいだけでなく、しきい値に達した場合に自動アラートを提供してくれるため、Ducksboardを信頼しました。

上記のすべてが整った状態で、プロジェクトの数が増え始めたため、適切なメトリクス、監視、アラートシステムが必要になることにすぐに気づきました。

当時使用していたシステムの欠点は次のとおりです。

  • 集中監視システムがないこと。各メトリクスタイプに異なるシステムがありました。
    • システムメトリクス→ Ansibleで実行されるスクリプト。
    • ビジネスメトリクス→ Ducksboardとメールレポート。
    • ブラックボックスメトリクス→ Pingdom。
  • 標準のアラートシステムがないこと。各メトリクスタイプに異なるアラート(メール、プッシュ通知など)がありました。
  • 一部のビジネスメトリクスにはアラートがありませんでした。これらは手動で確認していました。

Prometheusに注目しようと思った理由は何ですか?

いくつかの監視およびアラートシステムを分析しました。実際に試してみて、ソリューションが成功するか失敗するかを確認することに熱心でした。テストに採用することにしたシステムはPrometheusでした。その理由は次のとおりです。

  • まず、固定メトリクスシステムを定義しなくても使い始めることができます。メトリクスは後で追加または変更できます。これは、監視したいメトリクスをまだすべて把握していない場合に、貴重な柔軟性を提供します。
  • Prometheusについて何か知っていれば、異なるタイムシリーズが考慮されているという事実から私たちを抽象化するラベルをメトリクスが持つことができることがわかるでしょう。これは、そのクエリ言語とともに、さらに柔軟性と強力なツールを提供しました。たとえば、異なる環境またはプロジェクトに対して同じメトリクスを定義し、適切なラベルを使用して特定のタイムシリーズを取得したり、特定のメトリクスを集計したりできます。
    • http_requests_total{job="my_super_app_1",environment="staging"} - アプリ「my_super_app_1」のステージング環境に対応するタイムシリーズ。
    • http_requests_total{job="my_super_app_1"} - アプリ「my_super_app_1」のすべての環境のタイムシリーズ。
    • http_requests_total{environment="staging"} - すべてのジョブのすべてのステージング環境のタイムシリーズ。
  • Prometheusは、サービスディスカバリー用のDNSサービスをサポートしています。私たちはたまたま内部DNSサービスを既に持っていました。
  • 外部サービスをインストールする必要はありません(たとえば、RedisのようなデータストレージサービスやRabbitMQのようなメッセージバスが必要なSensuとは異なります)。これは致命的な問題ではないかもしれませんが、テストの実行、デプロイ、および保守が確実に簡単になります。
  • Prometheusは、実行可能なGoファイルをダウンロードするだけでインストールが非常に簡単です。Dockerコンテナも正常に動作し、起動も簡単です。

Prometheusはどのように使用していますか?

当初は、node_exporterがすぐに利用できる状態で提供していた一部のメトリクスのみを使用していました。これには以下が含まれます。

  • ハードドライブの使用状況。
  • メモリの使用状況。
  • インスタンスが起動しているか停止しているか。

内部DNSサービスは、サービスディスカバリーに使用するために統合されているため、新しいインスタンスはすべて自動的に監視されます。

デフォルトでnode_exporterによって提供されなかったメトリクスの一部は、node_exporter textfile collector機能を使用してエクスポートしました。Prometheus Alertmanagerで宣言した最初のアラートは、主に上記の運用メトリクスに関連するものでした。

その後、システムのステータスをほぼリアルタイムで把握できるオペレーションエクスポーターを開発しました。これは、ビジネスメトリクス、すなわちすべてのオペレーションのステータス、受信した移行の数、完了した移行の数、およびエラーの数を公開しました。これらをPrometheus側で集計し、さまざまなレートを計算させることができました。

以下のメトリクスをエクスポートして監視することにしました。

  • operation_requests_total
  • operation_statuses_total
  • operation_errors_total

Shuttlecloud Prometheus System

当社のサービスのほとんどは、Google Cloud Platformの2つのアベイラビリティゾーンで複製されています。これにはモニタリングシステムも含まれます。Prometheusはすべてのアベイラビリティゾーンからのデータを集計して1つのメトリクス(つまり、すべての最大値)を作成できるため、2つ以上の異なるゾーンに複数のオペレーションエクスポーターを配置することは簡単です。現在、PrometheusまたはAlertmanagerはHA構成ではありません(メタモニタリングインスタンスのみ)が、現在取り組んでいます。

外部ブラックボックスモニタリングには、PrometheusのBlackbox Exporterを使用しています。外部フロントエンドが稼働しているかどうかを確認することに加えて、SSL証明書の有効期限のメトリクスを取得するのに特に役立ちます。証明書チェーン全体もチェックします。Robust Perceptionがブログ記事で完璧に説明してくれたことに感謝します。

Grafanaでいくつかのグラフを設定し、いくつかのダッシュボードで視覚的なモニタリングを行っています。Prometheusとの統合は非常に簡単でした。グラフを定義するために使用されるクエリ言語はPrometheusと同じであるため、作成が大幅に簡略化されました。

また、PrometheusをPagerdutyと統合し、重大なアラートに対応するオンコール担当者のスケジュールを作成しました。重大ではないと判断されたアラートについては、メールのみを送信しました。

Prometheusはあなたにとってどのように役立ちますか?

以前のソリューションと比較することはできません。以前のソリューションは存在しなかったためです。しかし、Prometheusのどの機能が私たちにとって重要であるかについてお話できます。

  • メンテナンス要件が非常に少ないです。
  • 効率的です。1台のマシンでクラスター全体のモニタリングを処理できます。
  • コミュニティは友好的です。開発者もユーザーもです。さらに、Brianのブログは非常に役立つリソースです。
  • サードパーティの要件はありません。サーバーとエクスポーターだけです。(RabbitMQやRedisをメンテナンスする必要はありません。)
  • Goアプリケーションのデプロイは簡単です。

ShuttleCloudとPrometheusの将来についてどう思いますか?

Prometheusには非常に満足していますが、新しいエクスポーター(たとえば、CeleryやSpark)はいつでも歓迎です。

新しいアラームを追加するたびに直面する問題の1つは、アラームが期待どおりに機能することをどのようにテストするかです。アラームを発生させるために偽のメトリクスを注入してテストする方法があると便利です。

PromCon 2016 - 終了!

何が起こったか

先週、世界中から80人のPrometheusユーザーと開発者が、ベルリンで2日間開催されたPrometheusモニタリングシステムに関する初の会議、PromCon 2016に集まりました。この会議の目標は、Prometheusを使用して得られた知識、ベストプラクティス、および経験を交換することでした。また、コミュニティを成長させ、サービスモニタリングに関する専門的なつながりを構築するのを支援したいと考えました。初日の朝の印象をいくつかご紹介します。

プルはスケールしない - それともする?

特に根強い迷信について話しましょう。モニタリングシステムについて議論があり、Prometheusのプルベースのメトリクス収集アプローチが登場するたびに、「プルベースのアプローチは根本的にスケールしない」と必ず誰かが口を挟みます。与えられた理由はしばしば曖昧であるか、Prometheusとは根本的に異なるシステムにのみ適用されます。実際、大規模なプルベースのモニタリングに取り組んできた経験からすると、この主張は私たち自身の運用経験に反します。

Prometheusがプッシュではなくプルを選択する理由に関するFAQエントリはすでにありますが、スケーリングの側面には特に焦点を当てていません。この主張に関する通常の誤解を詳しく見て、それらがPrometheusにどのように適用されるか、または適用されないかを分析してみましょう。

PrometheusはNagiosではない

積極的にプルするモニタリングシステムを考えるとき、人々はしばしばNagiosを考えます。Nagiosは、特定のホストまたはサービスの健全性を判断するためにNagiosホストで任意のアクションを実行できるアクティブチェック用のサブプロセスを生成するために、うまくスケールしないという評判があります。この種のチェックアーキテクチャは、中央のNagiosホストがすぐに過負荷になるため、確かにうまくスケールしません。その結果、人々は通常、数分おきにチェックが実行されるように構成するか、より深刻な問題に直面します。

ただし、Prometheusはまったく異なるアプローチを採用しています。チェックスクリプトを実行する代わりに、ネットワーク経由でインストゥルメント化されたターゲットのセットからのみ時系列データを収集します。各ターゲットについて、Prometheusサーバーは、HTTP経由でそのターゲットのすべてのメトリクスの現在の状態を(goroutineを使用して高度に並列化された方法で)フェッチするだけであり、プルに関連するその他の実行オーバーヘッドはありません。これが次の点につながります。

接続をどちらが開始するかは重要ではない

スケーリングの目的では、メトリクスが転送されるTCP接続をどちらが開始するかは重要ではありません。どちらの方法でも、接続を確立するための労力は、メトリクスペイロードやその他の必要な作業と比較してわずかです。

しかし、プッシュベースのアプローチではUDPを使用し、接続確立を完全に回避できるのではないか?確かにそうですが、PrometheusのTCP/HTTPオーバーヘッドは、Prometheusサーバーがデータをインジェストするために行う必要がある他の作業(特に時系列データをディスクに永続化する)と比較すると、依然として無視できるほどです。この背後にあるいくつかの数値を挙げてみましょう。1つの大規模なPrometheusサーバーは、1秒あたり800,000個の着信サンプル(SoundCloudでの実際の運用メトリクスデータで測定)の記録で、数百万の時系列を簡単に保存できます。10秒のスクレイプ間隔とホストあたり700の時系列を考えると、これにより、単一のPrometheusサーバーから10,000台を超えるマシンを監視できます。ここでのスケーリングボトルネックは、メトリクスのプルとは関係がなく、通常はPrometheusサーバーがデータをメモリに取り込み、その後ディスク/SSD上でデータを永続化および期限切れにできる速度に関係しています。

また、最近のネットワークはかなり信頼性が高いですが、TCPベースのプルアプローチを使用すると、メトリクスデータが確実に到着すること、または少なくともネットワークが破損したためにメトリクスの転送が失敗した場合にモニタリングシステムがすぐに認識することが保証されます。

Prometheusはイベントベースのシステムではない

一部のモニタリングシステムはイベントベースです。つまり、各個別のイベント(HTTPリクエスト、例外など)を、発生するとすぐに中央のモニタリングシステムに報告します。この中央システムは、イベントをメトリクスに集計するか(StatsDがその代表例)、後で処理するためにイベントを個別に保存します(ELKスタックがその例です)。このようなシステムでは、プルは確かに問題になります。インストゥルメント化されたサービスはプル間でイベントをバッファリングする必要があり、プッシュベースのアプローチと同じ「ライブ性」をシミュレートし、イベントバッファをオーバーフローさせないためには、プルが信じられないほど頻繁に発生する必要があります。

ただし、Prometheusはやはりイベントベースのモニタリングシステムではありません。生のイベントをPrometheusに送信することも、保存することもできません。Prometheusは、集計された時系列データを収集することを目的としています。つまり、特定のメトリクスの現在の状態を定期的に収集することにのみ関心があり、それらのメトリクスの生成につながった基盤となるイベントには関心がありません。たとえば、インストゥルメント化されたサービスは、処理されるたびに各HTTPリクエストに関するメッセージをPrometheusに送信するのではなく、メモリ内でそれらのリクエストを単にカウントアップします。これは、モニタリングトラフィックを引き起こすことなく、1秒間に数十万回発生する可能性があります。Prometheusは、15秒または30秒ごと(または構成した設定)にサービスインスタンスに現在のカウンタ値について問い合わせ、その値をスクレイプタイムスタンプとともにサンプルとして保存します。ゲージ、ヒストグラム、サマリーなどの他のメトリクスタイプも同様に処理されます。結果として得られるモニタリングトラフィックは低く、プルベースのアプローチもこの場合は問題を引き起こしません。

しかし、これでモニタリングはサービスインスタンスについて知る必要があります!

プルベースのアプローチでは、モニタリングシステムはどのサービスインスタンスが存在し、それらに接続する方法を知る必要があります。一部の人々は、モニタリングシステム側でこれに必要な追加構成について懸念しており、これを運用上のスケーラビリティの問題と見なしています。

どのような場合でも、本格的なモニタリングセットアップではこの構成作業を回避することはできないと私たちは主張します。モニタリングシステムが世界がどのように見えるべきか、どの監視対象サービスインスタンスがあるべきかを認識していない場合、インスタンスがまったくレポートされない場合、停止のためにダウンしている場合、または本当に存在すべきではない場合をどうやって判断できるでしょうか?これは、十分な数のワーカーが何らかの結果を報告すれば十分な一時的なワーカーのみを実行する場合など、個々のインスタンスの健全性をまったく気にしない場合にのみ許容されます。ほとんどの環境は排他的にはそのようではありません。

もし監視システムが世界の望ましい状態を把握する必要があるなら、プッシュベースのアプローチは実際には全体でより多くの設定が必要になります。監視システムは、どのサービスインスタンスが存在すべきかを知る必要があるだけでなく、サービスインスタンスも監視システムに到達する方法を知る必要があります。プルアプローチは、設定が少なく済むだけでなく、監視設定の柔軟性も高めます。プルを使用すると、本番環境の監視のコピーをラップトップで実行して実験できます。また、他のツールでメトリクスをフェッチしたり、メトリクスエンドポイントを手動で検査したりすることもできます。高可用性を実現するには、まったく同じ設定のPrometheusサーバーを2台並列で実行できます。そして最後に、監視が到達可能なエンドポイントを移動する必要がある場合、プルアプローチではすべてのメトリクスソースを再設定する必要はありません。

実用的な面では、Prometheusは、クラウドプロバイダーやコンテナスケジューリングシステム向けの幅広いサービス検出メカニズムを組み込みでサポートしており、世界の望ましい状態を簡単に設定できます。Consul、Marathon、Kubernetes、EC2、DNSベースSD、Azure、Zookeeper Serversetsなどがあります。また、必要に応じて独自のカスタムメカニズムをプラグインすることもできます。マイクロサービスの世界や多層アーキテクチャでは、監視システムが監視対象を検出するために使用する方法と、サービスインスタンスがバックエンドを検出するために使用する方法が同じであることも根本的な利点です。これにより、本番トラフィックを処理しているのと同じターゲットを監視していることが保証され、維持する検出メカニズムは1つだけになります。

誤って監視をDDoS攻撃してしまう

プルかプッシュかに関わらず、タイムシリーズデータベースは、処理できる以上のサンプルを送信すると必ずダウンします。ただし、私たちの経験では、プッシュベースのアプローチの方が、誤って監視をダウンさせてしまう可能性がわずかに高いです。どのインスタンスからどのメトリクスを取り込むかの制御が(監視システムで)集中化されていない場合、実験的なジョブや不正なジョブが突然大量のゴミデータを本番環境の監視にプッシュしてダウンさせてしまう危険性があります。プルベースのアプローチ(メトリクスをプルする場所のみを制御し、メトリクスペイロードのサイズと性質は制御しない)でもこれが発生する可能性は十分にありますが、リスクは低くなります。さらに重要なのは、そのようなインシデントを中央の点で軽減できることです。

実世界の証明

Prometheusが現実世界の大規模なセットアップ(たとえば、DigitalOceanで数百万台のマシンを監視するために使用されているなど)を監視するためにすでに使用されているという事実に加えて、最大規模の環境でプルベースの監視が正常に使用されている他の顕著な例があります。PrometheusはGoogleのBorgmonに触発されました。Borgmonは、Google内でプルベースのアプローチを使用して、すべての重要な本番サービスを監視するために使用されていました(そして現在も一部使用されています)。GoogleでBorgmonで発生したスケーリングの問題も、プルアプローチが原因ではありませんでした。プルベースのアプローチが数十のデータセンターと数百万台のマシンがあるグローバル環境にまで拡張できる場合、プルが拡張できないとは到底言えません。

しかし、プルには他の問題もある!

プルベースのアプローチでは監視が難しいセットアップも確かにあります。顕著な例は、ファイアウォールや複雑なネットワーク設定のために直接到達できないエンドポイントが世界中に散在し、各ネットワークセグメントに直接Prometheusサーバーを実行することが現実的ではない場合です。これはPrometheusが構築された環境とは少し異なりますが、回避策はしばしば可能です(Pushgatewayを使用するか、設定を再構築する)。いずれにせよ、プルベースの監視に関するこれらの残りの懸念事項は、通常、スケーリングに関連するものではなく、TCP接続を開くことに関するネットワーク運用上の困難によるものです。

すべて良いということか?

この記事では、プルベースの監視アプローチに関する最も一般的なスケーラビリティの懸念事項に対処しています。Prometheusやその他のプルベースのシステムが非常に大規模な環境で正常に使用されており、現実にはプル面がボトルネックになっていないことを考えると、「プルは拡張できない」という議論が現実的な懸念事項ではないことは明らかです。今後の議論がこの論点そらしよりも重要な側面に焦点を当てることを願っています。

Prometheusが1.0に到達

1月に、Prometheusの公開された最初の1年に関するブログ記事を公開しました。この1年間は私たちにとって素晴らしい旅であり、皆さんにとって革新的で便利な監視ソリューションであったことを願っています。それ以来、PrometheusはCloud Native Computing Foundationにも参加しており、Kubernetesに次ぐ2番目のチャータープロジェクトとして、良い仲間に入っています。

私たちの最近の取り組みは、Prometheusのバージョン1.0によって示される、安定したAPIとユーザーインターフェースを提供することに重点を置いてきました。私たちはこの目標を達成したことを発表できることを嬉しく思っており、Prometheus 1.0は本日リリースされました

1.0はあなたにとって何を意味するのか?

Prometheusをしばらく使用している場合、過去1年間で破壊的な変更の頻度と影響が大幅に減少していることに気付いたかもしれません。同様に、1.0に到達するということは、後続の1.xリリースはAPIの安定性を維持することを意味します。アップグレードによってPrometheus API上に構築されたプログラムが壊れることはなく、更新によってストレージの再初期化やデプロイメントの変更が必要になることもありません。カスタムダッシュボードとアラートも1.xバージョンの更新を通じてそのまま残ります。Prometheus 1.0は確実な監視ソリューションであると確信しています。Prometheusサーバーが安定したAPI状態に到達したので、他のモジュールもそれに追随して、独自の安定したバージョン1.0リリースを時間とともに迎えます。

小さな文字

では、APIの安定性とは何を意味するのでしょうか?Prometheusには広い表面積があり、一部のパーツは他のパーツよりも確かに成熟しています。安定不安定の2つのシンプルなカテゴリがあります。

v1.0以降、1.xシリーズ全体で安定

  • クエリ言語とデータモデル
  • アラートと記録ルール
  • 取り込みエキスポジション形式
  • 構成フラグ名
  • HTTP API(ダッシュボードとUIで使用)
  • 構成ファイル形式(不安定なサービス検出統合を除く。下記を参照)
  • 当面の間、Alertmanager 0.1+とのアラート統合
  • コンソールテンプレートの構文とセマンティクス

不安定で、1.x内で変更される可能性あり

  • リモートストレージ統合(InfluxDB、OpenTSDB、Graphite)はまだ実験的であり、任意のストレージシステムにサンプルを格納できる、より洗練された汎用APIに有利に、ある時点で削除されます。
  • いくつかのサービス検出統合は新しく、急速に進化するシステムに対応する必要があります。したがって、Kubernetes、Marathon、Azure、およびEC2との統合はベータステータスのままであり、変更される可能性があります。ただし、変更は明確に発表されます。
  • 必要に応じて、正確なフラグの意味が変更される場合があります。ただし、変更によって、サーバーが以前のフラグ構成で起動しなくなることはありません。
  • サーバーの一部であるパッケージのGo API。
  • Web UIによって生成されたHTML。
  • Prometheus自体の/metricsエンドポイントのメトリクス。
  • 正確なオンディスク形式。ただし、潜在的な変更は前方互換性があり、Prometheusによって透過的に処理されます。

では、Prometheusはこれで完了なのか?

絶対に違います。私たちには、実装すべき素晴らしい機能が満載の、長いロードマップがあります。Prometheusは何年も1.xにとどまることはありません。インフラストラクチャの分野は急速に進化しており、私たちはPrometheusがそれとともに進化することを十分に意図しています。これは、過去に行ったことを疑問視することを厭わず、関連性を失ったものを置き去りにすることをオープンに受け入れることを意味します。永続的な長期ストレージ、Alertmanagerの新しいイテレーション、内部ストレージの改善、そしてまだ知らない多くのもののような将来の計画を促進するために、Prometheusの新しいメジャーバージョンが登場するでしょう。

結びの言葉

新しいバージョンのフィールドテスト、バグレポートの提出、コードの貢献、他のコミュニティメンバーの支援、そして無数の実りある議論に参加することによってPrometheusを形作った素晴らしいコミュニティに感謝したいと思います。最終的には、Prometheusを成功させるのは皆さんです。

ありがとうございました。そして、素晴らしい仕事を続けてください!

PrometheusがCloud Native Computing Foundationに参加

Prometheusの創設以来、私たちは単一の企業に依存しない、プロジェクトのための持続可能なガバナンスモデルを探してきました。最近、Google、CoreOS、Docker、Weaveworks、Mesosphere、およびその他の主要なインフラストラクチャ企業が支援する、新しく設立されたCloud Native Computing Foundation(CNCF)と協議を重ねてきました。

本日、CNCFの技術監督委員会が全会一致で投票し、PrometheusをKubernetesに続く2番目のホストプロジェクトとして受け入れることを発表できることを嬉しく思います!これらの計画の詳細については、CNCFによる公式プレスリリースをご覧ください。

CNCFに参加することにより、明確で持続可能なプロジェクトガバナンスモデルを確立し、独立した財団がメンバーに提供するリソース、インフラストラクチャ、およびアドバイスの恩恵を受けたいと考えています。

私たちは、CNCFとPrometheusがどちらもクラウドの現代的なビジョンをもたらすことに重点を置いているため、テーマ的に理想的な一致であると考えています。

今後数か月間、プロジェクトのガバナンス構造を最終決定するためにCNCFと協力していきます。発表できる詳細があれば、ご報告します。

varbitチャンクを使用する(しない)場合

Prometheusサーバーの組み込みタイムシリーズデータベース(TSDB)は、各タイムシリーズの生のサンプルデータを、一定の1024バイトサイズのチャンクで整理します。チャンクには、生のサンプルデータに加えて、各チャンクに異なるエンコードを選択できるメタデータが含まれています。最も基本的な区別は、エンコードバージョンです。コマンドラインフラグ-storage.local.chunk-encoding-versionを介して、新しく作成されたチャンクのバージョンを選択します。現在までに、サポートされているバージョンは2つだけでした。元のデルタエンコーディングの場合は0、改善されたダブルデルタエンコーディングの場合は1です。0.18.0リリースでは、ダブルデルタエンコーディングの別のバリエーションであるバージョン2を追加しました。チャンク内のサンプルごとに可変ビット幅が含まれているため、これをvarbitエンコーディングと呼びます。バージョン1はほぼすべての面でバージョン0よりも優れていますが、バージョン1と2の間には実際のトレードオフがあります。このブログ投稿は、その決定を下すのに役立ちます。バージョン1はデフォルトのエンコーディングのままなので、この記事を読んだ後でバージョン2を試したい場合は、コマンドラインフラグを使用して明示的に選択する必要があります。切り替えには害はありませんが、既存のチャンクは作成されたエンコードバージョンを変更しないことに注意してください。ただし、これらのチャンクは、構成された保持時間に従って徐々に段階的に廃止され、コマンドラインフラグで指定されたエンコーディングを持つチャンクに置き換えられます。

ShowMaxとのインタビュー

これは、Prometheusのユーザーへの一連のインタビューの2回目であり、Prometheusの評価と使用に関する経験を共有することができます。

ご自身のことと、ShowMaxがどのようなサービスを提供しているかについて教えていただけますか?

私はAntonin Kralと申します。ShowMaxの調査とアーキテクチャを統括しています。それ以前は、過去12年間、アーキテクチャとCTOの役割を担っていました。

ShowMaxは、2015年に南アフリカでサービスを開始したサブスクリプション型のビデオオンデマンドサービスです。20,000話以上のテレビ番組や映画を収録した豊富なコンテンツカタログがあります。現在、世界65か国でサービスを提供しています。競合他社がアメリカやヨーロッパで激戦を繰り広げている一方で、ShowMaxはより困難な問題に立ち向かっています。それは、サブサハラアフリカのほとんど接続されていない村でどのようにして一気見を実現するかということです。すでに世界中で動画の35%がストリーミングされていますが、その変革がまだ及んでいない場所が数多くあります。

ShowMax logo

私たちは、主にCoreOSを中心に構築されたプライベートクラスターで実行される約50のサービスを管理しています。これらのサービスは主に、クライアント(Android、iOS、AppleTV、JavaScript、Samsung TV、LG TVなど)からのAPIリクエストを処理する一方で、一部は内部で使用されています。最大の内部パイプラインの1つはビデオエンコードであり、大量のインジェストバッチを処理する際には400台以上の物理サーバーを使用することがあります。

バックエンドサービスの大部分は、Ruby、Go、またはPythonで記述されています。Rubyでアプリを作成する際はEventMachine(MRIではGoliath、JRubyではPuma)を使用します。Goは通常、大量のスループットを必要とし、ビジネスロジックがあまりないアプリで使用されます。Pythonで作成されたサービスにはFalconを使用しており、非常に満足しています。データはPostgreSQLとElasticSearchクラスターに格納されます。リクエストのルーティングのために、Varnishを構成する際にはetcdとカスタムツールを使用します。

Life360とのインタビュー

これは、Prometheusのユーザーへのインタビューシリーズの第1弾です。Prometheusの評価と使用に関する経験を共有していただきます。最初のインタビューは、Life360のDanielさんです。

ご自身のことと、Life360がどのようなサービスを提供しているかについて教えていただけますか?

私はDaniel Ben Yosef、別名dbyです。Life360のインフラエンジニアを務めており、それ以前は過去9年間、システムエンジニアの役割を担っていました。

Life360は、家族のつながりを維持するためのテクノロジーを開発しています。私たちは家族向けのファミリーネットワークアプリです。私たちは非常に忙しく、ピーク時には7,000万人の登録家族に対して1分間に70万件のリクエストを処理しています。

本番環境で約20のサービスを管理しており、主にモバイルクライアント(Android、iOS、Windows Phone)からの位置情報リクエストを処理しています。ピーク時には150以上のインスタンスにまたがっています。冗長性と高可用性が私たちの目標であり、家族が私たちを頼りにしているため、可能な限り100%の稼働時間を維持するように努めています。

ユーザーデータは、MySQLマルチマスタークラスターと、常時約4TBのデータを保持する12ノードのCassandraリングの両方に保持しています。サービスはGo、Python、PHPで記述されており、Javaをスタックに導入する計画もあります。サービスディスカバリーにはConsulを使用しており、もちろんPrometheusのセットアップも統合されています。

カスタムAlertmanagerテンプレート

Alertmanagerは、Prometheusサーバーから送信されたアラートを処理し、ラベルに基づいてさまざまな受信者に通知を送信します。

受信者は、PagerDuty、Slack、メールなどのさまざまな統合の1つにすることができます。または、汎用的なWebhookインターフェース(例:JIRA)を介したカスタム統合を使用できます。

テンプレート

受信者に送信されるメッセージは、テンプレートを介して構成されます。Alertmanagerにはデフォルトのテンプレートが付属していますが、カスタムテンプレートを定義することもできます。

このブログ記事では、Slack通知の簡単なカスタマイズについて説明します。

すべての警告をSlackに送信する、この単純なAlertmanager構成を使用します。

global:
  slack_api_url: '<slack_webhook_url>'

route:
  receiver: 'slack-notifications'
  # All alerts in a notification have the same value for these labels.
  group_by: [alertname, datacenter, app]

receivers:
- name: 'slack-notifications'
  slack_configs:
  - channel: '#alerts'

デフォルトでは、Alertmanagerから送信されるSlackメッセージは次のようになります。

これを見ると、1つのアラートが発生しており、その後にアラートグループ化(alertname、datacenter、app)のラベル値と、アラートに共通の(critical)ラベル値が続きます。

Prometheusオープン開発1年

始まり

ちょうど1年前の今日、私たちはPrometheusを広く世界に正式に発表しました。これは、過去を振り返り、それ以来プロジェクトで起こった素晴らしい出来事を共有する絶好の機会です。しかし、まずは最初から始めましょう。

私たちはすでに2012年にGitHubでPrometheusをオープンソースプロジェクトとして開始していましたが、最初は騒ぎ立てませんでした。プロジェクトが成熟する時間を設け、摩擦なく実験できるようにしたかったのです。Prometheusは2013年にSoundCloudでの本番環境のモニタリングに徐々に導入され、その後、社内での使用が増加しました。また、2014年にはDockerやBoxeverの友人たちによって初期段階で採用されました。長年にわたり、Prometheusはますます成熟し、すでに人々のモニタリング問題を解決していましたが、まだ広く一般には知られていませんでした。

etcdを使用したカスタムサービスディスカバリー

以前の投稿で、Prometheusでのサービスディスカバリーの新しい方法を多数紹介しました。その後、多くのことが起こりました。内部実装を改善し、コミュニティから素晴らしい貢献を受け、KubernetesとMarathonでのサービスディスカバリーのサポートが追加されました。これらはバージョン0.16のリリースで利用可能になります。

また、カスタムサービスディスカバリーのトピックにも触れました。

すべての種類のサービスディスカバリーが、Prometheusに直接含めるのに十分な汎用性を持っているわけではありません。組織が独自のシステムを導入しており、それをPrometheusで機能させる必要がある可能性もあります。これは、新しいモニタリングターゲットを自動的に検出するという利点を享受できないという意味ではありません。

この記事では、高度に一貫性のある分散キーバリューストアであるetcdに基づいたカスタムサービスディスカバリーアプローチを、Prometheusに接続する小さなユーティリティプログラムを実装します。

DreamHackのモニタリング - 世界最大のデジタルフェスティバル

編集者注:この記事は、Prometheusユーザーによって書かれたゲスト投稿です。

10,000人以上の要求の厳しいゲーマーのためにネットワークを運用している場合は、ネットワーク内で何が起こっているかを本当に知る必要があります。ああ、すべてをわずか5日間でゼロから構築する必要があります。

DreamHackについて聞いたことがない場合は、ここで説明します。20,000人を集めて、そのうちの大多数に自分のコンピューターを持参させます。プロのゲーム(eスポーツ)、プログラミングコンテスト、ライブ音楽コンサートを組み合わせます。その結果、デジタルのみに特化した世界最大のフェスティバルが誕生します。

このようなイベントを可能にするには、多くのインフラストラクチャが必要です。このサイズの通常のインフラストラクチャを構築するには数か月かかりますが、DreamHackのクルーはすべてをわずか5日間でゼロから構築します。これにはもちろん、ネットワークスイッチの構成だけでなく、電力配線の構築、食品や飲料の店舗の設置、さらには実際のテーブルの構築なども含まれます。

ネットワークに関連するすべてのものを構築および運用するチームは、公式にはネットワークチームと呼ばれていますが、通常はtechまたはdhtechと呼ばれています。この記事では、dhtechの活動と、DreamHack Summer 2015でモニタリングをさらに一歩進めるためにPrometheusをどのように使用したかに焦点を当てます。

実践的な異常検知

John Allspawは、彼のモニタリング/メトリクス/アラート企業への公開書簡の中で、「異常を適切なタイミングで完全に検出することは不可能である」と主張しています。

私は、時系列データに基づいて問題を自動的に検出および診断するシステムを構築しようとする、才能のあるエンジニアによる試みをいくつか見てきました。デモンストレーションを機能させることは確かに可能ですが、データは常にノイズが多すぎて、最も単純な現実世界のシステム以外ではこのアプローチを機能させることはできませんでした。

しかし、すべての希望が失われたわけではありません。カスタムルールを使用して検出および処理できる一般的な異常が多数あります。Prometheusのクエリ言語を使用すると、誤検出を避けながら、これらの異常を発見するためのツールが得られます。

Prometheus 0.14.0での高度なサービスディスカバリー

今週、待望の追加と改善を多数備えたPrometheus v0.14.0をリリースしました。

ユーザー側では、Prometheusが新しいサービスディスカバリーメカニズムをサポートするようになりました。DNS-SRVレコードに加えて、Consulをすぐにサポートし、ファイルベースのインターフェースを使用すると、独自のディスカバリーメカニズムを接続できます。将来的には、Prometheusに他の一般的なサービスディスカバリーメカニズムを追加する予定です。

多くの小さな修正と改善に加えて、PrometheusプロセスにSIGHUPを送信することにより、実行中に構成をリロードできるようになりました。変更の完全なリストについては、このリリースの変更ログを確認してください。

このブログ記事では、組み込みのサービスディスカバリーメカニズムを詳しく見て、いくつかの実用的な例を提供します。追加のリソースとして、Prometheusの構成ドキュメントを参照してください。

インターネット全体に広がるPrometheusモニタリング

Prometheusバージョン0.10.0を公開してからほぼ3か月が経ち、現在はバージョン0.13.1になっています。

SoundCloudの発表ブログ記事は、Prometheusの主要コンポーネントの概要を最もよく示していますが、Prometheusに関するその他のオンライン活動も数多くありました。この記事では、見逃した可能性のあるものをまとめておきます。

今後は、このブログを使用して、Prometheusを最大限に活用するのに役立つ記事や発表をさらに公開します。