Share via


Metrische gegevens van micrometer voor Java

VAN TOEPASSING OP: NoSQL

De Java SDK voor Azure Cosmos DB implementeert metrische clientgegevens met behulp van Micrometer voor instrumentatie in populaire waarneembaarheidssystemen zoals Prometheus. Dit artikel bevat instructies en codefragmenten voor het scrapen van metrische gegevens in Prometheus, afkomstig uit dit voorbeeld. De volledige lijst met metrische gegevens die door de SDK worden geleverd, wordt hier beschreven. Als uw clients zijn geïmplementeerd in Azure Kubernetes Service (AKS), kunt u ook de beheerde Azure Monitor-service voor Prometheus gebruiken met aangepaste scraping. Raadpleeg de documentatie hier.

Metrische gegevens van Prometheus gebruiken

U kunt prometheus hier downloaden. Als u metrische micrometergegevens wilt gebruiken in de Java SDK voor Azure Cosmos DB met behulp van Prometheus, moet u eerst controleren of u de vereiste bibliotheken voor register en client hebt geïmporteerd:

<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>

Geef in uw toepassing het prometheus-register op voor de configuratie van de telemetrie. U kunt verschillende diagnostische drempelwaarden instellen, waarmee u de metrische gegevens kunt beperken die worden gebruikt tot de drempelwaarden waarin u het meest geïnteresseerd bent:

//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)
        );

Start de lokale HttpServer-server om de metrische gegevens van het meterregister beschikbaar te maken voor Prometheus:

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);
}

Zorg ervoor dat u doorgeeft clientTelemetryConfig wanneer u het CosmosClientvolgende maakt:

//  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();

Wanneer u het eindpunt voor uw toepassingsclient prometheus.ymltoevoegt, voegt u de domeinnaam en poort toe aan 'doelen'. Als prometheus bijvoorbeeld wordt uitgevoerd op dezelfde server als uw app-client, kunt u dit als targets volgt toevoegenlocalhost:8080:

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"]

U kunt nu metrische gegevens van Prometheus gebruiken:

Schermopname van de grafiek met metrische gegevens in Prometheus Explorer.

Volgende stappen