7.06 Middleware-Prometheus

本节课工程结构如下:

(base) yanglei@yuanhong 04-prometheus % tree ./
./
├── context.go
├── context_test.go
├── go.mod
├── go.sum
├── handleFunc.go
├── httpServer.go
├── httpServer_test.go
├── matchNode.go
├── middleware.go
├── middleware_test.go
├── middlewares
│   ├── access_log
│   │   ├── accessLog.go
│   │   ├── accessLog_test.go
│   │   └── middlewareBuilder.go
│   └── open_telemetry
│       ├── docker-compose.yaml
│       ├── middlewareBuilder.go
│       └── middleware_test.go
├── node.go
├── option.go
├── router.go
├── router_test.go
├── safeContext.go
├── serverInterface.go
└── stringValue.go

3 directories, 23 files

PART1. middlewareBuilder

按照惯例,和之前写access_logopen_telemetry一样,写prometheus的中间件也是从middlewareBuilder开始的

middlewares/prometheus/middlewareBuilder.go:

1.1 创建vector

middlewares/prometheus/middlewareBuilder.go:

这里不要忘记注册指标

1.2 记录指标

很明显,我们要上报指标,首先得有指标才能上报.想要有指标,那么一定是在HandleFunc执行完毕之后,才能拿到指标的数据(例如响应时长).

middlewares/prometheus/middlewareBuilder.go:

这里由于需要等到HandleFunc执行完毕,响应从中间件链上回来的时候,才能拿到各种指标(响应时长、命中的路由、请求方法、响应状态码),因此为了防止在中间件链上发生panic导致无法记录指标,因此我们将记录指标的代码放在defer中执行

注意:这里defer中的代码也可以放在一个goroutine中以异步的方式执行,这样就可以不阻塞主线程了.可能有人会问:那如果中间件责任链上发生了panic或者突然宕机了,那么异步采集的指标不就丢失了吗?

其实这是一个伪命题.因为你正常的业务都panic了或者突然宕机,你不可能把关注点放在一个指标是否采集成功这件事上,正常人想的都是突然宕机或者发生了意料之外的panic,我的业务是否还安好.

TODO:试一下异步的goroutine方案

1.3 设置百分比和误差

middlewares/prometheus/middlewareBuilder.go:

关于误差的描述可以参见此处

PART2. 编写测试用例

2.1 创建Server和Middleware

middlewares/prometheus/middleware_test.go:

这部分代码都比较常规,之前都写过很多遍了,不解释.

2.2 暴露指标

middlewares/prometheus/middleware_test.go:

注意:通常暴露指标的端口和业务端口不会混用的.因为业务端口要暴露到外网,而暴露指标的端口大概率是不需要暴露到外网的

2.3 查看结果

请求路由
暴露指标

Last updated