Skip to content

Commit 6e98e14

Browse files
committed
experimental/wip: different exports per namespace
[skip ci]
1 parent 1568ca8 commit 6e98e14

10 files changed

+224
-127
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: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ func assembleCollectorConfigMap(
180180
if forDeletion {
181181
configMapData = map[string]string{}
182182
} else {
183-
exporterMap, err := ConvertExportSettingsToExporterMap(config.Export)
183+
exporterMap, err := ConvertExportSettingsToExporterMap(config.DefaultExport, config.PerNamespaceExports)
184184
if err != nil {
185185
return nil, fmt.Errorf("%s %w", commonExportErrorPrefix, err)
186186
}
@@ -425,14 +425,36 @@ func compareErrorMode(
425425
return errorMode1
426426
}
427427

428-
func ConvertExportSettingsToExporterMap(export dash0common.Export) (map[string][]OtlpExporter, error) {
428+
// TODO
429+
// - actually use the exporter settings from the Dash0Monitoring resources
430+
// - also create different exporters for other export types, e.g. gRPC, HTTP
431+
// - ...?
432+
433+
func ConvertExportSettingsToExporterMap(
434+
defaultExport dash0common.Export,
435+
perNamespaceExports map[string]dash0common.Export,
436+
) (map[string][]OtlpExporter, error) {
429437
exporterMap := make(map[string][]OtlpExporter)
430-
exporterMap["default"] = []OtlpExporter{}
438+
var err error
439+
exporterMap["_default"], err = convertExportSettingsToExporterList(defaultExport)
440+
if err != nil {
441+
return nil, err
442+
}
443+
for namespace, export := range perNamespaceExports {
444+
exporterMap[namespace], err = convertExportSettingsToExporterList(export)
445+
if err != nil {
446+
return nil, err
447+
}
448+
}
449+
return exporterMap, nil
450+
}
431451

452+
func convertExportSettingsToExporterList(export dash0common.Export) ([]OtlpExporter, error) {
432453
if export.Dash0 == nil && export.Grpc == nil && export.Http == nil {
433454
return nil, fmt.Errorf("%s no exporter configuration found", commonExportErrorPrefix)
434455
}
435456

457+
var exporters []OtlpExporter
436458
if export.Dash0 != nil {
437459
d0 := export.Dash0
438460
if d0.Endpoint == "" {
@@ -454,20 +476,20 @@ func ConvertExportSettingsToExporterMap(export dash0common.Export) (map[string][
454476
Headers: headers,
455477
}
456478
setGrpcTlsFromPrefix(export.Dash0.Endpoint, &dash0ExporterDefault)
457-
exporterMap["default"] = append(exporterMap["default"], dash0ExporterDefault)
458-
459-
headersRouted := headers
460-
headersRouted = append(headersRouted, dash0common.Header{
461-
Name: util.Dash0DatasetHeaderName,
462-
Value: "routed",
463-
})
464-
dash0ExporterForRoutedNamespace := OtlpExporter{
465-
Name: "otlp/dash0/routed-namespace",
466-
Endpoint: export.Dash0.Endpoint,
467-
Headers: headersRouted,
468-
}
469-
setGrpcTlsFromPrefix(export.Dash0.Endpoint, &dash0ExporterForRoutedNamespace)
470-
exporterMap["routed"] = []OtlpExporter{dash0ExporterForRoutedNamespace}
479+
exporters = append(exporters, dash0ExporterDefault)
480+
481+
//headersRouted := headers
482+
//headersRouted = append(headersRouted, dash0common.Header{
483+
// Name: util.Dash0DatasetHeaderName,
484+
// Value: "routed",
485+
//})
486+
//dash0ExporterForRoutedNamespace := OtlpExporter{
487+
// Name: "otlp/dash0/routed-namespace",
488+
// Endpoint: export.Dash0.Endpoint,
489+
// Headers: headersRouted,
490+
//}
491+
//setGrpcTlsFromPrefix(export.Dash0.Endpoint, &dash0ExporterForRoutedNamespace)
492+
//exporterMap["routed"] = []OtlpExporter{dash0ExporterForRoutedNamespace}
471493
}
472494

473495
if export.Grpc != nil {
@@ -489,7 +511,7 @@ func ConvertExportSettingsToExporterMap(export dash0common.Export) (map[string][
489511
if len(grpc.Headers) > 0 {
490512
grpcExporter.Headers = grpc.Headers
491513
}
492-
exporterMap["default"] = append(exporterMap["default"], grpcExporter)
514+
exporters = append(exporters, grpcExporter)
493515
}
494516

495517
if export.Http != nil {
@@ -510,10 +532,10 @@ func ConvertExportSettingsToExporterMap(export dash0common.Export) (map[string][
510532
if len(http.Headers) > 0 {
511533
httpExporter.Headers = http.Headers
512534
}
513-
exporterMap["default"] = append(exporterMap["default"], httpExporter)
535+
exporters = append(exporters, httpExporter)
514536
}
515537

516-
return exporterMap, nil
538+
return exporters, nil
517539
}
518540

519541
func renderCollectorConfiguration(

0 commit comments

Comments
 (0)