序文
このシリーズでは、Prometheusに焦点を当て、Prometheusとその周辺のエコシステムを使用して、独自のリアルタイム監視およびアラートプラットフォームを構築する方法を紹介します。
プロメテウスのユーザーとの最初の接触のための聴衆のオブジェクトのこのシリーズは、神が操作や戦闘を支持して、スプレーしませんが、重要な概念は、次の言及するために洗練されます。シリーズは主に次の作品に分かれています
- プロメテウスのコンセプトと構築、データの取り込み方の紹介
- Prometheusにデータをプッシュする方法と、プッシュとプルがそれぞれどのようなシナリオで使用されるか
- Prometheusデータの構造とクエリ言語PromQLの使い方
- JavaアプリケーションとPrometheusの統合方法、サービスディスカバリーの有効化、ビジネスメトリクスのカスタマイズ方法
- PrometheusがGrafana可視化スイートと統合し、アラートを設定する方法
- Dubboメトリクスのモニタリングを統合するJavaキットの書き方を教えます。
- 大容量ディスクのビジネスサイドとシステムサイドそれぞれの監視をどのように行うか、実践的な事例を共有します。
クロールとプッシュ
プルモード:
Prometheusがデータを取得する唯一の方法はプル、つまりPrometheusが各ターゲットから提供されたhttp URLを一定の頻度でリクエストしてデータを取得することです。このため、各サービスのエンドポイントは、リアルタイムのデータを取得するためのhttpインターフェースを提供する必要があります。
プッシュ・モード:
また、プロメテウスはプッシュデータを偽装して実装しています。
なぜ偽装と言うかというと。プロメテウスがデータを取得する方法はずっとプル方式で、公式はデータをプッシュする機能を提供していないからです。しかし、プッシュ方式に対応するために、公式はPushGatewayコンポーネントを追加しました。
このコンポーネントはプロキシサービスに相当し、独立して配置されます。データを取得する機能はなく、データがプッシュされるのを受動的に待つことしかできません。アプリケーションがPushGatewayにデータをプッシュした後、PrometheusはPushGatewayからデータを取得します。
プッシュモードの注意点
クライアントがPushGatewayに全データをプッシュしても、Prometheusはこの期間にユーザーによってプッシュされた全データを毎回プルしているわけではありません。
実際、プロメテウスはユーザーが最後にプッシュアップしたデータだけを取り出します。
このシリーズ1の時点で、プロメテウスはすべての精密なデータを必要とするわけではなく、中精度または低精度のデータを長期間保持することが述べられていました。一定の頻度で、一度に1つのデータを取得します。また、データにある種の傾向を作り出します。
クライアントが新しいインディケータをPushGatewayにプッシュしない場合、プロメテウスはインディケータが消えるまで、常に最後のプッシュのデータをプルします。
--persistence.interval=5mPushgatewayはメトリクスを保存することを意図していませんが、予期しない再起動やその他の障害の後にpushgatewayが元のメトリクスを再読み込みできるようにするために、一時的にローカルにメトリクスを保存する機能が追加されました。パラメータはデフォルト値で5分間保持され、その後ローカルに保存されたメトリクスは削除されます。この値は、異常を検出するまでの時間を修正するために調整できます。
1つのPushgatewayで複数のインスタンスを監視する場合、Pushgatewayが単一障害点となり、ボトルネックになる可能性があります。
Pushgatewayを使うのであれば、複数のポイントにデプロイすることをお勧めします。そして、ロードバランシングのためにnginx経由で複数のノードをリバースプロキシします。
プッシュモードが適用されるシナリオ
- プロメテウスは時限プルモードを採用していますが、サブネットワークやファイアウォールの影響により、各ターゲットのインジケータデータを直接プルすることができません。
- 様々なビジネスデータの監視では、別のビジネスデータの統一された要約の必要性は、この時間はまた、PushGatewayを使用することができますコレクションを統一し、Prometheusは、プルを統一するために
ビルド
Pushgatewayはドッカーインストールと通常インストールに分かれていますが、ここでは通常インストールを使用します。
プロメテウスのgithubリリースページに行きましょう。
私はLinuxサーバーにデプロイする必要があるので、必要に応じて対応するパッケージをダウンロードしてください。
ダウンロードして解凍してください。実行します:
nohup ./pushgateway &
起動後、デフォルトのポートは9091です。
ブラウザのip+portで以下のページにアクセスできれば成功です:
これに加えて、Prometheusの設定ファイルでTarget:を設定します。
- job_name: 'pushgateway'
scrape_interval: 10s # 10秒ごとにプルされる
honor_labels: true
static_configs:
- targets: ['localhost:9091']
labels:
instance: pushgateway
設定後Prometheusを再起動すると、TargetタブにPushgatewayのステータスがUPと表示されます。
セットアップが完了しました。
URLプッシュテスト
プッシュテストにはpostmanソフトウェアを使用しています:/metrics/job/<JOBNAME>{/<LABEL_NAME>/<LABEL_VALUE>}
job=pushgateway,instance=demoこのテストケースは、bbb=BBB,ccc=cccのラベルが貼られたインジケーターaaaを、111.1の値を持つグループにプッシュするものです。
実際、このインジケータaaaには、job、instance、bbb、cccの4つのラベルが付属していることが簡単に理解できます。
プロメテウスは一度に最新のものしか取得しないため、同じメトリクスが異なるグループ内に存在することがあります。
データ構造とラベル構造については、次回の記事で詳しく説明します。
とにかく、このPOSTリクエストを送信すると、"http://ip:9091 "に以下のデータが表示されます:
ご覧の通り、aaaタグがPushgatewayに送信されました。
次に、プロメテウスでこのメトリックを照会します:
ご覧の通り、プロメテウスはこのインジケーターを引き出すことに成功しました。
JavaSDKでプッシュ
Javaサーバーでもhttpclientなどのツールを使って送信できますが、独自のリクエストボディをたくさん組み立てる必要があります。 Prometheusは公式にSDKを提供しています。
Mavenで依存パッケージを導入することから始めます:
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_pushgateway</artifactId>
<version>0.9.0</version>
</dependency>
Gauge(ゲージ)、Timer(タイマー)、Counter(カウンター)、Summary(サマリー)の4つの一般的なメトリクスのプッシュ例:
public void run(String... args) throws Exception {
Gauge guage = Gauge.build("my_custom_metric", "This is my custom metric.") .labelNames("aaa","bbb").register();
Gauge.Child child = guage.labels("AAA","BBB");
child.set(334.5);
Gauge timerGauge = Gauge.build("my_timer_metric","this is my timer metric.").register();
Gauge.Timer timer = timerGauge.startTimer();
Thread.sleep(3000L);
Counter counter = Counter.build("my_count_metric","this is my count metric.").register();
counter.inc();
counter.inc();
Summary summary = Summary.build("my_summary_metric","this is my summary metric.").register();
summary.observe(45.6);
summary.observe(54.5);
String url = "xxx.xxx.xxx.xxx:9091";
PushGateway pg = new PushGateway(url);
Map<String, String> groupingKey = new HashMap<>();
groupingKey.put("instance", "my_instance");
pg.pushAdd(CollectorRegistry.defaultRegistry, "my_job", groupingKey);
}
このコードは、4つのインジケータを一括送信するシナリオを示しています。CollectorRegistry.defaultRegistryこれらのインジケータを登録し、最後にまとめてpushAddします。
送信されたメトリクスは、Pushgatewayで照会できます:
繰り返しますが、これら4つのインジケーターはプロメテウスで調べることができますので、具体的な図は掲載しません。ご自分で試してみてください。
最後に
このシリーズは、実際のオペレーションを使って全体像を監視するための独自のシステムとビジネスを構築するために、ステップ・バイ・ステップで学ぶことを目的としています。本シリーズは今後も更新される予定です。次のセクションでは、Prometheusにおけるデータフォーマットの分析とPromQLの使用について分析します。





