Skip to content

Commit c21b10a

Browse files
committed
Split container image into separate attributes viz container.image.name and container.image.tag.
1 parent 83920df commit c21b10a

File tree

4 files changed

+60
-41
lines changed

4 files changed

+60
-41
lines changed

receiver/k8sclusterreceiver/internal/container/containers.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ const (
2525
containerKeyStatusReason = "container.status.reason"
2626
containerCreationTimestamp = "container.creation_timestamp"
2727
containerName = "k8s.container.name"
28-
containerImage = "container.image.name"
28+
containerImageName = "container.image.name"
29+
containerImageTag = "container.image.tag"
2930

3031
// Values for container metadata
3132
containerStatusRunning = "running"
@@ -99,11 +100,18 @@ func RecordSpecMetrics(logger *zap.Logger, mb *imetadata.MetricsBuilder, c corev
99100
mb.EmitForResource(imetadata.WithResource(rb.Emit()))
100101
}
101102

102-
func GetMetadata(pod *corev1.Pod, cs corev1.ContainerStatus) *metadata.KubernetesMetadata {
103+
func GetMetadata(pod *corev1.Pod, cs corev1.ContainerStatus, logger *zap.Logger) *metadata.KubernetesMetadata {
103104
mdata := map[string]string{}
104105

106+
imageStr := cs.Image
107+
image, err := docker.ParseImageName(cs.Image)
108+
if err != nil {
109+
docker.LogParseError(err, imageStr, logger)
110+
} else {
111+
mdata[containerImageName] = image.Repository
112+
mdata[containerImageTag] = image.Tag
113+
}
105114
mdata[containerName] = cs.Name
106-
mdata[containerImage] = cs.Image
107115
mdata[constants.K8sKeyPodName] = pod.Name
108116
mdata[constants.K8sKeyPodUID] = string(pod.UID)
109117

receiver/k8sclusterreceiver/internal/container/containers_test.go

Lines changed: 45 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"github.com/stretchr/testify/assert"
1111
"github.com/stretchr/testify/require"
12+
"go.uber.org/zap"
1213
corev1 "k8s.io/api/core/v1"
1314
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1415
"k8s.io/apimachinery/pkg/types"
@@ -27,16 +28,18 @@ func TestGetMetadata(t *testing.T) {
2728
}
2829

2930
tests := []struct {
30-
name string
31-
containerState corev1.ContainerState
32-
expectedStatus string
33-
expectedReason string
34-
expectedStartedAt string
35-
containerName string
36-
containerID string
37-
containerImage string
38-
podName string
39-
podUID string
31+
name string
32+
containerState corev1.ContainerState
33+
expectedStatus string
34+
expectedReason string
35+
expectedStartedAt string
36+
containerName string
37+
containerID string
38+
containerImage string
39+
containerImageName string
40+
containerImageTag string
41+
podName string
42+
podUID string
4043
}{
4144
{
4245
name: "Running container",
@@ -45,13 +48,15 @@ func TestGetMetadata(t *testing.T) {
4548
StartedAt: refTime,
4649
},
4750
},
48-
expectedStatus: containerStatusRunning,
49-
expectedStartedAt: refTime.Format(time.RFC3339),
50-
containerName: "my-test-container1",
51-
containerID: "f37ee861-f093-4cea-aa26-f39fff8b0998",
52-
containerImage: "docker/someimage1",
53-
podName: pod.Name,
54-
podUID: string(pod.UID),
51+
expectedStatus: containerStatusRunning,
52+
expectedStartedAt: refTime.Format(time.RFC3339),
53+
containerName: "my-test-container1",
54+
containerID: "f37ee861-f093-4cea-aa26-f39fff8b0998",
55+
containerImage: "docker/someimage1:v1.0",
56+
containerImageName: "docker/someimage1",
57+
containerImageTag: "v1.0",
58+
podName: pod.Name,
59+
podUID: string(pod.UID),
5560
},
5661
{
5762
name: "Terminated container",
@@ -64,14 +69,16 @@ func TestGetMetadata(t *testing.T) {
6469
ExitCode: 0,
6570
},
6671
},
67-
expectedStatus: containerStatusTerminated,
68-
expectedReason: "Completed",
69-
expectedStartedAt: refTime.Format(time.RFC3339),
70-
containerName: "my-test-container2",
71-
containerID: "f37ee861-f093-4cea-aa26-f39fff8b0997",
72-
containerImage: "docker/someimage2",
73-
podName: pod.Name,
74-
podUID: string(pod.UID),
72+
expectedStatus: containerStatusTerminated,
73+
expectedReason: "Completed",
74+
expectedStartedAt: refTime.Format(time.RFC3339),
75+
containerName: "my-test-container2",
76+
containerID: "f37ee861-f093-4cea-aa26-f39fff8b0997",
77+
containerImage: "docker/someimage2:v1.1",
78+
containerImageName: "docker/someimage2",
79+
containerImageTag: "v1.1",
80+
podName: pod.Name,
81+
podUID: string(pod.UID),
7582
},
7683
{
7784
name: "Waiting container",
@@ -80,16 +87,18 @@ func TestGetMetadata(t *testing.T) {
8087
Reason: "CrashLoopBackOff",
8188
},
8289
},
83-
expectedStatus: containerStatusWaiting,
84-
expectedReason: "CrashLoopBackOff",
85-
containerName: "my-test-container3",
86-
containerID: "f37ee861-f093-4cea-aa26-f39fff8b0996",
87-
containerImage: "docker/someimage3",
88-
podName: pod.Name,
89-
podUID: string(pod.UID),
90+
expectedStatus: containerStatusWaiting,
91+
expectedReason: "CrashLoopBackOff",
92+
containerName: "my-test-container3",
93+
containerID: "f37ee861-f093-4cea-aa26-f39fff8b0996",
94+
containerImage: "docker/someimage3:latest",
95+
containerImageName: "docker/someimage3",
96+
containerImageTag: "latest",
97+
podName: pod.Name,
98+
podUID: string(pod.UID),
9099
},
91100
}
92-
101+
logger := zap.NewNop()
93102
for _, tt := range tests {
94103
t.Run(tt.name, func(t *testing.T) {
95104
cs := corev1.ContainerStatus{
@@ -98,7 +107,7 @@ func TestGetMetadata(t *testing.T) {
98107
ContainerID: tt.containerID,
99108
Image: tt.containerImage,
100109
}
101-
md := GetMetadata(pod, cs)
110+
md := GetMetadata(pod, cs, logger)
102111

103112
require.NotNil(t, md)
104113
assert.Equal(t, tt.expectedStatus, md.Metadata[containerKeyStatus])
@@ -110,7 +119,8 @@ func TestGetMetadata(t *testing.T) {
110119
assert.Equal(t, tt.expectedStartedAt, md.Metadata[containerCreationTimestamp])
111120
}
112121
assert.Equal(t, tt.containerName, md.Metadata[containerName])
113-
assert.Equal(t, tt.containerImage, md.Metadata[containerImage])
122+
assert.Equal(t, tt.containerImageName, md.Metadata[containerImageName])
123+
assert.Equal(t, tt.containerImageTag, md.Metadata[containerImageTag])
114124
assert.Equal(t, tt.podName, md.Metadata[constants.K8sKeyPodName])
115125
assert.Equal(t, tt.podUID, md.Metadata[constants.K8sKeyPodUID])
116126
})

receiver/k8sclusterreceiver/internal/pod/pods.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ func GetMetadata(pod *corev1.Pod, mc *metadata.Store, logger *zap.Logger) map[ex
175175
ResourceID: podID,
176176
Metadata: meta,
177177
},
178-
}, getPodContainerProperties(pod))
178+
}, getPodContainerProperties(pod, logger))
179179
}
180180

181181
// collectPodJobProperties checks if pod owner of type Job is cached. Check owners reference
@@ -252,10 +252,10 @@ func getWorkloadProperties(ref *v1.OwnerReference, labelKey string) map[string]s
252252
}
253253
}
254254

255-
func getPodContainerProperties(pod *corev1.Pod) map[experimentalmetricmetadata.ResourceID]*metadata.KubernetesMetadata {
255+
func getPodContainerProperties(pod *corev1.Pod, logger *zap.Logger) map[experimentalmetricmetadata.ResourceID]*metadata.KubernetesMetadata {
256256
km := map[experimentalmetricmetadata.ResourceID]*metadata.KubernetesMetadata{}
257257
for _, cs := range pod.Status.ContainerStatuses {
258-
md := container.GetMetadata(pod, cs)
258+
md := container.GetMetadata(pod, cs, logger)
259259
km[md.ResourceID] = md
260260
}
261261
return km

receiver/k8sclusterreceiver/watcher_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ func TestObjMetadata(t *testing.T) {
334334
"container.status": "running",
335335
"container.creation_timestamp": "0001-01-01T01:01:01Z",
336336
"container.image.name": "container-image-name",
337+
"container.image.tag": "latest",
337338
"k8s.container.name": "container-name",
338339
"k8s.pod.name": "test-pod-0",
339340
"k8s.pod.uid": "test-pod-0-uid",

0 commit comments

Comments
 (0)