Help us shape the future of Go! Take the 2026 Go Developer Survey

hmw

package
v0.13.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 31, 2026 License: MIT Imports: 6 Imported by: 0

Documentation

Overview

Package hmw 提供 trace_id 的 Hertz 中间件实现。

职责:

  • 生成 trace_id 并注入 Hertz RequestContext 和标准 context.Context
  • 提供从 RequestContext 提取 trace_id 的便捷函数

框架无关的核心定义(Key、HeaderKey、ContextWith)来自 github.com/oekit/tracing/traceid,本包通过 import 复用。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func FromRequestContext

func FromRequestContext(c *app.RequestContext) string

FromRequestContext 从 Hertz RequestContext 中提取 trace_id。 trace_id 由 Middleware 注入到 RequestContext。 返回空字符串表示上下文中没有 trace_id(中间件未注册)。

func Middleware

func Middleware() []app.HandlerFunc

Middleware 返回请求 ID 中间件链,负责 trace_id 的生成、透传与桥接。

采用社区标准实现 hertz-contrib/requestid 作为生成核心,并附加一层桥接, 将 requestid 生成的 ID 同步到 ekit 内部的两处存储,保证下游消费者零改动:

  • Hertz RequestContext: c.Set(Key, ...)(供 FromRequestContext/health/version 读取)
  • 标准 context.Context: traceid.ContextWith(供 logx.Ctx* / service 层 / NATS publisher 读取)

流程:

  1. requestid.New — 读取请求头 traceid.HeaderKey,缺失则生成 traceid.IDLength 位 ID,写入响应头
  2. bridge — 读取 requestid 写入的 ID,同步注入 c.Set 与标准 context

客户端 trace ID 白名单校验

客户端传入的 X-Trace-Id 经 validTraceID 白名单校验:非空、长度 ≤ 64、 字符集仅 [0-9a-zA-Z-](本包生成 12 位十六进制、W3C trace-id 为 32 位十六进制, 弹性接受字母数字连字符格式;白名单防日志注入/ID 伪造关联)。 不在白名单的越界 ID(超长/任意字符/空)被静默丢弃并重新生成合法 ID, 三处注入(响应头 / RequestContext / 标准 context)保持一致,该请求 trace 链路不断。

必须搭配 RecoveryMiddleware

本中间件只做 trace_id,不提供 panic 防护。Hertz 引擎级 recover 仅在 PanicHandler 非 nil 时才挂 defer(hertz pkg/route/engine.go ServeHTTP: `if engine.PanicHandler != nil { defer engine.recv(ctx) }`,server.New 不设默认 PanicHandler),netpoll 的 onProcess/onRequest 亦无 recover (cloudwego/netpoll connection_onevent.go)——handler panic 会直接冲垮 连接甚至进程。自定义中间件栈必须包含 mw.RecoveryMiddleware(或 mw.MinimalMiddleware / mw.DefaultMiddleware,均已内置)。

使用方式:

// 注册为最前置的中间件(在 ResponseMiddleware 之前)
h.Use(hmw.Middleware()...)
h.Use(mw.RecoveryMiddleware()) // 必须有:无 Recovery 的 panic = 断连/进程死

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL