带你十天轻松搞定 Go 微服务系列(八、服务监控)

语言: CN / TW / HK

序言

我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下:

  1. 环境搭建: 带你十天轻松搞定 Go 微服务系列(一)

  2. 服务拆分: 带你十天轻松搞定 Go 微服务系列(二)

  3. 用户服务: 带你十天轻松搞定 Go 微服务系列(三)

  4. 产品服务: 带你十天轻松搞定 Go 微服务系列(四)

  5. 订单服务: 带你十天轻松搞定 Go 微服务系列(五)

  6. 支付服务: 带你十天轻松搞定 Go 微服务系列(六)

  7. RPC 服务 Auth 验证: 带你十天轻松搞定 Go 微服务系列(七)

  8. 服务监控(本文)

  9. 链路追踪

  10. 分布式事务

期望通过本系列带你在本机利用 Docker 环境利用 go-zero 快速开发一个商城系统,让你快速上手微服务。

完整示例代码:https://github.com/nivin-studio/go-zero-mall

首先,我们来看一下整体的服务拆分图:

8.1 Prometheus 介绍

Prometheus 是一款基于时序数据库的开源监控告警系统,基本原理是通过 HTTP 协议周期性抓取被监控服务的状态,任意服务只要提供对应的 HTTP 接口就可以接入监控。不需要任何 SDK 或者其他的集成过程,输出被监控服务信息的 HTTP 接口被叫做 exporter 。目前互联网公司常用的服务大部分都有 exporter 可以直接使用,比如 VarnishHaproxyNginxMySQLLinux 系统信息(包括磁盘、内存、 CPU 、网络等等)。 Promethus 有以下特点:

  • 支持多维数据模型(由度量名和键值对组成的时间序列数据)

  • 支持 PromQL 查询语言,可以完成非常复杂的查询和分析,对图表展示和告警非常有意义
  • 不依赖分布式存储,单点服务器也可以使用

  • 支持 HTTP 协议主动拉取方式采集时间序列数据
  • 支持 PushGateway 推送时间序列数据
  • 支持服务发现和静态配置两种方式获取监控目标

  • 支持接入 Grafana

8.2 go-zero 使用 Prometheus 监控服务

go-zero 框架中集成了基于 Prometheus 的服务指标监控, go-zero 目前在 http 的中间件和 rpc 的拦截器中添加了对请求指标的监控。

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

接下来我们分别为前面几章实现的服务添加 Prometheus 监控,首先我们先回顾下 第二章 服务拆分 ,为了模拟服务的分布式部署,我们是在一个容器里启动了所有的服务,并为其分配了不同的端口号。下面我们再为这些服务分配一个 Prometheus 采集指标数据的端口号。

服务 api 服务端口号 rpc 服务端口号 api 指标采集端口号 rpc 指标采集端口号
user 8000 9000 9080 9090
product 8001 9001 9081 9091
order 8002 9002 9082 9092
pay 8003 9003 9083 9093

8.2.1 添加 user api 服务 Prometheus 配置

$ vim mall/service/user/api/etc/user.yaml
Name: User
Host: 0.0.0.0
Port: 8000

...

Prometheus:
  Host: 0.0.0.0
  Port: 9080
  Path: /metrics

8.2.2 添加 user rpc 服务 Prometheus 配置

$ vim mall/service/user/rpc/etc/user.yaml
Name: user.rpc
ListenOn: 0.0.0.0:9000

...

Prometheus:
  Host: 0.0.0.0
  Port: 9090
  Path: /metrics

8.2.3 添加 product api 服务 Prometheus 配置

$ vim mall/service/product/api/etc/product.yaml
Name: Product
Host: 0.0.0.0
Port: 8001

...

Prometheus:
  Host: 0.0.0.0
  Port: 9081
  Path: /metrics

8.2.4 添加 product rpc 服务 Prometheus 配置

$ vim mall/service/product/rpc/etc/product.yaml
Name: product.rpc
ListenOn: 0.0.0.0:9001

...

Prometheus:
  Host: 0.0.0.0
  Port: 9091
  Path: /metrics

8.2.5 添加 order api 服务 Prometheus 配置

$ vim mall/service/order/api/etc/order.yaml
Name: Order
Host: 0.0.0.0
Port: 8002

...

Prometheus:
  Host: 0.0.0.0
  Port: 9082
  Path: /metrics

8.2.6 添加 order rpc 服务 Prometheus 配置

$ vim mall/service/order/rpc/etc/order.yaml
Name: order.rpc
ListenOn: 0.0.0.0:9002

...

Prometheus:
  Host: 0.0.0.0
  Port: 9092
  Path: /metrics

8.2.7 添加 pay api 服务 Prometheus 配置

$ vim mall/service/pay/api/etc/pay.yaml
Name: Pay
Host: 0.0.0.0
Port: 8003

...

Prometheus:
  Host: 0.0.0.0
  Port: 9083
  Path: /metrics

8.2.8 添加 pay rpc 服务 Prometheus 配置

$ vim mall/service/pay/rpc/etc/pay.yaml
Name: pay.rpc
ListenOn: 0.0.0.0:9003

...

Prometheus:
  Host: 0.0.0.0
  Port: 9093
  Path: /metrics

提示:配置修改后,需要重启服务才会生效。

8.2.9 修改 Prometheus 配置

第一章 环境搭建 中我们集成了 Prometheus 服务,在 prometheus 目录下有个 prometheus.yml 的配置文件,我们现在需要修改这个配置文件。

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. 
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.     
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.  
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

  # 我们自己的商城项目配置
  - job_name: 'mall'
    static_configs:
      # 目标的采集地址
      - targets: ['golang:9080']
        labels:
          # 自定义标签
          app: 'user-api'
          env: 'test'

      - targets: ['golang:9090']
        labels:
          app: 'user-rpc'
          env: 'test'

      - targets: ['golang:9081']
        labels:
          app: 'product-api'
          env: 'test'

      - targets: ['golang:9091']
        labels:
          app: 'product-rpc'
          env: 'test'

      - targets: ['golang:9082']
        labels:
          app: 'order-api'
          env: 'test'

      - targets: ['golang:9092']
        labels:
          app: 'order-rpc'
          env: 'test'

      - targets: ['golang:9083']
        labels:
          app: 'pay-api'
          env: 'test'

      - targets: ['golang:9093']
        labels:
          app: 'pay-rpc'
          env: 'test'

提示:配置文件修改好后,需要重启 Prometheus 服务容器才能生效。

8.2.10 访问 Prometheus 可视化界面

  • 第一章 环境搭建 中我们集成了  Prometheus 服务,并为其端口号 9090 做了宿主机端口 3000 的映射关系,所以在浏览器中输入 http://127.0.0.1:3000/ 访问 Prometheus 界面。
  • 选择 Status -> Targets 菜单,即可看到我们配置的采集目标的状态和自定义的标签。
  • api
    Graph
    {path="api接口地址"}
    {method="rpc接口方法"}
    

8.3 使用 Grafana 可视化 Prometheus 指标数据

8.3.1 添加 Prometheus 数据源

  • 第一章 环境搭建 中我们集成了  Grafana 服务,并为其端口号 3000 做了宿主机端口 4000 的映射关系,所以在浏览器中输入 http://127.0.0.1:4000/ 访问 Grafana 界面。点击左侧边栏 Configuration -> Data Source -> Add data source 进行数据源添加。
  • 然后选择 Prometheus 数据源
  • HTTP
    URL
    IP地址
    Prometheus
    IP地址
    Save & test
    Data source is working
    

8.3.2 添加 Variables 用于服务筛选

  • Dashboard
    Dashboard settings
    Settings
    Variables
    Add variable
    
  • api_app
    rpc_app
    Prometheus
    app
    

8.3.3 添加 api 接口 qps 仪表盘

  • Dashboard
    Add panel
    Add an empty panel
    
  • API接口QPS
    Metrics
    sum(rate(http_server_requests_duration_ms_count{app="$api_app"}[5m])) by (path)
    path
    api
    qps
    

8.3.4 添加 rpc 接口 qps 仪表盘

  • RPC接口QPS
    Metrics
    sum(rate(rpc_server_requests_duration_ms_count{app="$rpc_app"}[5m])) by (method)
    method
    rpc
    qps
    

8.3.5 添加 api 接口状态码仪表盘

  • API接口状态码
    Metrics
    sum(rate(http_server_requests_code_total{app="$api_app"}[5m])) by (code)
    code
    api
    

8.3.6 添加 rpc 接口状态码仪表盘

  • RPC接口状态码
    Metrics
    sum(rate(rpc_server_requests_code_total{app="$rpc_app"}[5m])) by (code)
    code
    rpc
    

8.3.7 保存仪表盘

  • 调整下面板位置,选择右上角 Save dashboard 按钮保存仪表盘。

项目地址

https://github.com/zeromicro/go-zero

欢迎使用 go-zerostar 支持我们!

微信交流群

关注『 微服务实践 』公众号并点击 交流群 获取社区群二维码。