telemetrymgr

package
v0.0.6 Latest Latest
Warning

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

Go to latest
Published: Jan 23, 2026 License: BSD-2-Clause Imports: 17 Imported by: 0

README

telemetrymgr

可观测性管理模块,提供统一的 Traces、Metrics、Logs 三大信号管理能力。

特性

  • 统一接口 - 提供 TelemetryManager 接口,统一管理可观测性组件
  • 多驱动支持 - 支持 none(空实现)和 otel(OpenTelemetry)两种驱动
  • 生命周期管理 - 集成 OnStart/OnStop 生命周期钩子,支持优雅关闭
  • 灵活配置 - 支持从配置提供者或直接配置创建管理器实例
  • 完整可观测性 - 支持链路追踪、指标收集和结构化日志
  • 线程安全 - 所有实现都是并发安全的

快速开始

使用 none 驱动(空实现)
import (
    "context"
    "github.com/lite-lake/litecore-go/manager/telemetrymgr"
)

func main() {
    // 创建空实现管理器
    mgr, err := telemetrymgr.Build("none", nil)
    if err != nil {
        log.Fatal(err)
    }
    defer mgr.Shutdown(context.Background())

    // 使用 tracer(no-op)
    tracer := mgr.Tracer("my-service")
    ctx, span := tracer.Start(context.Background(), "operation")
    defer span.End()
}
使用 OpenTelemetry 驱动
import (
    "github.com/lite-lake/litecore-go/manager/telemetrymgr"
)

func main() {
    // 创建 OTel 管理器
    mgr, err := telemetrymgr.Build("otel", map[string]any{
        "endpoint": "localhost:4317",
        "insecure": true,
        "headers": map[string]any{
            "authorization": "Bearer token",
        },
        "traces": map[string]any{
            "enabled": true,
        },
    })
    if err != nil {
        log.Fatal(err)
    }
    defer mgr.Shutdown(context.Background())

    // 使用 tracer
    tracer := mgr.Tracer("my-service")
    ctx, span := tracer.Start(context.Background(), "operation")
    defer span.End()
    span.SetAttributes(attribute.String("user.id", "123"))
}
从配置提供者创建
// 配置提供者会读取以下配置:
// - telemetry.driver: "otel" 或 "none"
// - telemetry.otel_config: OTel 配置对象

mgr, err := telemetrymgr.BuildWithConfigProvider(configProvider)
if err != nil {
    log.Fatal(err)
}
defer mgr.Shutdown(context.Background())

配置

OTel 驱动配置
字段 类型 默认值 说明
endpoint string localhost:4317 OTLP 端点地址
insecure bool false 是否使用不安全连接(非 TLS)
headers map[string]string nil 请求头(用于认证)
resource_attributes []ResourceAttribute nil 资源属性
traces.enabled bool false 是否启用链路追踪
metrics.enabled bool false 是否启用指标收集
logs.enabled bool false 是否启用结构化日志
资源属性配置
resourceAttributes := []telemetrymgr.ResourceAttribute{
    {Key: "service.name", Value: "my-service"},
    {Key: "service.version", Value: "1.0.0"},
    {Key: "deployment.environment", Value: "production"},
}

核心 API

创建管理器
Build() - 从直接配置创建
func Build(driverType string, driverConfig map[string]any) (ITelemetryManager, error)

参数:

  • driverType: 驱动类型("otel" 或 "none")
  • driverConfig: 驱动配置(根据驱动类型不同而不同)
BuildWithConfigProvider() - 从配置提供者创建
func BuildWithConfigProvider(configProvider configmgr.IConfigManager) (ITelemetryManager, error)

配置路径:

  • telemetry.driver: 驱动类型
  • telemetry.otel_config: OTel 配置
Tracer - 链路追踪
// 获取 Tracer 实例
tracer := mgr.Tracer("my-service")

// 创建 span
ctx, span := tracer.Start(ctx, "operation-name")
defer span.End()

// 设置属性
span.SetAttributes(attribute.String("key", "value"))

// 添加事件
span.AddEvent("event-name", attribute.String("details", "..."))

// 设置状态
span.SetStatus(codes.Error, "operation failed")
Meter - 指标收集
// 获取 Meter 实例
meter := mgr.Meter("my-service")

// 创建计数器
counter, _ := meter.Float64Counter("requests_total")
counter.Add(ctx, 1, attribute.String("path", "/api/users"))

// 创建直方图
histogram, _ := meter.Float64Histogram("request_duration")
histogram.Record(ctx, 123.45, attribute.String("status", "success"))
Logger - 结构化日志
// 获取 Logger 实例
logger := mgr.Logger("my-service")

// 发送日志记录
logger.Emit(ctx, log.Record{
    Timestamp:        time.Now(),
    Severity:         log.SeverityInfo,
    Body:             attribute.String("message", "operation completed"),
    Attributes:       []attribute.KeyValue{attribute.String("user.id", "123")},
})

驱动类型

none 驱动

空实现,不产生任何可观测性数据。适用于:

  • 开发测试环境
  • 不需要遥测的场景
  • 性能敏感的应用

所有方法都返回 no-op 实现,调用开销极小。

otel 驱动

完整的 OpenTelemetry 实现,支持:

  • 连接到 OTLP 收集器(Jaeger、Tempo、Prometheus 等)
  • 发送链路追踪数据
  • 发送指标数据
  • 发送日志数据

支持的功能:

  • 资源属性自定义
  • 请求头认证
  • TLS/非 TLS 连接
  • 三大信号独立启用/禁用

生命周期管理

// 启动时
if err := mgr.OnStart(); err != nil {
    log.Fatal(err)
}

// 健康检查
if err := mgr.Health(); err != nil {
    log.Printf("manager unhealthy: %v", err)
}

// 停止时(会自动调用 Shutdown)
if err := mgr.OnStop(); err != nil {
    log.Printf("manager stop failed: %v", err)
}

// 或手动关闭
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
if err := mgr.Shutdown(ctx); err != nil {
    log.Printf("manager shutdown failed: %v", err)
}

错误处理

创建失败
mgr, err := telemetrymgr.Build("otel", map[string]any{
    "endpoint": "", // 空端点会导致验证失败
})
if err != nil {
    // 错误会包含详细的失败原因
    log.Printf("failed to create manager: %v", err)
    return
}
关闭失败
// 关闭失败不会影响程序运行,但可能导致数据丢失
if err := mgr.Shutdown(ctx); err != nil {
    log.Printf("warning: manager shutdown incomplete: %v", err)
}

最佳实践

1. 使用 defer 确保资源释放
mgr, err := telemetrymgr.Build("otel", config)
if err != nil {
    return err
}
defer mgr.Shutdown(context.Background())
2. 设置合理的关闭超时
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
mgr.Shutdown(ctx)
3. 为不同服务使用不同的名称
userServiceTracer := mgr.Tracer("user-service")
orderServiceTracer := mgr.Tracer("order-service")
4. 在开发环境使用 none 驱动
driver := "none"
if os.Getenv("ENV") == "production" {
    driver = "otel"
}

mgr, err := telemetrymgr.Build(driver, config)
5. 资源属性包含服务信息
config := map[string]any{
    "resource_attributes": []telemetrymgr.ResourceAttribute{
        {Key: "service.name", Value: "my-service"},
        {Key: "service.version", Value: version},
        {Key: "deployment.environment", Value: environment},
    },
}

性能考虑

  • none 驱动:开销极小,几乎可以忽略
  • otel 驱动未启用特性时:使用 no-op provider,开销很小
  • otel 驱动启用特性后:会建立网络连接,使用批处理减少开销
  • 并发安全:所有方法都可以安全地并发调用

线程安全

TelemetryManager 接口的所有实现都是并发安全的,可以在多个 goroutine 中同时使用。

// 多个 goroutine 可以安全地使用同一个管理器
for i := 0; i < 10; i++ {
    go func() {
        tracer := mgr.Tracer("worker")
        ctx, span := tracer.Start(context.Background(), "task")
        defer span.End()
        // ... 执行任务
    }()
}

Documentation

Overview

Package telemetrymgr 提供统一的可观测性管理功能,支持 Traces、Metrics、Logs 三大信号。

核心特性:

  • 统一接口 - 提供 TelemetryManager 接口,统一管理可观测性组件
  • 多驱动支持 - 支持 none(空实现)和 otel(OpenTelemetry)两种驱动
  • 生命周期管理 - 集成 OnStart/OnStop 生命周期钩子,支持优雅关闭
  • 灵活配置 - 支持从配置提供者或直接配置创建管理器实例
  • 可观测性集成 - 完整支持链路追踪、指标收集和结构化日志

基本用法:

loggermgr "github.com/lite-lake/litecore-go/component/manager/loggermgr"

loggerMgr := loggermgr.GetLoggerManager()
logger := loggerMgr.Logger("main")

// 使用默认的 none 驱动创建管理器
mgr, err := telemetrymgr.Build("none", nil)
if err != nil {
    logger.Fatal("创建可观测性管理器失败", "error", err)
}
defer mgr.Shutdown(context.Background())

// 使用 OpenTelemetry 驱动
mgr, err = telemetrymgr.Build("otel", map[string]any{
    "endpoint": "localhost:4317",
    "insecure": true,
})
if err != nil {
    logger.Fatal("创建可观测性管理器失败", "error", err)
}
defer mgr.Shutdown(context.Background())

驱动类型:

支持 "none" 和 "otel" 两种驱动:

  • none: 空实现,不产生任何可观测性数据,适用于不需要遥测的场景
  • otel: OpenTelemetry 实现,连接到 OTLP 收集器(如 Jaeger、Tempo 等)

从配置提供者创建:

// 从配置提供者读取配置
mgr, err := telemetrymgr.BuildWithConfigProvider(configProvider)
if err != nil {
    logger.Fatal("从配置提供者创建可观测性管理器失败", "error", err)
}

配置路径:

  • telemetry.driver: 驱动类型 ("otel", "none")
  • telemetry.otel_config: OTel 驱动配置(当 driver=otel 时使用)

使用 Tracer:

tracer := mgr.Tracer("my-service")
ctx, span := tracer.Start(ctx, "operation-name")
defer span.End()
span.SetAttributes(attribute.String("key", "value"))

使用 Meter:

meter := mgr.Meter("my-service")
counter, _ := meter.Float64Counter("requests_total")
counter.Add(ctx, 1, attribute.String("path", "/api/users"))

使用 Logger:

logger := mgr.Logger("my-service")
logger.Emit(context.Background(), log.Record{...})

优雅关闭:

// OnStop 会自动调用 Shutdown,也可以手动调用
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
mgr.Shutdown(ctx)

Index

Constants

View Source
const (
	// 默认值
	DefaultOtelEndpoint = "localhost:4317"
	DefaultOtelInsecure = false
)

Variables

This section is empty.

Functions

func ValidateContext

func ValidateContext(ctx context.Context) error

ValidateContext 验证上下文是否有效

Types

type FeatureConfig

type FeatureConfig struct {
	Enabled bool `yaml:"enabled"`
}

FeatureConfig 功能配置

type ITelemetryManager

type ITelemetryManager interface {
	common.IBaseManager

	// ========== Tracing ==========
	// Tracer 获取 Tracer 实例
	Tracer(name string) trace.Tracer

	// TracerProvider 获取 TracerProvider
	TracerProvider() *sdktrace.TracerProvider

	// ========== Metrics ==========
	// Meter 获取 Meter 实例
	Meter(name string) metric.Meter

	// MeterProvider 获取 MeterProvider
	MeterProvider() *sdkmetric.MeterProvider

	// ========== Logging ==========
	// Logger 获取 Logger 实例
	Logger(name string) log.Logger

	// LoggerProvider 获取 LoggerProvider
	LoggerProvider() *sdklog.LoggerProvider

	// ========== 生命周期 ==========
	// Shutdown 关闭观测管理器,刷新所有待处理的数据
	Shutdown(ctx context.Context) error
}

ITelemetryManager 观测管理器接口 统一提供 Traces、Metrics、Logs 三大观测能力

func Build

func Build(
	driverType string,
	driverConfig map[string]any,
) (ITelemetryManager, error)

Build 创建观测管理器实例 driverType: 驱动类型 ("otel", "none") driverConfig: 驱动配置 (根据驱动类型不同而不同)

  • otel: 传递给 parseOtelConfig 的 map[string]any
  • none: 忽略

返回 ITelemetryManager 接口实例和可能的错误

func BuildWithConfigProvider

func BuildWithConfigProvider(configProvider configmgr.IConfigManager) (ITelemetryManager, error)

BuildWithConfigProvider 从配置提供者创建观测管理器实例 自动从配置提供者读取 telemetry.driver 和对应驱动配置 配置路径:

  • telemetry.driver: 驱动类型 ("otel", "none")
  • telemetry.otel_config: OTEL 驱动配置(当 driver=otel 时使用)

返回 ITelemetryManager 接口实例和可能的错误

func NewTelemetryManagerNoneImpl

func NewTelemetryManagerNoneImpl() ITelemetryManager

NewTelemetryManagerNoneImpl 创建空观测管理器实现

func NewTelemetryManagerOtelImpl

func NewTelemetryManagerOtelImpl(cfg *TelemetryConfig) (ITelemetryManager, error)

NewTelemetryManagerOtelImpl 创建 OTEL 观测管理器实现

type OtelConfig

type OtelConfig struct {
	Endpoint           string              `yaml:"endpoint"`            // OTLP 端点,如 http://localhost:4317
	Insecure           bool                `yaml:"insecure"`            // 是否使用不安全连接(默认false,使用TLS)
	ResourceAttributes []ResourceAttribute `yaml:"resource_attributes"` // 资源属性
	Headers            map[string]string   `yaml:"headers"`             // 请求头(用于认证)
	Traces             *FeatureConfig      `yaml:"traces"`              // 链路追踪配置
	Metrics            *FeatureConfig      `yaml:"metrics"`             // 指标配置
	Logs               *FeatureConfig      `yaml:"logs"`                // 日志配置
}

OtelConfig OpenTelemetry 配置

type ResourceAttribute

type ResourceAttribute struct {
	Key   string `yaml:"key"`
	Value string `yaml:"value"`
}

ResourceAttribute 资源属性

type TelemetryConfig

type TelemetryConfig struct {
	Driver     string      `yaml:"driver"`      // 驱动类型: none, otel
	OtelConfig *OtelConfig `yaml:"otel_config"` // OTEL 驱动配置
}

TelemetryConfig 观测管理配置

func DefaultConfig

func DefaultConfig() *TelemetryConfig

DefaultConfig 返回默认配置(禁用观测)

func ParseTelemetryConfigFromMap

func ParseTelemetryConfigFromMap(cfg map[string]any) (*TelemetryConfig, error)

ParseTelemetryConfigFromMap 从 ConfigMap 解析观测配置

func (*TelemetryConfig) Validate

func (c *TelemetryConfig) Validate() error

Validate 验证配置

Jump to

Keyboard shortcuts

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