Skip to content

Commit 50871d5

Browse files
committed
Add example and update README
1 parent d333b3a commit 50871d5

5 files changed

Lines changed: 168 additions & 2 deletions

File tree

README.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Add OpenTelemetry middleware dependency with go modules
2525
go get github.com/labstack/echo-opentelemetry
2626
```
2727

28-
Use as import statement
28+
Use as an import statement
2929

3030
```go
3131
import "github.com/labstack/echo-opentelemetry"
@@ -46,7 +46,11 @@ e.Use(echootel.NewMiddlewareWithConfig(echootel.Config{
4646
}))
4747
```
4848

49+
Retrieving the tracer from the Echo context
50+
```go
51+
tp, err := echo.ContextGet[trace.Tracer](c, echootel.TracerKey)
52+
```
4953

5054
## Full example
5155

52-
TODO
56+
See [example](example/main.go)

example/go.mod

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
module github.com/labstack/echo-opentelemetry/echootel/example
2+
3+
go 1.25.6
4+
5+
replace github.com/labstack/echo-opentelemetry/echootel => ../
6+
7+
require (
8+
github.com/labstack/echo-opentelemetry/echootel v0.0.0-00010101000000-000000000000
9+
github.com/labstack/echo/v5 v5.0.4
10+
go.opentelemetry.io/otel v1.40.0
11+
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.40.0
12+
go.opentelemetry.io/otel/sdk v1.40.0
13+
go.opentelemetry.io/otel/trace v1.40.0
14+
)
15+
16+
require (
17+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
18+
github.com/go-logr/logr v1.4.3 // indirect
19+
github.com/go-logr/stdr v1.2.2 // indirect
20+
github.com/google/uuid v1.6.0 // indirect
21+
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
22+
go.opentelemetry.io/otel/metric v1.40.0 // indirect
23+
golang.org/x/sys v0.40.0 // indirect
24+
golang.org/x/time v0.14.0 // indirect
25+
)

example/go.sum

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
2+
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
3+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
6+
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
7+
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
8+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
9+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
10+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
11+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
12+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
13+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
14+
github.com/labstack/echo/v5 v5.0.4 h1:ll3I/O8BifjMztj9dD1vx/peZQv8cR2CTUdQK6QxGGc=
15+
github.com/labstack/echo/v5 v5.0.4/go.mod h1:SyvlSdObGjRXeQfCCXW/sybkZdOOQZBmpKF0bvALaeo=
16+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
17+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
18+
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
19+
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
20+
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
21+
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
22+
go.opentelemetry.io/contrib/propagators/b3 v1.39.0 h1:PI7pt9pkSnimWcp5sQhUA9OzLbc3Ba4sL+VEUTNsxrk=
23+
go.opentelemetry.io/contrib/propagators/b3 v1.39.0/go.mod h1:5gV/EzPnfYIwjzj+6y8tbGW2PKWhcsz5e/7twptRVQY=
24+
go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms=
25+
go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g=
26+
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.40.0 h1:MzfofMZN8ulNqobCmCAVbqVL5syHw+eB2qPRkCMA/fQ=
27+
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.40.0/go.mod h1:E73G9UFtKRXrxhBsHtG00TB5WxX57lpsQzogDkqBTz8=
28+
go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g=
29+
go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc=
30+
go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8=
31+
go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE=
32+
go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw=
33+
go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg=
34+
go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw=
35+
go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA=
36+
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
37+
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
38+
golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o=
39+
golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8=
40+
golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
41+
golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
42+
golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE=
43+
golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=
44+
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
45+
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
46+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
47+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

example/main.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
// This example is based on:
5+
// https://github.com/open-telemetry/opentelemetry-go-contrib/blob/8c7ab5313db0dbbaf65bd1c79b9c28f1e8c5b40d/instrumentation/github.com/labstack/echo/otelecho/example/server.go
6+
7+
package main
8+
9+
import (
10+
"context"
11+
"log/slog"
12+
"net/http"
13+
14+
"github.com/labstack/echo-opentelemetry/echootel"
15+
"github.com/labstack/echo/v5"
16+
"go.opentelemetry.io/otel"
17+
"go.opentelemetry.io/otel/attribute"
18+
"go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
19+
"go.opentelemetry.io/otel/propagation"
20+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
21+
"go.opentelemetry.io/otel/trace"
22+
)
23+
24+
type user struct {
25+
ID string
26+
Name string
27+
}
28+
29+
// Try with `curl -v http://localhost:8080/users/123`
30+
func main() {
31+
tp, err := initTracer()
32+
if err != nil {
33+
slog.Error("Failed to initialize otel tracer", "error", err)
34+
return
35+
}
36+
defer func() {
37+
if err := tp.Shutdown(context.Background()); err != nil {
38+
slog.Error("Failed to shutdown tracer provider", "error", err)
39+
}
40+
}()
41+
42+
e := echo.New()
43+
e.Use(echootel.NewMiddlewareWithConfig(echootel.Config{
44+
ServerName: "my-server",
45+
TracerProvider: tp,
46+
}))
47+
48+
e.GET("/users/:id", func(c *echo.Context) error {
49+
u := user{
50+
ID: c.Param("id"),
51+
Name: "",
52+
}
53+
u.Name, _ = traceGetUser(c, u.ID)
54+
return c.JSON(http.StatusOK, u)
55+
})
56+
if err := e.Start(":8080"); err != nil {
57+
e.Logger.Error("Failed to start echo server", "error", err)
58+
}
59+
}
60+
61+
func initTracer() (*sdktrace.TracerProvider, error) {
62+
exporter, err := stdouttrace.New(stdouttrace.WithPrettyPrint())
63+
if err != nil {
64+
return nil, err
65+
}
66+
tp := sdktrace.NewTracerProvider(
67+
sdktrace.WithSampler(sdktrace.AlwaysSample()),
68+
sdktrace.WithBatcher(exporter),
69+
)
70+
otel.SetTracerProvider(tp)
71+
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
72+
return tp, nil
73+
}
74+
75+
func traceGetUser(c *echo.Context, id string) (string, error) {
76+
tp, err := echo.ContextGet[trace.Tracer](c, echootel.TracerKey)
77+
if err != nil {
78+
return "", err
79+
}
80+
81+
_, span := tp.Start(c.Request().Context(), "getUser", trace.WithAttributes(attribute.String("id", id)))
82+
defer span.End()
83+
if id == "123" {
84+
return "otelecho tester", nil
85+
}
86+
return "unknown", nil
87+
}

version.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
// SPDX-License-Identifier: MIT
2+
// SPDX-FileCopyrightText: © 2026 LabStack and Echo contributors
3+
14
package echootel
25

36
// Version is the current release version of the echo instrumentation.

0 commit comments

Comments
 (0)