-
Notifications
You must be signed in to change notification settings - Fork 49
/
module.go
107 lines (93 loc) · 2.73 KB
/
module.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package opencensus
import (
"log"
"net/http"
"sync"
"fmt"
"math/rand"
"flamingo.me/flamingo/v3/framework/config"
"flamingo.me/flamingo/v3/framework/dingo"
"go.opencensus.io/exporter/jaeger"
"go.opencensus.io/exporter/prometheus"
"go.opencensus.io/plugin/ochttp"
"go.opencensus.io/stats"
"go.opencensus.io/stats/view"
"go.opencensus.io/tag"
"go.opencensus.io/trace"
)
var (
registerOnce = new(sync.Once)
KeyArea, _ = tag.NewKey("area")
Sampler = trace.NeverSample()
)
func View(name string, m stats.Measure, aggr *view.Aggregation, tagKeys ...tag.Key) {
view.Register(&view.View{
Name: name,
Measure: m,
Aggregation: aggr,
TagKeys: append([]tag.Key{KeyArea}, tagKeys...),
})
}
type correlationIDInjector struct {
next http.RoundTripper
}
// RoundTrip a request
func (rt *correlationIDInjector) RoundTrip(req *http.Request) (*http.Response, error) {
if span := trace.FromContext(req.Context()); span != nil {
req.Header.Add("X-Correlation-ID", span.SpanContext().TraceID.String())
}
return rt.next.RoundTrip(req)
}
type Module struct {
Endpoint string `inject:"config:opencensus.jaeger.endpoint"`
ServiceName string `inject:"config:opencensus.serviceName"`
ServiceAddr string `inject:"config:opencensus.serviceAddr"`
JaegerEnable bool `inject:"config:opencensus.jaeger.enable"`
}
func (m *Module) Configure(injector *dingo.Injector) {
registerOnce.Do(func() {
// For demoing purposes, always sample.
trace.ApplyConfig(trace.Config{DefaultSampler: trace.NeverSample()})
Sampler = trace.AlwaysSample()
http.DefaultTransport = &correlationIDInjector{next: &ochttp.Transport{Base: http.DefaultTransport}}
if m.JaegerEnable {
// generate a random IP in 127.0.0.0/8 network to trick jaegers clock skew detection
randomIp := fmt.Sprintf("127.%d.%d.%d", rand.Intn(255), rand.Intn(255), rand.Intn(255))
// Register the Jaeger exporter to be able to retrieve
// the collected spans.
exporter, err := jaeger.NewExporter(jaeger.Options{
Endpoint: m.Endpoint,
Process: jaeger.Process{
ServiceName: m.ServiceName,
Tags: []jaeger.Tag{
jaeger.StringTag("ip", randomIp),
},
},
})
if err != nil {
log.Fatal(err)
}
trace.RegisterExporter(exporter)
}
{
exporter, err := prometheus.NewExporter(prometheus.Options{})
if err != nil {
log.Fatal(err)
}
view.RegisterExporter(exporter)
s := http.NewServeMux()
s.Handle("/metrics", exporter)
go http.ListenAndServe(m.ServiceAddr, s)
}
})
}
func (m *Module) DefaultConfig() config.Map {
return config.Map{
"opencensus": config.Map{
"jaeger.endpoint": "http://localhost:14268",
"jaeger.enable": false,
"serviceName": "flamingo",
"serviceAddr": ":13210",
},
}
}