diff --git a/exporter/collector/logs.go b/exporter/collector/logs.go index 7d630827a..fe7dd0f3a 100644 --- a/exporter/collector/logs.go +++ b/exporter/collector/logs.go @@ -518,6 +518,14 @@ func (l logMapper) logToSplitEntries( } } + // Add OTLP event_name field as "event.name" label + if eventName := logRecord.EventName(); eventName != "" { + if entry.Labels == nil { + entry.Labels = make(map[string]string) + } + entry.Labels["event.name"] = eventName + } + // Handle map and bytes as JSON-structured logs if they are successfully converted. switch logRecord.Body().Type() { case pcommon.ValueTypeMap: diff --git a/exporter/collector/logs_test.go b/exporter/collector/logs_test.go index 234257514..fcb2c093f 100644 --- a/exporter/collector/logs_test.go +++ b/exporter/collector/logs_test.go @@ -890,6 +890,45 @@ func TestLogMapping(t *testing.T) { }, maxEntrySize: defaultMaxEntrySize, }, + { + name: "log with event_name", + mr: func() *monitoredrespb.MonitoredResource { + return nil + }, + log: func() plog.LogRecord { + log := plog.NewLogRecord() + log.SetEventName("my.event") + return log + }, + expectedEntries: []*logpb.LogEntry{ + { + LogName: logName, + Timestamp: timestamppb.New(testObservedTime), + Labels: map[string]string{ + "event.name": "my.event", + }, + }, + }, + maxEntrySize: defaultMaxEntrySize, + }, + { + name: "log with empty event_name", + mr: func() *monitoredrespb.MonitoredResource { + return nil + }, + log: func() plog.LogRecord { + log := plog.NewLogRecord() + // event_name is empty by default + return log + }, + expectedEntries: []*logpb.LogEntry{ + { + LogName: logName, + Timestamp: timestamppb.New(testObservedTime), + }, + }, + maxEntrySize: defaultMaxEntrySize, + }, } for _, testCase := range testCases {