Compare commits

...

24 Commits

Author SHA1 Message Date
Mohammed Al Sahaf e50e3ed93a create otel transport in Provision
Signed-off-by: Mohammed Al Sahaf <msaa1990@gmail.com>
2025-09-01 20:03:17 +03:00
Mohammed Al Sahaf 9dfc038d38 fix comment
Signed-off-by: Mohammed Al Sahaf <msaa1990@gmail.com>
2025-08-30 03:23:06 +03:00
Mohammed Al Sahaf d3e97f82e8 fix comment
Signed-off-by: Mohammed Al Sahaf <msaa1990@gmail.com>
2025-08-30 03:21:14 +03:00
Mohammed Al Sahaf 1c7d0e296b re-inject propagator header
Signed-off-by: Mohammed Al Sahaf <msaa1990@gmail.com>
2025-08-30 03:19:41 +03:00
Mohammed Al Sahaf 1aac622b1b lint
Signed-off-by: Mohammed Al Sahaf <msaa1990@gmail.com>
2025-08-29 18:11:50 +03:00
Mohammed Al Sahaf 91778c5f94 Merge branch 'master' into pr-6417
Signed-off-by: Mohammed Al Sahaf <msaa1990@gmail.com>
2025-08-29 18:11:09 +03:00
Cedric Ziel 5ccad835d7 fix: gofumpt 2024-10-02 16:35:29 +02:00
Matt Holt a0b1a8de3d Merge branch 'master' into trace-servicegraph 2024-10-02 08:08:04 -06:00
Cedric Ziel ced6ba4e13 fix: set global propagator 2024-06-22 19:05:25 +02:00
Cedric Ziel ae1d4ef05c fix: dont inject twice 2024-06-22 19:00:23 +02:00
Cedric Ziel ed087ecdfd fix: lint 2024-06-22 16:16:10 +02:00
Cedric Ziel 558e28d02b fix: lint 2024-06-22 16:01:01 +02:00
Cedric Ziel 72ab14fb58 fix: lint 2024-06-22 15:53:23 +02:00
Cedric Ziel f58b6fbca2 fix: shorten config 2024-06-22 15:47:15 +02:00
Cedric Ziel 3d93ce464c fix: gofumpt 2024-06-22 15:39:16 +02:00
Cedric Ziel f704d0b3c8 fix: clean fixture 2024-06-22 15:36:39 +02:00
Cedric Ziel 023999e073 Update modules/caddyhttp/tracing/module.go
Co-authored-by: Mohammed Al Sahaf <mohammed@caffeinatedwonders.com>
2024-06-22 15:36:13 +02:00
Cedric Ziel b6966f4797 fix: fix config 2024-06-22 15:35:37 +02:00
Cedric Ziel 9f9d9c56cf fix: amend test to capture new default 2024-06-22 15:29:40 +02:00
Cedric Ziel 8f4075491b fix: switch to use roundtripper from otel 2024-06-22 15:07:04 +02:00
Cedric Ziel 5f9398cede feat: record client span for reverseproxy scenarios 2024-06-22 14:49:35 +02:00
Cedric Ziel 6c05741154 fix: inject server-timing when configured 2024-06-22 14:29:26 +02:00
Cedric Ziel bb450ed304 fix: correct to span_id 2024-06-22 14:10:57 +02:00
Cedric Ziel e35ce3d005 feat: inject span_id as var and log context 2024-06-22 13:21:12 +02:00
5 changed files with 34 additions and 18 deletions
@@ -33,4 +33,4 @@
} }
} }
} }
} }
@@ -34,6 +34,7 @@ import (
"sync" "sync"
"time" "time"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"go.uber.org/zap" "go.uber.org/zap"
"go.uber.org/zap/zapcore" "go.uber.org/zap/zapcore"
"golang.org/x/net/http/httpguts" "golang.org/x/net/http/httpguts"
@@ -256,6 +257,7 @@ func (h *Handler) Provision(ctx caddy.Context) error {
if module, ok := h.Transport.(caddy.Module); ok && module.CaddyModule().ID.Name() == "fastcgi" && h.RequestBuffers == 0 { if module, ok := h.Transport.(caddy.Module); ok && module.CaddyModule().ID.Name() == "fastcgi" && h.RequestBuffers == 0 {
h.RequestBuffers = 4096 h.RequestBuffers = 4096
} }
h.Transport = otelhttp.NewTransport(h.Transport)
} }
if h.LoadBalancing != nil && h.LoadBalancing.SelectionPolicyRaw != nil { if h.LoadBalancing != nil && h.LoadBalancing.SelectionPolicyRaw != nil {
mod, err := ctx.LoadModule(h.LoadBalancing, "SelectionPolicyRaw") mod, err := ctx.LoadModule(h.LoadBalancing, "SelectionPolicyRaw")
+16 -7
View File
@@ -25,7 +25,8 @@ func init() {
type Tracing struct { type Tracing struct {
// SpanName is a span name. It should follow the naming guidelines here: // SpanName is a span name. It should follow the naming guidelines here:
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#span // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#span
SpanName string `json:"span"` SpanName string `json:"span"`
InjectServerTimingHeader bool `json:"server_timing,omitempty"`
// otel implements opentelemetry related logic. // otel implements opentelemetry related logic.
otel openTelemetryWrapper otel openTelemetryWrapper
@@ -46,7 +47,7 @@ func (ot *Tracing) Provision(ctx caddy.Context) error {
ot.logger = ctx.Logger() ot.logger = ctx.Logger()
var err error var err error
ot.otel, err = newOpenTelemetryWrapper(ctx, ot.SpanName) ot.otel, err = newOpenTelemetryWrapper(ctx, ot.SpanName, ot.InjectServerTimingHeader)
return err return err
} }
@@ -68,6 +69,7 @@ func (ot *Tracing) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyh
// UnmarshalCaddyfile sets up the module from Caddyfile tokens. Syntax: // UnmarshalCaddyfile sets up the module from Caddyfile tokens. Syntax:
// //
// tracing { // tracing {
// [server_timing]
// [span <span_name>] // [span <span_name>]
// } // }
func (ot *Tracing) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { func (ot *Tracing) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
@@ -94,12 +96,19 @@ func (ot *Tracing) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
} }
for d.NextBlock(0) { for d.NextBlock(0) {
if dst, ok := paramsMap[d.Val()]; ok { switch d.Val() {
if err := setParameter(d, dst); err != nil { case "server_timing":
return err if d.NextArg() {
ot.InjectServerTimingHeader = true
}
default:
if dst, ok := paramsMap[d.Val()]; ok {
if err := setParameter(d, dst); err != nil {
return err
}
} else {
return d.ArgErr()
} }
} else {
return d.ArgErr()
} }
} }
return nil return nil
+14 -7
View File
@@ -7,6 +7,7 @@ import (
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"go.opentelemetry.io/contrib/propagators/autoprop" "go.opentelemetry.io/contrib/propagators/autoprop"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
"go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource" "go.opentelemetry.io/otel/sdk/resource"
@@ -37,20 +38,19 @@ type openTelemetryWrapper struct {
handler http.Handler handler http.Handler
spanName string spanName string
injectServerTimingHeader bool
} }
// newOpenTelemetryWrapper is responsible for the openTelemetryWrapper initialization using provided configuration. // newOpenTelemetryWrapper is responsible for the openTelemetryWrapper initialization using provided configuration.
func newOpenTelemetryWrapper( func newOpenTelemetryWrapper(ctx context.Context, spanName string, injectServerTimingHeader bool) (openTelemetryWrapper, error) {
ctx context.Context,
spanName string,
) (openTelemetryWrapper, error) {
if spanName == "" { if spanName == "" {
spanName = defaultSpanName spanName = defaultSpanName
} }
ot := openTelemetryWrapper{ ot := openTelemetryWrapper{
spanName: spanName, injectServerTimingHeader: injectServerTimingHeader,
spanName: spanName,
} }
version, _ := caddy.Version() version, _ := caddy.Version()
@@ -64,7 +64,9 @@ func newOpenTelemetryWrapper(
return ot, fmt.Errorf("creating trace exporter error: %w", err) return ot, fmt.Errorf("creating trace exporter error: %w", err)
} }
ot.propagators = autoprop.NewTextMapPropagator() prop := autoprop.NewTextMapPropagator()
otel.SetTextMapPropagator(prop)
ot.propagators = prop
tracerProvider := globalTracerProvider.getTracerProvider( tracerProvider := globalTracerProvider.getTracerProvider(
sdktrace.WithBatcher(traceExporter), sdktrace.WithBatcher(traceExporter),
@@ -98,6 +100,11 @@ func (ot *openTelemetryWrapper) serveHTTP(w http.ResponseWriter, r *http.Request
extra.Add(zap.String("traceID", traceID)) extra.Add(zap.String("traceID", traceID))
extra.Add(zap.String("spanID", spanID)) extra.Add(zap.String("spanID", spanID))
} }
// Add the server-timing header so clients can make the connection
if ot.injectServerTimingHeader {
w.Header().Set("server-timing", fmt.Sprintf("traceparent;desc=\"00-%s-%s-%s\"", traceID, spanID, spanCtx.TraceFlags().String()))
}
} }
next := ctx.Value(nextCallCtxKey).(*nextCall) next := ctx.Value(nextCallCtxKey).(*nextCall)
next.err = next.next.ServeHTTP(w, r) next.err = next.next.ServeHTTP(w, r)
+1 -3
View File
@@ -14,9 +14,7 @@ func TestOpenTelemetryWrapper_newOpenTelemetryWrapper(t *testing.T) {
var otw openTelemetryWrapper var otw openTelemetryWrapper
var err error var err error
if otw, err = newOpenTelemetryWrapper(ctx, if otw, err = newOpenTelemetryWrapper(ctx, "", false); err != nil {
"",
); err != nil {
t.Errorf("newOpenTelemetryWrapper() error = %v", err) t.Errorf("newOpenTelemetryWrapper() error = %v", err)
t.FailNow() t.FailNow()
} }