Skip to content

Commit ebaaadc

Browse files
committed
added code library
1 parent e749c14 commit ebaaadc

6 files changed

Lines changed: 204 additions & 7 deletions

File tree

06-monitoring/00-prometheus/.solutions/batch/batch.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
1+
const { counter, gauge } = require('./custom-metrics');
2+
13
const getRandom = (start, end) => Math.floor((Math.random() * end) + start);
24

35
const randomBatchProcess = () => {
46
const jobs = getRandom(50, 500);
57
const failed = getRandom(1, 50);
68
const processed = jobs - failed;
7-
return { jobs, failed, processed };
9+
const active = getRandom(1, 100);
10+
return { active, failed, processed };
811
};
912

1013
module.exports.batch = () => {
1114
const intervalId = setInterval(() => {
12-
const { jobs, failed, processed } = randomBatchProcess();
13-
console.log(jobs, failed, processed);
15+
const { active, failed, processed } = randomBatchProcess();
16+
17+
counter.labels('200').inc(processed);
18+
counter.labels('500').inc(failed);
19+
20+
gauge.set(active);
1421
}, 5_000);
1522

1623
return intervalId;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
const promClient = require('prom-client');
2+
3+
// Reference: https://github.com/siimon/prom-client/blob/master/example/counter.js
4+
const counter = new promClient.Counter({
5+
name: 'worker_jobs_total',
6+
help: 'Total jobs handle',
7+
labelNames: ['code']
8+
});
9+
10+
// Reference: https://github.com/siimon/prom-client/blob/master/example/gauge.js
11+
const gauge = new promClient.Gauge({
12+
name: 'worker_jobs_active',
13+
help: 'Worker jobs in process'
14+
});
15+
16+
17+
module.exports.counter = counter;
18+
module.exports.gauge = gauge;

06-monitoring/00-prometheus/.solutions/batch/index.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
const express = require('express');
2+
const promClient = require('prom-client');
23
const { port } = require('./config');
34
const { batch } = require('./batch');
45

6+
const { register, collectDefaultMetrics } = promClient;
7+
8+
collectDefaultMetrics({ prefix: 'default_' });
59
const intervalId = batch();
610
const app = express();
711

812
app.get('/metrics', async (_, res) => {
913
try {
10-
res.send('Not implemented yet');
14+
// res.send('Not implemented yet');
15+
res.set('Content-Type', register.contentType);
16+
res.end(await register.metrics());
1117
} catch (ex) {
1218
res.status(500).end(ex);
1319
}

06-monitoring/00-prometheus/.solutions/batch/package-lock.json

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

06-monitoring/00-prometheus/.solutions/batch/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"author": "",
1212
"license": "ISC",
1313
"dependencies": {
14-
"express": "^4.17.2"
14+
"express": "^4.17.2",
15+
"prom-client": "^14.0.1"
1516
}
16-
}
17+
}

06-monitoring/00-prometheus/02-gauges-counters/01-nodejs-client-library/readme.md

Lines changed: 145 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)