开源推荐 基于 prometheus 的微服务指标监控

zhoushuguang · 2020年09月12日 · 最后由 astaxie 回复于 2020年09月13日 · 1207 次阅读
本帖已被设为精华帖!

服务上线后我们往往需要对服务进行监控,以便能及早发现问题并做针对性的优化,监控又可分为多种形式,比如日志监控,调用链监控,指标监控等等。而通过指标监控能清晰的观察出服务指标的变化趋势,了解服务的运行状态,对于保证服务稳定起着非常重要的作用

prometheus是一个开源的系统监控和告警工具,支持强大的查询语言 PromQL 允许用户实时选择和汇聚时间序列数据,时间序列数据是服务端通过 HTTP 协议主动拉取获得,也可以通过中间网关来推送时间序列数据,可以通过静态配置文件或服务发现来获取监控目标

Prometheus 的架构

Prometheus 的整体架构以及生态系统组件如下图所示:

prometheus

Prometheus Server 直接从监控目标中或者间接通过推送网关来拉取监控指标,它在本地存储所有抓取到样本数据,并对此数据执行一系列规则,以汇总和记录现有数据的新时间序列或生成告警。可以通过 Grafana 或者其他工具来实现监控数据的可视化

go-zero 基于 prometheus 的服务指标监控

go-zero 框架中集成了基于 prometheus 的服务指标监控,下面我们通过 go-zero 官方的示例shorturl来演示是如何对服务指标进行收集监控的:

  • 第一步需要先安装 Prometheus,安装步骤请参考官方文档
  • go-zero 默认不开启 prometheus 监控,开启方式很简单,只需要在 shorturl-api.yaml 文件中增加配置如下,其中 Host 为 Prometheus Server 地址为必填配置,Port 端口不填默认 9091,Path 为用来拉取指标的路径默认为/metrics
Prometheus:
  Host: 127.0.0.1
  Port: 9091
  Path: /metrics
  • 编辑 prometheus 的配置文件 prometheus.yml,添加如下配置,并创建 targets.json

    - job_name: 'file_ds'
    file_sd_configs:
    - files:
      - targets.json
    
  • 编辑 targets.json 文件,其中 targets 为 shorturl 配置的目标地址,并添加了几个默认的标签

    [
    {
        "targets": ["127.0.0.1:9091"],
        "labels": {
            "job": "shorturl-api",
            "app": "shorturl-api",
            "env": "test",
            "instance": "127.0.0.1:8888"
        }
    }
    ]
    
  • 启动 prometheus 服务,默认侦听在 9090 端口

    prometheus --config.file=prometheus.yml
    
  • 在浏览器输入http://127.0.0.1:9090/Status,然后点击 -> Targets 即可看到状态为 Up 的 Job,并且 Lables 栏可以看到我们配置的默认的标签

job状态为up

通过以上几个步骤我们完成了 prometheus 对 shorturl 服务的指标监控收集的配置工作,为了演示简单我们进行了手动的配置,在实际的生产环境中一般采用定时更新配置文件或者服务发现的方式来配置监控目标,篇幅有限这里不展开讲解,感兴趣的同学请自行查看相关文档

go-zero 监控的指标类型

go-zero 中目前在 http 的中间件和 rpc 的拦截器中添加了对请求指标的监控。

主要从请求耗时和请求错误两个维度,请求耗时采用了 Histogram 指标类型定义了多个 Buckets 方便进行分位统计,请求错误采用了 Counter 类型,并在 http metric 中添加了 path 标签 rpc metric 中添加了 method 标签以便进行细分监控。

接下来演示如何查看监控指标:

首先在命令行多次执行如下命令

curl -i "http://localhost:8888/shorten?url=http://www.xiaoheiban.cn"

打开 Prometheus 切换到 Graph 界面,在输入框中输入{path="/shorten"}指令,即可查看监控指标,如下图

查询面板

我们通过 PromQL 语法查询过滤 path 为/shorten 的指标,结果中显示了指标名以及指标数值,其中 http_server_requests_code_total 指标中 code 值为 http 的状态码,200 表明请求成功,http_server_requests_duration_ms_bucket 中对不同 bucket 结果分别进行了统计,还可以看到所有的指标中都添加了我们配置的默认指标

Console 界面主要展示了查询的指标结果,Graph 界面为我们提供了简单的图形化的展示界面,在实际的生产环境中我们一般使用 Grafana 做图形化的展示

grafana 可视化界面

grafana是一款可视化工具,功能强大,支持多种数据来源 Prometheus、Elasticsearch、Graphite 等,安装比较简单请参考官方文档,grafana 默认端口 3000,安装好后再浏览器输入http://localhost:3000/admin,默认账号和密码都为

下面演示如何基于以上指标进行可视化界面的绘制:

  • 点击左侧边栏 Configuration->Data Source->Add data source 进行数据源添加,其中 HTTP 的 URL 为数据源的地址

datasource

  • 点击左侧边栏添加 dashboard,然后添加 Variables 方便针对不同的标签进行过滤筛选比如添加 app 变量用来过滤不同的服务

variables

  • 进入 dashboard 点击右上角 Add panel 添加面板,以 path 维度统计接口的 qps

qps

  • 最终的效果如下所示,可以通过服务名称过滤不同的服务,面板展示了 path 为/shorten 的 qps 变化趋势

qps_panel

总结

以上演示了 go-zero 中基于 prometheus+grafana 服务指标监控的简单流程,生产环境中可以根据实际的场景做不同维度的监控分析。现在 go-zero 的监控指标主要还是针对 http 和 rpc,这对于服务的整体监控显然还是不足的,比如容器资源的监控,依赖的 mysql、redis 等资源的监控,以及自定义的指标监控等等,go-zero 在这方面后续还会持续优化。希望这篇文章能够给您带来帮助

项目地址

https://github.com/tal-tech/go-zero

微信交流群

微信交流群

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
astaxie 将本帖设为了精华贴 09月13日 20:31

非常赞

samurai GoCN 每日新闻 (2020-09-14) 中提及了此贴 09月14日 11:13
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册