f0a3ea260ac68fbc00fe4efbf5bcce7ac0869324
[ric-plt/tracelibgo.git] / pkg / tracelibgo / tracing.go
1 /*
2  * Copyright (c) 2019 AT&T Intellectual Property.
3  * Copyright (c) 2018-2019 Nokia.
4  *
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
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  */
17
18 // Package tracelibgo implements a function to create a configured tracer instance
19 package tracelibgo
20
21 import (
22         "fmt"
23         "io"
24         "os"
25         "strconv"
26         "strings"
27
28         "github.com/opentracing/opentracing-go"
29         jaegercfg "github.com/uber/jaeger-client-go/config"
30         jaegerlog "github.com/uber/jaeger-client-go/log"
31 )
32
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"
38
39 type confMaker struct {
40         ServiceName string
41 }
42
43 type logLevel int
44
45 const (
46         logAll  logLevel = iota
47         logErr  logLevel = iota
48         logNone logLevel = iota
49 )
50
51 func (cm *confMaker) GetEnv(envName string, defval string) (retval string) {
52         retval = os.Getenv(envName)
53         if retval == "" {
54                 retval = defval
55         }
56         return
57 }
58
59 func (cm *confMaker) IsTracingEnabled() bool {
60         val := cm.GetEnv(tracingEnabledEnv, "false")
61         if val == "1" || strings.ToLower(val) == "true" {
62                 return true
63         }
64         return false
65 }
66
67 func createDisabledTracer(name string) (opentracing.Tracer, io.Closer) {
68         if name == "" {
69                 name = "dummy"
70         }
71         cfg := jaegercfg.Configuration{
72                 ServiceName: name,
73                 Disabled:    true,
74         }
75         tracer, closer, err := cfg.NewTracer()
76         if err != nil {
77                 fmt.Fprintln(os.Stderr, "tracelibgo: trace creation error: ", err.Error())
78         }
79         return tracer, closer
80 }
81
82 func (cm *confMaker) getSamplerConfig() jaegercfg.SamplerConfig {
83         samplerType := cm.GetEnv(jaegerSamplerTypeEnv, "const")
84         param, err := strconv.ParseFloat(cm.GetEnv(jaegerSamplerParamEnv, "0.001"), 64)
85         if err != nil {
86                 param = 0
87         }
88         return jaegercfg.SamplerConfig{Type: samplerType, Param: param}
89 }
90
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"
95         }
96         return jaegercfg.ReporterConfig{LogSpans: cm.getLoggingLevel() == logAll, LocalAgentHostPort: agentHostPort}
97 }
98
99 func (cm *confMaker) getLoggingLevel() logLevel {
100         level := strings.ToLower(cm.GetEnv(jaegerLogLevelEnv, "error"))
101         switch level {
102         case "error":
103                 return logErr
104         case "all":
105                 return logAll
106         default:
107                 return logNone
108         }
109 }
110
111 // CreateTracer creates a tracer entry
112 func CreateTracer(name string) (opentracing.Tracer, io.Closer) {
113
114         cm := confMaker{name}
115         if !cm.IsTracingEnabled() {
116                 return createDisabledTracer(name)
117         }
118         sampler := cm.getSamplerConfig()
119         reporter := cm.getReporterConfig()
120         cfg := jaegercfg.Configuration{
121                 ServiceName: name,
122                 Disabled:    false,
123                 Sampler:     &sampler,
124                 Reporter:    &reporter,
125         }
126         var jaegerLoggerOpt jaegercfg.Option
127         switch cm.getLoggingLevel() {
128         case logAll, logErr:
129                 jaegerLoggerOpt = jaegercfg.Logger(jaegerlog.StdLogger)
130         default:
131                 jaegerLoggerOpt = jaegercfg.Logger(nil)
132         }
133         tracer, closer, err := cfg.NewTracer(jaegerLoggerOpt)
134         if err != nil {
135                 fmt.Fprintln(os.Stderr, "tracelibgo: cannot init tracer: "+err.Error())
136                 return createDisabledTracer(name)
137         }
138         return tracer, closer
139 }