8197bb74a3
* 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
48 lines
1.6 KiB
TypeScript
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)
|
|
}
|
|
}
|