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.
17 * This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 * platform project (RICP).
22 // Package tracelibgo implements a function to create a configured tracer instance
32 "github.com/opentracing/opentracing-go"
33 jaegercfg "github.com/uber/jaeger-client-go/config"
34 jaegerlog "github.com/uber/jaeger-client-go/log"
37 const tracingEnabledEnv string = "TRACING_ENABLED"
38 const jaegerSamplerTypeEnv string = "TRACING_JAEGER_SAMPLER_TYPE"
39 const jaegerSamplerParamEnv = "TRACING_JAEGER_SAMPLER_PARAM"
40 const jaegerAgentAddrEnv = "TRACING_JAEGER_AGENT_ADDR"
41 const jaegerLogLevelEnv = "TRACING_JAEGER_LOG_LEVEL"
43 type confMaker struct {
50 logAll logLevel = iota
51 logErr logLevel = iota
52 logNone logLevel = iota
55 func (cm *confMaker) GetEnv(envName string, defval string) (retval string) {
56 retval = os.Getenv(envName)
63 func (cm *confMaker) IsTracingEnabled() bool {
64 val := cm.GetEnv(tracingEnabledEnv, "false")
65 if val == "1" || strings.ToLower(val) == "true" {
71 func createDisabledTracer(name string) (opentracing.Tracer, io.Closer) {
75 cfg := jaegercfg.Configuration{
79 tracer, closer, err := cfg.NewTracer()
81 fmt.Fprintln(os.Stderr, "tracelibgo: trace creation error: ", err.Error())
86 func (cm *confMaker) getSamplerConfig() jaegercfg.SamplerConfig {
87 samplerType := cm.GetEnv(jaegerSamplerTypeEnv, "const")
88 param, err := strconv.ParseFloat(cm.GetEnv(jaegerSamplerParamEnv, "0.001"), 64)
92 return jaegercfg.SamplerConfig{Type: samplerType, Param: param}
95 func (cm *confMaker) getReporterConfig() jaegercfg.ReporterConfig {
96 agentHostPort := cm.GetEnv(jaegerAgentAddrEnv, "127.0.0.1:6831")
97 if !strings.Contains(agentHostPort, ":") {
98 agentHostPort += ":6831"
100 return jaegercfg.ReporterConfig{LogSpans: cm.getLoggingLevel() == logAll, LocalAgentHostPort: agentHostPort}
103 func (cm *confMaker) getLoggingLevel() logLevel {
104 level := strings.ToLower(cm.GetEnv(jaegerLogLevelEnv, "error"))
115 // CreateTracer creates a tracer entry
116 func CreateTracer(name string) (opentracing.Tracer, io.Closer) {
118 cm := confMaker{name}
119 if !cm.IsTracingEnabled() {
120 return createDisabledTracer(name)
122 sampler := cm.getSamplerConfig()
123 reporter := cm.getReporterConfig()
124 cfg := jaegercfg.Configuration{
130 var jaegerLoggerOpt jaegercfg.Option
131 switch cm.getLoggingLevel() {
133 jaegerLoggerOpt = jaegercfg.Logger(jaegerlog.StdLogger)
135 jaegerLoggerOpt = jaegercfg.Logger(nil)
137 tracer, closer, err := cfg.NewTracer(jaegerLoggerOpt)
139 fmt.Fprintln(os.Stderr, "tracelibgo: cannot init tracer: "+err.Error())
140 return createDisabledTracer(name)
142 return tracer, closer