Skip to content

Commit a66255b

Browse files
authored
feat: Add deploymentID to telemetry object collector (#1597)
* feat: add deploymentID to telemetry object collector
1 parent f30d8ac commit a66255b

File tree

2 files changed

+123
-8
lines changed

2 files changed

+123
-8
lines changed

internal/mode/static/telemetry/collector.go

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ type ProjectMetadata struct {
5252
type Data struct {
5353
ProjectMetadata ProjectMetadata
5454
ClusterID string
55-
ImageSource string
5655
Arch string
56+
DeploymentID string
57+
ImageSource string
5758
NGFResourceCounts NGFResourceCounts
5859
NodeCount int
5960
NGFReplicaCount int
@@ -101,11 +102,21 @@ func (c DataCollectorImpl) Collect(ctx context.Context) (Data, error) {
101102
return Data{}, fmt.Errorf("failed to collect NGF resource counts: %w", err)
102103
}
103104

104-
ngfReplicaCount, err := collectNGFReplicaCount(ctx, c.cfg.K8sClientReader, c.cfg.PodNSName)
105+
replicaSet, err := getPodReplicaSet(ctx, c.cfg.K8sClientReader, c.cfg.PodNSName)
106+
if err != nil {
107+
return Data{}, fmt.Errorf("failed to get replica set for pod %s: %w", c.cfg.PodNSName, err)
108+
}
109+
110+
replicaCount, err := getReplicas(replicaSet)
105111
if err != nil {
106112
return Data{}, fmt.Errorf("failed to collect NGF replica count: %w", err)
107113
}
108114

115+
deploymentID, err := getDeploymentID(replicaSet)
116+
if err != nil {
117+
return Data{}, fmt.Errorf("failed to get NGF deploymentID: %w", err)
118+
}
119+
109120
var clusterID string
110121
if clusterID, err = CollectClusterID(ctx, c.cfg.K8sClientReader); err != nil {
111122
return Data{}, fmt.Errorf("failed to collect clusterID: %w", err)
@@ -118,10 +129,11 @@ func (c DataCollectorImpl) Collect(ctx context.Context) (Data, error) {
118129
Name: "NGF",
119130
Version: c.cfg.Version,
120131
},
121-
NGFReplicaCount: ngfReplicaCount,
132+
NGFReplicaCount: replicaCount,
122133
ClusterID: clusterID,
123134
ImageSource: c.cfg.ImageSource,
124135
Arch: runtime.GOARCH,
136+
DeploymentID: deploymentID,
125137
}
126138

127139
return data, nil
@@ -175,23 +187,27 @@ func collectGraphResourceCount(
175187
return ngfResourceCounts, nil
176188
}
177189

178-
func collectNGFReplicaCount(ctx context.Context, k8sClient client.Reader, podNSName types.NamespacedName) (int, error) {
190+
func getPodReplicaSet(
191+
ctx context.Context,
192+
k8sClient client.Reader,
193+
podNSName types.NamespacedName,
194+
) (*appsv1.ReplicaSet, error) {
179195
var pod v1.Pod
180196
if err := k8sClient.Get(
181197
ctx,
182198
types.NamespacedName{Namespace: podNSName.Namespace, Name: podNSName.Name},
183199
&pod,
184200
); err != nil {
185-
return 0, fmt.Errorf("failed to get NGF Pod: %w", err)
201+
return nil, fmt.Errorf("failed to get NGF Pod: %w", err)
186202
}
187203

188204
podOwnerRefs := pod.GetOwnerReferences()
189205
if len(podOwnerRefs) != 1 {
190-
return 0, fmt.Errorf("expected one owner reference of the NGF Pod, got %d", len(podOwnerRefs))
206+
return nil, fmt.Errorf("expected one owner reference of the NGF Pod, got %d", len(podOwnerRefs))
191207
}
192208

193209
if podOwnerRefs[0].Kind != "ReplicaSet" {
194-
return 0, fmt.Errorf("expected pod owner reference to be ReplicaSet, got %s", podOwnerRefs[0].Kind)
210+
return nil, fmt.Errorf("expected pod owner reference to be ReplicaSet, got %s", podOwnerRefs[0].Kind)
195211
}
196212

197213
var replicaSet appsv1.ReplicaSet
@@ -200,16 +216,37 @@ func collectNGFReplicaCount(ctx context.Context, k8sClient client.Reader, podNSN
200216
types.NamespacedName{Namespace: podNSName.Namespace, Name: podOwnerRefs[0].Name},
201217
&replicaSet,
202218
); err != nil {
203-
return 0, fmt.Errorf("failed to get NGF Pod's ReplicaSet: %w", err)
219+
return nil, fmt.Errorf("failed to get NGF Pod's ReplicaSet: %w", err)
204220
}
205221

222+
return &replicaSet, nil
223+
}
224+
225+
func getReplicas(replicaSet *appsv1.ReplicaSet) (int, error) {
206226
if replicaSet.Spec.Replicas == nil {
207227
return 0, errors.New("replica set replicas was nil")
208228
}
209229

210230
return int(*replicaSet.Spec.Replicas), nil
211231
}
212232

233+
func getDeploymentID(replicaSet *appsv1.ReplicaSet) (string, error) {
234+
replicaOwnerRefs := replicaSet.GetOwnerReferences()
235+
if len(replicaOwnerRefs) != 1 {
236+
return "", fmt.Errorf("expected one owner reference of the NGF ReplicaSet, got %d", len(replicaOwnerRefs))
237+
}
238+
239+
if replicaOwnerRefs[0].Kind != "Deployment" {
240+
return "", fmt.Errorf("expected replicaSet owner reference to be Deployment, got %s", replicaOwnerRefs[0].Kind)
241+
}
242+
243+
if replicaOwnerRefs[0].UID == "" {
244+
return "", fmt.Errorf("expected replicaSet owner reference to have a UID")
245+
}
246+
247+
return string(replicaOwnerRefs[0].UID), nil
248+
}
249+
213250
// CollectClusterID gets the UID of the kube-system namespace.
214251
func CollectClusterID(ctx context.Context, k8sClient client.Reader) (string, error) {
215252
key := types.NamespacedName{

internal/mode/static/telemetry/collector_test.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,16 @@ var _ = Describe("Collector", Ordered, func() {
102102
Spec: appsv1.ReplicaSetSpec{
103103
Replicas: &replicas,
104104
},
105+
ObjectMeta: metav1.ObjectMeta{
106+
Name: "replica",
107+
OwnerReferences: []metav1.OwnerReference{
108+
{
109+
Kind: "Deployment",
110+
Name: "Deployment1",
111+
UID: "test-uid-replicaSet",
112+
},
113+
},
114+
},
105115
}
106116

107117
podNSName = types.NamespacedName{
@@ -126,6 +136,7 @@ var _ = Describe("Collector", Ordered, func() {
126136
ClusterID: string(kubeNamespace.GetUID()),
127137
ImageSource: "local",
128138
Arch: runtime.GOARCH,
139+
DeploymentID: string(ngfReplicaSet.ObjectMeta.OwnerReferences[0].UID),
129140
}
130141

131142
k8sClientReader = &eventsfakes.FakeReader{}
@@ -547,6 +558,7 @@ var _ = Describe("Collector", Ordered, func() {
547558
{
548559
Kind: "Deployment",
549560
Name: "deployment1",
561+
UID: "replica-uid",
550562
},
551563
},
552564
},
@@ -588,4 +600,70 @@ var _ = Describe("Collector", Ordered, func() {
588600
})
589601
})
590602
})
603+
604+
Describe("DeploymentID collector", func() {
605+
When("collecting deploymentID", func() {
606+
When("it encounters an error while collecting data", func() {
607+
It("should error if the replicaSet's owner reference is nil", func() {
608+
replicas := int32(1)
609+
k8sClientReader.GetCalls(mergeGetCallsWithBase(createGetCallsFunc(
610+
&appsv1.ReplicaSet{
611+
Spec: appsv1.ReplicaSetSpec{
612+
Replicas: &replicas,
613+
},
614+
},
615+
)))
616+
617+
expectedErr := errors.New("expected one owner reference of the NGF ReplicaSet, got 0")
618+
_, err := dataCollector.Collect(ctx)
619+
Expect(err).To(MatchError(expectedErr))
620+
})
621+
622+
It("should error if the replicaSet's owner reference kind is not deployment", func() {
623+
replicas := int32(1)
624+
k8sClientReader.GetCalls(mergeGetCallsWithBase(createGetCallsFunc(
625+
&appsv1.ReplicaSet{
626+
Spec: appsv1.ReplicaSetSpec{
627+
Replicas: &replicas,
628+
},
629+
ObjectMeta: metav1.ObjectMeta{
630+
OwnerReferences: []metav1.OwnerReference{
631+
{
632+
Name: "replica",
633+
Kind: "ReplicaSet",
634+
},
635+
},
636+
},
637+
},
638+
)))
639+
640+
expectedErr := errors.New("expected replicaSet owner reference to be Deployment, got ReplicaSet")
641+
_, err := dataCollector.Collect(ctx)
642+
Expect(err).To(MatchError(expectedErr))
643+
})
644+
It("should error if the replicaSet's owner reference has empty UID", func() {
645+
replicas := int32(1)
646+
k8sClientReader.GetCalls(mergeGetCallsWithBase(createGetCallsFunc(
647+
&appsv1.ReplicaSet{
648+
Spec: appsv1.ReplicaSetSpec{
649+
Replicas: &replicas,
650+
},
651+
ObjectMeta: metav1.ObjectMeta{
652+
OwnerReferences: []metav1.OwnerReference{
653+
{
654+
Name: "replica",
655+
Kind: "Deployment",
656+
},
657+
},
658+
},
659+
},
660+
)))
661+
662+
expectedErr := errors.New("expected replicaSet owner reference to have a UID")
663+
_, err := dataCollector.Collect(ctx)
664+
Expect(err).To(MatchError(expectedErr))
665+
})
666+
})
667+
})
668+
})
591669
})

0 commit comments

Comments
 (0)