Partage via


Métriques de micromètre pour Java

S’APPLIQUE À : NoSQL

Le Java SDK pour Azure Cosmos DB implémente des métriques clientes à l’aide de Micromètre pour l’instrumentation dans des systèmes d’observabilité populaires tels que Prometheus. Cet article inclut des instructions et des extraits de code pour la récupération de métriques dans Prometheus, extraits de cet exemple. La liste complète des métriques fournies par le Kit de développement logiciel (SDK) est documentée ici. Si vos clients sont déployés sur Azure Kubernetes Service (AKS), vous pouvez également utiliser le service managé Azure Monitor pour Prometheus avec la récupération personnalisée, consultez la documentation ici.

Consommer des métriques à partir de Prometheus

Vous pouvez télécharger Prometheus ici. Pour utiliser les métriques Micrometer dans le Kit de développement logiciel (SDK) Java pour Azure Cosmos DB à l’aide de Prometheus, vérifiez d’abord que vous avez importé les bibliothèques requises pour le registre et le client :

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

Dans votre application, fournissez le registre Prometheus à la configuration de télémétrie. Notez que vous pouvez définir différents seuils de diagnostic, ce qui vous aidera à limiter les métriques consommées aux métriques qui vous intéressent le plus :

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

Démarrez le serveur HttpServer local pour exposer les métriques de Registre de compteurs à 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);
}

Veillez à passer clientTelemetryConfig lors de la création de votre CosmosClient:

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

Lorsque vous ajoutez le point de terminaison de votre client d’application à prometheus.yml, ajoutez le nom de domaine et le port à « cibles ». Par exemple, si Prometheus s’exécute sur le même serveur que votre client d’application, vous pouvez ajouter localhost:8080 à targets comme suit :

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

Vous pouvez maintenant consommer des métriques à partir de Prometheus :

Capture d’écran du graphique des métriques dans l’explorateur Prometheus.

Étapes suivantes