47、微服务监控:使用 Prometheus 和 Grafana 进行性能监控

微服务监控:使用 Prometheus 和 Grafana 进行性能监控

1. 性能监控简介

在微服务架构中,监控是确保系统稳定运行和性能优化的关键环节。Prometheus 是一款流行的开源数据库,用于收集和存储时间序列数据,如性能指标;Grafana 则是一个开源工具,用于可视化这些性能指标。此外,Kiali 也能在不使用 Grafana 的情况下渲染一些与性能相关的图表。

为了使用这些工具进行监控,我们将复用之前创建的 Prometheus 和 Grafana 部署。同时,我们还需要部署一个本地邮件服务器,以演示 Grafana 的警报功能。

2. 收集应用程序指标的源代码更改

为了让微服务产生 Prometheus 可以收集的性能指标,我们需要对源代码进行一些更改。

2.1 添加依赖

在 Spring Boot 2 中,可以使用 Micrometer 库(https://micrometer.io)以 Prometheus 格式生成性能指标。我们只需在微服务的 Gradle 构建文件 build.gradle 中添加以下依赖:

implementation 'io.micrometer:micrometer-registry-prometheus'

这将使微服务在端口 4004 上使用 /actuator/prometheus 路径生成 Prometheus 指标。

2.2 添加注解

为了让 Prometheus 知道这些端点,我们需要在每个微服务的 Pod 上添加以下注解:

annotations:
  prometheus.io/scrape: "true"
  prometheus.io/port: "4004"
  prometheus.io/scheme: http
  prometheus.io/path: "/actuator/prometheus"

这些注解应添加到每个组件的 Helm 图表的 values.yaml 文件中。

2.3 标记指标来源

为了更容易识别指标的来源,我们在公共配置文件 config-repo/application.yml 中添加以下配置:

management.metrics.tags.application: ${spring.application.name}

这将为每个生成的指标添加一个名为 application 的额外标签,其值为微服务的名称。

2.4 添加测试

为了确保我们能从配置的 Prometheus 端点获取指标,我们在 test-em-all.bash 中添加了以下测试:

if [[ $USE_K8S == "true" ]]
then
  # Verify access to Prometheus formatted metrics
  echo "Prometheus metrics tests"
  assertCurl 200 "curl -ks https://health.minikube.me/actuator/prometheus"
fi

请注意,此测试仅在针对 Kubernetes 运行测试脚本时运行。

3. 构建和部署微服务

构建、部署和验证微服务的部署可以按照以下步骤进行:

3.1 构建 Docker 镜像
cd $BOOK_HOME/Chapter20
eval $(minikube docker-env -u)
./gradlew build
eval $(minikube docker-env)
docker-compose build
3.2 重新创建命名空间
kubectl delete namespace hands-on
kubectl apply -f kubernetes/hands-on-namespace.yml
kubectl config set-context $(kubectl config current-context) --namespace=hands-on 
3.3 解决 Helm 图表依赖
for f in kubernetes/helm/components/*; do helm dep up $f; done
for f in kubernetes/helm/environments/*; do helm dep up $f; done
3.4 部署系统
helm install hands-on-dev-env \
  kubernetes/helm/environments/dev-env \
  -n hands-on --wait
3.5 启动 Minikube 隧道
minikube tunnel
3.6 运行测试
./test-em-all.bash
4. 使用 Grafana 仪表盘监控微服务

在开始监控之前,我们需要做两个准备工作:
1. 安装本地邮件服务器并配置 Grafana 以能够向其发送警报邮件。
2. 启动之前使用过的负载测试工具。

4.1 安装本地邮件服务器

按照以下步骤安装本地测试邮件服务器并配置 Grafana:
1. 安装测试邮件服务器:

kubectl -n istio-system create deployment mail-server --image maildev/maildev:2.0.5
kubectl -n istio-system expose deployment mail-server --port=1080,1025 --type=ClusterIP
kubectl -n istio-system wait --timeout=60s --for=condition=ready pod -l app=mail-server
  1. 应用新的清单文件:
helm upgrade istio-hands-on-addons kubernetes/helm/environments/istio-system -n istio-system
  1. 验证邮件服务器是否正常运行:访问 https://mail.minikube.me。
4.2 配置 Grafana

通过设置 Grafana 的 Kubernetes 部署对象中的环境变量来配置 Grafana:

kubectl -n istio-system set env deployment/grafana \
    GF_ALERTING_ENABLED=true \
    GF_UNIFIED_ALERTING_ENABLED=false \
    GF_SMTP_ENABLED=true \
    GF_SMTP_SKIP_VERIFY=true \
    GF_SMTP_HOST=mail-server:1025 \
    GF_SMTP_FROM_ADDRESS=grafana@minikube.me
kubectl -n istio-system wait --timeout=60s --for=condition=ready pod -l app=Grafana
4.3 启动负载测试

使用 Siege 启动负载测试:

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
siege https://minikube.me/product-composite/1 -H "Authorization: Bearer $ACCESS_TOKEN" -c1 -d1 -v
5. 使用 Kiali 的内置仪表盘

Kiali 提供了一些非常有用的仪表盘,主要关注应用程序级别的性能指标,如每秒请求数、响应时间和请求处理的故障百分比。以下是使用 Kiali 内置仪表盘的步骤:
1. 打开 Kiali 网页 UI:https://kiali.minikube.me,必要时使用 admin/admin 登录。
2. 点击左侧菜单中的 Workloads 选项卡,查看部署。
3. 选择 product-composite 部署。
4. 在 product-composite 页面上,选择 Outbound Metrics 选项卡,查看性能图表。

同时,Grafana 提供了更详细的性能指标。可以通过访问 https://grafana.minikube.me 打开 Grafana 网页 UI,点击 Home 链接,选择 Istio 文件夹中的 Istio Mesh Dashboard 查看微服务的指标概述。

6. 导入现有的 Grafana 仪表盘

Grafana 有一个活跃的社区,会分享可复用的仪表盘。我们可以尝试导入一个社区提供的仪表盘,以获取与 Java VM 相关的指标。以下是导入 JVM (Micrometer) - Kubernetes - Prometheus 仪表盘的步骤:
1. 导入仪表盘:
- 在 Grafana 网页上,将鼠标悬停在左侧菜单的 Dashboard 图标上,选择 + Import
- 在 Import via grafana.com 字段中输入仪表盘 ID 11955 ,然后点击 Load 按钮。
- 在显示的页面上,点击 Prometheus 下拉菜单,选择 Prometheus 数据源。
- 点击 Import 按钮,导入并渲染仪表盘。
2. 检查仪表盘:
- 使用右上角的时间选择器选择 Last 5 minutes ,并在右侧的下拉菜单中选择 5s 的刷新速率。
- 在页面左上角的 Application 下拉菜单中选择 product-composite 微服务。
- 由于我们正在后台运行负载测试,将看到许多指标。

以下是操作步骤的流程图:

graph LR
    A[开始] --> B[安装本地邮件服务器]
    B --> C[配置 Grafana]
    C --> D[启动负载测试]
    D --> E[使用 Kiali 仪表盘]
    E --> F[导入 Grafana 仪表盘]
    F --> G[检查仪表盘]
    G --> H[结束]

通过以上步骤,我们可以使用 Prometheus 和 Grafana 对微服务进行全面的性能监控,同时利用 Kiali 和社区提供的仪表盘获取有价值的指标信息。在接下来的部分,我们将学习如何开发自己的 Grafana 仪表盘。

微服务监控:使用 Prometheus 和 Grafana 进行性能监控

7. 开发自己的 Grafana 仪表盘

开发 Grafana 仪表盘的关键在于了解 Prometheus 提供的可用指标,基于这些指标来创建用于监控有趣指标的仪表盘。

7.1 检查 Prometheus 指标

之前我们配置了 Prometheus 从微服务收集指标,现在可以调用相同的端点查看其收集的指标。运行以下命令:

curl https://health.minikube.me/actuator/prometheus -ks

命令会输出大量指标,其中有两个非常有趣的指标:
- resilience4j_retry_calls :Resilience4j 报告重试机制的运行情况,针对成功和失败请求,结合有无重试,报告四种不同的值。
- resilience4j_circuitbreaker_state :Resilience4j 报告断路器的状态。

这些指标带有名为 application 的标签,其中包含微服务的名称,该字段来自之前的配置。目前使用的仪表盘都未使用 Resilience4j 的指标,接下来我们将为这些指标创建一个仪表盘。

7.2 创建仪表盘

我们将按以下阶段设置仪表盘:
- 创建空仪表盘
- 为断路器指标创建新面板
- 为重试指标创建新面板
- 排列面板

以下是创建过程的详细步骤:

7.2.1 创建空仪表盘

按以下步骤创建空仪表盘:
1. 在 Grafana 网页上,将鼠标悬停在左侧菜单的 Dashboard 图标上,选择 + New Dashboard
2. 点击仪表盘设置按钮(齿轮图标),在 Name 字段中指定仪表盘名称为 Hands-on Dashboard ,然后点击页面左上角的返回按钮。
3. 点击时间选择器,选择 Last 5 minutes 作为时间范围。
4. 点击右侧的刷新速率图标,指定刷新速率为 5s。

7.2.2 为断路器指标创建新面板

按以下步骤为断路器指标创建新面板:
1. 在 Add panel 部分,点击 Add a new panel 按钮。
2. 在右侧选项卡中,将 Panel title 设置为 Circuit Breaker
3. 同样在右侧选项卡中,将 Tooltip mode 设置为 All
4. 在左下角的 Query 面板中,在字母 A 下,将查询指定为断路器关闭状态的指标:
- 设置 Metric resilience4j_circuitbreaker_state
- 设置 Label state ,并指定其值为 closed
- 验证 Raw query 是否设置为 resilience4j_circuitbreaker_state{state="closed"}
5. 展开 Options 选项卡,在 Legend 下拉框中选择 Custom ,在 Legend 字段中指定值为 {{state}}
6. 点击页面底部的 + Query 按钮,在 B 下输入打开状态的新查询,重复步骤 4,但将 state 的值设置为 open ,验证 Raw query 字段是否设置为 resilience4j_circuitbreaker_state{state="open"} ,并将 Legend 字段设置为 {{state}}
7. 最后一次点击 + Query 按钮,在 C 下输入半开状态的新查询,将 state 的值设置为 half_open ,验证 Raw query 字段是否设置为 resilience4j_circuitbreaker_state{state="half_open"} ,并将 Legend 字段设置为 {{state}}
8. 点击页面左上角的返回按钮回到仪表盘。

7.2.3 为重试指标创建新面板

按以下步骤为重试指标创建新面板:
1. 点击顶级菜单中的 Add panel 图标,然后点击 Add a new panel
2. 将 Panel title 指定为 Retry ,并将 Tooltip mode 设置为 All
3. 设置 Metric resilience4j_retry_calls_total
4. 由于重试指标是一个计数器,其值只会增加,因此使用 rate 函数将其转换为每秒速率指标,时间窗口指定为 30s:
- 点击 + Operations 按钮。
- 点击 Range functions 并选择 Rate 函数。
- 将 Range 设置为 30s。
5. 验证 Raw query 字段是否设置为 rate(resilience4j_retry_calls_total[30s])
6. 展开 Options 选项卡,在 Legend 下拉框中选择 Custom ,在 Legend 字段中指定值为 {{kind}}
7. 注意 Grafana 会根据指定的值立即在面板编辑器中渲染图表。
8. 点击返回按钮回到仪表盘。

7.2.4 排列面板

按以下步骤排列仪表盘上的面板:
1. 通过拖动面板右下角来调整面板大小。
2. 通过拖动面板标题来移动面板。

以下是创建自定义仪表盘的流程图:

graph LR
    A[开始] --> B[创建空仪表盘]
    B --> C[为断路器指标创建新面板]
    C --> D[为重试指标创建新面板]
    D --> E[排列面板]
    E --> F[结束]

通过以上步骤,我们可以完成自定义 Grafana 仪表盘的开发,用于监控微服务中更有趣的指标。这种能力不仅可以帮助我们快速获取所需的监控信息,还能根据实际需求定制监控内容,进一步提升微服务的可观测性和性能优化能力。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值