Skip to content

Commit efd25cb

Browse files
committed
experimental/wip: different exports per namespace
[skip ci]
1 parent 3f65eb6 commit efd25cb

File tree

7 files changed

+134
-119
lines changed

7 files changed

+134
-119
lines changed

internal/collectors/collector_manager.go

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import (
77
"context"
88
"fmt"
99
"reflect"
10-
"slices"
11-
"strings"
1210
"sync/atomic"
1311

1412
"github.com/go-logr/logr"
@@ -128,33 +126,14 @@ func (m *CollectorManager) ReconcileOpenTelemetryCollector(
128126
if err != nil {
129127
return false, err
130128
}
131-
var export *dash0common.Export
129+
hasAtLeastOneExport := false
132130
if operatorConfigurationResource != nil && operatorConfigurationResource.Spec.Export != nil {
133-
export = operatorConfigurationResource.Spec.Export
131+
hasAtLeastOneExport = true
134132
}
135-
if export == nil && triggeringMonitoringResource != nil &&
136-
triggeringMonitoringResource.IsAvailable() &&
137-
triggeringMonitoringResource.Spec.Export != nil {
138-
export = triggeringMonitoringResource.Spec.Export
139-
}
140-
if export == nil {
141-
// Using the export setting of an arbitrary monitoring resource is a bandaid as long as we do not allow
142-
// exporting, telemetry to different backends per namespace.
143-
// Additional note: When using the export from an arbitrary monitoring resource, we need to be aware that the
144-
// result of we findAllMonitoringResources is not guaranteed to be sorted in the same way for each invocation.
145-
// Thus, we need to sort the monitoring resources before we arbitrarily pick the first resource, otherwise we
146-
// could get configmap flapping (i.e. the collector configmaps get re-rendered again and again because we
147-
// accidentally pick a different monitoring resource each time).
148-
slices.SortFunc(
149-
allMonitoringResources,
150-
func(mr1 dash0v1beta1.Dash0Monitoring, mr2 dash0v1beta1.Dash0Monitoring) int {
151-
return strings.Compare(mr1.Namespace, mr2.Namespace)
152-
},
153-
)
133+
if hasAtLeastOneExport == false {
154134
for _, monitoringResource := range allMonitoringResources {
155135
if monitoringResource.Spec.Export != nil {
156-
export = monitoringResource.Spec.Export
157-
break
136+
hasAtLeastOneExport = true
158137
}
159138
}
160139
}
@@ -172,13 +151,12 @@ func (m *CollectorManager) ReconcileOpenTelemetryCollector(
172151
)
173152
err = m.removeOpenTelemetryCollector(ctx, *extraConfig, &logger)
174153
return err == nil, err
175-
} else if export != nil {
154+
} else if hasAtLeastOneExport {
176155
err = m.createOrUpdateOpenTelemetryCollector(
177156
ctx,
178157
operatorConfigurationResource,
179158
allMonitoringResources,
180159
*extraConfig,
181-
export,
182160
&logger,
183161
)
184162
return err == nil, err
@@ -202,7 +180,6 @@ func (m *CollectorManager) createOrUpdateOpenTelemetryCollector(
202180
operatorConfigurationResource *dash0v1alpha1.Dash0OperatorConfiguration,
203181
allMonitoringResources []dash0v1beta1.Dash0Monitoring,
204182
extraConfig util.ExtraConfig,
205-
export *dash0common.Export,
206183
logger *logr.Logger,
207184
) error {
208185
resourcesHaveBeenCreated, resourcesHaveBeenUpdated, err :=
@@ -211,7 +188,6 @@ func (m *CollectorManager) createOrUpdateOpenTelemetryCollector(
211188
extraConfig,
212189
operatorConfigurationResource,
213190
allMonitoringResources,
214-
export,
215191
logger,
216192
)
217193
if err != nil {

internal/collectors/otelcolresources/collector_config_maps.go

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ func assembleCollectorConfigMap(
177177
if forDeletion {
178178
configMapData = map[string]string{}
179179
} else {
180-
exporterMap, err := ConvertExportSettingsToExporterMap(config.Export)
180+
exporterMap, err := ConvertExportSettingsToExporterMap(config.DefaultExport, config.PerNamespaceExports)
181181
if err != nil {
182182
return nil, fmt.Errorf("%s %w", commonExportErrorPrefix, err)
183183
}
@@ -416,14 +416,36 @@ func compareErrorMode(
416416
return errorMode1
417417
}
418418

419-
func ConvertExportSettingsToExporterMap(export dash0common.Export) (map[string][]OtlpExporter, error) {
419+
// TODO
420+
// - actually use the exporter settings from the Dash0Monitoring resources
421+
// - also create different exporters for other export types, e.g. gRPC, HTTP
422+
// - ...?
423+
424+
func ConvertExportSettingsToExporterMap(
425+
defaultExport dash0common.Export,
426+
perNamespaceExports map[string]dash0common.Export,
427+
) (map[string][]OtlpExporter, error) {
420428
exporterMap := make(map[string][]OtlpExporter)
421-
exporterMap["default"] = []OtlpExporter{}
429+
var err error
430+
exporterMap["_default"], err = convertExportSettingsToExporterList(defaultExport)
431+
if err != nil {
432+
return nil, err
433+
}
434+
for namespace, export := range perNamespaceExports {
435+
exporterMap[namespace], err = convertExportSettingsToExporterList(export)
436+
if err != nil {
437+
return nil, err
438+
}
439+
}
440+
return exporterMap, nil
441+
}
422442

443+
func convertExportSettingsToExporterList(export dash0common.Export) ([]OtlpExporter, error) {
423444
if export.Dash0 == nil && export.Grpc == nil && export.Http == nil {
424445
return nil, fmt.Errorf("%s no exporter configuration found", commonExportErrorPrefix)
425446
}
426447

448+
var exporters []OtlpExporter
427449
if export.Dash0 != nil {
428450
d0 := export.Dash0
429451
if d0.Endpoint == "" {
@@ -439,26 +461,26 @@ func ConvertExportSettingsToExporterMap(export dash0common.Export) (map[string][
439461
Value: d0.Dataset,
440462
})
441463
}
442-
dash0ExporterDefault := OtlpExporter{
464+
dash0Exporter := OtlpExporter{
443465
Name: "otlp/dash0/_default",
444466
Endpoint: export.Dash0.Endpoint,
445467
Headers: headers,
446468
}
447-
setGrpcTls(export.Dash0.Endpoint, &dash0ExporterDefault)
448-
exporterMap["default"] = append(exporterMap["default"], dash0ExporterDefault)
449-
450-
headersRouted := headers
451-
headersRouted = append(headersRouted, dash0common.Header{
452-
Name: util.Dash0DatasetHeaderName,
453-
Value: "routed",
454-
})
455-
dash0ExporterForRoutedNamespace := OtlpExporter{
456-
Name: "otlp/dash0/routed-namespace",
457-
Endpoint: export.Dash0.Endpoint,
458-
Headers: headersRouted,
459-
}
460-
setGrpcTls(export.Dash0.Endpoint, &dash0ExporterForRoutedNamespace)
461-
exporterMap["routed"] = []OtlpExporter{dash0ExporterForRoutedNamespace}
469+
setGrpcTls(export.Dash0.Endpoint, &dash0Exporter)
470+
exporters = append(exporters, dash0Exporter)
471+
472+
//headersRouted := headers
473+
//headersRouted = append(headersRouted, dash0common.Header{
474+
// Name: util.Dash0DatasetHeaderName,
475+
// Value: "routed",
476+
//})
477+
//dash0ExporterForRoutedNamespace := OtlpExporter{
478+
// Name: "otlp/dash0/routed-namespace",
479+
// Endpoint: export.Dash0.Endpoint,
480+
// Headers: headersRouted,
481+
//}
482+
//setGrpcTls(export.Dash0.Endpoint, &dash0ExporterForRoutedNamespace)
483+
//exporterMap["routed"] = []OtlpExporter{dash0ExporterForRoutedNamespace}
462484
}
463485

464486
if export.Grpc != nil {
@@ -475,7 +497,7 @@ func ConvertExportSettingsToExporterMap(export dash0common.Export) (map[string][
475497
if len(grpc.Headers) > 0 {
476498
grpcExporter.Headers = grpc.Headers
477499
}
478-
exporterMap["default"] = append(exporterMap["default"], grpcExporter)
500+
exporters = append(exporters, grpcExporter)
479501
}
480502

481503
if export.Http != nil {
@@ -495,10 +517,10 @@ func ConvertExportSettingsToExporterMap(export dash0common.Export) (map[string][
495517
if len(http.Headers) > 0 {
496518
httpExporter.Headers = http.Headers
497519
}
498-
exporterMap["default"] = append(exporterMap["default"], httpExporter)
520+
exporters = append(exporters, httpExporter)
499521
}
500522

501-
return exporterMap, nil
523+
return exporters, nil
502524
}
503525

504526
func renderCollectorConfiguration(

0 commit comments

Comments
 (0)