Skip to content

Commit acf8967

Browse files
committed
experimental/wip: different exports per namespace
[skip ci]
1 parent eb8563e commit acf8967

10 files changed

+226
-129
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
@@ -179,7 +179,7 @@ func assembleCollectorConfigMap(
179179
if forDeletion {
180180
configMapData = map[string]string{}
181181
} else {
182-
exporterMap, err := ConvertExportSettingsToExporterMap(config.Export)
182+
exporterMap, err := ConvertExportSettingsToExporterMap(config.DefaultExport, config.PerNamespaceExports)
183183
if err != nil {
184184
return nil, fmt.Errorf("%s %w", commonExportErrorPrefix, err)
185185
}
@@ -424,14 +424,36 @@ func compareErrorMode(
424424
return errorMode1
425425
}
426426

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

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

456+
var exporters []OtlpExporter
435457
if export.Dash0 != nil {
436458
d0 := export.Dash0
437459
if d0.Endpoint == "" {
@@ -447,26 +469,26 @@ func ConvertExportSettingsToExporterMap(export dash0common.Export) (map[string][
447469
Value: d0.Dataset,
448470
})
449471
}
450-
dash0ExporterDefault := OtlpExporter{
472+
dash0Exporter := OtlpExporter{
451473
Name: "otlp/dash0/_default",
452474
Endpoint: export.Dash0.Endpoint,
453475
Headers: headers,
454476
}
455-
setGrpcTls(export.Dash0.Endpoint, &dash0ExporterDefault)
456-
exporterMap["default"] = append(exporterMap["default"], dash0ExporterDefault)
457-
458-
headersRouted := headers
459-
headersRouted = append(headersRouted, dash0common.Header{
460-
Name: util.Dash0DatasetHeaderName,
461-
Value: "routed",
462-
})
463-
dash0ExporterForRoutedNamespace := OtlpExporter{
464-
Name: "otlp/dash0/routed-namespace",
465-
Endpoint: export.Dash0.Endpoint,
466-
Headers: headersRouted,
467-
}
468-
setGrpcTls(export.Dash0.Endpoint, &dash0ExporterForRoutedNamespace)
469-
exporterMap["routed"] = []OtlpExporter{dash0ExporterForRoutedNamespace}
477+
setGrpcTls(export.Dash0.Endpoint, &dash0Exporter)
478+
exporters = append(exporters, dash0Exporter)
479+
480+
//headersRouted := headers
481+
//headersRouted = append(headersRouted, dash0common.Header{
482+
// Name: util.Dash0DatasetHeaderName,
483+
// Value: "routed",
484+
//})
485+
//dash0ExporterForRoutedNamespace := OtlpExporter{
486+
// Name: "otlp/dash0/routed-namespace",
487+
// Endpoint: export.Dash0.Endpoint,
488+
// Headers: headersRouted,
489+
//}
490+
//setGrpcTls(export.Dash0.Endpoint, &dash0ExporterForRoutedNamespace)
491+
//exporterMap["routed"] = []OtlpExporter{dash0ExporterForRoutedNamespace}
470492
}
471493

472494
if export.Grpc != nil {
@@ -483,7 +505,7 @@ func ConvertExportSettingsToExporterMap(export dash0common.Export) (map[string][
483505
if len(grpc.Headers) > 0 {
484506
grpcExporter.Headers = grpc.Headers
485507
}
486-
exporterMap["default"] = append(exporterMap["default"], grpcExporter)
508+
exporters = append(exporters, grpcExporter)
487509
}
488510

489511
if export.Http != nil {
@@ -503,10 +525,10 @@ func ConvertExportSettingsToExporterMap(export dash0common.Export) (map[string][
503525
if len(http.Headers) > 0 {
504526
httpExporter.Headers = http.Headers
505527
}
506-
exporterMap["default"] = append(exporterMap["default"], httpExporter)
528+
exporters = append(exporters, httpExporter)
507529
}
508530

509-
return exporterMap, nil
531+
return exporters, nil
510532
}
511533

512534
func renderCollectorConfiguration(

0 commit comments

Comments
 (0)