/
telemeter.go
131 lines (104 loc) · 2.61 KB
/
telemeter.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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package otel
import (
"context"
"fmt"
"os"
"github.com/lerenn/cryptellation/pkg/adapters/telemetry"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/trace"
"go.uber.org/zap"
)
// Check implementation of telemetry.Telemetry interface.
var _ telemetry.Telemeter = (*Telemeter)(nil)
type Telemeter struct {
Logs logs
Metrics metrics
Traces traces
}
func NewTelemeter(ctx context.Context, serviceName string) (Telemeter, error) {
// Get exporter URL
otelEndpoint := os.Getenv("OPENTELEMETRY_GRPC_ENDPOINT")
// Create Logs exporter
logs, err := newLogs(ctx, serviceName, otelEndpoint)
if err != nil {
return Telemeter{}, err
}
// Create Metrics exporter
metrics, err := newMetrics(ctx, serviceName, otelEndpoint)
if err != nil {
return Telemeter{}, err
}
// Create Trace exporter
traces, err := newTraces(ctx, serviceName, otelEndpoint)
if err != nil {
metrics.close(ctx)
return Telemeter{}, err
}
return Telemeter{
Logs: logs,
Metrics: metrics,
Traces: traces,
}, nil
}
type counterInt struct {
counter metric.Int64Counter
}
func (c counterInt) Add(ctx context.Context, value int64) {
c.counter.Add(ctx, value)
}
func (tel Telemeter) CounterInt(meter, name, description string) (telemetry.Counter, error) {
desc := metric.WithDescription(description)
c, err := tel.Metrics.provider.Meter("health").Int64Counter("liveness_calls", desc)
return counterInt{
counter: c,
}, err
}
type Logger struct {
logger *zap.Logger
}
func (l Logger) Debug(content string) {
l.logger.Debug(content)
}
func (l Logger) Debugf(format string, a ...any) {
l.logger.Debug(fmt.Sprintf(format, a...))
}
func (l Logger) Info(content string) {
l.logger.Info(content)
}
func (l Logger) Infof(format string, a ...any) {
l.logger.Info(fmt.Sprintf(format, a...))
}
func (l Logger) Warning(content string) {
l.logger.Warn(content)
}
func (l Logger) Warningf(format string, a ...any) {
l.logger.Warn(fmt.Sprintf(format, a...))
}
func (l Logger) Error(content string) {
l.logger.Error(content)
}
func (l Logger) Errorf(format string, a ...any) {
l.logger.Error(fmt.Sprintf(format, a...))
}
func (tel Telemeter) Logger(ctx context.Context) telemetry.Logger {
return Logger{
logger: tel.Logs.logger,
}
}
type Span struct {
span trace.Span
}
func (s Span) End() {
s.span.End()
}
func (tel Telemeter) Trace(ctx context.Context, tracer, name string) (context.Context, telemetry.Tracer) {
ctx, span := tel.Traces.provider.Tracer(tracer).Start(ctx, name)
return ctx, Span{
span: span,
}
}
func (tel Telemeter) Close(ctx context.Context) {
tel.Traces.close(ctx)
tel.Metrics.close(ctx)
tel.Logs.close(ctx)
}