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); + } } diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 909dbd82dee..f08070e8292 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -22,6 +22,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 emit [#5707](https://github.com/open-telemetry/opentelemetry-js/pull/5707) ### :bug: Bug Fixes 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..ff4412059e8 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: [ { @@ -122,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', @@ -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..a93f7cfe67c 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); } @@ -166,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/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; 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'