From 7d04c7ce11e02dd823fc4a1134aea5a6ac09c337 Mon Sep 17 00:00:00 2001 From: gaddas3 Date: Thu, 9 Oct 2025 15:40:30 -0500 Subject: [PATCH 01/11] Add more types to severity map --- receiver/k8seventsreceiver/k8s_event_to_logdata.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/receiver/k8seventsreceiver/k8s_event_to_logdata.go b/receiver/k8seventsreceiver/k8s_event_to_logdata.go index 2f1ac96bf4685..a3b022cb55c49 100644 --- a/receiver/k8seventsreceiver/k8s_event_to_logdata.go +++ b/receiver/k8seventsreceiver/k8s_event_to_logdata.go @@ -28,6 +28,8 @@ const ( var severityMap = map[string]plog.SeverityNumber{ "normal": plog.SeverityNumberInfo, "warning": plog.SeverityNumberWarn, + "error": plog.SeverityNumberError, + "critical": plog.SeverityNumberFatal, } // k8sEventToLogRecord converts Kubernetes event to plog.LogRecordSlice and adds the resource attributes. @@ -58,12 +60,12 @@ func k8sEventToLogData(logger *zap.Logger, ev *corev1.Event, version string) plo // which is best suited for the "Body" of the LogRecordSlice. lr.Body().SetStr(ev.Message) - // Set the "SeverityNumber" and "SeverityText" if a known type of - // severity is found. + lr.SetSeverityText(ev.Type) + // Set the "SeverityNumber" if a known type of severity is found. if severityNumber, ok := severityMap[strings.ToLower(ev.Type)]; ok { lr.SetSeverityNumber(severityNumber) - lr.SetSeverityText(ev.Type) } else { + lr.SetSeverityNumber(plog.SeverityNumberUnspecified) logger.Debug("unknown severity type", zap.String("type", ev.Type)) } From 53896bfcf948888bfbadc972fdc70f6c20aec750 Mon Sep 17 00:00:00 2001 From: gaddas3 Date: Thu, 9 Oct 2025 18:27:08 -0500 Subject: [PATCH 02/11] Reference to k8s event api --- receiver/k8seventsreceiver/k8s_event_to_logdata.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/receiver/k8seventsreceiver/k8s_event_to_logdata.go b/receiver/k8seventsreceiver/k8s_event_to_logdata.go index a3b022cb55c49..6fbbc29a7ff05 100644 --- a/receiver/k8seventsreceiver/k8s_event_to_logdata.go +++ b/receiver/k8seventsreceiver/k8s_event_to_logdata.go @@ -23,8 +23,8 @@ const ( totalResourceAttributes = 6 ) -// Only two types of events are created as of now. -// For more info: https://docs.openshift.com/container-platform/4.9/rest_api/metadata_apis/event-core-v1.html +// By default k8s event has only two types of events (Normal, Warning), here are we allowing other types as well. +// For more info: https://github.com/kubernetes/api/blob/release-1.34/events/v1/types_swagger_doc_generated.go#L42 var severityMap = map[string]plog.SeverityNumber{ "normal": plog.SeverityNumberInfo, "warning": plog.SeverityNumberWarn, From 81fc37ee0eb3b6309cdc790faa2f7c6e0c38e561 Mon Sep 17 00:00:00 2001 From: gaddas3 Date: Tue, 14 Oct 2025 08:13:09 -0500 Subject: [PATCH 03/11] keep the existing severity mapping logic --- receiver/k8seventsreceiver/k8s_event_to_logdata.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/receiver/k8seventsreceiver/k8s_event_to_logdata.go b/receiver/k8seventsreceiver/k8s_event_to_logdata.go index 6fbbc29a7ff05..745d1cbd099f1 100644 --- a/receiver/k8seventsreceiver/k8s_event_to_logdata.go +++ b/receiver/k8seventsreceiver/k8s_event_to_logdata.go @@ -60,12 +60,12 @@ func k8sEventToLogData(logger *zap.Logger, ev *corev1.Event, version string) plo // which is best suited for the "Body" of the LogRecordSlice. lr.Body().SetStr(ev.Message) - lr.SetSeverityText(ev.Type) - // Set the "SeverityNumber" if a known type of severity is found. + // Set the "SeverityNumber" and "SeverityText" if a known type of + // severity is found. if severityNumber, ok := severityMap[strings.ToLower(ev.Type)]; ok { lr.SetSeverityNumber(severityNumber) + lr.SetSeverityText(ev.Type) } else { - lr.SetSeverityNumber(plog.SeverityNumberUnspecified) logger.Debug("unknown severity type", zap.String("type", ev.Type)) } From 90fb6a63ec1be25494ce18522d325fb1d0a7a419 Mon Sep 17 00:00:00 2001 From: gaddas3 Date: Tue, 14 Oct 2025 08:15:55 -0500 Subject: [PATCH 04/11] keep the existing severity mapping logic --- receiver/k8seventsreceiver/k8s_event_to_logdata.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/receiver/k8seventsreceiver/k8s_event_to_logdata.go b/receiver/k8seventsreceiver/k8s_event_to_logdata.go index 745d1cbd099f1..397ed24365e3f 100644 --- a/receiver/k8seventsreceiver/k8s_event_to_logdata.go +++ b/receiver/k8seventsreceiver/k8s_event_to_logdata.go @@ -64,7 +64,7 @@ func k8sEventToLogData(logger *zap.Logger, ev *corev1.Event, version string) plo // severity is found. if severityNumber, ok := severityMap[strings.ToLower(ev.Type)]; ok { lr.SetSeverityNumber(severityNumber) - lr.SetSeverityText(ev.Type) + lr.SetSeverityText(ev.Type) } else { logger.Debug("unknown severity type", zap.String("type", ev.Type)) } From 15cf3723601252775e360dd3f4706fa0c889f022 Mon Sep 17 00:00:00 2001 From: gaddas3 Date: Tue, 14 Oct 2025 08:25:39 -0500 Subject: [PATCH 05/11] keep the existing severity mapping logic --- receiver/k8seventsreceiver/k8s_event_to_logdata.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/receiver/k8seventsreceiver/k8s_event_to_logdata.go b/receiver/k8seventsreceiver/k8s_event_to_logdata.go index 397ed24365e3f..b1a9baf73e77d 100644 --- a/receiver/k8seventsreceiver/k8s_event_to_logdata.go +++ b/receiver/k8seventsreceiver/k8s_event_to_logdata.go @@ -64,7 +64,7 @@ func k8sEventToLogData(logger *zap.Logger, ev *corev1.Event, version string) plo // severity is found. if severityNumber, ok := severityMap[strings.ToLower(ev.Type)]; ok { lr.SetSeverityNumber(severityNumber) - lr.SetSeverityText(ev.Type) + lr.SetSeverityText(ev.Type) } else { logger.Debug("unknown severity type", zap.String("type", ev.Type)) } From 9219e587f874b55f26382699182579a80b4ace91 Mon Sep 17 00:00:00 2001 From: gaddas3 Date: Tue, 14 Oct 2025 09:16:55 -0500 Subject: [PATCH 06/11] update change log for receiver/k8seventsreceiver --- ...k8seventsreceiver-update-severity-map.yaml | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .chloggen/k8seventsreceiver-update-severity-map.yaml diff --git a/.chloggen/k8seventsreceiver-update-severity-map.yaml b/.chloggen/k8seventsreceiver-update-severity-map.yaml new file mode 100644 index 0000000000000..a4580a8eddb33 --- /dev/null +++ b/.chloggen/k8seventsreceiver-update-severity-map.yaml @@ -0,0 +1,28 @@ +# Use this changelog template to create an entry for release notes. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: + +# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver) +component: + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [43401] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: +k8seventsreceiver allows event types Error and Critical inddition to current Normal and Warning event types. + +# If your change doesn't affect end users or the exported elements of any package, +# you should instead start your pull request title with [chore] or use the "Skip Changelog" label. +# Optional: The change log or logs in which this entry should be included. +# e.g. '[user]' or '[user, api]' +# Include 'user' if the change is relevant to end users. +# Include 'api' if there is a change to a library API. +# Default: '[user]' +change_logs: [user] From 68ec4b1a5aa421915f46cae1f1d06147a37d6caa Mon Sep 17 00:00:00 2001 From: gaddas3 Date: Tue, 14 Oct 2025 09:20:32 -0500 Subject: [PATCH 07/11] update change log for receiver/k8seventsreceiver --- .chloggen/k8seventsreceiver-update-severity-map.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.chloggen/k8seventsreceiver-update-severity-map.yaml b/.chloggen/k8seventsreceiver-update-severity-map.yaml index a4580a8eddb33..c4beb62d2ed42 100644 --- a/.chloggen/k8seventsreceiver-update-severity-map.yaml +++ b/.chloggen/k8seventsreceiver-update-severity-map.yaml @@ -16,7 +16,7 @@ issues: [43401] # These lines will be padded with 2 spaces and then inserted directly into the document. # Use pipe (|) for multiline entries. subtext: -k8seventsreceiver allows event types Error and Critical inddition to current Normal and Warning event types. +k8seventsreceiver allows event types Error and Critical in addition to current Normal and Warning event types. # If your change doesn't affect end users or the exported elements of any package, # you should instead start your pull request title with [chore] or use the "Skip Changelog" label. From df2b233f059dcfd7e7eb60845611adcd4bb4dd1e Mon Sep 17 00:00:00 2001 From: gaddas3 Date: Tue, 14 Oct 2025 23:45:41 -0500 Subject: [PATCH 08/11] update change log --- .chloggen/k8seventsreceiver-update-severity-map.yaml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.chloggen/k8seventsreceiver-update-severity-map.yaml b/.chloggen/k8seventsreceiver-update-severity-map.yaml index c4beb62d2ed42..ad4e1c3621319 100644 --- a/.chloggen/k8seventsreceiver-update-severity-map.yaml +++ b/.chloggen/k8seventsreceiver-update-severity-map.yaml @@ -1,13 +1,13 @@ # Use this changelog template to create an entry for release notes. # One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' -change_type: +change_type: 'enhancement' # The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver) -component: +component: k8seventsreceiver # A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). -note: +note: Allow more event types like Error and Critical which are typically used by applications when creating events. # Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. issues: [43401] @@ -15,8 +15,7 @@ issues: [43401] # (Optional) One or more lines of additional information to render under the primary note. # These lines will be padded with 2 spaces and then inserted directly into the document. # Use pipe (|) for multiline entries. -subtext: -k8seventsreceiver allows event types Error and Critical in addition to current Normal and Warning event types. +subtext: k8seventsreceiver allows event types Error and Critical in addition to the current Normal and Warning event types. # If your change doesn't affect end users or the exported elements of any package, # you should instead start your pull request title with [chore] or use the "Skip Changelog" label. From 91738ff2322e2f8a80b87e0e984547e9bd8ceacd Mon Sep 17 00:00:00 2001 From: gaddas3 Date: Mon, 20 Oct 2025 11:24:48 -0500 Subject: [PATCH 09/11] unit tests for different event types --- .../k8s_event_to_logdata_test.go | 50 +++++++++++++++++-- receiver/k8seventsreceiver/receiver_test.go | 16 +++--- 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/receiver/k8seventsreceiver/k8s_event_to_logdata_test.go b/receiver/k8seventsreceiver/k8s_event_to_logdata_test.go index d32a89f28df8f..8bb0ad5528594 100644 --- a/receiver/k8seventsreceiver/k8s_event_to_logdata_test.go +++ b/receiver/k8seventsreceiver/k8s_event_to_logdata_test.go @@ -13,8 +13,50 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver/internal/metadata" ) +func TestK8sEventToLogDataWithDifferentEventTypes(t *testing.T) { + tests := []struct { + name string + eventType string + expectedLog plog.SeverityNumber + }{ + { + name: "Normal", + eventType: "Normal", + expectedLog: plog.SeverityNumberInfo, + }, + { + name: "Warning", + eventType: "Warning", + expectedLog: plog.SeverityNumberWarn, + }, + { + name: "Error", + eventType: "Error", + expectedLog: plog.SeverityNumberError, + }, + { + name: "Critical", + eventType: "Critical", + expectedLog: plog.SeverityNumberFatal, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + k8sEvent := getEvent(test.eventType) + + ld := k8sEventToLogData(zap.NewNop(), k8sEvent, "latest") + rl := ld.ResourceLogs().At(0) + lr := rl.ScopeLogs().At(0) + logRecord := lr.LogRecords().At(0) + + assert.Equal(t, test.expectedLog, logRecord.SeverityNumber()) + }) + } +} + func TestK8sEventToLogData(t *testing.T) { - k8sEvent := getEvent() + k8sEvent := getEvent("Normal") ld := k8sEventToLogData(zap.NewNop(), k8sEvent, "latest") rl := ld.ResourceLogs().At(0) @@ -32,7 +74,7 @@ func TestK8sEventToLogData(t *testing.T) { } func TestK8sEventToLogDataWithApiAndResourceVersion(t *testing.T) { - k8sEvent := getEvent() + k8sEvent := getEvent("Normal") ld := k8sEventToLogData(zap.NewNop(), k8sEvent, "latest") attrs := ld.ResourceLogs().At(0).Resource().Attributes() @@ -54,7 +96,7 @@ func TestK8sEventToLogDataWithApiAndResourceVersion(t *testing.T) { } func TestUnknownSeverity(t *testing.T) { - k8sEvent := getEvent() + k8sEvent := getEvent("Normal") k8sEvent.Type = "Unknown" ld := k8sEventToLogData(zap.NewNop(), k8sEvent, "latest") @@ -66,7 +108,7 @@ func TestUnknownSeverity(t *testing.T) { } func TestScopeNameAndVersion(t *testing.T) { - k8sEvent := getEvent() + k8sEvent := getEvent("Normal") version := "latest" ld := k8sEventToLogData(zap.NewNop(), k8sEvent, version) diff --git a/receiver/k8seventsreceiver/receiver_test.go b/receiver/k8seventsreceiver/receiver_test.go index 79915b82d337f..6654871277a26 100644 --- a/receiver/k8seventsreceiver/receiver_test.go +++ b/receiver/k8seventsreceiver/receiver_test.go @@ -65,7 +65,7 @@ func TestHandleEvent(t *testing.T) { require.NotNil(t, r) recv := r.(*k8seventsReceiver) recv.ctx = t.Context() - k8sEvent := getEvent() + k8sEvent := getEvent("Normal") recv.handleEvent(k8sEvent) assert.Equal(t, 1, sink.LogRecordCount()) @@ -83,7 +83,7 @@ func TestDropEventsOlderThanStartupTime(t *testing.T) { require.NotNil(t, r) recv := r.(*k8seventsReceiver) recv.ctx = t.Context() - k8sEvent := getEvent() + k8sEvent := getEvent("Normal") k8sEvent.FirstTimestamp = v1.Time{Time: time.Now().Add(-time.Hour)} recv.handleEvent(k8sEvent) @@ -91,7 +91,7 @@ func TestDropEventsOlderThanStartupTime(t *testing.T) { } func TestGetEventTimestamp(t *testing.T) { - k8sEvent := getEvent() + k8sEvent := getEvent("Normal") eventTimestamp := getEventTimestamp(k8sEvent) assert.Equal(t, k8sEvent.FirstTimestamp.Time, eventTimestamp) @@ -117,7 +117,7 @@ func TestAllowEvent(t *testing.T) { require.NoError(t, err) require.NotNil(t, r) recv := r.(*k8seventsReceiver) - k8sEvent := getEvent() + k8sEvent := getEvent("Normal") shouldAllowEvent := recv.allowEvent(k8sEvent) assert.True(t, shouldAllowEvent) @@ -158,7 +158,7 @@ func TestReceiverWithLeaderElection(t *testing.T) { // Become leader: start processing events le.InvokeOnLeading() - recv.handleEvent(getEvent()) + recv.handleEvent(getEvent("Normal")) require.Eventually(t, func() bool { return sink.LogRecordCount() == 1 @@ -174,14 +174,14 @@ func TestReceiverWithLeaderElection(t *testing.T) { // regain leadership and inject again le.InvokeOnLeading() - recv.handleEvent(getEvent()) + recv.handleEvent(getEvent("Normal")) require.Eventually(t, func() bool { return sink.LogRecordCount() == 2 }, 5*time.Second, 100*time.Millisecond, "logs not collected after regaining leadership") } -func getEvent() *corev1.Event { +func getEvent(eventType string) *corev1.Event { return &corev1.Event{ InvolvedObject: corev1.ObjectReference{ APIVersion: "v1", @@ -193,7 +193,7 @@ func getEvent() *corev1.Event { Reason: "testing_event_1", Count: 2, FirstTimestamp: v1.Now(), - Type: "Normal", + Type: eventType, Message: "testing event message", ObjectMeta: v1.ObjectMeta{ UID: types.UID("289686f9-a5c0"), From 059bcda826b8fb3fc2ff91e473fe4a83cdc3eab4 Mon Sep 17 00:00:00 2001 From: gaddas3 Date: Mon, 20 Oct 2025 12:59:55 -0500 Subject: [PATCH 10/11] unit tests for different event types --- receiver/k8seventsreceiver/k8s_event_to_logdata_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/receiver/k8seventsreceiver/k8s_event_to_logdata_test.go b/receiver/k8seventsreceiver/k8s_event_to_logdata_test.go index 8bb0ad5528594..98f369c58320a 100644 --- a/receiver/k8seventsreceiver/k8s_event_to_logdata_test.go +++ b/receiver/k8seventsreceiver/k8s_event_to_logdata_test.go @@ -96,8 +96,7 @@ func TestK8sEventToLogDataWithApiAndResourceVersion(t *testing.T) { } func TestUnknownSeverity(t *testing.T) { - k8sEvent := getEvent("Normal") - k8sEvent.Type = "Unknown" + k8sEvent := getEvent("Unknown") ld := k8sEventToLogData(zap.NewNop(), k8sEvent, "latest") rl := ld.ResourceLogs().At(0) From de96451571aa754878adfaf66f81f10cae055d6d Mon Sep 17 00:00:00 2001 From: gaddas3 Date: Wed, 22 Oct 2025 13:41:18 -0500 Subject: [PATCH 11/11] update component in changelog --- .chloggen/k8seventsreceiver-update-severity-map.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.chloggen/k8seventsreceiver-update-severity-map.yaml b/.chloggen/k8seventsreceiver-update-severity-map.yaml index ad4e1c3621319..e5fcaef3a0cbf 100644 --- a/.chloggen/k8seventsreceiver-update-severity-map.yaml +++ b/.chloggen/k8seventsreceiver-update-severity-map.yaml @@ -4,7 +4,7 @@ change_type: 'enhancement' # The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver) -component: k8seventsreceiver +component: receiver/k8s_events # A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). note: Allow more event types like Error and Critical which are typically used by applications when creating events.