-
Notifications
You must be signed in to change notification settings - Fork 380
/
Copy pathserver.js
114 lines (94 loc) · 2.34 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
'use strict';
const express = require('express');
const cluster = require('cluster');
const server = express();
const register = require('../').register;
// Enable collection of default metrics
require('../').collectDefaultMetrics({
gcDurationBuckets: [0.001, 0.01, 0.1, 1, 2, 5], // These are the default buckets.
});
// Create custom metrics
const Histogram = require('../').Histogram;
const h = new Histogram({
name: 'test_histogram',
help: 'Example of a histogram',
labelNames: ['code'],
});
const Counter = require('../').Counter;
const c = new Counter({
name: 'test_counter',
help: 'Example of a counter',
labelNames: ['code'],
});
new Counter({
name: 'scrape_counter',
help: 'Number of scrapes (example of a counter with a collect fn)',
collect() {
// collect is invoked each time `register.metrics()` is called.
this.inc();
},
});
const Gauge = require('../').Gauge;
const g = new Gauge({
name: 'test_gauge',
help: 'Example of a gauge',
labelNames: ['method', 'code'],
});
// Set metric values to some random values for demonstration
setTimeout(() => {
h.labels('200').observe(Math.random());
h.labels('300').observe(Math.random());
}, 10);
setInterval(() => {
c.inc({ code: 200 });
}, 5000);
setInterval(() => {
c.inc({ code: 400 });
}, 2000);
setInterval(() => {
c.inc();
}, 2000);
setInterval(() => {
g.set({ method: 'get', code: 200 }, Math.random());
g.set(Math.random());
g.labels('post', '300').inc();
}, 100);
if (cluster.isWorker) {
// Expose some worker-specific metric as an example
setInterval(() => {
c.inc({ code: `worker_${cluster.worker.id}` });
}, 2000);
}
const t = [];
setInterval(() => {
for (let i = 0; i < 100; i++) {
t.push(new Date());
}
}, 10);
setInterval(() => {
while (t.length > 0) {
t.pop();
}
});
// Setup server to Prometheus scrapes:
server.get('/metrics', async (req, res) => {
try {
res.set('Content-Type', register.contentType);
res.end(await register.metrics());
} catch (ex) {
res.status(500).end(ex);
}
});
server.get('/metrics/counter', async (req, res) => {
try {
res.set('Content-Type', register.contentType);
res.end(await register.getSingleMetricAsString('test_counter'));
} catch (ex) {
res.status(500).end(ex);
}
});
const port = process.env.PORT || 3000;
console.log(
`Server listening to ${port}, metrics exposed on /metrics endpoint`,
);
server.listen(port);