Files
speckle-server/packages/server/logging/index.ts
T
Iain Sproat 8197bb74a3 feat(multi-region): metrics for knex for all regional databases (#3580)
* feat(multi-region): metrics for knex for all regional databases

* improve typing in knex monitoring

* error logging around migrations

* await async calls for db connections
- add 'region' label

* add missing 'await' statements

* more missing 'await'

* guard against re-adding listeners

* It was possible for update to be called before initialize
- this change collapses both into initialize, and adds checks to ensure initialization is done before being updated for new regions

* separate back into non-exported const and rename

* align with main

* Amend order at which metrics is enabled
2024-12-12 11:03:25 +01:00

48 lines
1.6 KiB
TypeScript

/* istanbul ignore file */
import prometheusClient from 'prom-client'
import promBundle from 'express-prom-bundle'
import { initKnexPrometheusMetrics } from '@/logging/knexMonitoring'
import { initHighFrequencyMonitoring } from '@/logging/highFrequencyMetrics/highfrequencyMonitoring'
import { highFrequencyMetricsCollectionPeriodMs } from '@/modules/shared/helpers/envHelper'
import { startupLogger as logger } from '@/logging/logging'
import type express from 'express'
import { getAllRegisteredDbClients } from '@/modules/multiregion/utils/dbSelector'
let prometheusInitialized = false
export default async function (app: express.Express) {
if (!prometheusInitialized) {
prometheusInitialized = true
prometheusClient.register.clear()
prometheusClient.register.setDefaultLabels({
project: 'speckle-server',
app: 'server'
})
prometheusClient.collectDefaultMetrics()
const highfrequencyMonitoring = initHighFrequencyMonitoring({
register: prometheusClient.register,
collectionPeriodMilliseconds: highFrequencyMetricsCollectionPeriodMs(),
config: {
getDbClients: getAllRegisteredDbClients
}
})
highfrequencyMonitoring.start()
await initKnexPrometheusMetrics({
register: prometheusClient.register,
getAllDbClients: getAllRegisteredDbClients,
logger
})
const expressMetricsMiddleware = promBundle({
includeMethod: true,
includePath: true,
httpDurationMetricName: 'speckle_server_request_duration',
metricType: 'summary',
autoregister: false
})
app.use(expressMetricsMiddleware)
}
}