@promster/metrics 15.5.1 → 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.
Files changed (42) hide show
  1. package/dist/index.cjs +411 -0
  2. package/dist/index.cjs.map +1 -0
  3. package/dist/index.d.cts +154 -0
  4. package/dist/index.d.ts +154 -0
  5. package/dist/index.js +358 -0
  6. package/dist/index.js.map +1 -0
  7. package/package.json +32 -10
  8. package/dist/declarations/src/client/client.d.ts +0 -9
  9. package/dist/declarations/src/client/index.d.ts +0 -2
  10. package/dist/declarations/src/create-gc-metrics/create-gc-metrics.d.ts +0 -14
  11. package/dist/declarations/src/create-gc-metrics/index.d.ts +0 -2
  12. package/dist/declarations/src/create-gc-observer/create-gc-observer.d.ts +0 -3
  13. package/dist/declarations/src/create-gc-observer/index.d.ts +0 -2
  14. package/dist/declarations/src/create-graphql-metrics/create-graphql-metrics.d.ts +0 -25
  15. package/dist/declarations/src/create-graphql-metrics/index.d.ts +0 -2
  16. package/dist/declarations/src/create-http-metrics/create-http-metrics.d.ts +0 -26
  17. package/dist/declarations/src/create-http-metrics/index.d.ts +0 -2
  18. package/dist/declarations/src/create-request-recorder/create-request-recorder.d.ts +0 -16
  19. package/dist/declarations/src/create-request-recorder/index.d.ts +0 -3
  20. package/dist/declarations/src/end-measurement-from/end-measurement-from.d.ts +0 -4
  21. package/dist/declarations/src/end-measurement-from/index.d.ts +0 -2
  22. package/dist/declarations/src/environment/index.d.ts +0 -3
  23. package/dist/declarations/src/environment/kubernetes.d.ts +0 -2
  24. package/dist/declarations/src/environment/skip-metrics-in-environment.d.ts +0 -6
  25. package/dist/declarations/src/index.d.ts +0 -16
  26. package/dist/declarations/src/normalizers/index.d.ts +0 -9
  27. package/dist/declarations/src/normalizers/method/index.d.ts +0 -2
  28. package/dist/declarations/src/normalizers/method/method.d.ts +0 -2
  29. package/dist/declarations/src/normalizers/path/index.d.ts +0 -2
  30. package/dist/declarations/src/normalizers/path/path.d.ts +0 -2
  31. package/dist/declarations/src/normalizers/status-code/index.d.ts +0 -2
  32. package/dist/declarations/src/normalizers/status-code/status-code.d.ts +0 -2
  33. package/dist/declarations/src/sort-labels/index.d.ts +0 -2
  34. package/dist/declarations/src/sort-labels/sort-labels.d.ts +0 -3
  35. package/dist/declarations/src/summary/index.d.ts +0 -2
  36. package/dist/declarations/src/summary/summary.d.ts +0 -3
  37. package/dist/declarations/src/timing/index.d.ts +0 -2
  38. package/dist/declarations/src/timing/timing.d.ts +0 -17
  39. package/dist/promster-metrics.cjs.d.ts +0 -2
  40. package/dist/promster-metrics.cjs.dev.js +0 -409
  41. package/dist/promster-metrics.cjs.js +0 -7
  42. package/dist/promster-metrics.cjs.prod.js +0 -409
@@ -0,0 +1,154 @@
1
+ import * as Prometheus from "prom-client";
2
+ import { Counter, CounterConfiguration, Gauge, GaugeConfiguration, Histogram, HistogramConfiguration, Summary, SummaryConfiguration } from "prom-client";
3
+ import { TDefaultedPromsterOptions, TGcMetrics, TGraphQlMetrics, THttpMetrics, TLabelValues, TOptionalPromsterOptions } from "@promster/types";
4
+ export type * from "@promster/types";
5
+ //#region src/client/client.d.ts
6
+ declare const defaultRegister: Prometheus.Registry<"text/plain; version=0.0.4; charset=utf-8">;
7
+ //#endregion
8
+ //#region src/create-gc-metrics/create-gc-metrics.d.ts
9
+ declare const defaultOptions$3: {
10
+ getLabelValues: () => {};
11
+ labels: never[];
12
+ metricPrefix: string;
13
+ metricNames: {
14
+ up: string[];
15
+ };
16
+ gcCollectionInterval: number;
17
+ };
18
+ declare function createGcMetrics(options: TDefaultedPromsterOptions): TGcMetrics;
19
+ declare namespace createGcMetrics {
20
+ export { defaultOptions$3 as defaultOptions };
21
+ }
22
+ //#endregion
23
+ //#region src/create-gc-observer/create-gc-observer.d.ts
24
+ declare const createGcObserver: (_metrics: TGcMetrics, options: TDefaultedPromsterOptions) => () => void;
25
+ //#endregion
26
+ //#region src/create-graphql-metrics/create-graphql-metrics.d.ts
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[];
45
+ };
46
+ };
47
+ declare function createGraphQlMetrics(options: TDefaultedPromsterOptions): TGraphQlMetrics;
48
+ declare namespace createGraphQlMetrics {
49
+ export { defaultOptions$2 as defaultOptions };
50
+ }
51
+ //#endregion
52
+ //#region src/create-http-metrics/create-http-metrics.d.ts
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[];
72
+ };
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>;
84
+ //#endregion
85
+ //#region src/end-measurement-from/end-measurement-from.d.ts
86
+ declare function endMeasurementFrom(start: [number, number]): {
87
+ durationS: number;
88
+ };
89
+ //#endregion
90
+ //#region src/sort-labels/sort-labels.d.ts
91
+ declare function sortLabels(unsortedLabels: TLabelValues): TLabelValues;
92
+ //#endregion
93
+ //#region src/timing/timing.d.ts
94
+ declare class Timing {
95
+ #private;
96
+ static NS_PER_SEC: bigint;
97
+ constructor();
98
+ value(): {
99
+ seconds: undefined;
100
+ } | {
101
+ seconds: number;
102
+ };
103
+ reset(): this;
104
+ end(): this;
105
+ }
106
+ declare const timing: {
107
+ start(): Timing;
108
+ };
109
+ //#endregion
110
+ //#region src/create-request-recorder/create-request-recorder.d.ts
111
+ type TRecordingOptions = {
112
+ labels: TLabelValues;
113
+ requestContentLength?: number;
114
+ responseContentLength?: number;
115
+ };
116
+ type TLegacyTiming = [number, number];
117
+ type TRequestRecorder = (_timing: Timing | TLegacyTiming, _recordingOptions: TRecordingOptions) => void;
118
+ declare const defaultOptions: TOptionalPromsterOptions;
119
+ declare function createRequestRecorder(metrics: THttpMetrics, options?: TOptionalPromsterOptions): TRequestRecorder;
120
+ declare namespace createRequestRecorder {
121
+ export { defaultOptions };
122
+ }
123
+ //#endregion
124
+ //#region src/environment/kubernetes.d.ts
125
+ declare const isRunningInKubernetes: () => boolean;
126
+ //#endregion
127
+ //#region src/environment/skip-metrics-in-environment.d.ts
128
+ type TSkipMetricsInEnvironmentOptions = {
129
+ detectKubernetes?: TOptionalPromsterOptions['detectKubernetes'];
130
+ };
131
+ declare const skipMetricsInEnvironment: (options: TSkipMetricsInEnvironmentOptions) => boolean;
132
+ //#endregion
133
+ //#region src/normalizers/method/method.d.ts
134
+ declare const normalizeMethod: (method: string) => string;
135
+ //#endregion
136
+ //#region src/normalizers/path/path.d.ts
137
+ declare const normalizePath: (path: string) => string;
138
+ //#endregion
139
+ //#region src/normalizers/status-code/status-code.d.ts
140
+ declare const normalizeStatusCode: (statusCode: number) => number;
141
+ //#endregion
142
+ //#region src/normalizers/index.d.ts
143
+ declare const defaultNormalizers: {
144
+ normalizeStatusCode: typeof normalizeStatusCode;
145
+ normalizePath: typeof normalizePath;
146
+ normalizeMethod: typeof normalizeMethod;
147
+ };
148
+ //#endregion
149
+ //#region src/summary/summary.d.ts
150
+ declare const getSummary: () => Promise<string>;
151
+ declare const getContentType: () => "text/plain; version=0.0.4; charset=utf-8";
152
+ //#endregion
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 };
154
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,358 @@
1
+ import { once } from "es-toolkit/function";
2
+ import * as Prometheus from "prom-client";
3
+ import merge from "merge-options";
4
+ import { gcStats } from "@chainsafe/prometheus-gc-stats";
5
+ import url from "node:url";
6
+ import UrlValueParser from "url-value-parser";
7
+ //#region src/environment/kubernetes.ts
8
+ const isRunningInKubernetes = () => Boolean(process.env.KUBERNETES_SERVICE_HOST);
9
+ //#endregion
10
+ //#region src/environment/skip-metrics-in-environment.ts
11
+ const skipMetricsInEnvironment = (options) => options.detectKubernetes === true && !isRunningInKubernetes();
12
+ //#endregion
13
+ //#region src/client/client.ts
14
+ const defaultRegister = Prometheus.register;
15
+ const configure = once((options) => {
16
+ if (!skipMetricsInEnvironment(options)) Prometheus.collectDefaultMetrics(options);
17
+ });
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
41
+ //#region src/create-gc-metrics/create-gc-metrics.ts
42
+ const asArray$2 = (maybeArray) => Array.isArray(maybeArray) ? maybeArray : [maybeArray];
43
+ const defaultOptions$4 = {
44
+ getLabelValues: () => ({}),
45
+ labels: [],
46
+ metricPrefix: "",
47
+ metricNames: { up: ["nodejs_up"] },
48
+ gcCollectionInterval: 6e3
49
+ };
50
+ const getMetrics$2 = (options) => ({ up: asArray$2(options.metricNames.up).map((nameOfUpMetric) => createGauge({
51
+ name: `${options.metricPrefix}${nameOfUpMetric}`,
52
+ help: "1 = nodejs server is up, 0 = nodejs server is not up"
53
+ })) });
54
+ const createGcMetrics = (options) => {
55
+ const defaultedOptions = merge(defaultOptions$4, options);
56
+ configure({ prefix: defaultedOptions.metricPrefix });
57
+ return getMetrics$2(defaultedOptions);
58
+ };
59
+ createGcMetrics.defaultOptions = defaultOptions$4;
60
+ //#endregion
61
+ //#region src/create-gc-observer/create-gc-observer.ts
62
+ const defaultOptions$3 = { disableGcMetrics: false };
63
+ const createGcObserver = once((_metrics, options) => () => {
64
+ gcStats(defaultRegister, {
65
+ collectionInterval: options.gcCollectionInterval,
66
+ prefix: options.metricPrefix
67
+ });
68
+ });
69
+ createGcObserver.defaultOptions = defaultOptions$3;
70
+ //#endregion
71
+ //#region src/create-graphql-metrics/create-graphql-metrics.ts
72
+ const defaultGraphQlPercentiles = [
73
+ .5,
74
+ .9,
75
+ .95,
76
+ .98,
77
+ .99
78
+ ];
79
+ const defaultLabels$1 = ["operation_name"];
80
+ const asArray$1 = (maybeArray) => Array.isArray(maybeArray) ? maybeArray : [maybeArray];
81
+ const shouldObserveGraphQlParseDurationAsHistogram = (options) => options.metricTypes.includes("graphQlParseDurationHistogram");
82
+ const shouldObserveGraphQlValidationDurationAsHistogram = (options) => options.metricTypes.includes("graphQlValidationDurationHistogram");
83
+ const shouldObserveGraphQlResolveFieldDurationAsHistogram = (options) => options.metricTypes.includes("graphQlResolveFieldDurationHistogram");
84
+ const shouldObserveGraphQlRequestDurationAsHistogram = (options) => options.metricTypes.includes("graphQlRequestDurationHistogram");
85
+ const shouldObserveGraphQlErrorsTotalAsCounter = (options) => options.metricTypes.includes("graphQlErrorsTotal");
86
+ const defaultOptions$2 = {
87
+ getLabelValues: () => ({}),
88
+ labels: [],
89
+ metricPrefix: "",
90
+ metricTypes: [
91
+ "graphQlParseDurationHistogram",
92
+ "graphQlValidationDurationHistogram",
93
+ "graphQlResolveFieldDurationHistogram",
94
+ "graphQlRequestDurationHistogram",
95
+ "graphQlErrorsTotal"
96
+ ],
97
+ metricNames: {
98
+ graphQlParseDuration: ["graphql_parse_duration_seconds"],
99
+ graphQlValidationDuration: ["graphql_validation_duration_seconds"],
100
+ graphQlResolveFieldDuration: ["graphql_resolve_field_duration_seconds"],
101
+ graphQlRequestDuration: ["graphql_request_duration_seconds"],
102
+ graphQlErrorsTotal: ["graphql_errors_total"]
103
+ },
104
+ metricPercentiles: {
105
+ graphQlParseDuration: defaultGraphQlPercentiles,
106
+ graphQlValidationDuration: defaultGraphQlPercentiles,
107
+ graphQlResolveFieldDuration: defaultGraphQlPercentiles,
108
+ graphQlRequestDuration: defaultGraphQlPercentiles,
109
+ graphQlErrorsTotal: defaultGraphQlPercentiles
110
+ }
111
+ };
112
+ const getMetrics$1 = (options) => ({
113
+ graphQlParseDuration: shouldObserveGraphQlParseDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlParseDuration).map((nameOfGraphQlParseDuration) => createHistogram({
114
+ name: `${options.metricPrefix}${nameOfGraphQlParseDuration}`,
115
+ help: "The GraphQL request parse time in seconds.",
116
+ labelNames: defaultLabels$1.concat(options.labels).toSorted(),
117
+ buckets: options.metricPercentiles?.graphQlParseDuration || defaultGraphQlPercentiles
118
+ })) : void 0,
119
+ graphQlValidationDuration: shouldObserveGraphQlValidationDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlValidationDuration).map((nameOfGraphQlValidationDuration) => createHistogram({
120
+ name: `${options.metricPrefix}${nameOfGraphQlValidationDuration}`,
121
+ help: "The GraphQL request validation time in seconds.",
122
+ labelNames: defaultLabels$1.concat(options.labels).toSorted(),
123
+ buckets: options.metricPercentiles?.graphQlValidationDuration || defaultGraphQlPercentiles
124
+ })) : void 0,
125
+ graphQlResolveFieldDuration: shouldObserveGraphQlResolveFieldDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlResolveFieldDuration).map((nameOfGraphQlResolveFieldDuration) => createHistogram({
126
+ name: `${options.metricPrefix}${nameOfGraphQlResolveFieldDuration}`,
127
+ help: "The GraphQL field resolving time in seconds.",
128
+ labelNames: defaultLabels$1.concat(["field_name"]).concat(options.labels).toSorted(),
129
+ buckets: options.metricPercentiles?.graphQlResolveFieldDuration || defaultGraphQlPercentiles
130
+ })) : void 0,
131
+ graphQlRequestDuration: shouldObserveGraphQlRequestDurationAsHistogram(options) ? asArray$1(options.metricNames.graphQlRequestDuration).map((nameOfGraphQlRequestDuration) => createHistogram({
132
+ name: `${options.metricPrefix}${nameOfGraphQlRequestDuration}`,
133
+ help: "The GraphQL request duration time in seconds.",
134
+ labelNames: defaultLabels$1.concat(options.labels).toSorted(),
135
+ buckets: options.metricPercentiles?.graphQlRequestDuration || defaultGraphQlPercentiles
136
+ })) : void 0,
137
+ graphQlErrorsTotal: shouldObserveGraphQlErrorsTotalAsCounter(options) ? asArray$1(options.metricNames.graphQlErrorsTotal).map((nameOfGraphQlErrorsCount) => createCounter({
138
+ name: `${options.metricPrefix}${nameOfGraphQlErrorsCount}`,
139
+ help: "Count of errors while parsing, validating, or executing a GraphQL operation.",
140
+ labelNames: defaultLabels$1.concat(["phase"]).concat(options.labels).toSorted()
141
+ })) : void 0
142
+ });
143
+ const createGraphQlMetrics = (options) => {
144
+ const defaultedOptions = merge(defaultOptions$2, options);
145
+ configure({ prefix: defaultedOptions.metricPrefix });
146
+ return getMetrics$1(defaultedOptions);
147
+ };
148
+ createGraphQlMetrics.defaultOptions = defaultOptions$2;
149
+ //#endregion
150
+ //#region src/create-http-metrics/create-http-metrics.ts
151
+ const defaultHttpRequestDurationPercentileInSeconds = [
152
+ .5,
153
+ .9,
154
+ .95,
155
+ .98,
156
+ .99
157
+ ];
158
+ const defaultHttpRequestDurationInSeconds = [
159
+ .05,
160
+ .1,
161
+ .3,
162
+ .5,
163
+ .8,
164
+ 1,
165
+ 1.5,
166
+ 2,
167
+ 3,
168
+ 10
169
+ ];
170
+ const defaultHttpContentLengthInBytes = [
171
+ 1e5,
172
+ 2e5,
173
+ 5e5,
174
+ 1e6,
175
+ 15e5,
176
+ 2e6,
177
+ 3e6,
178
+ 5e6,
179
+ 1e7
180
+ ];
181
+ const defaultLabels = [
182
+ "path",
183
+ "status_code",
184
+ "method"
185
+ ];
186
+ const asArray = (maybeArray) => Array.isArray(maybeArray) ? maybeArray : [maybeArray];
187
+ const shouldObserveHttpRequestsAsSummary = (options) => options.metricTypes.includes("httpRequestsSummary");
188
+ const shouldObserveHttpRequestsAsHistogram = (options) => options.metricTypes.includes("httpRequestsHistogram");
189
+ const shouldObserveHttpRequestsAsCounter = (options) => options.metricTypes.includes("httpRequestsTotal");
190
+ const shouldObserveHttpContentLengthAsHistogram = (options) => options.metricTypes.includes("httpContentLengthHistogram");
191
+ const defaultOptions$1 = {
192
+ getLabelValues: () => ({}),
193
+ labels: [],
194
+ metricPrefix: "",
195
+ metricTypes: ["httpRequestsTotal", "httpRequestsHistogram"],
196
+ metricNames: {
197
+ httpRequestsTotal: ["http_requests_total"],
198
+ httpRequestDurationPerPercentileInSeconds: ["http_request_duration_per_percentile_seconds"],
199
+ httpRequestDurationInSeconds: ["http_request_duration_seconds"],
200
+ httpRequestContentLengthInBytes: ["http_request_content_length_bytes"],
201
+ httpResponseContentLengthInBytes: ["http_response_content_length_bytes"]
202
+ },
203
+ metricBuckets: {
204
+ httpRequestContentLengthInBytes: defaultHttpContentLengthInBytes,
205
+ httpRequestDurationInSeconds: defaultHttpRequestDurationInSeconds
206
+ },
207
+ metricPercentiles: {
208
+ httpRequestDurationPerPercentileInSeconds: defaultHttpRequestDurationPercentileInSeconds,
209
+ httpResponseContentLengthInBytes: defaultHttpContentLengthInBytes
210
+ }
211
+ };
212
+ const getMetrics = (options) => ({
213
+ httpRequestContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(options) ? asArray(options.metricNames.httpRequestContentLengthInBytes).map((nameOfHttpContentLengthMetric) => createHistogram({
214
+ name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,
215
+ help: "The HTTP request content length in bytes.",
216
+ labelNames: defaultLabels.concat(options.labels).toSorted(),
217
+ buckets: options.metricBuckets?.httpRequestContentLengthInBytes || defaultHttpContentLengthInBytes
218
+ })) : void 0,
219
+ httpResponseContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(options) ? asArray(options.metricNames.httpResponseContentLengthInBytes).map((nameOfHttpContentLengthMetric) => createHistogram({
220
+ name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,
221
+ help: "The HTTP response content length in bytes.",
222
+ labelNames: defaultLabels.concat(options.labels).toSorted(),
223
+ buckets: options.metricBuckets?.httpResponseContentLengthInBytes || defaultHttpContentLengthInBytes
224
+ })) : void 0
225
+ });
226
+ const getHttpRequestLatencyMetricsInSeconds = (options) => ({
227
+ httpRequestDurationPerPercentileInSeconds: shouldObserveHttpRequestsAsSummary(options) ? asArray(options.metricNames.httpRequestDurationPerPercentileInSeconds).map((nameOfHttpRequestDurationPerPercentileInSeconds) => createSummary({
228
+ name: `${options.metricPrefix}${nameOfHttpRequestDurationPerPercentileInSeconds}`,
229
+ help: "The HTTP request latencies in seconds.",
230
+ labelNames: defaultLabels.concat(options.labels).toSorted(),
231
+ percentiles: options.metricPercentiles?.httpRequestDurationPerPercentileInSeconds || defaultHttpRequestDurationPercentileInSeconds
232
+ })) : void 0,
233
+ httpRequestDurationInSeconds: shouldObserveHttpRequestsAsHistogram(options) ? asArray(options.metricNames.httpRequestDurationInSeconds).map((nameOfHttpRequestDurationInSecondsMetric) => createHistogram({
234
+ name: `${options.metricPrefix}${nameOfHttpRequestDurationInSecondsMetric}`,
235
+ help: "The HTTP request latencies in seconds.",
236
+ labelNames: defaultLabels.concat(options.labels).toSorted(),
237
+ buckets: options.metricBuckets?.httpRequestDurationInSeconds || defaultHttpRequestDurationInSeconds
238
+ })) : void 0
239
+ });
240
+ const getHttpRequestCounterMetric = (options) => ({ httpRequestsTotal: shouldObserveHttpRequestsAsCounter(options) ? asArray(options.metricNames.httpRequestsTotal).map((nameOfHttpRequestsTotalMetric) => createCounter({
241
+ name: `${options.metricPrefix}${nameOfHttpRequestsTotalMetric}`,
242
+ help: "The total HTTP requests.",
243
+ labelNames: defaultLabels.concat(options.labels).toSorted()
244
+ })) : void 0 });
245
+ const createHttpMetrics = (options) => {
246
+ const defaultedOptions = merge(defaultOptions$1, options);
247
+ configure({ prefix: defaultedOptions.metricPrefix });
248
+ const metrics = getMetrics(defaultedOptions);
249
+ const httpRequestLatencyMetricsInSeconds = getHttpRequestLatencyMetricsInSeconds(defaultedOptions);
250
+ const httpRequestCounterMetric = getHttpRequestCounterMetric(defaultedOptions);
251
+ return Object.assign({}, metrics, httpRequestLatencyMetricsInSeconds, httpRequestCounterMetric);
252
+ };
253
+ createHttpMetrics.defaultOptions = defaultOptions$1;
254
+ //#endregion
255
+ //#region src/end-measurement-from/end-measurement-from.ts
256
+ const NS_PER_SEC = 1e9;
257
+ function endMeasurementFrom(start) {
258
+ const [seconds, nanoseconds] = process.hrtime(start);
259
+ return { durationS: (seconds * NS_PER_SEC + nanoseconds) / NS_PER_SEC };
260
+ }
261
+ //#endregion
262
+ //#region src/sort-labels/sort-labels.ts
263
+ function sortLabels(unsortedLabels) {
264
+ return Object.keys(unsortedLabels).toSorted((a, b) => {
265
+ if (a < b) return -1;
266
+ if (a > b) return 1;
267
+ return 0;
268
+ }).reduce((sortedLabels, labelName) => {
269
+ sortedLabels[labelName] = unsortedLabels[labelName];
270
+ return sortedLabels;
271
+ }, {});
272
+ }
273
+ //#endregion
274
+ //#region src/create-request-recorder/create-request-recorder.ts
275
+ const defaultOptions = { detectKubernetes: false };
276
+ function isTiming(timing) {
277
+ return !Array.isArray(timing);
278
+ }
279
+ const createRequestRecorder = (metrics, options = defaultOptions) => {
280
+ const shouldSkipMetricsByEnvironment = skipMetricsInEnvironment(merge(defaultOptions, options));
281
+ return (timing, recordingOptions) => {
282
+ const durationS = isTiming(timing) ? timing.end().value().seconds : endMeasurementFrom(timing).durationS;
283
+ const labels = sortLabels(recordingOptions.labels);
284
+ if (!shouldSkipMetricsByEnvironment && durationS !== void 0) {
285
+ if (metrics.httpRequestDurationInSeconds) for (const httpRequestDurationInSecondsMetricType of metrics.httpRequestDurationInSeconds) httpRequestDurationInSecondsMetricType.observe(labels, durationS);
286
+ }
287
+ if (!shouldSkipMetricsByEnvironment && durationS !== void 0) {
288
+ if (metrics.httpRequestDurationPerPercentileInSeconds) for (const httpRequestDurationPerPercentileInSecondsMetricType of metrics.httpRequestDurationPerPercentileInSeconds) httpRequestDurationPerPercentileInSecondsMetricType.observe(labels, durationS);
289
+ }
290
+ if (!shouldSkipMetricsByEnvironment && durationS !== void 0) {
291
+ if (metrics.httpRequestsTotal) for (const httpRequestsTotalMetricType of metrics.httpRequestsTotal) httpRequestsTotalMetricType.inc(labels);
292
+ }
293
+ if (recordingOptions.requestContentLength) {
294
+ if (metrics.httpRequestContentLengthInBytes) for (const httpRequestContentLengthInBytesMetricType of metrics.httpRequestContentLengthInBytes) httpRequestContentLengthInBytesMetricType.observe(labels, recordingOptions.requestContentLength);
295
+ }
296
+ if (recordingOptions.responseContentLength) {
297
+ if (metrics.httpResponseContentLengthInBytes) for (const httpResponseContentLengthInBytesMetricType of metrics.httpResponseContentLengthInBytes) httpResponseContentLengthInBytesMetricType.observe(labels, recordingOptions.responseContentLength);
298
+ }
299
+ };
300
+ };
301
+ createRequestRecorder.defaultOptions = defaultOptions;
302
+ //#endregion
303
+ //#region src/normalizers/method/method.ts
304
+ const normalizeMethod = (method) => method.toLowerCase();
305
+ //#endregion
306
+ //#region src/normalizers/path/path.ts
307
+ const urlValueParser = new UrlValueParser();
308
+ const normalizePath = (path) => {
309
+ const parsedPathname = url.parse(path).pathname;
310
+ if (!parsedPathname) return "";
311
+ return urlValueParser.replacePathValues(parsedPathname, "#val");
312
+ };
313
+ //#endregion
314
+ //#region src/normalizers/status-code/status-code.ts
315
+ const normalizeStatusCode = (statusCode) => statusCode;
316
+ //#endregion
317
+ //#region src/normalizers/index.ts
318
+ const defaultNormalizers = {
319
+ normalizeStatusCode,
320
+ normalizePath,
321
+ normalizeMethod
322
+ };
323
+ //#endregion
324
+ //#region src/summary/summary.ts
325
+ const getSummary = async () => defaultRegister.metrics();
326
+ const getContentType = () => defaultRegister.contentType;
327
+ //#endregion
328
+ //#region src/timing/timing.ts
329
+ var Timing = class Timing {
330
+ static NS_PER_SEC = BigInt(1e9);
331
+ #startTime;
332
+ #endTime;
333
+ constructor() {
334
+ this.reset();
335
+ }
336
+ value() {
337
+ const startTime = this.#startTime;
338
+ const endTime = this.#endTime;
339
+ if (!endTime || !startTime) return { seconds: void 0 };
340
+ return { seconds: Number(endTime - startTime) / Number(Timing.NS_PER_SEC) };
341
+ }
342
+ reset() {
343
+ this.#startTime = process.hrtime.bigint();
344
+ this.#endTime = void 0;
345
+ return this;
346
+ }
347
+ end() {
348
+ this.#endTime = process.hrtime.bigint();
349
+ return this;
350
+ }
351
+ };
352
+ const timing = { start() {
353
+ return new Timing();
354
+ } };
355
+ //#endregion
356
+ export { Prometheus, createCounter, createGauge, createGcMetrics, createGcObserver, createGraphQlMetrics, createHistogram, createHttpMetrics, createRequestRecorder, createSummary, defaultNormalizers, defaultRegister, endMeasurementFrom, getContentType, getSummary, isRunningInKubernetes, normalizeMethod, normalizePath, normalizeStatusCode, skipMetricsInEnvironment, sortLabels, timing };
357
+
358
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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-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.1",
3
+ "version": "15.6.0",
4
4
  "description": "Metrics utilities used by all other server integrations",
5
5
  "keywords": [
6
6
  "continousdelivery",
@@ -22,27 +22,42 @@
22
22
  "readme.md",
23
23
  "package.json",
24
24
  "LICENSE",
25
- "dist/**",
26
- "modules/**"
25
+ "dist/**"
27
26
  ],
28
- "main": "dist/promster-metrics.cjs.js",
29
- "types": "dist/promster-metrics.cjs.d.ts",
30
- "typings": "dist/promster-metrics.cjs.d.ts",
27
+ "type": "module",
28
+ "sideEffects": false,
29
+ "main": "./dist/index.js",
30
+ "types": "./dist/index.d.ts",
31
+ "exports": {
32
+ ".": {
33
+ "import": {
34
+ "types": "./dist/index.d.ts",
35
+ "default": "./dist/index.js"
36
+ },
37
+ "require": {
38
+ "types": "./dist/index.d.cts",
39
+ "default": "./dist/index.cjs"
40
+ }
41
+ }
42
+ },
31
43
  "publishConfig": {
32
44
  "access": "public"
33
45
  },
34
46
  "dependencies": {
35
47
  "@chainsafe/prometheus-gc-stats": "1.0.2",
36
- "es-toolkit": "1.46.1",
48
+ "es-toolkit": "1.49.0",
37
49
  "merge-options": "3.0.4",
38
50
  "tslib": "2.8.1",
39
51
  "url-value-parser": "2.2.0"
40
52
  },
41
53
  "devDependencies": {
42
- "@types/node": "24.12.2",
54
+ "@types/node": "24.13.3",
43
55
  "prom-client": "15.1.3",
44
- "typescript": "6.0.3",
45
- "@promster/types": "15.5.1"
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"
46
61
  },
47
62
  "peerDependencies": {
48
63
  "prom-client": "13.x.x || 14.x || 15.x"
@@ -50,5 +65,12 @@
50
65
  "engines": {
51
66
  "node": ">=20",
52
67
  "npm": ">=8"
68
+ },
69
+ "scripts": {
70
+ "build": "tsdown",
71
+ "check-types": "tsc --noEmit",
72
+ "test": "vitest --run",
73
+ "test:watch": "vitest",
74
+ "dev": "tsdown --watch"
53
75
  }
54
76
  }