8000 Collector example: add metrics (#5283) · open-telemetry/opentelemetry-go@76c0610 · GitHub
[go: up one dir, main page]

Skip to content

Commit 76c0610

Browse files
authored
Collector example: add metrics (#5283)
Resolves #5243
1 parent dafe137 commit 76c0610

File tree

4 files changed

+75
-22
lines changed

4 files changed

+75
-22
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
1818
- An `int64` or `float64` synchronous gauge instrument can now be created from a `Meter`.
1919
- All implementations of the API (`go.opentelemetry.io/otel/metric/noop`, `go.opentelemetry.io/otel/sdk/metric`) are updated to support this instrument.
2020
- Add logs to `go.opentelemetry.io/otel/example/dice`. (#5349)
21+
- Add metrics in the `otel-collector` example. (#5283)
2122

2223
### Changed
2324

example/otel-collector/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ web-browser to view the generated traces.
5252

5353
The Prometheus UI is available at
5454
[http://localhost:9090](http://localhost:9090). Navigate there in your favorite
55-
web-browser to view the generated metrics.
55+
web-browser to view the generated metrics, for instance, `testapp_run_total`.
5656

5757
# Shutting down
5858

example/otel-collector/go.mod

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ replace (
99

1010
require (
1111
go.opentelemetry.io/otel v1.26.0
12+
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.26.0
1213
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0
14+
go.opentelemetry.io/otel/metric v1.26.0
1315
go.opentelemetry.io/otel/sdk v1.26.0
16+
go.opentelemetry.io/otel/sdk/metric v1.26.0
1417
go.opentelemetry.io/otel/trace v1.26.0
1518
google.golang.org/grpc v1.64.0
1619
)
@@ -21,7 +24,6 @@ require (
2124
github.com/go-logr/stdr v1.2.2 // indirect
2225
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
2326
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 // indirect
24-
go.opentelemetry.io/otel/metric v1.26.0 // indirect
2527
go.opentelemetry.io/proto/otlp v1.2.0 // indirect
2628
golang.org/x/net v0.25.0 // indirect
2729
golang.org/x/sys v0.20.0 // indirect
@@ -38,3 +40,7 @@ replace go.opentelemetry.io/otel/exporters/otlp/otlptrace => ../../exporters/otl
3840
replace go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc => ../../exporters/otlp/otlptrace/otlptracegrpc
3941

4042
replace go.opentelemetry.io/otel/metric => ../../metric
43+
44+
replace go.opentelemetry.io/otel/sdk/metric => ../../sdk/metric
45+
46+
replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc => ../../exporters/otlp/otlpmetric/otlpmetricgrpc

example/otel-collector/main.go

Lines changed: 66 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,22 @@ import (
1919

2020
"go.opentelemetry.io/otel"
2121
"go.opentelemetry.io/otel/attribute"
22+
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"
2223
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
24+
"go.opentelemetry.io/otel/metric"
2325
"go.opentelemetry.io/otel/propagation"
26+
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
2427
"go.opentelemetry.io/otel/sdk/resource"
2528
sdktrace "go.opentelemetry.io/otel/sdk/trace"
2629
semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
2730
"go.opentelemetry.io/otel/trace"
2831
)
2932

30-
// Initializes an OTLP exporter, and configures the corresponding trace and
31-
// metric providers.
32-
func initProvider() (func(context.Context) error, error) {
33-
ctx := context.Background()
34-
35-
res, err := resource.New(ctx,
36-
resource.WithAttributes(
37-
// the service name used to display traces in backends
38-
semconv.ServiceName("test-service"),
39-
),
40-
)
41-
if err != nil {
42-
return nil, fmt.Errorf("failed to create resource: %w", err)
43-
}
33+
var serviceName = semconv.ServiceNameKey.String("test-service")
4434

35+
// Initialize a gRPC connection to be used by both the tracer and meter
36+
// providers.
37+
func initConn() (*grpc.ClientConn, error) {
4538
// It connects the OpenTelemetry Collector through local gRPC connection.
4639
// You may replace `localhost:4317` with your endpoint.
4740
conn, err := grpc.NewClient("localhost:4317",
@@ -52,8 +45,13 @@ func initProvider() (func(context.Context) error, error) {
5245
return nil, fmt.Errorf("failed to create gRPC connection to collector: %w", err)
5346
}
5447

48+
return conn, err
49+
}
50+
51+
// Initializes an OTLP exporter, and configures the corresponding trace provider.
52+
func initTracerProvider(ctx context.Context, res *resource.Resource, conn *grpc.ClientConn) (func(context.Context) error, error) {
5553
// Set up a trace exporter
56-
traceExporter, err := otlptracegrpc.New(context.Background(), otlptracegrpc.WithGRPCConn(conn))
54+
traceExporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithGRPCConn(conn))
5755
if err != nil {
5856
return nil, fmt.Errorf("failed to create trace exporter: %w", err)
5957
}
@@ -68,30 +66,72 @@ func initProvider() (func(context.Context) error, error) {
6866
)
6967
otel.SetTracerProvider(tracerProvider)
7068

71-
// set global propagator to tracecontext (the default is no-op).
69+
// Set global propagator to tracecontext (the default is no-op).
7270
otel.SetTextMapPropagator(propagation.TraceContext{})
7371

7472
// Shutdown will flush any remaining spans and shut down the exporter.
7573
return tracerProvider.Shutdown, nil
7674
}
7775

76+
// Initializes an OTLP exporter, and configures the corresponding meter provider.
77+
func initMeterProvider(ctx context.Context, res *resource.Resource, conn *grpc.ClientConn) (func(context.Context) error, error) {
78+
metricExporter, err := otlpmetricgrpc.New(ctx, otlpmetricgrpc.WithGRPCConn(conn))
79+
if err != nil {
80+
return nil, fmt.Errorf("failed to create metrics exporter: %w", err)
81+
}
82+
83+
meterProvider := sdkmetric.NewMeterProvider(
84+
sdkmetric.WithReader(sdkmetric.NewPeriodicReader(metricExporter)),
85+
sdkmetric.WithResource(res),
86+
)
87+
otel.SetMeterProvider(meterProvider)
88+
89+
return meterProvider.Shutdown, nil
90+
}
91+
7892
func main() {
7993
log.Printf("Waiting for connection...")
8094

8195
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
8296
defer cancel()
8397

84-
shutdown, err := initProvider()
98+
conn, err := initConn()
99+
if err != nil {
100+
log.Fatal(err)
101+
}
102+
103+
res, err := resource.New(ctx,
104+
resource.WithAttributes(
105+
// The service name used to display traces in backends
106+
serviceName,
107+
),
108+
)
109+
if err != nil {
110+
log.Fatal(err)
111+
}
112+
113+
shutdownTracerProvider, err := initTracerProvider(ctx, res, conn)
85114
if err != nil {
86115
log.Fatal(err)
87116
}
88117
defer func() {
89-
if err := shutdown(ctx); err != nil {
90-
log.Fatal("failed to shutdown TracerProvider: %w", err)
118+
if err := shutdownTracerProvider(ctx); err != nil {
119+
log.Fatalf("failed to shutdown TracerProvider: %s", err)
120+
}
121+
}()
122+
123+
shutdownMeterProvider, err := initMeterProvider(ctx, res, conn)
124+
if err != nil {
125+
log.Fatal(err)
126+
}
127+
defer func() {
128+
if err := shutdownMeterProvider(ctx); err != nil {
129+
log.Fatalf("failed to shutdown MeterProvider: %s", err)
91130
}
92131
}()
93132

94133
tracer := otel.Tracer("test-tracer")
134+
meter := otel.Meter("test-meter")
95135

96136
// Attributes represent additional key-value descriptors that can be bound
97137
// to a metric observer or recorder.
@@ -101,14 +141,20 @@ func main() {
101141
attribute.String("attrC", "vanilla"),
102142
}
103143

104-
// work begins
144+
runCount, err := meter.Int64Counter("run", metric.WithDescription("The number of times the iteration ran"))
145+
if err != nil {
146+
log.Fatal(err)
147+
}
148+
149+
// Work begins
105150
ctx, span := tracer.Start(
106151
ctx,
107152
"CollectorExporter-Example",
108153
trace.WithAttributes(commonAttrs...))
109154
defer span.End()
110155
for i := 0; i < 10; i++ {
111156
_, iSpan := tracer.Start(ctx, fmt.Sprintf("Sample-%d", i))
157+
runCount.Add(ctx, 1, metric.WithAttributes(commonAttrs...))
112158
log.Printf("Doing really hard work (%d / 10)\n", i+1)
113159

114160
<-time.After(time.Second)

0 commit comments

Comments
 (0)
0