1 | const got = require('got')
|
2 |
|
3 | const prometheus = require('prom-client')
|
4 |
|
5 | const options = {
|
6 | url: 'http://localhost:44444/counter',
|
7 | json: true,
|
8 | retry: {
|
9 | retries: 3,
|
10 | xerrorCodes: ['ERR_SOCKET_BAD_PORT']
|
11 | }
|
12 | }
|
13 |
|
14 | let allTimings = []
|
15 | let starter
|
16 | let finisher
|
17 |
|
18 | const apiMetrics = new prometheus.Histogram({
|
19 | name: 'api_requests',
|
20 | help: 'API calls using FB JWT Client',
|
21 | labelNames: ['client_name', 'baseUrl', 'url', 'method', 'status_code', 'status_message', 'error_name'],
|
22 | buckets: [0.1, 0.25, 0.5, 1, 2, 5, 10]
|
23 | })
|
24 |
|
25 | const requestMetrics = new prometheus.Histogram({
|
26 | name: 'jwt_client_requests',
|
27 | help: 'HTTP requests using FB JWT Client',
|
28 | labelNames: ['client_name', 'baseUrl', 'url', 'method', 'status_code', 'status_message', 'error_name'],
|
29 | buckets: [0.1, 0.25, 0.5, 1, 2, 5, 10]
|
30 | })
|
31 |
|
32 | const getResponseLabels = (response) => {
|
33 | const responseLabels = {
|
34 | status_code: response.statusCode
|
35 | }
|
36 | if (response.statusMessage) {
|
37 | responseLabels.status_message = response.statusMessage
|
38 | }
|
39 | if (response.name) {
|
40 | responseLabels.error_name = response.name
|
41 | }
|
42 | return responseLabels
|
43 | }
|
44 | let requestMetricsEnd
|
45 |
|
46 | const client = got.extend({
|
47 | timeout: 1000,
|
48 | hooks: {
|
49 | afterResponse: [
|
50 | (response, retryWithMergedOptions) => {
|
51 | requestMetricsEnd(getResponseLabels(response))
|
52 |
|
53 |
|
54 | console.log('afterResponse', response.statusCode)
|
55 | return response
|
56 | }
|
57 | ],
|
58 | beforeRequest: [
|
59 | (options, error, retryCount) => {
|
60 | requestMetricsEnd = requestMetrics.startTimer()
|
61 |
|
62 | console.log('beforeRequest')
|
63 | }
|
64 | ],
|
65 | beforeRetry: [
|
66 | (options, error, retryCount) => {
|
67 | requestMetricsEnd = requestMetrics.startTimer()
|
68 |
|
69 | console.log('beforeRetry', {retryCount})
|
70 | }
|
71 | ],
|
72 | beforeError: [
|
73 | error => {
|
74 | requestMetricsEnd(getResponseLabels(error))
|
75 |
|
76 |
|
77 | console.log('beforeError')
|
78 | return error
|
79 | }
|
80 | ]
|
81 | }
|
82 | })
|
83 |
|
84 | const fire = async () => {
|
85 | const apiMetricsEnd = apiMetrics.startTimer()
|
86 |
|
87 | try {
|
88 | const response = await client.get(options)
|
89 | apiMetricsEnd(getResponseLabels(response))
|
90 | const {body, retryCount} = response
|
91 | console.log({body, retryCount})
|
92 | } catch (e) {
|
93 | apiMetricsEnd(getResponseLabels(e))
|
94 | console.log('e', e ? e.body : 'no body')
|
95 | }
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 |
|
102 | console.log(prometheus.register.metrics())
|
103 | }
|
104 |
|
105 | fire()
|