metrics

package
v0.5.0 Latest Latest
Warning

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

Go to latest
Published: Mar 29, 2026 License: MIT Imports: 25 Imported by: 0

README

metrics

Go Reference

metrics 是 Genesis 的 L0 指标组件,基于 OpenTelemetry 提供统一的指标创建能力,并可选暴露 Prometheus HTTP 端点。它面向微服务和组件库场景,解决统一指标接口、Prometheus 暴露和 HTTP/gRPC 服务端 RED 埋点的复用问题。

组件定位

metrics 当前采用全局模式工作:

  • New() 会创建 MeterProvider
  • 同时会把它安装为 OpenTelemetry 全局 MeterProvider
  • 仓库内依赖全局 provider 的埋点库会立即共享这套状态

这意味着它更适合作为应用启动时初始化一次的基础组件,而不是在运行时频繁创建多个实例。

快速开始

meter, err := metrics.New(&metrics.Config{
    ServiceName: "my-service",
    Version:     "v1.0.0",
    Port:        9090,
    Path:        "/metrics",
})
if err != nil {
    return err
}
defer meter.Shutdown(ctx)

counter, _ := meter.Counter("http_requests_total", "HTTP 请求总数")
counter.Inc(ctx, metrics.L("method", "GET"), metrics.L("status", "200"))

配置约定

Config 的关键行为有三点:

  • ServiceName 必填
  • Port > 0Path 非空时,组件会启动 Prometheus HTTP 端点
  • 只要 Port <= 0Path 为空,就不会启动 HTTP 服务,只保留进程内指标能力

当前若 metrics HTTP 端口监听失败,New() 会直接返回错误,而不是在后台异步失败。

服务端埋点

组件内置了可复用的 HTTP/gRPC 服务端 RED 指标封装,避免业务侧重复实现。

Gin
httpMetrics, _ := metrics.NewHTTPServerMetrics(
    meter,
    metrics.DefaultHTTPServerMetricsConfig("gateway"),
)

r := gin.New()
r.Use(metrics.GinHTTPMiddleware(httpMetrics))

GinHTTPMiddleware 在未命中路由时会把 route 收敛为 unknown,避免把原始 URL path 写入标签导致高基数。

gRPC
grpcMetrics, _ := metrics.NewGRPCServerMetrics(
    meter,
    metrics.DefaultGRPCServerMetricsConfig("logic"),
)

srv := grpc.NewServer(
    grpc.UnaryInterceptor(grpcMetrics.UnaryServerInterceptor()),
)

生命周期

  • New() 通常应在应用启动时调用一次
  • Shutdown() 负责关闭 HTTP 服务和底层 MeterProvider
  • 如果当前全局 MeterProvider 仍指向该实例,Shutdown() 还会把全局状态重置为 no-op provider
  • Shutdown() 当前不是幂等承诺接口,推荐按“谁创建,谁关闭”原则调用一次

推荐实践

  • 生产环境统一使用一个全局 metrics 实例
  • 业务指标优先通过 Counter / Histogram / Gauge 统一创建,不要直接散落使用底层 OTel API
  • 避免高基数标签,例如 user_idrequest_id
  • 使用内置的 HTTP/gRPC 服务端埋点封装,统一标签结构与命名

相关文档

Documentation

Overview

Package metrics 提供 Genesis 的 OpenTelemetry 指标封装与 Prometheus 暴露能力。

这个组件当前采用“全局模式”工作:New 在创建 Meter 的同时,也会安装 OpenTelemetry 全局 MeterProvider。这样做的好处是仓库内依赖全局 provider 的埋点库可以立即生效;代价是重复调用 New 会覆盖之前安装的全局 provider。

因此推荐的使用方式是:应用启动时初始化一次 metrics,并在应用退出时调用 Shutdown 释放其持有的 HTTP 服务和 MeterProvider 资源。

Index

Constants

View Source
const (
	// 常见的标签
	LabelService     = "service"
	LabelOperation   = "operation"
	LabelMethod      = "method"
	LabelRoute       = "route"
	LabelStatusClass = "status_class"
	LabelOutcome     = "outcome"
	LabelGRPCCode    = "grpc_code"
)
View Source
const (
	// 常见的操作
	OperationHTTPServer = "http.server"
	OperationGRPCServer = "grpc.server"
)
View Source
const (
	// 常见的结果
	OutcomeSuccess = "success"
	OutcomeError   = "error"
)
View Source
const (
	MetricGRPCServerRequestTotal    = "grpc_server_requests_total"
	MetricGRPCServerDurationSeconds = "grpc_server_request_duration_seconds"
)
View Source
const (
	MetricHTTPServerRequestTotal    = "http_server_requests_total"
	MetricHTTPServerDurationSeconds = "http_server_request_duration_seconds"
)
View Source
const (
	// 未知路由
	UnknownRoute = "unknown"
)

Variables

This section is empty.

Functions

func GRPCOutcome

func GRPCOutcome(code codes.Code) string

GRPCOutcome 将 gRPC 状态代码映射到常见的结果

func GRPCStatusClass

func GRPCStatusClass(code codes.Code) string

GRPCStatusClass 将 gRPC 状态代码转换为稳定的小写类标签

func GinHTTPMiddleware

func GinHTTPMiddleware(httpMetrics *HTTPServerMetrics) gin.HandlerFunc

GinHTTPMiddleware 返回一个可重用的 Gin 中间件,用于记录 HTTP RED 指标

func HTTPOutcome

func HTTPOutcome(status int) string

HTTPOutcome 将 HTTP 状态代码映射到常见的结果

func HTTPStatusClass

func HTTPStatusClass(status int) string

HTTPStatusClass 返回 HTTP 状态类标签值:1xx/2xx/3xx/4xx/5xx/unknown

Types

type Config

type Config struct {
	ServiceName   string `mapstructure:"service_name"`
	Version       string `mapstructure:"version"`
	Port          int    `mapstructure:"port"`
	Path          string `mapstructure:"path"`
	EnableRuntime bool   `mapstructure:"enable_runtime"`
}

Config 定义全局 metrics 初始化参数。

当前实现采用 Prometheus exporter,并可选在同一进程内暴露 /metrics HTTP 端点。

func NewDevDefaultConfig

func NewDevDefaultConfig(serviceName string) *Config

NewDevDefaultConfig 开发环境默认配置

func NewProdDefaultConfig

func NewProdDefaultConfig(serviceName, version string) *Config

NewProdDefaultConfig 生产环境默认配置

type Counter

type Counter interface {
	Inc(ctx context.Context, labels ...Label)
	Add(ctx context.Context, val float64, labels ...Label)
}

Counter 计数器接口,用于记录只能增加的累计值

type GRPCServerMetrics

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

GRPCServerMetrics 封装可重用的 gRPC 服务器 RED 指标集

func NewGRPCServerMetrics

func NewGRPCServerMetrics(m Meter, cfg *GRPCServerMetricsConfig) (*GRPCServerMetrics, error)

NewGRPCServerMetrics 创建可重用的 gRPC 服务器指标

func (*GRPCServerMetrics) Observe

func (m *GRPCServerMetrics) Observe(ctx context.Context, fullMethod string, code codes.Code, duration time.Duration)

Observe 记录 gRPC RED 指标

func (*GRPCServerMetrics) StreamServerInterceptor

func (m *GRPCServerMetrics) StreamServerInterceptor() grpc.StreamServerInterceptor

StreamServerInterceptor 返回一个可重用的 grpc.StreamServerInterceptor

func (*GRPCServerMetrics) UnaryServerInterceptor

func (m *GRPCServerMetrics) UnaryServerInterceptor() grpc.UnaryServerInterceptor

UnaryServerInterceptor 返回一个可重用的 grpc.UnaryServerInterceptor

type GRPCServerMetricsConfig

type GRPCServerMetricsConfig struct {
	Service             string
	RequestTotalName    string
	RequestDurationName string
	DurationBuckets     []float64
	StaticLabels        []Label
}

GRPCServerMetricsConfig 配置可重用的 gRPC 服务器指标

func DefaultGRPCServerMetricsConfig

func DefaultGRPCServerMetricsConfig(service string) *GRPCServerMetricsConfig

DefaultGRPCServerMetricsConfig 返回默认的 gRPC 服务器指标配置

type Gauge

type Gauge interface {
	Set(ctx context.Context, val float64, labels ...Label)
	Inc(ctx context.Context, labels ...Label)
	Dec(ctx context.Context, labels ...Label)
}

Gauge 仪表盘接口,用于记录可以任意增减的瞬时值

type HTTPServerMetrics

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

HTTPServerMetrics 封装可重用的 HTTP 服务器 RED 指标集

func NewHTTPServerMetrics

func NewHTTPServerMetrics(m Meter, cfg *HTTPServerMetricsConfig) (*HTTPServerMetrics, error)

NewHTTPServerMetrics 创建可重用的 HTTP 服务器指标

func (*HTTPServerMetrics) Observe

func (m *HTTPServerMetrics) Observe(ctx context.Context, method string, route string, status int, duration time.Duration)

Observe 记录 HTTP 请求 RED 指标

type HTTPServerMetricsConfig

type HTTPServerMetricsConfig struct {
	Service             string
	RequestTotalName    string
	RequestDurationName string
	DurationBuckets     []float64
	StaticLabels        []Label
}

HTTPServerMetricsConfig 配置可重用的 HTTP 服务器指标

func DefaultHTTPServerMetricsConfig

func DefaultHTTPServerMetricsConfig(service string) *HTTPServerMetricsConfig

DefaultHTTPServerMetricsConfig 返回默认的 HTTP 服务器指标配置

type Histogram

type Histogram interface {
	Record(ctx context.Context, val float64, labels ...Label)
}

Histogram 直方图接口,用于记录值的分布情况

type Label

type Label struct {
	Key   string
	Value string
}

Label 指标标签

func L

func L(key, value string) Label

L 创建标签实例

type Meter

type Meter interface {
	Counter(name string, desc string, opts ...MetricOption) (Counter, error)
	Gauge(name string, desc string, opts ...MetricOption) (Gauge, error)
	Histogram(name string, desc string, opts ...MetricOption) (Histogram, error)
	// Shutdown 释放 Meter 持有的资源。
	//
	// 当前实现会关闭内部 HTTP 服务并关闭底层 MeterProvider。
	// 若当前全局 MeterProvider 仍指向该实例,Shutdown 还会将其重置为 no-op provider。
	// 它不是幂等承诺接口,调用方应按“谁创建,谁关闭”原则调用一次。
	Shutdown(ctx context.Context) error
}

Meter 指标创建工厂接口

func Discard

func Discard() Meter

Discard 创建空操作的 Meter

func New

func New(cfg *Config) (Meter, error)

New 创建 Meter 实例

New 当前采用全局模式:它会创建一个新的 MeterProvider,并安装为 OpenTelemetry 全局 MeterProvider。调用方通常应在应用启动阶段只调用一次。

当 Config 指定了 Port 和 Path 时,New 还会启动一个 Prometheus HTTP 暴露端点。 若监听端口失败,New 会直接返回错误,而不是在后台异步失败。

type MetricOption

type MetricOption func(*metricOptions)

MetricOption 指标配置选项

func WithBuckets

func WithBuckets(buckets []float64) MetricOption

WithBuckets 设置直方图的桶分布

func WithUnit

func WithUnit(unit string) MetricOption

WithUnit 设置指标的单位

Jump to

Keyboard shortcuts

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