Skip to content

Commit 5404a9b

Browse files
author
Israel Blancas
authored
Merge branch 'main' into 3370
2 parents 9770b1f + bc45d63 commit 5404a9b

22 files changed

+435
-30
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
2+
change_type: enhancement
3+
4+
# The name of the component, or a single word describing the area of concern, (e.g. collector, target allocator, auto-instrumentation, opamp, github action)
5+
component: auto-instrumentation
6+
7+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
8+
note: Support `http/json` and `http/protobuf` via OTEL_EXPORTER_OTLP_PROTOCOL environment variable in addition to default `grpc` for exporting traces
9+
10+
# One or more tracking issues related to the change
11+
issues: [3412]
12+
13+
# (Optional) One or more lines of additional information to render under the primary note.
14+
# These lines will be padded with 2 spaces and then inserted directly into the document.
15+
# Use pipe (|) for multiline entries.
16+
subtext:

.github/workflows/changelog.yaml

-13
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,3 @@ jobs:
6565
run: |
6666
make chlog-validate \
6767
|| { echo "New ./.chloggen/*.yaml file failed validation."; exit 1; }
68-
69-
# In order to validate any links in the yaml file, render the config to markdown
70-
- name: Render .chloggen changelog entries
71-
run: make chlog-preview > changelog_preview.md
72-
- name: Install markdown-link-check
73-
run: npm install -g markdown-link-check
74-
- name: Run markdown-link-check
75-
run: |
76-
markdown-link-check \
77-
--verbose \
78-
--config .github/workflows/check_links_config.json \
79-
changelog_preview.md \
80-
|| { echo "Check that anchor links are lowercase"; exit 1; }

.github/workflows/e2e.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ jobs:
3131
- e2e-pdb
3232
- e2e-prometheuscr
3333
- e2e-targetallocator
34+
- e2e-targetallocator-cr
3435
- e2e-upgrade
3536
- e2e-multi-instrumentation
3637
- e2e-metadata-filters
@@ -51,6 +52,8 @@ jobs:
5152
kube-version: "1.29"
5253
- group: e2e-targetallocator
5354
setup: "enable-targetallocator-cr prepare-e2e"
55+
- group: e2e-targetallocator-cr
56+
setup: "enable-targetallocator-cr prepare-e2e"
5457
steps:
5558
- name: Check out code into the Go module directory
5659
uses: actions/checkout@v4

.linkspector.yml

Whitespace-only changes.

Makefile

+5
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,11 @@ e2e-prometheuscr: chainsaw
327327
e2e-targetallocator: chainsaw
328328
$(CHAINSAW) test --test-dir ./tests/e2e-targetallocator
329329

330+
# Target allocator CR end-to-tests
331+
.PHONY: e2e-targetallocator-cr
332+
e2e-targetallocator-cr: chainsaw
333+
$(CHAINSAW) test --test-dir ./tests/e2e-targetallocator-cr
334+
330335
.PHONY: add-certmanager-permissions
331336
add-certmanager-permissions:
332337
# Kustomize only allows patches in the folder where the kustomization is located

apis/v1beta1/collector_webhook.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ func (c CollectorWebhook) ValidateCreate(ctx context.Context, obj runtime.Object
122122
c.metrics.create(ctx, otelcol)
123123
}
124124
if c.bv != nil {
125-
newWarnings := c.bv(*otelcol)
125+
newWarnings := c.bv(ctx, *otelcol)
126126
warnings = append(warnings, newWarnings...)
127127
}
128128
return warnings, nil
@@ -152,7 +152,7 @@ func (c CollectorWebhook) ValidateUpdate(ctx context.Context, oldObj, newObj run
152152
}
153153

154154
if c.bv != nil {
155-
newWarnings := c.bv(*otelcol)
155+
newWarnings := c.bv(ctx, *otelcol)
156156
warnings = append(warnings, newWarnings...)
157157
}
158158
return warnings, nil
@@ -435,7 +435,7 @@ func checkAutoscalerSpec(autoscaler *AutoscalerSpec) error {
435435

436436
// BuildValidator enables running the manifest generators for the collector reconciler
437437
// +kubebuilder:object:generate=false
438-
type BuildValidator func(c OpenTelemetryCollector) admission.Warnings
438+
type BuildValidator func(ctx context.Context, c OpenTelemetryCollector) admission.Warnings
439439

440440
func NewCollectorWebhook(
441441
logger logr.Logger,

apis/v1beta1/collector_webhook_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func TestValidate(t *testing.T) {
8383
},
8484
}
8585

86-
bv := func(collector v1beta1.OpenTelemetryCollector) admission.Warnings {
86+
bv := func(_ context.Context, collector v1beta1.OpenTelemetryCollector) admission.Warnings {
8787
var warnings admission.Warnings
8888
cfg := config.New(
8989
config.WithCollectorImage("default-collector"),
@@ -518,7 +518,7 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
518518
},
519519
}
520520

521-
bv := func(collector v1beta1.OpenTelemetryCollector) admission.Warnings {
521+
bv := func(_ context.Context, collector v1beta1.OpenTelemetryCollector) admission.Warnings {
522522
var warnings admission.Warnings
523523
cfg := config.New(
524524
config.WithCollectorImage("default-collector"),
@@ -1365,7 +1365,7 @@ func TestOTELColValidatingWebhook(t *testing.T) {
13651365
},
13661366
}
13671367

1368-
bv := func(collector v1beta1.OpenTelemetryCollector) admission.Warnings {
1368+
bv := func(_ context.Context, collector v1beta1.OpenTelemetryCollector) admission.Warnings {
13691369
var warnings admission.Warnings
13701370
cfg := config.New(
13711371
config.WithCollectorImage("default-collector"),
@@ -1433,7 +1433,7 @@ func TestOTELColValidateUpdateWebhook(t *testing.T) {
14331433
},
14341434
}
14351435

1436-
bv := func(collector v1beta1.OpenTelemetryCollector) admission.Warnings {
1436+
bv := func(_ context.Context, collector v1beta1.OpenTelemetryCollector) admission.Warnings {
14371437
var warnings admission.Warnings
14381438
cfg := config.New(
14391439
config.WithCollectorImage("default-collector"),

autoinstrumentation/nodejs/src/autoinstrumentation.ts

+20-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
2-
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';
2+
import { OTLPTraceExporter as OTLPProtoTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';
3+
import { OTLPTraceExporter as OTLPHttpTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
4+
import { OTLPTraceExporter as OTLPGrpcTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';
35
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc';
46
import { PrometheusExporter } from '@opentelemetry/exporter-prometheus';
57
import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
@@ -12,6 +14,22 @@ import { diag } from '@opentelemetry/api';
1214

1315
import { NodeSDK } from '@opentelemetry/sdk-node';
1416

17+
function getTraceExporter() {
18+
let protocol = process.env.OTEL_EXPORTER_OTLP_PROTOCOL;
19+
switch (protocol) {
20+
case undefined:
21+
case '':
22+
case 'grpc':
23+
return new OTLPGrpcTraceExporter();
24+
case 'http/json':
25+
return new OTLPHttpTraceExporter();
26+
case 'http/protobuf':
27+
return new OTLPProtoTraceExporter();
28+
default:
29+
throw Error(`Creating traces exporter based on "${protocol}" protocol (configured via environment variable OTEL_EXPORTER_OTLP_PROTOCOL) is not implemented!`);
30+
}
31+
}
32+
1533
function getMetricReader() {
1634
switch (process.env.OTEL_METRICS_EXPORTER) {
1735
case undefined:
@@ -35,7 +53,7 @@ function getMetricReader() {
3553
const sdk = new NodeSDK({
3654
autoDetectResources: true,
3755
instrumentations: [getNodeAutoInstrumentations()],
38-
traceExporter: new OTLPTraceExporter(),
56+
traceExporter: getTraceExporter(),
3957
metricReader: getMetricReader(),
4058
resourceDetectors:
4159
[

controllers/opentelemetrycollector_controller.go

+18-3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838
"sigs.k8s.io/controller-runtime/pkg/client"
3939
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
4040

41+
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
4142
"github.com/open-telemetry/opentelemetry-operator/apis/v1beta1"
4243
"github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift"
4344
"github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus"
@@ -47,6 +48,7 @@ import (
4748
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector"
4849
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils"
4950
collectorStatus "github.com/open-telemetry/opentelemetry-operator/internal/status/collector"
51+
"github.com/open-telemetry/opentelemetry-operator/pkg/constants"
5052
"github.com/open-telemetry/opentelemetry-operator/pkg/featuregate"
5153
)
5254

@@ -168,7 +170,7 @@ func (r *OpenTelemetryCollectorReconciler) getConfigMapsToRemove(configVersionsT
168170
return ownedConfigMaps
169171
}
170172

171-
func (r *OpenTelemetryCollectorReconciler) GetParams(instance v1beta1.OpenTelemetryCollector) (manifests.Params, error) {
173+
func (r *OpenTelemetryCollectorReconciler) GetParams(ctx context.Context, instance v1beta1.OpenTelemetryCollector) (manifests.Params, error) {
172174
p := manifests.Params{
173175
Config: r.config,
174176
Client: r.Client,
@@ -179,14 +181,27 @@ func (r *OpenTelemetryCollectorReconciler) GetParams(instance v1beta1.OpenTeleme
179181
}
180182

181183
// generate the target allocator CR from the collector CR
182-
targetAllocator, err := collector.TargetAllocator(p)
184+
targetAllocator, err := r.getTargetAllocator(ctx, p)
183185
if err != nil {
184186
return p, err
185187
}
186188
p.TargetAllocator = targetAllocator
187189
return p, nil
188190
}
189191

192+
func (r *OpenTelemetryCollectorReconciler) getTargetAllocator(ctx context.Context, params manifests.Params) (*v1alpha1.TargetAllocator, error) {
193+
if taName, ok := params.OtelCol.GetLabels()[constants.LabelTargetAllocator]; ok {
194+
targetAllocator := &v1alpha1.TargetAllocator{}
195+
taKey := client.ObjectKey{Name: taName, Namespace: params.OtelCol.GetNamespace()}
196+
err := r.Client.Get(ctx, taKey, targetAllocator)
197+
if err != nil {
198+
return nil, err
199+
}
200+
return targetAllocator, nil
201+
}
202+
return collector.TargetAllocator(params)
203+
}
204+
190205
// NewReconciler creates a new reconciler for OpenTelemetryCollector objects.
191206
func NewReconciler(p Params) *OpenTelemetryCollectorReconciler {
192207
r := &OpenTelemetryCollectorReconciler{
@@ -230,7 +245,7 @@ func (r *OpenTelemetryCollectorReconciler) Reconcile(ctx context.Context, req ct
230245
return ctrl.Result{}, client.IgnoreNotFound(err)
231246
}
232247

233-
params, err := r.GetParams(instance)
248+
params, err := r.GetParams(ctx, instance)
234249
if err != nil {
235250
log.Error(err, "Failed to create manifest.Params")
236251
return ctrl.Result{}, err

controllers/suite_test.go

-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ import (
6464
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector/testdata"
6565
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils"
6666
"github.com/open-telemetry/opentelemetry-operator/internal/rbac"
67-
// +kubebuilder:scaffold:imports
6867
)
6968

7069
var (

controllers/targetallocator_controller.go

+52-1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import (
4242
"github.com/open-telemetry/opentelemetry-operator/internal/config"
4343
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/targetallocator"
4444
taStatus "github.com/open-telemetry/opentelemetry-operator/internal/status/targetallocator"
45+
"github.com/open-telemetry/opentelemetry-operator/pkg/constants"
4546
"github.com/open-telemetry/opentelemetry-operator/pkg/featuregate"
4647
)
4748

@@ -98,7 +99,24 @@ func (r *TargetAllocatorReconciler) getCollector(ctx context.Context, instance v
9899
return &collector, nil
99100
}
100101

101-
return nil, nil
102+
var collectors v1beta1.OpenTelemetryCollectorList
103+
listOpts := []client.ListOption{
104+
client.InNamespace(instance.GetNamespace()),
105+
client.MatchingLabels{
106+
constants.LabelTargetAllocator: instance.GetName(),
107+
},
108+
}
109+
err := r.List(ctx, &collectors, listOpts...)
110+
if err != nil {
111+
return nil, err
112+
}
113+
if len(collectors.Items) == 0 {
114+
return nil, nil
115+
} else if len(collectors.Items) > 1 {
116+
return nil, fmt.Errorf("found multiple OpenTelemetry collectors annotated with the same Target Allocator: %s/%s", instance.GetNamespace(), instance.GetName())
117+
}
118+
119+
return &collectors.Items[0], nil
102120
}
103121

104122
// NewTargetAllocatorReconciler creates a new reconciler for TargetAllocator objects.
@@ -195,6 +213,25 @@ func (r *TargetAllocatorReconciler) SetupWithManager(mgr ctrl.Manager) error {
195213
),
196214
)
197215

216+
// watch collectors which have the target allocator label
217+
collectorSelector := metav1.LabelSelector{
218+
MatchExpressions: []metav1.LabelSelectorRequirement{
219+
{
220+
Key: constants.LabelTargetAllocator,
221+
Operator: metav1.LabelSelectorOpExists,
222+
},
223+
},
224+
}
225+
selectorPredicate, err := predicate.LabelSelectorPredicate(collectorSelector)
226+
if err != nil {
227+
return err
228+
}
229+
ctrlBuilder.Watches(
230+
&v1beta1.OpenTelemetryCollector{},
231+
handler.EnqueueRequestsFromMapFunc(getTargetAllocatorRequestsFromLabel),
232+
builder.WithPredicates(selectorPredicate),
233+
)
234+
198235
return ctrlBuilder.Complete(r)
199236
}
200237

@@ -208,3 +245,17 @@ func getTargetAllocatorForCollector(_ context.Context, collector client.Object)
208245
},
209246
}
210247
}
248+
249+
func getTargetAllocatorRequestsFromLabel(_ context.Context, collector client.Object) []reconcile.Request {
250+
if taName, ok := collector.GetLabels()[constants.LabelTargetAllocator]; ok {
251+
return []reconcile.Request{
252+
{
253+
NamespacedName: types.NamespacedName{
254+
Name: taName,
255+
Namespace: collector.GetNamespace(),
256+
},
257+
},
258+
}
259+
}
260+
return []reconcile.Request{}
261+
}

controllers/targetallocator_reconciler_test.go

+55-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
3737
"github.com/open-telemetry/opentelemetry-operator/apis/v1beta1"
3838
"github.com/open-telemetry/opentelemetry-operator/internal/config"
39+
"github.com/open-telemetry/opentelemetry-operator/pkg/constants"
3940
)
4041

4142
var testLogger = logf.Log.WithName("opamp-bridge-controller-unit-tests")
@@ -55,7 +56,10 @@ func init() {
5556
func TestTargetAllocatorReconciler_GetCollector(t *testing.T) {
5657
testCollector := &v1beta1.OpenTelemetryCollector{
5758
ObjectMeta: metav1.ObjectMeta{
58-
Name: "my-instance-collector",
59+
Name: "test",
60+
Labels: map[string]string{
61+
constants.LabelTargetAllocator: "label-ta",
62+
},
5963
},
6064
}
6165
fakeClient := fake.NewFakeClient(testCollector)
@@ -105,6 +109,36 @@ func TestTargetAllocatorReconciler_GetCollector(t *testing.T) {
105109
assert.Nil(t, collector)
106110
assert.Errorf(t, err, "error getting owner for TargetAllocator default/test: opentelemetrycollectors.opentelemetry.io \"non_existent\" not found")
107111
})
112+
t.Run("collector attached by label", func(t *testing.T) {
113+
ta := v1alpha1.TargetAllocator{
114+
ObjectMeta: metav1.ObjectMeta{
115+
Name: "label-ta",
116+
},
117+
}
118+
collector, err := reconciler.getCollector(context.Background(), ta)
119+
require.NoError(t, err)
120+
assert.Equal(t, testCollector, collector)
121+
})
122+
t.Run("multiple collectors attached by label", func(t *testing.T) {
123+
testCollector2 := testCollector.DeepCopy()
124+
testCollector2.SetName("test2")
125+
fakeClient := fake.NewFakeClient(testCollector, testCollector2)
126+
reconciler := NewTargetAllocatorReconciler(
127+
fakeClient,
128+
testScheme,
129+
record.NewFakeRecorder(10),
130+
config.New(),
131+
testLogger,
132+
)
133+
ta := v1alpha1.TargetAllocator{
134+
ObjectMeta: metav1.ObjectMeta{
135+
Name: "label-ta",
136+
},
137+
}
138+
collector, err := reconciler.getCollector(context.Background(), ta)
139+
assert.Nil(t, collector)
140+
assert.Errorf(t, err, "found multiple OpenTelemetry collectors annotated with the same Target Allocator: %s/%s", ta.Namespace, ta.Name)
141+
})
108142
}
109143

110144
func TestGetTargetAllocatorForCollector(t *testing.T) {
@@ -123,3 +157,23 @@ func TestGetTargetAllocatorForCollector(t *testing.T) {
123157
}}
124158
assert.Equal(t, expected, requests)
125159
}
160+
161+
func TestGetTargetAllocatorRequestsFromLabel(t *testing.T) {
162+
testCollector := &v1beta1.OpenTelemetryCollector{
163+
ObjectMeta: metav1.ObjectMeta{
164+
Name: "test",
165+
Namespace: "default",
166+
Labels: map[string]string{
167+
constants.LabelTargetAllocator: "label-ta",
168+
},
169+
},
170+
}
171+
requests := getTargetAllocatorRequestsFromLabel(context.Background(), testCollector)
172+
expected := []reconcile.Request{{
173+
NamespacedName: types.NamespacedName{
174+
Name: "label-ta",
175+
Namespace: "default",
176+
},
177+
}}
178+
assert.Equal(t, expected, requests)
179+
}

0 commit comments

Comments
 (0)