Skip to content

Commit eb1dfd5

Browse files
authored
feat(go): add tracing (#768)
1 parent 847785b commit eb1dfd5

File tree

30 files changed

+1623
-203
lines changed

30 files changed

+1623
-203
lines changed

cmd/config/cmd.go

Lines changed: 0 additions & 87 deletions
This file was deleted.

cmd/healthcheck/cmd.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package healthcheck
33
import (
44
"context"
55
"fmt"
6+
"log/slog"
67
"net/http"
78
"strings"
89

@@ -55,5 +56,6 @@ func run(ctx context.Context, c *cli.Command) error {
5556
return fmt.Errorf("health check request returned non-2xx status code: %d", resp.StatusCode)
5657
}
5758

59+
slog.InfoContext(ctx, "OK")
5860
return nil
5961
}

cmd/root.go

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/grafana/grafana-image-renderer/cmd/server"
1111
"github.com/grafana/grafana-image-renderer/pkg/service"
1212
"github.com/urfave/cli/v3"
13+
"go.opentelemetry.io/otel/trace"
1314
)
1415

1516
func NewRootCmd() *cli.Command {
@@ -45,14 +46,42 @@ func NewRootCmd() *cli.Command {
4546
default:
4647
return ctx, fmt.Errorf("invalid log level: %s", c.String("log-level"))
4748
}
48-
slog.SetDefault(slog.New(slog.NewTextHandler(c.Writer, &slog.HandlerOptions{AddSource: true, Level: leveler})))
49+
slog.SetDefault(slog.New(
50+
&traceLogger{
51+
underlying: slog.NewTextHandler(c.Writer, &slog.HandlerOptions{AddSource: true, Level: leveler}),
52+
},
53+
))
4954

5055
return ctx, nil
5156
},
5257
Commands: []*cli.Command{
53-
config.NewCmd(),
5458
healthcheck.NewCmd(),
5559
server.NewCmd(),
5660
},
5761
}
5862
}
63+
64+
var _ slog.Handler = (*traceLogger)(nil)
65+
66+
type traceLogger struct {
67+
underlying slog.Handler
68+
}
69+
70+
func (t *traceLogger) Enabled(ctx context.Context, level slog.Level) bool {
71+
return t.underlying.Enabled(ctx, level)
72+
}
73+
74+
func (t *traceLogger) WithAttrs(attrs []slog.Attr) slog.Handler {
75+
return &traceLogger{underlying: t.underlying.WithAttrs(attrs)}
76+
}
77+
78+
func (t *traceLogger) WithGroup(name string) slog.Handler {
79+
return &traceLogger{underlying: t.underlying.WithGroup(name)}
80+
}
81+
82+
func (t *traceLogger) Handle(ctx context.Context, record slog.Record) error {
83+
if sc := trace.SpanContextFromContext(ctx); sc.HasTraceID() {
84+
record.AddAttrs(slog.String("trace_id", sc.TraceID().String()))
85+
}
86+
return t.underlying.Handle(ctx, record)
87+
}

cmd/server/cmd.go

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,34 @@ package server
33
import (
44
"context"
55
"fmt"
6+
"slices"
67

78
"github.com/grafana/grafana-image-renderer/cmd/config"
89
"github.com/grafana/grafana-image-renderer/pkg/api"
910
"github.com/grafana/grafana-image-renderer/pkg/metrics"
1011
"github.com/grafana/grafana-image-renderer/pkg/service"
12+
"github.com/grafana/grafana-image-renderer/pkg/traces"
1113
"github.com/urfave/cli/v3"
14+
"go.opentelemetry.io/otel"
1215
)
1316

1417
func NewCmd() *cli.Command {
1518
return &cli.Command{
1619
Name: "server",
1720
Usage: "Run the server part of the service.",
18-
Flags: []cli.Flag{
21+
Flags: slices.Concat([]cli.Flag{
1922
&cli.StringFlag{
2023
Name: "addr",
2124
Usage: "The address to listen on for HTTP requests.",
2225
Category: "Server",
2326
Value: ":8081",
2427
Sources: config.FromConfig("server.addr"),
2528
},
26-
&cli.StringFlag{
29+
&cli.StringSliceFlag{
2730
Name: "auth-token",
28-
Usage: "The X-Auth-Token header value that must be sent to the service to permit requests.",
31+
Usage: "The X-Auth-Token header value that must be sent to the service to permit requests. May be repeated.",
2932
Category: "Server",
30-
Value: "-",
33+
Value: []string{"-"},
3134
Sources: config.FromConfig("auth.token"),
3235
},
3336

@@ -51,18 +54,27 @@ func NewCmd() *cli.Command {
5154
Category: "Browser",
5255
Sources: config.FromConfig("browser.gpu"),
5356
},
54-
},
57+
}, traces.TracerFlags()),
5558
Action: run,
5659
}
5760
}
5861

5962
func run(ctx context.Context, c *cli.Command) error {
6063
metrics := metrics.NewRegistry()
64+
tracerProvider, err := traces.NewTracerProvider(ctx, c)
65+
if err != nil {
66+
return fmt.Errorf("failed to set up tracer: %w", err)
67+
}
68+
if tracerProvider != nil {
69+
defer func() { _ = tracerProvider.Shutdown(ctx) }()
70+
ctx = traces.WithTracerProvider(ctx, tracerProvider)
71+
otel.SetTracerProvider(tracerProvider)
72+
}
6173
browser := service.NewBrowserService(c.String("browser"), c.StringSlice("browser-flags"),
6274
service.WithViewport(1000, 500),
6375
service.WithGPU(c.Bool("browser-gpu")))
6476
versions := service.NewVersionService()
65-
handler, err := api.NewHandler(metrics, browser, api.AuthToken(c.String("auth-token")), versions)
77+
handler, err := api.NewHandler(metrics, browser, api.AuthTokens(c.StringSlice("auth-token")), versions)
6678
if err != nil {
6779
return fmt.Errorf("failed to create API handler: %w", err)
6880
}

devenv/docker/enterprise-host/docker-compose.yaml

Lines changed: 0 additions & 18 deletions
This file was deleted.

devenv/docker/go-build/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
This intends on setting up a FULL dev environment, including all supporting services, such that you can develop the Go backend easily.
2+
3+
To restart and build the docker image again, do `docker compose up -d --build`
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
apiVersion: 1
2+
3+
providers:
4+
- name: go-build
5+
folder: DevEnv go-build dashboards
6+
type: file
7+
allowUiUpdates: false
8+
updateIntervalSeconds: 60
9+
options:
10+
path: dashboards

0 commit comments

Comments
 (0)