From 6d7c52cd8ab1ea309fd54c1a2ef472fadb84429c Mon Sep 17 00:00:00 2001 From: Kyle Nusbaum Date: Wed, 22 Jul 2020 08:44:23 -0500 Subject: [PATCH] ddtrace/tracer: add support for various environment variables (#696) This PR adds support for the following environment variables: DD__ANALYTICS_ENABLED which enables analytics for the named integration, DD_RUNTIME_METRICS_ENABLED which enables runtime metrics for the tracer DD_TRACE_DEBUG which enables debug mode for the tracer. --- contrib/Shopify/sarama/option.go | 7 ++++++- contrib/aws/aws-sdk-go/aws/option.go | 8 ++++++- .../bradfitz/gomemcache/memcache/option.go | 8 ++++++- .../confluent-kafka-go/kafka/option.go | 4 ++++ contrib/database/sql/option.go | 8 ++++++- contrib/emicklei/go-restful/option.go | 7 ++++++- contrib/garyburd/redigo/option.go | 8 ++++++- contrib/gin-gonic/gin/option.go | 7 ++++++- contrib/globalsign/mgo/option.go | 8 ++++++- contrib/go-chi/chi/option.go | 7 ++++++- contrib/go-redis/redis/option.go | 8 ++++++- .../mongo-driver/mongo/option.go | 8 ++++++- contrib/gocql/gocql/option.go | 8 ++++++- contrib/gomodule/redigo/option.go | 8 ++++++- contrib/google.golang.org/api/option.go | 8 ++++++- contrib/google.golang.org/grpc.v12/option.go | 8 ++++++- contrib/google.golang.org/grpc/option.go | 7 ++++++- contrib/gorilla/mux/option.go | 7 ++++++- contrib/graph-gophers/graphql-go/option.go | 7 ++++++- contrib/hashicorp/consul/option.go | 12 +++++++++-- contrib/hashicorp/vault/option.go | 7 ++++++- contrib/jinzhu/gorm/option.go | 8 ++++++- contrib/julienschmidt/httprouter/option.go | 7 ++++++- contrib/labstack/echo/option.go | 7 ++++++- contrib/net/http/option.go | 7 ++++++- contrib/olivere/elastic/option.go | 8 ++++++- contrib/syndtr/goleveldb/leveldb/option.go | 5 +++++ contrib/tidwall/buntdb/option.go | 8 ++++++- contrib/twitchtv/twirp/option.go | 7 ++++++- contrib/zenazn/goji.v1/web/option.go | 7 ++++++- ddtrace/tracer/option.go | 18 +++++----------- ddtrace/tracer/tracer_test.go | 18 ++++++++++++++++ internal/env.go | 21 +++++++++++++++++++ 33 files changed, 239 insertions(+), 42 deletions(-) create mode 100644 internal/env.go diff --git a/contrib/Shopify/sarama/option.go b/contrib/Shopify/sarama/option.go index 2b6e12cbd2..e5f4512b11 100644 --- a/contrib/Shopify/sarama/option.go +++ b/contrib/Shopify/sarama/option.go @@ -8,6 +8,7 @@ package sarama import ( "math" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" ) @@ -24,7 +25,11 @@ func defaults(cfg *config) { cfg.consumerServiceName = svc } // cfg.analyticsRate = globalconfig.AnalyticsRate() - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_SARAMA_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // An Option is used to customize the config for the sarama tracer. diff --git a/contrib/aws/aws-sdk-go/aws/option.go b/contrib/aws/aws-sdk-go/aws/option.go index f0e0c0b7ab..f8ad5436f4 100644 --- a/contrib/aws/aws-sdk-go/aws/option.go +++ b/contrib/aws/aws-sdk-go/aws/option.go @@ -7,6 +7,8 @@ package aws import ( "math" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type config struct { @@ -19,7 +21,11 @@ type Option func(*config) func defaults(cfg *config) { // cfg.analyticsRate = globalconfig.AnalyticsRate() - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_AWS_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // WithServiceName sets the given service name for the dialled connection. diff --git a/contrib/bradfitz/gomemcache/memcache/option.go b/contrib/bradfitz/gomemcache/memcache/option.go index 73374c94a0..255db90cb0 100644 --- a/contrib/bradfitz/gomemcache/memcache/option.go +++ b/contrib/bradfitz/gomemcache/memcache/option.go @@ -7,6 +7,8 @@ package memcache import ( "math" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" ) const ( @@ -25,7 +27,11 @@ type ClientOption func(*clientConfig) func defaults(cfg *clientConfig) { cfg.serviceName = serviceName // cfg.analyticsRate = globalconfig.AnalyticsRate() - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_MEMCACHE_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // WithServiceName sets the given service name for the dialled connection. diff --git a/contrib/confluentinc/confluent-kafka-go/kafka/option.go b/contrib/confluentinc/confluent-kafka-go/kafka/option.go index 0e5e163c20..b47d2c05a1 100644 --- a/contrib/confluentinc/confluent-kafka-go/kafka/option.go +++ b/contrib/confluentinc/confluent-kafka-go/kafka/option.go @@ -9,6 +9,7 @@ import ( "context" "math" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" ) @@ -30,6 +31,9 @@ func newConfig(opts ...Option) *config { // analyticsRate: globalconfig.AnalyticsRate(), analyticsRate: math.NaN(), } + if internal.BoolEnv("DD_TRACE_KAFKA_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } if svc := globalconfig.ServiceName(); svc != "" { cfg.consumerServiceName = svc } diff --git a/contrib/database/sql/option.go b/contrib/database/sql/option.go index dcfe4e4651..a845cf9b77 100644 --- a/contrib/database/sql/option.go +++ b/contrib/database/sql/option.go @@ -7,6 +7,8 @@ package sql import ( "math" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type config struct { @@ -26,7 +28,11 @@ type RegisterOption = Option func defaults(cfg *config) { // default cfg.serviceName set in Register based on driver name // cfg.analyticsRate = globalconfig.AnalyticsRate() - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_SQL_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // WithServiceName sets the given service name when registering a driver, diff --git a/contrib/emicklei/go-restful/option.go b/contrib/emicklei/go-restful/option.go index ae6a7dab17..62e7191e04 100644 --- a/contrib/emicklei/go-restful/option.go +++ b/contrib/emicklei/go-restful/option.go @@ -8,6 +8,7 @@ package restful import ( "math" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" ) @@ -17,9 +18,13 @@ type config struct { } func newConfig() *config { + rate := globalconfig.AnalyticsRate() + if internal.BoolEnv("DD_TRACE_RESTFUL_ANALYTICS_ENABLED", false) { + rate = 1.0 + } return &config{ serviceName: "go-restful", - analyticsRate: globalconfig.AnalyticsRate(), + analyticsRate: rate, } } diff --git a/contrib/garyburd/redigo/option.go b/contrib/garyburd/redigo/option.go index afc4f32fb8..be53f931fb 100644 --- a/contrib/garyburd/redigo/option.go +++ b/contrib/garyburd/redigo/option.go @@ -7,6 +7,8 @@ package redigo // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/garyburd/redig import ( "math" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type dialConfig struct { @@ -20,7 +22,11 @@ type DialOption func(*dialConfig) func defaults(cfg *dialConfig) { cfg.serviceName = "redis.conn" // cfg.analyticsRate = globalconfig.AnalyticsRate() - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_REDIGO_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // WithServiceName sets the given service name for the dialled connection. diff --git a/contrib/gin-gonic/gin/option.go b/contrib/gin-gonic/gin/option.go index 67d12be4b5..994c1809fe 100644 --- a/contrib/gin-gonic/gin/option.go +++ b/contrib/gin-gonic/gin/option.go @@ -10,6 +10,7 @@ import ( "net/http" "github.com/gin-gonic/gin" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" ) @@ -19,8 +20,12 @@ type config struct { } func newConfig() *config { + rate := globalconfig.AnalyticsRate() + if internal.BoolEnv("DD_TRACE_GIN_ANALYTICS_ENABLED", false) { + rate = 1.0 + } return &config{ - analyticsRate: globalconfig.AnalyticsRate(), + analyticsRate: rate, resourceNamer: defaultResourceNamer, } } diff --git a/contrib/globalsign/mgo/option.go b/contrib/globalsign/mgo/option.go index b47203a0f6..d7f3f22625 100644 --- a/contrib/globalsign/mgo/option.go +++ b/contrib/globalsign/mgo/option.go @@ -8,6 +8,8 @@ package mgo import ( "context" "math" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type mongoConfig struct { @@ -17,11 +19,15 @@ type mongoConfig struct { } func newConfig() *mongoConfig { + rate := math.NaN() + if internal.BoolEnv("DD_TRACE_GIN_ANALYTICS_ENABLED", false) { + rate = 1.0 + } return &mongoConfig{ serviceName: "mongodb", ctx: context.Background(), // analyticsRate: globalconfig.AnalyticsRate(), - analyticsRate: math.NaN(), + analyticsRate: rate, } } diff --git a/contrib/go-chi/chi/option.go b/contrib/go-chi/chi/option.go index d3f5a49c33..1db67384bb 100644 --- a/contrib/go-chi/chi/option.go +++ b/contrib/go-chi/chi/option.go @@ -9,6 +9,7 @@ import ( "math" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" ) @@ -26,7 +27,11 @@ func defaults(cfg *config) { if svc := globalconfig.ServiceName(); svc != "" { cfg.serviceName = svc } - cfg.analyticsRate = globalconfig.AnalyticsRate() + if internal.BoolEnv("DD_TRACE_CHI_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = globalconfig.AnalyticsRate() + } } // WithServiceName sets the given service name for the router. diff --git a/contrib/go-redis/redis/option.go b/contrib/go-redis/redis/option.go index 7ba36ea598..cae7b01159 100644 --- a/contrib/go-redis/redis/option.go +++ b/contrib/go-redis/redis/option.go @@ -7,6 +7,8 @@ package redis // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/go-redis/redis" import ( "math" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type clientConfig struct { @@ -20,7 +22,11 @@ type ClientOption func(*clientConfig) func defaults(cfg *clientConfig) { cfg.serviceName = "redis.client" // cfg.analyticsRate = globalconfig.AnalyticsRate() - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_REDIS_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // WithServiceName sets the given service name for the client. diff --git a/contrib/go.mongodb.org/mongo-driver/mongo/option.go b/contrib/go.mongodb.org/mongo-driver/mongo/option.go index 8f2765fd33..06c8ae6605 100644 --- a/contrib/go.mongodb.org/mongo-driver/mongo/option.go +++ b/contrib/go.mongodb.org/mongo-driver/mongo/option.go @@ -7,6 +7,8 @@ package mongo import ( "math" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type config struct { @@ -20,7 +22,11 @@ type Option func(*config) func defaults(cfg *config) { cfg.serviceName = "mongo" // cfg.analyticsRate = globalconfig.AnalyticsRate() - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_MONGO_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // WithServiceName sets the given service name for the dialled connection. diff --git a/contrib/gocql/gocql/option.go b/contrib/gocql/gocql/option.go index ec2c05eff1..1061d8b1f6 100644 --- a/contrib/gocql/gocql/option.go +++ b/contrib/gocql/gocql/option.go @@ -7,6 +7,8 @@ package gocql import ( "math" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type queryConfig struct { @@ -21,7 +23,11 @@ type WrapOption func(*queryConfig) func defaults(cfg *queryConfig) { cfg.serviceName = "gocql.query" // cfg.analyticsRate = globalconfig.AnalyticsRate() - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_GOCQL_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // WithServiceName sets the given service name for the returned query. diff --git a/contrib/gomodule/redigo/option.go b/contrib/gomodule/redigo/option.go index 369cc4f61d..55e85052d2 100644 --- a/contrib/gomodule/redigo/option.go +++ b/contrib/gomodule/redigo/option.go @@ -7,6 +7,8 @@ package redigo // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/gomodule/redig import ( "math" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type dialConfig struct { @@ -20,7 +22,11 @@ type DialOption func(*dialConfig) func defaults(cfg *dialConfig) { cfg.serviceName = "redis.conn" // cfg.analyticsRate = globalconfig.AnalyticsRate() - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_REDIGO_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // WithServiceName sets the given service name for the dialled connection. diff --git a/contrib/google.golang.org/api/option.go b/contrib/google.golang.org/api/option.go index a5c2ca3452..b6f7dc83a6 100644 --- a/contrib/google.golang.org/api/option.go +++ b/contrib/google.golang.org/api/option.go @@ -8,6 +8,8 @@ package api import ( "context" "math" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type config struct { @@ -18,10 +20,14 @@ type config struct { } func newConfig(options ...Option) *config { + rate := math.NaN() + if internal.BoolEnv("DD_TRACE_GOOGLE_API_ANALYTICS_ENABLED", false) { + rate = 1.0 + } cfg := &config{ ctx: context.Background(), // analyticsRate: globalconfig.AnalyticsRate(), - analyticsRate: math.NaN(), + analyticsRate: rate, } for _, opt := range options { opt(cfg) diff --git a/contrib/google.golang.org/grpc.v12/option.go b/contrib/google.golang.org/grpc.v12/option.go index 358c33941c..264b9027ec 100644 --- a/contrib/google.golang.org/grpc.v12/option.go +++ b/contrib/google.golang.org/grpc.v12/option.go @@ -7,6 +7,8 @@ package grpc import ( "math" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type interceptorConfig struct { @@ -21,7 +23,11 @@ type InterceptorOption func(*interceptorConfig) func defaults(cfg *interceptorConfig) { // cfg.serviceName default set in interceptor // cfg.analyticsRate = globalconfig.AnalyticsRate() - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_GRPC_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // WithServiceName sets the given service name for the intercepted client. diff --git a/contrib/google.golang.org/grpc/option.go b/contrib/google.golang.org/grpc/option.go index d14a70b37f..71ba4c3a87 100644 --- a/contrib/google.golang.org/grpc/option.go +++ b/contrib/google.golang.org/grpc/option.go @@ -8,6 +8,7 @@ package grpc import ( "math" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" "google.golang.org/grpc/codes" @@ -58,7 +59,11 @@ func defaults(cfg *config) { cfg.traceStreamMessages = true cfg.nonErrorCodes = map[codes.Code]bool{codes.Canceled: true} // cfg.analyticsRate = globalconfig.AnalyticsRate() - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_GRPC_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } cfg.ignoredMetadata = map[string]struct{}{ "x-datadog-trace-id": {}, "x-datadog-parent-id": {}, diff --git a/contrib/gorilla/mux/option.go b/contrib/gorilla/mux/option.go index b7f34c55be..f03ce3e39c 100644 --- a/contrib/gorilla/mux/option.go +++ b/contrib/gorilla/mux/option.go @@ -11,6 +11,7 @@ import ( "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" ) @@ -26,7 +27,11 @@ type routerConfig struct { type RouterOption func(*routerConfig) func defaults(cfg *routerConfig) { - cfg.analyticsRate = globalconfig.AnalyticsRate() + if internal.BoolEnv("DD_TRACE_MUX_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = globalconfig.AnalyticsRate() + } cfg.serviceName = "mux.router" if svc := globalconfig.ServiceName(); svc != "" { cfg.serviceName = svc diff --git a/contrib/graph-gophers/graphql-go/option.go b/contrib/graph-gophers/graphql-go/option.go index b1e4eebb25..d6267e57a9 100644 --- a/contrib/graph-gophers/graphql-go/option.go +++ b/contrib/graph-gophers/graphql-go/option.go @@ -8,6 +8,7 @@ package graphql import ( "math" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" ) @@ -25,7 +26,11 @@ func defaults(cfg *config) { cfg.serviceName = svc } // cfg.analyticsRate = globalconfig.AnalyticsRate() - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_GRAPHQL_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // WithServiceName sets the given service name for the client. diff --git a/contrib/hashicorp/consul/option.go b/contrib/hashicorp/consul/option.go index 1807ed2e96..c28fdc67c1 100644 --- a/contrib/hashicorp/consul/option.go +++ b/contrib/hashicorp/consul/option.go @@ -5,7 +5,11 @@ package consul -import "math" +import ( + "math" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" +) const ( serviceName = "consul" @@ -21,7 +25,11 @@ type ClientOption func(*clientConfig) func defaults(cfg *clientConfig) { cfg.serviceName = serviceName - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_CONSUL_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // WithServiceName sets the given service name for the client. diff --git a/contrib/hashicorp/vault/option.go b/contrib/hashicorp/vault/option.go index d3dfafe04d..e320f419ce 100644 --- a/contrib/hashicorp/vault/option.go +++ b/contrib/hashicorp/vault/option.go @@ -8,6 +8,7 @@ package vault import ( "math" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" ) @@ -23,7 +24,11 @@ type Option func(*config) func defaults(cfg *config) { cfg.serviceName = defaultServiceName - cfg.analyticsRate = globalconfig.AnalyticsRate() + if internal.BoolEnv("DD_TRACE_VAULT_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = globalconfig.AnalyticsRate() + } } // WithAnalytics enables or disables Trace Analytics for all started spans. diff --git a/contrib/jinzhu/gorm/option.go b/contrib/jinzhu/gorm/option.go index 02e3a3f7b9..7b799adbfe 100644 --- a/contrib/jinzhu/gorm/option.go +++ b/contrib/jinzhu/gorm/option.go @@ -7,6 +7,8 @@ package gorm import ( "math" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type config struct { @@ -21,7 +23,11 @@ type Option func(*config) func defaults(cfg *config) { cfg.serviceName = "gorm.db" // cfg.analyticsRate = globalconfig.AnalyticsRate() - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_GORM_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // WithServiceName sets the given service name when registering a driver, diff --git a/contrib/julienschmidt/httprouter/option.go b/contrib/julienschmidt/httprouter/option.go index 122a45bf7a..6c79026952 100644 --- a/contrib/julienschmidt/httprouter/option.go +++ b/contrib/julienschmidt/httprouter/option.go @@ -9,6 +9,7 @@ import ( "math" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" ) @@ -22,7 +23,11 @@ type routerConfig struct { type RouterOption func(*routerConfig) func defaults(cfg *routerConfig) { - cfg.analyticsRate = globalconfig.AnalyticsRate() + if internal.BoolEnv("DD_TRACE_HTTPROUTER_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = globalconfig.AnalyticsRate() + } cfg.serviceName = "http.router" if svc := globalconfig.ServiceName(); svc != "" { cfg.serviceName = svc diff --git a/contrib/labstack/echo/option.go b/contrib/labstack/echo/option.go index c9658e647d..d7be127d29 100644 --- a/contrib/labstack/echo/option.go +++ b/contrib/labstack/echo/option.go @@ -8,6 +8,7 @@ package echo import ( "math" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" ) @@ -24,7 +25,11 @@ func defaults(cfg *config) { if svc := globalconfig.ServiceName(); svc != "" { cfg.serviceName = svc } - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_ECHO_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // WithServiceName sets the given service name for the system. diff --git a/contrib/net/http/option.go b/contrib/net/http/option.go index 2d276a8af6..b9c156cd1a 100644 --- a/contrib/net/http/option.go +++ b/contrib/net/http/option.go @@ -12,6 +12,7 @@ import ( "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" ) @@ -29,7 +30,11 @@ type MuxOption = Option type Option func(*config) func defaults(cfg *config) { - cfg.analyticsRate = globalconfig.AnalyticsRate() + if internal.BoolEnv("DD_TRACE_HTTP_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = globalconfig.AnalyticsRate() + } cfg.serviceName = "http.router" if svc := globalconfig.ServiceName(); svc != "" { cfg.serviceName = svc diff --git a/contrib/olivere/elastic/option.go b/contrib/olivere/elastic/option.go index 4c6a61b45a..9d627b27a7 100644 --- a/contrib/olivere/elastic/option.go +++ b/contrib/olivere/elastic/option.go @@ -8,6 +8,8 @@ package elastic import ( "math" "net/http" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type clientConfig struct { @@ -25,7 +27,11 @@ func defaults(cfg *clientConfig) { cfg.transport = http.DefaultTransport.(*http.Transport) cfg.resourceNamer = quantize // cfg.analyticsRate = globalconfig.AnalyticsRate() - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_ELASTIC_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // WithServiceName sets the given service name for the client. diff --git a/contrib/syndtr/goleveldb/leveldb/option.go b/contrib/syndtr/goleveldb/leveldb/option.go index 7c0d01d131..420d811499 100644 --- a/contrib/syndtr/goleveldb/leveldb/option.go +++ b/contrib/syndtr/goleveldb/leveldb/option.go @@ -8,6 +8,8 @@ package leveldb import ( "context" "math" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type config struct { @@ -23,6 +25,9 @@ func newConfig(opts ...Option) *config { // cfg.analyticsRate: globalconfig.AnalyticsRate(), analyticsRate: math.NaN(), } + if internal.BoolEnv("DD_TRACE_LEVELDB_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } for _, opt := range opts { opt(cfg) } diff --git a/contrib/tidwall/buntdb/option.go b/contrib/tidwall/buntdb/option.go index 8838dd104d..2788616c84 100644 --- a/contrib/tidwall/buntdb/option.go +++ b/contrib/tidwall/buntdb/option.go @@ -8,6 +8,8 @@ package buntdb import ( "context" "math" + + "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type config struct { @@ -20,7 +22,11 @@ func defaults(cfg *config) { cfg.serviceName = "buntdb" cfg.ctx = context.Background() // cfg.analyticsRate = globalconfig.AnalyticsRate() - cfg.analyticsRate = math.NaN() + if internal.BoolEnv("DD_TRACE_BUNTDB_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } } // An Option customizes the config. diff --git a/contrib/twitchtv/twirp/option.go b/contrib/twitchtv/twirp/option.go index f996dfce97..861285b038 100644 --- a/contrib/twitchtv/twirp/option.go +++ b/contrib/twitchtv/twirp/option.go @@ -8,6 +8,7 @@ package twirp import ( "math" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" ) @@ -20,7 +21,11 @@ type config struct { type Option func(*config) func defaults(cfg *config) { - cfg.analyticsRate = globalconfig.AnalyticsRate() + if internal.BoolEnv("DD_TRACE_TWIRP_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = globalconfig.AnalyticsRate() + } } func (cfg *config) serverServiceName() string { diff --git a/contrib/zenazn/goji.v1/web/option.go b/contrib/zenazn/goji.v1/web/option.go index a9aa111dc3..e5c80726c4 100644 --- a/contrib/zenazn/goji.v1/web/option.go +++ b/contrib/zenazn/goji.v1/web/option.go @@ -10,6 +10,7 @@ import ( "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" ) @@ -24,7 +25,11 @@ type config struct { type Option func(*config) func defaults(cfg *config) { - cfg.analyticsRate = globalconfig.AnalyticsRate() + if internal.BoolEnv("DD_TRACE_GOJI_ANALYTICS_ENABLED", false) { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = globalconfig.AnalyticsRate() + } cfg.serviceName = "http.router" } diff --git a/ddtrace/tracer/option.go b/ddtrace/tracer/option.go index 7f3e6046d6..f0cc0161fd 100644 --- a/ddtrace/tracer/option.go +++ b/ddtrace/tracer/option.go @@ -12,12 +12,12 @@ import ( "os" "path/filepath" "runtime" - "strconv" "strings" "time" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" + "gopkg.in/DataDog/dd-trace-go.v1/internal" "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" "gopkg.in/DataDog/dd-trace-go.v1/internal/log" "gopkg.in/DataDog/dd-trace-go.v1/internal/version" @@ -109,7 +109,7 @@ func newConfig(opts ...StartOption) *config { } c.dogstatsdAddr = net.JoinHostPort(statsdHost, statsdPort) - if boolEnv("DD_TRACE_ANALYTICS_ENABLED", false) { + if internal.BoolEnv("DD_TRACE_ANALYTICS_ENABLED", false) { globalconfig.SetAnalyticsRate(1.0) } if os.Getenv("DD_TRACE_REPORT_HOSTNAME") == "true" { @@ -145,7 +145,9 @@ func newConfig(opts ...StartOption) *config { } } } - c.logStartup = boolEnv("DD_TRACE_STARTUP_LOGS", true) + c.logStartup = internal.BoolEnv("DD_TRACE_STARTUP_LOGS", true) + c.runtimeMetrics = internal.BoolEnv("DD_RUNTIME_METRICS_ENABLED", false) + c.debug = internal.BoolEnv("DD_TRACE_DEBUG", false) for _, fn := range opts { fn(c) } @@ -496,13 +498,3 @@ func StackFrames(n, skip uint) FinishOption { cfg.SkipStackFrames = skip } } - -// boolEnv returns the parsed boolean value of an environment variable, or -// def if it fails to parse. -func boolEnv(key string, def bool) bool { - v, err := strconv.ParseBool(os.Getenv(key)) - if err != nil { - return def - } - return v -} diff --git a/ddtrace/tracer/tracer_test.go b/ddtrace/tracer/tracer_test.go index 4d0cc78ae5..78faa8903c 100644 --- a/ddtrace/tracer/tracer_test.go +++ b/ddtrace/tracer/tracer_test.go @@ -226,6 +226,24 @@ func TestTracerRuntimeMetrics(t *testing.T) { assert.Contains(t, tp.Lines()[0], "DEBUG: Runtime metrics enabled") }) + t.Run("env", func(t *testing.T) { + os.Setenv("DD_RUNTIME_METRICS_ENABLED", "true") + defer os.Unsetenv("DD_RUNTIME_METRICS_ENABLED") + tp := new(testLogger) + tracer := newTracer(WithLogger(tp), WithDebugMode(true)) + defer tracer.Stop() + assert.Contains(t, tp.Lines()[0], "DEBUG: Runtime metrics enabled") + }) + + t.Run("overrideEnv", func(t *testing.T) { + os.Setenv("DD_RUNTIME_METRICS_ENABLED", "false") + defer os.Unsetenv("DD_RUNTIME_METRICS_ENABLED") + tp := new(testLogger) + tracer := newTracer(WithRuntimeMetrics(), WithLogger(tp), WithDebugMode(true)) + defer tracer.Stop() + assert.Contains(t, tp.Lines()[0], "DEBUG: Runtime metrics enabled") + }) + t.Run("off", func(t *testing.T) { tp := new(testLogger) tracer := newTracer(WithLogger(tp), WithDebugMode(true)) diff --git a/internal/env.go b/internal/env.go new file mode 100644 index 0000000000..27ac0ac162 --- /dev/null +++ b/internal/env.go @@ -0,0 +1,21 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-2020 Datadog, Inc. + +package internal + +import ( + "os" + "strconv" +) + +// BoolEnv returns the parsed boolean value of an environment variable, or +// def otherwise. +func BoolEnv(key string, def bool) bool { + v, err := strconv.ParseBool(os.Getenv(key)) + if err != nil { + return def + } + return v +}