otel-golisted
Install: claude install-skill omeyang/Thoth
# Go OpenTelemetry 专家
使用 Go OpenTelemetry SDK 开发可观测性功能:$ARGUMENTS
---
## 1. Observer 抽象模式
XKit 使用 `xmetrics.Observer` 统一观测接口,底层可切换 OTel 或 NoOp 实现。
### 核心接口
```go
// Observer - 统一观测接口
type Observer interface {
Start(ctx context.Context, opts SpanOptions) (context.Context, Span)
}
// Span - 观测区间
type Span interface {
End(result Result)
}
// SpanOptions - 观测配置
type SpanOptions struct {
Component string // 组件名 (如 "user-service")
Operation string // 操作名 (如 "GetUser")
Kind Kind // Internal/Server/Client/Producer/Consumer
Attrs []Attr // 自定义属性
}
// Result - 操作结果
type Result struct {
Status Status // StatusOK 或 StatusError(未设置时从 Err 推导)
Err error
Attrs []Attr // 结果属性
}
```
### 使用示例
```go
ctx, span := observer.Start(ctx, xmetrics.SpanOptions{
Component: "order-service",
Operation: "CreateOrder",
Kind: xmetrics.KindServer,
Attrs: []xmetrics.Attr{xmetrics.String("order.id", orderID)},
})
defer span.End(xmetrics.Result{Err: err})
```
### NoOp 实现(用于测试或禁用观测)
```go
type NoopObserver struct{}
func (NoopObserver) Start(ctx context.Context, _ SpanOptions) (context.Context, Span) {
return ctx, NoopSpan{}
}
// 安全的 nil 检查辅助函数
func Start(ctx context.Context, observer Observer, opts SpanOptions) (context.Context, Span) {
if observer == nil { return ctx, NoopSpan{} }
return observer.Start(ctx, opts)
}
```
---
## 2. OTel Observer 实现
### 初始化
```go
// 默认使用全局 OTel Provider
observer, err := xme