51 lines
1.8 KiB
TypeScript
51 lines
1.8 KiB
TypeScript
import fastify, { FastifyInstance, FastifyServerOptions } from 'fastify'
|
|
import { routes, plugins, setErrorHandler } from './http'
|
|
import { Registry } from 'prom-client'
|
|
|
|
const build = (opts: FastifyServerOptions = {}, appInstance?: FastifyInstance): FastifyInstance => {
|
|
const app = fastify(opts)
|
|
app.register(plugins.signals)
|
|
app.register(plugins.adminTenantId)
|
|
app.register(plugins.logRequest({ excludeUrls: ['/status', '/metrics', '/health'] }))
|
|
app.register(routes.tenants, { prefix: 'tenants' })
|
|
app.register(routes.objects, { prefix: 'tenants' })
|
|
app.register(routes.migrations, { prefix: 'migrations' })
|
|
app.register(routes.s3Credentials, { prefix: 's3' })
|
|
|
|
let registriesToMerge: Registry[] = []
|
|
|
|
if (appInstance) {
|
|
app.get('/metrics', async (req, reply) => {
|
|
if (registriesToMerge.length === 0) {
|
|
const globalRegistry = appInstance.metrics.client.register
|
|
const defaultRegistries = (appInstance.metrics as any).getCustomDefaultMetricsRegistries()
|
|
const routeRegistries = (appInstance.metrics as any).getCustomRouteMetricsRegistries()
|
|
|
|
registriesToMerge = Array.from(
|
|
new Set([globalRegistry, ...defaultRegistries, ...routeRegistries])
|
|
)
|
|
}
|
|
|
|
if (registriesToMerge.length === 1) {
|
|
const data = await registriesToMerge[0].metrics()
|
|
return reply.type(registriesToMerge[0].contentType).send(data)
|
|
}
|
|
const merged = appInstance.metrics.client.Registry.merge(registriesToMerge)
|
|
|
|
const data = await merged.metrics()
|
|
|
|
return reply.type(merged.contentType).send(data)
|
|
})
|
|
} else {
|
|
app.register(plugins.metrics({ enabledEndpoint: true }))
|
|
}
|
|
|
|
app.get('/status', async (_, response) => response.status(200).send())
|
|
|
|
setErrorHandler(app)
|
|
|
|
return app
|
|
}
|
|
|
|
export default build
|