2 * Copyright (c) 2019 AT&T Intellectual Property.
3 * Copyright (c) 2018-2019 Nokia.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 // Package tracelibgo implements a function to create a configured tracer instance
28 "github.com/opentracing/opentracing-go"
29 jaegercfg "github.com/uber/jaeger-client-go/config"
30 jaegerlog "github.com/uber/jaeger-client-go/log"
33 const tracingEnabledEnv string = "TRACING_ENABLED"
34 const jaegerSamplerTypeEnv string = "TRACING_JAEGER_SAMPLER_TYPE"
35 const jaegerSamplerParamEnv = "TRACING_JAEGER_SAMPLER_PARAM"
36 const jaegerAgentAddrEnv = "TRACING_JAEGER_AGENT_ADDR"
37 const jaegerLogLevelEnv = "TRACING_JAEGER_LOG_LEVEL"
39 type confMaker struct {
46 logAll logLevel = iota
47 logErr logLevel = iota
48 logNone logLevel = iota
51 func (cm *confMaker) GetEnv(envName string, defval string) (retval string) {
52 retval = os.Getenv(envName)
59 func (cm *confMaker) IsTracingEnabled() bool {
60 val := cm.GetEnv(tracingEnabledEnv, "false")
61 if val == "1" || strings.ToLower(val) == "true" {
67 func createDisabledTracer(name string) (opentracing.Tracer, io.Closer) {
71 cfg := jaegercfg.Configuration{
75 tracer, closer, err := cfg.NewTracer()
77 fmt.Fprintln(os.Stderr, "tracelibgo: trace creation error: ", err.Error())
82 func (cm *confMaker) getSamplerConfig() jaegercfg.SamplerConfig {
83 samplerType := cm.GetEnv(jaegerSamplerTypeEnv, "const")
84 param, err := strconv.ParseFloat(cm.GetEnv(jaegerSamplerParamEnv, "0.001"), 64)
88 return jaegercfg.SamplerConfig{Type: samplerType, Param: param}
91 func (cm *confMaker) getReporterConfig() jaegercfg.ReporterConfig {
92 agentHostPort := cm.GetEnv(jaegerAgentAddrEnv, "127.0.0.1:6831")
93 if !strings.Contains(agentHostPort, ":") {
94 agentHostPort += ":6831"
96 return jaegercfg.ReporterConfig{LogSpans: cm.getLoggingLevel() == logAll, LocalAgentHostPort: agentHostPort}
99 func (cm *confMaker) getLoggingLevel() logLevel {
100 level := strings.ToLower(cm.GetEnv(jaegerLogLevelEnv, "error"))
111 // CreateTracer creates a tracer entry
112 func CreateTracer(name string) (opentracing.Tracer, io.Closer) {
114 cm := confMaker{name}
115 if !cm.IsTracingEnabled() {
116 return createDisabledTracer(name)
118 sampler := cm.getSamplerConfig()
119 reporter := cm.getReporterConfig()
120 cfg := jaegercfg.Configuration{
126 var jaegerLoggerOpt jaegercfg.Option
127 switch cm.getLoggingLevel() {
129 jaegerLoggerOpt = jaegercfg.Logger(jaegerlog.StdLogger)
131 jaegerLoggerOpt = jaegercfg.Logger(nil)
133 tracer, closer, err := cfg.NewTracer(jaegerLoggerOpt)
135 fmt.Fprintln(os.Stderr, "tracelibgo: cannot init tracer: "+err.Error())
136 return createDisabledTracer(name)
138 return tracer, closer