diff --git a/.changeset/four-gifts-cry.md b/.changeset/four-gifts-cry.md new file mode 100644 index 0000000000000..d32ace353a81e --- /dev/null +++ b/.changeset/four-gifts-cry.md @@ -0,0 +1,6 @@ +--- +'@eth-optimism/common-ts': patch +'@eth-optimism/data-transport-layer': patch +--- + +add environment and network to dtl, move metric init to app from base-service diff --git a/packages/common-ts/src/base-service.ts b/packages/common-ts/src/base-service.ts index e791b5ecd89a1..df21cf2006018 100644 --- a/packages/common-ts/src/base-service.ts +++ b/packages/common-ts/src/base-service.ts @@ -26,7 +26,6 @@ export class BaseService { this.name = name this.options = mergeDefaultOptions(options, optionSettings) this.logger = new Logger({ name }) - this.metrics = new Metrics({ prefix: name }) } /** @@ -39,9 +38,7 @@ export class BaseService { this.logger.info('Service is initializing...') await this._init() - this.logger.info('Service has initialized.', { - options: this.options, - }) + this.logger.info('Service has initialized.') this.initialized = true } diff --git a/packages/data-transport-layer/.env.example b/packages/data-transport-layer/.env.example index a6c7769e195eb..5885cb207cfb5 100644 --- a/packages/data-transport-layer/.env.example +++ b/packages/data-transport-layer/.env.example @@ -1,4 +1,7 @@ # General options +DATA_TRANSPORT_LAYER__NODE_ENV=development +# Leave blank during local development +DATA_TRANSPORT_LAYER__ETH_NETWORK_NAME= DATA_TRANSPORT_LAYER__DB_PATH=./db DATA_TRANSPORT_LAYER__ADDRESS_MANAGER= DATA_TRANSPORT_LAYER__POLLING_INTERVAL=5000 @@ -26,3 +29,4 @@ DATA_TRANSPORT_LAYER__LEGACY_SEQUENCER_COMPATIBILITY=false # Monitoring # Leave the SENTRY_DSN variable unset during local development DATA_TRANSPORT_LAYER__SENTRY_DSN= +DATA_TRANSPORT_LAYER__SENTRY_TRACE_RATE= diff --git a/packages/data-transport-layer/src/services/main/service.ts b/packages/data-transport-layer/src/services/main/service.ts index 1021d902aa795..d5f4ceb95e9db 100644 --- a/packages/data-transport-layer/src/services/main/service.ts +++ b/packages/data-transport-layer/src/services/main/service.ts @@ -10,6 +10,9 @@ import { validators } from '../../utils' import { L2IngestionService } from '../l2-ingestion/service' export interface L1DataTransportServiceOptions { + nodeEnv: string + ethNetworkName?: 'mainnet' | 'kovan' | 'goerli' + release: string addressManager: string confirmations: number dangerouslyCatchAllErrors?: boolean @@ -26,6 +29,7 @@ export interface L1DataTransportServiceOptions { transactionsPerPollingInterval: number legacySequencerCompatibility: boolean sentryDsn?: string + sentryTraceRate?: number defaultBackend: string } diff --git a/packages/data-transport-layer/src/services/run.ts b/packages/data-transport-layer/src/services/run.ts index 6938f4ac11e79..9074916a48583 100644 --- a/packages/data-transport-layer/src/services/run.ts +++ b/packages/data-transport-layer/src/services/run.ts @@ -10,8 +10,10 @@ interface Bcfg { str: (name: string, defaultValue?: string) => string uint: (name: string, defaultValue?: number) => number bool: (name: string, defaultValue?: boolean) => boolean + ufloat: (name: string, defaultValue?: number) => number } +type ethNetwork = 'mainnet' | 'kovan' | 'goerli' ;(async () => { try { dotenv.config() @@ -23,6 +25,9 @@ interface Bcfg { }) const service = new L1DataTransportService({ + nodeEnv: config.str('node-env', 'development'), + ethNetworkName: config.str('eth-network-name') as ethNetwork, + release: `data-transport-layer@${process.env.npm_package_version}`, dbPath: config.str('db-path', './db'), port: config.uint('server-port', 7878), hostname: config.str('server-hostname', 'localhost'), @@ -49,6 +54,7 @@ interface Bcfg { ), defaultBackend: config.str('default-backend', 'l1'), sentryDsn: config.str('sentry-dsn'), + sentryTraceRate: config.ufloat('sentry-trace-rate', 0.05), }) await service.start() diff --git a/packages/data-transport-layer/src/services/server/service.ts b/packages/data-transport-layer/src/services/server/service.ts index ba21bc6a22b2c..63a76164d42e5 100644 --- a/packages/data-transport-layer/src/services/server/service.ts +++ b/packages/data-transport-layer/src/services/server/service.ts @@ -1,5 +1,5 @@ /* Imports: External */ -import { BaseService } from '@eth-optimism/common-ts' +import { BaseService, Metrics } from '@eth-optimism/common-ts' import express, { Request, Response } from 'express' import promBundle from 'express-prom-bundle' import cors from 'cors' @@ -106,29 +106,50 @@ export class L1TransportServer extends BaseService { private _initializeApp() { // TODO: Maybe pass this in as a parameter instead of creating it here? this.state.app = express() + if (this.options.ethNetworkName) { + this._initMonitoring() + } + this.state.app.use(cors()) + this._registerAllRoutes() + // Sentry error handling must be after all controllers + // and before other error middleware + if (this.options.ethNetworkName) { + this.state.app.use(Sentry.Handlers.errorHandler()) + } + } + + /** + * Initialize Sentry and Prometheus metrics for deployed instances + */ + private _initMonitoring() { // Init Sentry options Sentry.init({ dsn: this.options.sentryDsn, - release: `data-transport-layer@${process.env.npm_package_version}`, + release: this.options.release, integrations: [ new Sentry.Integrations.Http({ tracing: true }), new Tracing.Integrations.Express({ app: this.state.app, }), ], - tracesSampleRate: 0.05, + tracesSampleRate: this.options.sentryTraceRate, }) this.state.app.use(Sentry.Handlers.requestHandler()) this.state.app.use(Sentry.Handlers.tracingHandler()) // Init metrics + this.metrics = new Metrics({ + prefix: this.name, + labels: { + environment: this.options.nodeEnv, + network: this.options.ethNetworkName, + release: this.options.release, + }, + }) const metricsMiddleware = promBundle({ includeMethod: true, includePath: true, }) this.state.app.use(metricsMiddleware) - this.state.app.use(cors()) - this._registerAllRoutes() - this.state.app.use(Sentry.Handlers.errorHandler()) } /**