1
0
mirror of https://github.com/open-telemetry/opentelemetry-go.git synced 2025-12-05 23:28:07 +02:00
Files
opentelemetry-go/example/otlp/main.go

103 lines
2.7 KiB
Go
Raw Normal View History

2020-05-27 10:06:33 -05:00
// Example application showcasing opentelemetry Go using the OTLP wire
// protocal
2020-05-26 11:17:14 -05:00
package main
import (
"context"
"fmt"
"log"
"time"
"go.opentelemetry.io/otel/api/global"
2020-05-26 15:24:16 -05:00
"go.opentelemetry.io/otel/api/kv"
"go.opentelemetry.io/otel/api/metric"
2020-05-26 11:17:14 -05:00
"go.opentelemetry.io/otel/exporters/otlp"
2020-05-26 15:24:16 -05:00
"go.opentelemetry.io/otel/sdk/metric/controller/push"
"go.opentelemetry.io/otel/sdk/metric/selector/simple"
2020-05-26 11:17:14 -05:00
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
2020-05-27 10:06:33 -05:00
// Initializes an OTLP exporter, and configures the corresponding trace and
// metric providers.
func initProvider() (*otlp.Exporter, *push.Controller) {
2020-05-26 11:17:14 -05:00
exp, err := otlp.NewExporter(
otlp.WithInsecure(),
otlp.WithAddress("localhost:55680"),
)
handleErr(err, "Failed to create exporter: $v")
2020-05-26 15:24:16 -05:00
traceProvider, err := sdktrace.NewProvider(
2020-05-26 11:17:14 -05:00
sdktrace.WithConfig(sdktrace.Config{DefaultSampler: sdktrace.AlwaysSample()}),
2020-05-27 10:06:33 -05:00
sdktrace.WithSyncer(exp),
2020-05-26 11:17:14 -05:00
)
handleErr(err, "Failed to create trace provider: %v")
2020-05-26 15:24:16 -05:00
pusher := push.New(
simple.NewWithExactDistribution(),
exp,
push.WithStateful(true),
2020-05-27 10:06:33 -05:00
push.WithPeriod(2*time.Second),
2020-05-26 15:24:16 -05:00
)
global.SetTraceProvider(traceProvider)
global.SetMeterProvider(pusher.Provider())
pusher.Start()
2020-05-26 11:17:14 -05:00
2020-05-27 10:06:33 -05:00
return exp, pusher
}
2020-05-26 15:24:16 -05:00
2020-05-26 11:17:14 -05:00
func main() {
2020-05-27 10:06:33 -05:00
exp, pusher := initProvider()
defer exp.Stop()
defer pusher.Stop() // pushes any last exports to the receiver
2020-05-26 15:24:16 -05:00
2020-05-26 11:17:14 -05:00
tracer := global.Tracer("mage-sense")
2020-05-26 15:24:16 -05:00
meter := global.Meter("mage-read")
2020-06-01 08:41:57 -05:00
// labels represent additional descriptors that can be bound to a metric
// observer or recorder. In this case they describe the location in
// which a spell scroll is scribed.
2020-05-26 15:24:16 -05:00
commonLabels := []kv.KeyValue{
kv.String("work-room", "East Scriptorium"),
kv.String("occupancy", "69,105"),
kv.String("priority", "Ultra"),
}
2020-05-27 10:06:33 -05:00
// Observer metric example
2020-05-26 15:24:16 -05:00
oneMetricCB := func(_ context.Context, result metric.Float64ObserverResult) {
result.Observe(1, commonLabels...)
}
_ = metric.Must(meter).NewFloat64ValueObserver("scrying.glass.one", oneMetricCB,
metric.WithDescription("A ValueObserver set to 1.0"),
)
2020-05-27 10:06:33 -05:00
// Recorder metric example
2020-05-26 15:24:16 -05:00
valuerecorder := metric.Must(meter).
NewFloat64ValueRecorder("scrying.glass.two").
Bind(commonLabels...)
defer valuerecorder.Unbind()
2020-05-26 11:17:14 -05:00
2020-05-27 10:06:33 -05:00
// work begins
ctx, span := tracer.Start(context.Background(), "Archmage-Overlord-Inspection")
2020-05-26 11:17:14 -05:00
for i := 0; i < 10; i++ {
_, innerSpan := tracer.Start(ctx, fmt.Sprintf("Minion-%d", i))
log.Println("Minions hard at work, scribing...")
2020-05-27 10:06:33 -05:00
valuerecorder.Record(ctx, float64(i)*1.5)
2020-05-26 11:17:14 -05:00
<-time.After(time.Second)
innerSpan.End()
}
span.End()
<-time.After(time.Second)
2020-05-27 10:06:33 -05:00
log.Println("Spell-scroll scribed!")
2020-05-26 11:17:14 -05:00
}
func handleErr(err error, message string) {
if err != nil {
log.Fatalf(message, err)
}
}