微服务监控:使用 Prometheus 和 Grafana
在微服务架构中,监控是确保系统稳定运行的关键。本文将详细介绍如何使用 Prometheus 和 Grafana 来收集和监控微服务的性能指标,包括创建仪表盘、测试指标、导出和导入仪表盘,以及设置告警等操作。
1. 创建并测试仪表盘
在开始测试新仪表盘之前,需要停止正在运行的负载测试工具 Siege。在 Siege 运行的命令窗口中,按下
Ctrl + C
即可停止它。
1.1 测试断路器指标
- 打开断路器 :通过向 API 发送一系列失败请求来强制打开断路器。运行以下命令:
ACCESS_TOKEN=$(curl https://writer:secret-writer@minikube.me/oauth2/token -d grant_type=client_credentials -d scope="product:read product:write" -ks | jq .access_token -r)
echo ACCESS_TOKEN=$ACCESS_TOKEN
for ((n=0; n<4; n++)); do curl -o /dev/null -skL -w "%{http_code}\n" https://minikube.me/product-composite/1?delay=3 -H "Authorization: Bearer $ACCESS_TOKEN" -s; done
预期会收到三个 500 响应和一个最终的 200 响应。三个连续的错误会打开断路器,最后的 200 表示当产品组合微服务检测到断路器打开时的快速失败响应。
-
观察状态变化
:断路器打开后,关闭状态的值应降至 0,打开状态的值变为 1。10 秒后,断路器将进入半开状态,半开指标的值为 1,打开状态的值为 0。
-
关闭断路器
:通过向 API 发送三个成功请求来关闭断路器。运行以下命令:
for ((n=0; n<4; n++)); do curl -o /dev/null -skL -w "%{http_code}\n" https://minikube.me/product-composite/1?delay=0 -H "Authorization: Bearer $ACCESS_TOKEN" -s; done
此时,断路器指标应恢复正常,关闭指标的值回到 1。
1.2 测试重试指标
为了触发重试机制,使用
faultPercentage
参数,并设置相对较低的值以避免触发断路器。运行以下命令:
while true; do curl -o /dev/null -s -L -w "%{http_code}\n" -H "Authorization: Bearer $ACCESS_TOKEN" -k https://minikube.me/product-composite/1?faultPercent=10; sleep 3; done
该命令每三秒调用一次 API,指定 10% 的请求应失败,从而触发重试机制。
如果想检查断路器的状态,可以使用以下命令:
curl -ks https://health.minikube.me/actuator/health | jq -r .components.circuitBreakers.details.product.details.state
该命令将根据断路器的状态报告
CLOSED
、
OPEN
或
HALF_OPEN
。
2. 导出和导入 Grafana 仪表盘
创建仪表盘后,通常需要将其定义保存为源代码并迁移到其他 Grafana 实例。可以使用 Grafana 的 API 来执行这些操作。
2.1 仪表盘的两种 ID
- id :在 Grafana 实例内唯一的自增标识符。
- uid :可在多个 Grafana 实例中使用的唯一标识符,是访问仪表盘 URL 的一部分。
2.2 导出和导入仪表盘的步骤
-
确定仪表盘的 uid
:在浏览器中打开仪表盘,从 URL 中获取 uid。例如:
https://grafana.minikube.me/d/YMcDoBg7k/hands-on-dashboard,其中YMcDoBg7k就是 uid。 -
创建变量
:在终端窗口中创建一个变量来存储 uid 的值。例如:
ID=YMcDoBg7k。 - 导出仪表盘到 JSON 文件 :运行以下命令:
curl -sk https://grafana.minikube.me/api/dashboards/uid/$ID | jq '.dashboard.id=null' > "Hands-on-Dashboard.json"
-
删除仪表盘
:在浏览器中,选择左侧菜单中的
Dashboards和Browse,找到Hands-on Dashboard并选中前面的复选框,点击红色的Delete按钮,然后在弹出的确认对话框中再次点击Delete。 - 从 JSON 文件导入仪表盘 :运行以下命令:
curl -i -XPOST -H 'Accept: application/json' -H 'Content-Type: application/json' -k 'https://grafana.minikube.me/api/dashboards/db' -d @Hands-on-Dashboard.json
- 验证导入的仪表盘 :确保导入的仪表盘报告的指标与删除和重新导入之前相同。
3. 设置 Grafana 告警
监控断路器和重试指标很有价值,但更重要的是能够在这些指标上定义自动告警,以减轻手动监控的负担。
3.1 设置基于邮件的通知通道
-
在 Grafana 网页上,点击左侧菜单中的
Alerting选项,选择Notification channels。 -
点击
Add channel按钮。 -
将名称设置为
mail。 -
选择类型为
Email。 - 输入一个电子邮件地址,邮件将发送到本地测试邮件服务器。
-
展开
Notification settings,选择Default (Use this notification for all alerts)。 -
点击
Test按钮发送测试邮件。 -
点击
Save按钮。 -
点击左侧菜单中的
Dashboard按钮,然后选择Browse菜单条目。 -
从列表中选择
Hands-on Dashboard回到仪表盘。 - 检查测试邮件服务器的网页,确保收到测试邮件。
3.2 设置断路器告警
-
创建告警
:
1. 在Hands-on Dashboard中,点击Circuit Breaker面板的标题,会出现一个下拉菜单。
2. 选择Edit菜单选项。
3. 选择标签列表中的Alert标签(显示为闹钟图标)。
4. 点击Create Alert按钮。
5. 在Evaluate every字段中,将值设置为10s。
6. 在For字段中,将值设置为0m。
7. 在Conditions部分,指定以下值:-
对于
WHEN字段,选择max()。 -
将
OF字段设置为query(A, 10s, now)。 -
将
IS ABOVE更改为IS BELOW,并将其值设置为0.5。
8. 滚动到Notifications部分,确认通知将发送到默认通知通道,即之前定义的邮件通道。
9. 点击Save按钮(右上角),输入备注,如Added an alarm,然后再次点击Save按钮。
10. 点击返回按钮(左箭头)回到仪表盘。
-
对于
-
创建告警列表
:
1. 点击顶级菜单中的Add panel按钮。
2. 在新面板中点击Add new panel按钮。
3. 在右上角,点击Time series下拉按钮,选择Alert list选项。
4. 在右侧的标签中,执行以下操作:-
输入
Circuit Breaker Alerts作为面板标题。 -
在
Option部分,将Show字段设置为Recent state changes。 -
启用名为
Alerts from this dashboard的切换开关。
5. 展开Settings行下方的Visualization行,选择Alert list。
6. 在Panel options行下方,将Show字段设置为Recent state changes,将Max items设置为10,并启用Alerts from this dashboard选项。
7. 点击返回按钮回到仪表盘。
8. 重新排列面板以满足需求。
9. 保存对仪表盘的更改,并输入备注,如Added an alert list。
-
输入
4. 测试断路器告警
重复之前测试断路器指标的步骤,但这次期望触发告警并发送邮件。
- 获取新的访问令牌 (如果需要):
ACCESS_TOKEN=$(curl https://writer:secret-writer@minikube.me/oauth2/token -d grant_type=client_credentials -d scope="product:read product:write" -ks | jq .access_token -r)
echo ACCESS_TOKEN=$ACCESS_TOKEN
- 打开断路器 :
for ((n=0; n<4; n++)); do curl -o /dev/null -skL -w "%{http_code}\n" https://minikube.me/product-composite/1?delay=3 -H "Authorization: Bearer $ACCESS_TOKEN" -s; done
仪表盘应报告断路器已打开,几秒钟后应触发告警并发送邮件。
3.
关闭断路器
:
for ((n=0; n<4; n++)); do curl -o /dev/null -skL -w "%{http_code}\n" https://minikube.me/product-composite/1?delay=0 -H "Authorization: Bearer $ACCESS_TOKEN" -s; done
关闭指标应恢复正常,告警应变为绿色。
5. 总结
通过本文的介绍,我们学习了如何使用 Prometheus 和 Grafana 来收集和监控微服务的性能指标。具体包括:
- 使用 Prometheus 在 Kubernetes 环境中收集性能指标。
- 通过添加 Prometheus 注解,让 Prometheus 自动从 Pod 收集指标。
- 使用 Micrometer 在微服务中生成指标。
- 使用 Kiali 和 Grafana 的仪表盘监控收集的指标。
- 开发自己的仪表盘,使用 Resilience4j 的指标监控断路器和重试机制。
- 使用 Grafana API 导出和导入仪表盘。
- 在 Grafana 中定义指标告警并发送通知。
通过这些操作,我们可以更好地监控微服务的运行状态,及时发现并解决问题。
以下是操作流程的 mermaid 流程图:
graph LR
A[创建并保存仪表盘] --> B[停止 Siege]
B --> C[测试断路器指标]
C --> D[测试重试指标]
D --> E[导出和导入仪表盘]
E --> F[设置邮件通知通道]
F --> G[设置断路器告警]
G --> H[测试断路器告警]
以下是仪表盘 ID 信息的表格:
| ID 类型 | 描述 |
| ---- | ---- |
| id | 自增标识符,仅在 Grafana 实例内唯一 |
| uid | 唯一标识符,可在多个 Grafana 实例中使用,是 URL 的一部分 |
在实际应用中,我们可以根据这些步骤和方法,灵活运用 Prometheus 和 Grafana 来监控和管理微服务,确保系统的稳定性和可靠性。同时,通过设置告警,能够及时发现潜在问题并采取相应措施。
微服务监控:使用 Prometheus 和 Grafana
6. 常见问题及解答
在使用 Prometheus 和 Grafana 监控微服务的过程中,可能会遇到一些问题。以下是一些常见问题及解答:
1.
微服务源代码需要做哪些更改以生成 Prometheus 可消费的指标?
- 使用 Micrometer 库在微服务中生成指标。在微服务的依赖中添加 Micrometer 相关依赖,例如在 Maven 项目中添加以下依赖:
xml
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
<version>最新版本</version>
</dependency>
然后在代码中使用 Micrometer 的 API 来创建和记录指标。
2.
management.metrics.tags.application
配置参数的用途是什么?
- 该参数用于为指标添加应用程序标签。在 Prometheus 中,标签可以帮助对指标进行分类和过滤。通过设置该参数,可以将特定应用程序的指标进行区分,方便后续的监控和分析。例如,在
application.properties
中设置:
properties
management.metrics.tags.application=my - microservice
3.
如果要分析高 CPU 消耗的支持案例,应从哪个仪表盘开始?
- 可以从 Kiali 或 Grafana 中与 CPU 相关的仪表盘开始。例如,在 Grafana 中,可以查找包含 CPU 使用率指标的仪表盘,如系统性能相关的仪表盘,这些仪表盘可能会显示每个微服务或 Pod 的 CPU 使用率情况。
4.
如果要分析 API 响应缓慢的支持案例,应从哪个仪表盘开始?
- 可以从包含 API 响应时间指标的仪表盘开始。在 Grafana 中,可以查找与 API 性能相关的仪表盘,这些仪表盘可能会显示不同 API 端点的响应时间、请求成功率等指标,通过分析这些指标可以定位响应缓慢的 API 端点。
5.
基于计数器的指标(如 Resilience4j 的重试指标)有什么问题,如何有效地监控它们?
- 基于计数器的指标的问题在于它们只能记录事件的发生次数,不能反映事件的具体情况,如事件发生的时间间隔、事件的持续时间等。为了有效地监控这些指标,可以结合其他类型的指标,如直方图、计时器等。例如,使用 Micrometer 的
Timer
来记录重试操作的时间,以便更全面地了解重试机制的性能。
6.
关于特定截图中指标情况的分析
- 当看到电路断路器状态转换为
half_open → open
、
open → half_open
、
half_open → closed
时,这表明断路器在不同状态之间进行了转换。
half_open → open
表示在半开状态下测试请求仍然失败,导致断路器再次打开;
open → half_open
表示经过一段时间后,断路器尝试进入半开状态以测试问题是否解决;
half_open → closed
表示在半开状态下测试请求成功,断路器恢复正常关闭状态。
- 对于重试机制,初始请求大部分失败且无重试,少数成功无重试,随后的请求全部成功无重试。这可能表示初始阶段系统存在一些问题,导致部分请求失败,但后续系统恢复正常,请求不再需要重试。
7. 社区资源与进一步学习
Grafana 社区提供了丰富的仪表盘资源,我们可以直接使用这些共享的仪表盘来快速搭建监控环境。可以访问 Grafana 社区的仪表盘库(https://grafana.com/grafana/dashboards),搜索适合自己微服务监控需求的仪表盘。
同时,对于 Spring Native 项目,虽然在撰写本文时仍处于测试阶段,但它可以将基于 Java 的微服务编译成二进制可执行文件,使微服务能够在极短的时间内启动。不过,构建过程会涉及更多的复杂性和时间。可以关注 Spring Native 的官方文档(https://spring.io/projects/spring - native)来了解更多信息。
8. 加入社区讨论
为了与其他开发者和读者交流经验,可以加入社区的 Discord 空间:https://packt.link/SpringBoot3e。在这个社区中,可以与作者和其他读者讨论微服务监控的相关问题,分享经验和见解。
以下是常见问题及解答的列表:
1.
微服务源代码更改
:使用 Micrometer 库生成指标。
2.
management.metrics.tags.application
用途
:为指标添加应用程序标签。
3.
高 CPU 消耗分析仪表盘
:Kiali 或 Grafana 中与 CPU 相关的仪表盘。
4.
API 响应缓慢分析仪表盘
:包含 API 响应时间指标的仪表盘。
5.
基于计数器指标问题及监控方法
:结合其他类型指标,如直方图、计时器。
6.
特定截图指标分析
:根据断路器和重试机制的状态转换分析系统情况。
以下是社区资源的表格:
| 资源类型 | 链接 | 描述 |
| ---- | ---- | ---- |
| Grafana 社区仪表盘库 | https://grafana.com/grafana/dashboards | 提供丰富的仪表盘资源,可快速搭建监控环境 |
| Spring Native 官方文档 | https://spring.io/projects/spring - native | 了解将 Java 微服务编译成二进制可执行文件的相关信息 |
通过以上的介绍和操作,我们可以全面地使用 Prometheus 和 Grafana 来监控微服务,同时通过社区资源和交流不断提升监控能力,确保微服务系统的稳定运行。
graph LR
I[遇到常见问题] --> J[参考常见问题解答]
J --> K[使用社区资源]
K --> L[加入社区讨论]
在实际的微服务监控工作中,我们要不断总结经验,根据实际情况灵活运用各种工具和方法,以实现高效、准确的监控目标。
超级会员免费看
461

被折叠的 条评论
为什么被折叠?



