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 filesPART1. middlewareBuilder
按照惯例,和之前写access_log和open_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