web-dev-qa-db-ja.com

Prometheusでは、エンドポイントからJSON情報を取得できますか?

私はPrometheusを使用して、監視用のNode.jsアプリケーションをインスツルメントしています。現在、計装に次のNode.jsクライアントを使用しています。

prom-client

Node.jsアプリケーションからデフォルトのメトリックを収集および収集するようにすべてを構成し、監視は期待どおりに機能しています。アプリケーションが公開するエンドポイントからPrometheusがJSONをスクレイピングできるかどうか知りたいのですが。

たとえば、Node.jsアプリケーションにはヘルスチェックエンドポイント(/ health)があり、アプリケーションの全体的なヘルスと依存関係に関する単純なJSONデータ(ブール値または0/1)を返します。ヘルスエンドポイントからJSONを取得し、その情報に基づいてメトリックを記録するようにPrometheusやprom-clientを構成できますか?

6
Joshua Alger

prom-client を使用してソリューションを見つけ、独自のカスタム指標を作成することができました。同じことをしたい人のために以下の例を提供します。次のJSONを返すヘルスチェックエンドポイントがあるとします。

{
    "app": {
        "message": "Service is up and running!",
        "success": true
    }
}

パッケージrequestを使用してエンドポイントを呼び出し、データを解析して、ヘルスチェックステータスに基づいて値を反映するゲージを作成しました。以下は、JavaScriptの/ metricsエンドポイントの例です。

const express = require('express');
const router = express.Router();
const request = require('request');

// Config for health check endpoint
const healthCheckURL = 'https://SOME_ENDPOINT/health';
const zone = 'DEV';

// Initialize Prometheus
const Prometheus = require('prom-client');
const collectDefaultMetrics = Prometheus.collectDefaultMetrics;
collectDefaultMetrics({
    timeout: 5000
});

router.get('/', (req, res) => {
    res.end(Prometheus.register.metrics());
});

const serviceHealthGauge = new Prometheus.Gauge({
    name: 'service_health',
    help: 'Health of service component',
    labelNames: ['zone']
});

setInterval(() => {
    request({
            url: healthCheckURL,
            method: "GET",
        },
        function(error, response, body) {
            if (!error && response.statusCode == 200) {
                const JSONBody = JSON.parse(body);

                // check service health
                if (JSONBody.app && JSONBody.app.success) {
                    serviceHealthGauge.set({
                        zone: zone
                    }, 1);
                } else {
                    serviceHealthGauge.set({
                        zone: zone
                    }, 0);

                }
            } else {
                serviceHealthGauge.set({
                    zone: zone
                }, 0);
            }
        }   
    );
  }, 10000);

module.exports.metricNames = ['service_health'];

module.exports = router;
2
Joshua Alger

できると思います。

以下でリンクしているブログ投稿では、Prometheus Python clientを使用してJSON形式のメトリックをPrometheusに取り込むためにこれを行う方法を詳しく説明しています。

https://www.robustperception.io/writing-a-jenkins-exporter-in-python/https://www.robustperception.io/writing-json-exporters-in -python /

6
ConorB

Prom-clientにこの情報を収集させたい場合は、ライブラリの一部である ヒープサイズ コレクターを確認できます。

このコレクターがヒープサイズをフェッチする場所では、代わりにJSONエンドポイントをスクレイピングするか、JSONエンドポイントの背後にある機能を直接呼び出して、0または1のゲージを公開することができます。

2
ahus1

Prometheusはテキスト形式またはGRPC形式のみを理解するため、直接ではありません。参照 https://prometheus.io/docs/instrumenting/exposition_formats/

またはもちろん、彼の回答で説明されている@ConorBのように、JSON構造をその形式で変換する翻訳「ブリッジ」またはエクスポーターを作成することもできます。

1
Heiko Rupp

ブラックボックスエクスポーターでこれが可能になりました: https://github.com/prometheus/blackbox_exporter

ここにプロメテウス/グラファナ/ブラックボックスのステップバイステップガイドがあります- https://medium.com/the-telegraph-engineering/how-prometheus-and-the-blackbox-exporter-makes-monitoring-microservice-endpoints -easy-and-free-of-a986078912ee

0
Dmitry Kutetsky