From bb6cd581a639588c245e33728a43456ea3788152 Mon Sep 17 00:00:00 2001 From: Romain Date: Tue, 6 Feb 2024 10:04:05 +0100 Subject: [PATCH] Align OpenTelemetry tracing and metrics configurations Co-authored-by: Michael --- cmd/traefik/traefik.go | 7 +- .../observability/metrics/opentelemetry.md | 420 ++++++++++++------ .../observability/tracing/opentelemetry.md | 71 ++- .../content/observability/tracing/overview.md | 24 - .../reference/static-configuration/cli-ref.md | 67 +-- .../reference/static-configuration/env-ref.md | 67 +-- .../reference/static-configuration/file.toml | 44 +- .../reference/static-configuration/file.yaml | 44 +- pkg/config/static/static_config.go | 15 +- pkg/metrics/opentelemetry.go | 29 +- pkg/metrics/opentelemetry_test.go | 11 +- pkg/middlewares/auth/forward_test.go | 3 +- pkg/redactor/redactor_config_test.go | 8 +- .../testdata/anonymized-static-config.json | 3 - pkg/tracing/opentelemetry/opentelemetry.go | 44 +- .../opentelemetry/opentelemetry_test.go | 3 +- pkg/tracing/tracing.go | 4 +- pkg/types/metrics.go | 64 ++- 18 files changed, 587 insertions(+), 341 deletions(-) diff --git a/cmd/traefik/traefik.go b/cmd/traefik/traefik.go index 0ddcceb00..821f391ed 100644 --- a/cmd/traefik/traefik.go +++ b/cmd/traefik/traefik.go @@ -520,15 +520,14 @@ func registerMetricClients(metricsConfig *types.Metrics) []metrics.Registry { } } - if metricsConfig.OpenTelemetry != nil { + if metricsConfig.OTLP != nil { logger := log.With().Str(logs.MetricsProviderName, "openTelemetry").Logger() - openTelemetryRegistry := metrics.RegisterOpenTelemetry(logger.WithContext(context.Background()), metricsConfig.OpenTelemetry) + openTelemetryRegistry := metrics.RegisterOpenTelemetry(logger.WithContext(context.Background()), metricsConfig.OTLP) if openTelemetryRegistry != nil { registries = append(registries, openTelemetryRegistry) logger.Debug(). - Str("address", metricsConfig.OpenTelemetry.Address). - Str("pushInterval", metricsConfig.OpenTelemetry.PushInterval.String()). + Str("pushInterval", metricsConfig.OTLP.PushInterval.String()). Msg("Configured OpenTelemetry metrics") } } diff --git a/docs/content/observability/metrics/opentelemetry.md b/docs/content/observability/metrics/opentelemetry.md index af0ba7b20..1c762fc2a 100644 --- a/docs/content/observability/metrics/opentelemetry.md +++ b/docs/content/observability/metrics/opentelemetry.md @@ -5,45 +5,25 @@ description: "Traefik supports several metrics backends, including OpenTelemetry # OpenTelemetry -To enable the OpenTelemetry: +To enable the OpenTelemetry metrics: ```yaml tab="File (YAML)" metrics: - openTelemetry: {} + otlp: {} ``` ```toml tab="File (TOML)" [metrics] - [metrics.openTelemetry] + [metrics.otlp] ``` ```bash tab="CLI" ---metrics.openTelemetry=true +--metrics.otlp=true ``` -!!! info "The OpenTelemetry exporter will export metrics to the collector by using HTTP by default, see the [gRPC Section](#grpc-configuration) to use gRPC." +!!! info "Default protocol" -#### `address` - -_Required, Default="localhost:4318", Format="`:`"_ - -Address of the OpenTelemetry Collector to send metrics to. - -```yaml tab="File (YAML)" -metrics: - openTelemetry: - address: localhost:4318 -``` - -```toml tab="File (TOML)" -[metrics] - [metrics.openTelemetry] - address = "localhost:4318" -``` - -```bash tab="CLI" ---metrics.openTelemetry.address=localhost:4318 -``` + The OpenTelemetry exporter will export metrics to the collector using HTTP by default to https://localhost:4318/v1/metrics, see the [gRPC Section](#grpc-configuration) to use gRPC. #### `addEntryPointsLabels` @@ -53,18 +33,18 @@ Enable metrics on entry points. ```yaml tab="File (YAML)" metrics: - openTelemetry: + otlp: addEntryPointsLabels: true ``` ```toml tab="File (TOML)" [metrics] - [metrics.openTelemetry] + [metrics.otlp] addEntryPointsLabels = true ``` ```bash tab="CLI" ---metrics.openTelemetry.addEntryPointsLabels=true +--metrics.otlp.addEntryPointsLabels=true ``` #### `addRoutersLabels` @@ -75,18 +55,18 @@ Enable metrics on routers. ```yaml tab="File (YAML)" metrics: - openTelemetry: + otlp: addRoutersLabels: true ``` ```toml tab="File (TOML)" [metrics] - [metrics.openTelemetry] + [metrics.otlp] addRoutersLabels = true ``` ```bash tab="CLI" ---metrics.openTelemetry.addRoutersLabels=true +--metrics.otlp.addRoutersLabels=true ``` #### `addServicesLabels` @@ -97,18 +77,18 @@ Enable metrics on services. ```yaml tab="File (YAML)" metrics: - openTelemetry: + otlp: addServicesLabels: true ``` ```toml tab="File (TOML)" [metrics] - [metrics.openTelemetry] + [metrics.otlp] addServicesLabels = true ``` ```bash tab="CLI" ---metrics.openTelemetry.addServicesLabels=true +--metrics.otlp.addServicesLabels=true ``` #### `explicitBoundaries` @@ -119,7 +99,7 @@ Explicit boundaries for Histogram data points. ```yaml tab="File (YAML)" metrics: - openTelemetry: + otlp: explicitBoundaries: - 0.1 - 0.3 @@ -129,59 +109,12 @@ metrics: ```toml tab="File (TOML)" [metrics] - [metrics.openTelemetry] + [metrics.otlp] explicitBoundaries = [0.1,0.3,1.2,5.0] ``` ```bash tab="CLI" ---metrics.openTelemetry.explicitBoundaries=0.1,0.3,1.2,5.0 -``` - -#### `headers` - -_Optional, Default={}_ - -Additional headers sent with metrics by the reporter to the OpenTelemetry Collector. - -```yaml tab="File (YAML)" -metrics: - openTelemetry: - headers: - foo: bar - baz: buz -``` - -```toml tab="File (TOML)" -[metrics] - [metrics.openTelemetry.headers] - foo = "bar" - baz = "buz" -``` - -```bash tab="CLI" ---metrics.openTelemetry.headers.foo=bar --metrics.openTelemetry.headers.baz=buz -``` - -#### `insecure` - -_Optional, Default=false_ - -Allows reporter to send metrics to the OpenTelemetry Collector without using a secured protocol. - -```yaml tab="File (YAML)" -metrics: - openTelemetry: - insecure: true -``` - -```toml tab="File (TOML)" -[metrics] - [metrics.openTelemetry] - insecure = true -``` - -```bash tab="CLI" ---metrics.openTelemetry.insecure=true +--metrics.otlp.explicitBoundaries=0.1,0.3,1.2,5.0 ``` #### `pushInterval` @@ -192,48 +125,95 @@ Interval at which metrics are sent to the OpenTelemetry Collector. ```yaml tab="File (YAML)" metrics: - openTelemetry: + otlp: pushInterval: 10s ``` ```toml tab="File (TOML)" [metrics] - [metrics.openTelemetry] + [metrics.otlp] pushInterval = "10s" ``` ```bash tab="CLI" ---metrics.openTelemetry.pushInterval=10s +--metrics.otlp.pushInterval=10s ``` -#### `path` +### HTTP configuration -_Required, Default="/v1/metrics"_ +_Optional_ -Allows to override the default URL path used for sending metrics. -This option has no effect when using gRPC transport. +This instructs the exporter to send the metrics to the OpenTelemetry Collector using HTTP. ```yaml tab="File (YAML)" metrics: - openTelemetry: - path: /foo/v1/metrics + otlp: + http: {} ``` ```toml tab="File (TOML)" [metrics] - [metrics.openTelemetry] - path = "/foo/v1/metrics" + [metrics.otlp.http] ``` ```bash tab="CLI" ---metrics.openTelemetry.path=/foo/v1/metrics +--metrics.otlp.http=true +``` + +#### `endpoint` + +_Required, Default="http://localhost:4318/v1/metrics", Format="`://:`"_ + +URL of the OpenTelemetry Collector to send metrics to. + +```yaml tab="File (YAML)" +metrics: + otlp: + http: + endpoint: http://localhost:4318/v1/metrics +``` + +```toml tab="File (TOML)" +[metrics] + [metrics.otlp.http] + endpoint = "http://localhost:4318/v1/metrics" +``` + +```bash tab="CLI" +--metrics.otlp.http.endpoint=http://localhost:4318/v1/metrics +``` + +#### `headers` + +_Optional, Default={}_ + +Additional headers sent with metrics by the exporter to the OpenTelemetry Collector. + +```yaml tab="File (YAML)" +metrics: + otlp: + http: + headers: + foo: bar + baz: buz +``` + +```toml tab="File (TOML)" +[metrics] + [metrics.otlp.http.headers] + foo = "bar" + baz = "buz" +``` + +```bash tab="CLI" +--metrics.otlp.http.headers.foo=bar --metrics.otlp.http.headers.baz=buz ``` #### `tls` _Optional_ -Defines the TLS configuration used by the reporter to send metrics to the OpenTelemetry Collector. +Defines the Client TLS configuration used by the exporter to send metrics to the OpenTelemetry Collector. ##### `ca` @@ -244,18 +224,19 @@ it defaults to the system bundle. ```yaml tab="File (YAML)" metrics: - openTelemetry: - tls: - ca: path/to/ca.crt + otlp: + http: + tls: + ca: path/to/ca.crt ``` ```toml tab="File (TOML)" -[metrics.openTelemetry.tls] +[metrics.otlp.http.tls] ca = "path/to/ca.crt" ``` ```bash tab="CLI" ---metrics.openTelemetry.tls.ca=path/to/ca.crt +--metrics.otlp.http.tls.ca=path/to/ca.crt ``` ##### `cert` @@ -267,21 +248,22 @@ When using this option, setting the `key` option is required. ```yaml tab="File (YAML)" metrics: - openTelemetry: - tls: - cert: path/to/foo.cert - key: path/to/foo.key + otlp: + http: + tls: + cert: path/to/foo.cert + key: path/to/foo.key ``` ```toml tab="File (TOML)" -[metrics.openTelemetry.tls] +[metrics.otlp.http.tls] cert = "path/to/foo.cert" key = "path/to/foo.key" ``` ```bash tab="CLI" ---metrics.openTelemetry.tls.cert=path/to/foo.cert ---metrics.openTelemetry.tls.key=path/to/foo.key +--metrics.otlp.http.tls.cert=path/to/foo.cert +--metrics.otlp.http.tls.key=path/to/foo.key ``` ##### `key` @@ -293,21 +275,22 @@ When using this option, setting the `cert` option is required. ```yaml tab="File (YAML)" metrics: - openTelemetry: - tls: - cert: path/to/foo.cert - key: path/to/foo.key + otlp: + http: + tls: + cert: path/to/foo.cert + key: path/to/foo.key ``` ```toml tab="File (TOML)" -[metrics.openTelemetry.tls] +[metrics.otlp.http.tls] cert = "path/to/foo.cert" key = "path/to/foo.key" ``` ```bash tab="CLI" ---metrics.openTelemetry.tls.cert=path/to/foo.cert ---metrics.openTelemetry.tls.key=path/to/foo.key +--metrics.otlp.http.tls.cert=path/to/foo.cert +--metrics.otlp.http.tls.key=path/to/foo.key ``` ##### `insecureSkipVerify` @@ -319,35 +302,218 @@ the TLS connection to the OpenTelemetry Collector accepts any certificate presen ```yaml tab="File (YAML)" metrics: - openTelemetry: - tls: - insecureSkipVerify: true + otlp: + http: + tls: + insecureSkipVerify: true ``` ```toml tab="File (TOML)" -[metrics.openTelemetry.tls] +[metrics.otlp.http.tls] insecureSkipVerify = true ``` ```bash tab="CLI" ---metrics.openTelemetry.tls.insecureSkipVerify=true +--metrics.otlp.http.tls.insecureSkipVerify=true ``` -#### gRPC configuration +### gRPC configuration -This instructs the reporter to send metrics to the OpenTelemetry Collector using gRPC. +_Optional_ + +This instructs the exporter to send metrics to the OpenTelemetry Collector using gRPC. ```yaml tab="File (YAML)" metrics: - openTelemetry: + otlp: grpc: {} ``` ```toml tab="File (TOML)" [metrics] - [metrics.openTelemetry.grpc] + [metrics.otlp.grpc] ``` ```bash tab="CLI" ---metrics.openTelemetry.grpc=true +--metrics.otlp.grpc=true +``` + +#### `endpoint` + +_Required, Default="localhost:4317", Format="`:`"_ + +Address of the OpenTelemetry Collector to send metrics to. + +```yaml tab="File (YAML)" +metrics: + otlp: + grpc: + endpoint: localhost:4317 +``` + +```toml tab="File (TOML)" +[metrics] + [metrics.otlp.grpc] + endpoint = "localhost:4317" +``` + +```bash tab="CLI" +--metrics.otlp.grpc.endpoint=localhost:4317 +``` + +#### `insecure` + +_Optional, Default=false_ + +Allows exporter to send metrics to the OpenTelemetry Collector without using a secured protocol. + +```yaml tab="File (YAML)" +metrics: + otlp: + grpc: + insecure: true +``` + +```toml tab="File (TOML)" +[metrics] + [metrics.otlp.grpc] + insecure = true +``` + +```bash tab="CLI" +--metrics.otlp.grpc.insecure=true +``` + +#### `headers` + +_Optional, Default={}_ + +Additional headers sent with metrics by the exporter to the OpenTelemetry Collector. + +```yaml tab="File (YAML)" +metrics: + otlp: + grpc: + headers: + foo: bar + baz: buz +``` + +```toml tab="File (TOML)" +[metrics] + [metrics.otlp.grpc.headers] + foo = "bar" + baz = "buz" +``` + +```bash tab="CLI" +--metrics.otlp.grpc.headers.foo=bar --metrics.otlp.grpc.headers.baz=buz +``` + +#### `tls` + +_Optional_ + +Defines the Client TLS configuration used by the exporter to send metrics to the OpenTelemetry Collector. + +##### `ca` + +_Optional_ + +`ca` is the path to the certificate authority used for the secure connection to the OpenTelemetry Collector, +it defaults to the system bundle. + +```yaml tab="File (YAML)" +metrics: + otlp: + grpc: + tls: + ca: path/to/ca.crt +``` + +```toml tab="File (TOML)" +[metrics.otlp.grpc.tls] + ca = "path/to/ca.crt" +``` + +```bash tab="CLI" +--metrics.otlp.grpc.tls.ca=path/to/ca.crt +``` + +##### `cert` + +_Optional_ + +`cert` is the path to the public certificate used for the secure connection to the OpenTelemetry Collector. +When using this option, setting the `key` option is required. + +```yaml tab="File (YAML)" +metrics: + otlp: + grpc: + tls: + cert: path/to/foo.cert + key: path/to/foo.key +``` + +```toml tab="File (TOML)" +[metrics.otlp.grpc.tls] + cert = "path/to/foo.cert" + key = "path/to/foo.key" +``` + +```bash tab="CLI" +--metrics.otlp.grpc.tls.cert=path/to/foo.cert +--metrics.otlp.grpc.tls.key=path/to/foo.key +``` + +##### `key` + +_Optional_ + +`key` is the path to the private key used for the secure connection to the OpenTelemetry Collector. +When using this option, setting the `cert` option is required. + +```yaml tab="File (YAML)" +metrics: + otlp: + grpc: + tls: + cert: path/to/foo.cert + key: path/to/foo.key +``` + +```toml tab="File (TOML)" +[metrics.otlp.grpc.tls] + cert = "path/to/foo.cert" + key = "path/to/foo.key" +``` + +```bash tab="CLI" +--metrics.otlp.grpc.tls.cert=path/to/foo.cert +--metrics.otlp.grpc.tls.key=path/to/foo.key +``` + +##### `insecureSkipVerify` + +_Optional, Default=false_ + +If `insecureSkipVerify` is `true`, +the TLS connection to the OpenTelemetry Collector accepts any certificate presented by the server regardless of the hostnames it covers. + +```yaml tab="File (YAML)" +metrics: + otlp: + grpc: + tls: + insecureSkipVerify: true +``` + +```toml tab="File (TOML)" +[metrics.otlp.grpc.tls] + insecureSkipVerify = true +``` + +```bash tab="CLI" +--metrics.otlp.grpc.tls.insecureSkipVerify=true ``` diff --git a/docs/content/observability/tracing/opentelemetry.md b/docs/content/observability/tracing/opentelemetry.md index 52b37a0a5..0ea6bd19f 100644 --- a/docs/content/observability/tracing/opentelemetry.md +++ b/docs/content/observability/tracing/opentelemetry.md @@ -21,19 +21,20 @@ tracing: --tracing.otlp=true ``` -!!! info "The OpenTelemetry trace reporter will export traces to the collector using HTTP by default (http://localhost:4318/v1/traces), -see the [gRPC Section](#grpc-configuration) to use gRPC." +!!! info "Default protocol" + + The OpenTelemetry trace exporter will export traces to the collector using HTTP by default to https://localhost:4318/v1/traces, see the [gRPC Section](#grpc-configuration) to use gRPC. !!! info "Trace sampling" - By default, the OpenTelemetry trace reporter will sample 100% of traces. + By default, the OpenTelemetry trace exporter will sample 100% of traces. See [OpenTelemetry's SDK configuration](https://opentelemetry.io/docs/reference/specification/sdk-environment-variables/#general-sdk-configuration) to customize the sampling strategy. ### HTTP configuration _Optional_ -This instructs the reporter to send spans to the OpenTelemetry Collector using HTTP. +This instructs the exporter to send spans to the OpenTelemetry Collector using HTTP. ```yaml tab="File (YAML)" tracing: @@ -73,11 +74,37 @@ tracing: --tracing.otlp.http.endpoint=http://localhost:4318/v1/traces ``` +#### `headers` + +_Optional, Default={}_ + +Additional headers sent with traces by the exporter to the OpenTelemetry Collector. + +```yaml tab="File (YAML)" +tracing: + otlp: + http: + headers: + foo: bar + baz: buz +``` + +```toml tab="File (TOML)" +[tracing] + [tracing.otlp.http.headers] + foo = "bar" + baz = "buz" +``` + +```bash tab="CLI" +--tracing.otlp.http.headers.foo=bar --tracing.otlp.http.headers.baz=buz +``` + #### `tls` _Optional_ -Defines the Client TLS configuration used by the reporter to send spans to the OpenTelemetry Collector. +Defines the Client TLS configuration used by the exporter to send spans to the OpenTelemetry Collector. ##### `ca` @@ -181,11 +208,11 @@ tracing: --tracing.otlp.http.tls.insecureSkipVerify=true ``` -#### gRPC configuration +### gRPC configuration _Optional_ -This instructs the reporter to send spans to the OpenTelemetry Collector using gRPC. +This instructs the exporter to send spans to the OpenTelemetry Collector using gRPC. ```yaml tab="File (YAML)" tracing: @@ -228,7 +255,7 @@ tracing: _Optional, Default=false_ -Allows reporter to send spans to the OpenTelemetry Collector without using a secured protocol. +Allows exporter to send spans to the OpenTelemetry Collector without using a secured protocol. ```yaml tab="File (YAML)" tracing: @@ -247,11 +274,37 @@ tracing: --tracing.otlp.grpc.insecure=true ``` +#### `headers` + +_Optional, Default={}_ + +Additional headers sent with traces by the exporter to the OpenTelemetry Collector. + +```yaml tab="File (YAML)" +tracing: + otlp: + grpc: + headers: + foo: bar + baz: buz +``` + +```toml tab="File (TOML)" +[tracing] + [tracing.otlp.grpc.headers] + foo = "bar" + baz = "buz" +``` + +```bash tab="CLI" +--tracing.otlp.grpc.headers.foo=bar --tracing.otlp.grpc.headers.baz=buz +``` + #### `tls` _Optional_ -Defines the Client TLS configuration used by the reporter to send spans to the OpenTelemetry Collector. +Defines the Client TLS configuration used by the exporter to send spans to the OpenTelemetry Collector. ##### `ca` diff --git a/docs/content/observability/tracing/overview.md b/docs/content/observability/tracing/overview.md index 52cbb483a..901377150 100644 --- a/docs/content/observability/tracing/overview.md +++ b/docs/content/observability/tracing/overview.md @@ -92,30 +92,6 @@ tracing: --tracing.sampleRate=0.2 ``` -#### `headers` - -_Optional, Default={}_ - -Defines additional headers to be sent with the span's payload. - -```yaml tab="File (YAML)" -tracing: - headers: - foo: bar - baz: buz -``` - -```toml tab="File (TOML)" -[tracing] - [tracing.headers] - foo = "bar" - baz = "buz" -``` - -```bash tab="CLI" ---tracing.headers.foo=bar --tracing.headers.baz=buz -``` - #### `globalAttributes` _Optional, Default=empty_ diff --git a/docs/content/reference/static-configuration/cli-ref.md b/docs/content/reference/static-configuration/cli-ref.md index a3bd3d391..179e376c5 100644 --- a/docs/content/reference/static-configuration/cli-ref.md +++ b/docs/content/reference/static-configuration/cli-ref.md @@ -324,51 +324,63 @@ InfluxDB v2 push interval. (Default: ```10```) `--metrics.influxdb2.token`: InfluxDB v2 access token. -`--metrics.opentelemetry`: +`--metrics.otlp`: OpenTelemetry metrics exporter type. (Default: ```false```) -`--metrics.opentelemetry.addentrypointslabels`: +`--metrics.otlp.addentrypointslabels`: Enable metrics on entry points. (Default: ```true```) -`--metrics.opentelemetry.address`: -Address (host:port) of the collector endpoint. (Default: ```localhost:4318```) - -`--metrics.opentelemetry.addrouterslabels`: +`--metrics.otlp.addrouterslabels`: Enable metrics on routers. (Default: ```false```) -`--metrics.opentelemetry.addserviceslabels`: +`--metrics.otlp.addserviceslabels`: Enable metrics on services. (Default: ```true```) -`--metrics.opentelemetry.explicitboundaries`: +`--metrics.otlp.explicitboundaries`: Boundaries for latency metrics. (Default: ```0.005000, 0.010000, 0.025000, 0.050000, 0.100000, 0.250000, 0.500000, 1.000000, 2.500000, 5.000000, 10.000000```) -`--metrics.opentelemetry.grpc`: -gRPC specific configuration for the OpenTelemetry collector. (Default: ```true```) +`--metrics.otlp.grpc.endpoint`: +Sets the gRPC endpoint (host:port) of the collector. (Default: ```localhost:4317```) -`--metrics.opentelemetry.headers.`: +`--metrics.otlp.grpc.headers.`: Headers sent with payload. -`--metrics.opentelemetry.insecure`: +`--metrics.otlp.grpc.insecure`: Disables client transport security for the exporter. (Default: ```false```) -`--metrics.opentelemetry.path`: -Set the URL path of the collector endpoint. - -`--metrics.opentelemetry.pushinterval`: -Period between calls to collect a checkpoint. (Default: ```10```) - -`--metrics.opentelemetry.tls.ca`: +`--metrics.otlp.grpc.tls.ca`: TLS CA -`--metrics.opentelemetry.tls.cert`: +`--metrics.otlp.grpc.tls.cert`: TLS cert -`--metrics.opentelemetry.tls.insecureskipverify`: +`--metrics.otlp.grpc.tls.insecureskipverify`: TLS insecure skip verify (Default: ```false```) -`--metrics.opentelemetry.tls.key`: +`--metrics.otlp.grpc.tls.key`: TLS key +`--metrics.otlp.http.endpoint`: +Sets the HTTP endpoint (scheme://host:port/path) of the collector. (Default: ```https://localhost:4318```) + +`--metrics.otlp.http.headers.`: +Headers sent with payload. + +`--metrics.otlp.http.tls.ca`: +TLS CA + +`--metrics.otlp.http.tls.cert`: +TLS cert + +`--metrics.otlp.http.tls.insecureskipverify`: +TLS insecure skip verify (Default: ```false```) + +`--metrics.otlp.http.tls.key`: +TLS key + +`--metrics.otlp.pushinterval`: +Period between calls to collect a checkpoint. (Default: ```10```) + `--metrics.prometheus`: Prometheus metrics exporter type. (Default: ```false```) @@ -1005,15 +1017,15 @@ Enables tracing for internal services (ping, dashboard, etc...). (Default: ```fa `--tracing.globalattributes.`: Defines additional attributes (key:value) on all spans. -`--tracing.headers.`: -Defines additional headers to be sent with the payloads. - `--tracing.otlp`: Settings for OpenTelemetry. (Default: ```false```) `--tracing.otlp.grpc.endpoint`: Sets the gRPC endpoint (host:port) of the collector. (Default: ```localhost:4317```) +`--tracing.otlp.grpc.headers.`: +Headers sent with payload. + `--tracing.otlp.grpc.insecure`: Disables client transport security for the exporter. (Default: ```false```) @@ -1030,7 +1042,10 @@ TLS insecure skip verify (Default: ```false```) TLS key `--tracing.otlp.http.endpoint`: -Sets the HTTP endpoint (scheme://host:port/v1/traces) of the collector. (Default: ```localhost:4318```) +Sets the HTTP endpoint (scheme://host:port/path) of the collector. (Default: ```https://localhost:4318```) + +`--tracing.otlp.http.headers.`: +Headers sent with payload. `--tracing.otlp.http.tls.ca`: TLS CA diff --git a/docs/content/reference/static-configuration/env-ref.md b/docs/content/reference/static-configuration/env-ref.md index 79cc1797d..e2a2e73f6 100644 --- a/docs/content/reference/static-configuration/env-ref.md +++ b/docs/content/reference/static-configuration/env-ref.md @@ -324,51 +324,63 @@ InfluxDB v2 push interval. (Default: ```10```) `TRAEFIK_METRICS_INFLUXDB2_TOKEN`: InfluxDB v2 access token. -`TRAEFIK_METRICS_OPENTELEMETRY`: +`TRAEFIK_METRICS_OTLP`: OpenTelemetry metrics exporter type. (Default: ```false```) -`TRAEFIK_METRICS_OPENTELEMETRY_ADDENTRYPOINTSLABELS`: +`TRAEFIK_METRICS_OTLP_ADDENTRYPOINTSLABELS`: Enable metrics on entry points. (Default: ```true```) -`TRAEFIK_METRICS_OPENTELEMETRY_ADDRESS`: -Address (host:port) of the collector endpoint. (Default: ```localhost:4318```) - -`TRAEFIK_METRICS_OPENTELEMETRY_ADDROUTERSLABELS`: +`TRAEFIK_METRICS_OTLP_ADDROUTERSLABELS`: Enable metrics on routers. (Default: ```false```) -`TRAEFIK_METRICS_OPENTELEMETRY_ADDSERVICESLABELS`: +`TRAEFIK_METRICS_OTLP_ADDSERVICESLABELS`: Enable metrics on services. (Default: ```true```) -`TRAEFIK_METRICS_OPENTELEMETRY_EXPLICITBOUNDARIES`: +`TRAEFIK_METRICS_OTLP_EXPLICITBOUNDARIES`: Boundaries for latency metrics. (Default: ```0.005000, 0.010000, 0.025000, 0.050000, 0.100000, 0.250000, 0.500000, 1.000000, 2.500000, 5.000000, 10.000000```) -`TRAEFIK_METRICS_OPENTELEMETRY_GRPC`: -gRPC specific configuration for the OpenTelemetry collector. (Default: ```true```) +`TRAEFIK_METRICS_OTLP_GRPC_ENDPOINT`: +Sets the gRPC endpoint (host:port) of the collector. (Default: ```localhost:4317```) -`TRAEFIK_METRICS_OPENTELEMETRY_HEADERS_`: +`TRAEFIK_METRICS_OTLP_GRPC_HEADERS_`: Headers sent with payload. -`TRAEFIK_METRICS_OPENTELEMETRY_INSECURE`: +`TRAEFIK_METRICS_OTLP_GRPC_INSECURE`: Disables client transport security for the exporter. (Default: ```false```) -`TRAEFIK_METRICS_OPENTELEMETRY_PATH`: -Set the URL path of the collector endpoint. - -`TRAEFIK_METRICS_OPENTELEMETRY_PUSHINTERVAL`: -Period between calls to collect a checkpoint. (Default: ```10```) - -`TRAEFIK_METRICS_OPENTELEMETRY_TLS_CA`: +`TRAEFIK_METRICS_OTLP_GRPC_TLS_CA`: TLS CA -`TRAEFIK_METRICS_OPENTELEMETRY_TLS_CERT`: +`TRAEFIK_METRICS_OTLP_GRPC_TLS_CERT`: TLS cert -`TRAEFIK_METRICS_OPENTELEMETRY_TLS_INSECURESKIPVERIFY`: +`TRAEFIK_METRICS_OTLP_GRPC_TLS_INSECURESKIPVERIFY`: TLS insecure skip verify (Default: ```false```) -`TRAEFIK_METRICS_OPENTELEMETRY_TLS_KEY`: +`TRAEFIK_METRICS_OTLP_GRPC_TLS_KEY`: TLS key +`TRAEFIK_METRICS_OTLP_HTTP_ENDPOINT`: +Sets the HTTP endpoint (scheme://host:port/path) of the collector. (Default: ```https://localhost:4318```) + +`TRAEFIK_METRICS_OTLP_HTTP_HEADERS_`: +Headers sent with payload. + +`TRAEFIK_METRICS_OTLP_HTTP_TLS_CA`: +TLS CA + +`TRAEFIK_METRICS_OTLP_HTTP_TLS_CERT`: +TLS cert + +`TRAEFIK_METRICS_OTLP_HTTP_TLS_INSECURESKIPVERIFY`: +TLS insecure skip verify (Default: ```false```) + +`TRAEFIK_METRICS_OTLP_HTTP_TLS_KEY`: +TLS key + +`TRAEFIK_METRICS_OTLP_PUSHINTERVAL`: +Period between calls to collect a checkpoint. (Default: ```10```) + `TRAEFIK_METRICS_PROMETHEUS`: Prometheus metrics exporter type. (Default: ```false```) @@ -1005,15 +1017,15 @@ Enables tracing for internal services (ping, dashboard, etc...). (Default: ```fa `TRAEFIK_TRACING_GLOBALATTRIBUTES_`: Defines additional attributes (key:value) on all spans. -`TRAEFIK_TRACING_HEADERS_`: -Defines additional headers to be sent with the payloads. - `TRAEFIK_TRACING_OTLP`: Settings for OpenTelemetry. (Default: ```false```) `TRAEFIK_TRACING_OTLP_GRPC_ENDPOINT`: Sets the gRPC endpoint (host:port) of the collector. (Default: ```localhost:4317```) +`TRAEFIK_TRACING_OTLP_GRPC_HEADERS_`: +Headers sent with payload. + `TRAEFIK_TRACING_OTLP_GRPC_INSECURE`: Disables client transport security for the exporter. (Default: ```false```) @@ -1030,7 +1042,10 @@ TLS insecure skip verify (Default: ```false```) TLS key `TRAEFIK_TRACING_OTLP_HTTP_ENDPOINT`: -Sets the HTTP endpoint (scheme://host:port/v1/traces) of the collector. (Default: ```localhost:4318```) +Sets the HTTP endpoint (scheme://host:port/path) of the collector. (Default: ```https://localhost:4318```) + +`TRAEFIK_TRACING_OTLP_HTTP_HEADERS_`: +Headers sent with payload. `TRAEFIK_TRACING_OTLP_HTTP_TLS_CA`: TLS CA diff --git a/docs/content/reference/static-configuration/file.toml b/docs/content/reference/static-configuration/file.toml index e2a459ae6..e3de7aa3b 100644 --- a/docs/content/reference/static-configuration/file.toml +++ b/docs/content/reference/static-configuration/file.toml @@ -314,24 +314,33 @@ [metrics.influxDB2.additionalLabels] name0 = "foobar" name1 = "foobar" - [metrics.openTelemetry] - address = "foobar" + [metrics.otlp] addEntryPointsLabels = true addRoutersLabels = true addServicesLabels = true explicitBoundaries = [42.0, 42.0] - insecure = true - path = "foobar" pushInterval = "42s" - [metrics.openTelemetry.grpc] - [metrics.openTelemetry.headers] - name0 = "foobar" - name1 = "foobar" - [metrics.openTelemetry.tls] - ca = "foobar" - cert = "foobar" - key = "foobar" - insecureSkipVerify = true + [metrics.otlp.grpc] + endpoint = "foobar" + insecure = true + [metrics.otlp.grpc.tls] + ca = "foobar" + cert = "foobar" + key = "foobar" + insecureSkipVerify = true + [metrics.otlp.grpc.headers] + name0 = "foobar" + name1 = "foobar" + [metrics.otlp.http] + endpoint = "foobar" + [metrics.otlp.http.tls] + ca = "foobar" + cert = "foobar" + key = "foobar" + insecureSkipVerify = true + [metrics.otlp.http.headers] + name0 = "foobar" + name1 = "foobar" [ping] entryPoint = "foobar" @@ -372,9 +381,6 @@ serviceName = "foobar" sampleRate = 42.0 addInternals = true - [tracing.headers] - name0 = "foobar" - name1 = "foobar" [tracing.globalAttributes] name0 = "foobar" name1 = "foobar" @@ -387,6 +393,9 @@ cert = "foobar" key = "foobar" insecureSkipVerify = true + [tracing.otlp.grpc.headers] + name0 = "foobar" + name1 = "foobar" [tracing.otlp.http] endpoint = "foobar" [tracing.otlp.http.tls] @@ -394,6 +403,9 @@ cert = "foobar" key = "foobar" insecureSkipVerify = true + [tracing.otlp.http.headers] + name0 = "foobar" + name1 = "foobar" [hostResolver] cnameFlattening = true diff --git a/docs/content/reference/static-configuration/file.yaml b/docs/content/reference/static-configuration/file.yaml index 2779e0997..bdf314c29 100644 --- a/docs/content/reference/static-configuration/file.yaml +++ b/docs/content/reference/static-configuration/file.yaml @@ -347,26 +347,35 @@ metrics: additionalLabels: name0: foobar name1: foobar - openTelemetry: - grpc: {} - address: foobar + otlp: + grpc: + endpoint: foobar + insecure: true + tls: + ca: foobar + cert: foobar + key: foobar + insecureSkipVerify: true + headers: + name0: foobar + name1: foobar + http: + endpoint: foobar + tls: + ca: foobar + cert: foobar + key: foobar + insecureSkipVerify: true + headers: + name0: foobar + name1: foobar addEntryPointsLabels: true addRoutersLabels: true addServicesLabels: true explicitBoundaries: - 42 - 42 - headers: - name0: foobar - name1: foobar - insecure: true - path: foobar pushInterval: 42s - tls: - ca: foobar - cert: foobar - key: foobar - insecureSkipVerify: true ping: entryPoint: foobar manualRouting: true @@ -403,9 +412,6 @@ accessLog: addInternals: true tracing: serviceName: foobar - headers: - name0: foobar - name1: foobar globalAttributes: name0: foobar name1: foobar @@ -420,6 +426,9 @@ tracing: cert: foobar key: foobar insecureSkipVerify: true + headers: + name0: foobar + name1: foobar http: endpoint: foobar tls: @@ -427,6 +436,9 @@ tracing: cert: foobar key: foobar insecureSkipVerify: true + headers: + name0: foobar + name1: foobar hostResolver: cnameFlattening: true resolvConfig: foobar diff --git a/pkg/config/static/static_config.go b/pkg/config/static/static_config.go index 19d6ea24c..57af7a165 100644 --- a/pkg/config/static/static_config.go +++ b/pkg/config/static/static_config.go @@ -194,7 +194,6 @@ func (a *LifeCycle) SetDefaults() { // Tracing holds the tracing configuration. type Tracing struct { ServiceName string `description:"Set the name for this service." json:"serviceName,omitempty" toml:"serviceName,omitempty" yaml:"serviceName,omitempty" export:"true"` - Headers map[string]string `description:"Defines additional headers to be sent with the payloads." json:"headers,omitempty" toml:"headers,omitempty" yaml:"headers,omitempty" export:"true"` GlobalAttributes map[string]string `description:"Defines additional attributes (key:value) on all spans." json:"globalAttributes,omitempty" toml:"globalAttributes,omitempty" yaml:"globalAttributes,omitempty" export:"true"` SampleRate float64 `description:"Sets the rate between 0.0 and 1.0 of requests to trace." json:"sampleRate,omitempty" toml:"sampleRate,omitempty" yaml:"sampleRate,omitempty" export:"true"` AddInternals bool `description:"Enables tracing for internal services (ping, dashboard, etc...)." json:"addInternals,omitempty" toml:"addInternals,omitempty" yaml:"addInternals,omitempty" export:"true"` @@ -342,19 +341,17 @@ func (c *Configuration) ValidateConfiguration() error { } if c.Tracing != nil && c.Tracing.OTLP != nil { - if c.Tracing.OTLP.HTTP == nil && c.Tracing.OTLP.GRPC == nil { - return errors.New("tracing OTLP: at least one of HTTP and gRPC options should be defined") - } - - if c.Tracing.OTLP.HTTP != nil && c.Tracing.OTLP.GRPC != nil { - return errors.New("tracing OTLP: HTTP and gRPC options are mutually exclusive") - } - if c.Tracing.OTLP.GRPC != nil && c.Tracing.OTLP.GRPC.TLS != nil && c.Tracing.OTLP.GRPC.Insecure { return errors.New("tracing OTLP GRPC: TLS and Insecure options are mutually exclusive") } } + if c.Metrics != nil && c.Metrics.OTLP != nil { + if c.Metrics.OTLP.GRPC != nil && c.Metrics.OTLP.GRPC.TLS != nil && c.Metrics.OTLP.GRPC.Insecure { + return errors.New("metrics OTLP GRPC: TLS and Insecure options are mutually exclusive") + } + } + return nil } diff --git a/pkg/metrics/opentelemetry.go b/pkg/metrics/opentelemetry.go index e866ff5e0..cf9920a25 100644 --- a/pkg/metrics/opentelemetry.go +++ b/pkg/metrics/opentelemetry.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "net" + "net/url" "strings" "sync" "time" @@ -30,7 +31,7 @@ var ( ) // RegisterOpenTelemetry registers all OpenTelemetry metrics. -func RegisterOpenTelemetry(ctx context.Context, config *types.OpenTelemetry) Registry { +func RegisterOpenTelemetry(ctx context.Context, config *types.OTLP) Registry { if openTelemetryMeterProvider == nil { var err error if openTelemetryMeterProvider, err = newOpenTelemetryMeterProvider(ctx, config); err != nil { @@ -123,15 +124,15 @@ func StopOpenTelemetry() { } // newOpenTelemetryMeterProvider creates a new controller.Controller. -func newOpenTelemetryMeterProvider(ctx context.Context, config *types.OpenTelemetry) (*sdkmetric.MeterProvider, error) { +func newOpenTelemetryMeterProvider(ctx context.Context, config *types.OTLP) (*sdkmetric.MeterProvider, error) { var ( exporter sdkmetric.Exporter err error ) if config.GRPC != nil { - exporter, err = newGRPCExporter(ctx, config) + exporter, err = newGRPCExporter(ctx, config.GRPC) } else { - exporter, err = newHTTPExporter(ctx, config) + exporter, err = newHTTPExporter(ctx, config.HTTP) } if err != nil { return nil, fmt.Errorf("creating exporter: %w", err) @@ -168,24 +169,24 @@ func newOpenTelemetryMeterProvider(ctx context.Context, config *types.OpenTeleme return meterProvider, nil } -func newHTTPExporter(ctx context.Context, config *types.OpenTelemetry) (sdkmetric.Exporter, error) { - host, port, err := net.SplitHostPort(config.Address) +func newHTTPExporter(ctx context.Context, config *types.OtelHTTP) (sdkmetric.Exporter, error) { + endpoint, err := url.Parse(config.Endpoint) if err != nil { - return nil, fmt.Errorf("invalid collector address %q: %w", config.Address, err) + return nil, fmt.Errorf("invalid collector endpoint %q: %w", config.Endpoint, err) } opts := []otlpmetrichttp.Option{ - otlpmetrichttp.WithEndpoint(fmt.Sprintf("%s:%s", host, port)), + otlpmetrichttp.WithEndpoint(endpoint.Host), otlpmetrichttp.WithHeaders(config.Headers), otlpmetrichttp.WithCompression(otlpmetrichttp.GzipCompression), } - if config.Insecure { + if endpoint.Scheme == "http" { opts = append(opts, otlpmetrichttp.WithInsecure()) } - if config.Path != "" { - opts = append(opts, otlpmetrichttp.WithURLPath(config.Path)) + if endpoint.Path != "" { + opts = append(opts, otlpmetrichttp.WithURLPath(endpoint.Path)) } if config.TLS != nil { @@ -200,10 +201,10 @@ func newHTTPExporter(ctx context.Context, config *types.OpenTelemetry) (sdkmetri return otlpmetrichttp.New(ctx, opts...) } -func newGRPCExporter(ctx context.Context, config *types.OpenTelemetry) (sdkmetric.Exporter, error) { - host, port, err := net.SplitHostPort(config.Address) +func newGRPCExporter(ctx context.Context, config *types.OtelGRPC) (sdkmetric.Exporter, error) { + host, port, err := net.SplitHostPort(config.Endpoint) if err != nil { - return nil, fmt.Errorf("invalid collector address %q: %w", config.Address, err) + return nil, fmt.Errorf("invalid collector endpoint %q: %w", config.Endpoint, err) } opts := []otlpmetricgrpc.Option{ diff --git a/pkg/metrics/opentelemetry_test.go b/pkg/metrics/opentelemetry_test.go index 28c660357..2e3ea328d 100644 --- a/pkg/metrics/opentelemetry_test.go +++ b/pkg/metrics/opentelemetry_test.go @@ -8,7 +8,6 @@ import ( "io" "net/http" "net/http/httptest" - "net/url" "regexp" "strconv" "testing" @@ -316,14 +315,12 @@ func TestOpenTelemetry(t *testing.T) { ts.Close() }) - sURL, err := url.Parse(ts.URL) - require.NoError(t, err) - - var cfg types.OpenTelemetry + var cfg types.OTLP (&cfg).SetDefaults() cfg.AddRoutersLabels = true - cfg.Address = sURL.Host - cfg.Insecure = true + cfg.HTTP = &types.OtelHTTP{ + Endpoint: ts.URL, + } cfg.PushInterval = ptypes.Duration(10 * time.Millisecond) registry := RegisterOpenTelemetry(context.Background(), &cfg) diff --git a/pkg/middlewares/auth/forward_test.go b/pkg/middlewares/auth/forward_test.go index 461d9b329..57e07314f 100644 --- a/pkg/middlewares/auth/forward_test.go +++ b/pkg/middlewares/auth/forward_test.go @@ -17,6 +17,7 @@ import ( "github.com/traefik/traefik/v3/pkg/testhelpers" "github.com/traefik/traefik/v3/pkg/tracing" "github.com/traefik/traefik/v3/pkg/tracing/opentelemetry" + "github.com/traefik/traefik/v3/pkg/types" "github.com/traefik/traefik/v3/pkg/version" "github.com/vulcand/oxy/v2/forward" "go.opentelemetry.io/otel" @@ -500,7 +501,7 @@ func TestForwardAuthUsesTracing(t *testing.T) { ServiceName: "testApp", SampleRate: 1, OTLP: &opentelemetry.Config{ - HTTP: &opentelemetry.HTTP{ + HTTP: &types.OtelHTTP{ Endpoint: "http://127.0.0.1:8080", }, }, diff --git a/pkg/redactor/redactor_config_test.go b/pkg/redactor/redactor_config_test.go index fe90db3d3..be179561a 100644 --- a/pkg/redactor/redactor_config_test.go +++ b/pkg/redactor/redactor_config_test.go @@ -846,17 +846,17 @@ func TestDo_staticConfiguration(t *testing.T) { config.Tracing = &static.Tracing{ ServiceName: "myServiceName", - Headers: map[string]string{ - "foobar": "foobar", - }, GlobalAttributes: map[string]string{ "foobar": "foobar", }, SampleRate: 42, OTLP: &opentelemetry.Config{ - HTTP: &opentelemetry.HTTP{ + HTTP: &types.OtelHTTP{ Endpoint: "foobar", TLS: nil, + Headers: map[string]string{ + "foobar": "foobar", + }, }, }, } diff --git a/pkg/redactor/testdata/anonymized-static-config.json b/pkg/redactor/testdata/anonymized-static-config.json index d756ba779..a1b7b19ec 100644 --- a/pkg/redactor/testdata/anonymized-static-config.json +++ b/pkg/redactor/testdata/anonymized-static-config.json @@ -344,9 +344,6 @@ }, "tracing": { "serviceName": "myServiceName", - "headers": { - "foobar": "foobar" - }, "globalAttributes": { "foobar": "foobar" }, diff --git a/pkg/tracing/opentelemetry/opentelemetry.go b/pkg/tracing/opentelemetry/opentelemetry.go index 2e13bc20c..24a737206 100644 --- a/pkg/tracing/opentelemetry/opentelemetry.go +++ b/pkg/tracing/opentelemetry/opentelemetry.go @@ -27,44 +27,26 @@ import ( // Config provides configuration settings for the open-telemetry tracer. type Config struct { - GRPC *GRPC `description:"gRPC configuration for the OpenTelemetry collector." json:"grpc,omitempty" toml:"grpc,omitempty" yaml:"grpc,omitempty" export:"true"` - HTTP *HTTP `description:"HTTP configuration for the OpenTelemetry collector." json:"http,omitempty" toml:"http,omitempty" yaml:"http,omitempty" export:"true"` -} - -// GRPC provides configuration settings for the gRPC open-telemetry tracer. -type GRPC struct { - Endpoint string `description:"Sets the gRPC endpoint (host:port) of the collector." json:"endpoint,omitempty" toml:"endpoint,omitempty" yaml:"endpoint,omitempty"` - - Insecure bool `description:"Disables client transport security for the exporter." json:"insecure,omitempty" toml:"insecure,omitempty" yaml:"insecure,omitempty" export:"true"` - TLS *types.ClientTLS `description:"Defines client transport security parameters." json:"tls,omitempty" toml:"tls,omitempty" yaml:"tls,omitempty" export:"true"` + GRPC *types.OtelGRPC `description:"gRPC configuration for the OpenTelemetry collector." json:"grpc,omitempty" toml:"grpc,omitempty" yaml:"grpc,omitempty" export:"true"` + HTTP *types.OtelHTTP `description:"HTTP configuration for the OpenTelemetry collector." json:"http,omitempty" toml:"http,omitempty" yaml:"http,omitempty" export:"true"` } // SetDefaults sets the default values. -func (c *GRPC) SetDefaults() { - c.Endpoint = "localhost:4317" -} - -// HTTP provides configuration settings for the HTTP open-telemetry tracer. -type HTTP struct { - Endpoint string `description:"Sets the HTTP endpoint (scheme://host:port/v1/traces) of the collector." json:"endpoint,omitempty" toml:"endpoint,omitempty" yaml:"endpoint,omitempty"` - TLS *types.ClientTLS `description:"Defines client transport security parameters." json:"tls,omitempty" toml:"tls,omitempty" yaml:"tls,omitempty" export:"true"` -} - -// SetDefaults sets the default values. -func (c *HTTP) SetDefaults() { - c.Endpoint = "localhost:4318" +func (c *Config) SetDefaults() { + c.HTTP = &types.OtelHTTP{} + c.HTTP.SetDefaults() } // Setup sets up the tracer. -func (c *Config) Setup(serviceName string, sampleRate float64, globalAttributes map[string]string, headers map[string]string) (trace.Tracer, io.Closer, error) { +func (c *Config) Setup(serviceName string, sampleRate float64, globalAttributes map[string]string) (trace.Tracer, io.Closer, error) { var ( err error exporter *otlptrace.Exporter ) if c.GRPC != nil { - exporter, err = c.setupGRPCExporter(headers) + exporter, err = c.setupGRPCExporter() } else { - exporter, err = c.setupHTTPExporter(headers) + exporter, err = c.setupHTTPExporter() } if err != nil { return nil, nil, fmt.Errorf("setting up exporter: %w", err) @@ -107,7 +89,7 @@ func (c *Config) Setup(serviceName string, sampleRate float64, globalAttributes return tracerProvider.Tracer("github.com/traefik/traefik"), &tpCloser{provider: tracerProvider}, err } -func (c *Config) setupHTTPExporter(headers map[string]string) (*otlptrace.Exporter, error) { +func (c *Config) setupHTTPExporter() (*otlptrace.Exporter, error) { endpoint, err := url.Parse(c.HTTP.Endpoint) if err != nil { return nil, fmt.Errorf("invalid collector endpoint %q: %w", c.HTTP.Endpoint, err) @@ -115,7 +97,7 @@ func (c *Config) setupHTTPExporter(headers map[string]string) (*otlptrace.Export opts := []otlptracehttp.Option{ otlptracehttp.WithEndpoint(endpoint.Host), - otlptracehttp.WithHeaders(headers), + otlptracehttp.WithHeaders(c.HTTP.Headers), otlptracehttp.WithCompression(otlptracehttp.GzipCompression), } @@ -139,15 +121,15 @@ func (c *Config) setupHTTPExporter(headers map[string]string) (*otlptrace.Export return otlptrace.New(context.Background(), otlptracehttp.NewClient(opts...)) } -func (c *Config) setupGRPCExporter(headers map[string]string) (*otlptrace.Exporter, error) { +func (c *Config) setupGRPCExporter() (*otlptrace.Exporter, error) { host, port, err := net.SplitHostPort(c.GRPC.Endpoint) if err != nil { - return nil, fmt.Errorf("invalid collector address %q: %w", c.GRPC.Endpoint, err) + return nil, fmt.Errorf("invalid collector endpoint %q: %w", c.GRPC.Endpoint, err) } opts := []otlptracegrpc.Option{ otlptracegrpc.WithEndpoint(fmt.Sprintf("%s:%s", host, port)), - otlptracegrpc.WithHeaders(headers), + otlptracegrpc.WithHeaders(c.GRPC.Headers), otlptracegrpc.WithCompressor(gzip.Name), } diff --git a/pkg/tracing/opentelemetry/opentelemetry_test.go b/pkg/tracing/opentelemetry/opentelemetry_test.go index ad7f13a4d..3df441c02 100644 --- a/pkg/tracing/opentelemetry/opentelemetry_test.go +++ b/pkg/tracing/opentelemetry/opentelemetry_test.go @@ -17,6 +17,7 @@ import ( tracingMiddle "github.com/traefik/traefik/v3/pkg/middlewares/tracing" "github.com/traefik/traefik/v3/pkg/tracing" "github.com/traefik/traefik/v3/pkg/tracing/opentelemetry" + "github.com/traefik/traefik/v3/pkg/types" "go.opentelemetry.io/collector/pdata/ptrace/ptraceotlp" ) @@ -74,7 +75,7 @@ func TestTracing(t *testing.T) { ServiceName: "traefik", SampleRate: 1.0, OTLP: &opentelemetry.Config{ - HTTP: &opentelemetry.HTTP{ + HTTP: &types.OtelHTTP{ Endpoint: collector.URL, }, }, diff --git a/pkg/tracing/tracing.go b/pkg/tracing/tracing.go index 79c6cf5d3..4a64ab1b3 100644 --- a/pkg/tracing/tracing.go +++ b/pkg/tracing/tracing.go @@ -20,7 +20,7 @@ import ( // Backend is an abstraction for tracking backend (OpenTelemetry, ...). type Backend interface { - Setup(serviceName string, sampleRate float64, globalAttributes map[string]string, headers map[string]string) (trace.Tracer, io.Closer, error) + Setup(serviceName string, sampleRate float64, globalAttributes map[string]string) (trace.Tracer, io.Closer, error) } // NewTracing Creates a Tracing. @@ -37,7 +37,7 @@ func NewTracing(conf *static.Tracing) (trace.Tracer, io.Closer, error) { backend = defaultBackend } - return backend.Setup(conf.ServiceName, conf.SampleRate, conf.GlobalAttributes, conf.Headers) + return backend.Setup(conf.ServiceName, conf.SampleRate, conf.GlobalAttributes) } // TracerFromContext extracts the trace.Tracer from the given context. diff --git a/pkg/types/metrics.go b/pkg/types/metrics.go index 571666e23..28b151a08 100644 --- a/pkg/types/metrics.go +++ b/pkg/types/metrics.go @@ -12,11 +12,11 @@ import ( type Metrics struct { AddInternals bool `description:"Enables metrics for internal services (ping, dashboard, etc...)." json:"addInternals,omitempty" toml:"addInternals,omitempty" yaml:"addInternals,omitempty" export:"true"` - Prometheus *Prometheus `description:"Prometheus metrics exporter type." json:"prometheus,omitempty" toml:"prometheus,omitempty" yaml:"prometheus,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` - Datadog *Datadog `description:"Datadog metrics exporter type." json:"datadog,omitempty" toml:"datadog,omitempty" yaml:"datadog,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` - StatsD *Statsd `description:"StatsD metrics exporter type." json:"statsD,omitempty" toml:"statsD,omitempty" yaml:"statsD,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` - InfluxDB2 *InfluxDB2 `description:"InfluxDB v2 metrics exporter type." json:"influxDB2,omitempty" toml:"influxDB2,omitempty" yaml:"influxDB2,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` - OpenTelemetry *OpenTelemetry `description:"OpenTelemetry metrics exporter type." json:"openTelemetry,omitempty" toml:"openTelemetry,omitempty" yaml:"openTelemetry,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` + Prometheus *Prometheus `description:"Prometheus metrics exporter type." json:"prometheus,omitempty" toml:"prometheus,omitempty" yaml:"prometheus,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` + Datadog *Datadog `description:"Datadog metrics exporter type." json:"datadog,omitempty" toml:"datadog,omitempty" yaml:"datadog,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` + StatsD *Statsd `description:"StatsD metrics exporter type." json:"statsD,omitempty" toml:"statsD,omitempty" yaml:"statsD,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` + InfluxDB2 *InfluxDB2 `description:"InfluxDB v2 metrics exporter type." json:"influxDB2,omitempty" toml:"influxDB2,omitempty" yaml:"influxDB2,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` + OTLP *OTLP `description:"OpenTelemetry metrics exporter type." json:"otlp,omitempty" toml:"otlp,omitempty" yaml:"otlp,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` } // Prometheus can contain specific configuration used by the Prometheus Metrics exporter. @@ -106,26 +106,23 @@ func (i *InfluxDB2) SetDefaults() { i.AddServicesLabels = true } -// OpenTelemetry contains specific configuration used by the OpenTelemetry Metrics exporter. -type OpenTelemetry struct { - // NOTE: as no gRPC option is implemented yet, the type is empty and is used as a boolean for upward compatibility purposes. - GRPC *struct{} `description:"gRPC specific configuration for the OpenTelemetry collector." json:"grpc,omitempty" toml:"grpc,omitempty" yaml:"grpc,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` +// OTLP contains specific configuration used by the OpenTelemetry Metrics exporter. +type OTLP struct { + GRPC *OtelGRPC `description:"gRPC configuration for the OpenTelemetry collector." json:"grpc,omitempty" toml:"grpc,omitempty" yaml:"grpc,omitempty" export:"true"` + HTTP *OtelHTTP `description:"HTTP configuration for the OpenTelemetry collector." json:"http,omitempty" toml:"http,omitempty" yaml:"http,omitempty" export:"true"` - Address string `description:"Address (host:port) of the collector endpoint." json:"address,omitempty" toml:"address,omitempty" yaml:"address,omitempty"` - AddEntryPointsLabels bool `description:"Enable metrics on entry points." json:"addEntryPointsLabels,omitempty" toml:"addEntryPointsLabels,omitempty" yaml:"addEntryPointsLabels,omitempty" export:"true"` - AddRoutersLabels bool `description:"Enable metrics on routers." json:"addRoutersLabels,omitempty" toml:"addRoutersLabels,omitempty" yaml:"addRoutersLabels,omitempty" export:"true"` - AddServicesLabels bool `description:"Enable metrics on services." json:"addServicesLabels,omitempty" toml:"addServicesLabels,omitempty" yaml:"addServicesLabels,omitempty" export:"true"` - ExplicitBoundaries []float64 `description:"Boundaries for latency metrics." json:"explicitBoundaries,omitempty" toml:"explicitBoundaries,omitempty" yaml:"explicitBoundaries,omitempty" export:"true"` - Headers map[string]string `description:"Headers sent with payload." json:"headers,omitempty" toml:"headers,omitempty" yaml:"headers,omitempty" export:"true"` - Insecure bool `description:"Disables client transport security for the exporter." json:"insecure,omitempty" toml:"insecure,omitempty" yaml:"insecure,omitempty" export:"true"` - Path string `description:"Set the URL path of the collector endpoint." json:"path,omitempty" toml:"path,omitempty" yaml:"path,omitempty" export:"true"` - PushInterval types.Duration `description:"Period between calls to collect a checkpoint." json:"pushInterval,omitempty" toml:"pushInterval,omitempty" yaml:"pushInterval,omitempty" export:"true"` - TLS *ClientTLS `description:"Enable TLS support." json:"tls,omitempty" toml:"tls,omitempty" yaml:"tls,omitempty" export:"true"` + AddEntryPointsLabels bool `description:"Enable metrics on entry points." json:"addEntryPointsLabels,omitempty" toml:"addEntryPointsLabels,omitempty" yaml:"addEntryPointsLabels,omitempty" export:"true"` + AddRoutersLabels bool `description:"Enable metrics on routers." json:"addRoutersLabels,omitempty" toml:"addRoutersLabels,omitempty" yaml:"addRoutersLabels,omitempty" export:"true"` + AddServicesLabels bool `description:"Enable metrics on services." json:"addServicesLabels,omitempty" toml:"addServicesLabels,omitempty" yaml:"addServicesLabels,omitempty" export:"true"` + ExplicitBoundaries []float64 `description:"Boundaries for latency metrics." json:"explicitBoundaries,omitempty" toml:"explicitBoundaries,omitempty" yaml:"explicitBoundaries,omitempty" export:"true"` + PushInterval types.Duration `description:"Period between calls to collect a checkpoint." json:"pushInterval,omitempty" toml:"pushInterval,omitempty" yaml:"pushInterval,omitempty" export:"true"` } // SetDefaults sets the default values. -func (o *OpenTelemetry) SetDefaults() { - o.Address = "localhost:4318" +func (o *OTLP) SetDefaults() { + o.HTTP = &OtelHTTP{} + o.HTTP.SetDefaults() + o.AddEntryPointsLabels = true o.AddServicesLabels = true o.ExplicitBoundaries = []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10} @@ -141,3 +138,28 @@ type Statistics struct { func (s *Statistics) SetDefaults() { s.RecentErrors = 10 } + +// OtelGRPC provides configuration settings for the gRPC open-telemetry. +type OtelGRPC struct { + Endpoint string `description:"Sets the gRPC endpoint (host:port) of the collector." json:"endpoint,omitempty" toml:"endpoint,omitempty" yaml:"endpoint,omitempty"` + Insecure bool `description:"Disables client transport security for the exporter." json:"insecure,omitempty" toml:"insecure,omitempty" yaml:"insecure,omitempty" export:"true"` + TLS *ClientTLS `description:"Defines client transport security parameters." json:"tls,omitempty" toml:"tls,omitempty" yaml:"tls,omitempty" export:"true"` + Headers map[string]string `description:"Headers sent with payload." json:"headers,omitempty" toml:"headers,omitempty" yaml:"headers,omitempty"` +} + +// SetDefaults sets the default values. +func (c *OtelGRPC) SetDefaults() { + c.Endpoint = "localhost:4317" +} + +// OtelHTTP provides configuration settings for the HTTP open-telemetry. +type OtelHTTP struct { + Endpoint string `description:"Sets the HTTP endpoint (scheme://host:port/path) of the collector." json:"endpoint,omitempty" toml:"endpoint,omitempty" yaml:"endpoint,omitempty"` + TLS *ClientTLS `description:"Defines client transport security parameters." json:"tls,omitempty" toml:"tls,omitempty" yaml:"tls,omitempty" export:"true"` + Headers map[string]string `description:"Headers sent with payload." json:"headers,omitempty" toml:"headers,omitempty" yaml:"headers,omitempty"` +} + +// SetDefaults sets the default values. +func (c *OtelHTTP) SetDefaults() { + c.Endpoint = "https://localhost:4318" +}