metrics

package
v0.0.2 Latest Latest
Warning

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

Go to latest
Published: Jul 20, 2026 License: MIT Imports: 10 Imported by: 0

README

metrics 包 — 指标收集

所属层级: Infrastructure Layer
设计理念: 零外部依赖,轻量级指标收集
设计灵感: Micrometer

概述

metrics 包提供轻量级的指标收集接口和默认实现,零外部依赖,仅使用 Go 标准库。核心概念参考 Micrometer,提供 Counter(计数器)和 Gauge(仪表盘)两种指标类型,通过 MeterRegistry 统一管理。

核心功能
功能 说明
计数器 Counter 只增不减,适用于请求总数、错误次数等
仪表盘 Gauge 可增可减,适用于连接数、内存使用量等
指标注册表 MeterRegistry 统一管理指标创建与收集
标签支持 支持为指标添加键值对标签
并发安全 所有实现均为并发安全
零依赖 仅使用 Go 标准库

核心接口

Counter 接口

计数器,只增不减,适用于记录请求总数、错误次数等单调递增的数值:

type Counter interface {
    Inc()          // 加 1
    Add(v float64) // 增加指定值
    Value() float64 // 获取当前值
}
Gauge 接口

仪表盘,可增可减,适用于记录当前连接数、内存使用量、CPU 使用率等:

type Gauge interface {
    Set(v float64)  // 设置当前值
    Add(v float64)  // 增加指定值(负数即减少)
    Value() float64 // 获取当前值
}
MeterRegistry 接口

指标注册表,管理 Counter 和 Gauge 的创建与收集:

type MeterRegistry interface {
    Counter(name string, tags ...string) Counter // 获取或创建计数器
    Gauge(name string, tags ...string) Gauge     // 获取或创建仪表盘
    Collect() []Metric                            // 收集所有指标快照
}
  • tags 参数为偶数个的键值对序列(如 "service", "auth", "version", "v1"
  • Collect() 返回所有已注册指标的 Metric 快照
Metric 结构体

指标快照结构体,用于采集和上报:

type Metric struct {
    Name  string            // 指标名称
    Value float64           // 指标当前值
    Tags  map[string]string // 指标标签
}

快速开始

创建指标注册表
package main

import (
    "fmt"
    "github.com/xudefa/enhance/metrics"
)

func main() {
    registry := metrics.NewSimpleRegistry()

    // 创建计数器
    reqCounter := registry.Counter("requests_total", "service", "api")
    errCounter := registry.Counter("errors_total", "service", "api")

    // 创建仪表盘
    connGauge := registry.Gauge("active_connections", "pool", "main")

    // 模拟业务
    reqCounter.Inc()
    reqCounter.Inc()
    errCounter.Inc()
    connGauge.Set(42)
    connGauge.Add(-1)

    // 采集
    for _, m := range registry.Collect() {
        fmt.Printf("Metric: %s = %.0f\n", m.Name, m.Value)
    }
    // 输出:
    // Metric: requests_total = 2
    // Metric: errors_total = 1
    // Metric: active_connections = 41
}
独立使用 Counter / Gauge

SimpleCounterSimpleGauge 可独立于 Registry 使用:

counter := metrics.NewSimpleCounter()
counter.Inc()

gauge := metrics.NewSimpleGauge()
gauge.Set(100)

API 参考

SimpleRegistry — 默认实现

SimpleRegistryMeterRegistry 的默认实现,使用 map 存储指标,sync.Mutex 保证并发安全:

registry := metrics.NewSimpleRegistry()

counter := registry.Counter("http_requests_total", "method", "GET")
counter.Inc()

gauge := registry.Gauge("memory_usage", "type", "heap")
gauge.Set(1024.5)

// 收集所有指标
allMetrics := registry.Collect()
for _, m := range allMetrics {
    fmt.Printf("%s = %.2f (tags: %v)\n", m.Name, m.Value, m.Tags)
}
设计要点
  • SimpleCounter 使用 sync.RWMutex:读操作(Value)使用 RLock,写操作(Inc/Add)使用 Lock
  • SimpleGauge 使用 sync.Mutex(无区分读写锁的必要)
  • SimpleRegistry 按名称索引,同名 Counter 或 Gauge 在注册表中共享同一实例
  • tags 参数通过 parseTags() 解析为 map[string]string,偶数索引为 key,奇数索引为 value
  • 所有实现均为并发安全,适用于多 goroutine 场景

使用示例

HTTP 请求指标
registry := metrics.NewSimpleRegistry()

// 创建指标
reqCounter := registry.Counter("http_requests_total", "method", "GET", "status", "200")
errCounter := registry.Counter("http_errors_total", "method", "POST")
durationGauge := registry.Gauge("http_request_duration", "path", "/api/users")

// 记录请求
reqCounter.Inc()

// 记录错误
errCounter.Inc()

// 记录耗时
durationGauge.Set(150.5) // 毫秒
数据库连接池指标
registry := metrics.NewSimpleRegistry()

// 连接数
activeConnGauge := registry.Gauge("db_active_connections", "pool", "main")
idleConnGauge := registry.Gauge("db_idle_connections", "pool", "main")

// 查询统计
queryCounter := registry.Counter("db_queries_total", "type", "select")
errorCounter := registry.Counter("db_errors_total", "type", "timeout")

// 更新指标
activeConnGauge.Set(10)
idleConnGauge.Set(5)
queryCounter.Add(100)
errorCounter.Inc()
与 Actuator 集成
// 将 metrics 注册表注入到 Actuator
actuator := actuator.New(ctx)
actuator.SetMetricsRegistry(registry)

// 通过 /actuator/metrics 端点暴露指标

最佳实践

1. 使用标签区分指标维度
// ✅ 推荐:使用标签区分不同维度
reqCounter := registry.Counter("http_requests_total", 
    "method", "GET",
    "status", "200",
    "path", "/api/users",
)

// ⚠️ 不推荐:为每个组合创建独立指标
reqCounterGet200 := registry.Counter("http_requests_get_200_users")
reqCounterPost200 := registry.Counter("http_requests_post_200_users")
2. 合理选择 Counter 和 Gauge
// ✅ 推荐:请求总数使用 Counter(只增不减)
reqCounter := registry.Counter("requests_total")
reqCounter.Inc()

// ✅ 推荐:连接数使用 Gauge(可增可减)
connGauge := registry.Gauge("active_connections")
connGauge.Set(10)
connGauge.Add(-1)

// ⚠️ 不推荐:使用 Gauge 记录请求总数
reqGauge := registry.Gauge("requests_total")
reqGauge.Set(100) // 容易误操作减少
3. 定期采集指标
// ✅ 推荐:定期采集并上报指标
ticker := time.NewTicker(10 * time.Second)
go func() {
    for range ticker.C {
        metrics := registry.Collect()
        reportToMonitoring(metrics)
    }
}()

// ⚠️ 不推荐:只在程序结束时采集
defer func() {
    reportToMonitoring(registry.Collect())
}()
4. 与依赖注入集成
// ✅ 推荐:将 Registry 注册为 Bean
container.Register(
    reflect.TypeOf(&metrics.SimpleRegistry{}),
    core.Bean(metrics.NewSimpleRegistry()),
    core.Singleton(),
)

// 注入使用
type UserService struct {
    Metrics metrics.MeterRegistry `inject:"metrics"`
}

func (s *UserService) GetUser(id int) (*User, error) {
    counter := s.Metrics.Counter("user_get_total")
    counter.Inc()
    return s.db.GetUser(id)
}
5. 命名规范
// ✅ 推荐:使用下划线分隔的命名
registry.Counter("http_requests_total")
registry.Gauge("active_connections")

// ✅ 推荐:添加单位后缀
registry.Gauge("request_duration_ms")
registry.Gauge("memory_usage_bytes")

// ⚠️ 不推荐:使用驼峰命名
registry.Counter("httpRequestsTotal")

Documentation

Overview

Package metrics 提供指标收集和导出功能,用于 enhance 框架。

该模块提供统一的指标抽象接口,支持多种指标后端集成。 包含指标注册、收集、Prometheus 导出等监控支持。

架构设计

  • MeterRegistry: 指标注册表,管理所有指标
  • Counter: 计数器指标,只增不减
  • Gauge: 仪表盘指标,可增可减
  • Timer: 计时器指标,记录耗时
  • Histogram: 直方图指标,记录分布

核心功能

  • 指标注册: 支持注册多种类型的指标
  • 指标收集: 自动收集和聚合指标数据
  • 指标导出: 支持导出到 Prometheus 等监控系统
  • 标签支持: 支持带标签的指标

使用方式

创建指标注册表:

registry := metrics.NewSimpleRegistry()

注册计数器:

counter := registry.Counter("http.requests.total", "method", "GET")
counter.Inc()

注册计时器:

timer := registry.Timer("http.request.duration")
timer.Record(time.Duration)

集成后端

具体实现位于 starter 子包:

  • starter/prometheus: Prometheus 集成
  • starter/otel: OpenTelemetry 集成

Index

Constants

View Source
const (
	ConditionTrue = "true"
)
View Source
const (
	// Metrics 配置
	MetricsEnabled = "metrics.enabled"
)

Variables

This section is empty.

Functions

This section is empty.

Types

type ConsoleExporter

type ConsoleExporter struct{}

ConsoleExporter 控制台导出器

func (*ConsoleExporter) Export

func (e *ConsoleExporter) Export(metrics []Metric) error

type Counter

type Counter interface {
	// Inc 计数器加 1
	Inc()
	// Add 计数器增加指定值
	Add(v float64)
	// Value 返回当前计数值
	Value() float64
	// Reset 重置计数器为 0
	Reset()
}

Counter 计数器接口

用于记录单调递增的数值,如请求次数、错误计数。

func NewSimpleCounter

func NewSimpleCounter() Counter

NewSimpleCounter 创建新的简单计数器

type CounterBuilder deprecated

type CounterBuilder struct {
	// contains filtered or unexported fields
}

CounterBuilder 计数器构建器(向后兼容)

Deprecated: 使用 NewMetricBuilder(registry, name).BuildCounter() 替代

func NewCounterBuilder deprecated

func NewCounterBuilder(registry MeterRegistry, name string) *CounterBuilder

NewCounterBuilder 创建计数器构建器

Deprecated: 使用 NewMetricBuilder(registry, name) 替代

func (*CounterBuilder) Build

func (b *CounterBuilder) Build() Counter

Build 构建计数器

func (*CounterBuilder) Tag

func (b *CounterBuilder) Tag(key, value string) *CounterBuilder

Tag 添加单个标签

func (*CounterBuilder) Tags

func (b *CounterBuilder) Tags(tags map[string]string) *CounterBuilder

Tags 批量添加标签

type Exporter

type Exporter interface {
	Export(metrics []Metric) error
}

Exporter 指标导出器接口

func NewConsoleExporter

func NewConsoleExporter() Exporter

func NewPrometheusExporter

func NewPrometheusExporter(writer io.Writer) Exporter

NewPrometheusExporter 创建新的 Prometheus 导出器

type Gauge

type Gauge interface {
	// Set 设置当前值
	Set(v float64)
	// Add 增加指定值(可以为负数)
	Add(v float64)
	// Value 返回当前值
	Value() float64
}

Gauge 仪表盘接口

用于记录可增可减的数值,如当前连接数、CPU 使用率。

func NewSimpleGauge

func NewSimpleGauge() Gauge

NewSimpleGauge 创建新的简单仪表盘

type GaugeBuilder deprecated

type GaugeBuilder struct {
	// contains filtered or unexported fields
}

GaugeBuilder 仪表盘构建器(向后兼容)

Deprecated: 使用 NewMetricBuilder(registry, name).BuildGauge() 替代

func NewGaugeBuilder deprecated

func NewGaugeBuilder(registry MeterRegistry, name string) *GaugeBuilder

NewGaugeBuilder 创建仪表盘构建器

Deprecated: 使用 NewMetricBuilder(registry, name) 替代

func (*GaugeBuilder) Build

func (b *GaugeBuilder) Build() Gauge

Build 构建仪表盘

func (*GaugeBuilder) Tag

func (b *GaugeBuilder) Tag(key, value string) *GaugeBuilder

Tag 添加单个标签

func (*GaugeBuilder) Tags

func (b *GaugeBuilder) Tags(tags map[string]string) *GaugeBuilder

Tags 批量添加标签

type Histogram

type Histogram interface {
	// Record 记录一个值
	Record(v float64)
	// RecordWithLabels 记录带标签的值
	RecordWithLabels(v float64, labels map[string]string)
	// Count 返回记录的样本数
	Count() int64
	// Sum 返回所有样本的总和
	Sum() float64
	// Reset 重置直方图
	Reset()
}

Histogram 直方图接口

用于记录分布情况,如请求延迟、响应大小等。

func NewSimpleHistogram

func NewSimpleHistogram(name string, tags map[string]string) Histogram

NewSimpleHistogram 创建新的简单直方图

type HistogramBuilder deprecated

type HistogramBuilder struct {
	// contains filtered or unexported fields
}

HistogramBuilder 直方图构建器(向后兼容)

Deprecated: 使用 NewMetricBuilder(registry, name).BuildHistogram() 替代

func NewHistogramBuilder deprecated

func NewHistogramBuilder(registry MeterRegistry, name string) *HistogramBuilder

NewHistogramBuilder 创建直方图构建器

Deprecated: 使用 NewMetricBuilder(registry, name) 替代

func (*HistogramBuilder) Build

func (b *HistogramBuilder) Build() Histogram

Build 构建直方图

func (*HistogramBuilder) Tag

func (b *HistogramBuilder) Tag(key, value string) *HistogramBuilder

Tag 添加单个标签

func (*HistogramBuilder) Tags

func (b *HistogramBuilder) Tags(tags map[string]string) *HistogramBuilder

Tags 批量添加标签

type MeterRegistry

type MeterRegistry interface {
	// Counter 获取或创建指定名称的计数器
	// name: 指标名称
	// tags: 标签对,格式为 key1, value1, key2, value2...
	Counter(name string, tags ...string) Counter

	// Gauge 获取或创建指定名称的仪表盘
	// name: 指标名称
	// tags: 标签对,格式为 key1, value1, key2, value2...
	Gauge(name string, tags ...string) Gauge

	// Histogram 获取或创建指定名称的直方图
	// name: 指标名称
	// tags: 标签对,格式为 key1, value1, key2, value2...
	Histogram(name string, tags ...string) Histogram

	// Collect 收集所有已注册的指标快照
	Collect() []Metric

	// RegisterExporter 注册指标导出器
	RegisterExporter(exporter Exporter)

	// Export 导出所有指标到已注册的导出器
	Export() error

	// Reset 重置所有指标为初始状态
	Reset()
}

MeterRegistry 指标注册表接口

管理 Counter、Gauge 和 Histogram 的创建与收集,支持按名称获取或创建。 提供指标导出功能,可将指标数据导出到不同的监控系统。

func NewSimpleRegistry

func NewSimpleRegistry() MeterRegistry

NewSimpleRegistry 创建新的简单指标注册表

type Metric

type Metric struct {
	Name      string            `json:"name"`      // 指标名称
	Value     float64           `json:"value"`     // 指标当前值
	Tags      map[string]string `json:"tags"`      // 指标标签
	Type      string            `json:"type"`      // 指标类型: counter/gauge/histogram
	Timestamp int64             `json:"timestamp"` // 时间戳
	Count     int64             `json:"count"`     // 样本数量(仅直方图)
	Sum       float64           `json:"sum"`       // 样本总和(仅直方图)
}

Metric 指标快照

包含指标名称、当前值和标签信息,用于采集和上报。

type MetricBuilder

type MetricBuilder struct {
	// contains filtered or unexported fields
}

MetricBuilder 统一的指标构建器

使用泛型 Builder 模式替代重复的 CounterBuilder/GaugeBuilder/HistogramBuilder。 支持链式配置标签,符合 Go 惯用法。

使用示例:

// 创建计数器
counter := NewMetricBuilder(registry, "http_requests").
    Tag("method", "GET").
    Tag("status", "200").
    BuildCounter()

// 创建仪表盘
gauge := NewMetricBuilder(registry, "memory_usage").
    Tag("type", "heap").
    BuildGauge()

// 创建直方图
histogram := NewMetricBuilder(registry, "request_duration").
    Tag("endpoint", "/api").
    BuildHistogram()

func NewMetricBuilder

func NewMetricBuilder(registry MeterRegistry, name string) *MetricBuilder

NewMetricBuilder 创建指标构建器

func (*MetricBuilder) BuildCounter

func (b *MetricBuilder) BuildCounter() Counter

BuildCounter 构建计数器

func (*MetricBuilder) BuildGauge

func (b *MetricBuilder) BuildGauge() Gauge

BuildGauge 构建仪表盘

func (*MetricBuilder) BuildHistogram

func (b *MetricBuilder) BuildHistogram() Histogram

BuildHistogram 构建直方图

func (*MetricBuilder) Tag

func (b *MetricBuilder) Tag(key, value string) *MetricBuilder

Tag 添加单个标签

func (*MetricBuilder) Tags

func (b *MetricBuilder) Tags(tags map[string]string) *MetricBuilder

Tags 批量添加标签

type MetricsAutoConfiguration

type MetricsAutoConfiguration struct{}

MetricsAutoConfiguration Metrics 自动配置

func (*MetricsAutoConfiguration) Configure

Configure 注册 SimpleRegistry 为单例 Bean

type PrometheusExporter

type PrometheusExporter struct {
	// contains filtered or unexported fields
}

PrometheusExporter Prometheus 格式指标导出器

将指标数据转换为 Prometheus 兼容的文本格式。 支持 Counter、Gauge、Histogram 等指标类型的导出。

func (*PrometheusExporter) Export

func (e *PrometheusExporter) Export(metrics []Metric) error

Export 将指标导出为 Prometheus 格式

Jump to

Keyboard shortcuts

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