Merge "RIC:1060: Change in PTL"
[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  * This source code is part of the near-RT RIC (RAN Intelligent Controller)
18  * platform project (RICP).
19  *
20  */
21
22 // Package tracelibgo implements a function to create a configured tracer instance
23 package tracelibgo
24
25 import (
26         "fmt"
27         "io"
28         "os"
29         "strconv"
30         "strings"
31
32         "github.com/opentracing/opentracing-go"
33         jaegercfg "github.com/uber/jaeger-client-go/config"
34         jaegerlog "github.com/uber/jaeger-client-go/log"
35 )
36
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"
42
43 type confMaker struct {
44         ServiceName string
45 }
46
47 type logLevel int
48
49 const (
50         logAll  logLevel = iota
51         logErr  logLevel = iota
52         logNone logLevel = iota
53 )
54
55 func (cm *confMaker) GetEnv(envName string, defval string) (retval string) {
56         retval = os.Getenv(envName)
57         if retval == "" {
58                 retval = defval
59         }
60         return
61 }
62
63 func (cm *confMaker) IsTracingEnabled() bool {
64         val := cm.GetEnv(tracingEnabledEnv, "false")
65         if val == "1" || strings.ToLower(val) == "true" {
66                 return true
67         }
68         return false
69 }
70
71 func createDisabledTracer(name string) (opentracing.Tracer, io.Closer) {
72         if name == "" {
73                 name = "dummy"
74         }
75         cfg := jaegercfg.Configuration{
76                 ServiceName: name,
77                 Disabled:    true,
78         }
79         tracer, closer, err := cfg.NewTracer()
80         if err != nil {
81                 fmt.Fprintln(os.Stderr, "tracelibgo: trace creation error: ", err.Error())
82         }
83         return tracer, closer
84 }
85
86 func (cm *confMaker) getSamplerConfig() jaegercfg.SamplerConfig {
87         samplerType := cm.GetEnv(jaegerSamplerTypeEnv, "const")
88         param, err := strconv.ParseFloat(cm.GetEnv(jaegerSamplerParamEnv, "0.001"), 64)
89         if err != nil {
90                 param = 0
91         }
92         return jaegercfg.SamplerConfig{Type: samplerType, Param: param}
93 }
94
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"
99         }
100         return jaegercfg.ReporterConfig{LogSpans: cm.getLoggingLevel() == logAll, LocalAgentHostPort: agentHostPort}
101 }
102
103 func (cm *confMaker) getLoggingLevel() logLevel {
104         level := strings.ToLower(cm.GetEnv(jaegerLogLevelEnv, "error"))
105         switch level {
106         case "error":
107                 return logErr
108         case "all":
109                 return logAll
110         default:
111                 return logNone
112         }
113 }
114
115 // CreateTracer creates a tracer entry
116 func CreateTracer(name string) (opentracing.Tracer, io.Closer) {
117
118         cm := confMaker{name}
119         if !cm.IsTracingEnabled() {
120                 return createDisabledTracer(name)
121         }
122         sampler := cm.getSamplerConfig()
123         reporter := cm.getReporterConfig()
124         cfg := jaegercfg.Configuration{
125                 ServiceName: name,
126                 Disabled:    false,
127                 Sampler:     &sampler,
128                 Reporter:    &reporter,
129         }
130         var jaegerLoggerOpt jaegercfg.Option
131         switch cm.getLoggingLevel() {
132         case logAll, logErr:
133                 jaegerLoggerOpt = jaegercfg.Logger(jaegerlog.StdLogger)
134         default:
135                 jaegerLoggerOpt = jaegercfg.Logger(nil)
136         }
137         tracer, closer, err := cfg.NewTracer(jaegerLoggerOpt)
138         if err != nil {
139                 fmt.Fprintln(os.Stderr, "tracelibgo: cannot init tracer: "+err.Error())
140                 return createDisabledTracer(name)
141         }
142         return tracer, closer
143 }