// telemetryHeaders demonstrates a provider-neutral compatibility boundary for // gateways that carry trace IDs in configurable HTTP headers. package main import ( "context" "fmt" "io" "net/http" "net/http/httptest" omni "git.yuntuo.hk/k2safe/go-omni" "git.yuntuo.hk/k2safe/go-omni/logx" "git.yuntuo.hk/k2safe/go-omni/telemetry" ) func main() { if err := run(); err != nil { panic(err) } } func run() error { propagator, err := telemetry.NewHeaderPropagator(telemetry.HeaderPropagationConfig{ TraceIDHeader: "X-Trace-Id", SpanIDHeader: "X-Span-Id", RequestIDHeader: "X-Request-Id", }) if err != nil { return err } runtime, err := telemetry.New(telemetry.Config{Service: "header-example", SampleRatio: 1, Propagator: propagator}) if err != nil { return err } defer runtime.Close() app := omni.New(omni.WithLogger(false), omni.WithRequestIDHeader("X-Request-Id")) defer app.Close() app.Use(runtime.Middleware()) app.GET("/", func(c *omni.Context) error { fmt.Printf("traceId=%s requestId=%s\n", logx.TraceID(c.Context()), logx.RequestID(c.Context())) return c.OK(map[string]string{"traceId": logx.TraceID(c.Context()), "requestId": logx.RequestID(c.Context())}) }) server := httptest.NewServer(app) defer server.Close() req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, server.URL, nil) if err != nil { return err } req.Header.Set("X-Trace-Id", "11111111111111111111111111111111") req.Header.Set("X-Span-Id", "2222222222222222") req.Header.Set("X-Request-Id", "example-request") resp, err := http.DefaultClient.Do(req) if err != nil { return err } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { return err } fmt.Printf("status=%d response=%s", resp.StatusCode, body) return nil }