/
logs.go
86 lines (72 loc) · 2.28 KB
/
logs.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
package otel
import (
"context"
"os"
"github.com/agoda-com/opentelemetry-logs-go/exporters/otlp/otlplogs"
"github.com/agoda-com/opentelemetry-logs-go/exporters/otlp/otlplogs/otlplogsgrpc"
sdk "github.com/agoda-com/opentelemetry-logs-go/sdk/logs"
"github.com/agoda-com/otelzap"
"go.opentelemetry.io/otel/sdk/resource"
semconv "go.opentelemetry.io/otel/semconv/v1.12.0"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
type logs struct {
clientCleanUp func(ctx context.Context) error
exporter *otlplogs.Exporter
provider *sdk.LoggerProvider
logger *zap.Logger
}
func newLogs(ctx context.Context, serviceName, url string) (logs, error) {
// Create exporter
client := otlplogsgrpc.NewClient(otlplogsgrpc.WithEndpoint(url), otlplogsgrpc.WithInsecure())
exporter, err := otlplogs.NewExporter(ctx, otlplogs.WithClient(client))
if err != nil {
return logs{}, err
}
// Create resource
resource := resource.NewWithAttributes(semconv.SchemaURL, semconv.ServiceNameKey.String(serviceName))
// Create provider
provider := sdk.NewLoggerProvider(
sdk.WithBatcher(exporter),
sdk.WithResource(resource),
)
// Set opentelemetry logger provider globally
// otellogs.SetLoggerProvider(provider)
// Create cores
cores := []zapcore.Core{
otelzap.NewOtelCore(provider),
}
// Set console loggers
if os.Getenv("DEV_MODE") != "" {
consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())
consoleDebugging := zapcore.Lock(os.Stdout)
consoleErrors := zapcore.Lock(os.Stderr)
// Set priorities
highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.ErrorLevel
})
lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl < zapcore.ErrorLevel
})
cores = append(cores,
zapcore.NewCore(consoleEncoder, consoleErrors, highPriority),
zapcore.NewCore(consoleEncoder, consoleDebugging, lowPriority),
)
}
// Create a new logger
logger := zap.New(zapcore.NewTee(cores...))
// undo := zap.ReplaceGlobals(logger),
return logs{
clientCleanUp: client.Stop,
exporter: exporter,
provider: provider,
logger: logger,
}, nil
}
func (l logs) close(ctx context.Context) {
_ = l.logger.Sync()
_ = l.provider.Shutdown(ctx)
_ = l.exporter.Shutdown(ctx)
_ = l.clientCleanUp(ctx)
}