Skip to content

Commit 56bb4cf

Browse files
authored
Add logs to dice example (#5349)
* Add logs to dice example Use slog to log a message on the server handler. * Add changelog entry * Split impl for 1.22 and 1.21
1 parent e94b07d commit 56bb4cf

File tree

8 files changed

+127
-26
lines changed

8 files changed

+127
-26
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
1414
- Add `RecordFactory` in `go.opentelemetry.io/otel/sdk/log/logtest` to facilitate testing the exporter and processor implementations. (#5258)
1515
- Add example for `go.opentelemetry.io/otel/exporters/stdout/stdoutlog`. (#5242)
1616
- The count of dropped records from the `BatchProcessor` in `go.opentelemetry.io/otel/sdk/log` is logged. (#5276)
17+
- Add logs to `go.opentelemetry.io/otel/example/dice`. (#5349)
1718

1819
### Changed
1920

example/dice/go.mod

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@ module go.opentelemetry.io/otel/example/dice
33
go 1.21
44

55
require (
6+
go.opentelemetry.io/contrib/bridges/otelslog v0.1.0
67
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0
78
go.opentelemetry.io/otel v1.26.0
9+
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.2.0-alpha
810
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.26.0
911
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0
12+
go.opentelemetry.io/otel/log v0.2.0-alpha
1013
go.opentelemetry.io/otel/metric v1.26.0
1114
go.opentelemetry.io/otel/sdk v1.26.0
15+
go.opentelemetry.io/otel/sdk/log v0.2.0-alpha
1216
go.opentelemetry.io/otel/sdk/metric v1.26.0
1317
)
1418

@@ -33,3 +37,9 @@ replace go.opentelemetry.io/otel/metric => ../../metric
3337
replace go.opentelemetry.io/otel/sdk/metric => ../../sdk/metric
3438

3539
replace go.opentelemetry.io/otel/sdk => ../../sdk
40+
41+
replace go.opentelemetry.io/otel/exporters/stdout/stdoutlog => ../../exporters/stdout/stdoutlog
42+
43+
replace go.opentelemetry.io/otel/log => ../../log
44+
45+
replace go.opentelemetry.io/otel/sdk/log => ../../sdk/log

example/dice/go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
1313
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
1414
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
1515
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
16+
go.opentelemetry.io/contrib/bridges/otelslog v0.1.0 h1:XQka5HbIS6JOeZvWz3oKyvzGmMaw7bsHH6r26Kmbrc4=
17+
go.opentelemetry.io/contrib/bridges/otelslog v0.1.0/go.mod h1:TTRD9H+Ddlxv9NaX+2kQXUGiYAOpcOS0kkTlC1EI4Wg=
1618
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0 h1:Xs2Ncz0gNihqu9iosIZ5SkBbWo5T8JhhLJFMQL1qmLI=
1719
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0/go.mod h1:vy+2G/6NvVMpwGX/NyLqcC41fxepnuKHk16E6IZUcJc=
1820
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=

example/dice/main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ func newHTTPHandler() http.Handler {
7878
}
7979

8080
// Register handlers.
81-
handleFunc("/rolldice", rolldice)
81+
handleFunc("/rolldice/", rolldice)
82+
handleFunc("/rolldice/{player}", rolldice)
8283

8384
// Add HTTP instrumentation for the whole server.
8485
handler := otelhttp.NewHandler(mux, "/")

example/dice/otel.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@ import (
99
"time"
1010

1111
"go.opentelemetry.io/otel"
12+
"go.opentelemetry.io/otel/exporters/stdout/stdoutlog"
1213
"go.opentelemetry.io/otel/exporters/stdout/stdoutmetric"
1314
"go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
15+
"go.opentelemetry.io/otel/log/global"
1416
"go.opentelemetry.io/otel/propagation"
17+
"go.opentelemetry.io/otel/sdk/log"
1518
"go.opentelemetry.io/otel/sdk/metric"
1619
"go.opentelemetry.io/otel/sdk/trace"
1720
)
@@ -60,6 +63,15 @@ func setupOTelSDK(ctx context.Context) (shutdown func(context.Context) error, er
6063
shutdownFuncs = append(shutdownFuncs, meterProvider.Shutdown)
6164
otel.SetMeterProvider(meterProvider)
6265

66+
// Set up logger provider.
67+
loggerProvider, err := newLoggerProvider()
68+
if err != nil {
69+
handleErr(err)
70+
return
71+
}
72+
shutdownFuncs = append(shutdownFuncs, loggerProvider.Shutdown)
73+
global.SetLoggerProvider(loggerProvider)
74+
6375
return
6476
}
6577

@@ -98,3 +110,15 @@ func newMeterProvider() (*metric.MeterProvider, error) {
98110
)
99111
return meterProvider, nil
100112
}
113+
114+
func newLoggerProvider() (*log.LoggerProvider, error) {
115+
logExporter, err := stdoutlog.New()
116+
if err != nil {
117+
return nil, err
118+
}
119+
120+
meterProvider := log.NewLoggerProvider(
121+
log.WithProcessor(log.NewBatchProcessor(logExporter)),
122+
)
123+
return meterProvider, nil
124+
}

example/dice/rolldice.go

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,22 @@
44
package main
55

66
import (
7-
"io"
8-
"log"
9-
"math/rand"
10-
"net/http"
11-
"strconv"
12-
7+
"go.opentelemetry.io/contrib/bridges/otelslog"
138
"go.opentelemetry.io/otel"
14-
"go.opentelemetry.io/otel/attribute"
159
"go.opentelemetry.io/otel/metric"
10+
"go.opentelemetry.io/otel/sdk/instrumentation"
1611
)
1712

13+
const name = "rolldice"
14+
1815
var (
19-
tracer = otel.Tracer("rolldice")
20-
meter = otel.Meter("rolldice")
16+
tracer = otel.Tracer(name)
17+
meter = otel.Meter(name)
18+
logger = otelslog.NewLogger(
19+
otelslog.WithInstrumentationScope(instrumentation.Scope{
20+
Name: name,
21+
}),
22+
)
2123
rollCnt metric.Int64Counter
2224
)
2325

@@ -30,19 +32,3 @@ func init() {
3032
panic(err)
3133
}
3234
}
33-
34-
func rolldice(w http.ResponseWriter, r *http.Request) {
35-
ctx, span := tracer.Start(r.Context(), "roll")
36-
defer span.End()
37-
38-
roll := 1 + rand.Intn(6)
39-
40-
rollValueAttr := attribute.Int("roll.value", roll)
41-
span.SetAttributes(rollValueAttr)
42-
rollCnt.Add(ctx, 1, metric.WithAttributes(rollValueAttr))
43-
44-
resp := strconv.Itoa(roll) + "\n"
45-
if _, err := io.WriteString(w, resp); err != nil {
46-
log.Printf("Write failed: %v\n", err)
47-
}
48-
}

example/dice/rolldice_go1.21.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
//go:build !go1.22
5+
// +build !go1.22
6+
7+
package main
8+
9+
import (
10+
"io"
11+
"math/rand"
12+
"net/http"
13+
"strconv"
14+
15+
"go.opentelemetry.io/otel/attribute"
16+
"go.opentelemetry.io/otel/metric"
17+
)
18+
19+
func rolldice(w http.ResponseWriter, r *http.Request) {
20+
ctx, span := tracer.Start(r.Context(), "roll")
21+
defer span.End()
22+
23+
roll := 1 + rand.Intn(6)
24+
25+
logger.InfoContext(ctx, "Anonymous player is rolling the dice", "result", roll)
26+
27+
rollValueAttr := attribute.Int("roll.value", roll)
28+
span.SetAttributes(rollValueAttr)
29+
rollCnt.Add(ctx, 1, metric.WithAttributes(rollValueAttr))
30+
31+
resp := strconv.Itoa(roll) + "\n"
32+
if _, err := io.WriteString(w, resp); err != nil {
33+
logger.ErrorContext(ctx, "Write failed", "error", err)
34+
}
35+
}

example/dice/rolldice_go1.22.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
//go:build go1.22
5+
// +build go1.22
6+
7+
package main
8+
9+
import (
10+
"fmt"
11+
"io"
12+
"math/rand"
13+
"net/http"
14+
"strconv"
15+
16+
"go.opentelemetry.io/otel/attribute"
17+
"go.opentelemetry.io/otel/metric"
18+
)
19+
20+
func rolldice(w http.ResponseWriter, r *http.Request) {
21+
ctx, span := tracer.Start(r.Context(), "roll")
22+
defer span.End()
23+
24+
roll := 1 + rand.Intn(6)
25+
26+
var msg string
27+
if player := r.PathValue("player"); player != "" {
28+
msg = fmt.Sprintf("%s is rolling the dice", player)
29+
} else {
30+
msg = "Anonymous player is rolling the dice"
31+
}
32+
logger.InfoContext(ctx, msg, "result", roll)
33+
34+
rollValueAttr := attribute.Int("roll.value", roll)
35+
span.SetAttributes(rollValueAttr)
36+
rollCnt.Add(ctx, 1, metric.WithAttributes(rollValueAttr))
37+
38+
resp := strconv.Itoa(roll) + "\n"
39+
if _, err := io.WriteString(w, resp); err != nil {
40+
logger.ErrorContext(ctx, "Write failed", "error", err)
41+
}
42+
}

0 commit comments

Comments
 (0)