@@ -8,4 +8,148 @@ El ejemplo que vamos a crear se trata de un `batch process` ficticio que irá va
88
99## 1. Instalamos el cliente de Prometheus
1010
11- En el caso de Nodejs el cliente de Prometheus es [ prom-client] ( https://github.com/siimon/prom-client )
11+ En el caso de Nodejs el cliente de Prometheus es [ prom-client] ( https://github.com/siimon/prom-client )
12+
13+ ``` bash
14+ npm i prom-client
15+ ```
16+
17+ ## 2. Creamos nuestras custom metrics
18+
19+ ``` js
20+ // Reference: https://github.com/siimon/prom-client/blob/master/example/counter.js
21+ const counter = new promClient.Counter ({
22+ name: ' worker_jobs_total' ,
23+ help: ' Total jobs handle' ,
24+ labelNames: [' code' ]
25+ });
26+
27+ // Reference: https://github.com/siimon/prom-client/blob/master/example/gauge.js
28+ const gauge = new promClient.Gauge ({
29+ name: ' worker_jobs_active' ,
30+ help: ' Worker jobs in process'
31+ });
32+
33+
34+ module .exports .counter = counter;
35+ module .exports .gauge = gauge;
36+ ```
37+
38+ ## 3. Actualizamos la 'lógica' de procesos
39+
40+ Actualizar ` batch.js `
41+
42+ ``` js
43+ /* diff*/
44+ const { counter , gauge } = require (' ./custom-metrics' );
45+ /* diff*/
46+
47+ const getRandom = (start , end ) => Math .floor ((Math .random () * end) + start);
48+
49+ const randomBatchProcess = () => {
50+ const jobs = getRandom (50 , 500 );
51+ const failed = getRandom (1 , 50 );
52+ const processed = jobs - failed;
53+ const active = getRandom (1 , 100 );
54+ return { active, failed, processed };
55+ };
56+
57+ module .exports .batch = () => {
58+ const intervalId = setInterval (() => {
59+ const { active , failed , processed } = randomBatchProcess ();
60+ /* diff*/
61+ counter .labels (' 200' ).inc (processed);
62+ counter .labels (' 500' ).inc (failed);
63+
64+ gauge .set (active);
65+ /* diff*/
66+ }, 5_000 );
67+
68+ return intervalId;
69+ };
70+ ```
71+
72+ ## 4. Recuperamos las métricas
73+
74+ Lo primero que vamos a hacer es recuperar las métricas que expone por defecto ` prom-client `
75+
76+ Actualizamos ` index.js `
77+
78+ ``` diff
79+ const express = require('express');
80+ + const promClient = require('prom-client');
81+ const { port } = require('./config');
82+ const { batch } = require('./batch');
83+ +
84+ + const { register, collectDefaultMetrics } = promClient;
85+ +
86+ + collectDefaultMetrics({ prefix: 'default_' });
87+ const intervalId = batch();
88+ const app = express();
89+
90+ app.get('/metrics', async (_, res) => {
91+ try {
92+ res.send('Not implemented yet');
93+ } catch (ex) {
94+ res.status(500).end(ex);
95+ }
96+ });
97+
98+ app.post('/stop', (_, res) => {
99+ clearInterval(intervalId);
100+ res.send('batch process stopped');
101+ });
102+
103+ app.listen(port, () => {
104+ console.log(`Listening at ${port}`);
105+ });
106+
107+ ```
108+
109+ Por último tenemos que indicar a ` prom-client ` , cuando debemos volcar las métricas:
110+
111+ ``` diff
112+ app.get('/metrics', async (_, res) => {
113+ try {
114+ - res.send('Not implemented yet');
115+ + res.set('Content-Type', register.contentType);
116+ + res.end(await register.metrics());
117+ } catch (ex) {
118+ res.status(500).end(ex);
119+ }
120+ });
121+ ```
122+
123+ Si ejecutamos nuestra aplicación ahora podremos ver como las métricas son expuestas en el formato ` Prometheus `
124+
125+ ``` bash
126+ npm start
127+ ```
128+
129+ Y desde otra terminal, podemos verificar la salida con ` curl localhost:3000/metrics `
130+
131+
132+ ``` ini
133+ # HELP worker_jobs_total Total jobs handle
134+ # TYPE worker_jobs_total counter
135+ worker_jobs_total{code =" 200" } 739
136+ worker_jobs_total{code =" 500" } 44
137+
138+ # HELP worker_jobs_active Worker jobs in process
139+ # TYPE worker_jobs_active gauge
140+ worker_jobs_active 52
141+
142+ # HELP default_process_cpu_user_seconds_total Total user CPU time spent in seconds.
143+ # TYPE default_process_cpu_user_seconds_total counter
144+ default_process_cpu_user_seconds_total 0.185732
145+
146+ # HELP default_process_cpu_system_seconds_total Total system CPU time spent in seconds.
147+ # TYPE default_process_cpu_system_seconds_total counter
148+ default_process_cpu_system_seconds_total 0.027831
149+
150+ # HELP default_process_cpu_seconds_total Total user and system CPU time spent in seconds.
151+ # TYPE default_process_cpu_seconds_total counter
152+ default_process_cpu_seconds_total 0.213563
153+
154+ # ........
155+ ```
0 commit comments