近期得知有些产品没有监控,导致几天后才发现出了问题,所以学习下做个技术储备,本文以一个简单的服务可用来进行服务保活监控。
先准备一个 docker 网络环境
docker network create server-network
一,暴露服务状态
提供状态数据
每秒发送一个心跳包
暴露 metrics
接口
prometheus
会来访问 /metrics
定期同步数据
http.Handle("/metrics", promhttp.Handler())
打包发布
FROM golang
RUN mkdir server
WORKDIR server
COPY . .
RUN go build -o server
RUN chmod +x server
CMD [ "./server" ]
docker build --rm -t server .
docker run -d --network=server-network -p 8080:8080 --name=server server
二,配置 Prometheus
部署
创建一个配置文件 prometheus.yaml
后通过 docker
部署
scrape_configs:
- job_name: monitor
scrape_interval: 10s
static_configs:
- targets:
- server:8080
docker run -d --name prometheus --network=server-network -p 9090:9090 -v ~/code/docker/prometheus/prometheus.yaml:/etc/prometheus/prometheus.yml prom/prometheus
运行状态
进入 http://localhost:9090
,点击菜单中的 Status -> Targets
即可看到下图中的页面。
进入 Grapth
页面也可以看到一些简单的数据,不过很明显不能满足我们的需求,所以接下来是 Grafana
。
三,配置 Grafana
部署
docker run -d --network=server-network --name=grafana -p 3000:3000 grafana/grafana
配置
数据源
第一步添加数据源,数据源支持很多这种,我们这里使用 Prometheus
即可。
报警通知渠道
自然不可能放个人在那里一直盯着面板(真见过配置了监控不看的,就是拿来当摆饰的),配置好报警渠道,发生符合配置的规则时自动发送通知。
监控面板
其实很多看上去不明觉历的图标就是用 Grafana
配置的,接下来我们也配置一个面板。
在新建面板的右下角选择我们前面配置的数据源,Metrics browser
选择我们定义的 Topic
,此时上方折线图就会出现数据了。
这时候还不会自动报警,途中红色线段部分代表没有读取到数据。
报警规则
如图所示,当没有得到数据时将会触发报警,还有条件中每 5 秒检测一次数据是否小于 1,这里其实没有用到,因为如果存活目前拿到的都是 1,不存活则不会得到任何数据。
报警这里也有一个注意点,一个相同的报警在服务恢复前会被堵塞住。
最终运行的三个容器
四,统计时间段内请求次数
上次一直没找到这个,每个博主都说支持统计每秒错误次数,但就是不做,今天又试了下,发现使用 Counter 类型就可以,然后在查询的时候分割。
irate(http_request_count[1m])*6
这段代码里其实也不太懂,但看到的数据是最符合真实情况的,*6 猜测是因为每十秒一个区间。