web-dev-qa-db-fra.com

Prometheus vous permet-il d'extraire des informations JSON d'un ordinateur d'extrémité?

J'utilise Prometheus pour instrumenter une application Node.js pour la surveillance. J'utilise actuellement le client Node.js suivant pour l'instrumentation:

prom-client

Tout est configuré pour collecter et collecter les mesures par défaut à partir de mon application Node.js et la surveillance fonctionne comme prévu. Je souhaite savoir s'il est possible pour Prometheus de supprimer JSON d'un ordinateur d'extrémité exposé par mon application.

Par exemple, l'application Node.js possède un noeud final d'intégrité (/ health), qui renvoie des données JSON simples (valeurs booléennes ou 0/1) relatives à l'intégrité globale de l'application et à ses dépendances. Puis-je configurer Prometheus et/ou prom-client pour extraire le code JSON du noeud final d'intégrité, puis enregistrer des métriques en fonction de ces informations?

5
Joshua Alger

J'ai pu trouver une solution à l'aide de prom-client et créer ma propre métrique personnalisée. Fournira un exemple ci-dessous pour toute personne susceptible d’être intéressée à faire de même. Supposons qu'il existe un noeud final de vérification de l'intégrité qui renvoie le JSON suivant:

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

J'ai utilisé le package request pour appeler le noeud final, analyser les données et créer une jauge afin de refléter une valeur basée sur l'état de l'état de santé. Vous trouverez ci-dessous un exemple du noeud final/metrics en JavaScript:

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

Je crois que tu peux. 

Les articles de blog que j'ai liés ci-dessous expliquent comment cela est fait en utilisant le client Prometheus Python pour acquérir des métriques au format JSON dans Prometheus.

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

5
ConorB

Si vous souhaitez que le prom-client collecte ces informations, vous pouvez consulter le tas tas collector qui fait partie de la bibliothèque.

Lorsque ce collecteur extrait la taille du segment de mémoire, vous pouvez au lieu de cela gratter le point de terminaison JSON ou appeler la fonctionnalité située derrière le point de terminaison JSON directement pour publier des indicateurs avec 0 ou 1.

2
ahus1

Pas directement, car Prométhée ne comprend que leur format de texte ou un format GRPC. Voir https://prometheus.io/docs/instrumenting/exposition_formats/

Bien entendu, il est possible d’écrire un "pont" de traduction ou un exportateur traduisant les structures JSON dans ce format, comme @ConorB décrit dans sa réponse.

1
Heiko Rupp