config: set default tracing sample rate to 1.0 (#5422)

The previous default sample rate of 0.0001 is very low, so traces are
unlikely to be visible after enabling them until many thousands of
requests have been sent. This could be confusing to users.
This commit is contained in:
Joe Kralicky 2025-01-14 13:50:22 -05:00 committed by GitHub
parent c571769adc
commit 6502d68162
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 25 additions and 18 deletions

View file

@ -187,6 +187,10 @@ func (b *Builder) buildMainHTTPConnectionManagerFilter(
return nil, err return nil, err
} }
sampleRate := 1.0
if cfg.Options.TracingSampleRate != nil {
sampleRate = *cfg.Options.TracingSampleRate
}
mgr := &envoy_extensions_filters_network_http_connection_manager.HttpConnectionManager{ mgr := &envoy_extensions_filters_network_http_connection_manager.HttpConnectionManager{
AlwaysSetRequestIdInResponse: true, AlwaysSetRequestIdInResponse: true,
StatPrefix: "ingress", StatPrefix: "ingress",
@ -199,7 +203,7 @@ func (b *Builder) buildMainHTTPConnectionManagerFilter(
HttpProtocolOptions: http1ProtocolOptions, HttpProtocolOptions: http1ProtocolOptions,
RequestTimeout: durationpb.New(cfg.Options.ReadTimeout), RequestTimeout: durationpb.New(cfg.Options.ReadTimeout),
Tracing: &envoy_extensions_filters_network_http_connection_manager.HttpConnectionManager_Tracing{ Tracing: &envoy_extensions_filters_network_http_connection_manager.HttpConnectionManager_Tracing{
RandomSampling: &envoy_type_v3.Percent{Value: cfg.Options.TracingSampleRate * 100}, RandomSampling: &envoy_type_v3.Percent{Value: max(0.0, min(1.0, sampleRate)) * 100},
Provider: tracingProvider, Provider: tracingProvider,
}, },
// See https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_conn_man/headers#x-forwarded-for // See https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_conn_man/headers#x-forwarded-for

View file

@ -52,7 +52,9 @@
}, },
"timeout": "10s" "timeout": "10s"
}, },
"metadataContextNamespaces": ["com.pomerium.client-certificate-info"], "metadataContextNamespaces": [
"com.pomerium.client-certificate-info"
],
"statusOnError": { "statusOnError": {
"code": "InternalServerError" "code": "InternalServerError"
}, },
@ -180,7 +182,7 @@
"statPrefix": "ingress", "statPrefix": "ingress",
"tracing": { "tracing": {
"randomSampling": { "randomSampling": {
"value": 0.01 "value": 100
} }
}, },
"useRemoteAddress": true, "useRemoteAddress": true,

View file

@ -211,8 +211,8 @@ type Options struct {
MetricsClientCAFile string `mapstructure:"metrics_client_ca_file" yaml:"metrics_client_ca_file,omitempty"` MetricsClientCAFile string `mapstructure:"metrics_client_ca_file" yaml:"metrics_client_ca_file,omitempty"`
// Tracing shared settings // Tracing shared settings
TracingProvider string `mapstructure:"tracing_provider" yaml:"tracing_provider,omitempty"` TracingProvider string `mapstructure:"tracing_provider" yaml:"tracing_provider,omitempty"`
TracingSampleRate float64 `mapstructure:"tracing_sample_rate" yaml:"tracing_sample_rate,omitempty"` TracingSampleRate *float64 `mapstructure:"tracing_sample_rate" yaml:"tracing_sample_rate,omitempty"`
// Datadog tracing address // Datadog tracing address
TracingDatadogAddress string `mapstructure:"tracing_datadog_address" yaml:"tracing_datadog_address,omitempty"` TracingDatadogAddress string `mapstructure:"tracing_datadog_address" yaml:"tracing_datadog_address,omitempty"`
@ -317,7 +317,6 @@ var defaultOptions = Options{
GRPCAddr: ":443", GRPCAddr: ":443",
GRPCClientTimeout: 10 * time.Second, // Try to withstand transient service failures for a single request GRPCClientTimeout: 10 * time.Second, // Try to withstand transient service failures for a single request
AuthenticateCallbackPath: "/oauth2/callback", AuthenticateCallbackPath: "/oauth2/callback",
TracingSampleRate: 0.0001,
AutocertOptions: AutocertOptions{ AutocertOptions: AutocertOptions{
Folder: dataDir(), Folder: dataDir(),
@ -1520,7 +1519,7 @@ func (o *Options) ApplySettings(ctx context.Context, certsIndex *cryptutil.Certi
setCertificate(&o.MetricsCertificate, &o.MetricsCertificateKey, settings.MetricsCertificate) setCertificate(&o.MetricsCertificate, &o.MetricsCertificateKey, settings.MetricsCertificate)
set(&o.MetricsClientCA, settings.MetricsClientCa) set(&o.MetricsClientCA, settings.MetricsClientCa)
set(&o.TracingProvider, settings.TracingProvider) set(&o.TracingProvider, settings.TracingProvider)
set(&o.TracingSampleRate, settings.TracingSampleRate) setOptional(&o.TracingSampleRate, settings.TracingSampleRate)
set(&o.TracingDatadogAddress, settings.TracingDatadogAddress) set(&o.TracingDatadogAddress, settings.TracingDatadogAddress)
set(&o.TracingJaegerCollectorEndpoint, settings.TracingJaegerCollectorEndpoint) set(&o.TracingJaegerCollectorEndpoint, settings.TracingJaegerCollectorEndpoint)
set(&o.TracingJaegerAgentEndpoint, settings.TracingJaegerAgentEndpoint) set(&o.TracingJaegerAgentEndpoint, settings.TracingJaegerAgentEndpoint)
@ -1610,7 +1609,7 @@ func (o *Options) ToProto() *config.Config {
settings.MetricsCertificate = toCertificateOrFromFile(o.MetricsCertificate, o.MetricsCertificateKey, o.MetricsCertificateFile, o.MetricsCertificateKeyFile) settings.MetricsCertificate = toCertificateOrFromFile(o.MetricsCertificate, o.MetricsCertificateKey, o.MetricsCertificateFile, o.MetricsCertificateKeyFile)
copySrcToOptionalDest(&settings.MetricsClientCa, valueOrFromFileBase64(o.MetricsClientCA, o.MetricsClientCAFile)) copySrcToOptionalDest(&settings.MetricsClientCa, valueOrFromFileBase64(o.MetricsClientCA, o.MetricsClientCAFile))
copySrcToOptionalDest(&settings.TracingProvider, &o.TracingProvider) copySrcToOptionalDest(&settings.TracingProvider, &o.TracingProvider)
copySrcToOptionalDest(&settings.TracingSampleRate, &o.TracingSampleRate) settings.TracingSampleRate = o.TracingSampleRate
copySrcToOptionalDest(&settings.TracingDatadogAddress, &o.TracingDatadogAddress) copySrcToOptionalDest(&settings.TracingDatadogAddress, &o.TracingDatadogAddress)
copySrcToOptionalDest(&settings.TracingJaegerCollectorEndpoint, &o.TracingJaegerCollectorEndpoint) copySrcToOptionalDest(&settings.TracingJaegerCollectorEndpoint, &o.TracingJaegerCollectorEndpoint)
copySrcToOptionalDest(&settings.TracingJaegerAgentEndpoint, &o.TracingJaegerAgentEndpoint) copySrcToOptionalDest(&settings.TracingJaegerAgentEndpoint, &o.TracingJaegerAgentEndpoint)

View file

@ -19,11 +19,15 @@ type TracingOptions = trace.TracingOptions
// NewTracingOptions builds a new TracingOptions from core Options // NewTracingOptions builds a new TracingOptions from core Options
func NewTracingOptions(o *Options) (*TracingOptions, error) { func NewTracingOptions(o *Options) (*TracingOptions, error) {
sampleRate := 1.0
if o.TracingSampleRate != nil {
sampleRate = *o.TracingSampleRate
}
tracingOpts := TracingOptions{ tracingOpts := TracingOptions{
Provider: o.TracingProvider, Provider: o.TracingProvider,
Service: telemetry.ServiceName(o.Services), Service: telemetry.ServiceName(o.Services),
JaegerAgentEndpoint: o.TracingJaegerAgentEndpoint, JaegerAgentEndpoint: o.TracingJaegerAgentEndpoint,
SampleRate: o.TracingSampleRate, SampleRate: sampleRate,
} }
switch o.TracingProvider { switch o.TracingProvider {

View file

@ -25,13 +25,13 @@ func Test_NewTracingOptions(t *testing.T) {
{ {
"datadog_good", "datadog_good",
&Options{TracingProvider: "datadog"}, &Options{TracingProvider: "datadog"},
&TracingOptions{Provider: "datadog", Service: "pomerium"}, &TracingOptions{Provider: "datadog", Service: "pomerium", SampleRate: 1},
false, false,
}, },
{ {
"jaeger_good", "jaeger_good",
&Options{TracingProvider: "jaeger", TracingJaegerAgentEndpoint: "foo", TracingJaegerCollectorEndpoint: "http://foo", Services: ServiceAll}, &Options{TracingProvider: "jaeger", TracingJaegerAgentEndpoint: "foo", TracingJaegerCollectorEndpoint: "http://foo", Services: ServiceAll},
&TracingOptions{Provider: "jaeger", JaegerAgentEndpoint: "foo", JaegerCollectorEndpoint: &url.URL{Scheme: "http", Host: "foo"}, Service: "pomerium"}, &TracingOptions{Provider: "jaeger", JaegerAgentEndpoint: "foo", JaegerCollectorEndpoint: &url.URL{Scheme: "http", Host: "foo"}, Service: "pomerium", SampleRate: 1},
false, false,
}, },
{ {
@ -43,7 +43,7 @@ func Test_NewTracingOptions(t *testing.T) {
{ {
"zipkin_good", "zipkin_good",
&Options{TracingProvider: "zipkin", ZipkinEndpoint: "https://foo/api/v1/spans", Services: ServiceAuthorize}, &Options{TracingProvider: "zipkin", ZipkinEndpoint: "https://foo/api/v1/spans", Services: ServiceAuthorize},
&TracingOptions{Provider: "zipkin", ZipkinEndpoint: &url.URL{Scheme: "https", Host: "foo", Path: "/api/v1/spans"}, Service: "pomerium-authorize"}, &TracingOptions{Provider: "zipkin", ZipkinEndpoint: &url.URL{Scheme: "https", Host: "foo", Path: "/api/v1/spans"}, Service: "pomerium-authorize", SampleRate: 1},
false, false,
}, },
{ {
@ -118,9 +118,8 @@ func TestTraceManager(t *testing.T) {
defer srv2.Close() defer srv2.Close()
src := NewStaticSource(&Config{Options: &Options{ src := NewStaticSource(&Config{Options: &Options{
TracingProvider: "zipkin", TracingProvider: "zipkin",
ZipkinEndpoint: srv1.URL, ZipkinEndpoint: srv1.URL,
TracingSampleRate: 1,
}}) }})
_ = NewTraceManager(ctx, src) _ = NewTraceManager(ctx, src)
@ -129,9 +128,8 @@ func TestTraceManager(t *testing.T) {
span.End() span.End()
src.SetConfig(ctx, &Config{Options: &Options{ src.SetConfig(ctx, &Config{Options: &Options{
TracingProvider: "zipkin", TracingProvider: "zipkin",
ZipkinEndpoint: srv2.URL, ZipkinEndpoint: srv2.URL,
TracingSampleRate: 1,
}}) }})
_, span = trace.StartSpan(ctx, "Example") _, span = trace.StartSpan(ctx, "Example")