diff --git a/agent/agent.go b/agent/agent.go index 34c21369..71f35f31 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -19,7 +19,6 @@ import ( "github.com/opentracing/opentracing-go" "go.undefinedlabs.com/scopeagent/config" - "go.undefinedlabs.com/scopeagent/env" scopeError "go.undefinedlabs.com/scopeagent/errors" "go.undefinedlabs.com/scopeagent/instrumentation" "go.undefinedlabs.com/scopeagent/runner" @@ -64,6 +63,8 @@ var ( testingModeFrequency = time.Second nonTestingModeFrequency = time.Minute + + cfg = config.Get() ) func WithApiKey(apiKey string) Option { @@ -194,13 +195,13 @@ func NewAgent(options ...Option) (*Agent, error) { agent.logger = log.New(ioutil.Discard, "", 0) } - agent.debugMode = agent.debugMode || env.ScopeDebug.Value + agent.debugMode = agent.debugMode || *cfg.Debug configProfile := GetConfigCurrentProfile() if agent.apiKey == "" || agent.apiEndpoint == "" { - if dsn, set := env.ScopeDsn.Tuple(); set && dsn != "" { - dsnApiKey, dsnApiEndpoint, dsnErr := parseDSN(dsn) + if cfg.Dsn != nil && *cfg.Dsn != "" { + dsnApiKey, dsnApiEndpoint, dsnErr := parseDSN(*cfg.Dsn) if dsnErr != nil { agent.logger.Printf("Error parsing dsn value: %v\n", dsnErr) } else { @@ -213,8 +214,8 @@ func NewAgent(options ...Option) (*Agent, error) { } if agent.apiKey == "" { - if apiKey, set := env.ScopeApiKey.Tuple(); set && apiKey != "" { - agent.apiKey = apiKey + if cfg.ApiKey != nil && *cfg.ApiKey != "" { + agent.apiKey = *cfg.ApiKey } else if configProfile != nil { agent.logger.Println("API key found in the native app configuration") agent.apiKey = configProfile.ApiKey @@ -226,12 +227,13 @@ func NewAgent(options ...Option) (*Agent, error) { } if agent.apiEndpoint == "" { - if endpoint, set := env.ScopeApiEndpoint.Tuple(); set && endpoint != "" { - agent.apiEndpoint = endpoint + if cfg.ApiEndpoint != nil && *cfg.ApiEndpoint != "" { + agent.apiEndpoint = *cfg.ApiEndpoint } else if configProfile != nil { agent.logger.Println("API endpoint found in the native app configuration") agent.apiEndpoint = configProfile.ApiEndpoint } else { + endpoint := "https://app.scope.dev" agent.logger.Printf("using default endpoint: %v\n", endpoint) agent.apiEndpoint = endpoint } @@ -271,13 +273,19 @@ func NewAgent(options ...Option) (*Agent, error) { agent.metadata[tags.GoVersion] = runtime.Version() // Service name - addElementToMapIfEmpty(agent.metadata, tags.Service, env.ScopeService.Value) + if cfg.Service != nil { + addElementToMapIfEmpty(agent.metadata, tags.Service, *cfg.Service) + } // Configurations - addElementToMapIfEmpty(agent.metadata, tags.ConfigurationKeys, env.ScopeConfiguration.Value) + if cfg.Configuration != nil { + addElementToMapIfEmpty(agent.metadata, tags.ConfigurationKeys, cfg.Configuration) + } // Metadata - addToMapIfEmpty(agent.metadata, env.ScopeMetadata.Value) + if cfg.Metadata != nil { + addToMapIfEmpty(agent.metadata, cfg.Metadata) + } // Git data addToMapIfEmpty(agent.metadata, getGitInfoFromEnv()) @@ -292,26 +300,26 @@ func NewAgent(options ...Option) (*Agent, error) { agent.metadata[tags.Dependencies] = getDependencyMap() // Expand '~' in source root - var sourceRoot string if sRoot, ok := agent.metadata[tags.SourceRoot]; ok { if sRootEx, err := homedir.Expand(sRoot.(string)); err == nil { - sourceRoot = sRootEx agent.metadata[tags.SourceRoot] = sRootEx } } if !agent.testingMode { - if env.ScopeTestingMode.IsSet { - agent.testingMode = env.ScopeTestingMode.Value + if cfg.TestingMode != nil { + agent.testingMode = *cfg.TestingMode } else { agent.testingMode = agent.metadata[tags.CI].(bool) } } - if agent.failRetriesCount == 0 { - agent.failRetriesCount = env.ScopeTestingFailRetries.Value + if agent.failRetriesCount == 0 && cfg.Instrumentation.TestsFrameworks.FailRetries != nil { + agent.failRetriesCount = *cfg.Instrumentation.TestsFrameworks.FailRetries + } + if cfg.Instrumentation.TestsFrameworks.PanicAsFail != nil { + agent.panicAsFail = agent.panicAsFail || *cfg.Instrumentation.TestsFrameworks.PanicAsFail } - agent.panicAsFail = agent.panicAsFail || env.ScopeTestingPanicAsFail.Value if agent.debugMode { agent.logMetadata() @@ -339,10 +347,7 @@ func NewAgent(options ...Option) (*Agent, error) { }) instrumentation.SetTracer(agent.tracer) instrumentation.SetLogger(agent.logger) - if err := config.Load(path.Join(sourceRoot, "scope.yml")); err != nil { - agent.logger.Println(err) - } - if agent.setGlobalTracer || env.ScopeTracerGlobal.Value { + if agent.setGlobalTracer || (cfg.Tracer.Global != nil && *cfg.Tracer.Global) { opentracing.SetGlobalTracer(agent.Tracer()) } @@ -408,8 +413,8 @@ func generateAgentID() string { } func getLogPath() (string, error) { - if env.ScopeLoggerRoot.IsSet { - return env.ScopeLoggerRoot.Value, nil + if cfg.Logger.Root != nil { + return *cfg.Logger.Root, nil } logFolder := "" diff --git a/agent/agent_test.go b/agent/agent_test.go index 7cb2f79a..e9f40009 100644 --- a/agent/agent_test.go +++ b/agent/agent_test.go @@ -8,7 +8,7 @@ import ( "testing" "time" - "go.undefinedlabs.com/scopeagent/env" + "go.undefinedlabs.com/scopeagent/config" "go.undefinedlabs.com/scopeagent/tags" ) @@ -133,7 +133,9 @@ func sameElements(a, b []string) bool { } func TestTildeExpandRaceMetadata(t *testing.T) { - env.ScopeSourceRoot.Value = "~/scope" + cfg := config.Get() + sroot := "~/scope" + cfg.SourceRoot = &sroot agent, err := NewAgent(WithApiKey("123"), WithTestingModeEnabled()) if err != nil { t.Fatal(err) diff --git a/agent/git.go b/agent/git.go index b2b5c716..7e9e8aa1 100644 --- a/agent/git.go +++ b/agent/git.go @@ -8,7 +8,6 @@ import ( "github.com/google/uuid" - "go.undefinedlabs.com/scopeagent/env" "go.undefinedlabs.com/scopeagent/tags" ) @@ -62,6 +61,10 @@ func getGitData() *GitData { } func getGitDiff() *GitDiff { + if cfg.Instrumentation.DiffSummary != nil && !*cfg.Instrumentation.DiffSummary { + return nil + } + var diff string if diffBytes, err := exec.Command("git", "diff", "--numstat").Output(); err == nil { diff = string(diffBytes) @@ -128,17 +131,17 @@ func getGitInfoFromGitFolder() map[string]interface{} { func getGitInfoFromEnv() map[string]interface{} { gitInfo := map[string]interface{}{} - if repository, set := env.ScopeRepository.Tuple(); set && repository != "" { - gitInfo[tags.Repository] = repository + if cfg.Repository != nil && *cfg.Repository != "" { + gitInfo[tags.Repository] = *cfg.Repository } - if commit, set := env.ScopeCommitSha.Tuple(); set && commit != "" { - gitInfo[tags.Commit] = commit + if cfg.CommitSha != nil && *cfg.CommitSha != "" { + gitInfo[tags.Commit] = *cfg.CommitSha } - if sourceRoot, set := env.ScopeSourceRoot.Tuple(); set && sourceRoot != "" { - gitInfo[tags.SourceRoot] = sourceRoot + if cfg.SourceRoot != nil && *cfg.SourceRoot != "" { + gitInfo[tags.SourceRoot] = *cfg.SourceRoot } - if branch, set := env.ScopeBranch.Tuple(); set && branch != "" { - gitInfo[tags.Branch] = branch + if cfg.Branch != nil && *cfg.Branch != "" { + gitInfo[tags.Branch] = *cfg.Branch } return gitInfo diff --git a/config/types.go b/config/types.go index 1878a524..ce4ea65c 100644 --- a/config/types.go +++ b/config/types.go @@ -4,7 +4,7 @@ type ( ScopeConfig struct { Dsn *string `env:"SCOPE_DSN"` ApiKey *string `env:"SCOPE_APIKEY"` - ApiEndpoint *string `env:"SCOPE_API_ENDPOINT" default:"https://app.scope.dev"` + ApiEndpoint *string `env:"SCOPE_API_ENDPOINT"` Service *string `yaml:"service" env:"SCOPE_SERVICE" default:"default"` Repository *string `yaml:"repository" env:"SCOPE_REPOSITORY"` CommitSha *string `yaml:"commit_sha" env:"SCOPE_COMMIT_SHA"` @@ -17,12 +17,13 @@ type ( Instrumentation InstrumentationConfig `yaml:"instrumentation"` Tracer TracerConfig `yaml:"tracer"` Debug *bool `env:"SCOPE_DEBUG" default:"false"` + ConfigPath *string + LoadError error } LoggerConfig struct { Root *string `yaml:"root" env:"SCOPE_LOGGER_ROOT, SCOPE_LOG_ROOT_PATH"` } InstrumentationConfig struct { - Enabled *bool `yaml:"enabled" env:"SCOPE_INSTRUMENTATION_ENABLED" default:"true"` DiffSummary *bool `yaml:"diff_summary" env:"SCOPE_INSTRUMENTATION_DIFF_SUMMARY" default:"true"` TestsFrameworks InstrumentationTestsFrameworksConfig `yaml:"tests_frameworks"` DB InstrumentationDatabaseConfig `yaml:"db"` diff --git a/config/vars.go b/config/vars.go index 2172655d..08006de7 100644 --- a/config/vars.go +++ b/config/vars.go @@ -1,12 +1,14 @@ package config import ( + "errors" + "fmt" + "github.com/undefinedlabs/go-env" + "gopkg.in/yaml.v2" "io/ioutil" "os" + "path/filepath" "sync" - - env "github.com/undefinedlabs/go-env" - "gopkg.in/yaml.v2" ) var ( @@ -15,31 +17,63 @@ var ( ) func Get() *ScopeConfig { + // We check is already loaded with a reader lock m.RLock() - defer m.RUnlock() - - return current -} + if current != nil { + defer m.RUnlock() + return current + } + m.RUnlock() -func Load(filePath string) error { + // Is not loaded we block to load it m.Lock() defer m.Unlock() - - file, err := os.Open(filePath) + if current != nil { + return current + } + var config ScopeConfig + content, path, err := readConfigurationFile() + if err == nil { + config.ConfigPath = path + _ = yaml.Unmarshal(content, &config) + if config.Metadata != nil { + for k, v := range config.Metadata { + if str, ok := v.(string); ok { + config.Metadata[k] = os.ExpandEnv(str) + } + } + } + } else { + config.LoadError = err + } + _, err = env.UnmarshalFromEnviron(&config) if err != nil { - return err + config.LoadError = err } - content, err := ioutil.ReadAll(file) + current = &config + return current +} + +func readConfigurationFile() ([]byte, *string, error) { + dir, err := os.Getwd() if err != nil { - return err + return nil, nil, err } + for { + rel, _ := filepath.Rel("/", dir) + // Exit the loop once we reach the basePath. + if rel == "." { + break + } - var config ScopeConfig - yamlErr := yaml.Unmarshal(content, &config) - _, envErr := env.UnmarshalFromEnviron(&config) - if yamlErr != nil && envErr != nil { - return envErr + path := fmt.Sprintf("%v/scope.yml", dir) + dat, err := ioutil.ReadFile(path) + if err == nil { + return dat, &path, nil + } + + // Going up! + dir += "/.." } - current = &config - return nil + return nil, nil, errors.New("configuration not found") } diff --git a/env/types.go b/env/types.go deleted file mode 100644 index fe395bda..00000000 --- a/env/types.go +++ /dev/null @@ -1,148 +0,0 @@ -package env - -import ( - "fmt" - "os" - "strconv" - "strings" -) - -type ( - eVar struct { - Key string - Raw string - IsSet bool - } - - BooleanEnvVar struct { - eVar - Value bool - } - - IntEnvVar struct { - eVar - Value int - } - - StringEnvVar struct { - eVar - Value string - } - - SliceEnvVar struct { - eVar - Value []string - } - - MapEnvVar struct { - eVar - Value map[string]interface{} - } -) - -func newEVar(keys ...string) eVar { - var e eVar - for _, key := range keys { - value, ok := os.LookupEnv(key) - e = eVar{ - Key: key, - Raw: value, - IsSet: ok, - } - if ok { - break - } - } - return e -} - -func newBooleanEnvVar(defaultValue bool, keys ...string) BooleanEnvVar { - envVar := BooleanEnvVar{eVar: newEVar(keys...)} - if !envVar.IsSet { - envVar.Value = defaultValue - return envVar - } - value, err := strconv.ParseBool(envVar.Raw) - if err != nil { - panic(fmt.Sprintf("unable to parse %s - should be 'true' or 'false'", envVar.Key)) - } - envVar.Value = value - return envVar -} - -func newIntEnvVar(defaultValue int, keys ...string) IntEnvVar { - envVar := IntEnvVar{eVar: newEVar(keys...)} - if !envVar.IsSet { - envVar.Value = defaultValue - return envVar - } - value, err := strconv.ParseInt(envVar.Raw, 0, 0) - if err != nil { - panic(fmt.Sprintf("unable to parse %s - does not seem to be an int", envVar.Key)) - } - envVar.Value = int(value) - return envVar -} - -func newStringEnvVar(defaultValue string, keys ...string) StringEnvVar { - envVar := StringEnvVar{eVar: newEVar(keys...)} - if !envVar.IsSet { - envVar.Value = defaultValue - return envVar - } - envVar.Value = envVar.Raw - return envVar -} - -func newSliceEnvVar(defaultValue []string, keys ...string) SliceEnvVar { - envVar := SliceEnvVar{eVar: newEVar(keys...)} - if !envVar.IsSet { - envVar.Value = defaultValue - return envVar - } - val := strings.Split(envVar.Raw, ",") - for i := range val { - val[i] = strings.TrimSpace(val[i]) - } - envVar.Value = val - return envVar -} - -func newMapEnvVar(defaultValue map[string]interface{}, keys ...string) MapEnvVar { - envVar := MapEnvVar{eVar: newEVar(keys...)} - if !envVar.IsSet { - envVar.Value = defaultValue - return envVar - } - valItems := strings.Split(envVar.Raw, ",") - for i := range valItems { - valItems[i] = strings.TrimSpace(valItems[i]) - } - val := map[string]interface{}{} - for _, item := range valItems { - itemArr := strings.Split(item, "=") - if len(itemArr) == 2 { - val[itemArr[0]] = os.ExpandEnv(itemArr[1]) - } - } - envVar.Value = val - return envVar -} - -// For use in if's - -func (e *BooleanEnvVar) Tuple() (bool, bool) { - return e.Value, e.IsSet -} -func (e *IntEnvVar) Tuple() (int, bool) { - return e.Value, e.IsSet -} -func (e *StringEnvVar) Tuple() (string, bool) { - return e.Value, e.IsSet -} -func (e *SliceEnvVar) Tuple() ([]string, bool) { - return e.Value, e.IsSet -} -func (e *MapEnvVar) Tuple() (map[string]interface{}, bool) { - return e.Value, e.IsSet -} diff --git a/env/vars.go b/env/vars.go deleted file mode 100644 index 2b202cb6..00000000 --- a/env/vars.go +++ /dev/null @@ -1,24 +0,0 @@ -package env - -import "go.undefinedlabs.com/scopeagent/tags" - -var ( - ScopeDsn = newStringEnvVar("", "SCOPE_DSN") - ScopeApiKey = newStringEnvVar("", "SCOPE_APIKEY") - ScopeApiEndpoint = newStringEnvVar("https://app.scope.dev", "SCOPE_API_ENDPOINT") - ScopeService = newStringEnvVar("default", "SCOPE_SERVICE") - ScopeRepository = newStringEnvVar("", "SCOPE_REPOSITORY") - ScopeCommitSha = newStringEnvVar("", "SCOPE_COMMIT_SHA") - ScopeBranch = newStringEnvVar("", "SCOPE_BRANCH") - ScopeSourceRoot = newStringEnvVar("", "SCOPE_SOURCE_ROOT") - ScopeLoggerRoot = newStringEnvVar("", "SCOPE_LOGGER_ROOT", "SCOPE_LOG_ROOT_PATH") - ScopeDebug = newBooleanEnvVar(false, "SCOPE_DEBUG") - ScopeTracerGlobal = newBooleanEnvVar(false, "SCOPE_TRACER_GLOBAL", "SCOPE_SET_GLOBAL_TRACER") - ScopeTestingMode = newBooleanEnvVar(false, "SCOPE_TESTING_MODE") - ScopeTestingFailRetries = newIntEnvVar(0, "SCOPE_TESTING_FAIL_RETRIES") - ScopeTestingPanicAsFail = newBooleanEnvVar(false, "SCOPE_TESTING_PANIC_AS_FAIL") - ScopeConfiguration = newSliceEnvVar([]string{tags.PlatformName, tags.PlatformArchitecture, tags.GoVersion}, "SCOPE_CONFIGURATION") - ScopeMetadata = newMapEnvVar(nil, "SCOPE_METADATA") - ScopeInstrumentationHttpPayloads = newBooleanEnvVar(false, "SCOPE_INSTRUMENTATION_HTTP_PAYLOADS") - ScopeInstrumentationDbStatementValues = newBooleanEnvVar(false, "SCOPE_INSTRUMENTATION_DB_STATEMENT_VALUES") -) diff --git a/init.go b/init.go index fb3ae83d..9271e729 100644 --- a/init.go +++ b/init.go @@ -11,6 +11,7 @@ import ( "testing" "go.undefinedlabs.com/scopeagent/agent" + "go.undefinedlabs.com/scopeagent/config" "go.undefinedlabs.com/scopeagent/instrumentation" "go.undefinedlabs.com/scopeagent/instrumentation/logging" scopetesting "go.undefinedlabs.com/scopeagent/instrumentation/testing" @@ -20,6 +21,7 @@ var ( defaultAgent *agent.Agent runningMutex sync.RWMutex running bool + cfg = config.Get() ) // Helper function to run a `testing.M` object and gracefully stopping the agent afterwards @@ -37,7 +39,15 @@ func Run(m *testing.M, opts ...agent.Option) int { return res } - logging.PatchStandardLogger() + if cfg.Instrumentation.Logger.StandardLogger != nil && *cfg.Instrumentation.Logger.StandardLogger { + logging.PatchStandardLogger() + } + if cfg.Instrumentation.Logger.StandardOutput != nil && *cfg.Instrumentation.Logger.StandardOutput { + logging.PatchStdOut() + } + if cfg.Instrumentation.Logger.StandardError != nil && *cfg.Instrumentation.Logger.StandardError { + logging.PatchStdErr() + } scopetesting.Init(m) diff --git a/instrumentation/nethttp/client.go b/instrumentation/nethttp/client.go index 75fa6ff1..c1b6aa7e 100644 --- a/instrumentation/nethttp/client.go +++ b/instrumentation/nethttp/client.go @@ -14,6 +14,7 @@ import ( "github.com/opentracing/opentracing-go/ext" "github.com/opentracing/opentracing-go/log" + "go.undefinedlabs.com/scopeagent/config" "go.undefinedlabs.com/scopeagent/instrumentation" ) @@ -45,6 +46,8 @@ type clientOptions struct { spanObserver func(span opentracing.Span, r *http.Request) } +var cfg = config.Get() + // ClientOption controls the behavior of TraceRequest. type ClientOption func(*clientOptions) @@ -154,7 +157,7 @@ func TracerFromRequest(req *http.Request) *Tracer { func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { // Only trace outgoing requests that are inside an active trace parent := opentracing.SpanFromContext(req.Context()) - if parent == nil { + if parent == nil || (cfg.Instrumentation.Http.Client != nil && !*cfg.Instrumentation.Http.Client) { rt := t.RoundTripper if rt == nil { rt = http.DefaultTransport diff --git a/instrumentation/nethttp/patch.go b/instrumentation/nethttp/patch.go index ac0359f5..8ae44648 100644 --- a/instrumentation/nethttp/patch.go +++ b/instrumentation/nethttp/patch.go @@ -1,7 +1,6 @@ package nethttp import ( - "go.undefinedlabs.com/scopeagent/env" "net/http" "sync" ) @@ -24,7 +23,7 @@ func PatchHttpDefaultClient(options ...Option) { for _, option := range options { option(transport) } - transport.PayloadInstrumentation = transport.PayloadInstrumentation || env.ScopeInstrumentationHttpPayloads.Value + transport.PayloadInstrumentation = transport.PayloadInstrumentation || (cfg.Instrumentation.Http.Payloads != nil && *cfg.Instrumentation.Http.Payloads) http.DefaultClient = &http.Client{Transport: transport} }) } diff --git a/instrumentation/nethttp/server.go b/instrumentation/nethttp/server.go index 42e7cc05..56ba9c18 100644 --- a/instrumentation/nethttp/server.go +++ b/instrumentation/nethttp/server.go @@ -11,7 +11,6 @@ import ( "github.com/opentracing/opentracing-go" "github.com/opentracing/opentracing-go/ext" - "go.undefinedlabs.com/scopeagent/env" "go.undefinedlabs.com/scopeagent/errors" "go.undefinedlabs.com/scopeagent/instrumentation" ) @@ -122,9 +121,9 @@ func middlewareFunc(tr opentracing.Tracer, h http.HandlerFunc, options ...MWOpti for _, opt := range options { opt(&opts) } - opts.payloadInstrumentation = opts.payloadInstrumentation || env.ScopeInstrumentationHttpPayloads.Value + opts.payloadInstrumentation = opts.payloadInstrumentation || (cfg.Instrumentation.Http.Payloads != nil && *cfg.Instrumentation.Http.Payloads) fn := func(w http.ResponseWriter, r *http.Request) { - if !opts.spanFilter(r) { + if !opts.spanFilter(r) || (cfg.Instrumentation.Http.Server != nil && !*cfg.Instrumentation.Http.Server) { h(w, r) return } diff --git a/instrumentation/sql/driver.go b/instrumentation/sql/driver.go index 2e3661e2..190f0135 100644 --- a/instrumentation/sql/driver.go +++ b/instrumentation/sql/driver.go @@ -5,11 +5,13 @@ import ( "database/sql/driver" "errors" "fmt" - "github.com/opentracing/opentracing-go" - "go.undefinedlabs.com/scopeagent/env" - "go.undefinedlabs.com/scopeagent/instrumentation" "reflect" "strings" + + "github.com/opentracing/opentracing-go" + + "go.undefinedlabs.com/scopeagent/config" + "go.undefinedlabs.com/scopeagent/instrumentation" ) type ( @@ -53,7 +55,8 @@ func WrapDriver(d driver.Driver, options ...Option) driver.Driver { for _, option := range options { option(wrapper) } - wrapper.configuration.statementValues = wrapper.configuration.statementValues || env.ScopeInstrumentationDbStatementValues.Value + cfg := config.Get() + wrapper.configuration.statementValues = wrapper.configuration.statementValues || (cfg.Instrumentation.DB.StatementValues != nil && *cfg.Instrumentation.DB.StatementValues) return wrapper } diff --git a/scope.yml b/scope.yml index 3ca8d477..37fff67e 100644 --- a/scope.yml +++ b/scope.yml @@ -1,19 +1,18 @@ -service: 'service-name' #SCOPE_SERVICE +#service: 'service-name' #SCOPE_SERVICE #logger: # root: '/home/user/projects/scope/log' #SCOPE_LOGGER_ROOT metadata: #SCOPE_METADATA sample.key1: $SAMPLE_VAR1 - sample.key2: $SAMPLE_VAR2 + sample.key2: $PATH sample.key3: sampleValue3 -configuration: #SCOPE_CONFIGURATION - - sample.key1 - - sample.key2 - - sample.key3 +#configuration: #SCOPE_CONFIGURATION +# - sample.key1 +# - sample.key2 +# - sample.key3 instrumentation: - enabled: true #SCOPE_INSTRUMENTATION_ENABLED diff_summary: true #SCOPE_INSTRUMENTATION_DIFF_SUMMARY tests_frameworks: - fail_retries: 5 #SCOPE_INSTRUMENTATION_TESTS_FRAMEWORKS_FAIL_RETRIES + fail_retries: 4 #SCOPE_INSTRUMENTATION_TESTS_FRAMEWORKS_FAIL_RETRIES panic_as_fail: true #SCOPE_INSTRUMENTATION_TESTS_FRAMEWORKS_PANIC_AS_FAIL db: statement_values: true #SCOPE_INSTRUMENTATION_DB_STATEMENT_VALUES @@ -27,8 +26,8 @@ instrumentation: - My-Header-Two logger: standard_logger: true #SCOPE_INSTRUMENTATION_LOGGER_STANDARD_LOGGER - standard_output: true #SCOPE_INSTRUMENTATION_LOGGER_STANDARD_OUTPUT - standard_error: true #SCOPE_INSTRUMENTATION_LOGGER_STANDARD_ERROR + standard_output: false #SCOPE_INSTRUMENTATION_LOGGER_STANDARD_OUTPUT + standard_error: false #SCOPE_INSTRUMENTATION_LOGGER_STANDARD_ERROR tracer: global: true #SCOPE_TRACER_GLOBAL dispatcher: