diff --git a/src/goodmetrics/metricsFactory.ts b/src/goodmetrics/metricsFactory.ts index 0acc0d3..b25eb9d 100644 --- a/src/goodmetrics/metricsFactory.ts +++ b/src/goodmetrics/metricsFactory.ts @@ -26,9 +26,12 @@ export enum TotaltimeType { None = 'none', } +export type LogLevel = 'none' | 'debug' | 'info' | 'error'; + interface Props { metricsSink: MetricsSink; totalTimeType: TotaltimeType; + logLevel?: LogLevel; } interface RecordOptions { @@ -42,12 +45,57 @@ interface RecordWithBehaviorOptions { behavior: MetricsBehavior; } +const NONE_LEVEL = 0; +const DEBUG_LEVEL = 1; +const INFO_LEVEL = 2; +const ERROR_LEVEL = 3; + +class Logger { + private readonly level: number; + constructor(level: LogLevel) { + switch (level) { + case 'none': + this.level = NONE_LEVEL; + break; + case 'debug': + this.level = DEBUG_LEVEL; + break; + case 'info': + this.level = INFO_LEVEL; + break; + case 'error': + this.level = ERROR_LEVEL; + break; + } + } + + debug(message: string): void { + if (this.level >= DEBUG_LEVEL) { + console.debug(message); + } + } + + info(message: string): void { + if (this.level >= INFO_LEVEL) { + console.info(message); + } + } + + error(message: string): void { + if (this.level >= ERROR_LEVEL) { + console.error(message); + } + } +} + export class MetricsFactory { protected readonly metricsSink: MetricsSink; private readonly totalTimeType: TotaltimeType; + private readonly logger: Logger; constructor(props: Props) { this.metricsSink = props.metricsSink; this.totalTimeType = props.totalTimeType; + this.logger = new Logger(props.logLevel ?? 'none'); } /** @@ -109,26 +157,33 @@ export class MetricsFactory { */ private async emit(metrics: _Metrics) { this.finalizeMetrics(metrics); + this.logger.debug('metrics finalized'); + console.log('metrics', metrics); await this.metricsSink.emit(metrics); } private finalizeMetrics(metrics: _Metrics) { + this.logger.debug('finalizing metrics'); if (metrics.timestampMillis < 1) { metrics.timestampMillis = Date.now(); } if (metrics.metricsBehavior === MetricsBehavior.NO_TOTALTIME) { + this.logger.debug('no total time being recorded'); return; } const duration = metrics.getDurationMillis(); switch (this.totalTimeType) { case TotaltimeType.DistributionMilliseconds: + this.logger.debug(`distribution milliseconds, duration: ${duration}`); metrics.distribution('totaltime', duration); break; case TotaltimeType.MeasurementMilliseconds: + this.logger.debug(`measurement milliseconds, duration: ${duration}`); metrics.measure('totaltime', duration); break; case TotaltimeType.None: + this.logger.debug(`totaltime.none, duration: ${duration}`); break; } } diff --git a/src/goodmetrics/metricsSetups.ts b/src/goodmetrics/metricsSetups.ts index 41f356d..8f6ccd9 100644 --- a/src/goodmetrics/metricsSetups.ts +++ b/src/goodmetrics/metricsSetups.ts @@ -1,4 +1,4 @@ -import {MetricsFactory, TotaltimeType} from './metricsFactory'; +import {LogLevel, MetricsFactory, TotaltimeType} from './metricsFactory'; import {_Metrics, Dimension, Metrics} from './_Metrics'; import { OpenTelemetryClient, @@ -47,6 +47,7 @@ interface LightstepNativeLambdaOtlpProps { */ doLogSuccess?: boolean; onSendUnary?: (metrics: Metrics[]) => void; + logLevel?: LogLevel; } interface RawNativeLambdaOtlpForLambdaProps { @@ -82,6 +83,7 @@ interface RawNativeLambdaOtlpForLambdaProps { */ doLogSuccess?: boolean; onSendUnary?: (metrics: Metrics[]) => void; + logLevel?: LogLevel; } interface ConfigureBatchedUnaryLightstepSinkProps { @@ -125,6 +127,7 @@ interface LightstepNativeOtlpProps { preaggregatedBatchMaxAgeSeconds?: number; onSendUnary?: (metrics: Metrics[]) => void; onSendPreaggregated?: (aggregatedBatch: AggregatedBatch[]) => void; + logLevel?: LogLevel; } interface GoodmetricsSetupProps { @@ -186,11 +189,13 @@ export class MetricsSetups { const unaryMetricsFactory = new MetricsFactory({ metricsSink: unarySink, totalTimeType: TotaltimeType.DistributionMilliseconds, + logLevel: props.logLevel, }); const preaggregatedMetricsFactory = new MetricsFactory({ metricsSink: preaggregatedSink, totalTimeType: TotaltimeType.DistributionMilliseconds, + logLevel: props.logLevel, }); return { @@ -237,6 +242,7 @@ export class MetricsSetups { return new MetricsFactory({ metricsSink: unarySink, totalTimeType: TotaltimeType.DistributionMilliseconds, + logLevel: props.logLevel, }); } @@ -275,7 +281,8 @@ export class MetricsSetups { return new MetricsFactory({ metricsSink: unarySink, - totalTimeType: TotaltimeType.DistributionMilliseconds, + totalTimeType: TotaltimeType.MeasurementMilliseconds, + logLevel: props.logLevel, }); }