From 0475e973671634669f7d0e2c1d8afbdeca0e295b Mon Sep 17 00:00:00 2001 From: Karlie Li Date: Mon, 7 Oct 2024 10:38:53 -0700 Subject: [PATCH] add emitevent api --- .../packages/api-events/src/types/Event.ts | 2 + .../packages/api-logs/src/NoopLogger.ts | 3 ++ .../packages/api-logs/src/ProxyLogger.ts | 5 ++ experimental/packages/api-logs/src/index.ts | 1 + .../api-logs/src/types/EventRecord.ts | 52 +++++++++++++++++++ .../packages/api-logs/src/types/Logger.ts | 6 +++ .../proxy-logger.test.ts | 3 ++ .../packages/sdk-events/test/utils.ts | 3 +- experimental/packages/sdk-logs/src/Logger.ts | 20 +++++++ 9 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 experimental/packages/api-logs/src/types/EventRecord.ts diff --git a/experimental/packages/api-events/src/types/Event.ts b/experimental/packages/api-events/src/types/Event.ts index 572dd3b08c..28f14e9340 100644 --- a/experimental/packages/api-events/src/types/Event.ts +++ b/experimental/packages/api-events/src/types/Event.ts @@ -17,6 +17,8 @@ import { Attributes, Context, TimeInput } from '@opentelemetry/api'; import { AnyValue, SeverityNumber } from '@opentelemetry/api-logs'; +// NOTE: this file will be moved to api-logs/EventRecord + export interface Event { /** * The time when the event occurred as UNIX Epoch time in nanoseconds. diff --git a/experimental/packages/api-logs/src/NoopLogger.ts b/experimental/packages/api-logs/src/NoopLogger.ts index b3d092167f..9ec877ed8d 100644 --- a/experimental/packages/api-logs/src/NoopLogger.ts +++ b/experimental/packages/api-logs/src/NoopLogger.ts @@ -14,11 +14,14 @@ * limitations under the License. */ +import { EventRecord } from './types/EventRecord'; import { Logger } from './types/Logger'; import { LogRecord } from './types/LogRecord'; export class NoopLogger implements Logger { emit(_logRecord: LogRecord): void {} + + emitEvent(_name: string, _eventRecord?: EventRecord): void {} } export const NOOP_LOGGER = new NoopLogger(); diff --git a/experimental/packages/api-logs/src/ProxyLogger.ts b/experimental/packages/api-logs/src/ProxyLogger.ts index 7869c65eac..3c3627b868 100644 --- a/experimental/packages/api-logs/src/ProxyLogger.ts +++ b/experimental/packages/api-logs/src/ProxyLogger.ts @@ -15,6 +15,7 @@ */ import { NOOP_LOGGER } from './NoopLogger'; +import { EventRecord } from './types/EventRecord'; import { Logger } from './types/Logger'; import { LoggerOptions } from './types/LoggerOptions'; import { LogRecord } from './types/LogRecord'; @@ -39,6 +40,10 @@ export class ProxyLogger implements Logger { this._getLogger().emit(logRecord); } + emitEvent(name: string, eventRecord?: EventRecord): void { + this._getLogger().emitEvent(name, eventRecord); + } + /** * Try to get a logger from the proxy logger provider. * If the proxy logger provider has no delegate, return a noop logger. diff --git a/experimental/packages/api-logs/src/index.ts b/experimental/packages/api-logs/src/index.ts index d34d8eee98..494e32108f 100644 --- a/experimental/packages/api-logs/src/index.ts +++ b/experimental/packages/api-logs/src/index.ts @@ -22,6 +22,7 @@ export { LogRecord, SeverityNumber, } from './types/LogRecord'; +export { EventRecord } from './types/EventRecord'; export { LoggerOptions } from './types/LoggerOptions'; export { AnyValue, AnyValueMap } from './types/AnyValue'; export { NOOP_LOGGER, NoopLogger } from './NoopLogger'; diff --git a/experimental/packages/api-logs/src/types/EventRecord.ts b/experimental/packages/api-logs/src/types/EventRecord.ts new file mode 100644 index 0000000000..1326001c14 --- /dev/null +++ b/experimental/packages/api-logs/src/types/EventRecord.ts @@ -0,0 +1,52 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Attributes, Context, TimeInput } from '@opentelemetry/api'; +import { AnyValue } from './AnyValue'; +import { SeverityNumber } from './LogRecord'; + +export interface EventRecord { + + /** + * The time when the event occurred as UNIX Epoch time in nanoseconds. + */ + timestamp?: TimeInput; + + /** + * Data that describes the event. + * Intended to be used by instrumentation libraries. + */ + data?: AnyValue; + + /** + * Additional attributes that describe the event. + */ + attributes?: Attributes; + + /** + * Numerical value of the severity. + */ + severityNumber?: SeverityNumber; + + /** + * The Context associated with the Event. + */ + context?: Context; +} + + + + diff --git a/experimental/packages/api-logs/src/types/Logger.ts b/experimental/packages/api-logs/src/types/Logger.ts index e6d63940aa..0e4bbd1c30 100644 --- a/experimental/packages/api-logs/src/types/Logger.ts +++ b/experimental/packages/api-logs/src/types/Logger.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { EventRecord } from './EventRecord'; import { LogRecord } from './LogRecord'; export interface Logger { @@ -23,4 +24,9 @@ export interface Logger { * @param logRecord */ emit(logRecord: LogRecord): void; + + /** + * Emit an event. Event Name is required. + */ + emitEvent(name: string, eventRecord?: EventRecord): void; } diff --git a/experimental/packages/api-logs/test/proxy-implementations/proxy-logger.test.ts b/experimental/packages/api-logs/test/proxy-implementations/proxy-logger.test.ts index 85d9f593c0..813928c3bf 100644 --- a/experimental/packages/api-logs/test/proxy-implementations/proxy-logger.test.ts +++ b/experimental/packages/api-logs/test/proxy-implementations/proxy-logger.test.ts @@ -95,6 +95,9 @@ describe('ProxyLogger', () => { emit() { emitCalled = true; }, + emitEvent() { + // TODO: add tests + } }; logger = provider.getLogger('test'); diff --git a/experimental/packages/sdk-events/test/utils.ts b/experimental/packages/sdk-events/test/utils.ts index 62f1006db7..2229db119d 100644 --- a/experimental/packages/sdk-events/test/utils.ts +++ b/experimental/packages/sdk-events/test/utils.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import { LogRecord, Logger } from '@opentelemetry/api-logs'; +import { EventRecord, LogRecord, Logger } from '@opentelemetry/api-logs'; export class TestLogger implements Logger { emit(logRecord: LogRecord): void {} + emitEvent(name: string, eventRecord?: EventRecord | undefined): void {} } diff --git a/experimental/packages/sdk-logs/src/Logger.ts b/experimental/packages/sdk-logs/src/Logger.ts index 7694955e62..32d74da2f3 100644 --- a/experimental/packages/sdk-logs/src/Logger.ts +++ b/experimental/packages/sdk-logs/src/Logger.ts @@ -20,6 +20,7 @@ import { context } from '@opentelemetry/api'; import { LogRecord } from './LogRecord'; import { LoggerProviderSharedState } from './internal/LoggerProviderSharedState'; +import { SeverityNumber } from '@opentelemetry/api-logs'; export class Logger implements logsAPI.Logger { constructor( @@ -53,4 +54,23 @@ export class Logger implements logsAPI.Logger { */ logRecordInstance._makeReadonly(); } + + public emitEvent(name: string, eventRecord?: logsAPI.EventRecord): void { + const curEvtRecord = eventRecord || {}; + const attributes = curEvtRecord.attributes || {}; + attributes['event.name'] = name; + + const logRecord: logsAPI.LogRecord = { + attributes: attributes, + context: curEvtRecord.context || context.active(), + severityNumber: curEvtRecord.severityNumber || SeverityNumber.INFO, + timestamp: curEvtRecord.timestamp || Date.now(), + }; + + if (curEvtRecord.data) { + logRecord.body = curEvtRecord.data; + } + + this.emit(logRecord); + } }