github.com/ethereum-optimism/optimism@v1.7.2/packages/common-ts/src/common/metrics.ts (about)

     1  import { Server } from 'net'
     2  
     3  import prometheus, {
     4    collectDefaultMetrics,
     5    DefaultMetricsCollectorConfiguration,
     6    Registry,
     7  } from 'prom-client'
     8  import express from 'express'
     9  
    10  import { Logger } from './logger'
    11  
    12  export interface MetricsOptions {
    13    prefix?: string
    14    labels?: Object
    15  }
    16  
    17  export class LegacyMetrics {
    18    options: MetricsOptions
    19    client: typeof prometheus
    20    registry: Registry
    21  
    22    constructor(options: MetricsOptions) {
    23      this.options = options
    24  
    25      const metricsOptions: DefaultMetricsCollectorConfiguration = {
    26        prefix: options.prefix,
    27        labels: options.labels,
    28      }
    29  
    30      this.client = prometheus
    31      this.registry = prometheus.register
    32  
    33      // Collect default metrics (event loop lag, memory, file descriptors etc.)
    34      collectDefaultMetrics(metricsOptions)
    35    }
    36  }
    37  
    38  export interface MetricsServerOptions {
    39    logger: Logger
    40    registry: Registry
    41    port?: number
    42    route?: string
    43    hostname?: string
    44  }
    45  
    46  export const createMetricsServer = async (
    47    options: MetricsServerOptions
    48  ): Promise<Server> => {
    49    const logger = options.logger.child({ component: 'MetricsServer' })
    50  
    51    const app = express()
    52  
    53    const route = options.route || '/metrics'
    54    app.get(route, async (_, res) => {
    55      res.status(200).send(await options.registry.metrics())
    56    })
    57  
    58    const port = options.port || 7300
    59    const hostname = options.hostname || '0.0.0.0'
    60    const server = app.listen(port, hostname, () => {
    61      logger.info('Metrics server started', {
    62        port,
    63        hostname,
    64        route,
    65      })
    66    })
    67  
    68    return server
    69  }