8. 从被动到主动:服务监控在选课系统运维中的转型
回顾上文
在上期我们进行了一系列的服务治理操作,通过go-sentinel组件进行服务的熔断和服务热点参数流控。其中我们通过熔断策略加强了服务的鲁棒性和稳定性,又通过热点参数流控的手段进行限制同一个人在某一时刻过多的恶意的请求,“针对于这样的无休止的用户我们可以适当的关入小黑屋,真的是没完没了了,校园系统你也搞等一下扣你学分”。好了回到正题,要想全面确保系统的健康运行与高效运维我们这篇将引入服务指标监控手段,进行增加服务的可观性。
能学到什么
- Grpc如何进行收集指标
- Prometheus使用
- Grafana使用
- Grafana监控Go服务
- Grafana监控Grpc服务
涉及技术
- Prometheus
- Grafana
架构设计
暂时无法在飞书文档外展示此内容
服务监控
其实服务监控包括很多例如:健康检查、性能监控、日志监控、调用链监控(tracing),指标与异常故障监控。在之前的文中我们也使用过健康监控(consul的心跳检测可用服务)和调用链监控(链路追踪技术)。按道理来说的话这期更偏向于指标监控,通过收集器收集服务开放的接口进行收集并分析服务的各种量化数据,更进一步的话通过图形的方式展示出来。
收集指标(metrics)
这里的话使用了Go开源的Prometheus进行监控。
部署普罗米修斯
这里使用容器化的部署方式,这样看起来方便点。
这里推荐配置--web.enable-lifecycle
热加载的配置,这样就可以支持修改配置文件进行加载配置了。
暂时无法在飞书文档外展示此内容
配置文件
在配置文件里面的scrape_configs
收刮配置里我们设置了两个job
任务,其中我们对course服务和go运行时开放的接口进行轮训请求。默认存储在本地,如需要可以配置指定的数据库如InfluxDB等。
暂时无法在飞书文档外展示此内容
指标配置
我们只进行监控course服务和Go运行时状态,如有需要也可以对mysql,redis等服务进行监控。
Course
我们需要通过手段开放Course的/metrics的接口,这里我们可以使用go-grpc-middleware
中间件提供的API进行配合普罗米修斯提供的prometheus-client
,从而到达对course服务监控。
创建metrics服务
这里我们进行指定了一些收集的配置项。
暂时无法在飞书文档外展示此内容
注册服务
将刚刚的配置服务注册到普罗米修斯客户端
暂时无法在飞书文档外展示此内容
开启服务
这里我们需要在后台开启对metrics的服务端口和metrics地址
暂时无法在飞书文档外展示此内容
这样一来我们就能进行收集到当前服务的一些信息了,接下来让我们看一下localhost:20000/metrics。
刚开始的时候是没有的指标的,我们需要进行一些请求来生成指标。
指标来了
到这里我们就能看到了收集的指标信息。
Go监控
go这边的话很简单,由于我们网关是使用了Gin做网关层,我们可以借助github.com/zsais/go-gin-prometheus
这个库来开放/metircs接口。
暂时无法在飞书文档外展示此内容
想不到吧!就这样就可以了在ginprometheus也默认配置/metrics接口,我们只需要进行使用上即可,端口也是之前服务的端口。
指标查看
我们可以通过普罗米修斯提供的 http://localhost:9090/``graph
web界面来进行简单的对指标操作。
这里可以对指标进行指标运算通过PromQL,由于作者对promQL不是很熟练就不献丑了。但是可以通过Grafana图形化展示出来,且无需通过手写PromQL也可以展示炫酷的图案。
Grafana使用
部署
这里需要注意yml格式缩进
暂时无法在飞书文档外展示此内容
访问Grafana界面
如果看到这个界面就说明你已经成功了。
配置Grafana指定数据源
点击settings
点击Add data source
找到Prometheus
这里只需要配置prometheus地址,如果设置了密码和认证相关的就自己摸索摸索
保存
配置完成
下载模版
搜索对应服务的模板
导入
这里有两种方式可以进行导入可以通过复制模版id到Grafana下载也可以直接通过json导入
点击Import
粘贴刚刚的id或者导入刚刚下载的josn文件
配置名称和指定数据源
这样就可以看到一些图形化指标了。
查看效果
我们可以看到当前Go运行时的Groutines数量
这里我们进行模拟500个用户进行持续4秒请求,看查看Gorutine数量是否会进行变化
可以看到通过测压完成groutine的数量飙升直到下降平衡
总结
本期通过:
-
Grpc与Go服务的指标收集:
- 利用go-grpc-middleware中间件结合Prometheus客户端库,实现了对gRPC服务(以Course服务为例)的监控,通过暴露/metrics端点收集服务性能指标。
- 对于Go服务,借助go-gin-prometheus库轻松地在Gin框架的网关层集成监控,同样暴露/metrics接口
-
Prometheus部署与配置:
- 采用容器化部署Prometheus,配置文件中设定了scrape_configs来周期性抓取目标服务的metrics。
-
监控指标配置与展示:
- 配置了针对特定服务(如Course服务和Go运行时)的监控任务,收集并展示关键性能指标。
- 通过访问http://localhost:20000/metrics和Prometheus的Web界面,可以直接查看收集到的指标数据。
-
Grafana集成与使用:
- 成功部署Grafana并配置Prometheus作为数据源,实现图形化展示监控数据。
- 导入Grafana模板,快速搭建监控面板,直观展示了Go运行时的Groutines数量等关键指标。
- 通过模拟高负载场景,观察监控面板上的数据变化,验证监控系统的有效性。
下期其实是想写CI/CD集成的,由于没使用过分布式事务,就想在下期尝试一下在某个地方开个口使用一下分布式事务进行解决问题。那么还请见下期《9. 跨服务的数据一致性:选课系统中的分布式事务实践》
本期代码请见:github.com/bbz1024/sel…
若阁下感兴趣可以clone下来玩一玩。
git clone --branch demo7 https://github.com/bbz1024/select-course.git
转载自:https://juejin.cn/post/7381784679908114495