Micrometer-Metriken für Java

GILT FÜR: NoSQL

Mithilfe von Micrometer implementiert das Java SDK für Azure Cosmos DB Clientmetriken für die Instrumentierung in beliebten Einblicksystemen wie Prometheus. Dieser Artikel enthält Anweisungen und Codeschnipsel für das Scraping von Metriken in Prometheus, die aus diesem Beispiel stammen. Die vollständige Liste der vom SDK bereitgestellten Metriken ist hier dokumentiert. Wenn Ihre Clients auf Azure Kubernetes Service (AKS) bereitgestellt werden, können Sie auch den verwalteten Azure Monitor-Dienst für Prometheus mit benutzerdefiniertem Scraping verwenden (siehe Dokumentation hier).

Nutzen von Metriken von Prometheus

Sie können Prometheus hier herunterladen. Um Micrometer-Metriken im Java SDK für Azure Cosmos DB mit Prometheus zu nutzen, stellen Sie zunächst sicher, dass Sie die erforderlichen Bibliotheken für die Registrierung und den Client importiert haben:

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
    <version>1.6.6</version>
</dependency>

<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_httpserver</artifactId>
    <version>0.5.0</version>
</dependency>

Stellen Sie in Ihrer Anwendung die Prometheus-Registrierung für die Telemetriedatenkonfiguration bereit. Beachten Sie, dass Sie verschiedene Diagnosegrenzwerte festlegen können, die dabei helfen, die genutzten Metriken auf die zu beschränken, die Sie am meisten interessieren:

//prometheus meter registry
PrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);

//provide the prometheus registry to the telemetry config
CosmosClientTelemetryConfig telemetryConfig = new CosmosClientTelemetryConfig()
        .diagnosticsThresholds(
                new CosmosDiagnosticsThresholds()
                        // Any requests that violate (are lower than) any of the below thresholds that are set
                        // will not appear in "request-level" metrics (those with "rntbd" or "gw" in their name).
                        // The "operation-level" metrics (those with "ops" in their name) will still be collected.
                        // Use this to reduce noise in the amount of metrics collected.
                        .setRequestChargeThreshold(10)
                        .setNonPointOperationLatencyThreshold(Duration.ofDays(10))
                        .setPointOperationLatencyThreshold(Duration.ofDays(10))
        )
        // Uncomment below to apply sampling to help further tune client-side resource consumption related to metrics.
        // The sampling rate can be modified after Azure Cosmos DB Client initialization – so the sampling rate can be
        // modified without any restarts being necessary.
        //.sampleDiagnostics(0.25)
        .clientCorrelationId("samplePrometheusMetrics001")
        .metricsOptions(new CosmosMicrometerMetricsOptions().meterRegistry(prometheusRegistry)
                //.configureDefaultTagNames(CosmosMetricTagName.PARTITION_KEY_RANGE_ID)
                .applyDiagnosticThresholdsForTransportLevelMeters(true)
        );

Starten Sie den lokalen HttpServer-Server, um die Metriken der Messungsregistrierung bereitzustellen:

try {
    HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
    server.createContext("/metrics", httpExchange -> {
        String response = prometheusRegistry.scrape();
        int i = 1;
        httpExchange.sendResponseHeaders(200, response.getBytes().length);
        try (OutputStream os = httpExchange.getResponseBody()) {
            os.write(response.getBytes());
        }
    });
    new Thread(server::start).start();
} catch (IOException e) {
    throw new RuntimeException(e);
}

Stellen Sie sicher, dass Sie clientTelemetryConfig beim Erstellen von CosmosClient übergeben:

//  Create async client
client = new CosmosClientBuilder()
    .endpoint(AccountSettings.HOST)
    .key(AccountSettings.MASTER_KEY)
    .clientTelemetryConfig(telemetryConfig)
    .consistencyLevel(ConsistencyLevel.SESSION) //make sure we can read our own writes
    .contentResponseOnWriteEnabled(true)
    .buildAsyncClient();

Fügen Sie den Domänennamen und den Port zu „targets“ hinzu, wenn Sie den Endpunkt für Ihren Anwendungsclient zu prometheus.yml hinzufügen. Wenn Prometheus beispielsweise auf demselben Server wie Ihr App-Client ausgeführt wird, können Sie localhost:8080 wie folgt zu targets hinzufügen:

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090", "localhost:8080"]

Jetzt können Sie Metriken von Prometheus nutzen:

Screenshot des Metrikdiagramms im Prometheus-Explorer

Nächste Schritte