序言

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

  1. 环境搭建
  2. 服务拆分
  3. 用户服务
  4. 产品服务
  5. 订单服务
  6. 支付服务
  7. RPC 服务 Auth 验证
  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 配置

  1. $ vim mall/service/user/api/etc/user.yaml
  1. Name: User
  2. Host: 0.0.0.0
  3. Port: 8000
  4. ...
  5. Prometheus:
  6. Host: 0.0.0.0
  7. Port: 9080
  8. Path: /metrics

8.2.2 添加 user rpc 服务 Prometheus 配置

  1. $ vim mall/service/user/rpc/etc/user.yaml
  1. Name: user.rpc
  2. ListenOn: 0.0.0.0:9000
  3. ...
  4. Prometheus:
  5. Host: 0.0.0.0
  6. Port: 9090
  7. Path: /metrics

8.2.3 添加 product api 服务 Prometheus 配置

  1. $ vim mall/service/product/api/etc/product.yaml
  1. Name: Product
  2. Host: 0.0.0.0
  3. Port: 8001
  4. ...
  5. Prometheus:
  6. Host: 0.0.0.0
  7. Port: 9081
  8. Path: /metrics

8.2.4 添加 product rpc 服务 Prometheus 配置

  1. $ vim mall/service/product/rpc/etc/product.yaml
  1. Name: product.rpc
  2. ListenOn: 0.0.0.0:9001
  3. ...
  4. Prometheus:
  5. Host: 0.0.0.0
  6. Port: 9091
  7. Path: /metrics

8.2.5 添加 order api 服务 Prometheus 配置

  1. $ vim mall/service/order/api/etc/order.yaml
  1. Name: Order
  2. Host: 0.0.0.0
  3. Port: 8002
  4. ...
  5. Prometheus:
  6. Host: 0.0.0.0
  7. Port: 9082
  8. Path: /metrics

8.2.6 添加 order rpc 服务 Prometheus 配置

  1. $ vim mall/service/order/rpc/etc/order.yaml
  1. Name: order.rpc
  2. ListenOn: 0.0.0.0:9002
  3. ...
  4. Prometheus:
  5. Host: 0.0.0.0
  6. Port: 9092
  7. Path: /metrics

8.2.7 添加 pay api 服务 Prometheus 配置

  1. $ vim mall/service/pay/api/etc/pay.yaml
  1. Name: Pay
  2. Host: 0.0.0.0
  3. Port: 8003
  4. ...
  5. Prometheus:
  6. Host: 0.0.0.0
  7. Port: 9083
  8. Path: /metrics

8.2.8 添加 pay rpc 服务 Prometheus 配置

  1. $ vim mall/service/pay/rpc/etc/pay.yaml
  1. Name: pay.rpc
  2. ListenOn: 0.0.0.0:9003
  3. ...
  4. Prometheus:
  5. Host: 0.0.0.0
  6. Port: 9093
  7. Path: /metrics

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

8.2.9 修改 Prometheus 配置

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

  1. # my global config
  2. global:
  3. scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  4. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  5. # scrape_timeout is set to the global default (10s).
  6. # Alertmanager configuration
  7. alerting:
  8. alertmanagers:
  9. - static_configs:
  10. - targets:
  11. # - alertmanager:9093
  12. # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
  13. rule_files:
  14. # - "first_rules.yml"
  15. # - "second_rules.yml"
  16. # A scrape configuration containing exactly one endpoint to scrape:
  17. # Here it's Prometheus itself.
  18. scrape_configs:
  19. # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  20. - job_name: "prometheus"
  21. # metrics_path defaults to '/metrics'
  22. # scheme defaults to 'http'.
  23. static_configs:
  24. - targets: ["localhost:9090"]
  25. # 我们自己的商城项目配置
  26. - job_name: 'mall'
  27. static_configs:
  28. # 目标的采集地址
  29. - targets: ['golang:9080']
  30. labels:
  31. # 自定义标签
  32. app: 'user-api'
  33. env: 'test'
  34. - targets: ['golang:9090']
  35. labels:
  36. app: 'user-rpc'
  37. env: 'test'
  38. - targets: ['golang:9081']
  39. labels:
  40. app: 'product-api'
  41. env: 'test'
  42. - targets: ['golang:9091']
  43. labels:
  44. app: 'product-rpc'
  45. env: 'test'
  46. - targets: ['golang:9082']
  47. labels:
  48. app: 'order-api'
  49. env: 'test'
  50. - targets: ['golang:9092']
  51. labels:
  52. app: 'order-rpc'
  53. env: 'test'
  54. - targets: ['golang:9083']
  55. labels:
  56. app: 'pay-api'
  57. env: 'test'
  58. - targets: ['golang:9093']
  59. labels:
  60. app: 'pay-rpc'
  61. 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 API服务名称,rpc_app RPC服务名称变量,用于不同服务的筛选。变量数据源选择 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 支持我们!

微信交流群

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

带你十天轻松搞定 Go 微服务系列(八、服务监控)的更多相关文章

  1. 带你十天轻松搞定 Go 微服务系列(一)

    本文开始,我们会出一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建(本文) 服务拆分 用户服务 产品服务 订单服务 支付服务 RPC 服务 Au ...

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

    上篇文章开始,我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分(本文) 用户服务 产品服务 订单服务 支付服务 RPC 服务 ...

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

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务(本文) 产品服务 订单服务 支付服务 RPC 服务 Auth ...

  4. 带你十天轻松搞定 Go 微服务系列(五)

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务(本文) 支付服务 RPC 服务 Auth ...

  5. 带你十天轻松搞定 Go 微服务系列(六)

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务 支付服务(本文) RPC 服务 Auth ...

  6. 带你十天轻松搞定 Go 微服务系列(七)

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务 支付服务 RPC 服务 Auth 验证( ...

  7. 带你十天轻松搞定 Go 微服务系列(九、链路追踪)

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务 支付服务 RPC 服务 Auth 验证 ...

  8. 带你十天轻松搞定 Go 微服务之大结局(分布式事务)

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务 支付服务 RPC 服务 Auth 验证 ...

  9. 【微框架】之一:从零开始,轻松搞定SpringCloud微框架系列--开山篇(spring boot 小demo)

    Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...

随机推荐

  1. 【LeetCode】762. Prime Number of Set Bits in Binary Representation 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历数字+质数判断 日期 题目地址:https:// ...

  2. 【LeetCode】761. Special Binary String 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/special- ...

  3. 1319 - Monkey Tradition

    1319 - Monkey Tradition   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ...

  4. Linq和Lambda 性能对比

    Linq和Lambda 性能对比 1.Where() 使用LINQ创建一个简单的where查询 var query = from person in PersonCollection where pe ...

  5. MySQL8.0的下载与安装

    下载 进入官网的下载页面 点击下图中的链接 可以选择上边的 Community Server ,那样会下载压缩包,这里我选择下边的 Installer for Windows ,下载的是安装包 点击下 ...

  6. 解决Java保存到数据库中文乱码问题,加useUnicode=true&characterEncoding=UTF-8

    Java保存到数据库中文乱码, 解决方法如下: 我们在连接MySQL数据库的时候一般都会在url后面添加useUnicode=true&characterEncoding=UTF-8,但是问什 ...

  7. Ubuntu16.04下,erlang安装和rabbitmq安装步骤

    文章来源: Ubuntu16.04下,erlang安装和rabbitmq安装步骤 准备工作,先下载erlang和rabbitmq的安装包,注意他们的版本,版本不对可能会导致rabbitmq无法启动,这 ...

  8. SpringBoot集成MyBatis-Plus框架

    1.说明 本文介绍Spring Boot集成MyBatis-Plus框架, 重点介绍需要注意的地方, 是SpringBoot集成MyBatis-Plus框架详细方法 这篇文章的脱水版, 主要是三个步骤 ...

  9. 把rocksdb配置成leveldb

    将rocksdb配置成leveldb 1.配置方法 配置方式有三种: 第一种适合进行性能测试对比:是以参数形式在运行db_bench或ycsb-c的时候以参数形式将rocksdb将其配置成leveld ...

  10. Snack3 3.2 发布,轻量的Json+Jsonpath框架

    Snack3 是一个轻量的 JSON + Jsonpath 框架. 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计.其下一切数据都以ONode表 ...