From d6613e98da5a9ab69f2a913d96bf836655ad2501 Mon Sep 17 00:00:00 2001 From: Annie Ke Date: Mon, 3 May 2021 11:49:19 -0700 Subject: [PATCH 01/10] move verbose log to debug --- packages/common-ts/src/base-service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/common-ts/src/base-service.ts b/packages/common-ts/src/base-service.ts index e791b5ecd89a1..1b82b4f96f541 100644 --- a/packages/common-ts/src/base-service.ts +++ b/packages/common-ts/src/base-service.ts @@ -39,7 +39,8 @@ export class BaseService { this.logger.info('Service is initializing...') await this._init() - this.logger.info('Service has initialized.', { + this.logger.info('Service has initialized.') + this.logger.debug('Service options', { options: this.options, }) this.initialized = true From 2d88a8459a9032f1b54f3f0715c7c031de87e96e Mon Sep 17 00:00:00 2001 From: Annie Ke Date: Mon, 3 May 2021 13:18:19 -0700 Subject: [PATCH 02/10] feat: add node env to dtl --- packages/common-ts/src/base-service.ts | 1 - packages/data-transport-layer/.env.example | 4 ++++ .../src/services/main/service.ts | 3 +++ .../data-transport-layer/src/services/run.ts | 3 +++ .../src/services/server/service.ts | 16 ++++++++++++---- 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/packages/common-ts/src/base-service.ts b/packages/common-ts/src/base-service.ts index 1b82b4f96f541..fd66d4edfc800 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 }) } /** diff --git a/packages/data-transport-layer/.env.example b/packages/data-transport-layer/.env.example index a6c7769e195eb..ee95010e50190 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= \ No newline at end of file diff --git a/packages/data-transport-layer/src/services/main/service.ts b/packages/data-transport-layer/src/services/main/service.ts index 1021d902aa795..1498f722c6bd9 100644 --- a/packages/data-transport-layer/src/services/main/service.ts +++ b/packages/data-transport-layer/src/services/main/service.ts @@ -10,6 +10,8 @@ import { validators } from '../../utils' import { L2IngestionService } from '../l2-ingestion/service' export interface L1DataTransportServiceOptions { + nodeEnv: string + ethNetworkName: string addressManager: string confirmations: number dangerouslyCatchAllErrors?: boolean @@ -26,6 +28,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..d6c33da1bc7df 100644 --- a/packages/data-transport-layer/src/services/run.ts +++ b/packages/data-transport-layer/src/services/run.ts @@ -23,6 +23,8 @@ interface Bcfg { }) const service = new L1DataTransportService({ + nodeEnv: config.str('node-env', 'development'), + ethNetworkName: config.str('eth-network-name'), dbPath: config.str('db-path', './db'), port: config.uint('server-port', 7878), hostname: config.str('server-hostname', 'localhost'), @@ -49,6 +51,7 @@ interface Bcfg { ), defaultBackend: config.str('default-backend', 'l1'), sentryDsn: config.str('sentry-dsn'), + sentryTraceRate: config.uint('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..a4c1bdf7b343a 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' @@ -79,7 +79,6 @@ export class L1TransportServer extends BaseService { typeof this.options.l1RpcProvider === 'string' ? new JsonRpcProvider(this.options.l1RpcProvider) : this.options.l1RpcProvider - this._initializeApp() } @@ -107,20 +106,29 @@ export class L1TransportServer extends BaseService { // TODO: Maybe pass this in as a parameter instead of creating it here? this.state.app = express() // Init Sentry options + const release = `data-transport-layer@${process.env.npm_package_version}` Sentry.init({ dsn: this.options.sentryDsn, - release: `data-transport-layer@${process.env.npm_package_version}`, + 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, + }, + }) const metricsMiddleware = promBundle({ includeMethod: true, includePath: true, From b2c52628193e3cba5f2ddc5c826db02faf975370 Mon Sep 17 00:00:00 2001 From: Annie Ke Date: Mon, 3 May 2021 13:22:08 -0700 Subject: [PATCH 03/10] changeset and new line --- .changeset/four-gifts-cry.md | 6 ++++++ packages/data-transport-layer/.env.example | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .changeset/four-gifts-cry.md 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/data-transport-layer/.env.example b/packages/data-transport-layer/.env.example index ee95010e50190..5885cb207cfb5 100644 --- a/packages/data-transport-layer/.env.example +++ b/packages/data-transport-layer/.env.example @@ -29,4 +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= \ No newline at end of file +DATA_TRANSPORT_LAYER__SENTRY_TRACE_RATE= From 76ed970d580a8f2633dd0ba7726276ae3c108c50 Mon Sep 17 00:00:00 2001 From: Annie Ke Date: Mon, 3 May 2021 13:30:50 -0700 Subject: [PATCH 04/10] conditional sentry and metrics initialization --- .../src/services/server/service.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/data-transport-layer/src/services/server/service.ts b/packages/data-transport-layer/src/services/server/service.ts index a4c1bdf7b343a..d8a5739a8edc2 100644 --- a/packages/data-transport-layer/src/services/server/service.ts +++ b/packages/data-transport-layer/src/services/server/service.ts @@ -105,6 +105,16 @@ 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() + this.state.app.use(Sentry.Handlers.errorHandler()) + } + + /** + * Initialize Sentry and Prometheus metrics for deployed instances + */ + private _initMonitoring() { // Init Sentry options const release = `data-transport-layer@${process.env.npm_package_version}` Sentry.init({ @@ -134,9 +144,6 @@ export class L1TransportServer extends BaseService { includePath: true, }) this.state.app.use(metricsMiddleware) - this.state.app.use(cors()) - this._registerAllRoutes() - this.state.app.use(Sentry.Handlers.errorHandler()) } /** From 0679b6ecac0bc6acaa1467a468b2a665984c9f46 Mon Sep 17 00:00:00 2001 From: Annie Ke Date: Mon, 3 May 2021 13:50:15 -0700 Subject: [PATCH 05/10] remove options log --- packages/common-ts/src/base-service.ts | 3 --- packages/data-transport-layer/src/services/server/service.ts | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/common-ts/src/base-service.ts b/packages/common-ts/src/base-service.ts index fd66d4edfc800..df21cf2006018 100644 --- a/packages/common-ts/src/base-service.ts +++ b/packages/common-ts/src/base-service.ts @@ -39,9 +39,6 @@ export class BaseService { this.logger.info('Service is initializing...') await this._init() this.logger.info('Service has initialized.') - this.logger.debug('Service options', { - options: this.options, - }) this.initialized = true } diff --git a/packages/data-transport-layer/src/services/server/service.ts b/packages/data-transport-layer/src/services/server/service.ts index d8a5739a8edc2..38268c33ab385 100644 --- a/packages/data-transport-layer/src/services/server/service.ts +++ b/packages/data-transport-layer/src/services/server/service.ts @@ -79,6 +79,7 @@ export class L1TransportServer extends BaseService { typeof this.options.l1RpcProvider === 'string' ? new JsonRpcProvider(this.options.l1RpcProvider) : this.options.l1RpcProvider + this._initializeApp() } From c298175f0972db58b6dd690a2bcd8c24a7d73c87 Mon Sep 17 00:00:00 2001 From: Annie Ke Date: Tue, 4 May 2021 13:07:25 -0700 Subject: [PATCH 06/10] address comments --- .../data-transport-layer/src/services/main/service.ts | 3 ++- packages/data-transport-layer/src/services/run.ts | 9 ++++++++- .../data-transport-layer/src/services/server/service.ts | 9 +++++---- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/data-transport-layer/src/services/main/service.ts b/packages/data-transport-layer/src/services/main/service.ts index 1498f722c6bd9..d5f4ceb95e9db 100644 --- a/packages/data-transport-layer/src/services/main/service.ts +++ b/packages/data-transport-layer/src/services/main/service.ts @@ -11,7 +11,8 @@ import { L2IngestionService } from '../l2-ingestion/service' export interface L1DataTransportServiceOptions { nodeEnv: string - ethNetworkName: string + ethNetworkName?: 'mainnet' | 'kovan' | 'goerli' + release: string addressManager: string confirmations: number dangerouslyCatchAllErrors?: boolean diff --git a/packages/data-transport-layer/src/services/run.ts b/packages/data-transport-layer/src/services/run.ts index d6c33da1bc7df..8e08e1dde9252 100644 --- a/packages/data-transport-layer/src/services/run.ts +++ b/packages/data-transport-layer/src/services/run.ts @@ -12,6 +12,12 @@ interface Bcfg { bool: (name: string, defaultValue?: boolean) => boolean } +enum ethNetwork { + mainnet = 'mainnet', + kovan = 'kovan', + goerli = 'goerli', +} + ;(async () => { try { dotenv.config() @@ -24,7 +30,8 @@ interface Bcfg { const service = new L1DataTransportService({ nodeEnv: config.str('node-env', 'development'), - ethNetworkName: config.str('eth-network-name'), + ethNetworkName: ethNetwork[config.str('eth-network-name')], + 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'), diff --git a/packages/data-transport-layer/src/services/server/service.ts b/packages/data-transport-layer/src/services/server/service.ts index 38268c33ab385..eab3ef74de37f 100644 --- a/packages/data-transport-layer/src/services/server/service.ts +++ b/packages/data-transport-layer/src/services/server/service.ts @@ -109,7 +109,9 @@ export class L1TransportServer extends BaseService { if (this.options.ethNetworkName) this._initMonitoring() this.state.app.use(cors()) this._registerAllRoutes() - this.state.app.use(Sentry.Handlers.errorHandler()) + // Error handling needs to be initialized last + if (this.options.ethNetworkName) + this.state.app.use(Sentry.Handlers.errorHandler()) } /** @@ -117,10 +119,9 @@ export class L1TransportServer extends BaseService { */ private _initMonitoring() { // Init Sentry options - const release = `data-transport-layer@${process.env.npm_package_version}` Sentry.init({ dsn: this.options.sentryDsn, - release, + release: this.options.release, integrations: [ new Sentry.Integrations.Http({ tracing: true }), new Tracing.Integrations.Express({ @@ -137,7 +138,7 @@ export class L1TransportServer extends BaseService { labels: { environment: this.options.nodeEnv, network: this.options.ethNetworkName, - release, + release: this.options.release, }, }) const metricsMiddleware = promBundle({ From 263a2e219e7e35c6e2f7a50231e276fa0da78965 Mon Sep 17 00:00:00 2001 From: Annie Ke Date: Tue, 4 May 2021 15:59:21 -0700 Subject: [PATCH 07/10] change to ufloat --- packages/data-transport-layer/src/services/run.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/data-transport-layer/src/services/run.ts b/packages/data-transport-layer/src/services/run.ts index 8e08e1dde9252..17ba45a5f2cba 100644 --- a/packages/data-transport-layer/src/services/run.ts +++ b/packages/data-transport-layer/src/services/run.ts @@ -10,6 +10,7 @@ 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 } enum ethNetwork { @@ -58,7 +59,7 @@ enum ethNetwork { ), defaultBackend: config.str('default-backend', 'l1'), sentryDsn: config.str('sentry-dsn'), - sentryTraceRate: config.uint('sentry-trace-rate', 0.05), + sentryTraceRate: config.ufloat('sentry-trace-rate', 0.05), }) await service.start() From a42cf9456d5fbdecdbd007b573fe5e9642dcbf7a Mon Sep 17 00:00:00 2001 From: Annie Ke Date: Wed, 5 May 2021 09:03:42 -0700 Subject: [PATCH 08/10] enum to string --- packages/data-transport-layer/src/services/run.ts | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/data-transport-layer/src/services/run.ts b/packages/data-transport-layer/src/services/run.ts index 17ba45a5f2cba..9074916a48583 100644 --- a/packages/data-transport-layer/src/services/run.ts +++ b/packages/data-transport-layer/src/services/run.ts @@ -13,12 +13,7 @@ interface Bcfg { ufloat: (name: string, defaultValue?: number) => number } -enum ethNetwork { - mainnet = 'mainnet', - kovan = 'kovan', - goerli = 'goerli', -} - +type ethNetwork = 'mainnet' | 'kovan' | 'goerli' ;(async () => { try { dotenv.config() @@ -31,7 +26,7 @@ enum ethNetwork { const service = new L1DataTransportService({ nodeEnv: config.str('node-env', 'development'), - ethNetworkName: ethNetwork[config.str('eth-network-name')], + 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), From 27dec7d1e0312f4237311b6587f86ac6159043b6 Mon Sep 17 00:00:00 2001 From: Annie Ke Date: Wed, 5 May 2021 15:21:12 -0700 Subject: [PATCH 09/10] brackets around if --- .../data-transport-layer/src/services/server/service.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/data-transport-layer/src/services/server/service.ts b/packages/data-transport-layer/src/services/server/service.ts index eab3ef74de37f..8c415cf2fcae2 100644 --- a/packages/data-transport-layer/src/services/server/service.ts +++ b/packages/data-transport-layer/src/services/server/service.ts @@ -106,12 +106,15 @@ 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() + if (this.options.ethNetworkName) { + this._initMonitoring() + } this.state.app.use(cors()) this._registerAllRoutes() // Error handling needs to be initialized last - if (this.options.ethNetworkName) + if (this.options.ethNetworkName) { this.state.app.use(Sentry.Handlers.errorHandler()) + } } /** From 785067dfd0be3798ce10d8cdc469c9663db08f39 Mon Sep 17 00:00:00 2001 From: Annie Ke Date: Thu, 6 May 2021 09:23:47 -0700 Subject: [PATCH 10/10] detailed comment for errors --- packages/data-transport-layer/src/services/server/service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/data-transport-layer/src/services/server/service.ts b/packages/data-transport-layer/src/services/server/service.ts index 8c415cf2fcae2..63a76164d42e5 100644 --- a/packages/data-transport-layer/src/services/server/service.ts +++ b/packages/data-transport-layer/src/services/server/service.ts @@ -111,7 +111,8 @@ export class L1TransportServer extends BaseService { } this.state.app.use(cors()) this._registerAllRoutes() - // Error handling needs to be initialized last + // Sentry error handling must be after all controllers + // and before other error middleware if (this.options.ethNetworkName) { this.state.app.use(Sentry.Handlers.errorHandler()) }