• Kelvin Fichter's avatar
    feat(cmn): clean up BaseServiceV2 options · 9b289185
    Kelvin Fichter authored
    Cleans up the system of options for BaseServiceV2. Includes some
    refactoring to reduce the size of base-service-v2.ts. Primary change
    from a user point of view is that standard options and regular options
    get merged. Makes it more clear how user inputted options will override
    defaults provided by the service.
    9b289185
metrics.ts 1.49 KB
import { Server } from 'net'

import prometheus, {
  collectDefaultMetrics,
  DefaultMetricsCollectorConfiguration,
  Registry,
} from 'prom-client'
import express from 'express'

import { Logger } from './logger'

export interface MetricsOptions {
  prefix?: string
  labels?: Object
}

export class LegacyMetrics {
  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)
  }
}

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
  const hostname = options.hostname || '0.0.0.0'
  const server = app.listen(port, hostname, () => {
    logger.info('Metrics server started', {
      port,
      hostname,
      route,
    })
  })

  return server
}