-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathPrometheusMessageMetric.ts
More file actions
51 lines (43 loc) · 2.01 KB
/
PrometheusMessageMetric.ts
File metadata and controls
51 lines (43 loc) · 2.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import type { MessageMetricsManager, ProcessedMessageMetadata } from '@message-queue-toolkit/core'
import type { Metric } from 'prom-client'
import promClient from 'prom-client'
import type { MessageVersionGeneratingFunction, PrometheusMetricParams } from './types.ts'
/**w
* Implementation of MessageMetricsManager for Prometheus
*/
export abstract class PrometheusMessageMetric<
MessagePayload extends object,
MetricType extends Metric,
MetricParams extends
PrometheusMetricParams<MessagePayload> = PrometheusMetricParams<MessagePayload>,
> implements MessageMetricsManager<MessagePayload>
{
/** Fallbacks to null if metrics are disabled on app level */
protected readonly metric: MetricType
protected readonly messageVersionGeneratingFunction: MessageVersionGeneratingFunction<MessagePayload>
protected readonly metricParams: MetricParams
/**
* @param metricParams - metrics parameters (see PrometheusMetricParams)
* @param client - use it to specify custom Prometheus client
*/
constructor(metricParams: MetricParams, client?: typeof promClient) {
this.metricParams = metricParams
this.messageVersionGeneratingFunction =
this.resolveMessageVersionGeneratingFunction(metricParams)
this.metric = this.registerMetric(client ?? promClient)
}
private registerMetric(client: typeof promClient): MetricType {
const existingMetric = client.register.getSingleMetric(this.metricParams.name)
return existingMetric
? (existingMetric as MetricType)
: this.createMetric(client, this.metricParams)
}
private resolveMessageVersionGeneratingFunction(
metricParams: MetricParams,
): MessageVersionGeneratingFunction<MessagePayload> {
const messageVersion = metricParams.messageVersion
return typeof messageVersion === 'function' ? messageVersion : () => messageVersion
}
protected abstract createMetric(client: typeof promClient, metricParams: MetricParams): MetricType
abstract registerProcessedMessage(metadata: ProcessedMessageMetadata<MessagePayload>): void
}