@promster/metrics 15.5.2 → 15.6.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.
package/dist/index.cjs CHANGED
@@ -43,6 +43,28 @@ const configure = (0, es_toolkit_function.once)((options) => {
43
43
  if (!skipMetricsInEnvironment(options)) prom_client.collectDefaultMetrics(options);
44
44
  });
45
45
  //#endregion
46
+ //#region src/create-metric/create-metric.ts
47
+ const createHistogram = (configuration) => {
48
+ const existingMetric = defaultRegister.getSingleMetric(configuration.name);
49
+ if (existingMetric instanceof prom_client.Histogram) return existingMetric;
50
+ return new prom_client.Histogram(configuration);
51
+ };
52
+ const createCounter = (configuration) => {
53
+ const existingMetric = defaultRegister.getSingleMetric(configuration.name);
54
+ if (existingMetric instanceof prom_client.Counter) return existingMetric;
55
+ return new prom_client.Counter(configuration);
56
+ };
57
+ const createGauge = (configuration) => {
58
+ const existingMetric = defaultRegister.getSingleMetric(configuration.name);
59
+ if (existingMetric instanceof prom_client.Gauge) return existingMetric;
60
+ return new prom_client.Gauge(configuration);
61
+ };
62
+ const createSummary = (configuration) => {
63
+ const existingMetric = defaultRegister.getSingleMetric(configuration.name);
64
+ if (existingMetric instanceof prom_client.Summary) return existingMetric;
65
+ return new prom_client.Summary(configuration);
66
+ };
67
+ //#endregion
46
68
  //#region src/create-gc-metrics/create-gc-metrics.ts
47
69
  const asArray$2 = (maybeArray) => Array.isArray(maybeArray) ? maybeArray : [maybeArray];
48
70
  const defaultOptions$4 = {
@@ -52,7 +74,7 @@ const defaultOptions$4 = {
52
74
  metricNames: { up: ["nodejs_up"] },
53
75
  gcCollectionInterval: 6e3
54
76
  };
55
- const getMetrics$2 = (options) => ({ up: asArray$2(options.metricNames.up).map((nameOfUpMetric) => new prom_client.Gauge({
77
+ const getMetrics$2 = (options) => ({ up: asArray$2(options.metricNames.up).map((nameOfUpMetric) => createGauge({
56
78
  name: `${options.metricPrefix}${nameOfUpMetric}`,
57
79
  help: "1 = nodejs server is up, 0 = nodejs server is not up"
58
80
  })) });
@@ -115,31 +137,31 @@ const defaultOptions$2 = {
115
137
  }
116
138
  };
117
139
  const getMetrics$1 = (options) => ({
118
- graphQlParseDuration: shouldObserveGraphQlParseDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlParseDuration).map((nameOfGraphQlParseDuration) => new prom_client.Histogram({
140
+ graphQlParseDuration: shouldObserveGraphQlParseDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlParseDuration).map((nameOfGraphQlParseDuration) => createHistogram({
119
141
  name: `${options.metricPrefix}${nameOfGraphQlParseDuration}`,
120
142
  help: "The GraphQL request parse time in seconds.",
121
143
  labelNames: defaultLabels$1.concat(options.labels).toSorted(),
122
144
  buckets: options.metricPercentiles?.graphQlParseDuration || defaultGraphQlPercentiles
123
145
  })) : void 0,
124
- graphQlValidationDuration: shouldObserveGraphQlValidationDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlValidationDuration).map((nameOfGraphQlValidationDuration) => new prom_client.Histogram({
146
+ graphQlValidationDuration: shouldObserveGraphQlValidationDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlValidationDuration).map((nameOfGraphQlValidationDuration) => createHistogram({
125
147
  name: `${options.metricPrefix}${nameOfGraphQlValidationDuration}`,
126
148
  help: "The GraphQL request validation time in seconds.",
127
149
  labelNames: defaultLabels$1.concat(options.labels).toSorted(),
128
150
  buckets: options.metricPercentiles?.graphQlValidationDuration || defaultGraphQlPercentiles
129
151
  })) : void 0,
130
- graphQlResolveFieldDuration: shouldObserveGraphQlResolveFieldDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlResolveFieldDuration).map((nameOfGraphQlResolveFieldDuration) => new prom_client.Histogram({
152
+ graphQlResolveFieldDuration: shouldObserveGraphQlResolveFieldDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlResolveFieldDuration).map((nameOfGraphQlResolveFieldDuration) => createHistogram({
131
153
  name: `${options.metricPrefix}${nameOfGraphQlResolveFieldDuration}`,
132
154
  help: "The GraphQL field resolving time in seconds.",
133
155
  labelNames: defaultLabels$1.concat(["field_name"]).concat(options.labels).toSorted(),
134
156
  buckets: options.metricPercentiles?.graphQlResolveFieldDuration || defaultGraphQlPercentiles
135
157
  })) : void 0,
136
- graphQlRequestDuration: shouldObserveGraphQlRequestDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlRequestDuration).map((nameOfGraphQlRequestDuration) => new prom_client.Histogram({
158
+ graphQlRequestDuration: shouldObserveGraphQlRequestDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlRequestDuration).map((nameOfGraphQlRequestDuration) => createHistogram({
137
159
  name: `${options.metricPrefix}${nameOfGraphQlRequestDuration}`,
138
160
  help: "The GraphQL request duration time in seconds.",
139
161
  labelNames: defaultLabels$1.concat(options.labels).toSorted(),
140
162
  buckets: options.metricPercentiles?.graphQlRequestDuration || defaultGraphQlPercentiles
141
163
  })) : void 0,
142
- graphQlErrorsTotal: shouldObserveGraphQlErrorsTotalAsCounter(options) ? asArray$1(options.metricNames.graphQlErrorsTotal).map((nameOfGraphQlErrorsCount) => new prom_client.Counter({
164
+ graphQlErrorsTotal: shouldObserveGraphQlErrorsTotalAsCounter(options) ? asArray$1(options.metricNames.graphQlErrorsTotal).map((nameOfGraphQlErrorsCount) => createCounter({
143
165
  name: `${options.metricPrefix}${nameOfGraphQlErrorsCount}`,
144
166
  help: "Count of errors while parsing, validating, or executing a GraphQL operation.",
145
167
  labelNames: defaultLabels$1.concat(["phase"]).concat(options.labels).toSorted()
@@ -215,13 +237,13 @@ const defaultOptions$1 = {
215
237
  }
216
238
  };
217
239
  const getMetrics = (options) => ({
218
- httpRequestContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(options) ? asArray(options.metricNames.httpRequestContentLengthInBytes).map((nameOfHttpContentLengthMetric) => new prom_client.Histogram({
240
+ httpRequestContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(options) ? asArray(options.metricNames.httpRequestContentLengthInBytes).map((nameOfHttpContentLengthMetric) => createHistogram({
219
241
  name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,
220
242
  help: "The HTTP request content length in bytes.",
221
243
  labelNames: defaultLabels.concat(options.labels).toSorted(),
222
244
  buckets: options.metricBuckets?.httpRequestContentLengthInBytes || defaultHttpContentLengthInBytes
223
245
  })) : void 0,
224
- httpResponseContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(options) ? asArray(options.metricNames.httpResponseContentLengthInBytes).map((nameOfHttpContentLengthMetric) => new prom_client.Histogram({
246
+ httpResponseContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(options) ? asArray(options.metricNames.httpResponseContentLengthInBytes).map((nameOfHttpContentLengthMetric) => createHistogram({
225
247
  name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,
226
248
  help: "The HTTP response content length in bytes.",
227
249
  labelNames: defaultLabels.concat(options.labels).toSorted(),
@@ -229,20 +251,20 @@ const getMetrics = (options) => ({
229
251
  })) : void 0
230
252
  });
231
253
  const getHttpRequestLatencyMetricsInSeconds = (options) => ({
232
- httpRequestDurationPerPercentileInSeconds: shouldObserveHttpRequestsAsSummary(options) ? asArray(options.metricNames.httpRequestDurationPerPercentileInSeconds).map((nameOfHttpRequestDurationPerPercentileInSeconds) => new prom_client.Summary({
254
+ httpRequestDurationPerPercentileInSeconds: shouldObserveHttpRequestsAsSummary(options) ? asArray(options.metricNames.httpRequestDurationPerPercentileInSeconds).map((nameOfHttpRequestDurationPerPercentileInSeconds) => createSummary({
233
255
  name: `${options.metricPrefix}${nameOfHttpRequestDurationPerPercentileInSeconds}`,
234
256
  help: "The HTTP request latencies in seconds.",
235
257
  labelNames: defaultLabels.concat(options.labels).toSorted(),
236
258
  percentiles: options.metricPercentiles?.httpRequestDurationPerPercentileInSeconds || defaultHttpRequestDurationPercentileInSeconds
237
259
  })) : void 0,
238
- httpRequestDurationInSeconds: shouldObserveHttpRequestsAsHistogram(options) ? asArray(options.metricNames.httpRequestDurationInSeconds).map((nameOfHttpRequestDurationInSecondsMetric) => new prom_client.Histogram({
260
+ httpRequestDurationInSeconds: shouldObserveHttpRequestsAsHistogram(options) ? asArray(options.metricNames.httpRequestDurationInSeconds).map((nameOfHttpRequestDurationInSecondsMetric) => createHistogram({
239
261
  name: `${options.metricPrefix}${nameOfHttpRequestDurationInSecondsMetric}`,
240
262
  help: "The HTTP request latencies in seconds.",
241
263
  labelNames: defaultLabels.concat(options.labels).toSorted(),
242
264
  buckets: options.metricBuckets?.httpRequestDurationInSeconds || defaultHttpRequestDurationInSeconds
243
265
  })) : void 0
244
266
  });
245
- const getHttpRequestCounterMetric = (options) => ({ httpRequestsTotal: shouldObserveHttpRequestsAsCounter(options) ? asArray(options.metricNames.httpRequestsTotal).map((nameOfHttpRequestsTotalMetric) => new prom_client.Counter({
267
+ const getHttpRequestCounterMetric = (options) => ({ httpRequestsTotal: shouldObserveHttpRequestsAsCounter(options) ? asArray(options.metricNames.httpRequestsTotal).map((nameOfHttpRequestsTotalMetric) => createCounter({
246
268
  name: `${options.metricPrefix}${nameOfHttpRequestsTotalMetric}`,
247
269
  help: "The total HTTP requests.",
248
270
  labelNames: defaultLabels.concat(options.labels).toSorted()
@@ -364,11 +386,15 @@ Object.defineProperty(exports, "Prometheus", {
364
386
  return prom_client;
365
387
  }
366
388
  });
389
+ exports.createCounter = createCounter;
390
+ exports.createGauge = createGauge;
367
391
  exports.createGcMetrics = createGcMetrics;
368
392
  exports.createGcObserver = createGcObserver;
369
393
  exports.createGraphQlMetrics = createGraphQlMetrics;
394
+ exports.createHistogram = createHistogram;
370
395
  exports.createHttpMetrics = createHttpMetrics;
371
396
  exports.createRequestRecorder = createRequestRecorder;
397
+ exports.createSummary = createSummary;
372
398
  exports.defaultNormalizers = defaultNormalizers;
373
399
  exports.defaultRegister = defaultRegister;
374
400
  exports.endMeasurementFrom = endMeasurementFrom;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["Prometheus","asArray","defaultOptions","getMetrics","Prometheus","defaultOptions","defaultLabels","asArray","defaultOptions","getMetrics","Prometheus","defaultOptions","Prometheus","UrlValueParser","url","#startTime","#endTime"],"sources":["../src/environment/kubernetes.ts","../src/environment/skip-metrics-in-environment.ts","../src/client/client.ts","../src/create-gc-metrics/create-gc-metrics.ts","../src/create-gc-observer/create-gc-observer.ts","../src/create-graphql-metrics/create-graphql-metrics.ts","../src/create-http-metrics/create-http-metrics.ts","../src/end-measurement-from/end-measurement-from.ts","../src/sort-labels/sort-labels.ts","../src/create-request-recorder/create-request-recorder.ts","../src/normalizers/method/method.ts","../src/normalizers/path/path.ts","../src/normalizers/status-code/status-code.ts","../src/normalizers/index.ts","../src/summary/summary.ts","../src/timing/timing.ts"],"sourcesContent":["const isRunningInKubernetes = () =>\n Boolean(process.env.KUBERNETES_SERVICE_HOST);\n\nexport { isRunningInKubernetes };\n","import type { TOptionalPromsterOptions } from '@promster/types';\n\nimport { isRunningInKubernetes } from './kubernetes';\n\ntype TSkipMetricsInEnvironmentOptions = {\n detectKubernetes?: TOptionalPromsterOptions['detectKubernetes'];\n};\n\nconst skipMetricsInEnvironment = (options: TSkipMetricsInEnvironmentOptions) =>\n options.detectKubernetes === true && !isRunningInKubernetes();\n\nexport { skipMetricsInEnvironment };\n","import { once } from 'es-toolkit/function';\nimport type { PrometheusContentType } from 'prom-client';\nimport * as Prometheus from 'prom-client';\n\nimport { skipMetricsInEnvironment } from '../environment';\n\n// NOTE:\n// This is the `globalRegistry` provided by the `prom-client`\n// We could create multiple registries with `new Prometheus.registry()`.\nconst defaultRegister = Prometheus.register;\n\ninterface TClientOptions extends Prometheus.DefaultMetricsCollectorConfiguration<PrometheusContentType> {\n detectKubernetes?: boolean;\n prefix?: string;\n}\n\nconst configure = once((options: TClientOptions) => {\n const shouldSkipMetricsInEnvironment = skipMetricsInEnvironment(options);\n\n if (!shouldSkipMetricsInEnvironment) {\n Prometheus.collectDefaultMetrics(options);\n }\n});\n\nexport { Prometheus, defaultRegister, configure };\n","import type { TDefaultedPromsterOptions, TGcMetrics } from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure, Prometheus } from '../client';\n\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst defaultOptions = {\n getLabelValues: () => ({}),\n labels: [],\n metricPrefix: '',\n metricNames: {\n up: ['nodejs_up'],\n },\n gcCollectionInterval: 6000,\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n up: asArray(options.metricNames.up).map(\n (nameOfUpMetric: string) =>\n new Prometheus.Gauge({\n name: `${options.metricPrefix}${nameOfUpMetric}`,\n help: '1 = nodejs server is up, 0 = nodejs server is not up',\n }),\n ),\n});\n\nconst createGcMetrics = (options: TDefaultedPromsterOptions): TGcMetrics => {\n const defaultedOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n\n configure({\n prefix: defaultedOptions.metricPrefix,\n });\n\n const gcMetrics = getMetrics(defaultedOptions);\n\n return gcMetrics;\n};\n\ncreateGcMetrics.defaultOptions = defaultOptions;\n\nexport { createGcMetrics };\n","import { gcStats } from '@chainsafe/prometheus-gc-stats';\nimport type { TDefaultedPromsterOptions, TGcMetrics } from '@promster/types';\nimport { once } from 'es-toolkit/function';\n\nimport { defaultRegister } from '../client/client';\n\nconst defaultOptions = {\n disableGcMetrics: false,\n};\n\nconst createGcObserver = once(\n (_metrics: TGcMetrics, options: TDefaultedPromsterOptions) => () => {\n gcStats(defaultRegister, {\n collectionInterval: options.gcCollectionInterval,\n prefix: options.metricPrefix,\n });\n },\n);\n\n// @ts-expect-error\ncreateGcObserver.defaultOptions = defaultOptions;\n\nexport { createGcObserver };\n","import type {\n TDefaultedPromsterOptions,\n TGraphQlMetrics,\n} from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure, Prometheus } from '../client';\n\nconst defaultGraphQlPercentiles = [0.5, 0.9, 0.95, 0.98, 0.99];\n\nconst defaultLabels = ['operation_name'];\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst shouldObserveGraphQlParseDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlParseDurationHistogram');\nconst shouldObserveGraphQlValidationDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlValidationDurationHistogram');\nconst shouldObserveGraphQlResolveFieldDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlResolveFieldDurationHistogram');\nconst shouldObserveGraphQlRequestDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlRequestDurationHistogram');\nconst shouldObserveGraphQlErrorsTotalAsCounter = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlErrorsTotal');\n\nconst defaultOptions = {\n getLabelValues: () => ({}),\n labels: [],\n metricPrefix: '',\n metricTypes: [\n 'graphQlParseDurationHistogram',\n 'graphQlValidationDurationHistogram',\n 'graphQlResolveFieldDurationHistogram',\n 'graphQlRequestDurationHistogram',\n 'graphQlErrorsTotal',\n ],\n metricNames: {\n graphQlParseDuration: ['graphql_parse_duration_seconds'],\n graphQlValidationDuration: ['graphql_validation_duration_seconds'],\n graphQlResolveFieldDuration: ['graphql_resolve_field_duration_seconds'],\n graphQlRequestDuration: ['graphql_request_duration_seconds'],\n graphQlErrorsTotal: ['graphql_errors_total'],\n },\n metricPercentiles: {\n graphQlParseDuration: defaultGraphQlPercentiles,\n graphQlValidationDuration: defaultGraphQlPercentiles,\n graphQlResolveFieldDuration: defaultGraphQlPercentiles,\n graphQlRequestDuration: defaultGraphQlPercentiles,\n graphQlErrorsTotal: defaultGraphQlPercentiles,\n },\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n graphQlParseDuration: shouldObserveGraphQlParseDurationAsHistogram(options)\n ? asArray(options.metricNames.graphQlParseDuration).map(\n (nameOfGraphQlParseDuration: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfGraphQlParseDuration}`,\n help: 'The GraphQL request parse time in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricPercentiles?.graphQlParseDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlValidationDuration: shouldObserveGraphQlValidationDurationAsHistogram(\n options,\n )\n ? asArray(options.metricNames.graphQlValidationDuration).map(\n (nameOfGraphQlValidationDuration: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfGraphQlValidationDuration}`,\n help: 'The GraphQL request validation time in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricPercentiles?.graphQlValidationDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlResolveFieldDuration:\n shouldObserveGraphQlResolveFieldDurationAsHistogram(options)\n ? asArray(options.metricNames.graphQlResolveFieldDuration).map(\n (nameOfGraphQlResolveFieldDuration: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfGraphQlResolveFieldDuration}`,\n help: 'The GraphQL field resolving time in seconds.',\n labelNames: defaultLabels\n .concat(['field_name'])\n .concat(options.labels)\n .toSorted(),\n buckets:\n options.metricPercentiles?.graphQlResolveFieldDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlRequestDuration: shouldObserveGraphQlRequestDurationAsHistogram(\n options,\n )\n ? asArray(options.metricNames.graphQlRequestDuration).map(\n (nameOfGraphQlRequestDuration: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfGraphQlRequestDuration}`,\n help: 'The GraphQL request duration time in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricPercentiles?.graphQlRequestDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlErrorsTotal: shouldObserveGraphQlErrorsTotalAsCounter(options)\n ? asArray(options.metricNames.graphQlErrorsTotal).map(\n (nameOfGraphQlErrorsCount: string) =>\n new Prometheus.Counter({\n name: `${options.metricPrefix}${nameOfGraphQlErrorsCount}`,\n help: 'Count of errors while parsing, validating, or executing a GraphQL operation.',\n labelNames: defaultLabels\n .concat(['phase'])\n .concat(options.labels)\n .toSorted(),\n }),\n )\n : undefined,\n});\n\nconst createGraphQlMetrics = (\n options: TDefaultedPromsterOptions,\n): TGraphQlMetrics => {\n const defaultedOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n\n configure({\n prefix: defaultedOptions.metricPrefix,\n });\n\n const metrics = getMetrics(defaultedOptions);\n\n return metrics;\n};\n\ncreateGraphQlMetrics.defaultOptions = defaultOptions;\n\nexport { createGraphQlMetrics };\n","import type { TDefaultedPromsterOptions, THttpMetrics } from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure, Prometheus } from '../client';\n\nconst defaultHttpRequestDurationPercentileInSeconds = [\n 0.5, 0.9, 0.95, 0.98, 0.99,\n];\nconst defaultHttpRequestDurationInSeconds = [\n 0.05, 0.1, 0.3, 0.5, 0.8, 1, 1.5, 2, 3, 10,\n];\nconst defaultHttpContentLengthInBytes = [\n 100000, 200000, 500000, 1000000, 1500000, 2000000, 3000000, 5000000, 10000000,\n];\n\nconst defaultLabels = ['path', 'status_code', 'method'];\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst shouldObserveHttpRequestsAsSummary = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsSummary');\nconst shouldObserveHttpRequestsAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsHistogram');\nconst shouldObserveHttpRequestsAsCounter = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsTotal');\nconst shouldObserveHttpContentLengthAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpContentLengthHistogram');\n\nconst defaultOptions = {\n getLabelValues: () => ({}),\n labels: [],\n metricPrefix: '',\n metricTypes: ['httpRequestsTotal', 'httpRequestsHistogram'],\n metricNames: {\n httpRequestsTotal: ['http_requests_total'],\n httpRequestDurationPerPercentileInSeconds: [\n 'http_request_duration_per_percentile_seconds',\n ],\n httpRequestDurationInSeconds: ['http_request_duration_seconds'],\n httpRequestContentLengthInBytes: ['http_request_content_length_bytes'],\n httpResponseContentLengthInBytes: ['http_response_content_length_bytes'],\n },\n metricBuckets: {\n httpRequestContentLengthInBytes: defaultHttpContentLengthInBytes,\n httpRequestDurationInSeconds: defaultHttpRequestDurationInSeconds,\n },\n metricPercentiles: {\n httpRequestDurationPerPercentileInSeconds:\n defaultHttpRequestDurationPercentileInSeconds,\n httpResponseContentLengthInBytes: defaultHttpContentLengthInBytes,\n },\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n httpRequestContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(\n options,\n )\n ? asArray(options.metricNames.httpRequestContentLengthInBytes).map(\n (nameOfHttpContentLengthMetric: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,\n help: 'The HTTP request content length in bytes.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricBuckets?.httpRequestContentLengthInBytes ||\n defaultHttpContentLengthInBytes,\n }),\n )\n : undefined,\n\n httpResponseContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(\n options,\n )\n ? asArray(options.metricNames.httpResponseContentLengthInBytes).map(\n (nameOfHttpContentLengthMetric: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,\n help: 'The HTTP response content length in bytes.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricBuckets?.httpResponseContentLengthInBytes ||\n defaultHttpContentLengthInBytes,\n }),\n )\n : undefined,\n});\n\nconst getHttpRequestLatencyMetricsInSeconds = (\n options: TDefaultedPromsterOptions,\n) => ({\n httpRequestDurationPerPercentileInSeconds: shouldObserveHttpRequestsAsSummary(\n options,\n )\n ? asArray(\n options.metricNames.httpRequestDurationPerPercentileInSeconds,\n ).map(\n (nameOfHttpRequestDurationPerPercentileInSeconds: string) =>\n new Prometheus.Summary({\n name: `${options.metricPrefix}${nameOfHttpRequestDurationPerPercentileInSeconds}`,\n help: 'The HTTP request latencies in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n percentiles:\n options.metricPercentiles\n ?.httpRequestDurationPerPercentileInSeconds ||\n defaultHttpRequestDurationPercentileInSeconds,\n }),\n )\n : undefined,\n\n httpRequestDurationInSeconds: shouldObserveHttpRequestsAsHistogram(options)\n ? asArray(options.metricNames.httpRequestDurationInSeconds).map(\n (nameOfHttpRequestDurationInSecondsMetric: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfHttpRequestDurationInSecondsMetric}`,\n help: 'The HTTP request latencies in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricBuckets?.httpRequestDurationInSeconds ||\n defaultHttpRequestDurationInSeconds,\n }),\n )\n : undefined,\n});\n\nconst getHttpRequestCounterMetric = (options: TDefaultedPromsterOptions) => ({\n httpRequestsTotal: shouldObserveHttpRequestsAsCounter(options)\n ? asArray(options.metricNames.httpRequestsTotal).map(\n (nameOfHttpRequestsTotalMetric: string) =>\n new Prometheus.Counter({\n name: `${options.metricPrefix}${nameOfHttpRequestsTotalMetric}`,\n help: 'The total HTTP requests.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n }),\n )\n : undefined,\n});\n\nconst createHttpMetrics = (\n options: TDefaultedPromsterOptions,\n): THttpMetrics => {\n const defaultedOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n\n configure({\n prefix: defaultedOptions.metricPrefix,\n });\n\n const metrics = getMetrics(defaultedOptions);\n\n const httpRequestLatencyMetricsInSeconds =\n getHttpRequestLatencyMetricsInSeconds(defaultedOptions);\n const httpRequestCounterMetric =\n getHttpRequestCounterMetric(defaultedOptions);\n\n return Object.assign(\n {},\n metrics,\n httpRequestLatencyMetricsInSeconds,\n httpRequestCounterMetric,\n );\n};\n\ncreateHttpMetrics.defaultOptions = defaultOptions;\n\nexport { createHttpMetrics };\n","const NS_PER_SEC = 1e9;\n\nfunction endMeasurementFrom(start: [number, number]) {\n const [seconds, nanoseconds] = process.hrtime(start);\n\n return {\n durationS: (seconds * NS_PER_SEC + nanoseconds) / NS_PER_SEC,\n };\n}\n\nexport { endMeasurementFrom };\n","import type { TLabelValues } from '@promster/types';\n\nfunction sortLabels(unsortedLabels: TLabelValues): TLabelValues {\n return Object.keys(unsortedLabels)\n .toSorted((a, b) => {\n if (a < b) {\n return -1;\n }\n\n if (a > b) {\n return 1;\n }\n\n return 0;\n })\n .reduce<TLabelValues>((sortedLabels, labelName) => {\n sortedLabels[labelName] = unsortedLabels[labelName];\n return sortedLabels;\n }, {});\n}\n\nexport { sortLabels };\n","import type {\n TDefaultedPromsterOptions,\n THttpMetrics,\n TLabelValues,\n TOptionalPromsterOptions,\n} from '@promster/types';\nimport merge from 'merge-options';\n\nimport { endMeasurementFrom } from '../end-measurement-from';\nimport { skipMetricsInEnvironment } from '../environment';\nimport { sortLabels } from '../sort-labels';\nimport type { Timing } from '../timing';\n\ntype TRecordingOptions = {\n labels: TLabelValues;\n requestContentLength?: number;\n responseContentLength?: number;\n};\n\ntype TLegacyTiming = [number, number];\nexport type TRequestRecorder = (\n _timing: Timing | TLegacyTiming,\n _recordingOptions: TRecordingOptions,\n) => void;\n\nconst defaultOptions: TOptionalPromsterOptions = {\n detectKubernetes: false,\n};\n\nfunction isTiming(timing: Timing | TLegacyTiming): timing is Timing {\n return !Array.isArray(timing);\n}\n\nconst createRequestRecorder = (\n metrics: THttpMetrics,\n options: TOptionalPromsterOptions = defaultOptions,\n): TRequestRecorder => {\n const defaultedRecorderOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n const shouldSkipMetricsByEnvironment = skipMetricsInEnvironment(\n defaultedRecorderOptions,\n );\n\n return (\n timing: Timing | TLegacyTiming,\n recordingOptions: TRecordingOptions,\n ) => {\n const durationS = isTiming(timing)\n ? timing.end().value().seconds\n : endMeasurementFrom(timing).durationS;\n\n const labels = sortLabels(recordingOptions.labels);\n\n if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n if (metrics.httpRequestDurationInSeconds) {\n for (const httpRequestDurationInSecondsMetricType of metrics.httpRequestDurationInSeconds) {\n httpRequestDurationInSecondsMetricType.observe(labels, durationS);\n }\n }\n }\n\n if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n if (metrics.httpRequestDurationPerPercentileInSeconds) {\n for (const httpRequestDurationPerPercentileInSecondsMetricType of metrics.httpRequestDurationPerPercentileInSeconds) {\n httpRequestDurationPerPercentileInSecondsMetricType.observe(\n labels,\n durationS,\n );\n }\n }\n }\n\n if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n if (metrics.httpRequestsTotal) {\n for (const httpRequestsTotalMetricType of metrics.httpRequestsTotal) {\n httpRequestsTotalMetricType.inc(labels);\n }\n }\n }\n\n if (recordingOptions.requestContentLength) {\n if (metrics.httpRequestContentLengthInBytes) {\n for (const httpRequestContentLengthInBytesMetricType of metrics.httpRequestContentLengthInBytes) {\n httpRequestContentLengthInBytesMetricType.observe(\n labels,\n recordingOptions.requestContentLength,\n );\n }\n }\n }\n\n if (recordingOptions.responseContentLength) {\n if (metrics.httpResponseContentLengthInBytes) {\n for (const httpResponseContentLengthInBytesMetricType of metrics.httpResponseContentLengthInBytes) {\n httpResponseContentLengthInBytesMetricType.observe(\n labels,\n recordingOptions.responseContentLength,\n );\n }\n }\n }\n };\n};\n\ncreateRequestRecorder.defaultOptions = defaultOptions;\n\nexport { createRequestRecorder, sortLabels, endMeasurementFrom };\n","const normalizeMethod = (method: string): string => method.toLowerCase();\n\nexport { normalizeMethod };\n","import url from 'node:url';\n\nimport UrlValueParser from 'url-value-parser';\n\nconst urlValueParser = new UrlValueParser();\n\nconst normalizePath = (path: string): string => {\n const parsedPathname = url.parse(path).pathname;\n\n if (!parsedPathname) {\n return '';\n }\n\n return urlValueParser.replacePathValues(parsedPathname, '#val');\n};\n\nexport { normalizePath };\n","const normalizeStatusCode = (statusCode: number): number => statusCode;\n\nexport { normalizeStatusCode };\n","import { normalizeMethod } from './method';\nimport { normalizePath } from './path';\nimport { normalizeStatusCode } from './status-code';\n\nconst defaultNormalizers = {\n normalizeStatusCode,\n normalizePath,\n normalizeMethod,\n};\n\nexport {\n normalizeStatusCode,\n normalizePath,\n normalizeMethod,\n defaultNormalizers,\n};\n","import { defaultRegister } from '../client';\n\nconst getSummary = async () => defaultRegister.metrics();\nconst getContentType = () => defaultRegister.contentType;\n\nexport { getSummary, getContentType };\n","class Timing {\n static NS_PER_SEC = BigInt(1e9);\n\n #startTime?: bigint;\n #endTime?: bigint;\n\n constructor() {\n this.reset();\n }\n\n value() {\n const startTime = this.#startTime;\n const endTime = this.#endTime;\n\n if (!endTime || !startTime) {\n return { seconds: undefined };\n }\n\n return { seconds: Number(endTime - startTime) / Number(Timing.NS_PER_SEC) };\n }\n\n reset() {\n this.#startTime = process.hrtime.bigint();\n this.#endTime = undefined;\n\n return this;\n }\n\n end() {\n this.#endTime = process.hrtime.bigint();\n\n return this;\n }\n}\n\nconst timing = {\n start() {\n return new Timing();\n },\n};\n\nexport default timing;\nexport { Timing };\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["Prometheus","Prometheus","asArray","defaultOptions","getMetrics","defaultOptions","defaultLabels","asArray","defaultOptions","getMetrics","defaultOptions","UrlValueParser","url","#startTime","#endTime"],"sources":["../src/environment/kubernetes.ts","../src/environment/skip-metrics-in-environment.ts","../src/client/client.ts","../src/create-metric/create-metric.ts","../src/create-gc-metrics/create-gc-metrics.ts","../src/create-gc-observer/create-gc-observer.ts","../src/create-graphql-metrics/create-graphql-metrics.ts","../src/create-http-metrics/create-http-metrics.ts","../src/end-measurement-from/end-measurement-from.ts","../src/sort-labels/sort-labels.ts","../src/create-request-recorder/create-request-recorder.ts","../src/normalizers/method/method.ts","../src/normalizers/path/path.ts","../src/normalizers/status-code/status-code.ts","../src/normalizers/index.ts","../src/summary/summary.ts","../src/timing/timing.ts"],"sourcesContent":["const isRunningInKubernetes = () =>\n Boolean(process.env.KUBERNETES_SERVICE_HOST);\n\nexport { isRunningInKubernetes };\n","import type { TOptionalPromsterOptions } from '@promster/types';\n\nimport { isRunningInKubernetes } from './kubernetes';\n\ntype TSkipMetricsInEnvironmentOptions = {\n detectKubernetes?: TOptionalPromsterOptions['detectKubernetes'];\n};\n\nconst skipMetricsInEnvironment = (options: TSkipMetricsInEnvironmentOptions) =>\n options.detectKubernetes === true && !isRunningInKubernetes();\n\nexport { skipMetricsInEnvironment };\n","import { once } from 'es-toolkit/function';\nimport type { PrometheusContentType } from 'prom-client';\nimport * as Prometheus from 'prom-client';\n\nimport { skipMetricsInEnvironment } from '../environment';\n\n// NOTE:\n// This is the `globalRegistry` provided by the `prom-client`\n// We could create multiple registries with `new Prometheus.registry()`.\nconst defaultRegister = Prometheus.register;\n\ninterface TClientOptions extends Prometheus.DefaultMetricsCollectorConfiguration<PrometheusContentType> {\n detectKubernetes?: boolean;\n prefix?: string;\n}\n\nconst configure = once((options: TClientOptions) => {\n const shouldSkipMetricsInEnvironment = skipMetricsInEnvironment(options);\n\n if (!shouldSkipMetricsInEnvironment) {\n Prometheus.collectDefaultMetrics(options);\n }\n});\n\nexport { Prometheus, defaultRegister, configure };\n","import type {\n Counter,\n CounterConfiguration,\n Gauge,\n GaugeConfiguration,\n Histogram,\n HistogramConfiguration,\n Summary,\n SummaryConfiguration,\n} from 'prom-client';\n\nimport { defaultRegister, Prometheus } from '../client';\n\n// NOTE:\n// All metrics share the `prom-client` global registry (see `../client`).\n// Registering a metric whose name already exists throws. This happens when\n// a metric-defining module is evaluated more than once, for instance when a\n// bundler or package manager ships duplicate physical copies of a package.\n// These helpers make registration idempotent: an already registered metric\n// of the same name and type is returned instead of re-created. The first\n// registration wins, so a later differing configuration is ignored. A name\n// already taken by a different metric type falls through to `prom-client`,\n// which rejects it with the clear \"already registered\" error.\n\nconst createHistogram = (\n configuration: HistogramConfiguration<string>,\n): Histogram<string> => {\n const existingMetric = defaultRegister.getSingleMetric(configuration.name);\n\n if (existingMetric instanceof Prometheus.Histogram) {\n return existingMetric;\n }\n\n return new Prometheus.Histogram(configuration);\n};\n\nconst createCounter = (\n configuration: CounterConfiguration<string>,\n): Counter<string> => {\n const existingMetric = defaultRegister.getSingleMetric(configuration.name);\n\n if (existingMetric instanceof Prometheus.Counter) {\n return existingMetric;\n }\n\n return new Prometheus.Counter(configuration);\n};\n\nconst createGauge = (\n configuration: GaugeConfiguration<string>,\n): Gauge<string> => {\n const existingMetric = defaultRegister.getSingleMetric(configuration.name);\n\n if (existingMetric instanceof Prometheus.Gauge) {\n return existingMetric;\n }\n\n return new Prometheus.Gauge(configuration);\n};\n\nconst createSummary = (\n configuration: SummaryConfiguration<string>,\n): Summary<string> => {\n const existingMetric = defaultRegister.getSingleMetric(configuration.name);\n\n if (existingMetric instanceof Prometheus.Summary) {\n return existingMetric;\n }\n\n return new Prometheus.Summary(configuration);\n};\n\nexport { createCounter, createGauge, createHistogram, createSummary };\n","import type { TDefaultedPromsterOptions, TGcMetrics } from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure } from '../client';\nimport { createGauge } from '../create-metric';\n\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst defaultOptions = {\n getLabelValues: () => ({}),\n labels: [],\n metricPrefix: '',\n metricNames: {\n up: ['nodejs_up'],\n },\n gcCollectionInterval: 6000,\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n up: asArray(options.metricNames.up).map((nameOfUpMetric: string) =>\n createGauge({\n name: `${options.metricPrefix}${nameOfUpMetric}`,\n help: '1 = nodejs server is up, 0 = nodejs server is not up',\n }),\n ),\n});\n\nconst createGcMetrics = (options: TDefaultedPromsterOptions): TGcMetrics => {\n const defaultedOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n\n configure({\n prefix: defaultedOptions.metricPrefix,\n });\n\n const gcMetrics = getMetrics(defaultedOptions);\n\n return gcMetrics;\n};\n\ncreateGcMetrics.defaultOptions = defaultOptions;\n\nexport { createGcMetrics };\n","import { gcStats } from '@chainsafe/prometheus-gc-stats';\nimport type { TDefaultedPromsterOptions, TGcMetrics } from '@promster/types';\nimport { once } from 'es-toolkit/function';\n\nimport { defaultRegister } from '../client/client';\n\nconst defaultOptions = {\n disableGcMetrics: false,\n};\n\nconst createGcObserver = once(\n (_metrics: TGcMetrics, options: TDefaultedPromsterOptions) => () => {\n gcStats(defaultRegister, {\n collectionInterval: options.gcCollectionInterval,\n prefix: options.metricPrefix,\n });\n },\n);\n\n// @ts-expect-error\ncreateGcObserver.defaultOptions = defaultOptions;\n\nexport { createGcObserver };\n","import type {\n TDefaultedPromsterOptions,\n TGraphQlMetrics,\n} from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure } from '../client';\nimport { createCounter, createHistogram } from '../create-metric';\n\nconst defaultGraphQlPercentiles = [0.5, 0.9, 0.95, 0.98, 0.99];\n\nconst defaultLabels = ['operation_name'];\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst shouldObserveGraphQlParseDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlParseDurationHistogram');\nconst shouldObserveGraphQlValidationDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlValidationDurationHistogram');\nconst shouldObserveGraphQlResolveFieldDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlResolveFieldDurationHistogram');\nconst shouldObserveGraphQlRequestDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlRequestDurationHistogram');\nconst shouldObserveGraphQlErrorsTotalAsCounter = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlErrorsTotal');\n\nconst defaultOptions = {\n getLabelValues: () => ({}),\n labels: [],\n metricPrefix: '',\n metricTypes: [\n 'graphQlParseDurationHistogram',\n 'graphQlValidationDurationHistogram',\n 'graphQlResolveFieldDurationHistogram',\n 'graphQlRequestDurationHistogram',\n 'graphQlErrorsTotal',\n ],\n metricNames: {\n graphQlParseDuration: ['graphql_parse_duration_seconds'],\n graphQlValidationDuration: ['graphql_validation_duration_seconds'],\n graphQlResolveFieldDuration: ['graphql_resolve_field_duration_seconds'],\n graphQlRequestDuration: ['graphql_request_duration_seconds'],\n graphQlErrorsTotal: ['graphql_errors_total'],\n },\n metricPercentiles: {\n graphQlParseDuration: defaultGraphQlPercentiles,\n graphQlValidationDuration: defaultGraphQlPercentiles,\n graphQlResolveFieldDuration: defaultGraphQlPercentiles,\n graphQlRequestDuration: defaultGraphQlPercentiles,\n graphQlErrorsTotal: defaultGraphQlPercentiles,\n },\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n graphQlParseDuration: shouldObserveGraphQlParseDurationAsHistogram(options)\n ? asArray(options.metricNames.graphQlParseDuration).map(\n (nameOfGraphQlParseDuration: string) =>\n createHistogram({\n name: `${options.metricPrefix}${nameOfGraphQlParseDuration}`,\n help: 'The GraphQL request parse time in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricPercentiles?.graphQlParseDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlValidationDuration: shouldObserveGraphQlValidationDurationAsHistogram(\n options,\n )\n ? asArray(options.metricNames.graphQlValidationDuration).map(\n (nameOfGraphQlValidationDuration: string) =>\n createHistogram({\n name: `${options.metricPrefix}${nameOfGraphQlValidationDuration}`,\n help: 'The GraphQL request validation time in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricPercentiles?.graphQlValidationDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlResolveFieldDuration:\n shouldObserveGraphQlResolveFieldDurationAsHistogram(options)\n ? asArray(options.metricNames.graphQlResolveFieldDuration).map(\n (nameOfGraphQlResolveFieldDuration: string) =>\n createHistogram({\n name: `${options.metricPrefix}${nameOfGraphQlResolveFieldDuration}`,\n help: 'The GraphQL field resolving time in seconds.',\n labelNames: defaultLabels\n .concat(['field_name'])\n .concat(options.labels)\n .toSorted(),\n buckets:\n options.metricPercentiles?.graphQlResolveFieldDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlRequestDuration: shouldObserveGraphQlRequestDurationAsHistogram(\n options,\n )\n ? asArray(options.metricNames.graphQlRequestDuration).map(\n (nameOfGraphQlRequestDuration: string) =>\n createHistogram({\n name: `${options.metricPrefix}${nameOfGraphQlRequestDuration}`,\n help: 'The GraphQL request duration time in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricPercentiles?.graphQlRequestDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlErrorsTotal: shouldObserveGraphQlErrorsTotalAsCounter(options)\n ? asArray(options.metricNames.graphQlErrorsTotal).map(\n (nameOfGraphQlErrorsCount: string) =>\n createCounter({\n name: `${options.metricPrefix}${nameOfGraphQlErrorsCount}`,\n help: 'Count of errors while parsing, validating, or executing a GraphQL operation.',\n labelNames: defaultLabels\n .concat(['phase'])\n .concat(options.labels)\n .toSorted(),\n }),\n )\n : undefined,\n});\n\nconst createGraphQlMetrics = (\n options: TDefaultedPromsterOptions,\n): TGraphQlMetrics => {\n const defaultedOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n\n configure({\n prefix: defaultedOptions.metricPrefix,\n });\n\n const metrics = getMetrics(defaultedOptions);\n\n return metrics;\n};\n\ncreateGraphQlMetrics.defaultOptions = defaultOptions;\n\nexport { createGraphQlMetrics };\n","import type { TDefaultedPromsterOptions, THttpMetrics } from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure } from '../client';\nimport {\n createCounter,\n createHistogram,\n createSummary,\n} from '../create-metric';\n\nconst defaultHttpRequestDurationPercentileInSeconds = [\n 0.5, 0.9, 0.95, 0.98, 0.99,\n];\nconst defaultHttpRequestDurationInSeconds = [\n 0.05, 0.1, 0.3, 0.5, 0.8, 1, 1.5, 2, 3, 10,\n];\nconst defaultHttpContentLengthInBytes = [\n 100000, 200000, 500000, 1000000, 1500000, 2000000, 3000000, 5000000, 10000000,\n];\n\nconst defaultLabels = ['path', 'status_code', 'method'];\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst shouldObserveHttpRequestsAsSummary = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsSummary');\nconst shouldObserveHttpRequestsAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsHistogram');\nconst shouldObserveHttpRequestsAsCounter = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsTotal');\nconst shouldObserveHttpContentLengthAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpContentLengthHistogram');\n\nconst defaultOptions = {\n getLabelValues: () => ({}),\n labels: [],\n metricPrefix: '',\n metricTypes: ['httpRequestsTotal', 'httpRequestsHistogram'],\n metricNames: {\n httpRequestsTotal: ['http_requests_total'],\n httpRequestDurationPerPercentileInSeconds: [\n 'http_request_duration_per_percentile_seconds',\n ],\n httpRequestDurationInSeconds: ['http_request_duration_seconds'],\n httpRequestContentLengthInBytes: ['http_request_content_length_bytes'],\n httpResponseContentLengthInBytes: ['http_response_content_length_bytes'],\n },\n metricBuckets: {\n httpRequestContentLengthInBytes: defaultHttpContentLengthInBytes,\n httpRequestDurationInSeconds: defaultHttpRequestDurationInSeconds,\n },\n metricPercentiles: {\n httpRequestDurationPerPercentileInSeconds:\n defaultHttpRequestDurationPercentileInSeconds,\n httpResponseContentLengthInBytes: defaultHttpContentLengthInBytes,\n },\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n httpRequestContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(\n options,\n )\n ? asArray(options.metricNames.httpRequestContentLengthInBytes).map(\n (nameOfHttpContentLengthMetric: string) =>\n createHistogram({\n name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,\n help: 'The HTTP request content length in bytes.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricBuckets?.httpRequestContentLengthInBytes ||\n defaultHttpContentLengthInBytes,\n }),\n )\n : undefined,\n\n httpResponseContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(\n options,\n )\n ? asArray(options.metricNames.httpResponseContentLengthInBytes).map(\n (nameOfHttpContentLengthMetric: string) =>\n createHistogram({\n name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,\n help: 'The HTTP response content length in bytes.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricBuckets?.httpResponseContentLengthInBytes ||\n defaultHttpContentLengthInBytes,\n }),\n )\n : undefined,\n});\n\nconst getHttpRequestLatencyMetricsInSeconds = (\n options: TDefaultedPromsterOptions,\n) => ({\n httpRequestDurationPerPercentileInSeconds: shouldObserveHttpRequestsAsSummary(\n options,\n )\n ? asArray(\n options.metricNames.httpRequestDurationPerPercentileInSeconds,\n ).map((nameOfHttpRequestDurationPerPercentileInSeconds: string) =>\n createSummary({\n name: `${options.metricPrefix}${nameOfHttpRequestDurationPerPercentileInSeconds}`,\n help: 'The HTTP request latencies in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n percentiles:\n options.metricPercentiles\n ?.httpRequestDurationPerPercentileInSeconds ||\n defaultHttpRequestDurationPercentileInSeconds,\n }),\n )\n : undefined,\n\n httpRequestDurationInSeconds: shouldObserveHttpRequestsAsHistogram(options)\n ? asArray(options.metricNames.httpRequestDurationInSeconds).map(\n (nameOfHttpRequestDurationInSecondsMetric: string) =>\n createHistogram({\n name: `${options.metricPrefix}${nameOfHttpRequestDurationInSecondsMetric}`,\n help: 'The HTTP request latencies in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricBuckets?.httpRequestDurationInSeconds ||\n defaultHttpRequestDurationInSeconds,\n }),\n )\n : undefined,\n});\n\nconst getHttpRequestCounterMetric = (options: TDefaultedPromsterOptions) => ({\n httpRequestsTotal: shouldObserveHttpRequestsAsCounter(options)\n ? asArray(options.metricNames.httpRequestsTotal).map(\n (nameOfHttpRequestsTotalMetric: string) =>\n createCounter({\n name: `${options.metricPrefix}${nameOfHttpRequestsTotalMetric}`,\n help: 'The total HTTP requests.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n }),\n )\n : undefined,\n});\n\nconst createHttpMetrics = (\n options: TDefaultedPromsterOptions,\n): THttpMetrics => {\n const defaultedOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n\n configure({\n prefix: defaultedOptions.metricPrefix,\n });\n\n const metrics = getMetrics(defaultedOptions);\n\n const httpRequestLatencyMetricsInSeconds =\n getHttpRequestLatencyMetricsInSeconds(defaultedOptions);\n const httpRequestCounterMetric =\n getHttpRequestCounterMetric(defaultedOptions);\n\n return Object.assign(\n {},\n metrics,\n httpRequestLatencyMetricsInSeconds,\n httpRequestCounterMetric,\n );\n};\n\ncreateHttpMetrics.defaultOptions = defaultOptions;\n\nexport { createHttpMetrics };\n","const NS_PER_SEC = 1e9;\n\nfunction endMeasurementFrom(start: [number, number]) {\n const [seconds, nanoseconds] = process.hrtime(start);\n\n return {\n durationS: (seconds * NS_PER_SEC + nanoseconds) / NS_PER_SEC,\n };\n}\n\nexport { endMeasurementFrom };\n","import type { TLabelValues } from '@promster/types';\n\nfunction sortLabels(unsortedLabels: TLabelValues): TLabelValues {\n return Object.keys(unsortedLabels)\n .toSorted((a, b) => {\n if (a < b) {\n return -1;\n }\n\n if (a > b) {\n return 1;\n }\n\n return 0;\n })\n .reduce<TLabelValues>((sortedLabels, labelName) => {\n sortedLabels[labelName] = unsortedLabels[labelName];\n return sortedLabels;\n }, {});\n}\n\nexport { sortLabels };\n","import type {\n TDefaultedPromsterOptions,\n THttpMetrics,\n TLabelValues,\n TOptionalPromsterOptions,\n} from '@promster/types';\nimport merge from 'merge-options';\n\nimport { endMeasurementFrom } from '../end-measurement-from';\nimport { skipMetricsInEnvironment } from '../environment';\nimport { sortLabels } from '../sort-labels';\nimport type { Timing } from '../timing';\n\ntype TRecordingOptions = {\n labels: TLabelValues;\n requestContentLength?: number;\n responseContentLength?: number;\n};\n\ntype TLegacyTiming = [number, number];\nexport type TRequestRecorder = (\n _timing: Timing | TLegacyTiming,\n _recordingOptions: TRecordingOptions,\n) => void;\n\nconst defaultOptions: TOptionalPromsterOptions = {\n detectKubernetes: false,\n};\n\nfunction isTiming(timing: Timing | TLegacyTiming): timing is Timing {\n return !Array.isArray(timing);\n}\n\nconst createRequestRecorder = (\n metrics: THttpMetrics,\n options: TOptionalPromsterOptions = defaultOptions,\n): TRequestRecorder => {\n const defaultedRecorderOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n const shouldSkipMetricsByEnvironment = skipMetricsInEnvironment(\n defaultedRecorderOptions,\n );\n\n return (\n timing: Timing | TLegacyTiming,\n recordingOptions: TRecordingOptions,\n ) => {\n const durationS = isTiming(timing)\n ? timing.end().value().seconds\n : endMeasurementFrom(timing).durationS;\n\n const labels = sortLabels(recordingOptions.labels);\n\n if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n if (metrics.httpRequestDurationInSeconds) {\n for (const httpRequestDurationInSecondsMetricType of metrics.httpRequestDurationInSeconds) {\n httpRequestDurationInSecondsMetricType.observe(labels, durationS);\n }\n }\n }\n\n if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n if (metrics.httpRequestDurationPerPercentileInSeconds) {\n for (const httpRequestDurationPerPercentileInSecondsMetricType of metrics.httpRequestDurationPerPercentileInSeconds) {\n httpRequestDurationPerPercentileInSecondsMetricType.observe(\n labels,\n durationS,\n );\n }\n }\n }\n\n if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n if (metrics.httpRequestsTotal) {\n for (const httpRequestsTotalMetricType of metrics.httpRequestsTotal) {\n httpRequestsTotalMetricType.inc(labels);\n }\n }\n }\n\n if (recordingOptions.requestContentLength) {\n if (metrics.httpRequestContentLengthInBytes) {\n for (const httpRequestContentLengthInBytesMetricType of metrics.httpRequestContentLengthInBytes) {\n httpRequestContentLengthInBytesMetricType.observe(\n labels,\n recordingOptions.requestContentLength,\n );\n }\n }\n }\n\n if (recordingOptions.responseContentLength) {\n if (metrics.httpResponseContentLengthInBytes) {\n for (const httpResponseContentLengthInBytesMetricType of metrics.httpResponseContentLengthInBytes) {\n httpResponseContentLengthInBytesMetricType.observe(\n labels,\n recordingOptions.responseContentLength,\n );\n }\n }\n }\n };\n};\n\ncreateRequestRecorder.defaultOptions = defaultOptions;\n\nexport { createRequestRecorder, sortLabels, endMeasurementFrom };\n","const normalizeMethod = (method: string): string => method.toLowerCase();\n\nexport { normalizeMethod };\n","import url from 'node:url';\n\nimport UrlValueParser from 'url-value-parser';\n\nconst urlValueParser = new UrlValueParser();\n\nconst normalizePath = (path: string): string => {\n const parsedPathname = url.parse(path).pathname;\n\n if (!parsedPathname) {\n return '';\n }\n\n return urlValueParser.replacePathValues(parsedPathname, '#val');\n};\n\nexport { normalizePath };\n","const normalizeStatusCode = (statusCode: number): number => statusCode;\n\nexport { normalizeStatusCode };\n","import { normalizeMethod } from './method';\nimport { normalizePath } from './path';\nimport { normalizeStatusCode } from './status-code';\n\nconst defaultNormalizers = {\n normalizeStatusCode,\n normalizePath,\n normalizeMethod,\n};\n\nexport {\n normalizeStatusCode,\n normalizePath,\n normalizeMethod,\n defaultNormalizers,\n};\n","import { defaultRegister } from '../client';\n\nconst getSummary = async () => defaultRegister.metrics();\nconst getContentType = () => defaultRegister.contentType;\n\nexport { getSummary, getContentType };\n","class Timing {\n static NS_PER_SEC = BigInt(1e9);\n\n #startTime?: bigint;\n #endTime?: bigint;\n\n constructor() {\n this.reset();\n }\n\n value() {\n const startTime = this.#startTime;\n const endTime = this.#endTime;\n\n if (!endTime || !startTime) {\n return { seconds: undefined };\n }\n\n return { seconds: Number(endTime - startTime) / Number(Timing.NS_PER_SEC) };\n }\n\n reset() {\n this.#startTime = process.hrtime.bigint();\n this.#endTime = undefined;\n\n return this;\n }\n\n end() {\n this.#endTime = process.hrtime.bigint();\n\n return this;\n }\n}\n\nconst timing = {\n start() {\n return new Timing();\n },\n};\n\nexport default timing;\nexport { Timing };\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -1,77 +1,86 @@
1
1
  import * as Prometheus from "prom-client";
2
+ import { Counter, CounterConfiguration, Gauge, GaugeConfiguration, Histogram, HistogramConfiguration, Summary, SummaryConfiguration } from "prom-client";
2
3
  import { TDefaultedPromsterOptions, TGcMetrics, TGraphQlMetrics, THttpMetrics, TLabelValues, TOptionalPromsterOptions } from "@promster/types";
3
4
  export type * from "@promster/types";
4
-
5
5
  //#region src/client/client.d.ts
6
6
  declare const defaultRegister: Prometheus.Registry<"text/plain; version=0.0.4; charset=utf-8">;
7
7
  //#endregion
8
8
  //#region src/create-gc-metrics/create-gc-metrics.d.ts
9
- declare const createGcMetrics: {
10
- (options: TDefaultedPromsterOptions): TGcMetrics;
11
- defaultOptions: {
12
- getLabelValues: () => {};
13
- labels: never[];
14
- metricPrefix: string;
15
- metricNames: {
16
- up: string[];
17
- };
18
- gcCollectionInterval: number;
9
+ declare const defaultOptions$3: {
10
+ getLabelValues: () => {};
11
+ labels: never[];
12
+ metricPrefix: string;
13
+ metricNames: {
14
+ up: string[];
19
15
  };
16
+ gcCollectionInterval: number;
20
17
  };
18
+ declare function createGcMetrics(options: TDefaultedPromsterOptions): TGcMetrics;
19
+ declare namespace createGcMetrics {
20
+ export { defaultOptions$3 as defaultOptions };
21
+ }
21
22
  //#endregion
22
23
  //#region src/create-gc-observer/create-gc-observer.d.ts
23
24
  declare const createGcObserver: (_metrics: TGcMetrics, options: TDefaultedPromsterOptions) => () => void;
24
25
  //#endregion
25
26
  //#region src/create-graphql-metrics/create-graphql-metrics.d.ts
26
- declare const createGraphQlMetrics: {
27
- (options: TDefaultedPromsterOptions): TGraphQlMetrics;
28
- defaultOptions: {
29
- getLabelValues: () => {};
30
- labels: never[];
31
- metricPrefix: string;
32
- metricTypes: string[];
33
- metricNames: {
34
- graphQlParseDuration: string[];
35
- graphQlValidationDuration: string[];
36
- graphQlResolveFieldDuration: string[];
37
- graphQlRequestDuration: string[];
38
- graphQlErrorsTotal: string[];
39
- };
40
- metricPercentiles: {
41
- graphQlParseDuration: number[];
42
- graphQlValidationDuration: number[];
43
- graphQlResolveFieldDuration: number[];
44
- graphQlRequestDuration: number[];
45
- graphQlErrorsTotal: number[];
46
- };
27
+ declare const defaultOptions$2: {
28
+ getLabelValues: () => {};
29
+ labels: never[];
30
+ metricPrefix: string;
31
+ metricTypes: string[];
32
+ metricNames: {
33
+ graphQlParseDuration: string[];
34
+ graphQlValidationDuration: string[];
35
+ graphQlResolveFieldDuration: string[];
36
+ graphQlRequestDuration: string[];
37
+ graphQlErrorsTotal: string[];
38
+ };
39
+ metricPercentiles: {
40
+ graphQlParseDuration: number[];
41
+ graphQlValidationDuration: number[];
42
+ graphQlResolveFieldDuration: number[];
43
+ graphQlRequestDuration: number[];
44
+ graphQlErrorsTotal: number[];
47
45
  };
48
46
  };
47
+ declare function createGraphQlMetrics(options: TDefaultedPromsterOptions): TGraphQlMetrics;
48
+ declare namespace createGraphQlMetrics {
49
+ export { defaultOptions$2 as defaultOptions };
50
+ }
49
51
  //#endregion
50
52
  //#region src/create-http-metrics/create-http-metrics.d.ts
51
- declare const createHttpMetrics: {
52
- (options: TDefaultedPromsterOptions): THttpMetrics;
53
- defaultOptions: {
54
- getLabelValues: () => {};
55
- labels: never[];
56
- metricPrefix: string;
57
- metricTypes: string[];
58
- metricNames: {
59
- httpRequestsTotal: string[];
60
- httpRequestDurationPerPercentileInSeconds: string[];
61
- httpRequestDurationInSeconds: string[];
62
- httpRequestContentLengthInBytes: string[];
63
- httpResponseContentLengthInBytes: string[];
64
- };
65
- metricBuckets: {
66
- httpRequestContentLengthInBytes: number[];
67
- httpRequestDurationInSeconds: number[];
68
- };
69
- metricPercentiles: {
70
- httpRequestDurationPerPercentileInSeconds: number[];
71
- httpResponseContentLengthInBytes: number[];
72
- };
53
+ declare const defaultOptions$1: {
54
+ getLabelValues: () => {};
55
+ labels: never[];
56
+ metricPrefix: string;
57
+ metricTypes: string[];
58
+ metricNames: {
59
+ httpRequestsTotal: string[];
60
+ httpRequestDurationPerPercentileInSeconds: string[];
61
+ httpRequestDurationInSeconds: string[];
62
+ httpRequestContentLengthInBytes: string[];
63
+ httpResponseContentLengthInBytes: string[];
64
+ };
65
+ metricBuckets: {
66
+ httpRequestContentLengthInBytes: number[];
67
+ httpRequestDurationInSeconds: number[];
68
+ };
69
+ metricPercentiles: {
70
+ httpRequestDurationPerPercentileInSeconds: number[];
71
+ httpResponseContentLengthInBytes: number[];
73
72
  };
74
73
  };
74
+ declare function createHttpMetrics(options: TDefaultedPromsterOptions): THttpMetrics;
75
+ declare namespace createHttpMetrics {
76
+ export { defaultOptions$1 as defaultOptions };
77
+ }
78
+ //#endregion
79
+ //#region src/create-metric/create-metric.d.ts
80
+ declare const createHistogram: (configuration: HistogramConfiguration<string>) => Histogram<string>;
81
+ declare const createCounter: (configuration: CounterConfiguration<string>) => Counter<string>;
82
+ declare const createGauge: (configuration: GaugeConfiguration<string>) => Gauge<string>;
83
+ declare const createSummary: (configuration: SummaryConfiguration<string>) => Summary<string>;
75
84
  //#endregion
76
85
  //#region src/end-measurement-from/end-measurement-from.d.ts
77
86
  declare function endMeasurementFrom(start: [number, number]): {
@@ -106,10 +115,11 @@ type TRecordingOptions = {
106
115
  };
107
116
  type TLegacyTiming = [number, number];
108
117
  type TRequestRecorder = (_timing: Timing | TLegacyTiming, _recordingOptions: TRecordingOptions) => void;
109
- declare const createRequestRecorder: {
110
- (metrics: THttpMetrics, options?: TOptionalPromsterOptions): TRequestRecorder;
111
- defaultOptions: TOptionalPromsterOptions;
112
- };
118
+ declare const defaultOptions: TOptionalPromsterOptions;
119
+ declare function createRequestRecorder(metrics: THttpMetrics, options?: TOptionalPromsterOptions): TRequestRecorder;
120
+ declare namespace createRequestRecorder {
121
+ export { defaultOptions };
122
+ }
113
123
  //#endregion
114
124
  //#region src/environment/kubernetes.d.ts
115
125
  declare const isRunningInKubernetes: () => boolean;
@@ -131,14 +141,14 @@ declare const normalizeStatusCode: (statusCode: number) => number;
131
141
  //#endregion
132
142
  //#region src/normalizers/index.d.ts
133
143
  declare const defaultNormalizers: {
134
- normalizeStatusCode: (statusCode: number) => number;
135
- normalizePath: (path: string) => string;
136
- normalizeMethod: (method: string) => string;
144
+ normalizeStatusCode: typeof normalizeStatusCode;
145
+ normalizePath: typeof normalizePath;
146
+ normalizeMethod: typeof normalizeMethod;
137
147
  };
138
148
  //#endregion
139
149
  //#region src/summary/summary.d.ts
140
150
  declare const getSummary: () => Promise<string>;
141
151
  declare const getContentType: () => "text/plain; version=0.0.4; charset=utf-8";
142
152
  //#endregion
143
- export { Prometheus, type Timing as TPromsterTiming, type TRequestRecorder, createGcMetrics, createGcObserver, createGraphQlMetrics, createHttpMetrics, createRequestRecorder, defaultNormalizers, defaultRegister, endMeasurementFrom, getContentType, getSummary, isRunningInKubernetes, normalizeMethod, normalizePath, normalizeStatusCode, skipMetricsInEnvironment, sortLabels, timing };
153
+ export { Prometheus, type Timing as TPromsterTiming, type TRequestRecorder, createCounter, createGauge, createGcMetrics, createGcObserver, createGraphQlMetrics, createHistogram, createHttpMetrics, createRequestRecorder, createSummary, defaultNormalizers, defaultRegister, endMeasurementFrom, getContentType, getSummary, isRunningInKubernetes, normalizeMethod, normalizePath, normalizeStatusCode, skipMetricsInEnvironment, sortLabels, timing };
144
154
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.ts CHANGED
@@ -1,77 +1,86 @@
1
1
  import * as Prometheus from "prom-client";
2
+ import { Counter, CounterConfiguration, Gauge, GaugeConfiguration, Histogram, HistogramConfiguration, Summary, SummaryConfiguration } from "prom-client";
2
3
  import { TDefaultedPromsterOptions, TGcMetrics, TGraphQlMetrics, THttpMetrics, TLabelValues, TOptionalPromsterOptions } from "@promster/types";
3
4
  export type * from "@promster/types";
4
-
5
5
  //#region src/client/client.d.ts
6
6
  declare const defaultRegister: Prometheus.Registry<"text/plain; version=0.0.4; charset=utf-8">;
7
7
  //#endregion
8
8
  //#region src/create-gc-metrics/create-gc-metrics.d.ts
9
- declare const createGcMetrics: {
10
- (options: TDefaultedPromsterOptions): TGcMetrics;
11
- defaultOptions: {
12
- getLabelValues: () => {};
13
- labels: never[];
14
- metricPrefix: string;
15
- metricNames: {
16
- up: string[];
17
- };
18
- gcCollectionInterval: number;
9
+ declare const defaultOptions$3: {
10
+ getLabelValues: () => {};
11
+ labels: never[];
12
+ metricPrefix: string;
13
+ metricNames: {
14
+ up: string[];
19
15
  };
16
+ gcCollectionInterval: number;
20
17
  };
18
+ declare function createGcMetrics(options: TDefaultedPromsterOptions): TGcMetrics;
19
+ declare namespace createGcMetrics {
20
+ export { defaultOptions$3 as defaultOptions };
21
+ }
21
22
  //#endregion
22
23
  //#region src/create-gc-observer/create-gc-observer.d.ts
23
24
  declare const createGcObserver: (_metrics: TGcMetrics, options: TDefaultedPromsterOptions) => () => void;
24
25
  //#endregion
25
26
  //#region src/create-graphql-metrics/create-graphql-metrics.d.ts
26
- declare const createGraphQlMetrics: {
27
- (options: TDefaultedPromsterOptions): TGraphQlMetrics;
28
- defaultOptions: {
29
- getLabelValues: () => {};
30
- labels: never[];
31
- metricPrefix: string;
32
- metricTypes: string[];
33
- metricNames: {
34
- graphQlParseDuration: string[];
35
- graphQlValidationDuration: string[];
36
- graphQlResolveFieldDuration: string[];
37
- graphQlRequestDuration: string[];
38
- graphQlErrorsTotal: string[];
39
- };
40
- metricPercentiles: {
41
- graphQlParseDuration: number[];
42
- graphQlValidationDuration: number[];
43
- graphQlResolveFieldDuration: number[];
44
- graphQlRequestDuration: number[];
45
- graphQlErrorsTotal: number[];
46
- };
27
+ declare const defaultOptions$2: {
28
+ getLabelValues: () => {};
29
+ labels: never[];
30
+ metricPrefix: string;
31
+ metricTypes: string[];
32
+ metricNames: {
33
+ graphQlParseDuration: string[];
34
+ graphQlValidationDuration: string[];
35
+ graphQlResolveFieldDuration: string[];
36
+ graphQlRequestDuration: string[];
37
+ graphQlErrorsTotal: string[];
38
+ };
39
+ metricPercentiles: {
40
+ graphQlParseDuration: number[];
41
+ graphQlValidationDuration: number[];
42
+ graphQlResolveFieldDuration: number[];
43
+ graphQlRequestDuration: number[];
44
+ graphQlErrorsTotal: number[];
47
45
  };
48
46
  };
47
+ declare function createGraphQlMetrics(options: TDefaultedPromsterOptions): TGraphQlMetrics;
48
+ declare namespace createGraphQlMetrics {
49
+ export { defaultOptions$2 as defaultOptions };
50
+ }
49
51
  //#endregion
50
52
  //#region src/create-http-metrics/create-http-metrics.d.ts
51
- declare const createHttpMetrics: {
52
- (options: TDefaultedPromsterOptions): THttpMetrics;
53
- defaultOptions: {
54
- getLabelValues: () => {};
55
- labels: never[];
56
- metricPrefix: string;
57
- metricTypes: string[];
58
- metricNames: {
59
- httpRequestsTotal: string[];
60
- httpRequestDurationPerPercentileInSeconds: string[];
61
- httpRequestDurationInSeconds: string[];
62
- httpRequestContentLengthInBytes: string[];
63
- httpResponseContentLengthInBytes: string[];
64
- };
65
- metricBuckets: {
66
- httpRequestContentLengthInBytes: number[];
67
- httpRequestDurationInSeconds: number[];
68
- };
69
- metricPercentiles: {
70
- httpRequestDurationPerPercentileInSeconds: number[];
71
- httpResponseContentLengthInBytes: number[];
72
- };
53
+ declare const defaultOptions$1: {
54
+ getLabelValues: () => {};
55
+ labels: never[];
56
+ metricPrefix: string;
57
+ metricTypes: string[];
58
+ metricNames: {
59
+ httpRequestsTotal: string[];
60
+ httpRequestDurationPerPercentileInSeconds: string[];
61
+ httpRequestDurationInSeconds: string[];
62
+ httpRequestContentLengthInBytes: string[];
63
+ httpResponseContentLengthInBytes: string[];
64
+ };
65
+ metricBuckets: {
66
+ httpRequestContentLengthInBytes: number[];
67
+ httpRequestDurationInSeconds: number[];
68
+ };
69
+ metricPercentiles: {
70
+ httpRequestDurationPerPercentileInSeconds: number[];
71
+ httpResponseContentLengthInBytes: number[];
73
72
  };
74
73
  };
74
+ declare function createHttpMetrics(options: TDefaultedPromsterOptions): THttpMetrics;
75
+ declare namespace createHttpMetrics {
76
+ export { defaultOptions$1 as defaultOptions };
77
+ }
78
+ //#endregion
79
+ //#region src/create-metric/create-metric.d.ts
80
+ declare const createHistogram: (configuration: HistogramConfiguration<string>) => Histogram<string>;
81
+ declare const createCounter: (configuration: CounterConfiguration<string>) => Counter<string>;
82
+ declare const createGauge: (configuration: GaugeConfiguration<string>) => Gauge<string>;
83
+ declare const createSummary: (configuration: SummaryConfiguration<string>) => Summary<string>;
75
84
  //#endregion
76
85
  //#region src/end-measurement-from/end-measurement-from.d.ts
77
86
  declare function endMeasurementFrom(start: [number, number]): {
@@ -106,10 +115,11 @@ type TRecordingOptions = {
106
115
  };
107
116
  type TLegacyTiming = [number, number];
108
117
  type TRequestRecorder = (_timing: Timing | TLegacyTiming, _recordingOptions: TRecordingOptions) => void;
109
- declare const createRequestRecorder: {
110
- (metrics: THttpMetrics, options?: TOptionalPromsterOptions): TRequestRecorder;
111
- defaultOptions: TOptionalPromsterOptions;
112
- };
118
+ declare const defaultOptions: TOptionalPromsterOptions;
119
+ declare function createRequestRecorder(metrics: THttpMetrics, options?: TOptionalPromsterOptions): TRequestRecorder;
120
+ declare namespace createRequestRecorder {
121
+ export { defaultOptions };
122
+ }
113
123
  //#endregion
114
124
  //#region src/environment/kubernetes.d.ts
115
125
  declare const isRunningInKubernetes: () => boolean;
@@ -131,14 +141,14 @@ declare const normalizeStatusCode: (statusCode: number) => number;
131
141
  //#endregion
132
142
  //#region src/normalizers/index.d.ts
133
143
  declare const defaultNormalizers: {
134
- normalizeStatusCode: (statusCode: number) => number;
135
- normalizePath: (path: string) => string;
136
- normalizeMethod: (method: string) => string;
144
+ normalizeStatusCode: typeof normalizeStatusCode;
145
+ normalizePath: typeof normalizePath;
146
+ normalizeMethod: typeof normalizeMethod;
137
147
  };
138
148
  //#endregion
139
149
  //#region src/summary/summary.d.ts
140
150
  declare const getSummary: () => Promise<string>;
141
151
  declare const getContentType: () => "text/plain; version=0.0.4; charset=utf-8";
142
152
  //#endregion
143
- export { Prometheus, type Timing as TPromsterTiming, type TRequestRecorder, createGcMetrics, createGcObserver, createGraphQlMetrics, createHttpMetrics, createRequestRecorder, defaultNormalizers, defaultRegister, endMeasurementFrom, getContentType, getSummary, isRunningInKubernetes, normalizeMethod, normalizePath, normalizeStatusCode, skipMetricsInEnvironment, sortLabels, timing };
153
+ export { Prometheus, type Timing as TPromsterTiming, type TRequestRecorder, createCounter, createGauge, createGcMetrics, createGcObserver, createGraphQlMetrics, createHistogram, createHttpMetrics, createRequestRecorder, createSummary, defaultNormalizers, defaultRegister, endMeasurementFrom, getContentType, getSummary, isRunningInKubernetes, normalizeMethod, normalizePath, normalizeStatusCode, skipMetricsInEnvironment, sortLabels, timing };
144
154
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -16,6 +16,28 @@ const configure = once((options) => {
16
16
  if (!skipMetricsInEnvironment(options)) Prometheus.collectDefaultMetrics(options);
17
17
  });
18
18
  //#endregion
19
+ //#region src/create-metric/create-metric.ts
20
+ const createHistogram = (configuration) => {
21
+ const existingMetric = defaultRegister.getSingleMetric(configuration.name);
22
+ if (existingMetric instanceof Prometheus.Histogram) return existingMetric;
23
+ return new Prometheus.Histogram(configuration);
24
+ };
25
+ const createCounter = (configuration) => {
26
+ const existingMetric = defaultRegister.getSingleMetric(configuration.name);
27
+ if (existingMetric instanceof Prometheus.Counter) return existingMetric;
28
+ return new Prometheus.Counter(configuration);
29
+ };
30
+ const createGauge = (configuration) => {
31
+ const existingMetric = defaultRegister.getSingleMetric(configuration.name);
32
+ if (existingMetric instanceof Prometheus.Gauge) return existingMetric;
33
+ return new Prometheus.Gauge(configuration);
34
+ };
35
+ const createSummary = (configuration) => {
36
+ const existingMetric = defaultRegister.getSingleMetric(configuration.name);
37
+ if (existingMetric instanceof Prometheus.Summary) return existingMetric;
38
+ return new Prometheus.Summary(configuration);
39
+ };
40
+ //#endregion
19
41
  //#region src/create-gc-metrics/create-gc-metrics.ts
20
42
  const asArray$2 = (maybeArray) => Array.isArray(maybeArray) ? maybeArray : [maybeArray];
21
43
  const defaultOptions$4 = {
@@ -25,7 +47,7 @@ const defaultOptions$4 = {
25
47
  metricNames: { up: ["nodejs_up"] },
26
48
  gcCollectionInterval: 6e3
27
49
  };
28
- const getMetrics$2 = (options) => ({ up: asArray$2(options.metricNames.up).map((nameOfUpMetric) => new Prometheus.Gauge({
50
+ const getMetrics$2 = (options) => ({ up: asArray$2(options.metricNames.up).map((nameOfUpMetric) => createGauge({
29
51
  name: `${options.metricPrefix}${nameOfUpMetric}`,
30
52
  help: "1 = nodejs server is up, 0 = nodejs server is not up"
31
53
  })) });
@@ -88,31 +110,31 @@ const defaultOptions$2 = {
88
110
  }
89
111
  };
90
112
  const getMetrics$1 = (options) => ({
91
- graphQlParseDuration: shouldObserveGraphQlParseDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlParseDuration).map((nameOfGraphQlParseDuration) => new Prometheus.Histogram({
113
+ graphQlParseDuration: shouldObserveGraphQlParseDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlParseDuration).map((nameOfGraphQlParseDuration) => createHistogram({
92
114
  name: `${options.metricPrefix}${nameOfGraphQlParseDuration}`,
93
115
  help: "The GraphQL request parse time in seconds.",
94
116
  labelNames: defaultLabels$1.concat(options.labels).toSorted(),
95
117
  buckets: options.metricPercentiles?.graphQlParseDuration || defaultGraphQlPercentiles
96
118
  })) : void 0,
97
- graphQlValidationDuration: shouldObserveGraphQlValidationDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlValidationDuration).map((nameOfGraphQlValidationDuration) => new Prometheus.Histogram({
119
+ graphQlValidationDuration: shouldObserveGraphQlValidationDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlValidationDuration).map((nameOfGraphQlValidationDuration) => createHistogram({
98
120
  name: `${options.metricPrefix}${nameOfGraphQlValidationDuration}`,
99
121
  help: "The GraphQL request validation time in seconds.",
100
122
  labelNames: defaultLabels$1.concat(options.labels).toSorted(),
101
123
  buckets: options.metricPercentiles?.graphQlValidationDuration || defaultGraphQlPercentiles
102
124
  })) : void 0,
103
- graphQlResolveFieldDuration: shouldObserveGraphQlResolveFieldDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlResolveFieldDuration).map((nameOfGraphQlResolveFieldDuration) => new Prometheus.Histogram({
125
+ graphQlResolveFieldDuration: shouldObserveGraphQlResolveFieldDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlResolveFieldDuration).map((nameOfGraphQlResolveFieldDuration) => createHistogram({
104
126
  name: `${options.metricPrefix}${nameOfGraphQlResolveFieldDuration}`,
105
127
  help: "The GraphQL field resolving time in seconds.",
106
128
  labelNames: defaultLabels$1.concat(["field_name"]).concat(options.labels).toSorted(),
107
129
  buckets: options.metricPercentiles?.graphQlResolveFieldDuration || defaultGraphQlPercentiles
108
130
  })) : void 0,
109
- graphQlRequestDuration: shouldObserveGraphQlRequestDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlRequestDuration).map((nameOfGraphQlRequestDuration) => new Prometheus.Histogram({
131
+ graphQlRequestDuration: shouldObserveGraphQlRequestDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlRequestDuration).map((nameOfGraphQlRequestDuration) => createHistogram({
110
132
  name: `${options.metricPrefix}${nameOfGraphQlRequestDuration}`,
111
133
  help: "The GraphQL request duration time in seconds.",
112
134
  labelNames: defaultLabels$1.concat(options.labels).toSorted(),
113
135
  buckets: options.metricPercentiles?.graphQlRequestDuration || defaultGraphQlPercentiles
114
136
  })) : void 0,
115
- graphQlErrorsTotal: shouldObserveGraphQlErrorsTotalAsCounter(options) ? asArray$1(options.metricNames.graphQlErrorsTotal).map((nameOfGraphQlErrorsCount) => new Prometheus.Counter({
137
+ graphQlErrorsTotal: shouldObserveGraphQlErrorsTotalAsCounter(options) ? asArray$1(options.metricNames.graphQlErrorsTotal).map((nameOfGraphQlErrorsCount) => createCounter({
116
138
  name: `${options.metricPrefix}${nameOfGraphQlErrorsCount}`,
117
139
  help: "Count of errors while parsing, validating, or executing a GraphQL operation.",
118
140
  labelNames: defaultLabels$1.concat(["phase"]).concat(options.labels).toSorted()
@@ -188,13 +210,13 @@ const defaultOptions$1 = {
188
210
  }
189
211
  };
190
212
  const getMetrics = (options) => ({
191
- httpRequestContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(options) ? asArray(options.metricNames.httpRequestContentLengthInBytes).map((nameOfHttpContentLengthMetric) => new Prometheus.Histogram({
213
+ httpRequestContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(options) ? asArray(options.metricNames.httpRequestContentLengthInBytes).map((nameOfHttpContentLengthMetric) => createHistogram({
192
214
  name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,
193
215
  help: "The HTTP request content length in bytes.",
194
216
  labelNames: defaultLabels.concat(options.labels).toSorted(),
195
217
  buckets: options.metricBuckets?.httpRequestContentLengthInBytes || defaultHttpContentLengthInBytes
196
218
  })) : void 0,
197
- httpResponseContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(options) ? asArray(options.metricNames.httpResponseContentLengthInBytes).map((nameOfHttpContentLengthMetric) => new Prometheus.Histogram({
219
+ httpResponseContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(options) ? asArray(options.metricNames.httpResponseContentLengthInBytes).map((nameOfHttpContentLengthMetric) => createHistogram({
198
220
  name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,
199
221
  help: "The HTTP response content length in bytes.",
200
222
  labelNames: defaultLabels.concat(options.labels).toSorted(),
@@ -202,20 +224,20 @@ const getMetrics = (options) => ({
202
224
  })) : void 0
203
225
  });
204
226
  const getHttpRequestLatencyMetricsInSeconds = (options) => ({
205
- httpRequestDurationPerPercentileInSeconds: shouldObserveHttpRequestsAsSummary(options) ? asArray(options.metricNames.httpRequestDurationPerPercentileInSeconds).map((nameOfHttpRequestDurationPerPercentileInSeconds) => new Prometheus.Summary({
227
+ httpRequestDurationPerPercentileInSeconds: shouldObserveHttpRequestsAsSummary(options) ? asArray(options.metricNames.httpRequestDurationPerPercentileInSeconds).map((nameOfHttpRequestDurationPerPercentileInSeconds) => createSummary({
206
228
  name: `${options.metricPrefix}${nameOfHttpRequestDurationPerPercentileInSeconds}`,
207
229
  help: "The HTTP request latencies in seconds.",
208
230
  labelNames: defaultLabels.concat(options.labels).toSorted(),
209
231
  percentiles: options.metricPercentiles?.httpRequestDurationPerPercentileInSeconds || defaultHttpRequestDurationPercentileInSeconds
210
232
  })) : void 0,
211
- httpRequestDurationInSeconds: shouldObserveHttpRequestsAsHistogram(options) ? asArray(options.metricNames.httpRequestDurationInSeconds).map((nameOfHttpRequestDurationInSecondsMetric) => new Prometheus.Histogram({
233
+ httpRequestDurationInSeconds: shouldObserveHttpRequestsAsHistogram(options) ? asArray(options.metricNames.httpRequestDurationInSeconds).map((nameOfHttpRequestDurationInSecondsMetric) => createHistogram({
212
234
  name: `${options.metricPrefix}${nameOfHttpRequestDurationInSecondsMetric}`,
213
235
  help: "The HTTP request latencies in seconds.",
214
236
  labelNames: defaultLabels.concat(options.labels).toSorted(),
215
237
  buckets: options.metricBuckets?.httpRequestDurationInSeconds || defaultHttpRequestDurationInSeconds
216
238
  })) : void 0
217
239
  });
218
- const getHttpRequestCounterMetric = (options) => ({ httpRequestsTotal: shouldObserveHttpRequestsAsCounter(options) ? asArray(options.metricNames.httpRequestsTotal).map((nameOfHttpRequestsTotalMetric) => new Prometheus.Counter({
240
+ const getHttpRequestCounterMetric = (options) => ({ httpRequestsTotal: shouldObserveHttpRequestsAsCounter(options) ? asArray(options.metricNames.httpRequestsTotal).map((nameOfHttpRequestsTotalMetric) => createCounter({
219
241
  name: `${options.metricPrefix}${nameOfHttpRequestsTotalMetric}`,
220
242
  help: "The total HTTP requests.",
221
243
  labelNames: defaultLabels.concat(options.labels).toSorted()
@@ -331,6 +353,6 @@ const timing = { start() {
331
353
  return new Timing();
332
354
  } };
333
355
  //#endregion
334
- export { Prometheus, createGcMetrics, createGcObserver, createGraphQlMetrics, createHttpMetrics, createRequestRecorder, defaultNormalizers, defaultRegister, endMeasurementFrom, getContentType, getSummary, isRunningInKubernetes, normalizeMethod, normalizePath, normalizeStatusCode, skipMetricsInEnvironment, sortLabels, timing };
356
+ export { Prometheus, createCounter, createGauge, createGcMetrics, createGcObserver, createGraphQlMetrics, createHistogram, createHttpMetrics, createRequestRecorder, createSummary, defaultNormalizers, defaultRegister, endMeasurementFrom, getContentType, getSummary, isRunningInKubernetes, normalizeMethod, normalizePath, normalizeStatusCode, skipMetricsInEnvironment, sortLabels, timing };
335
357
 
336
358
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["asArray","defaultOptions","getMetrics","defaultOptions","defaultLabels","asArray","defaultOptions","getMetrics","defaultOptions","#startTime","#endTime"],"sources":["../src/environment/kubernetes.ts","../src/environment/skip-metrics-in-environment.ts","../src/client/client.ts","../src/create-gc-metrics/create-gc-metrics.ts","../src/create-gc-observer/create-gc-observer.ts","../src/create-graphql-metrics/create-graphql-metrics.ts","../src/create-http-metrics/create-http-metrics.ts","../src/end-measurement-from/end-measurement-from.ts","../src/sort-labels/sort-labels.ts","../src/create-request-recorder/create-request-recorder.ts","../src/normalizers/method/method.ts","../src/normalizers/path/path.ts","../src/normalizers/status-code/status-code.ts","../src/normalizers/index.ts","../src/summary/summary.ts","../src/timing/timing.ts"],"sourcesContent":["const isRunningInKubernetes = () =>\n Boolean(process.env.KUBERNETES_SERVICE_HOST);\n\nexport { isRunningInKubernetes };\n","import type { TOptionalPromsterOptions } from '@promster/types';\n\nimport { isRunningInKubernetes } from './kubernetes';\n\ntype TSkipMetricsInEnvironmentOptions = {\n detectKubernetes?: TOptionalPromsterOptions['detectKubernetes'];\n};\n\nconst skipMetricsInEnvironment = (options: TSkipMetricsInEnvironmentOptions) =>\n options.detectKubernetes === true && !isRunningInKubernetes();\n\nexport { skipMetricsInEnvironment };\n","import { once } from 'es-toolkit/function';\nimport type { PrometheusContentType } from 'prom-client';\nimport * as Prometheus from 'prom-client';\n\nimport { skipMetricsInEnvironment } from '../environment';\n\n// NOTE:\n// This is the `globalRegistry` provided by the `prom-client`\n// We could create multiple registries with `new Prometheus.registry()`.\nconst defaultRegister = Prometheus.register;\n\ninterface TClientOptions extends Prometheus.DefaultMetricsCollectorConfiguration<PrometheusContentType> {\n detectKubernetes?: boolean;\n prefix?: string;\n}\n\nconst configure = once((options: TClientOptions) => {\n const shouldSkipMetricsInEnvironment = skipMetricsInEnvironment(options);\n\n if (!shouldSkipMetricsInEnvironment) {\n Prometheus.collectDefaultMetrics(options);\n }\n});\n\nexport { Prometheus, defaultRegister, configure };\n","import type { TDefaultedPromsterOptions, TGcMetrics } from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure, Prometheus } from '../client';\n\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst defaultOptions = {\n getLabelValues: () => ({}),\n labels: [],\n metricPrefix: '',\n metricNames: {\n up: ['nodejs_up'],\n },\n gcCollectionInterval: 6000,\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n up: asArray(options.metricNames.up).map(\n (nameOfUpMetric: string) =>\n new Prometheus.Gauge({\n name: `${options.metricPrefix}${nameOfUpMetric}`,\n help: '1 = nodejs server is up, 0 = nodejs server is not up',\n }),\n ),\n});\n\nconst createGcMetrics = (options: TDefaultedPromsterOptions): TGcMetrics => {\n const defaultedOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n\n configure({\n prefix: defaultedOptions.metricPrefix,\n });\n\n const gcMetrics = getMetrics(defaultedOptions);\n\n return gcMetrics;\n};\n\ncreateGcMetrics.defaultOptions = defaultOptions;\n\nexport { createGcMetrics };\n","import { gcStats } from '@chainsafe/prometheus-gc-stats';\nimport type { TDefaultedPromsterOptions, TGcMetrics } from '@promster/types';\nimport { once } from 'es-toolkit/function';\n\nimport { defaultRegister } from '../client/client';\n\nconst defaultOptions = {\n disableGcMetrics: false,\n};\n\nconst createGcObserver = once(\n (_metrics: TGcMetrics, options: TDefaultedPromsterOptions) => () => {\n gcStats(defaultRegister, {\n collectionInterval: options.gcCollectionInterval,\n prefix: options.metricPrefix,\n });\n },\n);\n\n// @ts-expect-error\ncreateGcObserver.defaultOptions = defaultOptions;\n\nexport { createGcObserver };\n","import type {\n TDefaultedPromsterOptions,\n TGraphQlMetrics,\n} from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure, Prometheus } from '../client';\n\nconst defaultGraphQlPercentiles = [0.5, 0.9, 0.95, 0.98, 0.99];\n\nconst defaultLabels = ['operation_name'];\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst shouldObserveGraphQlParseDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlParseDurationHistogram');\nconst shouldObserveGraphQlValidationDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlValidationDurationHistogram');\nconst shouldObserveGraphQlResolveFieldDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlResolveFieldDurationHistogram');\nconst shouldObserveGraphQlRequestDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlRequestDurationHistogram');\nconst shouldObserveGraphQlErrorsTotalAsCounter = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlErrorsTotal');\n\nconst defaultOptions = {\n getLabelValues: () => ({}),\n labels: [],\n metricPrefix: '',\n metricTypes: [\n 'graphQlParseDurationHistogram',\n 'graphQlValidationDurationHistogram',\n 'graphQlResolveFieldDurationHistogram',\n 'graphQlRequestDurationHistogram',\n 'graphQlErrorsTotal',\n ],\n metricNames: {\n graphQlParseDuration: ['graphql_parse_duration_seconds'],\n graphQlValidationDuration: ['graphql_validation_duration_seconds'],\n graphQlResolveFieldDuration: ['graphql_resolve_field_duration_seconds'],\n graphQlRequestDuration: ['graphql_request_duration_seconds'],\n graphQlErrorsTotal: ['graphql_errors_total'],\n },\n metricPercentiles: {\n graphQlParseDuration: defaultGraphQlPercentiles,\n graphQlValidationDuration: defaultGraphQlPercentiles,\n graphQlResolveFieldDuration: defaultGraphQlPercentiles,\n graphQlRequestDuration: defaultGraphQlPercentiles,\n graphQlErrorsTotal: defaultGraphQlPercentiles,\n },\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n graphQlParseDuration: shouldObserveGraphQlParseDurationAsHistogram(options)\n ? asArray(options.metricNames.graphQlParseDuration).map(\n (nameOfGraphQlParseDuration: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfGraphQlParseDuration}`,\n help: 'The GraphQL request parse time in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricPercentiles?.graphQlParseDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlValidationDuration: shouldObserveGraphQlValidationDurationAsHistogram(\n options,\n )\n ? asArray(options.metricNames.graphQlValidationDuration).map(\n (nameOfGraphQlValidationDuration: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfGraphQlValidationDuration}`,\n help: 'The GraphQL request validation time in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricPercentiles?.graphQlValidationDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlResolveFieldDuration:\n shouldObserveGraphQlResolveFieldDurationAsHistogram(options)\n ? asArray(options.metricNames.graphQlResolveFieldDuration).map(\n (nameOfGraphQlResolveFieldDuration: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfGraphQlResolveFieldDuration}`,\n help: 'The GraphQL field resolving time in seconds.',\n labelNames: defaultLabels\n .concat(['field_name'])\n .concat(options.labels)\n .toSorted(),\n buckets:\n options.metricPercentiles?.graphQlResolveFieldDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlRequestDuration: shouldObserveGraphQlRequestDurationAsHistogram(\n options,\n )\n ? asArray(options.metricNames.graphQlRequestDuration).map(\n (nameOfGraphQlRequestDuration: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfGraphQlRequestDuration}`,\n help: 'The GraphQL request duration time in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricPercentiles?.graphQlRequestDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlErrorsTotal: shouldObserveGraphQlErrorsTotalAsCounter(options)\n ? asArray(options.metricNames.graphQlErrorsTotal).map(\n (nameOfGraphQlErrorsCount: string) =>\n new Prometheus.Counter({\n name: `${options.metricPrefix}${nameOfGraphQlErrorsCount}`,\n help: 'Count of errors while parsing, validating, or executing a GraphQL operation.',\n labelNames: defaultLabels\n .concat(['phase'])\n .concat(options.labels)\n .toSorted(),\n }),\n )\n : undefined,\n});\n\nconst createGraphQlMetrics = (\n options: TDefaultedPromsterOptions,\n): TGraphQlMetrics => {\n const defaultedOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n\n configure({\n prefix: defaultedOptions.metricPrefix,\n });\n\n const metrics = getMetrics(defaultedOptions);\n\n return metrics;\n};\n\ncreateGraphQlMetrics.defaultOptions = defaultOptions;\n\nexport { createGraphQlMetrics };\n","import type { TDefaultedPromsterOptions, THttpMetrics } from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure, Prometheus } from '../client';\n\nconst defaultHttpRequestDurationPercentileInSeconds = [\n 0.5, 0.9, 0.95, 0.98, 0.99,\n];\nconst defaultHttpRequestDurationInSeconds = [\n 0.05, 0.1, 0.3, 0.5, 0.8, 1, 1.5, 2, 3, 10,\n];\nconst defaultHttpContentLengthInBytes = [\n 100000, 200000, 500000, 1000000, 1500000, 2000000, 3000000, 5000000, 10000000,\n];\n\nconst defaultLabels = ['path', 'status_code', 'method'];\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst shouldObserveHttpRequestsAsSummary = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsSummary');\nconst shouldObserveHttpRequestsAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsHistogram');\nconst shouldObserveHttpRequestsAsCounter = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsTotal');\nconst shouldObserveHttpContentLengthAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpContentLengthHistogram');\n\nconst defaultOptions = {\n getLabelValues: () => ({}),\n labels: [],\n metricPrefix: '',\n metricTypes: ['httpRequestsTotal', 'httpRequestsHistogram'],\n metricNames: {\n httpRequestsTotal: ['http_requests_total'],\n httpRequestDurationPerPercentileInSeconds: [\n 'http_request_duration_per_percentile_seconds',\n ],\n httpRequestDurationInSeconds: ['http_request_duration_seconds'],\n httpRequestContentLengthInBytes: ['http_request_content_length_bytes'],\n httpResponseContentLengthInBytes: ['http_response_content_length_bytes'],\n },\n metricBuckets: {\n httpRequestContentLengthInBytes: defaultHttpContentLengthInBytes,\n httpRequestDurationInSeconds: defaultHttpRequestDurationInSeconds,\n },\n metricPercentiles: {\n httpRequestDurationPerPercentileInSeconds:\n defaultHttpRequestDurationPercentileInSeconds,\n httpResponseContentLengthInBytes: defaultHttpContentLengthInBytes,\n },\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n httpRequestContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(\n options,\n )\n ? asArray(options.metricNames.httpRequestContentLengthInBytes).map(\n (nameOfHttpContentLengthMetric: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,\n help: 'The HTTP request content length in bytes.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricBuckets?.httpRequestContentLengthInBytes ||\n defaultHttpContentLengthInBytes,\n }),\n )\n : undefined,\n\n httpResponseContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(\n options,\n )\n ? asArray(options.metricNames.httpResponseContentLengthInBytes).map(\n (nameOfHttpContentLengthMetric: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,\n help: 'The HTTP response content length in bytes.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricBuckets?.httpResponseContentLengthInBytes ||\n defaultHttpContentLengthInBytes,\n }),\n )\n : undefined,\n});\n\nconst getHttpRequestLatencyMetricsInSeconds = (\n options: TDefaultedPromsterOptions,\n) => ({\n httpRequestDurationPerPercentileInSeconds: shouldObserveHttpRequestsAsSummary(\n options,\n )\n ? asArray(\n options.metricNames.httpRequestDurationPerPercentileInSeconds,\n ).map(\n (nameOfHttpRequestDurationPerPercentileInSeconds: string) =>\n new Prometheus.Summary({\n name: `${options.metricPrefix}${nameOfHttpRequestDurationPerPercentileInSeconds}`,\n help: 'The HTTP request latencies in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n percentiles:\n options.metricPercentiles\n ?.httpRequestDurationPerPercentileInSeconds ||\n defaultHttpRequestDurationPercentileInSeconds,\n }),\n )\n : undefined,\n\n httpRequestDurationInSeconds: shouldObserveHttpRequestsAsHistogram(options)\n ? asArray(options.metricNames.httpRequestDurationInSeconds).map(\n (nameOfHttpRequestDurationInSecondsMetric: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfHttpRequestDurationInSecondsMetric}`,\n help: 'The HTTP request latencies in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricBuckets?.httpRequestDurationInSeconds ||\n defaultHttpRequestDurationInSeconds,\n }),\n )\n : undefined,\n});\n\nconst getHttpRequestCounterMetric = (options: TDefaultedPromsterOptions) => ({\n httpRequestsTotal: shouldObserveHttpRequestsAsCounter(options)\n ? asArray(options.metricNames.httpRequestsTotal).map(\n (nameOfHttpRequestsTotalMetric: string) =>\n new Prometheus.Counter({\n name: `${options.metricPrefix}${nameOfHttpRequestsTotalMetric}`,\n help: 'The total HTTP requests.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n }),\n )\n : undefined,\n});\n\nconst createHttpMetrics = (\n options: TDefaultedPromsterOptions,\n): THttpMetrics => {\n const defaultedOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n\n configure({\n prefix: defaultedOptions.metricPrefix,\n });\n\n const metrics = getMetrics(defaultedOptions);\n\n const httpRequestLatencyMetricsInSeconds =\n getHttpRequestLatencyMetricsInSeconds(defaultedOptions);\n const httpRequestCounterMetric =\n getHttpRequestCounterMetric(defaultedOptions);\n\n return Object.assign(\n {},\n metrics,\n httpRequestLatencyMetricsInSeconds,\n httpRequestCounterMetric,\n );\n};\n\ncreateHttpMetrics.defaultOptions = defaultOptions;\n\nexport { createHttpMetrics };\n","const NS_PER_SEC = 1e9;\n\nfunction endMeasurementFrom(start: [number, number]) {\n const [seconds, nanoseconds] = process.hrtime(start);\n\n return {\n durationS: (seconds * NS_PER_SEC + nanoseconds) / NS_PER_SEC,\n };\n}\n\nexport { endMeasurementFrom };\n","import type { TLabelValues } from '@promster/types';\n\nfunction sortLabels(unsortedLabels: TLabelValues): TLabelValues {\n return Object.keys(unsortedLabels)\n .toSorted((a, b) => {\n if (a < b) {\n return -1;\n }\n\n if (a > b) {\n return 1;\n }\n\n return 0;\n })\n .reduce<TLabelValues>((sortedLabels, labelName) => {\n sortedLabels[labelName] = unsortedLabels[labelName];\n return sortedLabels;\n }, {});\n}\n\nexport { sortLabels };\n","import type {\n TDefaultedPromsterOptions,\n THttpMetrics,\n TLabelValues,\n TOptionalPromsterOptions,\n} from '@promster/types';\nimport merge from 'merge-options';\n\nimport { endMeasurementFrom } from '../end-measurement-from';\nimport { skipMetricsInEnvironment } from '../environment';\nimport { sortLabels } from '../sort-labels';\nimport type { Timing } from '../timing';\n\ntype TRecordingOptions = {\n labels: TLabelValues;\n requestContentLength?: number;\n responseContentLength?: number;\n};\n\ntype TLegacyTiming = [number, number];\nexport type TRequestRecorder = (\n _timing: Timing | TLegacyTiming,\n _recordingOptions: TRecordingOptions,\n) => void;\n\nconst defaultOptions: TOptionalPromsterOptions = {\n detectKubernetes: false,\n};\n\nfunction isTiming(timing: Timing | TLegacyTiming): timing is Timing {\n return !Array.isArray(timing);\n}\n\nconst createRequestRecorder = (\n metrics: THttpMetrics,\n options: TOptionalPromsterOptions = defaultOptions,\n): TRequestRecorder => {\n const defaultedRecorderOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n const shouldSkipMetricsByEnvironment = skipMetricsInEnvironment(\n defaultedRecorderOptions,\n );\n\n return (\n timing: Timing | TLegacyTiming,\n recordingOptions: TRecordingOptions,\n ) => {\n const durationS = isTiming(timing)\n ? timing.end().value().seconds\n : endMeasurementFrom(timing).durationS;\n\n const labels = sortLabels(recordingOptions.labels);\n\n if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n if (metrics.httpRequestDurationInSeconds) {\n for (const httpRequestDurationInSecondsMetricType of metrics.httpRequestDurationInSeconds) {\n httpRequestDurationInSecondsMetricType.observe(labels, durationS);\n }\n }\n }\n\n if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n if (metrics.httpRequestDurationPerPercentileInSeconds) {\n for (const httpRequestDurationPerPercentileInSecondsMetricType of metrics.httpRequestDurationPerPercentileInSeconds) {\n httpRequestDurationPerPercentileInSecondsMetricType.observe(\n labels,\n durationS,\n );\n }\n }\n }\n\n if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n if (metrics.httpRequestsTotal) {\n for (const httpRequestsTotalMetricType of metrics.httpRequestsTotal) {\n httpRequestsTotalMetricType.inc(labels);\n }\n }\n }\n\n if (recordingOptions.requestContentLength) {\n if (metrics.httpRequestContentLengthInBytes) {\n for (const httpRequestContentLengthInBytesMetricType of metrics.httpRequestContentLengthInBytes) {\n httpRequestContentLengthInBytesMetricType.observe(\n labels,\n recordingOptions.requestContentLength,\n );\n }\n }\n }\n\n if (recordingOptions.responseContentLength) {\n if (metrics.httpResponseContentLengthInBytes) {\n for (const httpResponseContentLengthInBytesMetricType of metrics.httpResponseContentLengthInBytes) {\n httpResponseContentLengthInBytesMetricType.observe(\n labels,\n recordingOptions.responseContentLength,\n );\n }\n }\n }\n };\n};\n\ncreateRequestRecorder.defaultOptions = defaultOptions;\n\nexport { createRequestRecorder, sortLabels, endMeasurementFrom };\n","const normalizeMethod = (method: string): string => method.toLowerCase();\n\nexport { normalizeMethod };\n","import url from 'node:url';\n\nimport UrlValueParser from 'url-value-parser';\n\nconst urlValueParser = new UrlValueParser();\n\nconst normalizePath = (path: string): string => {\n const parsedPathname = url.parse(path).pathname;\n\n if (!parsedPathname) {\n return '';\n }\n\n return urlValueParser.replacePathValues(parsedPathname, '#val');\n};\n\nexport { normalizePath };\n","const normalizeStatusCode = (statusCode: number): number => statusCode;\n\nexport { normalizeStatusCode };\n","import { normalizeMethod } from './method';\nimport { normalizePath } from './path';\nimport { normalizeStatusCode } from './status-code';\n\nconst defaultNormalizers = {\n normalizeStatusCode,\n normalizePath,\n normalizeMethod,\n};\n\nexport {\n normalizeStatusCode,\n normalizePath,\n normalizeMethod,\n defaultNormalizers,\n};\n","import { defaultRegister } from '../client';\n\nconst getSummary = async () => defaultRegister.metrics();\nconst getContentType = () => defaultRegister.contentType;\n\nexport { getSummary, getContentType };\n","class Timing {\n static NS_PER_SEC = BigInt(1e9);\n\n #startTime?: bigint;\n #endTime?: bigint;\n\n constructor() {\n this.reset();\n }\n\n value() {\n const startTime = this.#startTime;\n const endTime = this.#endTime;\n\n if (!endTime || !startTime) {\n return { seconds: undefined };\n }\n\n return { seconds: Number(endTime - startTime) / Number(Timing.NS_PER_SEC) };\n }\n\n reset() {\n this.#startTime = process.hrtime.bigint();\n this.#endTime = undefined;\n\n return this;\n }\n\n end() {\n this.#endTime = process.hrtime.bigint();\n\n return this;\n }\n}\n\nconst timing = {\n start() {\n return new Timing();\n },\n};\n\nexport default timing;\nexport { Timing };\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["asArray","defaultOptions","getMetrics","defaultOptions","defaultLabels","asArray","defaultOptions","getMetrics","defaultOptions","#startTime","#endTime"],"sources":["../src/environment/kubernetes.ts","../src/environment/skip-metrics-in-environment.ts","../src/client/client.ts","../src/create-metric/create-metric.ts","../src/create-gc-metrics/create-gc-metrics.ts","../src/create-gc-observer/create-gc-observer.ts","../src/create-graphql-metrics/create-graphql-metrics.ts","../src/create-http-metrics/create-http-metrics.ts","../src/end-measurement-from/end-measurement-from.ts","../src/sort-labels/sort-labels.ts","../src/create-request-recorder/create-request-recorder.ts","../src/normalizers/method/method.ts","../src/normalizers/path/path.ts","../src/normalizers/status-code/status-code.ts","../src/normalizers/index.ts","../src/summary/summary.ts","../src/timing/timing.ts"],"sourcesContent":["const isRunningInKubernetes = () =>\n Boolean(process.env.KUBERNETES_SERVICE_HOST);\n\nexport { isRunningInKubernetes };\n","import type { TOptionalPromsterOptions } from '@promster/types';\n\nimport { isRunningInKubernetes } from './kubernetes';\n\ntype TSkipMetricsInEnvironmentOptions = {\n detectKubernetes?: TOptionalPromsterOptions['detectKubernetes'];\n};\n\nconst skipMetricsInEnvironment = (options: TSkipMetricsInEnvironmentOptions) =>\n options.detectKubernetes === true && !isRunningInKubernetes();\n\nexport { skipMetricsInEnvironment };\n","import { once } from 'es-toolkit/function';\nimport type { PrometheusContentType } from 'prom-client';\nimport * as Prometheus from 'prom-client';\n\nimport { skipMetricsInEnvironment } from '../environment';\n\n// NOTE:\n// This is the `globalRegistry` provided by the `prom-client`\n// We could create multiple registries with `new Prometheus.registry()`.\nconst defaultRegister = Prometheus.register;\n\ninterface TClientOptions extends Prometheus.DefaultMetricsCollectorConfiguration<PrometheusContentType> {\n detectKubernetes?: boolean;\n prefix?: string;\n}\n\nconst configure = once((options: TClientOptions) => {\n const shouldSkipMetricsInEnvironment = skipMetricsInEnvironment(options);\n\n if (!shouldSkipMetricsInEnvironment) {\n Prometheus.collectDefaultMetrics(options);\n }\n});\n\nexport { Prometheus, defaultRegister, configure };\n","import type {\n Counter,\n CounterConfiguration,\n Gauge,\n GaugeConfiguration,\n Histogram,\n HistogramConfiguration,\n Summary,\n SummaryConfiguration,\n} from 'prom-client';\n\nimport { defaultRegister, Prometheus } from '../client';\n\n// NOTE:\n// All metrics share the `prom-client` global registry (see `../client`).\n// Registering a metric whose name already exists throws. This happens when\n// a metric-defining module is evaluated more than once, for instance when a\n// bundler or package manager ships duplicate physical copies of a package.\n// These helpers make registration idempotent: an already registered metric\n// of the same name and type is returned instead of re-created. The first\n// registration wins, so a later differing configuration is ignored. A name\n// already taken by a different metric type falls through to `prom-client`,\n// which rejects it with the clear \"already registered\" error.\n\nconst createHistogram = (\n configuration: HistogramConfiguration<string>,\n): Histogram<string> => {\n const existingMetric = defaultRegister.getSingleMetric(configuration.name);\n\n if (existingMetric instanceof Prometheus.Histogram) {\n return existingMetric;\n }\n\n return new Prometheus.Histogram(configuration);\n};\n\nconst createCounter = (\n configuration: CounterConfiguration<string>,\n): Counter<string> => {\n const existingMetric = defaultRegister.getSingleMetric(configuration.name);\n\n if (existingMetric instanceof Prometheus.Counter) {\n return existingMetric;\n }\n\n return new Prometheus.Counter(configuration);\n};\n\nconst createGauge = (\n configuration: GaugeConfiguration<string>,\n): Gauge<string> => {\n const existingMetric = defaultRegister.getSingleMetric(configuration.name);\n\n if (existingMetric instanceof Prometheus.Gauge) {\n return existingMetric;\n }\n\n return new Prometheus.Gauge(configuration);\n};\n\nconst createSummary = (\n configuration: SummaryConfiguration<string>,\n): Summary<string> => {\n const existingMetric = defaultRegister.getSingleMetric(configuration.name);\n\n if (existingMetric instanceof Prometheus.Summary) {\n return existingMetric;\n }\n\n return new Prometheus.Summary(configuration);\n};\n\nexport { createCounter, createGauge, createHistogram, createSummary };\n","import type { TDefaultedPromsterOptions, TGcMetrics } from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure } from '../client';\nimport { createGauge } from '../create-metric';\n\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst defaultOptions = {\n getLabelValues: () => ({}),\n labels: [],\n metricPrefix: '',\n metricNames: {\n up: ['nodejs_up'],\n },\n gcCollectionInterval: 6000,\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n up: asArray(options.metricNames.up).map((nameOfUpMetric: string) =>\n createGauge({\n name: `${options.metricPrefix}${nameOfUpMetric}`,\n help: '1 = nodejs server is up, 0 = nodejs server is not up',\n }),\n ),\n});\n\nconst createGcMetrics = (options: TDefaultedPromsterOptions): TGcMetrics => {\n const defaultedOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n\n configure({\n prefix: defaultedOptions.metricPrefix,\n });\n\n const gcMetrics = getMetrics(defaultedOptions);\n\n return gcMetrics;\n};\n\ncreateGcMetrics.defaultOptions = defaultOptions;\n\nexport { createGcMetrics };\n","import { gcStats } from '@chainsafe/prometheus-gc-stats';\nimport type { TDefaultedPromsterOptions, TGcMetrics } from '@promster/types';\nimport { once } from 'es-toolkit/function';\n\nimport { defaultRegister } from '../client/client';\n\nconst defaultOptions = {\n disableGcMetrics: false,\n};\n\nconst createGcObserver = once(\n (_metrics: TGcMetrics, options: TDefaultedPromsterOptions) => () => {\n gcStats(defaultRegister, {\n collectionInterval: options.gcCollectionInterval,\n prefix: options.metricPrefix,\n });\n },\n);\n\n// @ts-expect-error\ncreateGcObserver.defaultOptions = defaultOptions;\n\nexport { createGcObserver };\n","import type {\n TDefaultedPromsterOptions,\n TGraphQlMetrics,\n} from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure } from '../client';\nimport { createCounter, createHistogram } from '../create-metric';\n\nconst defaultGraphQlPercentiles = [0.5, 0.9, 0.95, 0.98, 0.99];\n\nconst defaultLabels = ['operation_name'];\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst shouldObserveGraphQlParseDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlParseDurationHistogram');\nconst shouldObserveGraphQlValidationDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlValidationDurationHistogram');\nconst shouldObserveGraphQlResolveFieldDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlResolveFieldDurationHistogram');\nconst shouldObserveGraphQlRequestDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlRequestDurationHistogram');\nconst shouldObserveGraphQlErrorsTotalAsCounter = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlErrorsTotal');\n\nconst defaultOptions = {\n getLabelValues: () => ({}),\n labels: [],\n metricPrefix: '',\n metricTypes: [\n 'graphQlParseDurationHistogram',\n 'graphQlValidationDurationHistogram',\n 'graphQlResolveFieldDurationHistogram',\n 'graphQlRequestDurationHistogram',\n 'graphQlErrorsTotal',\n ],\n metricNames: {\n graphQlParseDuration: ['graphql_parse_duration_seconds'],\n graphQlValidationDuration: ['graphql_validation_duration_seconds'],\n graphQlResolveFieldDuration: ['graphql_resolve_field_duration_seconds'],\n graphQlRequestDuration: ['graphql_request_duration_seconds'],\n graphQlErrorsTotal: ['graphql_errors_total'],\n },\n metricPercentiles: {\n graphQlParseDuration: defaultGraphQlPercentiles,\n graphQlValidationDuration: defaultGraphQlPercentiles,\n graphQlResolveFieldDuration: defaultGraphQlPercentiles,\n graphQlRequestDuration: defaultGraphQlPercentiles,\n graphQlErrorsTotal: defaultGraphQlPercentiles,\n },\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n graphQlParseDuration: shouldObserveGraphQlParseDurationAsHistogram(options)\n ? asArray(options.metricNames.graphQlParseDuration).map(\n (nameOfGraphQlParseDuration: string) =>\n createHistogram({\n name: `${options.metricPrefix}${nameOfGraphQlParseDuration}`,\n help: 'The GraphQL request parse time in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricPercentiles?.graphQlParseDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlValidationDuration: shouldObserveGraphQlValidationDurationAsHistogram(\n options,\n )\n ? asArray(options.metricNames.graphQlValidationDuration).map(\n (nameOfGraphQlValidationDuration: string) =>\n createHistogram({\n name: `${options.metricPrefix}${nameOfGraphQlValidationDuration}`,\n help: 'The GraphQL request validation time in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricPercentiles?.graphQlValidationDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlResolveFieldDuration:\n shouldObserveGraphQlResolveFieldDurationAsHistogram(options)\n ? asArray(options.metricNames.graphQlResolveFieldDuration).map(\n (nameOfGraphQlResolveFieldDuration: string) =>\n createHistogram({\n name: `${options.metricPrefix}${nameOfGraphQlResolveFieldDuration}`,\n help: 'The GraphQL field resolving time in seconds.',\n labelNames: defaultLabels\n .concat(['field_name'])\n .concat(options.labels)\n .toSorted(),\n buckets:\n options.metricPercentiles?.graphQlResolveFieldDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlRequestDuration: shouldObserveGraphQlRequestDurationAsHistogram(\n options,\n )\n ? asArray(options.metricNames.graphQlRequestDuration).map(\n (nameOfGraphQlRequestDuration: string) =>\n createHistogram({\n name: `${options.metricPrefix}${nameOfGraphQlRequestDuration}`,\n help: 'The GraphQL request duration time in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricPercentiles?.graphQlRequestDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlErrorsTotal: shouldObserveGraphQlErrorsTotalAsCounter(options)\n ? asArray(options.metricNames.graphQlErrorsTotal).map(\n (nameOfGraphQlErrorsCount: string) =>\n createCounter({\n name: `${options.metricPrefix}${nameOfGraphQlErrorsCount}`,\n help: 'Count of errors while parsing, validating, or executing a GraphQL operation.',\n labelNames: defaultLabels\n .concat(['phase'])\n .concat(options.labels)\n .toSorted(),\n }),\n )\n : undefined,\n});\n\nconst createGraphQlMetrics = (\n options: TDefaultedPromsterOptions,\n): TGraphQlMetrics => {\n const defaultedOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n\n configure({\n prefix: defaultedOptions.metricPrefix,\n });\n\n const metrics = getMetrics(defaultedOptions);\n\n return metrics;\n};\n\ncreateGraphQlMetrics.defaultOptions = defaultOptions;\n\nexport { createGraphQlMetrics };\n","import type { TDefaultedPromsterOptions, THttpMetrics } from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure } from '../client';\nimport {\n createCounter,\n createHistogram,\n createSummary,\n} from '../create-metric';\n\nconst defaultHttpRequestDurationPercentileInSeconds = [\n 0.5, 0.9, 0.95, 0.98, 0.99,\n];\nconst defaultHttpRequestDurationInSeconds = [\n 0.05, 0.1, 0.3, 0.5, 0.8, 1, 1.5, 2, 3, 10,\n];\nconst defaultHttpContentLengthInBytes = [\n 100000, 200000, 500000, 1000000, 1500000, 2000000, 3000000, 5000000, 10000000,\n];\n\nconst defaultLabels = ['path', 'status_code', 'method'];\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst shouldObserveHttpRequestsAsSummary = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsSummary');\nconst shouldObserveHttpRequestsAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsHistogram');\nconst shouldObserveHttpRequestsAsCounter = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsTotal');\nconst shouldObserveHttpContentLengthAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpContentLengthHistogram');\n\nconst defaultOptions = {\n getLabelValues: () => ({}),\n labels: [],\n metricPrefix: '',\n metricTypes: ['httpRequestsTotal', 'httpRequestsHistogram'],\n metricNames: {\n httpRequestsTotal: ['http_requests_total'],\n httpRequestDurationPerPercentileInSeconds: [\n 'http_request_duration_per_percentile_seconds',\n ],\n httpRequestDurationInSeconds: ['http_request_duration_seconds'],\n httpRequestContentLengthInBytes: ['http_request_content_length_bytes'],\n httpResponseContentLengthInBytes: ['http_response_content_length_bytes'],\n },\n metricBuckets: {\n httpRequestContentLengthInBytes: defaultHttpContentLengthInBytes,\n httpRequestDurationInSeconds: defaultHttpRequestDurationInSeconds,\n },\n metricPercentiles: {\n httpRequestDurationPerPercentileInSeconds:\n defaultHttpRequestDurationPercentileInSeconds,\n httpResponseContentLengthInBytes: defaultHttpContentLengthInBytes,\n },\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n httpRequestContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(\n options,\n )\n ? asArray(options.metricNames.httpRequestContentLengthInBytes).map(\n (nameOfHttpContentLengthMetric: string) =>\n createHistogram({\n name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,\n help: 'The HTTP request content length in bytes.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricBuckets?.httpRequestContentLengthInBytes ||\n defaultHttpContentLengthInBytes,\n }),\n )\n : undefined,\n\n httpResponseContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(\n options,\n )\n ? asArray(options.metricNames.httpResponseContentLengthInBytes).map(\n (nameOfHttpContentLengthMetric: string) =>\n createHistogram({\n name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,\n help: 'The HTTP response content length in bytes.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricBuckets?.httpResponseContentLengthInBytes ||\n defaultHttpContentLengthInBytes,\n }),\n )\n : undefined,\n});\n\nconst getHttpRequestLatencyMetricsInSeconds = (\n options: TDefaultedPromsterOptions,\n) => ({\n httpRequestDurationPerPercentileInSeconds: shouldObserveHttpRequestsAsSummary(\n options,\n )\n ? asArray(\n options.metricNames.httpRequestDurationPerPercentileInSeconds,\n ).map((nameOfHttpRequestDurationPerPercentileInSeconds: string) =>\n createSummary({\n name: `${options.metricPrefix}${nameOfHttpRequestDurationPerPercentileInSeconds}`,\n help: 'The HTTP request latencies in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n percentiles:\n options.metricPercentiles\n ?.httpRequestDurationPerPercentileInSeconds ||\n defaultHttpRequestDurationPercentileInSeconds,\n }),\n )\n : undefined,\n\n httpRequestDurationInSeconds: shouldObserveHttpRequestsAsHistogram(options)\n ? asArray(options.metricNames.httpRequestDurationInSeconds).map(\n (nameOfHttpRequestDurationInSecondsMetric: string) =>\n createHistogram({\n name: `${options.metricPrefix}${nameOfHttpRequestDurationInSecondsMetric}`,\n help: 'The HTTP request latencies in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricBuckets?.httpRequestDurationInSeconds ||\n defaultHttpRequestDurationInSeconds,\n }),\n )\n : undefined,\n});\n\nconst getHttpRequestCounterMetric = (options: TDefaultedPromsterOptions) => ({\n httpRequestsTotal: shouldObserveHttpRequestsAsCounter(options)\n ? asArray(options.metricNames.httpRequestsTotal).map(\n (nameOfHttpRequestsTotalMetric: string) =>\n createCounter({\n name: `${options.metricPrefix}${nameOfHttpRequestsTotalMetric}`,\n help: 'The total HTTP requests.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n }),\n )\n : undefined,\n});\n\nconst createHttpMetrics = (\n options: TDefaultedPromsterOptions,\n): THttpMetrics => {\n const defaultedOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n\n configure({\n prefix: defaultedOptions.metricPrefix,\n });\n\n const metrics = getMetrics(defaultedOptions);\n\n const httpRequestLatencyMetricsInSeconds =\n getHttpRequestLatencyMetricsInSeconds(defaultedOptions);\n const httpRequestCounterMetric =\n getHttpRequestCounterMetric(defaultedOptions);\n\n return Object.assign(\n {},\n metrics,\n httpRequestLatencyMetricsInSeconds,\n httpRequestCounterMetric,\n );\n};\n\ncreateHttpMetrics.defaultOptions = defaultOptions;\n\nexport { createHttpMetrics };\n","const NS_PER_SEC = 1e9;\n\nfunction endMeasurementFrom(start: [number, number]) {\n const [seconds, nanoseconds] = process.hrtime(start);\n\n return {\n durationS: (seconds * NS_PER_SEC + nanoseconds) / NS_PER_SEC,\n };\n}\n\nexport { endMeasurementFrom };\n","import type { TLabelValues } from '@promster/types';\n\nfunction sortLabels(unsortedLabels: TLabelValues): TLabelValues {\n return Object.keys(unsortedLabels)\n .toSorted((a, b) => {\n if (a < b) {\n return -1;\n }\n\n if (a > b) {\n return 1;\n }\n\n return 0;\n })\n .reduce<TLabelValues>((sortedLabels, labelName) => {\n sortedLabels[labelName] = unsortedLabels[labelName];\n return sortedLabels;\n }, {});\n}\n\nexport { sortLabels };\n","import type {\n TDefaultedPromsterOptions,\n THttpMetrics,\n TLabelValues,\n TOptionalPromsterOptions,\n} from '@promster/types';\nimport merge from 'merge-options';\n\nimport { endMeasurementFrom } from '../end-measurement-from';\nimport { skipMetricsInEnvironment } from '../environment';\nimport { sortLabels } from '../sort-labels';\nimport type { Timing } from '../timing';\n\ntype TRecordingOptions = {\n labels: TLabelValues;\n requestContentLength?: number;\n responseContentLength?: number;\n};\n\ntype TLegacyTiming = [number, number];\nexport type TRequestRecorder = (\n _timing: Timing | TLegacyTiming,\n _recordingOptions: TRecordingOptions,\n) => void;\n\nconst defaultOptions: TOptionalPromsterOptions = {\n detectKubernetes: false,\n};\n\nfunction isTiming(timing: Timing | TLegacyTiming): timing is Timing {\n return !Array.isArray(timing);\n}\n\nconst createRequestRecorder = (\n metrics: THttpMetrics,\n options: TOptionalPromsterOptions = defaultOptions,\n): TRequestRecorder => {\n const defaultedRecorderOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n const shouldSkipMetricsByEnvironment = skipMetricsInEnvironment(\n defaultedRecorderOptions,\n );\n\n return (\n timing: Timing | TLegacyTiming,\n recordingOptions: TRecordingOptions,\n ) => {\n const durationS = isTiming(timing)\n ? timing.end().value().seconds\n : endMeasurementFrom(timing).durationS;\n\n const labels = sortLabels(recordingOptions.labels);\n\n if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n if (metrics.httpRequestDurationInSeconds) {\n for (const httpRequestDurationInSecondsMetricType of metrics.httpRequestDurationInSeconds) {\n httpRequestDurationInSecondsMetricType.observe(labels, durationS);\n }\n }\n }\n\n if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n if (metrics.httpRequestDurationPerPercentileInSeconds) {\n for (const httpRequestDurationPerPercentileInSecondsMetricType of metrics.httpRequestDurationPerPercentileInSeconds) {\n httpRequestDurationPerPercentileInSecondsMetricType.observe(\n labels,\n durationS,\n );\n }\n }\n }\n\n if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n if (metrics.httpRequestsTotal) {\n for (const httpRequestsTotalMetricType of metrics.httpRequestsTotal) {\n httpRequestsTotalMetricType.inc(labels);\n }\n }\n }\n\n if (recordingOptions.requestContentLength) {\n if (metrics.httpRequestContentLengthInBytes) {\n for (const httpRequestContentLengthInBytesMetricType of metrics.httpRequestContentLengthInBytes) {\n httpRequestContentLengthInBytesMetricType.observe(\n labels,\n recordingOptions.requestContentLength,\n );\n }\n }\n }\n\n if (recordingOptions.responseContentLength) {\n if (metrics.httpResponseContentLengthInBytes) {\n for (const httpResponseContentLengthInBytesMetricType of metrics.httpResponseContentLengthInBytes) {\n httpResponseContentLengthInBytesMetricType.observe(\n labels,\n recordingOptions.responseContentLength,\n );\n }\n }\n }\n };\n};\n\ncreateRequestRecorder.defaultOptions = defaultOptions;\n\nexport { createRequestRecorder, sortLabels, endMeasurementFrom };\n","const normalizeMethod = (method: string): string => method.toLowerCase();\n\nexport { normalizeMethod };\n","import url from 'node:url';\n\nimport UrlValueParser from 'url-value-parser';\n\nconst urlValueParser = new UrlValueParser();\n\nconst normalizePath = (path: string): string => {\n const parsedPathname = url.parse(path).pathname;\n\n if (!parsedPathname) {\n return '';\n }\n\n return urlValueParser.replacePathValues(parsedPathname, '#val');\n};\n\nexport { normalizePath };\n","const normalizeStatusCode = (statusCode: number): number => statusCode;\n\nexport { normalizeStatusCode };\n","import { normalizeMethod } from './method';\nimport { normalizePath } from './path';\nimport { normalizeStatusCode } from './status-code';\n\nconst defaultNormalizers = {\n normalizeStatusCode,\n normalizePath,\n normalizeMethod,\n};\n\nexport {\n normalizeStatusCode,\n normalizePath,\n normalizeMethod,\n defaultNormalizers,\n};\n","import { defaultRegister } from '../client';\n\nconst getSummary = async () => defaultRegister.metrics();\nconst getContentType = () => defaultRegister.contentType;\n\nexport { getSummary, getContentType };\n","class Timing {\n static NS_PER_SEC = BigInt(1e9);\n\n #startTime?: bigint;\n #endTime?: bigint;\n\n constructor() {\n this.reset();\n }\n\n value() {\n const startTime = this.#startTime;\n const endTime = this.#endTime;\n\n if (!endTime || !startTime) {\n return { seconds: undefined };\n }\n\n return { seconds: Number(endTime - startTime) / Number(Timing.NS_PER_SEC) };\n }\n\n reset() {\n this.#startTime = process.hrtime.bigint();\n this.#endTime = undefined;\n\n return this;\n }\n\n end() {\n this.#endTime = process.hrtime.bigint();\n\n return this;\n }\n}\n\nconst timing = {\n start() {\n return new Timing();\n },\n};\n\nexport default timing;\nexport { Timing };\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promster/metrics",
3
- "version": "15.5.2",
3
+ "version": "15.6.0",
4
4
  "description": "Metrics utilities used by all other server integrations",
5
5
  "keywords": [
6
6
  "continousdelivery",
@@ -45,19 +45,19 @@
45
45
  },
46
46
  "dependencies": {
47
47
  "@chainsafe/prometheus-gc-stats": "1.0.2",
48
- "es-toolkit": "1.46.1",
48
+ "es-toolkit": "1.49.0",
49
49
  "merge-options": "3.0.4",
50
50
  "tslib": "2.8.1",
51
51
  "url-value-parser": "2.2.0"
52
52
  },
53
53
  "devDependencies": {
54
- "@types/node": "24.12.2",
54
+ "@types/node": "24.13.3",
55
55
  "prom-client": "15.1.3",
56
- "tsdown": "0.22.2",
57
- "typescript": "6.0.3",
58
- "@promster/tsconfig": "15.5.2",
59
- "@promster/tsdown-config": "15.5.2",
60
- "@promster/types": "15.5.2"
56
+ "tsdown": "0.22.7",
57
+ "typescript": "7.0.2",
58
+ "@promster/tsconfig": "15.6.0",
59
+ "@promster/tsdown-config": "15.6.0",
60
+ "@promster/types": "15.6.0"
61
61
  },
62
62
  "peerDependencies": {
63
63
  "prom-client": "13.x.x || 14.x || 15.x"