-
-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathtelemetrytest.go
More file actions
83 lines (74 loc) · 2.31 KB
/
telemetrytest.go
File metadata and controls
83 lines (74 loc) · 2.31 KB
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
package telemetrytest
import (
"bytes"
"context"
"encoding/json"
"io"
"log/slog"
"github.com/henvic/pgxtutorial/telemetry"
"go.opentelemetry.io/otel/exporters/stdout/stdoutmetric"
metricnoop "go.opentelemetry.io/otel/metric/noop"
"go.opentelemetry.io/otel/propagation"
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
"go.opentelemetry.io/otel/sdk/trace/tracetest"
tracenoop "go.opentelemetry.io/otel/trace/noop"
)
// Discard all telemetry.
func Discard() *telemetry.Provider {
tracer := tracenoop.NewTracerProvider().Tracer("discard")
meter := metricnoop.NewMeterProvider().Meter("discard")
propagator := propagation.NewCompositeTextMapPropagator()
logger := slog.New(slog.NewJSONHandler(io.Discard, nil))
return telemetry.NewProvider(logger, tracer, meter, propagator)
}
// Record of the telemetry.
type Memory struct {
trace *tracetest.InMemoryExporter
meter bytes.Buffer
log bytes.Buffer
mr *sdkmetric.PeriodicReader
}
// Reset the recorded telemetry.
func (mem *Memory) Reset() {
mem.trace.Reset()
mem.meter.Reset()
mem.log.Reset()
}
// Trace returns the recorded spans.
func (mem *Memory) Trace() []sdktrace.ReadOnlySpan {
return mem.trace.GetSpans().Snapshots()
}
// Meter of the telemetry.
func (mem *Memory) Meter() string {
if err := mem.mr.ForceFlush(context.Background()); err != nil {
panic(err)
}
return mem.meter.String()
}
// Log of the telemetry.
func (mem *Memory) Log() string {
return mem.log.String()
}
// Provider for telemetrytest.
func Provider() (provider *telemetry.Provider, mem *Memory) {
mem = &Memory{}
mem.trace = tracetest.NewInMemoryExporter()
logger := slog.New(slog.NewJSONHandler(&mem.log, nil))
mt, err := stdoutmetric.New(stdoutmetric.WithEncoder(json.NewEncoder(&mem.meter)))
if err != nil {
panic(err)
}
mem.mr = sdkmetric.NewPeriodicReader(mt)
tp := sdktrace.NewTracerProvider(
sdktrace.WithResource(resource.Default()),
sdktrace.WithSyncer(mem.trace),
)
mp := sdkmetric.NewMeterProvider(
sdkmetric.WithResource(resource.Default()),
sdkmetric.WithReader(mem.mr),
)
propagator := propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})
return telemetry.NewProvider(logger, tp.Tracer("tracer"), mp.Meter("meter"), propagator), mem
}