Files
speckle-server/packages/server/observability/components/apollo/metrics/apolloSubscriptionMonitoring.ts
T
Iain Sproat 5e4a6c5635 fix(server/prometheus): ensure consistent Prometheus registry is used (#4106)
* fix(server/prometheus): ensure consistent Prometheus registry is used
- there was a conflicting dependency between Metrics initialization and Modules initialization; resolved by separating registry initialization from metrics initialization
- pass in the registry to prevent implicit dependency being broken
- when registering a metric, first attempt to remove any of existing metrics with same name to prevent errors
- to prevent sneaky uses of the implicit registry, replace default import with explicit import so it is clearer when prometheusClient.registry is used

* Add tests for registering metrics
2025-03-04 08:41:53 +00:00

63 lines
2.1 KiB
TypeScript

import { Counter, Gauge, Registry } from 'prom-client'
let apolloSubscriptionMonitoringIsInitialized = false
let metricConnectCounter: Counter<string>
let metricConnectedClients: Gauge<string>
let metricSubscriptionTotalOperations: Counter<'subscriptionType'>
let metricSubscriptionTotalResponses: Counter<'subscriptionType' | 'status'>
export const initApolloSubscriptionMonitoring = (params: { registers: Registry[] }) => {
const { registers } = params
if (apolloSubscriptionMonitoringIsInitialized)
return {
metricConnectCounter,
metricConnectedClients,
metricSubscriptionTotalOperations,
metricSubscriptionTotalResponses
}
// Init metrics
registers.forEach((r) => r.removeSingleMetric('speckle_server_apollo_connect'))
metricConnectCounter = new Counter({
name: 'speckle_server_apollo_connect',
help: 'Number of connects',
registers
})
registers.forEach((r) => r.removeSingleMetric('speckle_server_apollo_clients'))
metricConnectedClients = new Gauge({
name: 'speckle_server_apollo_clients',
help: 'Number of currently connected clients',
registers
})
registers.forEach((r) =>
r.removeSingleMetric('speckle_server_apollo_graphql_total_subscription_operations')
)
metricSubscriptionTotalOperations = new Counter({
name: 'speckle_server_apollo_graphql_total_subscription_operations',
help: 'Number of total subscription operations served by this instance',
labelNames: ['subscriptionType'] as const,
registers
})
registers.forEach((r) =>
r.removeSingleMetric('speckle_server_apollo_graphql_total_subscription_responses')
)
metricSubscriptionTotalResponses = new Counter({
name: 'speckle_server_apollo_graphql_total_subscription_responses',
help: 'Number of total subscription responses served by this instance',
labelNames: ['subscriptionType', 'status'] as const,
registers
})
apolloSubscriptionMonitoringIsInitialized = true
return {
metricConnectCounter,
metricConnectedClients,
metricSubscriptionTotalOperations,
metricSubscriptionTotalResponses
}
}