metrics.ts 1.49 KB
Newer Older
1 2
import { Server } from 'net'

3 4 5 6 7
import prometheus, {
  collectDefaultMetrics,
  DefaultMetricsCollectorConfiguration,
  Registry,
} from 'prom-client'
8 9 10
import express from 'express'

import { Logger } from './logger'
11 12

export interface MetricsOptions {
13
  prefix?: string
14 15 16
  labels?: Object
}

17
export class LegacyMetrics {
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
  options: MetricsOptions
  client: typeof prometheus
  registry: Registry

  constructor(options: MetricsOptions) {
    this.options = options

    const metricsOptions: DefaultMetricsCollectorConfiguration = {
      prefix: options.prefix,
      labels: options.labels,
    }

    this.client = prometheus
    this.registry = prometheus.register

    // Collect default metrics (event loop lag, memory, file descriptors etc.)
    collectDefaultMetrics(metricsOptions)
  }
}
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

export interface MetricsServerOptions {
  logger: Logger
  registry: Registry
  port?: number
  route?: string
  hostname?: string
}

export const createMetricsServer = async (
  options: MetricsServerOptions
): Promise<Server> => {
  const logger = options.logger.child({ component: 'MetricsServer' })

  const app = express()

  const route = options.route || '/metrics'
  app.get(route, async (_, res) => {
    res.status(200).send(await options.registry.metrics())
  })

  const port = options.port || 7300
59
  const hostname = options.hostname || '0.0.0.0'
60 61 62 63 64 65 66 67 68 69
  const server = app.listen(port, hostname, () => {
    logger.info('Metrics server started', {
      port,
      hostname,
      route,
    })
  })

  return server
}