mirror of
https://github.com/caddyserver/caddy.git
synced 2026-05-26 08:42:31 -04:00
Compare commits
24 Commits
internal-tls
...
pr-6417
| Author | SHA1 | Date | |
|---|---|---|---|
| e50e3ed93a | |||
| 9dfc038d38 | |||
| d3e97f82e8 | |||
| 1c7d0e296b | |||
| 1aac622b1b | |||
| 91778c5f94 | |||
| 5ccad835d7 | |||
| a0b1a8de3d | |||
| ced6ba4e13 | |||
| ae1d4ef05c | |||
| ed087ecdfd | |||
| 558e28d02b | |||
| 72ab14fb58 | |||
| f58b6fbca2 | |||
| 3d93ce464c | |||
| f704d0b3c8 | |||
| 023999e073 | |||
| b6966f4797 | |||
| 9f9d9c56cf | |||
| 8f4075491b | |||
| 5f9398cede | |||
| 6c05741154 | |||
| bb450ed304 | |||
| e35ce3d005 |
@@ -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")
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user