chainguard-dev/go-grpc-kit

GitHub: chainguard-dev/go-grpc-kit

Go 语言的 gRPC 生产级工具库,提供双工服务网关、预配置拨号选项、Prometheus 指标、OpenTelemetry 链路追踪及客户端身份传播等开箱即用的微服务基础设施能力。

Stars: 11 | Forks: 17

# gRPC Kit 用于 Go 的 gRPC 工具库 — 提供双工服务(gRPC + grpc-gateway), Prometheus 指标、OpenTelemetry 链路追踪、客户端身份传播以及 预配置的拨号选项。 ## 包 ### `pkg/duplex` — 双工 gRPC + REST 网关服务器 在同一端口上同时提供 gRPC 和 [gRPC Gateway](https://grpc-ecosystem.github.io/grpc-gateway/) 服务。 支持通过 context 取消来实现优雅关闭。 ``` d := duplex.New(8080, grpc.ChainUnaryInterceptor(metrics.UnaryServerInterceptor()), ) pb.RegisterTypeServer(d.Server, impl.NewTypeServer()) if err := d.RegisterHandler(ctx, pb.RegisterTypeHandlerFromEndpoint); err != nil { log.Panicf("Failed to register gateway endpoint: %v", err) } if err := d.ListenAndServe(ctx); err != nil { log.Panicf("ListenAndServe() = %v", err) } ``` `duplex.New` 接受 `grpc.ServerOption`、`runtime.ServeMuxOption` 和 `grpc.DialOption`(用于内部回环连接)。 ### `pkg/options` — gRPC 客户端拨号选项 专为生产环境预配置的 gRPC 拨号选项: - **`GRPCOptions(url)`** — 返回 URL 的目标地址和拨号选项。 支持 `http`、`https`、`unix`、`bufnet` 和测试监听器方案。 - **`GRPCDialOptions()`** — 包含 OTEL 链路追踪、 Prometheus 客户端指标、客户端身份传播和重试支持的标准拨号选项。 - **`LoopbackDialOptions()`** — 用于 grpc-gateway 回环连接的精简拨号选项,省略了指标/追踪以避免重复计算。 - **`ClientOptions()`** — 将 `GRPCDialOptions()` 包装为 `google.golang.org/api/option.ClientOption`。 通过环境变量进行配置: | 变量 | 默认值 | 描述 | |----------|---------|-------------| | `ENABLE_CLIENT_HANDLING_TIME_HISTOGRAM` | `true` | 启用客户端处理时间直方图 | | `ENABLE_CLIENT_STREAM_RECEIVE_TIME_HISTOGRAM` | `true` | 启用客户端流接收直方图 | | `ENABLE_CLIENT_STREAM_SEND_TIME_HISTOGRAM` | `true` | 启用客户端流发送直方图 | | `GRPC_CLIENT_MAX_RETRY` | `0` | 最大重试次数(0 表示禁用) | ### `pkg/metrics` — Prometheus 指标与 OpenTelemetry 链路追踪 - **`UnaryServerInterceptor()`** / **`StreamServerInterceptor()`** — gRPC 服务器拦截器,记录带有 `cgclientid` 标签的 Prometheus 指标。 - **`SetupTracer(ctx)`** — 使用 OTLP gRPC 导出器初始化 OpenTelemetry 链路追踪。返回一个关闭函数。 - **`RegisterListenAndServe(server, addr, enablePprof)`** — 在后台启动一个指标 HTTP 服务器,提供 `/metrics` 以及可选的 `/debug/pprof/` 服务。 ### `pkg/trace` — Cloud Run Traceparent 保留 Cloud Run 可能会替换 `traceparent` 标头,从而导致丢失 span 上下文。此 包提供了 stats handler 来解决此问题: - **`PreserveTraceParentHandler`** — 客户端 handler,将 传出的 `traceparent` 复制到 `original-traceparent`。 - **`RestoreTraceParentHandler`** — 服务端 handler,如果 Cloud Run 替换了 `traceparent`,则从 `original-traceparent` 中恢复它。 用于可观测性的 Prometheus 计数器: `grpc_traceparent_preserved_total`、`grpc_traceparent_restore_attempted_total`、 `grpc_traceparent_restored_total`。 ### `pkg/interceptors/clientid` — 客户端身份传播 通过 gRPC metadata 自动传播调用者身份: - **`UnaryClientInterceptor()`** / **`StreamClientInterceptor()`** — 将 `cgclientid`(服务身份)和 `cgrequestid`(每次调用唯一的 UUID) 添加到传出的 metadata 中。 客户端 ID 解析顺序:`K_SERVICE` 环境变量 → `CG_CLIENT_ID` 环境变量 → 可执行文件路径。
标签:EVTX分析, GET参数, Go, gRPC, grpc-gateway, OpenTelemetry, Python工具, Ruby工具, SOC Prime, 开发工具, 日志审计, 用户代理, 自定义请求头