From a298b5fcdf55bd01516b4d2279daefd7b28db45d Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Fri, 23 May 2025 08:53:59 -0400 Subject: [PATCH 1/7] feat: add event name to event API and SDK --- .../packages/api-logs/src/types/LogRecord.ts | 5 +++++ .../otlp-transformer/src/logs/internal-types.ts | 3 +++ .../packages/otlp-transformer/src/logs/internal.ts | 1 + .../packages/otlp-transformer/test/logs.test.ts | 2 ++ experimental/packages/sdk-logs/src/LogRecord.ts | 13 +++++++++++++ .../sdk-logs/src/export/ReadableLogRecord.ts | 1 + 6 files changed, 25 insertions(+) diff --git a/experimental/packages/api-logs/src/types/LogRecord.ts b/experimental/packages/api-logs/src/types/LogRecord.ts index 85d5e4ff4dd..75855aadaa8 100644 --- a/experimental/packages/api-logs/src/types/LogRecord.ts +++ b/experimental/packages/api-logs/src/types/LogRecord.ts @@ -49,6 +49,11 @@ export enum SeverityNumber { } export interface LogRecord { + /** + * The unique identifier for the log record. + */ + eventName?: string; + /** * The time when the log record occurred as UNIX Epoch time in nanoseconds. */ diff --git a/experimental/packages/otlp-transformer/src/logs/internal-types.ts b/experimental/packages/otlp-transformer/src/logs/internal-types.ts index 09f744141d2..9e621f64894 100644 --- a/experimental/packages/otlp-transformer/src/logs/internal-types.ts +++ b/experimental/packages/otlp-transformer/src/logs/internal-types.ts @@ -83,6 +83,9 @@ export interface ILogRecord { /** LogRecord spanId */ spanId?: string | Uint8Array; + + /** LogRecord eventName */ + eventName?: string; } /** diff --git a/experimental/packages/otlp-transformer/src/logs/internal.ts b/experimental/packages/otlp-transformer/src/logs/internal.ts index 8c54e72a097..f3dd227aebc 100644 --- a/experimental/packages/otlp-transformer/src/logs/internal.ts +++ b/experimental/packages/otlp-transformer/src/logs/internal.ts @@ -99,6 +99,7 @@ function toLogRecord(log: ReadableLogRecord, encoder: Encoder): ILogRecord { severityNumber: toSeverityNumber(log.severityNumber), severityText: log.severityText, body: toAnyValue(log.body), + eventName: log.eventName, attributes: toLogAttributes(log.attributes), droppedAttributesCount: log.droppedAttributesCount, flags: log.spanContext?.traceFlags, diff --git a/experimental/packages/otlp-transformer/test/logs.test.ts b/experimental/packages/otlp-transformer/test/logs.test.ts index 6a9e3623bde..00c8a304338 100644 --- a/experimental/packages/otlp-transformer/test/logs.test.ts +++ b/experimental/packages/otlp-transformer/test/logs.test.ts @@ -75,6 +75,7 @@ function createExpectedLogJson( severityNumber: ESeverityNumber.SEVERITY_NUMBER_ERROR, severityText: 'error', body: { stringValue: 'some_log_body' }, + eventName: "some.event.name", attributes: [ { @@ -190,6 +191,7 @@ describe('Logs', () => { severityNumber: SeverityNumber.ERROR, severityText: 'error', body: 'some_log_body', + eventName: 'some.event.name', spanContext: { spanId: '0000000000000002', traceFlags: TraceFlags.SAMPLED, diff --git a/experimental/packages/sdk-logs/src/LogRecord.ts b/experimental/packages/sdk-logs/src/LogRecord.ts index f1f9c99506e..a072d789a28 100644 --- a/experimental/packages/sdk-logs/src/LogRecord.ts +++ b/experimental/packages/sdk-logs/src/LogRecord.ts @@ -39,6 +39,7 @@ export class LogRecord implements ReadableLogRecord { private _severityText?: string; private _severityNumber?: logsAPI.SeverityNumber; private _body?: LogBody; + private _eventName?: string; private totalAttributesCount: number = 0; private _isReadonly: boolean = false; @@ -74,6 +75,16 @@ export class LogRecord implements ReadableLogRecord { return this._body; } + get eventName(): string | undefined { + return this._eventName; + } + set eventName(eventName: string | undefined) { + if (this._isLogRecordReadonly()) { + return; + } + this._eventName = eventName; + } + get droppedAttributesCount(): number { return this.totalAttributesCount - Object.keys(this.attributes).length; } @@ -86,6 +97,7 @@ export class LogRecord implements ReadableLogRecord { const { timestamp, observedTimestamp, + eventName, severityNumber, severityText, body, @@ -109,6 +121,7 @@ export class LogRecord implements ReadableLogRecord { this.resource = _sharedState.resource; this.instrumentationScope = instrumentationScope; this._logRecordLimits = _sharedState.logRecordLimits; + this._eventName = eventName; this.setAttributes(attributes); } diff --git a/experimental/packages/sdk-logs/src/export/ReadableLogRecord.ts b/experimental/packages/sdk-logs/src/export/ReadableLogRecord.ts index ab110104d1f..58d8acc3c7a 100644 --- a/experimental/packages/sdk-logs/src/export/ReadableLogRecord.ts +++ b/experimental/packages/sdk-logs/src/export/ReadableLogRecord.ts @@ -30,6 +30,7 @@ export interface ReadableLogRecord { readonly severityText?: string; readonly severityNumber?: SeverityNumber; readonly body?: LogBody; + readonly eventName?: string; readonly resource: Resource; readonly instrumentationScope: InstrumentationScope; readonly attributes: LogAttributes; From c78938422f612d862c568a8eec06ac902ca0faed Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Wed, 28 May 2025 16:41:20 -0400 Subject: [PATCH 2/7] Add event name to e2e tests --- e2e-tests/test.mjs | 1 + e2e-tests/verify.mjs | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/e2e-tests/test.mjs b/e2e-tests/test.mjs index dbff03e01fb..20476c580c6 100644 --- a/e2e-tests/test.mjs +++ b/e2e-tests/test.mjs @@ -83,6 +83,7 @@ async function main() { severityText: 'INFO', body: 'test-log-body', attributes: { foo: 'bar' }, + eventName: 'test-log-event', }); // flushes exporters and shuts down the SDK diff --git a/e2e-tests/verify.mjs b/e2e-tests/verify.mjs index 05c6888a3d5..16bafb7d913 100755 --- a/e2e-tests/verify.mjs +++ b/e2e-tests/verify.mjs @@ -94,4 +94,11 @@ function verifyLog(log) { ); process.exit(1); } + + if (log.eventName !== 'test-log-event') { + console.error( + `Expected log event name 'test-log-event', but got '${log.eventName}'` + ); + process.exit(1); + } } From 66627fdcf846b0e8c6d16f49782c569a4dc66d03 Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Wed, 28 May 2025 16:56:09 -0400 Subject: [PATCH 3/7] Add event name to transformer tests --- experimental/packages/otlp-transformer/test/logs.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/packages/otlp-transformer/test/logs.test.ts b/experimental/packages/otlp-transformer/test/logs.test.ts index 00c8a304338..dc218a0c289 100644 --- a/experimental/packages/otlp-transformer/test/logs.test.ts +++ b/experimental/packages/otlp-transformer/test/logs.test.ts @@ -123,7 +123,7 @@ function createExpectedLogProtobuf(): IExportLogsServiceRequest { severityNumber: ESeverityNumber.SEVERITY_NUMBER_ERROR, severityText: 'error', body: { stringValue: 'some_log_body' }, - + eventName: 'some.event.name', attributes: [ { key: 'some-attribute', From 50058ce6dcba107b3f400a9fe4c977cf5353b105 Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Wed, 28 May 2025 16:58:46 -0400 Subject: [PATCH 4/7] Changelog --- experimental/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 73f32e37938..56e68a61f45 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -12,6 +12,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 * feat(exporter-otlp-\*): update proto to `v1.7.0` * feat(exporter-metrics-otlp-proto): Support to protobuf in browser metrics. [#5710](https://github.com/open-telemetry/opentelemetry-js/pull/5710) @YangJonghun +* feat(logs): add eventName to emitEvent [#5707](https://github.com/open-telemetry/opentelemetry-js/pull/5707) ### :bug: Bug Fixes From b3d2ec61cd1b17c29cc23d1103b9f9d2e9e79c1f Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Wed, 28 May 2025 16:59:01 -0400 Subject: [PATCH 5/7] Lint --- experimental/packages/otlp-transformer/test/logs.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/packages/otlp-transformer/test/logs.test.ts b/experimental/packages/otlp-transformer/test/logs.test.ts index dc218a0c289..ff4412059e8 100644 --- a/experimental/packages/otlp-transformer/test/logs.test.ts +++ b/experimental/packages/otlp-transformer/test/logs.test.ts @@ -75,7 +75,7 @@ function createExpectedLogJson( severityNumber: ESeverityNumber.SEVERITY_NUMBER_ERROR, severityText: 'error', body: { stringValue: 'some_log_body' }, - eventName: "some.event.name", + eventName: 'some.event.name', attributes: [ { From 177952ef11f7871b5c30127968b46510782f89b9 Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Thu, 29 May 2025 15:08:46 -0400 Subject: [PATCH 6/7] Add test for eventName --- .../packages/sdk-logs/src/LogRecord.ts | 5 +++++ .../sdk-logs/test/common/LogRecord.test.ts | 18 +++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/experimental/packages/sdk-logs/src/LogRecord.ts b/experimental/packages/sdk-logs/src/LogRecord.ts index a072d789a28..a93f7cfe67c 100644 --- a/experimental/packages/sdk-logs/src/LogRecord.ts +++ b/experimental/packages/sdk-logs/src/LogRecord.ts @@ -179,6 +179,11 @@ export class LogRecord implements ReadableLogRecord { return this; } + public setEventName(eventName: string) { + this.eventName = eventName; + return this; + } + public setSeverityNumber(severityNumber: logsAPI.SeverityNumber) { this.severityNumber = severityNumber; return this; diff --git a/experimental/packages/sdk-logs/test/common/LogRecord.test.ts b/experimental/packages/sdk-logs/test/common/LogRecord.test.ts index e6fd3a4a22e..b8361a98cf1 100644 --- a/experimental/packages/sdk-logs/test/common/LogRecord.test.ts +++ b/experimental/packages/sdk-logs/test/common/LogRecord.test.ts @@ -88,6 +88,7 @@ describe('LogRecord', () => { const logRecordData: logsAPI.LogRecord = { timestamp: new Date().getTime(), + eventName: 'test event', severityNumber: logsAPI.SeverityNumber.DEBUG, severityText: 'DEBUG', body: 'this is a body', @@ -108,6 +109,7 @@ describe('LogRecord', () => { logRecord.severityNumber, logRecordData.severityNumber ); + assert.strictEqual(logRecord.eventName, logRecordData.eventName); assert.strictEqual(logRecord.severityText, logRecordData.severityText); assert.strictEqual(logRecord.body, logRecordData.body); assert.deepStrictEqual(logRecord.attributes, logRecordData.attributes); @@ -320,6 +322,7 @@ describe('LogRecord', () => { const newBody = 'this is a new body'; const newSeverityNumber = logsAPI.SeverityNumber.INFO; const newSeverityText = 'INFO'; + const newName = 'new name'; it('should rewrite directly through the property method', () => { const { logRecord } = setup(undefined, logRecordData); @@ -327,10 +330,12 @@ describe('LogRecord', () => { logRecord.body = newBody; logRecord.severityNumber = newSeverityNumber; logRecord.severityText = newSeverityText; + logRecord.eventName = newName; assert.deepStrictEqual(logRecord.body, newBody); assert.deepStrictEqual(logRecord.severityNumber, newSeverityNumber); assert.deepStrictEqual(logRecord.severityText, newSeverityText); + assert.deepStrictEqual(logRecord.eventName, newName); }); it('should rewrite using the set method', () => { @@ -339,14 +344,16 @@ describe('LogRecord', () => { logRecord.setBody(newBody); logRecord.setSeverityNumber(newSeverityNumber); logRecord.setSeverityText(newSeverityText); + logRecord.setEventName(newName); assert.deepStrictEqual(logRecord.body, newBody); assert.deepStrictEqual(logRecord.severityNumber, newSeverityNumber); assert.deepStrictEqual(logRecord.severityText, newSeverityText); + assert.deepStrictEqual(logRecord.eventName, newName); }); }); - describe('should be read-only(body/severityNumber/severityText) if makeReadonly has been called', () => { + describe('should be read-only(body/severityNumber/severityText/eventName) if makeReadonly has been called', () => { const currentTime = new Date().getTime(); const logRecordData: logsAPI.LogRecord = { timestamp: currentTime, @@ -361,6 +368,7 @@ describe('LogRecord', () => { const newBody = 'this is a new body'; const newSeverityNumber = logsAPI.SeverityNumber.INFO; const newSeverityText = 'INFO'; + const newName = 'new name'; it('should not rewrite directly through the property method', () => { const warnStub = sinon.spy(diag, 'warn'); @@ -370,8 +378,10 @@ describe('LogRecord', () => { logRecord.body = newBody; logRecord.severityNumber = newSeverityNumber; logRecord.severityText = newSeverityText; + logRecord.eventName = newName; assert.deepStrictEqual(logRecord.body, logRecordData.body); + assert.deepStrictEqual(logRecord.eventName, logRecordData.eventName); assert.deepStrictEqual( logRecord.severityNumber, logRecordData.severityNumber @@ -380,7 +390,7 @@ describe('LogRecord', () => { logRecord.severityText, logRecordData.severityText ); - sinon.assert.callCount(warnStub, 3); + sinon.assert.callCount(warnStub, 4); sinon.assert.alwaysCalledWith( warnStub, 'Can not execute the operation on emitted log record' @@ -396,8 +406,10 @@ describe('LogRecord', () => { logRecord.setBody(newBody); logRecord.setSeverityNumber(newSeverityNumber); logRecord.setSeverityText(newSeverityText); + logRecord.setEventName(newName); assert.deepStrictEqual(logRecord.body, logRecordData.body); + assert.deepStrictEqual(logRecord.eventName, logRecordData.eventName); assert.deepStrictEqual( logRecord.severityNumber, logRecordData.severityNumber @@ -406,7 +418,7 @@ describe('LogRecord', () => { logRecord.severityText, logRecordData.severityText ); - sinon.assert.callCount(warnStub, 3); + sinon.assert.callCount(warnStub, 4); sinon.assert.alwaysCalledWith( warnStub, 'Can not execute the operation on emitted log record' From d3776cd88bc4d0f67840c74fdb03ec55c1d3a64a Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Mon, 2 Jun 2025 13:27:55 -0400 Subject: [PATCH 7/7] Update experimental/CHANGELOG.md Co-authored-by: Marc Pichler --- experimental/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 56e68a61f45..5156fcbae23 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -12,7 +12,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 * feat(exporter-otlp-\*): update proto to `v1.7.0` * feat(exporter-metrics-otlp-proto): Support to protobuf in browser metrics. [#5710](https://github.com/open-telemetry/opentelemetry-js/pull/5710) @YangJonghun -* feat(logs): add eventName to emitEvent [#5707](https://github.com/open-telemetry/opentelemetry-js/pull/5707) +* feat(logs): add eventName to emit [#5707](https://github.com/open-telemetry/opentelemetry-js/pull/5707) ### :bug: Bug Fixes