@tramvai/module-metrics 1.60.2 → 1.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,3 @@
1
- declare type Args = [Record<string, any> | string | URL, (res: Record<string, any>) => void] | [string | URL, Record<string, any>, (res: Record<string, any>) => void];
1
+ import type { Args, CreateRequestWithMetrics } from './types';
2
2
  export declare const getUrlAndOptions: (args: Args) => any[];
3
- export declare const createRequestWithMetrics: ({ metricsInstances: { requestsTotal, requestsErrors, requestsDuration }, getServiceName, }: {
4
- metricsInstances: {
5
- requestsTotal: any;
6
- requestsErrors: any;
7
- requestsDuration: any;
8
- };
9
- getServiceName: any;
10
- }) => (originalRequest: any, ...args: Args) => any;
11
- export {};
3
+ export declare const createRequestWithMetrics: CreateRequestWithMetrics;
@@ -1,7 +1,9 @@
1
- export declare const initRequestsMetrics: ({ metrics, getServiceName, http, https, createRequestWithMetrics, }: {
2
- metrics: any;
3
- getServiceName: any;
4
- http: any;
5
- https: any;
6
- createRequestWithMetrics: any;
1
+ import type { MetricsModule, GetServiceName, CreateRequestWithMetrics, HttpModule, HttpsModule, ModuleConfig } from './types';
2
+ export declare const initRequestsMetrics: ({ metrics, getServiceName, http, https, createRequestWithMetrics, config, }: {
3
+ metrics: MetricsModule;
4
+ http: HttpModule;
5
+ https: HttpsModule;
6
+ createRequestWithMetrics: CreateRequestWithMetrics;
7
+ getServiceName: GetServiceName;
8
+ config: ModuleConfig;
7
9
  }) => void;
@@ -0,0 +1,26 @@
1
+ /// <reference types="node" />
2
+ import type { RequestOptions, IncomingMessage, ClientRequest } from 'http';
3
+ import type httpType from 'http';
4
+ import type httpsType from 'https';
5
+ import type { Counter, Histogram } from 'prom-client';
6
+ import type { METRICS_MODULE_TOKEN, METRICS_SERVICES_REGISTRY_TOKEN } from '@tramvai/tokens-metrics';
7
+ export declare type ModuleConfig = {
8
+ enableDnsResolveMetric: boolean;
9
+ };
10
+ export declare type MetricsModule = typeof METRICS_MODULE_TOKEN;
11
+ export declare type HttpModule = typeof httpType;
12
+ export declare type HttpsModule = typeof httpsType;
13
+ export declare type OriginalRequest = HttpModule['request'];
14
+ export declare type MetricsInstances = {
15
+ requestsTotal: Counter<'status' | 'method' | 'service'>;
16
+ requestsErrors: Counter<'status' | 'method' | 'service'>;
17
+ requestsDuration: Histogram<'status' | 'method' | 'service'>;
18
+ dnsResolveDuration: Histogram<'service'>;
19
+ };
20
+ export declare type GetServiceName = typeof METRICS_SERVICES_REGISTRY_TOKEN['getServiceName'];
21
+ export declare type Args = [RequestOptions | string | URL, (res: IncomingMessage) => void] | [string | URL, RequestOptions, (res: IncomingMessage) => void];
22
+ export declare type CreateRequestWithMetrics = (args: {
23
+ metricsInstances: MetricsInstances;
24
+ getServiceName: GetServiceName;
25
+ config: ModuleConfig;
26
+ }) => (originalRequest: HttpModule['request'], ...requestArgs: Args) => ClientRequest;
package/lib/server.d.ts CHANGED
@@ -1,2 +1,4 @@
1
+ import { METRICS_MODULE_CONFIG_TOKEN } from './tokens';
1
2
  export declare class MetricsModule {
2
3
  }
4
+ export { METRICS_MODULE_CONFIG_TOKEN };
package/lib/server.es.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { __decorate } from 'tslib';
2
- import { Module, commandLineListTokens, Scope } from '@tramvai/core';
2
+ import { createToken, Module, commandLineListTokens, Scope, provide } from '@tramvai/core';
3
3
  import { SERVER_MODULE_PAPI_PUBLIC_ROUTE, WEB_APP_BEFORE_INIT_TOKEN, WEB_APP_TOKEN, SPECIAL_SERVER_PATHS } from '@tramvai/tokens-server';
4
4
  import { METRICS_MODULE_TOKEN, METRICS_SERVICES_REGISTRY_TOKEN, REGISTER_INSTANT_METRIC_TOKEN } from '@tramvai/tokens-metrics';
5
5
  import { measure } from '@tinkoff/measure-express-requests';
@@ -68,18 +68,18 @@ const getUrlAndOptions = (args) => {
68
68
  const urlWOQuery = parsedUrl.origin + parsedUrl.pathname;
69
69
  return [urlWOQuery, options || {}];
70
70
  };
71
- const createRequestWithMetrics = ({ metricsInstances: { requestsTotal, requestsErrors, requestsDuration }, getServiceName, }) => function requestWithMetrics(originalRequest, ...args) {
72
- const req = originalRequest.apply(this, args);
73
- const timerDone = requestsDuration.startTimer();
71
+ const createRequestWithMetrics = ({ metricsInstances: { requestsTotal, requestsErrors, requestsDuration, dnsResolveDuration }, getServiceName, config, }) => function requestWithMetrics(originalRequest, ...args) {
74
72
  const [url, options] = getUrlAndOptions(args);
75
73
  const serviceName = getServiceName(url);
74
+ const req = originalRequest.apply(this, args);
75
+ const timerDone = requestsDuration.startTimer();
76
76
  const labelsValues = {
77
77
  method: options.method || 'unknown',
78
78
  service: serviceName || new URL(url).origin || 'unknown',
79
79
  status: 'unknown',
80
80
  };
81
81
  req.on('response', (res) => {
82
- labelsValues.status = res.statusCode;
82
+ labelsValues.status = res.statusCode.toString();
83
83
  if (res.statusCode >= 400) {
84
84
  requestsErrors.inc(labelsValues);
85
85
  }
@@ -94,10 +94,18 @@ const createRequestWithMetrics = ({ metricsInstances: { requestsTotal, requestsE
94
94
  requestsErrors.inc(labelsValues);
95
95
  timerDone(labelsValues);
96
96
  });
97
+ if (config.enableDnsResolveMetric) {
98
+ req.on('socket', (socket) => {
99
+ const dnsTimerDone = dnsResolveDuration.startTimer();
100
+ socket.on('lookup', () => {
101
+ dnsTimerDone({ service: labelsValues.service });
102
+ });
103
+ });
104
+ }
97
105
  return req;
98
106
  };
99
107
 
100
- const initRequestsMetrics = ({ metrics, getServiceName, http, https, createRequestWithMetrics, }) => {
108
+ const initRequestsMetrics = ({ metrics, getServiceName, http, https, createRequestWithMetrics, config, }) => {
101
109
  const metricsInstances = {
102
110
  requestsTotal: metrics.counter({
103
111
  name: 'http_sent_requests_total',
@@ -114,16 +122,21 @@ const initRequestsMetrics = ({ metrics, getServiceName, http, https, createReque
114
122
  help: 'Execution time of the sent requests',
115
123
  labelNames: ['status', 'method', 'service'],
116
124
  }),
125
+ dnsResolveDuration: metrics.histogram({
126
+ name: 'dns_resolve_duration',
127
+ help: 'Time for dns resolve of the outhgoing requests',
128
+ labelNames: ['service'],
129
+ }),
117
130
  };
118
131
  monkeypatch({
119
132
  obj: https,
120
133
  method: 'request',
121
- handler: createRequestWithMetrics({ metricsInstances, getServiceName }),
134
+ handler: createRequestWithMetrics({ metricsInstances, getServiceName, config }),
122
135
  });
123
136
  monkeypatch({
124
137
  obj: http,
125
138
  method: 'request',
126
- handler: createRequestWithMetrics({ metricsInstances, getServiceName }),
139
+ handler: createRequestWithMetrics({ metricsInstances, getServiceName, config }),
127
140
  });
128
141
  };
129
142
 
@@ -226,6 +239,8 @@ class MetricsServicesRegistry {
226
239
  }
227
240
  }
228
241
 
242
+ const METRICS_MODULE_CONFIG_TOKEN = createToken('metrics-module-config');
243
+
229
244
  let RequestModule = class RequestModule {
230
245
  };
231
246
  RequestModule = __decorate([
@@ -234,7 +249,7 @@ RequestModule = __decorate([
234
249
  {
235
250
  provide: commandLineListTokens.init,
236
251
  multi: true,
237
- useFactory: ({ metrics, envManager, metricsServicesRegistry }) => {
252
+ useFactory: ({ metrics, envManager, metricsServicesRegistry, metricsModuleConfig, }) => {
238
253
  if (!metrics) {
239
254
  return noop;
240
255
  }
@@ -242,7 +257,14 @@ RequestModule = __decorate([
242
257
  const env = envManager.getAll();
243
258
  metricsServicesRegistry.registerEnv(env);
244
259
  const getServiceName = metricsServicesRegistry.getServiceName.bind(metricsServicesRegistry);
245
- initRequestsMetrics({ metrics, getServiceName, http, https, createRequestWithMetrics });
260
+ initRequestsMetrics({
261
+ metrics,
262
+ getServiceName,
263
+ http,
264
+ https,
265
+ createRequestWithMetrics,
266
+ config: metricsModuleConfig,
267
+ });
246
268
  };
247
269
  },
248
270
  deps: {
@@ -252,6 +274,7 @@ RequestModule = __decorate([
252
274
  },
253
275
  metricsServicesRegistry: METRICS_SERVICES_REGISTRY_TOKEN,
254
276
  envManager: ENV_MANAGER_TOKEN,
277
+ metricsModuleConfig: METRICS_MODULE_CONFIG_TOKEN,
255
278
  },
256
279
  },
257
280
  {
@@ -390,11 +413,17 @@ MetricsModule = __decorate([
390
413
  Module({
391
414
  imports: [RequestModule, InstantMetricsModule],
392
415
  providers: [
393
- {
416
+ provide({
417
+ provide: METRICS_MODULE_CONFIG_TOKEN,
418
+ useValue: {
419
+ enableDnsResolveMetric: false,
420
+ },
421
+ }),
422
+ provide({
394
423
  provide: 'metricsDefaultRegistry',
395
424
  useClass: Registry,
396
- },
397
- {
425
+ }),
426
+ provide({
398
427
  provide: METRICS_MODULE_TOKEN,
399
428
  useFactory: ({ registry }) => {
400
429
  collectDefaultMetrics({ register: registry });
@@ -409,8 +438,8 @@ MetricsModule = __decorate([
409
438
  deps: {
410
439
  registry: 'metricsDefaultRegistry',
411
440
  },
412
- },
413
- {
441
+ }),
442
+ provide({
414
443
  provide: WEB_APP_BEFORE_INIT_TOKEN,
415
444
  useFactory: ({ metrics, app, additionalLabelNamesList, getAdditionalLabelValuesList, httpRequestsDurationBuckets, metricsExcludePaths, registry, }) => {
416
445
  return () => {
@@ -456,8 +485,8 @@ MetricsModule = __decorate([
456
485
  registry: 'metricsDefaultRegistry',
457
486
  },
458
487
  multi: true,
459
- },
460
- {
488
+ }),
489
+ provide({
461
490
  provide: WEB_APP_BEFORE_INIT_TOKEN,
462
491
  useFactory: ({ metrics }) => {
463
492
  return () => {
@@ -468,9 +497,9 @@ MetricsModule = __decorate([
468
497
  metrics: METRICS_MODULE_TOKEN,
469
498
  },
470
499
  multi: true,
471
- },
500
+ }),
472
501
  ],
473
502
  })
474
503
  ], MetricsModule);
475
504
 
476
- export { MetricsModule };
505
+ export { METRICS_MODULE_CONFIG_TOKEN, MetricsModule };
package/lib/server.js CHANGED
@@ -82,18 +82,18 @@ const getUrlAndOptions = (args) => {
82
82
  const urlWOQuery = parsedUrl.origin + parsedUrl.pathname;
83
83
  return [urlWOQuery, options || {}];
84
84
  };
85
- const createRequestWithMetrics = ({ metricsInstances: { requestsTotal, requestsErrors, requestsDuration }, getServiceName, }) => function requestWithMetrics(originalRequest, ...args) {
86
- const req = originalRequest.apply(this, args);
87
- const timerDone = requestsDuration.startTimer();
85
+ const createRequestWithMetrics = ({ metricsInstances: { requestsTotal, requestsErrors, requestsDuration, dnsResolveDuration }, getServiceName, config, }) => function requestWithMetrics(originalRequest, ...args) {
88
86
  const [url, options] = getUrlAndOptions(args);
89
87
  const serviceName = getServiceName(url);
88
+ const req = originalRequest.apply(this, args);
89
+ const timerDone = requestsDuration.startTimer();
90
90
  const labelsValues = {
91
91
  method: options.method || 'unknown',
92
92
  service: serviceName || new URL(url).origin || 'unknown',
93
93
  status: 'unknown',
94
94
  };
95
95
  req.on('response', (res) => {
96
- labelsValues.status = res.statusCode;
96
+ labelsValues.status = res.statusCode.toString();
97
97
  if (res.statusCode >= 400) {
98
98
  requestsErrors.inc(labelsValues);
99
99
  }
@@ -108,10 +108,18 @@ const createRequestWithMetrics = ({ metricsInstances: { requestsTotal, requestsE
108
108
  requestsErrors.inc(labelsValues);
109
109
  timerDone(labelsValues);
110
110
  });
111
+ if (config.enableDnsResolveMetric) {
112
+ req.on('socket', (socket) => {
113
+ const dnsTimerDone = dnsResolveDuration.startTimer();
114
+ socket.on('lookup', () => {
115
+ dnsTimerDone({ service: labelsValues.service });
116
+ });
117
+ });
118
+ }
111
119
  return req;
112
120
  };
113
121
 
114
- const initRequestsMetrics = ({ metrics, getServiceName, http, https, createRequestWithMetrics, }) => {
122
+ const initRequestsMetrics = ({ metrics, getServiceName, http, https, createRequestWithMetrics, config, }) => {
115
123
  const metricsInstances = {
116
124
  requestsTotal: metrics.counter({
117
125
  name: 'http_sent_requests_total',
@@ -128,16 +136,21 @@ const initRequestsMetrics = ({ metrics, getServiceName, http, https, createReque
128
136
  help: 'Execution time of the sent requests',
129
137
  labelNames: ['status', 'method', 'service'],
130
138
  }),
139
+ dnsResolveDuration: metrics.histogram({
140
+ name: 'dns_resolve_duration',
141
+ help: 'Time for dns resolve of the outhgoing requests',
142
+ labelNames: ['service'],
143
+ }),
131
144
  };
132
145
  monkeypatch__default["default"]({
133
146
  obj: https,
134
147
  method: 'request',
135
- handler: createRequestWithMetrics({ metricsInstances, getServiceName }),
148
+ handler: createRequestWithMetrics({ metricsInstances, getServiceName, config }),
136
149
  });
137
150
  monkeypatch__default["default"]({
138
151
  obj: http,
139
152
  method: 'request',
140
- handler: createRequestWithMetrics({ metricsInstances, getServiceName }),
153
+ handler: createRequestWithMetrics({ metricsInstances, getServiceName, config }),
141
154
  });
142
155
  };
143
156
 
@@ -240,6 +253,8 @@ class MetricsServicesRegistry {
240
253
  }
241
254
  }
242
255
 
256
+ const METRICS_MODULE_CONFIG_TOKEN = core.createToken('metrics-module-config');
257
+
243
258
  let RequestModule = class RequestModule {
244
259
  };
245
260
  RequestModule = tslib.__decorate([
@@ -248,7 +263,7 @@ RequestModule = tslib.__decorate([
248
263
  {
249
264
  provide: core.commandLineListTokens.init,
250
265
  multi: true,
251
- useFactory: ({ metrics, envManager, metricsServicesRegistry }) => {
266
+ useFactory: ({ metrics, envManager, metricsServicesRegistry, metricsModuleConfig, }) => {
252
267
  if (!metrics) {
253
268
  return noop__default["default"];
254
269
  }
@@ -256,7 +271,14 @@ RequestModule = tslib.__decorate([
256
271
  const env = envManager.getAll();
257
272
  metricsServicesRegistry.registerEnv(env);
258
273
  const getServiceName = metricsServicesRegistry.getServiceName.bind(metricsServicesRegistry);
259
- initRequestsMetrics({ metrics, getServiceName, http: http__default["default"], https: https__default["default"], createRequestWithMetrics });
274
+ initRequestsMetrics({
275
+ metrics,
276
+ getServiceName,
277
+ http: http__default["default"],
278
+ https: https__default["default"],
279
+ createRequestWithMetrics,
280
+ config: metricsModuleConfig,
281
+ });
260
282
  };
261
283
  },
262
284
  deps: {
@@ -266,6 +288,7 @@ RequestModule = tslib.__decorate([
266
288
  },
267
289
  metricsServicesRegistry: tokensMetrics.METRICS_SERVICES_REGISTRY_TOKEN,
268
290
  envManager: moduleCommon.ENV_MANAGER_TOKEN,
291
+ metricsModuleConfig: METRICS_MODULE_CONFIG_TOKEN,
269
292
  },
270
293
  },
271
294
  {
@@ -404,11 +427,17 @@ exports.MetricsModule = tslib.__decorate([
404
427
  core.Module({
405
428
  imports: [RequestModule, InstantMetricsModule],
406
429
  providers: [
407
- {
430
+ core.provide({
431
+ provide: METRICS_MODULE_CONFIG_TOKEN,
432
+ useValue: {
433
+ enableDnsResolveMetric: false,
434
+ },
435
+ }),
436
+ core.provide({
408
437
  provide: 'metricsDefaultRegistry',
409
438
  useClass: promClient.Registry,
410
- },
411
- {
439
+ }),
440
+ core.provide({
412
441
  provide: tokensMetrics.METRICS_MODULE_TOKEN,
413
442
  useFactory: ({ registry }) => {
414
443
  promClient.collectDefaultMetrics({ register: registry });
@@ -423,8 +452,8 @@ exports.MetricsModule = tslib.__decorate([
423
452
  deps: {
424
453
  registry: 'metricsDefaultRegistry',
425
454
  },
426
- },
427
- {
455
+ }),
456
+ core.provide({
428
457
  provide: tokensServer.WEB_APP_BEFORE_INIT_TOKEN,
429
458
  useFactory: ({ metrics, app, additionalLabelNamesList, getAdditionalLabelValuesList, httpRequestsDurationBuckets, metricsExcludePaths, registry, }) => {
430
459
  return () => {
@@ -470,8 +499,8 @@ exports.MetricsModule = tslib.__decorate([
470
499
  registry: 'metricsDefaultRegistry',
471
500
  },
472
501
  multi: true,
473
- },
474
- {
502
+ }),
503
+ core.provide({
475
504
  provide: tokensServer.WEB_APP_BEFORE_INIT_TOKEN,
476
505
  useFactory: ({ metrics }) => {
477
506
  return () => {
@@ -482,7 +511,9 @@ exports.MetricsModule = tslib.__decorate([
482
511
  metrics: tokensMetrics.METRICS_MODULE_TOKEN,
483
512
  },
484
513
  multi: true,
485
- },
514
+ }),
486
515
  ],
487
516
  })
488
517
  ], exports.MetricsModule);
518
+
519
+ exports.METRICS_MODULE_CONFIG_TOKEN = METRICS_MODULE_CONFIG_TOKEN;
@@ -0,0 +1,2 @@
1
+ import type { ModuleConfig } from './request/types';
2
+ export declare const METRICS_MODULE_CONFIG_TOKEN: ModuleConfig;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tramvai/module-metrics",
3
- "version": "1.60.2",
3
+ "version": "1.61.0",
4
4
  "description": "",
5
5
  "browser": "lib/browser.js",
6
6
  "main": "lib/server.js",
@@ -19,13 +19,13 @@
19
19
  "build-for-publish": "true"
20
20
  },
21
21
  "dependencies": {
22
- "@tramvai/core": "1.60.2",
23
- "@tramvai/tokens-server": "1.60.2",
24
- "@tramvai/tokens-metrics": "1.60.2",
25
- "@tramvai/module-common": "1.60.2",
26
- "@tramvai/tokens-http-client": "1.60.2",
27
- "@tramvai/state": "1.60.2",
28
- "@tramvai/papi": "1.60.2",
22
+ "@tramvai/core": "1.61.0",
23
+ "@tramvai/tokens-server": "1.61.0",
24
+ "@tramvai/tokens-metrics": "1.61.0",
25
+ "@tramvai/module-common": "1.61.0",
26
+ "@tramvai/tokens-http-client": "1.61.0",
27
+ "@tramvai/state": "1.61.0",
28
+ "@tramvai/papi": "1.61.0",
29
29
  "@tinkoff/measure-express-requests": "1.4.2",
30
30
  "@tinkoff/monkeypatch": "1.3.3",
31
31
  "@tinkoff/url": "0.7.37",