Skip to content

指标监控

mmetric 是 Maltose 框架提供的指标监控组件,它基于 OpenTelemetry 标准,提供了一套统一的指标采集接口,旨在与框架的其他部分深度集成,并能轻松对接各种主流的监控后端系统。

核心优势

  • 统一接口: 提供了 Counter(计数器)、UpDownCounter(升降计数器)和 Histogram(直方图)等标准化的指标类型接口。
  • 提供者模式 (Provider): 采用提供者模式,使得底层实现可以被替换。Maltose 提供了 otelmetric 包,支持通过 gRPC 或 HTTP 协议将指标导出到 OpenTelemetry Collector。
  • 自动化采集: 框架核心组件(如 mhttp)会自动采集关键指标,如请求总数、活跃请求数、请求耗时等,无需手动埋点。
  • 维度标签 (Attributes): 所有的指标采集都支持附带多维度的标签,方便在监控系统中进行聚合和筛选。

指标类型

  • Counter (计数器): 一个只增不减的单调值,用于统计请求总数、错误总数等。
  • UpDownCounter (升降计数器): 一个可以增加也可以减少的值,用于统计当前活跃的请求数、队列中的任务数等。
  • Histogram (直方图): 用于统计数据的分布情况,例如请求耗时的分布(P95, P99 等)。

直方图桶 (Histogram Buckets) 的配置变更

根据 OpenTelemetry SDK v1.34.0 及以上版本的规范,直方图的桶(Buckets)不再通过客户端代码进行配置

过去,开发者可能会在创建 Histogram 时指定 Buckets 选项。现在,桶的划分和聚合完全由后端的 OpenTelemetry Collector 或监控系统(如 Prometheus)来定义和管理。

这种变更简化了客户端的配置,并将数据聚合的复杂性移到了后端,提供了更大的灵活性。您只需在应用中记录原始值,然后在 Collector 的配置中定义您想要的延迟桶。

快速开始

1. 安装依赖

bash
go get github.com/graingo/maltose/contrib/metric/otlpmetric

2. 初始化

在您的应用启动时,初始化 otlpmetric 包。

go
package main

import (
    "context"
    "log"

    "github.com/graingo/maltose/contrib/metric/otlpmetric"
)

func main() {
    // 初始化 OTLP 指标导出器 (默认使用 gRPC)
    shutdown, err := otlpmetric.Init("localhost:4317",
        otlpmetric.WithServiceName("my-service"),
        otlpmetric.WithServiceVersion("1.0.0"),
    )
    if err != nil {
        log.Fatalf("初始化指标失败: %v", err)
    }
    defer shutdown(context.Background())

    // ... 您的应用逻辑 ...
}

3. 创建和使用自定义指标

go
package main

import (
    "context"
    "time"
    "github.com/graingo/maltose/os/mmetric"
    "go.opentelemetry.io/otel/attribute"
)

// 1. 创建一个 Counter 指标
var orderCounter = mmetric.MustCounter(
    "orders.created.total",
    mmetric.MetricOption{
        Help: "Total number of created orders",
    },
)

// 2. 在业务逻辑中使用
func CreateOrder(ctx context.Context) {
    // ... 业务逻辑 ...

    // 增加计数器的值,并附带标签
    orderCounter.Inc(ctx, mmetric.WithAttributes(
        attribute.String("payment_channel", "alipay"),
        attribute.String("order_type",      "normal"),
    ))
}

协议配置

您可以轻松地在 gRPC 和 HTTP 协议之间切换。

使用 HTTP

go
// 初始化 OTLP HTTP 指标导出器
shutdown, err := otlpmetric.Init("localhost:4318",
    otlpmetric.WithServiceName("my-service-http"),
    otlpmetric.WithProtocol(otlpmetric.ProtocolHTTP), // 切换为 HTTP
    otlpmetric.WithURLPath("/v1/metrics"),            // 自定义路径
)
// ...

配置选项

函数说明
WithServiceName(name string)设置服务名称。
WithServiceVersion(version string)设置服务版本。
WithEnvironment(env string)设置部署环境。
WithProtocol(protocol Protocol)设置协议 (otlpmetric.ProtocolGRPCotlpmetric.ProtocolHTTP)。
WithExportInterval(interval time.Duration)设置指标导出间隔。
WithTimeout(timeout time.Duration)设置导出超时时间。
WithInsecure(insecure bool)启用/禁用非安全连接。
WithURLPath(path string)设置 HTTP 导出器的 URL 路径。
WithResourceAttribute(key, value string)添加自定义资源属性。

Released under the MIT License.