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 }