From 97c7520f7758ebbf0e4bb63f7c4b96b41cb964a2 Mon Sep 17 00:00:00 2001 From: Ziqi Zhao Date: Thu, 28 Jul 2022 13:09:22 +0800 Subject: [PATCH] [net/http] enhance otelhttp example to support metric Signed-off-by: Ziqi Zhao --- CHANGELOG.md | 1 + .../net/http/otelhttp/example/README.md | 2 +- .../net/http/otelhttp/example/go.mod | 2 ++ .../net/http/otelhttp/example/go.sum | 4 +++ .../http/otelhttp/example/server/server.go | 32 +++++++++++++++++-- 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4576559b9ad..b94ec18f421 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,6 +79,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Add gRPC trace `Filter` to the `go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc` package to provide the way to filter the traces automatically generated in interceptors. (#2572) - The `TextMapPropagator` function to `go.opentelemetry.io/contrib/propagators/autoprop`. This function is used to return a composite `TextMapPropagator` from registered names (instead of having to specify with an environment variable). (#2593) +- Enhance otelhttp example to support metric. (#2610) ### Changed diff --git a/instrumentation/net/http/otelhttp/example/README.md b/instrumentation/net/http/otelhttp/example/README.md index 9da9e2dc813..a90ae42b87f 100644 --- a/instrumentation/net/http/otelhttp/example/README.md +++ b/instrumentation/net/http/otelhttp/example/README.md @@ -8,7 +8,7 @@ Bring up the `http-server` and `http-client` services to run the example: docker-compose up --detach http-server http-client ``` -The `http-client` service sends just one HTTP request to `http-server` and then exits. View the span generated to `stdout` in the logs: +The `http-client` service sends just one HTTP request to `http-server` and then exits. View the span and metric generated to `stdout` in the logs: ```sh docker-compose logs http-client ``` diff --git a/instrumentation/net/http/otelhttp/example/go.mod b/instrumentation/net/http/otelhttp/example/go.mod index 805fb5d9029..0f7766cb04a 100644 --- a/instrumentation/net/http/otelhttp/example/go.mod +++ b/instrumentation/net/http/otelhttp/example/go.mod @@ -7,8 +7,10 @@ replace go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp => ../ require ( go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4 go.opentelemetry.io/otel v1.11.1 + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.33.0 go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.11.1 go.opentelemetry.io/otel/sdk v1.11.1 + go.opentelemetry.io/otel/sdk/metric v0.33.0 go.opentelemetry.io/otel/trace v1.11.1 ) diff --git a/instrumentation/net/http/otelhttp/example/go.sum b/instrumentation/net/http/otelhttp/example/go.sum index 0ffe5fa6ecc..f98fe9c7fdb 100644 --- a/instrumentation/net/http/otelhttp/example/go.sum +++ b/instrumentation/net/http/otelhttp/example/go.sum @@ -11,12 +11,16 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= go.opentelemetry.io/otel v1.11.1 h1:4WLLAmcfkmDk2ukNXJyq3/kiz/3UzCaYq6PskJsaou4= go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.33.0 h1:hlnyYcK61UzruaUssIZvCHl72qSxGB1R55RexLKjFs8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.33.0/go.mod h1:GD6hP1UBb3pVN4IIFH1iMuRiWEVDy1E/7/g1rYQiJyc= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.11.1 h1:3Yvzs7lgOw8MmbxmLRsQGwYdCubFmUHSooKaEhQunFQ= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.11.1/go.mod h1:pyHDt0YlyuENkD2VwHsiRDf+5DfI3EH7pfhUYW6sQUE= go.opentelemetry.io/otel/metric v0.33.0 h1:xQAyl7uGEYvrLAiV/09iTJlp1pZnQ9Wl793qbVvED1E= go.opentelemetry.io/otel/metric v0.33.0/go.mod h1:QlTYc+EnYNq/M2mNk1qDDMRLpqCOj2f/r5c7Fd5FYaI= go.opentelemetry.io/otel/sdk v1.11.1 h1:F7KmQgoHljhUuJyA+9BiU+EkJfyX5nVVF4wyzWZpKxs= go.opentelemetry.io/otel/sdk v1.11.1/go.mod h1:/l3FE4SupHJ12TduVjUkZtlfFqDCQJlOlithYrdktys= +go.opentelemetry.io/otel/sdk/metric v0.33.0 h1:oTqyWfksgKoJmbrs2q7O7ahkJzt+Ipekihf8vhpa9qo= +go.opentelemetry.io/otel/sdk/metric v0.33.0/go.mod h1:xdypMeA21JBOvjjzDUtD0kzIcHO/SPez+a8HOzJPGp0= go.opentelemetry.io/otel/trace v1.11.1 h1:ofxdnzsNrGBYXbP7t7zpUK281+go5rF7dvdIZXF8gdQ= go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk= golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc= diff --git a/instrumentation/net/http/otelhttp/example/server/server.go b/instrumentation/net/http/otelhttp/example/server/server.go index 22f9a99e7b4..07c232a4aa3 100644 --- a/instrumentation/net/http/otelhttp/example/server/server.go +++ b/instrumentation/net/http/otelhttp/example/server/server.go @@ -16,27 +16,32 @@ package main import ( "context" + "encoding/json" "io" "log" "net/http" + "os" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/baggage" - stdout "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" + stdoutmetric "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric" + stdouttrace "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" "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" - semconv "go.opentelemetry.io/otel/semconv/v1.12.0" + semconv "go.opentelemetry.io/otel/semconv/v1.10.0" "go.opentelemetry.io/otel/trace" ) func initTracer() (*sdktrace.TracerProvider, error) { // Create stdout exporter to be able to retrieve // the collected spans. - exporter, err := stdout.New(stdout.WithPrettyPrint()) + exporter, err := stdouttrace.New(stdouttrace.WithPrettyPrint()) if err != nil { return nil, err } @@ -53,6 +58,17 @@ func initTracer() (*sdktrace.TracerProvider, error) { return tp, err } +func initMeter() (*sdkmetric.MeterProvider, error) { + enc := json.NewEncoder(os.Stdout) + exp, err := stdoutmetric.New(stdoutmetric.WithEncoder(enc)) + if err != nil { + return nil, err + } + + mp := sdkmetric.NewMeterProvider(sdkmetric.WithReader(sdkmetric.NewPeriodicReader(exp))) + return mp, nil +} + func main() { tp, err := initTracer() if err != nil { @@ -64,6 +80,16 @@ func main() { } }() + mp, err := initMeter() + if err != nil { + log.Fatal(err) + } + defer func() { + if err := mp.Shutdown(context.Background()); err != nil { + log.Printf("Error shutting down meter provider: %v", err) + } + }() + uk := attribute.Key("username") helloHandler := func(w http.ResponseWriter, req *http.Request) {