diff --git a/CHANGELOG.md b/CHANGELOG.md index a83a76ca81b6..8c7127560ec7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,11 @@ Main (unreleased) - Fix issue on Windows where DNS short names were unresolvable. (@rfratto) +- (Agent static mode) Jaeger remote sampling works again, through a new `jaeger_remote_sampling` + entry in the traces config. It is no longer configurable through the jaeger receiver. + Support Jaeger remote sampling was removed accidentally in v0.35, and it is now restored, + albeit via a different config entry. + v0.35.2 (2023-07-27) -------------------- @@ -135,6 +140,10 @@ v0.35.0 (2023-07-18) - The `remote_sampling` block has been removed from `otelcol.receiver.jaeger`. (@ptodev) +- (Agent static mode) Jaeger remote sampling used to be configured using the Jaeger receiver configuration. + This receiver was updated to a new version, where support for remote sampling in the receiver was removed. + Jaeger remote sampling is available as a separate configuration field starting in v0.35.3. (@ptodev) + ### Deprecations - `otelcol.exporter.jaeger` has been deprecated and will be removed in Agent v0.38.0. (@ptodev) diff --git a/docs/sources/static/configuration/traces-config.md b/docs/sources/static/configuration/traces-config.md index 9b1806d73c36..d0c9fe89bc96 100644 --- a/docs/sources/static/configuration/traces-config.md +++ b/docs/sources/static/configuration/traces-config.md @@ -42,9 +42,9 @@ name: [ batch: ] remote_write: - # host:port to send traces to + # host:port to send traces to. # Here must be the port of gRPC receiver, not the Tempo default port. - # Example for cloud instances: `tempo-us-central1.grafana.net:443` + # Example for cloud instances: `tempo-us-central1.grafana.net:443` # For local / on-premises instances: `localhost:55680` or `tempo.example.com:14250` # Note: for non-encrypted connections you must also set `insecure: true` - endpoint: @@ -77,30 +77,55 @@ remote_write: # Configures opentelemetry exporters to use the OpenTelemetry auth extension `oauth2clientauthextension`. # Can not be used in combination with `basic_auth`. - # See https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/extension/oauth2clientauthextension/README.md + # See https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/v0.80.0/extension/oauth2clientauthextension/README.md oauth2: # Configures the TLS settings specific to the oauth2 client # The client identifier issued to the oauth client [ client_id: ] # The secret string associated with the oauth client [ client_secret: ] + # Additional parameters for requests to the token endpoint + [ endpoint_params: ] # The resource server's token endpoint URL [ token_url: ] # Optional, requested permissions associated with the oauth client [ scopes: [] ] # Optional, specifies the timeout fetching tokens from the token_url. Default: no timeout [ timeout: ] + # TLS client configuration for the underneath client to authorization server. + # https://github.com/open-telemetry/opentelemetry-collector/blob/v0.80.0/config/configtls/README.md tls: # Disable validation of the server certificate. [ insecure: | default = false ] + # InsecureSkipVerify will enable TLS but not verify the certificate. + [ insecure_skip_verify: | default = false ] + # ServerName requested by client for virtual hosting. + # This sets the ServerName in the TLSConfig. Please refer to + # https://godoc.org/crypto/tls#Config for more information. + [ server_name_override: ] # Path to the CA cert. For a client this verifies the server certificate. If empty uses system root CA. [ ca_file: ] + # In memory PEM encoded cert. + [ ca_pem: ] # Path to the TLS cert to use for TLS required connections [ cert_file: ] + # In memory PEM encoded TLS cert to use for TLS required connections. + [ cert_pem: ] # Path to the TLS key to use for TLS required connections [ key_file: ] - - # Controls TLS settings of the exporter's client. See https://github.com/open-telemetry/opentelemetry-collector/blob/v0.21.0/config/configtls/README.md + # In memory PEM encoded TLS key to use for TLS required connections. + [ key_pem: ] + # Minimum acceptable TLS version. + [ min_version: | default = "1.2" ] + # Maximum acceptable TLS version. + # If not set, it is handled by crypto/tls - currently it is "1.3". + [ max_version: | default = "" ] + # ReloadInterval specifies the duration after which the certificate will be reloaded. + # If not set, it will never be reloaded. + [ reload_interval: ] + + # Controls TLS settings of the exporter's client: + # https://prometheus.io/docs/prometheus/2.45/configuration/configuration/#tls_config # This should be used only if `insecure` is set to false tls_config: # Path to the CA cert. For a client this verifies the server certificate. If empty uses system root CA. @@ -163,7 +188,7 @@ automatic_logging: # Receiver configurations are mapped directly into the OpenTelemetry receivers # block. At least one receiver is required. -# The Agent uses OpenTelemetry v0.36.0. Refer to the corresponding receiver's config. +# The Agent uses OpenTelemetry v0.80.0. Refer to the corresponding receiver's config. # # Supported receivers: otlp, jaeger, kafka, opencensus and zipkin. receivers: @@ -292,7 +317,16 @@ load_balancing: [ - ... ] dns: hostname: - [ port: ] + [ port: | default = 4317 ] + # Resolver interval + [ interval: | default = 5s ] + # Resolver timeout + [ timeout: | default = 1s ] + + # routing_key can be either "traceID" or "service": + # * "service": exports spans based on their service name. + # * "traceID": exports spans based on their traceID. + [ routing_key: | default = "traceID" ] # receiver_port is the port the instance will use to receive load balanced traces receiver_port: [ | default = 4318 ] @@ -374,22 +408,41 @@ service_graphs: # grpc status codes not to be considered as failure grpc: [ - ... ] + +# jaeger_remote_sampling configures one or more jaeger remote sampling extensions. +# For more details about the configuration please consult the OpenTelemetry documentation: +# https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.80.0/extension/jaegerremotesampling +# +# Example config: +# +# jaeger_remote_sampling: +# - source: +# remote: +# endpoint: jaeger-collector:14250 +# tls: +# insecure: true +# - source: +# reload_interval: 1s +# file: /etc/otelcol/sampling_strategies.json +# +jaeger_remote_sampling: + [ - ... ] ``` > **Note:** More information on the following types can be found on the > documentation for their respective projects: > -* [`attributes.config`: OpenTelemetry-Collector](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/b2327211df976e0a57ef0425493448988772a16b/processor/attributesprocessor) -* [`batch.config`: OpenTelemetry-Collector](https://github.com/open-telemetry/opentelemetry-collector/tree/1f5dd9f9a566a937ec15093ca3bc377fba86f5f9/processor/batchprocessor) -* [`otlpexporter.sending_queue`: OpenTelemetry-Collector](https://github.com/open-telemetry/opentelemetry-collector/tree/1f5dd9f9a566a937ec15093ca3bc377fba86f5f9/exporter/otlpexporter) -* [`otlpexporter.retry_on_failure`: OpenTelemetry-Collector](https://github.com/open-telemetry/opentelemetry-collector/tree/1f5dd9f9a566a937ec15093ca3bc377fba86f5f9/exporter/otlpexporter) +* [`attributes.config`: OpenTelemetry-Collector](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.80.0/processor/attributesprocessor) +* [`batch.config`: OpenTelemetry-Collector](https://github.com/open-telemetry/opentelemetry-collector/tree/v0.80.0/processor/batchprocessor) +* [`otlpexporter.sending_queue`: OpenTelemetry-Collector](https://github.com/open-telemetry/opentelemetry-collector/tree/v0.80.0/exporter/otlpexporter) +* [`otlpexporter.retry_on_failure`: OpenTelemetry-Collector](https://github.com/open-telemetry/opentelemetry-collector/tree/v0.80.0/exporter/otlpexporter) * `receivers`: - * [`jaegerreceiver`: OpenTelemetry-Collector-Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/b2327211df976e0a57ef0425493448988772a16b/receiver/jaegerreceiver) - * [`kafkareceiver`: OpenTelemetry-Collector-Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/b2327211df976e0a57ef0425493448988772a16b/receiver/kafkareceiver) - * [`otlpreceiver`: OpenTelemetry-Collector](https://github.com/open-telemetry/opentelemetry-collector/tree/1f5dd9f9a566a937ec15093ca3bc377fba86f5f9/receiver/otlpreceiver) - * [`opencensusreceiver`: OpenTelemetry-Collector-Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/b2327211df976e0a57ef0425493448988772a16b/receiver/opencensusreceiver) - * [`zipkinreceiver`: OpenTelemetry-Collector-Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/b2327211df976e0a57ef0425493448988772a16b/receiver/zipkinreceiver) + * [`jaegerreceiver`: OpenTelemetry-Collector-Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.80.0/receiver/jaegerreceiver) + * [`kafkareceiver`: OpenTelemetry-Collector-Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.80.0/receiver/kafkareceiver) + * [`otlpreceiver`: OpenTelemetry-Collector](https://github.com/open-telemetry/opentelemetry-collector/tree/v0.80.0/receiver/otlpreceiver) + * [`opencensusreceiver`: OpenTelemetry-Collector-Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.80.0/receiver/opencensusreceiver) + * [`zipkinreceiver`: OpenTelemetry-Collector-Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.80.0/receiver/zipkinreceiver) * [`scrape_config`: Prometheus](https://prometheus.io/docs/prometheus/2.45/configuration/configuration/#scrape_config) -* [`spanmetricsprocessor.latency_histogram_buckets`: OpenTelemetry-Collector-Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/b2327211df976e0a57ef0425493448988772a16b/processor/spanmetricsprocessor/config.go#L38-L47) -* [`spanmetricsprocessor.dimensions`: OpenTelemetry-Collector-Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/b2327211df976e0a57ef0425493448988772a16b/processor/spanmetricsprocessor/config.go#L38-L47) -* [`tailsamplingprocessor.policies`: OpenTelemetry-Collector-Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/b2327211df976e0a57ef0425493448988772a16b/processor/tailsamplingprocessor) +* [`spanmetricsprocessor.latency_histogram_buckets`: OpenTelemetry-Collector-Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/v0.80.0/processor/spanmetricsprocessor/config.go#L37-L39) +* [`spanmetricsprocessor.dimensions`: OpenTelemetry-Collector-Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/v0.80.0/processor/spanmetricsprocessor/config.go#L41-L48) +* [`tailsamplingprocessor.policies`: OpenTelemetry-Collector-Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.80.0/processor/tailsamplingprocessor) diff --git a/docs/sources/static/upgrade-guide.md b/docs/sources/static/upgrade-guide.md index 0c65e75f83ef..3a1e8727b211 100644 --- a/docs/sources/static/upgrade-guide.md +++ b/docs/sources/static/upgrade-guide.md @@ -22,6 +22,33 @@ static mode. ## v0.35 +### Breaking change: Jaeger remote sampling no longer configurable using the Jaeger receiver + +Jaeger remote sampling used to be configured using the Jaeger receiver configuration. This receiver was updated to a new version, where support for remote sampling in the receiver was removed. + +Jaeger remote sampling is available as a separate configuration field starting in v0.35.3. + +Old configuration example: + +```yaml +receivers: + jaeger: + protocols: + grpc: + remote_sampling: + strategy_file: /etc/agent/strategies.json + strategy_file_reload_interval: 1s +``` + +New configuration example: + +```yaml +jaeger_remote_sampling: + - source: + file: /etc/agent/strategies.json + reload_interval: 1s +``` + ### Breaking change: `auth` and `version` attributes from `walk_params` block of SNMP integration have been removed The SNMP integrations (both v1 and v2) wrap a new version of SNMP exporter which introduces a new configuration file format. diff --git a/go.mod b/go.mod index db1b38132a61..d92573303c00 100644 --- a/go.mod +++ b/go.mod @@ -106,6 +106,7 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.80.0 github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.80.0 github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.80.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling v0.80.0 github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.80.0 github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.80.0 github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.80.0 @@ -551,7 +552,7 @@ require ( github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d // indirect github.com/soheilhy/cmux v0.1.5 // indirect github.com/spf13/afero v1.9.5 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.15.0 // indirect diff --git a/go.sum b/go.sum index cd2dbb3fa16d..53ad90bd8b2a 100644 --- a/go.sum +++ b/go.sum @@ -2722,6 +2722,8 @@ github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokena github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.80.0/go.mod h1:1uefCMOB5VnqgP5F22GeSoqkm8pYbWUmxFHBUg54WnE= github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.80.0 h1:1g6IDFOWzDpZScQRb+80G54DlPaCckkITJ3l0gUS/dk= github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.80.0/go.mod h1:j6U+t0w0uKYSltgY3s+4BskNVOj7E3+OxGFs3FPOTZs= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling v0.80.0 h1:hglhSIcQRNd/5yuak0LFd1rsH4/rP3hTIaU8/LaOaHY= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling v0.80.0/go.mod h1:C677/QL+Oav+yqeLaCIFOXw7qQAw1Pm4sqTmVwIM7M0= github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.80.0 h1:4+k4uS/pDLbkh2yMmMXSycKHq6oEycWpJToh/SUxLIM= github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.80.0/go.mod h1:YJrHRLfgBQBt8RT5p61Fbkx01KuesGlrpZzOTIE3Mfw= github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.80.0 h1:bDOzezMdoK2m5Q7h/kzd5qBZRqX1B4hrIIzxKiDuFLE= @@ -3164,8 +3166,9 @@ github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= diff --git a/pkg/traces/config.go b/pkg/traces/config.go index 472f65f3ea22..26fef4795dd5 100644 --- a/pkg/traces/config.go +++ b/pkg/traces/config.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "net" + "net/url" "os" "sort" "strings" @@ -14,6 +15,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/jaegerexporter" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter" + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanmetricsprocessor" @@ -36,6 +38,7 @@ import ( "go.opentelemetry.io/collector/receiver" "go.opentelemetry.io/collector/receiver/otlpreceiver" "go.uber.org/multierr" + "gopkg.in/yaml.v2" "github.com/grafana/agent/pkg/logs" "github.com/grafana/agent/pkg/traces/automaticloggingprocessor" @@ -69,6 +72,9 @@ const ( // otlp receiver otlpReceiverName = "otlp" + + // A string to print out when marshaling "secrets" strings, like passwords. + secretMarshalString = "" ) // Config controls the configuration of Traces trace pipelines. @@ -117,13 +123,16 @@ type InstanceConfig struct { // RemoteWrite defines one or multiple backends that can receive the pipeline's traffic. RemoteWrite []RemoteWriteConfig `yaml:"remote_write,omitempty"` - // Receivers: https://github.com/open-telemetry/opentelemetry-collector/blob/7d7ae2eb34b5d387627875c498d7f43619f37ee3/receiver/README.md + // Receivers: + // https://github.com/open-telemetry/opentelemetry-collector/blob/v0.80.0/receiver/README.md Receivers ReceiverMap `yaml:"receivers,omitempty"` - // Batch: https://github.com/open-telemetry/opentelemetry-collector/blob/7d7ae2eb34b5d387627875c498d7f43619f37ee3/processor/batchprocessor/config.go#L24 + // Batch: + // https://github.com/open-telemetry/opentelemetry-collector/tree/v0.80.0/processor/batchprocessor Batch map[string]interface{} `yaml:"batch,omitempty"` - // Attributes: https://github.com/open-telemetry/opentelemetry-collector/blob/7d7ae2eb34b5d387627875c498d7f43619f37ee3/processor/attributesprocessor/config.go#L30 + // Attributes: + // https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.80.0/processor Attributes map[string]interface{} `yaml:"attributes,omitempty"` // prom service discovery config @@ -131,20 +140,54 @@ type InstanceConfig struct { OperationType string `yaml:"prom_sd_operation_type,omitempty"` PodAssociations []string `yaml:"prom_sd_pod_associations,omitempty"` - // SpanMetricsProcessor: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/spanmetricsprocessor/README.md + // SpanMetricsProcessor: + // https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.80.0/processor/spanmetricsprocessor SpanMetrics *SpanMetricsConfig `yaml:"spanmetrics,omitempty"` // AutomaticLogging AutomaticLogging *automaticloggingprocessor.AutomaticLoggingConfig `yaml:"automatic_logging,omitempty"` // TailSampling defines a sampling strategy for the pipeline + // https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.80.0/processor/tailsamplingprocessor TailSampling *tailSamplingConfig `yaml:"tail_sampling,omitempty"` // LoadBalancing is used to distribute spans of the same trace to the same agent instance + // https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.80.0/exporter/loadbalancingexporter LoadBalancing *loadBalancingConfig `yaml:"load_balancing"` // ServiceGraphs ServiceGraphs *serviceGraphsConfig `yaml:"service_graphs,omitempty"` + + // Jaeger's Remote Sampling extension: + // https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.80.0/extension/jaegerremotesampling + JaegerRemoteSampling []JaegerRemoteSamplingConfig `yaml:"jaeger_remote_sampling"` +} + +// A string type for secrets like passwords. +// Hides the value of the string during marshaling. +type SecretString string + +var ( + _ yaml.Marshaler = (*SecretString)(nil) +) + +// MarshalYAML implements yaml.Marshaler. +func (s SecretString) MarshalYAML() (interface{}, error) { + return secretMarshalString, nil +} + +// JaegerRemoteSamplingMap is a set of Jaeger Remote Sampling extensions. +// Because receivers may be configured with an unknown set of sensitive information, +// ReceiverMap will marshal as YAML to the text "". +type JaegerRemoteSamplingConfig map[string]interface{} + +var ( + _ yaml.Marshaler = (*JaegerRemoteSamplingConfig)(nil) +) + +// MarshalYAML implements yaml.Marshaler. +func (jrsm JaegerRemoteSamplingConfig) MarshalYAML() (interface{}, error) { + return secretMarshalString, nil } // ReceiverMap stores a set of receivers. Because receivers may be configured @@ -152,6 +195,11 @@ type InstanceConfig struct { // YAML to the text "". type ReceiverMap map[string]interface{} +var ( + _ yaml.Marshaler = (*ReceiverMap)(nil) + _ yaml.Unmarshaler = (*ReceiverMap)(nil) +) + // UnmarshalYAML implements yaml.Unmarshaler. func (r *ReceiverMap) UnmarshalYAML(unmarshal func(interface{}) error) error { type plain ReceiverMap @@ -193,7 +241,7 @@ func (r *ReceiverMap) UnmarshalYAML(unmarshal func(interface{}) error) error { // MarshalYAML implements yaml.Marshaler. func (r ReceiverMap) MarshalYAML() (interface{}, error) { - return "", nil + return secretMarshalString, nil } const ( @@ -217,25 +265,30 @@ var DefaultRemoteWriteConfig = RemoteWriteConfig{ // TLSClientSetting configures the oauth2client extension TLS; compatible with configtls.TLSClientSetting type TLSClientSetting struct { - CAFile string `yaml:"ca_file,omitempty"` - CertFile string `yaml:"cert_file,omitempty"` - KeyFile string `yaml:"key_file,omitempty"` - MinVersion string `yaml:"min_version,omitempty"` - MaxVersion string `yaml:"max_version,omitempty"` - Insecure bool `yaml:"insecure"` - InsecureSkipVerify bool `yaml:"insecure_skip_verify"` - ServerNameOverride string `yaml:"server_name_override,omitempty"` + CAFile string `yaml:"ca_file,omitempty"` + CAPem SecretString `yaml:"ca_pem,omitempty"` + CertFile string `yaml:"cert_file,omitempty"` + CertPem SecretString `yaml:"cert_pem,omitempty"` + KeyFile string `yaml:"key_file,omitempty"` + KeyPem SecretString `yaml:"key_pem,omitempty"` + MinVersion string `yaml:"min_version,omitempty"` + MaxVersion string `yaml:"max_version,omitempty"` + ReloadInterval time.Duration `yaml:"reload_interval"` + Insecure bool `yaml:"insecure"` + InsecureSkipVerify bool `yaml:"insecure_skip_verify"` + ServerNameOverride string `yaml:"server_name_override,omitempty"` } // OAuth2Config configures the oauth2client extension for a remote_write exporter // compatible with oauth2clientauthextension.Config type OAuth2Config struct { - ClientID string `yaml:"client_id"` - ClientSecret string `yaml:"client_secret"` - TokenURL string `yaml:"token_url"` - Scopes []string `yaml:"scopes,omitempty"` - TLS TLSClientSetting `yaml:"tls,omitempty"` - Timeout time.Duration `yaml:"timeout,omitempty"` + ClientID string `yaml:"client_id"` + ClientSecret SecretString `yaml:"client_secret"` + EndpointParams url.Values `yaml:"endpoint_params,omitempty"` + TokenURL string `yaml:"token_url"` + Scopes []string `yaml:"scopes,omitempty"` + TLS TLSClientSetting `yaml:"tls,omitempty"` + Timeout time.Duration `yaml:"timeout,omitempty"` } // Agent uses standard YAML unmarshalling, while the oauth2clientauthextension relies on @@ -272,8 +325,8 @@ type RemoteWriteConfig struct { BasicAuth *prom_config.BasicAuth `yaml:"basic_auth,omitempty"` Oauth2 *OAuth2Config `yaml:"oauth2,omitempty"` Headers map[string]string `yaml:"headers,omitempty"` - SendingQueue map[string]interface{} `yaml:"sending_queue,omitempty"` // https://github.com/open-telemetry/opentelemetry-collector/blob/7d7ae2eb34b5d387627875c498d7f43619f37ee3/exporter/exporterhelper/queued_retry.go#L30 - RetryOnFailure map[string]interface{} `yaml:"retry_on_failure,omitempty"` // https://github.com/open-telemetry/opentelemetry-collector/blob/7d7ae2eb34b5d387627875c498d7f43619f37ee3/exporter/exporterhelper/queued_retry.go#L54 + SendingQueue map[string]interface{} `yaml:"sending_queue,omitempty"` // https://github.com/open-telemetry/opentelemetry-collector/blob/v0.80.0/exporter/exporterhelper/queued_retry.go + RetryOnFailure map[string]interface{} `yaml:"retry_on_failure,omitempty"` // https://github.com/open-telemetry/opentelemetry-collector/blob/v0.80.0/exporter/exporterhelper/queued_retry.go } // UnmarshalYAML implements yaml.Unmarshaler. @@ -317,7 +370,7 @@ type SpanMetricsConfig struct { // tailSamplingConfig is the configuration for tail-based sampling type tailSamplingConfig struct { // Policies are the strategies used for sampling. Multiple policies can be used in the same pipeline. - // For more information, refer to https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/tailsamplingprocessor + // For more information, refer to https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.80.0/processor/tailsamplingprocessor Policies []policy `yaml:"policies"` // DecisionWait defines the time to wait for a complete trace before making a decision DecisionWait time.Duration `yaml:"decision_wait,omitempty"` @@ -342,6 +395,7 @@ type loadBalancingConfig struct { Resolver map[string]interface{} `yaml:"resolver"` // ReceiverPort is the port the instance will use to receive load balanced traces ReceiverPort string `yaml:"receiver_port"` + RoutingKey string `yaml:"routing_key,omitempty"` } // exporterConfig defined the config for an otlp exporter for load balancing @@ -503,6 +557,15 @@ func (c *InstanceConfig) extensions() (map[string]interface{}, error) { } extensions[getAuthExtensionName(exporterName)] = oauthConfig } + if c.JaegerRemoteSampling != nil { + if len(c.JaegerRemoteSampling) == 0 { + return nil, fmt.Errorf("at least one jaeger_remote_sampling configuration must be specified") + } + for i, jrsConfig := range c.JaegerRemoteSampling { + extName := fmt.Sprintf("jaegerremotesampling/%d", i) + extensions[extName] = jrsConfig + } + } return extensions, nil } @@ -544,12 +607,13 @@ func (c *InstanceConfig) loadBalancingExporter() (map[string]interface{}, error) "protocol": map[string]interface{}{ "otlp": exporter, }, - "resolver": resolverCfg, + "resolver": resolverCfg, + "routing_key": c.LoadBalancing.RoutingKey, }, nil } // formatPolicies creates sampling policies (i.e. rules) compatible with OTel's tail sampling processor -// https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.46.0/processor/tailsamplingprocessor +// https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.80.0/processor/tailsamplingprocessor func formatPolicies(cfg []policy) ([]map[string]interface{}, error) { policies := make([]map[string]interface{}, 0, len(cfg)) for i, policy := range cfg { @@ -812,6 +876,7 @@ func (c *InstanceConfig) otelConfig() (*otelcol.Config, error) { func tracingFactories() (otelcol.Factories, error) { extensions, err := extension.MakeFactoryMap( oauth2clientauthextension.NewFactory(), + jaegerremotesampling.NewFactory(), ) if err != nil { return otelcol.Factories{}, err diff --git a/pkg/traces/config_test.go b/pkg/traces/config_test.go index 30285c316b8e..fc5fff7c6c75 100644 --- a/pkg/traces/config_test.go +++ b/pkg/traces/config_test.go @@ -313,19 +313,21 @@ service: `, }, { - name: "jaeger receiver remote_sampling TLS config", + name: "jaeger remote sampling multiple configs", cfg: ` receivers: jaeger: protocols: grpc: - remote_sampling: - host_endpoint: example:54321 - strategy_file: file_path - tls: - insecure: true - insecure_skip_verify: true - server_name_override: hostname +jaeger_remote_sampling: + - source: + remote: + endpoint: jaeger-collector:14250 + tls: + insecure: true + - source: + reload_interval: 1s + file: /etc/otelcol/sampling_strategies.json remote_write: - endpoint: example.com:12345 `, @@ -335,13 +337,6 @@ receivers: jaeger: protocols: grpc: - remote_sampling: - host_endpoint: example:54321 - strategy_file: file_path - tls: - insecure: true - insecure_skip_verify: true - server_name_override: hostname exporters: otlp/0: endpoint: example.com:12345 @@ -349,13 +344,24 @@ exporters: retry_on_failure: max_elapsed_time: 60s processors: {} -extensions: {} +extensions: + jaegerremotesampling/0: + source: + remote: + endpoint: jaeger-collector:14250 + tls: + insecure: true + jaegerremotesampling/1: + source: + reload_interval: 1s + file: /etc/otelcol/sampling_strategies.json service: pipelines: traces: exporters: ["otlp/0"] processors: [] receivers: ["push_receiver", "jaeger"] + extensions: ["jaegerremotesampling/0", "jaegerremotesampling/1"] `, }, { @@ -756,13 +762,16 @@ tail_sampling: - value1 - value2 load_balancing: - receiver_port: 8080 + receiver_port: 8181 + routing_key: service exporter: insecure: true resolver: dns: hostname: agent - port: 8080 + port: 8282 + interval: 12m + timeout: 76s `, expectedConfig: ` receivers: @@ -773,7 +782,7 @@ receivers: otlp/lb: protocols: grpc: - endpoint: "0.0.0.0:8080" + endpoint: "0.0.0.0:8181" exporters: otlp/0: endpoint: example.com:12345 @@ -781,6 +790,7 @@ exporters: retry_on_failure: max_elapsed_time: 60s loadbalancing: + routing_key: service protocol: otlp: tls: @@ -792,7 +802,9 @@ exporters: resolver: dns: hostname: agent - port: 8080 + port: 8282 + interval: 12m + timeout: 76s processors: tail_sampling: decision_wait: 5s @@ -1204,7 +1216,7 @@ service: `, }, { - name: "oauth2 TLS", + name: "oauth2 TLS with certs and keys from files", cfg: ` receivers: jaeger: @@ -1216,14 +1228,19 @@ remote_write: oauth2: client_id: someclientid client_secret: someclientsecret + endpoint_params: + audience: [someaudience] token_url: https://example.com/oauth2/default/v1/token scopes: ["api.metrics"] timeout: 2s tls: insecure: true + insecure_skip_verify: true ca_file: /var/lib/mycert.pem cert_file: certfile key_file: keyfile + min_version: 1.3 + reload_interval: 1h `, expectedConfig: ` receivers: @@ -1235,14 +1252,87 @@ extensions: oauth2client/otlphttp0: client_id: someclientid client_secret: someclientsecret + endpoint_params: + audience: someaudience token_url: https://example.com/oauth2/default/v1/token scopes: ["api.metrics"] timeout: 2s tls: insecure: true + insecure_skip_verify: true ca_file: /var/lib/mycert.pem cert_file: certfile key_file: keyfile + min_version: 1.3 + reload_interval: 1h +exporters: + otlphttp/0: + endpoint: example.com:12345 + compression: gzip + retry_on_failure: + max_elapsed_time: 60s + auth: + authenticator: oauth2client/otlphttp0 +processors: {} +service: + extensions: ["oauth2client/otlphttp0"] + pipelines: + traces: + exporters: ["otlphttp/0"] + processors: [] + receivers: ["push_receiver", "jaeger"] +`, + }, + { + name: "oauth2 TLS with certs and keys from strings", + cfg: ` +receivers: + jaeger: + protocols: + grpc: +remote_write: + - endpoint: example.com:12345 + protocol: http + oauth2: + client_id: someclientid + client_secret: someclientsecret + endpoint_params: + audience: [someaudience] + token_url: https://example.com/oauth2/default/v1/token + scopes: ["api.metrics"] + timeout: 2s + tls: + insecure: true + insecure_skip_verify: true + ca_pem: test_secret_ca_pem_string + cert_pem: test_secret_cert_pem_string + key_pem: test_secret_key_pem_string + max_version: 1.2 + reload_interval: 1h +`, + expectedConfig: ` +receivers: + push_receiver: {} + jaeger: + protocols: + grpc: +extensions: + oauth2client/otlphttp0: + client_id: someclientid + client_secret: someclientsecret + endpoint_params: + audience: someaudience + token_url: https://example.com/oauth2/default/v1/token + scopes: ["api.metrics"] + timeout: 2s + tls: + insecure: true + insecure_skip_verify: true + ca_pem: test_secret_ca_pem_string + cert_pem: test_secret_cert_pem_string + key_pem: test_secret_key_pem_string + max_version: 1.2 + reload_interval: 1h exporters: otlphttp/0: endpoint: example.com:12345