48、微服务监控:使用 Prometheus 和 Grafana

微服务监控:使用 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 导出和导入仪表盘的步骤
  1. 确定仪表盘的 uid :在浏览器中打开仪表盘,从 URL 中获取 uid。例如: https://grafana.minikube.me/d/YMcDoBg7k/hands-on-dashboard ,其中 YMcDoBg7k 就是 uid。
  2. 创建变量 :在终端窗口中创建一个变量来存储 uid 的值。例如: ID=YMcDoBg7k
  3. 导出仪表盘到 JSON 文件 :运行以下命令:
curl -sk https://grafana.minikube.me/api/dashboards/uid/$ID | jq '.dashboard.id=null' > "Hands-on-Dashboard.json"
  1. 删除仪表盘 :在浏览器中,选择左侧菜单中的 Dashboards Browse ,找到 Hands-on Dashboard 并选中前面的复选框,点击红色的 Delete 按钮,然后在弹出的确认对话框中再次点击 Delete
  2. 从 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
  1. 验证导入的仪表盘 :确保导入的仪表盘报告的指标与删除和重新导入之前相同。
3. 设置 Grafana 告警

监控断路器和重试指标很有价值,但更重要的是能够在这些指标上定义自动告警,以减轻手动监控的负担。

3.1 设置基于邮件的通知通道
  1. 在 Grafana 网页上,点击左侧菜单中的 Alerting 选项,选择 Notification channels
  2. 点击 Add channel 按钮。
  3. 将名称设置为 mail
  4. 选择类型为 Email
  5. 输入一个电子邮件地址,邮件将发送到本地测试邮件服务器。
  6. 展开 Notification settings ,选择 Default (Use this notification for all alerts)
  7. 点击 Test 按钮发送测试邮件。
  8. 点击 Save 按钮。
  9. 点击左侧菜单中的 Dashboard 按钮,然后选择 Browse 菜单条目。
  10. 从列表中选择 Hands-on Dashboard 回到仪表盘。
  11. 检查测试邮件服务器的网页,确保收到测试邮件。
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. 测试断路器告警

重复之前测试断路器指标的步骤,但这次期望触发告警并发送邮件。

  1. 获取新的访问令牌 (如果需要):
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
  1. 打开断路器
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[加入社区讨论]

在实际的微服务监控工作中,我们要不断总结经验,根据实际情况灵活运用各种工具和方法,以实现高效、准确的监控目标。

(Kriging_NSGA2)克里金模型结合多目标遗传算法求最优因变量及对应的最佳自变量组合研究(Matlab代码实现)内容概要:本文介绍了克里金模型(Kriging)与多目标遗传算法NSGA-II相结合的方法,用于求解最优因变量及其对应的最佳自变量组合,并提供了完整的Matlab代码实现。该方法首先利用克里金模型构建高精度的代理模型,逼近复杂的非线性系统响应,减少计算成本;随后结合NSGA-II算法进行多目标优化,搜索帕累托前沿解集,从而获得多个最优折衷方案。文中详细阐述了代理模型构建、算法集成流程及参数设置,适用于工程设计、参数反演等复杂优化问题。此外,文档还展示了该方法在SCI一区论文中的复现应用,体现了其科学性与实用性。; 适合人群:具备一定Matlab编程基础,熟悉优化算法数值建模的研究生、科研人员及工程技术人员,尤其适合从事仿真优化、实验设计、代理模型研究的相关领域工作者。; 使用场景及目标:①解决高计算成本的多目标优化问题,通过代理模型降低仿真次数;②在无法解析求导或函数高度非线性的情况下寻找最优变量组合;③复现SCI高水平论文中的优化方法,提升科研可信度与效率;④应用于工程设计、能源系统调度、智能制造等需参数优化的实际场景。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现过程,重点关注克里金模型的构建步骤与NSGA-II的集成方式,建议自行调整测试函数或实际案例验证算法性能,并配合YALMIP等工具包扩展优化求解能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值