微服务监控:使用 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
- 应用新的清单文件:
helm upgrade istio-hands-on-addons kubernetes/helm/environments/istio-system -n istio-system
- 验证邮件服务器是否正常运行:访问 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 仪表盘的开发,用于监控微服务中更有趣的指标。这种能力不仅可以帮助我们快速获取所需的监控信息,还能根据实际需求定制监控内容,进一步提升微服务的可观测性和性能优化能力。
超级会员免费看
1568

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



