trace

package
v0.4.0 Latest Latest
Warning

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

Go to latest
Published: Feb 13, 2026 License: MIT Imports: 16 Imported by: 0

README

trace - OpenTelemetry 链路追踪封装

Go Reference

trace 初始化全局 TracerProvider,连接 Tempo/Jaeger 等 OTLP 后端。

快速开始

import "github.com/ceyewan/genesis/trace"

// 初始化,返回 shutdown 函数
shutdown, err := trace.Init(&trace.Config{
    ServiceName: "my-service",
    Endpoint:    "localhost:4317",
    Sampler:     1.0,
})
defer shutdown(context.Background())

API

// 初始化 TracerProvider
func Init(cfg *Config) (func(context.Context) error, error)

// 创建不导出的 Provider(仅生成 TraceID)
func Discard(serviceName string) (func(context.Context) error, error)

// 默认配置
func DefaultConfig(serviceName string) *Config

通用中间件(推荐)

// Gin
func GinMiddleware(serviceName string) gin.HandlerFunc

// gRPC tracing stats handler
func GRPCServerStatsHandler() stats.Handler
func GRPCClientStatsHandler() stats.Handler

示例:

r := gin.New()
r.Use(trace.GinMiddleware("gateway"))

conn, _ := grpc.NewClient(
    "localhost:9090",
    grpc.WithTransportCredentials(insecure.NewCredentials()),
    grpc.WithStatsHandler(trace.GRPCClientStatsHandler()),
)

MQ 传播与链路关系(推荐)

组件提供统一的生产/消费 helper,消费侧可配置两种关系:

  • link(默认):用 Span Link 关联上游,适合异步/批处理/多消费者组
  • child_of:用 parent/child 串成单条 Trace,适合端到端演示与排障
func StartProducerSpan(
    ctx context.Context,
    tracer oteltrace.Tracer,
    spanName string,
    meta MessagingMeta,
    attrs ...attribute.KeyValue,
) (context.Context, oteltrace.Span, map[string]string)

func StartConsumerSpanFromHeaders(
    ctx context.Context,
    tracer oteltrace.Tracer,
    spanName string,
    headers map[string]string,
    meta MessagingMeta,
    attrs ...attribute.KeyValue,
) (context.Context, oteltrace.Span)

func MarkSpanError(span oteltrace.Span, err error)

示例:

pubCtx, pubSpan, headers := trace.StartProducerSpan(
    ctx,
    tracer,
    trace.SpanNameMQPublish("orders.created"),
    trace.MessagingMeta{
        System:      trace.MessagingSystemNATS,
        Destination: "orders.created",
        Operation:   trace.MessagingOperationPublish,
    },
)
defer pubSpan.End()

consumeCtx, consumeSpan := trace.StartConsumerSpanFromHeaders(
    msg.Context(),
    tracer,
    trace.SpanNameMQConsume("orders.created"),
    msg.Headers(),
    trace.MessagingMeta{
        System:        trace.MessagingSystemNATS,
        Destination:   "orders.created",
        Operation:     trace.MessagingOperationProcess,
        ConsumerGroup: "workers",
        TraceRelation: trace.MessagingTraceRelationChildOf, // 或 MessagingTraceRelationLink
    },
)
defer consumeSpan.End()

语义契约

  • 消息属性键:messaging.systemmessaging.destinationmessaging.operationmessaging.consumer.group
  • 常用系统:nats
  • span 命名 helper:SpanNameMQPublishSpanNameMQConsume

使用

tracer := otel.Tracer("my-component")
ctx, span := tracer.Start(ctx, "operation")
defer span.End()

// 添加属性
span.SetAttributes(attribute.String("key", "value"))

License

MIT License

Documentation

Index

Constants

View Source
const (
	// Messaging 语义属性键
	AttrMessagingSystem        = "messaging.system"
	AttrMessagingDestination   = "messaging.destination"
	AttrMessagingOperation     = "messaging.operation"
	AttrMessagingConsumerGroup = "messaging.consumer.group"
)
View Source
const (
	// 常见的消息操作
	MessagingOperationPublish = "publish"
	MessagingOperationConsume = "consume"
	MessagingOperationProcess = "process"
)
View Source
const (
	// 常见的消息系统
	MessagingSystemNATS = "nats"
)

Variables

This section is empty.

Functions

func Discard

func Discard(serviceName string) (func(context.Context) error, error)

Discard 创建不导出的 TracerProvider,仅生成 TraceID。

func Extract

func Extract(ctx context.Context, carrier map[string]string) context.Context

Extract 从 carrier 中提取 Trace 信息并返回新的 Context 用于 MQ 消费者等场景,还原上游的链路追踪信息

func GRPCClientStatsHandler

func GRPCClientStatsHandler() stats.Handler

GRPCClientStatsHandler 返回一个可重用的 gRPC 客户端状态处理程序用于跟踪

func GRPCServerStatsHandler

func GRPCServerStatsHandler() stats.Handler

GRPCServerStatsHandler 返回一个可重用的 gRPC 服务器状态处理程序用于跟踪

func GinMiddleware

func GinMiddleware(serviceName string) gin.HandlerFunc

GinMiddleware 返回一个可重用的 Gin 跟踪中间件

func Init

func Init(cfg *Config) (func(context.Context) error, error)

Init 初始化全局 TracerProvider,返回 shutdown 函数。

func Inject

func Inject(ctx context.Context, carrier map[string]string)

Inject 将当前 Context 的 Trace 信息注入到 carrier 中 用于 MQ 等场景,将链路追踪信息传递给下游

func MarkSpanError

func MarkSpanError(span oteltrace.Span, err error)

MarkSpanError 记录并将 Span 标记为错误,当 err 不为 nil 时

func SpanNameMQConsume

func SpanNameMQConsume(destination string) string

SpanNameMQConsume 返回用于从主题/主题消费的标准 Span Name

func SpanNameMQPublish

func SpanNameMQPublish(destination string) string

SpanNameMQPublish 返回用于发布到主题/主题的标准 Span Name

func StartConsumerSpanFromHeaders

func StartConsumerSpanFromHeaders(
	ctx context.Context,
	tracer oteltrace.Tracer,
	spanName string,
	headers map[string]string,
	meta MessagingMeta,
	attrs ...attribute.KeyValue,
) (context.Context, oteltrace.Span)

StartConsumerSpanFromHeaders 从传入的 headers 启动一个标准化的消费者 Span 关系默认是 link,可通过 MessagingMeta.TraceRelation 切换为 child_of

func StartProducerSpan

func StartProducerSpan(
	ctx context.Context,
	tracer oteltrace.Tracer,
	spanName string,
	meta MessagingMeta,
	attrs ...attribute.KeyValue,
) (context.Context, oteltrace.Span, map[string]string)

StartProducerSpan 启动一个标准化的生产者 Span,并将上下文注入到 headers

Types

type Config

type Config struct {
	ServiceName string  `mapstructure:"service_name"`
	Endpoint    string  `mapstructure:"endpoint"`
	Sampler     float64 `mapstructure:"sampler"`
	Batcher     string  `mapstructure:"batcher"`
	Insecure    bool    `mapstructure:"insecure"`
}

Config 配置

func DefaultConfig

func DefaultConfig(serviceName string) *Config

DefaultConfig 返回默认配置

type MessagingMeta

type MessagingMeta struct {
	System        string
	Destination   string
	Operation     string
	ConsumerGroup string
	// TraceRelation 控制消费端与上游生产端的关系建模方式,默认 link。
	TraceRelation MessagingTraceRelation
}

MessagingMeta 描述标准化的消息属性

type MessagingTraceRelation

type MessagingTraceRelation string

MessagingTraceRelation 表示消费者 Span 与上游消息 Span 的关系建模方式

const (
	// MessagingTraceRelationLink 使用 Span Link 关联上游(默认,适合异步/批处理/多消费者)
	MessagingTraceRelationLink MessagingTraceRelation = "link"
	// MessagingTraceRelationChildOf 使用 parent/child 关系串成单条 Trace(适合端到端演示)
	MessagingTraceRelationChildOf MessagingTraceRelation = "child_of"
)

Jump to

Keyboard shortcuts

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