Home

Awesome

Prometheus monitoring for Hertz

Abstract

prometheus大概的工作流程:

  1. Prometheus server 定期从配置好的 jobs 或者 exporters 中拉(pull模式) metrics,或者接收来自 Pushgateway 发过来(push模式)的 metrics,或者从其他的 Prometheus server 中拉 metrics;
  2. Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报;
  3. Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警;
  4. 在图形界面中,可视化采集数据,例如对接Grafana。

数据模型

Prometheus 中存储的数据为时间序列,是由 metric 的名字和一系列的标签(键值对)唯一标识的,不同的标签则代表不同的时间序列。

Metric类型

Counter

Gauge

Histogram

Summary

Labels

Metrics

Useful Examples

Prometheus 的查询语法可以参考 Querying basics | Prometheus, 这里给出一些常用示例:

server throughput of succeed requests

sum(rate(hertz_server_throughput{statusCode="200"}[1m])) by (method)

server latency pct99 of succeed requests

histogram_quantile(0.9,sum(rate(hertz_server_latency_us_bucket{statusCode="200"}[1m]))by(le))

Usage Example

Server

import (
   "context"
	"time"

	"github.com/hertz-contrib/monitor-prometheus"
	"github.com/cloudwego/hertz/pkg/app"
	"github.com/cloudwego/hertz/pkg/app/server"
)

func main() {
...
	h := server.Default(server.WithHostPorts("127.0.0.1:8080"), server.WithTracer(prometheus.NewServerTracer(":9091", "/hertz")))

	h.GET("/metricGet", func(c context.Context, ctx *app.RequestContext) {
		ctx.String(200, "hello get")
	})

	h.POST("/metricPost", func(c context.Context, ctx *app.RequestContext) {
		time.Sleep(100 * time.Millisecond)
		ctx.String(200, "hello post")
	})

	h.Spin()
...
}

可视化界面

安装 Prometheus 和 Grafana

Hertz 已经写了一个 docker-compose.yml 和 Prometheus 的配置文件 prometheus.yml 的 demo,只需简单配置即可完成

  1. 进入当前目录,将 prometheus.yml 中第30行的 $inetIP 改为内网 IP 即可。注意,不需要加 http://
  2. 启动 docker
docker-compose up
  1. 浏览器访问 http://localhost:3000, 账号密码默认都是 admin
  2. 配置数据源 Configuration ->Data Source -> Add data source,配置后点击 Save & Test 测试验证是否生效
  3. 添加监控界面 Create -> dashboard,根据自己的需求添加 throughput 和 pct99 等监控指标,可以参考上面 Useful Examples 给出的样例。