-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsample_questions.json
More file actions
970 lines (969 loc) · 68.6 KB
/
sample_questions.json
File metadata and controls
970 lines (969 loc) · 68.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
[
{
"id": "MIXED_TC001",
"question": "Add a new method WaitForCacheSync(ctx context.Context) bool to the SharedInformer interface in k8s.io/client-go/tools/cache. SharedInformer is used across both Kubernetes infrastructure tools and observability platforms for watching and caching API resources. Which files across ArgoCD, cert-manager, Prometheus, and OpenTelemetry Operator would need to implement or adapt to this new method?",
"answer": "ArgoCD controllers (appcontroller, cache, application server) use SharedInformer for watching Application CRDs and cluster resources. Cert-manager controllers and informer factories use it for watching Certificates and Secrets. Prometheus Kubernetes discovery uses SharedInformer for watching Pods, Services, Nodes, Endpoints, and EndpointSlices. OpenTelemetry Operator target allocator uses it for watching collectors and Prometheus operator CRDs.",
"files": [
{"repo": "argo-cd", "path": "controller/appcontroller.go", "why": "ArgoCD controllers use SharedInformer for watching Application CRDs, Secrets, and cluster resources"},
{"repo": "argo-cd", "path": "controller/cache/cache.go", "why": "ArgoCD cache layer wrapping SharedInformer"},
{"repo": "argo-cd", "path": "server/server.go", "why": "Server uses NewSharedInformerFactoryWithOptions and WaitForCacheSync for watching resources"},
{"repo": "cert-manager", "path": "pkg/controller/certificates/issuing/issuing_controller.go", "why": "Cert-manager issuing controller uses SharedInformer for watching Certificates"},
{"repo": "cert-manager", "path": "pkg/controller/certificates/trigger/trigger_controller.go", "why": "Trigger controller uses SharedInformer for Certificate events"},
{"repo": "cert-manager", "path": "internal/informers/core_filteredsecrets.go", "why": "Filtered Secrets informer wrapping SharedInformer"},
{"repo": "cert-manager", "path": "pkg/client/informers/externalversions/factory.go", "why": "Informer factory creating SharedInformers for cert-manager CRDs"},
{"repo": "prometheus", "path": "discovery/kubernetes/kubernetes.go", "why": "Prometheus Kubernetes service discovery uses SharedInformer for target discovery"},
{"repo": "prometheus", "path": "discovery/kubernetes/pod.go", "why": "Pod discovery uses SharedInformer to watch Pods"},
{"repo": "prometheus", "path": "discovery/kubernetes/service.go", "why": "Service discovery uses SharedInformer to watch Services"},
{"repo": "prometheus", "path": "discovery/kubernetes/node.go", "why": "Node discovery uses SharedInformer to watch Nodes"},
{"repo": "prometheus", "path": "discovery/kubernetes/endpoints.go", "why": "Endpoints discovery uses SharedInformer"},
{"repo": "prometheus", "path": "discovery/kubernetes/endpointslice.go", "why": "EndpointSlice discovery uses SharedInformer"},
{"repo": "opentelemetry-operator", "path": "cmd/otel-allocator/internal/watcher/promOperator.go", "why": "Target allocator watches Prometheus operator CRDs via SharedInformer"},
{"repo": "opentelemetry-operator", "path": "cmd/otel-allocator/internal/collector/collector.go", "why": "Collector watcher uses SharedInformer for watching collector pods"}
]
},
{
"id": "MIXED_TC002",
"question": "Change the TLSClientConfig field in rest.Config from a value type to a pointer type (*TLSClientConfig). rest.Config is the primary struct for configuring Kubernetes API client connections. Which files across ArgoCD, ingress-nginx, external-secrets, and Grafana would break because they assign TLSClientConfig as a value?",
"answer": "ArgoCD directly assigns rest.TLSClientConfig struct literals for multi-cluster TLS configuration. Ingress-nginx creates TLSClientConfig{} literals. External-secrets Kubernetes provider assigns TLSClientConfig for cross-cluster secret access. Grafana constructs rest.TLSClientConfig{} struct literals for operator TLS configuration, authorization, and API server setup.",
"files": [
{"repo": "argo-cd", "path": "pkg/apis/application/v1alpha1/types.go", "why": "Directly assigns rest.TLSClientConfig struct literals for multi-cluster TLS configuration"},
{"repo": "ingress-nginx", "path": "cmd/nginx/main.go", "why": "Creates rest.TLSClientConfig{} and assigns CAFile before setting cfg.TLSClientConfig"},
{"repo": "external-secrets", "path": "providers/v1/kubernetes/auth.go", "why": "Assigns cfg.TLSClientConfig = rest.TLSClientConfig{} for cross-cluster secret access"},
{"repo": "grafana", "path": "pkg/operators/provisioning/config.go", "why": "Constructs rest.TLSClientConfig{} for operator provisioning TLS configuration"},
{"repo": "grafana", "path": "pkg/operators/iam/zanzana_folder_reconciler.go", "why": "Constructs rest.TLSClientConfig{} for IAM folder reconciler"},
{"repo": "grafana", "path": "pkg/services/authz/rbac.go", "why": "Assigns TLSClientConfig: rest.TLSClientConfig{} for authorization service"},
{"repo": "grafana", "path": "pkg/services/apiserver/service.go", "why": "Constructs clientrest.TLSClientConfig{} for API server setup"}
]
},
{
"id": "MIXED_TC003",
"question": "Change the Containers field in corev1.PodSpec from []Container to a new named type ContainerList with different iteration semantics. Which files across ArgoCD, cert-manager, Prometheus, and OpenTelemetry Operator would break because they use len(), range, or direct index access on pod.Spec.Containers?",
"answer": "ArgoCD accesses pod.Spec.Containers using len() and range for pod info extraction and terminal exec. Cert-manager constructs Containers: []corev1.Container{} literals for ACME challenge pods. Prometheus iterates pod.Spec.Containers for container names, ports, and image info. OpenTelemetry Operator mutates pod containers for auto-instrumentation injection and defines collector container specs.",
"files": [
{"repo": "argo-cd", "path": "controller/cache/info.go", "why": "Uses len() and range on pod.Spec.Containers for pod info extraction"},
{"repo": "argo-cd", "path": "server/application/terminal.go", "why": "Accesses pod.Spec.Containers for terminal exec"},
{"repo": "cert-manager", "path": "pkg/issuer/acme/http/pod.go", "why": "Constructs Containers: []corev1.Container{} and accesses pod.Spec.Containers[0] for ACME HTTP-01 challenge pods"},
{"repo": "prometheus", "path": "discovery/kubernetes/pod.go", "why": "Iterates pod.Spec.Containers to extract container names, ports, and image info for scrape target labels"},
{"repo": "opentelemetry-operator", "path": "internal/instrumentation/sdk.go", "why": "Accesses pod.Spec.Containers with len(), range, and index for auto-instrumentation injection"},
{"repo": "opentelemetry-operator", "path": "internal/instrumentation/helper.go", "why": "Uses range pod.Spec.Containers for instrumentation helper logic"},
{"repo": "opentelemetry-operator", "path": "pkg/sidecar/pod.go", "why": "Uses pod.Spec.Containers = append(pod.Spec.Containers, ...) and slices.DeleteFunc for sidecar management"}
]
},
{
"id": "MIXED_TC004",
"question": "Change the Type field in corev1.ServiceSpec from value type ServiceType to pointer type *ServiceType. Any code comparing svc.Spec.Type == corev1.ServiceTypeLoadBalancer will break. Which files across Helm, ArgoCD, ingress-nginx, external-dns, and Prometheus are affected?",
"answer": "Helm checks Service.Spec.Type for LoadBalancer readiness. ArgoCD checks it for health status. Ingress-nginx accesses it for backend routing and endpoint resolution. External-DNS reads it to determine DNS endpoint generation. Prometheus Kubernetes discovery reads Service objects and their types for service-level target discovery.",
"files": [
{"repo": "helm", "path": "pkg/kube/ready.go", "why": "Checks Service.Spec.Type for LoadBalancer readiness evaluation"},
{"repo": "argo-cd", "path": "gitops-engine/pkg/health/health_service.go", "why": "Checks Service.Spec.Type for health status and load balancer ingress status"},
{"repo": "ingress-nginx", "path": "internal/ingress/controller/store/store.go", "why": "Accesses Service.Spec.Type for backend routing"},
{"repo": "ingress-nginx", "path": "internal/ingress/controller/endpointslices.go", "why": "Accesses Service.Spec.Type for endpoint resolution"},
{"repo": "ingress-nginx", "path": "internal/ingress/controller/controller.go", "why": "Compares svc.Spec.Type == apiv1.ServiceTypeExternalName for backend routing"},
{"repo": "ingress-nginx", "path": "internal/ingress/status/status.go", "why": "Switches on svc.Spec.Type for status reporting"},
{"repo": "external-dns", "path": "source/service.go", "why": "Reads Service.Spec.Type to determine DNS endpoint generation for LoadBalancer/NodePort services"},
{"repo": "external-dns", "path": "source/compatibility.go", "why": "Switches on svc.Spec.Type for compatibility source handling"},
{"repo": "prometheus", "path": "discovery/kubernetes/service.go", "why": "Reads svc.Spec.Type for service-level target discovery and label generation"}
]
},
{
"id": "MIXED_TC005",
"question": "Add a context.Context parameter to the Matches method on the labels.Selector interface in k8s.io/apimachinery/pkg/labels. Which files across Helm, ArgoCD, external-dns, and ingress-nginx call Matches() and would need updating?",
"answer": "Helm calls selector.Matches() for filtering releases by label selector. ArgoCD calls selector.Matches() for application event filtering and defines a custom Selector interface mirroring labels.Selector.Matches. External-DNS calls selector.Matches() for filtering source resources by annotation and label selectors. Ingress-nginx calls namespaceSelector.Matches() for namespace filtering.",
"files": [
{"repo": "helm", "path": "pkg/action/list.go", "why": "Calls selector.Matches(labels.Set(rls.Labels)) for filtering releases by label selector"},
{"repo": "argo-cd", "path": "server/application/application.go", "why": "Calls selector.Matches(labels.Set(a.Labels)) for application event filtering"},
{"repo": "argo-cd", "path": "applicationset/utils/selector.go", "why": "Defines custom Selector interface with Matches(labels.Labels) bool mirroring k8s labels.Selector.Matches"},
{"repo": "argo-cd", "path": "applicationset/generators/generator_spec_processor.go", "why": "Calls selector.Matches(labels.Set(flatParam)) for generator parameter filtering"},
{"repo": "external-dns", "path": "source/source.go", "why": "Calls selector.Matches(labels.Set(srcAnnotations)) for filtering source resources"},
{"repo": "external-dns", "path": "source/gateway.go", "why": "Calls selector.Matches(labels.Set(annots)) and selector.Matches(labels.Set(ns.Labels)) for gateway filtering"},
{"repo": "external-dns", "path": "source/annotations/filter.go", "why": "Calls selector.Matches(labels.Set(item.GetAnnotations())) for annotation-based filtering"},
{"repo": "external-dns", "path": "source/informers/indexers.go", "why": "Calls annotationFilter.Matches(labels.Set(...)) and labelSelector.Matches(labels.Set(...)) for informer indexing"},
{"repo": "ingress-nginx", "path": "internal/ingress/controller/store/store.go", "why": "Calls namespaceSelector.Matches(labels.Set(ns.Labels)) for namespace filtering"}
]
},
{
"id": "MIXED_TC006",
"question": "Change the Data field on corev1.Secret from map[string][]byte to a new named type SecretData with different accessor methods. Which files across Helm, ArgoCD, cert-manager, and external-secrets would break because they directly access Secret.Data as a map?",
"answer": "Helm stores release data in Secret.Data map. ArgoCD stores cluster credentials, repository credentials, and settings in Secret.Data fields. Cert-manager reads/writes TLS certificates, keys, Vault credentials, DNS provider credentials, and Venafi credentials from Secret.Data. External-secrets pushsecret controller reads Secret.Data to push secret values to external providers.",
"files": [
{"repo": "helm", "path": "pkg/storage/driver/secrets.go", "why": "Stores release data in Secret.Data map, encoding release metadata as base64 byte values"},
{"repo": "argo-cd", "path": "util/db/secrets.go", "why": "Stores and reads cluster/repo credentials from Secret.Data"},
{"repo": "argo-cd", "path": "util/db/repository_secrets.go", "why": "Repository credentials stored in Secret.Data"},
{"repo": "argo-cd", "path": "util/db/cluster.go", "why": "Cluster connection data stored in Secret.Data"},
{"repo": "argo-cd", "path": "util/settings/settings.go", "why": "Settings stored in Secret.Data fields"},
{"repo": "cert-manager", "path": "pkg/controller/certificates/issuing/internal/secret.go", "why": "Reads/writes TLS certificates and keys to Secret.Data"},
{"repo": "cert-manager", "path": "pkg/controller/cainjector/sources.go", "why": "CA injector reads certificate data from Secret.Data"},
{"repo": "cert-manager", "path": "internal/vault/vault.go", "why": "Reads CA certs, TLS certs, private keys, and AppRole credentials from secret.Data[key] for Vault issuer authentication"},
{"repo": "cert-manager", "path": "pkg/issuer/acme/dns/dns.go", "why": "Reads DNS provider credentials (CloudDNS, Cloudflare, Route53, AzureDNS) from saSecret.Data[key]"},
{"repo": "cert-manager", "path": "pkg/issuer/venafi/client/venaficlient.go", "why": "Reads Venafi TPP username/password/accessToken and Cloud API key from tppSecret.Data[key]"},
{"repo": "external-secrets", "path": "pkg/controllers/pushsecret/pushsecret_controller.go", "why": "Reads secret.Data[key] to check key existence and push secret values to external providers"}
]
},
{
"id": "MIXED_TC007",
"question": "Change the Labels field in metav1.ObjectMeta from map[string]string to a new named type LabelMap requiring accessor methods. ObjectMeta is embedded in every Kubernetes resource type. Which files across ArgoCD, cert-manager, external-secrets, Prometheus, Loki, and OpenTelemetry Operator would break?",
"answer": "ArgoCD directly accesses ObjectMeta.Labels map for application labeling. Cert-manager constructs ObjectMeta with Labels map literals for ACME challenge resources. External-secrets CRD types use Labels for store/secret selection. Prometheus reads ObjectMeta.Labels to construct __meta_kubernetes_*_label_* target labels. Loki Operator constructs resources with ObjectMeta.Labels for all components. OpenTelemetry Operator CRD types use Labels for collector and instrumentation resources.",
"files": [
{"repo": "argo-cd", "path": "controller/appcontroller.go", "why": "Directly accesses ObjectMeta.Labels map for application resource labeling"},
{"repo": "argo-cd", "path": "util/settings/settings.go", "why": "Accesses Labels map for settings resources"},
{"repo": "cert-manager", "path": "pkg/issuer/acme/http/pod.go", "why": "Constructs ObjectMeta with Labels map literals for ACME challenge pods"},
{"repo": "cert-manager", "path": "pkg/issuer/acme/http/service.go", "why": "Constructs Labels map literals for ACME challenge services"},
{"repo": "cert-manager", "path": "pkg/issuer/acme/http/ingress.go", "why": "Constructs Labels map literals for ACME challenge ingresses"},
{"repo": "external-secrets", "path": "pkg/controllers/externalsecret/externalsecret_controller.go", "why": "Directly accesses .Labels[esv1.LabelManaged], assigns Labels = make(map[string]string), sets Labels[esv1.LabelOwner]"},
{"repo": "external-secrets", "path": "pkg/controllers/webhookconfig/webhookconfig.go", "why": "Accesses cfg.Labels[constants.WellKnownLabelKey] to check webhook labels and secret.Labels for CA cert management"},
{"repo": "external-secrets", "path": "apis/externalsecrets/v1/clusterexternalsecret_types.go", "why": "ExternalSecretMetadata struct defines Labels map[string]string field"},
{"repo": "prometheus", "path": "discovery/kubernetes/kubernetes.go", "why": "Reads ObjectMeta.Labels for target label construction"},
{"repo": "prometheus", "path": "discovery/kubernetes/pod.go", "why": "Reads pod ObjectMeta.Labels for __meta_kubernetes_pod_label_* labels"},
{"repo": "prometheus", "path": "discovery/kubernetes/node.go", "why": "Reads node ObjectMeta.Labels for __meta_kubernetes_node_label_* labels"},
{"repo": "prometheus", "path": "discovery/kubernetes/service.go", "why": "Reads service ObjectMeta.Labels for target labels"},
{"repo": "loki", "path": "operator/internal/manifests/config.go", "why": "Loki Operator constructs resources with ObjectMeta.Labels"},
{"repo": "loki", "path": "operator/internal/manifests/distributor.go", "why": "Distributor component Labels"},
{"repo": "loki", "path": "operator/internal/manifests/compactor.go", "why": "Compactor component Labels"},
{"repo": "loki", "path": "operator/internal/manifests/gateway.go", "why": "Gateway component Labels"},
{"repo": "opentelemetry-operator", "path": "apis/v1beta1/opentelemetrycollector_types.go", "why": "CRD types embed ObjectMeta and use Labels for collectors"},
{"repo": "opentelemetry-operator", "path": "internal/manifests/collector/service.go", "why": "Directly accesses h.Labels[headlessLabel] and h.Labels[serviceTypeLabel] to set headless service labels"},
{"repo": "opentelemetry-operator", "path": "pkg/sidecar/pod.go", "why": "Sets pod.Labels = map[string]string{} and pod.Labels[injectedLabel] for sidecar injection tracking"},
{"repo": "opentelemetry-operator", "path": "internal/manifests/mutate.go", "why": "Manifest mutation assigns existing.Labels = desired.Labels for multiple resource types"}
]
},
{
"id": "MIXED_TC008",
"question": "Change the List method on dynamic.ResourceInterface from returning (*unstructured.UnstructuredList, error) to returning a new paginated result type (PaginatedList, error). Which files across Helm, ArgoCD, and Grafana would break?",
"answer": "Helm template engine uses dynamic client to look up arbitrary K8s resources during chart rendering. ArgoCD gitops-engine calls dynamic.ResourceInterface.List() for cache population, sync operations, and notification controller. Grafana provisioning system uses dynamic client for listing and managing provisioned Kubernetes resources and folders.",
"files": [
{"repo": "helm", "path": "pkg/engine/lookup_func.go", "why": "Template engine uses dynamic client to look up arbitrary K8s resources during chart rendering"},
{"repo": "argo-cd", "path": "gitops-engine/pkg/sync/sync_context.go", "why": "Calls dynamic.ResourceInterface.List() for sync operations"},
{"repo": "argo-cd", "path": "gitops-engine/pkg/cache/cluster.go", "why": "Calls dynamic.ResourceInterface.List() for cache population"},
{"repo": "argo-cd", "path": "notification_controller/controller/controller.go", "why": "Notification controller uses dynamic.ResourceInterface.List()"},
{"repo": "grafana", "path": "pkg/registry/apis/provisioning/resources/client.go", "why": "Provisioning system uses dynamic client for listing Kubernetes resources"},
{"repo": "grafana", "path": "pkg/registry/apis/provisioning/resources/retry_client.go", "why": "Wraps dynamic.ResourceInterface and calls r.client.List(ctx, opts) with retry logic"}
]
},
{
"id": "MIXED_TC009",
"question": "Change the AddKnownTypes method on runtime.Scheme from accepting variadic Object arguments to requiring a typed TypeRegistration struct. Every project that registers custom CRD types must call scheme.AddKnownTypes(). Which files across cert-manager, external-secrets, Grafana, and OpenTelemetry Operator would break?",
"answer": "Cert-manager registers certificate and issuer types with runtime.Scheme for informer factories. External-secrets registers SecretStore and ExternalSecret CRD types. Grafana registers alerting enrichment, provisioning, and datasource API types. OpenTelemetry Operator registers OpenTelemetryCollector, Instrumentation, and OpAMPBridge CRD types.",
"files": [
{"repo": "cert-manager", "path": "pkg/apis/certmanager/v1/register.go", "why": "Calls scheme.AddKnownTypes to register Certificate, Issuer, and ClusterIssuer CRD types"},
{"repo": "external-secrets", "path": "apis/externalsecrets/v1/register.go", "why": "Registers SecretStore, ExternalSecret, and ClusterExternalSecret CRD types"},
{"repo": "grafana", "path": "apps/alerting/alertenrichment/pkg/apis/alertenrichment/v1beta1/zz_generated.defaults.go", "why": "Registers alerting enrichment API types"},
{"repo": "grafana", "path": "apps/provisioning/pkg/generated/clientset/versioned/scheme/register.go", "why": "Registers provisioning API types"},
{"repo": "grafana", "path": "apps/provisioning/pkg/apis/provisioning/v0alpha1/register.go", "why": "Registers provisioning v0alpha1 API types"},
{"repo": "opentelemetry-operator", "path": "apis/v1beta1/groupversion_info.go", "why": "Registers OpenTelemetryCollector CRD types with runtime.Scheme"},
{"repo": "opentelemetry-operator", "path": "apis/v1alpha1/groupversion_info.go", "why": "Registers Instrumentation and OpAMPBridge CRD types with runtime.Scheme"}
]
},
{
"id": "MIXED_TC010",
"question": "Add a new method HealthCheck(ctx context.Context) error to the kubernetes.Interface (Clientset interface) in k8s.io/client-go/kubernetes. The Clientset is the typed client used by virtually every Kubernetes project. Which files across Helm, ArgoCD, cert-manager, Grafana, and OpenTelemetry Operator would need to adapt?",
"answer": "Helm calls kubernetes.NewForConfig for chart action operations. ArgoCD server creates Clientset via NewForConfigOrDie for cluster management. Cert-manager calls kubernetes.NewForConfig for webhook, TLS authority, and DNS provider operations. Grafana calls kubernetes.NewForConfig for star API and short URL services. OpenTelemetry Operator calls kubernetes.NewForConfig in operator main and allocator main.",
"files": [
{"repo": "helm", "path": "pkg/action/action.go", "why": "Calls kubernetes.NewForConfig(conf) for Kubernetes API operations during chart actions"},
{"repo": "argo-cd", "path": "cmd/argocd-server/commands/argocd_server.go", "why": "Calls kubernetes.NewForConfigOrDie(config) for API server communication and cluster management"},
{"repo": "cert-manager", "path": "internal/webhook/webhook.go", "why": "Calls kubernetes.NewForConfig(restcfg) for webhook server initialization"},
{"repo": "cert-manager", "path": "pkg/server/tls/authority/authority.go", "why": "Calls kubernetes.NewForConfig(c) for TLS certificate authority operations"},
{"repo": "cert-manager", "path": "pkg/issuer/acme/dns/rfc2136/provider.go", "why": "Calls kubernetes.NewForConfig(kubeClientConfig) for RFC2136 DNS provider secret access"},
{"repo": "grafana", "path": "pkg/services/star/api/client.go", "why": "Calls kubernetes.NewForConfig() for star/bookmark API operations"},
{"repo": "grafana", "path": "pkg/api/short_url.go", "why": "Calls kubernetes.NewForConfig() for short URL API operations"},
{"repo": "opentelemetry-operator", "path": "main.go", "why": "Calls kubernetes.NewForConfig(mgr.GetConfig()) for operator initialization"},
{"repo": "opentelemetry-operator", "path": "cmd/otel-allocator/main.go", "why": "Calls kubernetes.NewForConfig(cfg.ClusterConfig) for target allocator Kubernetes client"}
]
},
{
"id": "OBS_TC001",
"source_change": {
"repo": "prometheus/prometheus",
"file": "storage/interface.go",
"change_type": "interface_modification",
"description": "Add a new method SelectSorted(ctx context.Context, hints *SelectHints, matchers ...*labels.Matcher) SeriesSet to the Querier interface in prometheus/storage. Querier is the core read interface used by Thanos StoreAPI and Mimir query-frontend to evaluate PromQL queries against time-series data. Any type implementing Querier must now satisfy this additional method.",
"specific_change": "Add `SelectSorted(ctx context.Context, hints *SelectHints, matchers ...*labels.Matcher) SeriesSet` method to Querier interface"
},
"expected_affected_files": [
{
"repo": "thanos-io/thanos",
"files": [
"pkg/query/querier.go",
"pkg/rules/queryable.go",
"pkg/receive/multitsdb.go"
],
"reason": "Thanos query layer (querier.go) implements storage.Querier with Select/LabelValues/LabelNames/Close. Rules queryable implements storage.Querier for rule evaluation. Receive multitsdb wraps storage.Querier via ReadyStorage."
},
{
"repo": "grafana/mimir",
"files": [
"pkg/querier/querier.go",
"pkg/querier/blocks_store_queryable.go",
"pkg/querier/distributor_queryable.go",
"pkg/querier/error_translate_queryable.go",
"pkg/storage/lazyquery/lazyquery.go"
],
"reason": "Mimir implements storage.Querier in multiQuerier, blocksStoreQuerier, distributorQuerier, errorTranslateQuerier, and LazyQuerier, all with Select/LabelValues/LabelNames/Close methods."
}
]
},
{
"id": "OBS_TC002",
"source_change": {
"repo": "prometheus/prometheus",
"file": "model/labels/labels_common.go",
"change_type": "type_change",
"description": "Change the Labels type from a sorted slice of Label structs to a new named struct with private fields and accessor methods. Labels is the fundamental type used across the entire observability stack to represent metric label sets. Any code that directly iterates, indexes, or constructs Labels as a slice will break.",
"specific_change": "Change `type Labels []Label` to `type Labels struct { data []Label }` with accessor methods"
},
"expected_affected_files": [
{
"repo": "thanos-io/thanos",
"files": [
"pkg/store/bucket.go",
"pkg/store/lazy_postings.go",
"pkg/store/labelpb/label.go",
"pkg/compact/compact.go",
"pkg/receive/multitsdb.go"
],
"reason": "Thanos BucketStore uses labels.FromMap for external label sets. lazy_postings.go constructs labels.Label{}. labelpb/label.go constructs labels.Labels{}. compact.go uses labels.FromMap for compaction grouping. multitsdb.go uses labels.FromStrings for tenant labels."
},
{
"repo": "grafana/mimir",
"files": [
"pkg/compactor/split_merge_grouper.go",
"pkg/compactor/job.go",
"pkg/compactor/bucket_compactor.go"
],
"reason": "Mimir split_merge_grouper.go uses labels.FromMap for block external labels. job.go uses labels.FromMap for label matching. bucket_compactor.go uses labels.FromMap for block upload logging."
},
{
"repo": "grafana/loki",
"files": [
"pkg/ruler/rulespb/compat.go",
"pkg/ruler/compat.go",
"pkg/ruler/base/api.go"
],
"reason": "Loki rulespb/compat.go uses labels.FromMap for rule label conversion. ruler/compat.go constructs labels.Labels{} for empty metric results. base/api.go constructs labels.Label{} structs for ruler API responses."
}
]
},
{
"id": "OBS_TC003",
"source_change": {
"repo": "prometheus/prometheus",
"file": "model/histogram/histogram.go",
"change_type": "struct_field_change",
"description": "Add a new required field CreatedTimestamp int64 to the Histogram struct in prometheus/model/histogram. Histogram is the native histogram representation used by Prometheus TSDB and consumed by Thanos and Mimir for storage and query. Any code that constructs Histogram literals will break due to the new required field.",
"specific_change": "Add `CreatedTimestamp int64` field to Histogram struct"
},
"expected_affected_files": [
{
"repo": "thanos-io/thanos",
"files": [
"pkg/store/storepb/prompb/samples.go",
"pkg/receive/writecapnp/write_request.go"
],
"reason": "Thanos prompb/samples.go constructs &histogram.Histogram{} and &histogram.FloatHistogram{} struct literals when converting protobuf samples. writecapnp/write_request.go constructs histogram structs when deserializing Cap'n Proto write requests."
},
{
"repo": "grafana/mimir",
"files": [
"pkg/mimirpb/compat.go",
"pkg/querier/batch/batch.go",
"pkg/querier/batch/merge.go",
"pkg/storage/chunk/prometheus_chunk.go",
"pkg/blockbuilder/tsdb.go"
],
"reason": "Mimir mimirpb/compat.go constructs &histogram.Histogram{} when converting between internal and Prometheus formats. batch.go and merge.go construct histogram structs for batch querying. prometheus_chunk.go constructs during chunk decoding. blockbuilder/tsdb.go defines zero histogram sentinel values."
}
]
},
{
"id": "OBS_TC004",
"source_change": {
"repo": "prometheus/prometheus",
"file": "tsdb/db.go",
"change_type": "method_signature_change",
"description": "Change the DB.Querier method signature from Querier(mint, maxt int64) (storage.Querier, error) to Querier(ctx context.Context, mint, maxt int64) (storage.Querier, error) by adding a context parameter. DB is the main TSDB entry point used by Thanos sidecar and Mimir ingester for local time-series storage. All callers must pass a context.",
"specific_change": "Add `ctx context.Context` as first parameter to `DB.Querier(mint, maxt int64)` method"
},
"expected_affected_files": [
{
"repo": "thanos-io/thanos",
"files": [
"pkg/receive/multitsdb.go"
],
"reason": "Thanos receive adapter in multitsdb.go directly calls a.db.Querier(mint, maxt) on a tsdb.DB instance to create queriers for local TSDB reads."
},
{
"repo": "grafana/mimir",
"files": [
"pkg/ingester/ingester.go",
"pkg/ingester/user_tsdb.go"
],
"reason": "Mimir ingester.go calls db.Querier() for querying local TSDB data during series, label values, and label names operations. user_tsdb.go calls u.db.Querier(mint, maxt) to expose the underlying TSDB querier."
}
]
},
{
"id": "OBS_TC005",
"source_change": {
"repo": "prometheus/prometheus",
"file": "promql/engine.go",
"change_type": "interface_modification",
"description": "Add a new method ExplainQuery(ctx context.Context, qs string) (*QueryPlan, error) to the QueryEngine interface in promql. QueryEngine is used by Thanos query frontend for distributed PromQL evaluation and by Grafana for direct Prometheus queries. All implementations must add this method.",
"specific_change": "Add `ExplainQuery(ctx context.Context, qs string) (*QueryPlan, error)` method to QueryEngine"
},
"expected_affected_files": [
{
"repo": "thanos-io/thanos",
"files": [
"pkg/query/remote_engine.go",
"pkg/api/query/engine.go"
],
"reason": "Thanos remote_engine.go implements the QueryEngine interface methods NewRangeQuery and NewInstantQuery for distributed query execution. api/query/engine.go wraps promql.Engine and calls NewInstantQuery/NewRangeQuery for query evaluation."
},
{
"repo": "grafana/mimir",
"files": [
"pkg/querier/querier.go",
"pkg/streamingpromql/compat/fallback_engine.go",
"pkg/frontend/querymiddleware/querysharding.go",
"pkg/frontend/querymiddleware/spin_off_subqueries.go"
],
"reason": "Mimir querier.go creates and returns promql.QueryEngine instances. fallback_engine.go wraps the QueryEngine interface. querysharding.go holds a promql.QueryEngine field for shard-level query execution. spin_off_subqueries.go holds a promql.QueryEngine field for subquery execution."
}
]
},
{
"id": "OBS_TC006",
"source_change": {
"repo": "prometheus/prometheus",
"file": "storage/interface_append.go",
"change_type": "interface_modification",
"description": "Add a new method AppendCTZeroSample(ref SeriesRef, l labels.Labels, t, ct int64) (SeriesRef, error) to the Appender interface in prometheus/storage. Appender is used by all components that write time-series data including remote write receivers, OTLP-to-Prometheus converters, and Mimir distributors. All implementations must add this method.",
"specific_change": "Add `AppendCTZeroSample(ref SeriesRef, l labels.Labels, t, ct int64) (SeriesRef, error)` to Appender interface"
},
"expected_affected_files": [
{
"repo": "thanos-io/thanos",
"files": [
"pkg/receive/writer.go",
"pkg/receive/multitsdb.go"
],
"reason": "Thanos receive/writer.go defines ReceiveAppender which embeds storage.Appender and overrides Append() for validation. multitsdb.go defines ReadyStorage.Appender() which returns storage.Appender instances."
},
{
"repo": "grafana/mimir",
"files": [
"pkg/ruler/compat.go",
"pkg/ingester/ingester.go",
"pkg/ingester/user_tsdb.go"
],
"reason": "Mimir ruler/compat.go implements PusherAppender and NoopAppender satisfying storage.Appender. ingester.go defines extendedAppender embedding storage.Appender. user_tsdb.go returns storage.Appender from its Appender() method."
},
{
"repo": "open-telemetry/opentelemetry-collector-contrib",
"files": [
"receiver/prometheusreceiver/internal/transaction.go",
"receiver/prometheusreceiver/internal/appendable.go"
],
"reason": "OTel Prometheus receiver's transaction.go implements the full storage.Appender interface (Append, AppendExemplar, AppendHistogram, Commit) for converting scraped metrics to OTLP. appendable.go returns storage.Appender instances."
}
]
},
{
"id": "OBS_TC007",
"source_change": {
"repo": "prometheus/prometheus",
"file": "config/config.go",
"change_type": "struct_field_change",
"description": "Change the ScrapeInterval field in GlobalConfig from model.Duration to a new typed Duration with validation constraints. GlobalConfig is embedded by Thanos, Mimir, and Grafana for configuring Prometheus-compatible scrape and evaluation intervals. Any code that assigns model.Duration values to ScrapeInterval will break.",
"specific_change": "Change `ScrapeInterval model.Duration` to `ScrapeInterval ValidatedDuration` in GlobalConfig"
},
"expected_affected_files": [
{
"repo": "thanos-io/thanos",
"files": [
"cmd/thanos/rule.go"
],
"reason": "Thanos rule.go constructs a config.GlobalConfig{} struct literal when configuring the remote storage for the ruler component. A type change to ScrapeInterval would affect this struct literal construction."
}
]
},
{
"id": "OBS_TC008",
"source_change": {
"repo": "prometheus/prometheus",
"file": "model/labels/matcher.go",
"change_type": "type_change",
"description": "Change the Matcher struct to use a compiled regex cache instead of re-compiling on each match. Change the Matches(v string) bool method signature to Matches(v string) (bool, error) to surface regex compilation errors. Matcher is used across the entire observability stack for label filtering in queries and alerting rules.",
"specific_change": "Change `Matches(v string) bool` to `Matches(v string) (bool, error)` on Matcher"
},
"expected_affected_files": [
{
"repo": "thanos-io/thanos",
"files": [
"pkg/store/bucket.go",
"pkg/store/prometheus.go",
"pkg/store/local.go",
"pkg/store/proxy.go",
"pkg/rules/rules.go"
],
"reason": "Thanos bucket.go calls m.Matches() in 6 locations for series filtering. prometheus.go, local.go, and proxy.go call m.Matches() for external label matching. rules.go calls m.Matches() for rule label filtering."
},
{
"repo": "grafana/mimir",
"files": [
"pkg/storegateway/bucket.go",
"pkg/storegateway/series_refs.go",
"pkg/storegateway/bucket_index_postings.go",
"pkg/ingester/activeseries/model/matchers.go",
"pkg/querier/tenantfederation/tenant_federation.go"
],
"reason": "Mimir storegateway bucket.go calls m.Matches() for block label filtering. series_refs.go calls matcher.Matches() for series filtering. bucket_index_postings.go for postings evaluation. matchers.go for active series matching. tenant_federation.go for tenant ID filtering."
},
{
"repo": "grafana/loki",
"files": [
"pkg/ingester/instance.go",
"pkg/ingester/tailer.go",
"pkg/ingester/index/index.go",
"pkg/storage/stores/shipper/indexshipper/tsdb/querier.go"
],
"reason": "Loki ingester instance.go calls filter.Matches() for stream label filtering. tailer.go calls matcher.Matches() for tail query filtering. index.go for inverted index lookups. tsdb/querier.go calls m.Matches() for postings-based series filtering."
}
]
},
{
"id": "OBS_TC009",
"source_change": {
"repo": "prometheus/prometheus",
"file": "discovery/discovery.go",
"change_type": "interface_modification",
"description": "Add a new method HealthCheck(ctx context.Context) error to the Discoverer interface in prometheus/discovery. Discoverer is used by Thanos and Prometheus to find scrape targets dynamically. Any custom service discovery implementation must now implement HealthCheck.",
"specific_change": "Add `HealthCheck(ctx context.Context) error` method to Discoverer interface"
},
"expected_affected_files": [
{
"repo": "thanos-io/thanos",
"files": [
"cmd/thanos/endpointset.go",
"pkg/clientconfig/http.go"
],
"reason": "Thanos endpointset.go creates file.NewDiscovery instances (implementing discovery.Discoverer) and calls Run() for store endpoint discovery. clientconfig/http.go creates file.NewDiscovery for HTTP service discovery configuration."
}
]
},
{
"id": "OBS_TC010",
"source_change": {
"repo": "prometheus/prometheus",
"file": "tsdb/compact.go",
"change_type": "interface_modification",
"description": "Add a new method CompactWithTombstones(ctx context.Context, blocks []BlockMeta, tombstones Tombstones) (ulid.ULID, error) to the Compactor interface in prometheus/tsdb. Compactor is used by Thanos and Mimir for multi-block compaction. All implementations must support tombstone-aware compaction.",
"specific_change": "Add `CompactWithTombstones(ctx context.Context, blocks []BlockMeta, tombstones Tombstones) (ulid.ULID, error)` to Compactor interface"
},
"expected_affected_files": [
{
"repo": "thanos-io/thanos",
"files": [
"pkg/compact/compact.go"
],
"reason": "Thanos compact.go defines the Compactor interface with Compact and CompactWithBlockPopulator methods. Any new method added to the interface requires updating this definition and all callers."
},
{
"repo": "grafana/mimir",
"files": [
"pkg/compactor/compactor.go",
"pkg/compactor/split_merge_compactor.go",
"pkg/compactor/bucket_compactor.go"
],
"reason": "Mimir bucket_compactor.go defines its own Compactor interface mirroring Prometheus TSDB Compactor. compactor.go uses Compactor via BlocksCompactorFactory. split_merge_compactor.go implements the factory returning a Compactor instance."
}
]
},
{
"id": "OBS_TC011",
"source_change": {
"repo": "open-telemetry/opentelemetry-collector",
"file": "component/component.go",
"change_type": "interface_modification",
"description": "Add a new method Capabilities() ComponentCapabilities to the Component interface in go.opentelemetry.io/collector/component. Component is the base interface for all OTel Collector plugins (receivers, exporters, processors, connectors). Jaeger v2 and Tempo both embed the collector as their core pipeline. Every plugin across otel-contrib must implement this method.",
"specific_change": "Add `Capabilities() ComponentCapabilities` method to Component interface"
},
"expected_affected_files": [
{
"repo": "open-telemetry/opentelemetry-collector-contrib",
"files": [
"exporter/prometheusexporter/prometheus.go",
"exporter/prometheusexporter/factory.go",
"receiver/jaegerreceiver/trace_receiver.go",
"receiver/jaegerreceiver/factory.go"
],
"reason": "Every exporter and receiver in otel-contrib implements the Component interface and must add the new Capabilities method"
},
{
"repo": "jaegertracing/jaeger",
"files": [
"cmd/jaeger/internal/extension/jaegerstorage/extension.go",
"cmd/jaeger/internal/exporters/storageexporter/exporter.go"
],
"reason": "Jaeger v2 is built on OTel Collector and its storage extension and exporter implement Component"
},
{
"repo": "grafana/tempo",
"files": [
"modules/distributor/receiver/shim.go",
"modules/distributor/forwarder/forwarder.go"
],
"reason": "Tempo's receiver shim implements component.Host (returning map[component.ID]component.Component) and manages OTel receiver components. The forwarder implements component.Host and manages OTel processor/exporter lifecycle."
}
]
},
{
"id": "OBS_TC012",
"source_change": {
"repo": "open-telemetry/opentelemetry-collector",
"file": "consumer/metrics.go",
"change_type": "interface_modification",
"description": "Add a new method ConsumeMetricsWithContext(ctx context.Context, md pmetric.Metrics, opts ...ConsumeOption) error to the Metrics consumer interface. This interface is implemented by all metric processors and exporters in the OTel Collector pipeline. Jaeger uses it for span metrics.",
"specific_change": "Add `ConsumeMetricsWithContext` method to Metrics consumer interface"
},
"expected_affected_files": [
{
"repo": "open-telemetry/opentelemetry-collector-contrib",
"files": [
"exporter/prometheusexporter/prometheus.go",
"exporter/prometheusexporter/collector.go"
],
"reason": "Prometheus exporter implements ConsumeMetrics (prometheus.go) which feeds metrics to the collector. Both files are directly affected."
}
]
},
{
"id": "OBS_TC013",
"source_change": {
"repo": "open-telemetry/opentelemetry-collector",
"file": "exporter/exporter.go",
"change_type": "struct_field_change",
"description": "Add a required field RetryConfig RetrySettings to the exporter.Settings struct. Every exporter factory in otel-contrib and Jaeger receives Settings when creating exporter instances. All callers constructing Settings literals will break.",
"specific_change": "Add `RetryConfig RetrySettings` field to exporter.Settings struct"
},
"expected_affected_files": [
{
"repo": "open-telemetry/opentelemetry-collector-contrib",
"files": [
"exporter/prometheusexporter/factory.go",
"exporter/prometheusexporter/prometheus.go"
],
"reason": "Prometheus exporter factory creates exporter using Settings and must include the new RetryConfig field"
},
{
"repo": "jaegertracing/jaeger",
"files": [
"cmd/jaeger/internal/exporters/storageexporter/factory.go"
],
"reason": "Jaeger storage exporter factory receives exporter.Settings in createTracesExporter and passes it to exporterhelper.NewTraces"
}
]
},
{
"id": "OBS_TC014",
"source_change": {
"repo": "open-telemetry/opentelemetry-collector",
"file": "receiver/receiver.go",
"change_type": "method_signature_change",
"description": "Change the CreateTraces receiver factory function signature to include a new logger parameter: CreateTraces(ctx context.Context, set Settings, cfg component.Config, logger *zap.Logger, next consumer.Traces) (Traces, error). All receiver factories must update their signatures.",
"specific_change": "Add `logger *zap.Logger` parameter to CreateTraces factory function signature"
},
"expected_affected_files": [
{
"repo": "open-telemetry/opentelemetry-collector-contrib",
"files": [
"receiver/jaegerreceiver/factory.go",
"receiver/jaegerreceiver/trace_receiver.go"
],
"reason": "Jaeger receiver factory implements CreateTraces and must add the logger parameter"
},
{
"repo": "jaegertracing/jaeger",
"files": [
"cmd/jaeger/internal/integration/trace_writer.go"
],
"reason": "Jaeger trace_writer.go calls factory.CreateTraces(context.Background(), set, cfg) and would break when the signature changes"
}
]
},
{
"id": "OBS_TC015",
"source_change": {
"repo": "open-telemetry/opentelemetry-collector",
"file": "component/config.go",
"change_type": "interface_modification",
"description": "Add a new method ValidateWithContext(ctx context.Context) error to the Config interface, replacing the existing Validate() error method. Every component config across the OTel ecosystem must implement context-aware validation.",
"specific_change": "Replace `Validate() error` with `ValidateWithContext(ctx context.Context) error` on Config interface"
},
"expected_affected_files": [
{
"repo": "open-telemetry/opentelemetry-collector-contrib",
"files": [
"exporter/prometheusexporter/config.go",
"receiver/jaegerreceiver/config.go"
],
"reason": "Every contrib component config implements Validate() and must migrate to ValidateWithContext()"
},
{
"repo": "jaegertracing/jaeger",
"files": [
"cmd/jaeger/internal/extension/jaegerstorage/config.go",
"cmd/jaeger/internal/extension/jaegerquery/config.go"
],
"reason": "Both config files implement func (cfg *Config) Validate() error on component.Config types and must migrate to ValidateWithContext()"
},
{
"repo": "grafana/tempo",
"files": [
"modules/distributor/config.go",
"modules/generator/config.go"
],
"reason": "Tempo module configs implement func (cfg *Config) Validate() error and would need to migrate to ValidateWithContext()"
}
]
},
{
"id": "OBS_TC016",
"source_change": {
"repo": "open-telemetry/opentelemetry-collector",
"file": "component/identifiable.go",
"change_type": "type_change",
"description": "Change the component.ID type from a struct with Type and Name string fields to a new opaque type with only accessor methods. ID is used everywhere in the OTel Collector for identifying pipeline components. Any code that constructs ID literals or accesses fields directly will break.",
"specific_change": "Change `type ID struct { typeVal Type; nameVal string }` to opaque type with constructors only"
},
"expected_affected_files": [
{
"repo": "open-telemetry/opentelemetry-collector-contrib",
"files": [
"exporter/prometheusexporter/factory.go",
"receiver/jaegerreceiver/factory.go"
],
"reason": "Every contrib factory constructs component.ID for registration and must use new constructor functions"
},
{
"repo": "jaegertracing/jaeger",
"files": [
"cmd/jaeger/internal/extension/jaegerstorage/extension.go",
"cmd/jaeger/internal/extension/jaegerstorage/factory.go",
"cmd/jaeger/internal/exporters/storageexporter/factory.go",
"cmd/jaeger/internal/extension/jaegerquery/factory.go"
],
"reason": "These files construct component.ID via component.NewID(componentType) and component.MustNewType(). extension.go accesses component.ID fields (i.Type()) when iterating host.GetExtensions(). All would break if ID becomes opaque."
}
]
},
{
"id": "OBS_TC017",
"source_change": {
"repo": "open-telemetry/opentelemetry-collector",
"file": "consumer/consumererror/error.go",
"change_type": "type_change",
"description": "Change the consumererror type from wrapping a simple error to a structured ErrorData type that includes the failed data (metrics/traces/logs) for retry. Any code that type-asserts or unwraps consumer errors will break.",
"specific_change": "Change consumererror to struct with `FailedData interface{}` field instead of simple error wrapper"
},
"expected_affected_files": [
{
"repo": "open-telemetry/opentelemetry-collector-contrib",
"files": [
"exporter/prometheusremotewriteexporter/exporter.go",
"exporter/zipkinexporter/zipkin.go",
"receiver/zipkinreceiver/trace_receiver.go"
],
"reason": "prometheusremotewriteexporter/exporter.go imports consumererror and uses consumererror.NewPermanent(). zipkinexporter/zipkin.go uses consumererror.NewPermanent(). zipkinreceiver/trace_receiver.go uses consumererror.IsPermanent(). All would break if consumererror changes to structured ErrorData."
}
]
},
{
"id": "OBS_TC018",
"source_change": {
"repo": "open-telemetry/opentelemetry-collector",
"file": "component/host.go",
"change_type": "interface_modification",
"description": "Add a new method GetExtension(id ID) (Component, bool) to the Host interface. Host provides access to the collector's shared resources. Jaeger and contrib extensions use Host to look up other extensions (e.g., storage, auth). All Host implementations must add this method.",
"specific_change": "Add `GetExtension(id ID) (Component, bool)` method to Host interface"
},
"expected_affected_files": [
{
"repo": "open-telemetry/opentelemetry-collector-contrib",
"files": [
"receiver/jaegerreceiver/trace_receiver.go"
],
"reason": "Jaeger receiver accesses Host to look up authentication extensions during initialization"
},
{
"repo": "jaegertracing/jaeger",
"files": [
"cmd/jaeger/internal/extension/jaegerstorage/extension.go",
"cmd/jaeger/internal/extension/jaegerquery/extension.go",
"cmd/jaeger/internal/extension/remotesampling/extension.go"
],
"reason": "All three extension files call host.GetExtensions() to look up other extensions. jaegerstorage at lines 118/332, jaegerquery at line 27, remotesampling at lines 75/240/269. All would need to adapt to a new GetExtension(id) method."
}
]
},
{
"id": "OBS_TC019",
"source_change": {
"repo": "thanos-io/thanos",
"file": "pkg/store/bucket.go",
"change_type": "interface_modification",
"description": "Add a new method SyncWithCallback(ctx context.Context, cb func(meta *metadata.Meta)) error to the BucketStore. BucketStore is the primary object-storage-backed store used by Mimir and Loki for reading historical time-series blocks. Any wrapper or mock must implement this method.",
"specific_change": "Add `SyncWithCallback(ctx context.Context, cb func(meta *metadata.Meta)) error` to BucketStore"
},
"expected_affected_files": [
{
"repo": "grafana/mimir",
"files": [
"pkg/storegateway/bucket_stores.go",
"pkg/storegateway/bucket.go"
],
"reason": "bucket_stores.go is a multi-tenant wrapper of Thanos BucketStore. bucket.go defines the BucketStore struct forked from Thanos pkg/store/bucket.go. Both would need the new SyncWithCallback method."
}
]
},
{
"id": "OBS_TC020",
"source_change": {
"repo": "thanos-io/thanos",
"file": "pkg/compact/compact.go",
"change_type": "interface_modification",
"description": "Add a new method CompactWithDeletionMarkers(ctx context.Context, markers []DeletionMark) error to the Syncer in thanos/pkg/compact. Mimir's compactor embeds Thanos Syncer for multi-tenant block lifecycle management. This new method enables deletion-mark-aware compaction.",
"specific_change": "Add `CompactWithDeletionMarkers(ctx context.Context, markers []DeletionMark) error` to Syncer"
},
"expected_affected_files": [
{
"repo": "grafana/mimir",
"files": [
"pkg/compactor/compactor.go",
"pkg/compactor/bucket_compactor.go",
"pkg/compactor/syncer_metrics.go"
],
"reason": "compactor.go creates and uses metaSyncer. bucket_compactor.go defines the metaSyncer struct (Mimir's Thanos Syncer adaptation) with SyncMetas, Metas, and GarbageCollect methods. syncer_metrics.go defines aggregatedSyncerMetrics for tracking Syncer operations."
}
]
},
{
"id": "OBS_TC021",
"source_change": {
"repo": "thanos-io/thanos",
"file": "pkg/query/querier.go",
"change_type": "method_signature_change",
"description": "Change the QueryableCreator function signature to accept an additional deduplication parameter: QueryableCreator(deduplicate bool, replicaLabels []string, storeMatchers [][]*labels.Matcher, maxResolution int64, partialResponse bool, skipChunks bool) storage.Queryable. This affects Grafana and Mimir which wrap Thanos query for federated queries.",
"specific_change": "Add `skipChunks bool` parameter to QueryableCreator function signature"
},
"expected_affected_files": [
{
"repo": "thanos-io/thanos",
"files": [
"pkg/api/query/v1.go",
"pkg/api/query/grpc.go",
"cmd/thanos/query.go"
],
"reason": "QueryableCreator is thanos-internal only. These files use QueryableCreator type and call NewQueryableCreator. No downstream repos (grafana, mimir) import this type."
}
]
},
{
"id": "OBS_TC022",
"source_change": {
"repo": "thanos-io/thanos",
"file": "pkg/compact/planner.go",
"change_type": "interface_modification",
"description": "Add a new method PlanWithFilter(ctx context.Context, metasByMinTime []*metadata.Meta, filter func(*metadata.Meta) bool) ([]*metadata.Meta, error) to the Planner interface. Planner is used by Mimir for deciding which TSDB blocks to compact together.",
"specific_change": "Add `PlanWithFilter` method to Planner interface"
},
"expected_affected_files": [
{
"repo": "grafana/mimir",
"files": [
"pkg/compactor/compactor.go",
"pkg/compactor/split_merge_compactor.go",
"pkg/compactor/bucket_compactor.go",
"pkg/compactor/split_merge_planner.go"
],
"reason": "Mimir forked the Thanos Planner interface in bucket_compactor.go and implements it in split_merge_planner.go. compactor.go and split_merge_compactor.go use the Planner interface. Note: this is a forked copy, not a Go module import from thanos."
}
]
},
{
"id": "OBS_TC023",
"source_change": {
"repo": "grafana/grafana",
"file": "pkg/apis/datasource/v0alpha1/types.go",
"change_type": "struct_field_change",
"description": "Add a new required field AuthConfig AuthenticationConfig to the DataSourceConnection struct in Grafana's datasource API types. DataSourceConnection defines how Grafana connects to backends like Prometheus, Loki, Mimir, and Tempo. All datasource plugins constructing this struct will break.",
"specific_change": "Add `AuthConfig AuthenticationConfig` field to DataSourceConnection struct"
},
"expected_affected_files": [
{
"repo": "grafana/grafana",
"files": [
"pkg/registry/apis/query/connections.go",
"pkg/registry/apis/query/register.go",
"pkg/apis/query/v0alpha1/zz_generated.deepcopy.go"
],
"reason": "DataSourceConnection is grafana-internal only. These files within Grafana construct or use DataSourceConnection. No downstream repos (loki, tempo, mimir) reference this type."
}
]
},
{
"id": "OBS_TC024",
"source_change": {
"repo": "grafana/grafana",
"file": "pkg/registry/apps/alerting/rules/alertrule/storage.go",
"change_type": "interface_modification",
"description": "Add a new method ListByDatasource(ctx context.Context, dsUID string) ([]AlertRule, error) to the AlertRule storage interface. This interface is used by Mimir and Loki rulers for federated alert rule management through Grafana.",
"specific_change": "Add `ListByDatasource(ctx context.Context, dsUID string) ([]AlertRule, error)` to alert rule storage"
},
"expected_affected_files": [
{
"repo": "grafana/grafana",
"files": [
"pkg/services/ngalert/store/alert_rule.go",
"pkg/services/ngalert/store/database.go",
"pkg/services/ngalert/api/api_ruler.go",
"pkg/services/ngalert/provisioning/alert_rules.go"
],
"reason": "AlertRule storage is grafana-internal only. These Grafana files implement and use the AlertRule storage interface. No downstream repos (mimir, loki) reference Grafana's alert rule storage."
}
]
},
{
"id": "OBS_TC025",
"source_change": {
"repo": "grafana/grafana",
"file": "pkg/tsdb/loki/standalone/datasource.go",
"change_type": "method_signature_change",
"description": "Change the QueryData method signature in the Loki standalone datasource to accept a new streaming parameter: QueryData(ctx context.Context, req *backend.QueryDataRequest, stream bool) (*backend.QueryDataResponse, error). This affects Loki's query API compatibility.",
"specific_change": "Add `stream bool` parameter to QueryData method"
},
"expected_affected_files": [
{
"repo": "grafana/grafana",
"files": [
"pkg/tsdb/loki/standalone/datasource.go"
],
"reason": "This is the source file itself. Loki does not implement or depend on Grafana's QueryData method. The standalone datasource is a grafana-internal plugin with no cross-repo impact."
}
]
},
{
"id": "OBS_TC026",
"source_change": {
"repo": "grafana/grafana",
"file": "pkg/infra/httpclient/httpclientprovider/prometheus_metrics_middleware.go",
"change_type": "interface_modification",
"description": "Change the metrics middleware to use a new MetricsCollector interface instead of directly using prometheus.Registerer. Any component that registers HTTP client metrics through this middleware must implement MetricsCollector.",
"specific_change": "Replace `prometheus.Registerer` parameter with `MetricsCollector` interface in middleware constructor"
},
"expected_affected_files": [
{
"repo": "grafana/grafana",
"files": [
"pkg/infra/httpclient/httpclientprovider/prometheus_metrics_middleware.go",
"pkg/infra/httpclient/httpclientprovider/http_client_provider.go"
],
"reason": "This is a grafana-internal HTTP client middleware. No downstream repos (prometheus, thanos, mimir, loki) import from grafana's httpclient package."
}
]
},
{
"id": "OBS_TC027",
"source_change": {
"repo": "jaegertracing/jaeger",
"file": "cmd/jaeger/internal/extension/jaegerstorage/extension.go",
"change_type": "interface_modification",
"description": "Add a new method GetArchiveStorage(ctx context.Context) (tracestorage.Reader, tracestorage.Writer, error) to the StorageExtension interface. This interface is used by OTel Collector contrib's Jaeger components and Tempo for Jaeger-compatible trace storage backends.",
"specific_change": "Add `GetArchiveStorage(ctx context.Context) (tracestorage.Reader, tracestorage.Writer, error)` to StorageExtension"
},
"expected_affected_files": [
{
"repo": "jaegertracing/jaeger",
"files": [
"cmd/jaeger/internal/exporters/storageexporter/exporter.go",
"cmd/jaeger/internal/extension/jaegerquery/server.go",
"cmd/jaeger/internal/extension/remotestorage/server.go",
"cmd/jaeger/internal/extension/remotesampling/extension.go"
],
"reason": "StorageExtension is jaeger-internal. These Jaeger components use jaegerstorage.GetTraceStoreFactory or depend on the Extension interface. No external repos import this interface."
}
]
},
{
"id": "OBS_TC028",
"source_change": {
"repo": "jaegertracing/jaeger",
"file": "cmd/jaeger/internal/exporters/storageexporter/exporter.go",
"change_type": "struct_field_change",
"description": "Add a new required field BatchConfig BatchSettings to the storageExporter struct. This exporter is the bridge between OTel Collector pipeline and Jaeger storage backends. OTel contrib components that wrap or test this exporter will break.",
"specific_change": "Add `BatchConfig BatchSettings` field to storageExporter struct"
},
"expected_affected_files": [
{
"repo": "jaegertracing/jaeger",
"files": [
"cmd/jaeger/internal/exporters/storageexporter/exporter.go",
"cmd/jaeger/internal/exporters/storageexporter/factory.go"
],
"reason": "storageExporter is a private struct within the storageexporter package. Only files within this package construct or reference it. No external repos can access this private type."
}
]
},
{
"id": "OBS_TC029",
"source_change": {
"repo": "open-telemetry/opentelemetry-collector-contrib",
"file": "exporter/prometheusexporter/accumulator.go",
"change_type": "interface_modification",
"description": "Change the metric accumulator to use a new AccumulatedMetric type instead of raw pmetric.Metric. The accumulator bridges OTel metrics to Prometheus exposition format and is used indirectly by Jaeger (for span metrics) and Grafana (for OTLP ingestion). Any code that reads accumulated metrics will break.",
"specific_change": "Change return type of `Accumulate(metrics pmetric.Metrics)` from `int` to `[]AccumulatedMetric`"
},
"expected_affected_files": [
{
"repo": "open-telemetry/opentelemetry-collector-contrib",
"files": [
"exporter/prometheusexporter/collector.go",
"exporter/prometheusexporter/accumulator.go"
],
"reason": "collector.go calls accumulator.Accumulate() directly. accumulator.go defines the interface and implementation. The accumulator interface is private (unexported), so no external repos can implement it."
}
]
},
{
"id": "OBS_TC030",
"source_change": {
"repo": "open-telemetry/opentelemetry-collector-contrib",
"file": "receiver/jaegerreceiver/trace_receiver.go",
"change_type": "struct_field_change",
"description": "Add a new required field SamplingConfig SamplingStrategy to the jReceiver struct. The Jaeger receiver is used by both Jaeger v2 (as its primary ingest path) and Tempo (for Jaeger protocol compatibility). Any code constructing or wrapping jReceiver will break.",
"specific_change": "Add `SamplingConfig SamplingStrategy` field to jReceiver struct"
},
"expected_affected_files": [
{
"repo": "open-telemetry/opentelemetry-collector-contrib",
"files": [
"receiver/jaegerreceiver/trace_receiver.go"
],
"reason": "jReceiver is a private struct defined and constructed in trace_receiver.go. Since it is unexported, no external repo can directly construct it."
},
{
"repo": "jaegertracing/jaeger",
"files": [
"cmd/jaeger/internal/components.go"
],
"reason": "Jaeger uses jaegerreceiver.NewFactory() to create the receiver. While it cannot directly construct jReceiver (private), a new required SamplingConfig field could affect the factory's behavior."
},
{
"repo": "grafana/tempo",
"files": [
"modules/distributor/receiver/shim.go"
],
"reason": "Tempo imports jaegerreceiver and uses NewFactory() and casts to *jaegerreceiver.Config. Since Tempo vendors the package, the vendored copy would need updating."
}
]
}
]