46、微服务的集中日志记录与监控

微服务的集中日志记录与监控

1. 集中日志记录与 Kibana 操作

1.1 保存和访问仪表盘

在 Kibana 中,点击“Save and go to Dashboard”按钮,会呈现一个新的仪表盘。接着在右上角点击“Save”按钮,为仪表盘命名,如“hands - on - dashboard”,再次点击“Save”保存。之后可通过汉堡菜单中的“Dashboard”选项随时返回该仪表盘。Kibana 有众多分析日志记录的功能,可参考 相关文档 自行探索。

1.2 发现微服务的日志记录

1.2.1 创建日志记录

为了查找日志记录,我们先使用 API 创建一些日志。步骤如下:
1. 获取访问令牌:

ACCESS_TOKEN=$(curl -k https://writer:secret - writer@minikube.me/oauth2/token -d grant_type=client_credentials -d scope="product:read product:write" -s | jq .access_token -r)
echo ACCESS_TOKEN=$ACCESS_TOKEN
  1. 创建一个产品:
curl -X POST -k https://minikube.me/product - composite \
  -H "Content - Type: application/json" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  --data '{"productId":1234,"name":"product name 1234","weight":1234}'
  1. 读取产品信息:
curl -H "Authorization: Bearer $ACCESS_TOKEN" -k 'https://minikube.me/product - composite/1234' -s | jq .
1.2.2 微服务日志创建代码

各微服务在处理获取请求时会记录日志,代码如下:
- 产品组合微服务:

LOG.info("Will get composite product info for product.id={}", productId);
  • 产品微服务:
LOG.info("Will get product info for id={}", productId);
  • 推荐微服务:
LOG.info("Will get recommendations for product with id={}", productId);
  • 评论微服务:
LOG.info("Will get reviews for product with id={}", productId);
1.2.3 使用 Kibana 查找日志记录
  1. 在 Kibana 网页上,通过汉堡菜单点击“Discover”。
  2. 若要更改时间间隔,点击时间选择器的日历图标进行调整。
  3. 为更好查看日志内容,在直方图下方的表格中添加日志字段作为列:
    • 点击“Filter by type”标签右侧的向下箭头,取消选择“Hide empty fields”以查看所有可用字段。
    • 从左侧“Available fields”列表中选择字段,可使用“Search field names”过滤。将光标悬停在字段上,点击出现的“+”按钮添加字段。依次选择“spring.level”(日志级别)、“kubernetes.namespace_name”(Kubernetes 命名空间)、“kubernetes.container_name”(容器名称)、“spring.trace”(分布式跟踪的跟踪 ID)、“log”(实际日志消息)。还可点击索引模式字段旁边的折叠图标隐藏字段列表。
  4. 查找 GET API 调用的日志记录,在左上角搜索字段输入“log:"product.id = 1234"”,点击“Update”(或“Refresh”)按钮,预期找到一条日志记录。
  5. 验证日志记录的时间戳和创建日志的容器名称是否为“product - composite”。
  6. 查找相关日志记录:将光标悬停在日志记录的“spring.trace”字段上,点击带有“+”号的放大镜过滤跟踪 ID。清除搜索字段,仅保留跟踪字段的过滤条件,点击“Update”查看结果。若有调试消息干扰,将光标悬停在“DEBUG”值上,点击带有“ - ”号的放大镜过滤掉 DEBUG 级别的日志记录,此时应能看到四个预期的日志记录。

1.3 执行根本原因分析

1.3.1 模拟错误

运行以下命令在搜索产品 ID 为 1234 的产品信息时在产品微服务中生成故障:

curl -H "Authorization: Bearer $ACCESS_TOKEN" -k https://minikube.me/product - composite/1234?faultPercent=100 -s | jq .
1.3.2 分析错误
  1. 删除 Kibana 网页上之前的搜索过滤器,点击每个过滤器的关闭图标(“x”)。
  2. 使用时间选择器选择包含问题发生时间的时间间隔。
  3. 选择属于“hands - on”命名空间的日志记录:
    • 点击左上角的汉堡图标(≡)展开左侧的字段列表。
    • 点击“Selected fields”列表中的“kubernetes.namespace_name”字段,点击“hands - on”命名空间后的“+”号。
  4. 搜索在该时间范围内日志级别为“WARN”且日志消息提及产品 ID 1234 的日志记录:点击“Selected fields”列表中的“spring.level”字段,点击“WARN”值后的“+”号进行过滤。
  5. 过滤第一条日志记录的跟踪 ID。
  6. 移除“WARN”日志级别的过滤,查看该跟踪 ID 下的所有记录。由于 Fluentd 插件的限制,无法通过跟踪 ID 找到识别根本原因的堆栈跟踪。可使用 Kibana 的功能查找特定日志记录附近的日志:展开包含错误信息的日志记录,点击“View surrounding documents”链接,将加载记录数量从默认的 5 增加到 10。第三条日志记录包含错误消息的堆栈跟踪,指向 ProductServiceImpl.java 的第 104 行:
throw new RuntimeException("Something went wrong...");

这就是错误的根本原因。分析完成后,点击浏览器的返回按钮回到主页面。还可保存搜索标准和表格布局的配置,点击右上角菜单中的“Save”,命名后保存,后续可通过“Open”恢复。

1.4 操作流程总结

graph LR
    A[获取访问令牌] --> B[创建产品]
    B --> C[读取产品信息]
    C --> D[Kibana 查找日志]
    D --> E[模拟错误]
    E --> F[分析错误]

2. 微服务监控:Prometheus 和 Grafana

2.1 监控的重要性

在生产环境中,收集应用程序性能和硬件资源使用的指标至关重要。监控这些指标可避免 API 请求和其他进程出现长响应时间或中断。为了以经济高效和主动的方式监控微服务系统,还需定义在指标超过配置限制时自动触发的警报。

2.2 本章涵盖内容

  • 介绍使用 Prometheus 和 Grafana 进行性能监控。
  • 为收集应用程序指标对源代码进行的更改。
  • 微服务的构建和部署。
  • 使用 Grafana 仪表盘监控微服务。
  • 在 Grafana 中设置警报。

2.3 技术要求

安装工具和访问源代码的说明可参考相关系统的安装指南。本章代码示例来自 $BOOK_HOME/Chapter19 ,若想查看为使用 Prometheus 和 Grafana 监控和警报性能指标对源代码所做的更改,可使用差异工具比较 $BOOK_HOME/Chapter19 $BOOK_HOME/Chapter20 两个文件夹。

2.4 监控流程概述

步骤 描述
引入监控工具 了解 Prometheus 和 Grafana 的基本概念和作用
代码更改 对源代码进行修改以收集应用程序指标
构建部署 构建并部署微服务
仪表盘监控 使用 Grafana 仪表盘监控微服务
设置警报 在 Grafana 中设置警报规则
graph LR
    A[引入 Prometheus 和 Grafana] --> B[代码更改收集指标]
    B --> C[构建和部署微服务]
    C --> D[Grafana 仪表盘监控]
    D --> E[设置 Grafana 警报]

通过以上集中日志记录和微服务监控的操作,我们可以更好地管理和维护微服务系统,及时发现和解决问题,确保系统的稳定运行。

2.5 使用 Prometheus 和 Grafana 进行性能监控的详细步骤

2.5.1 引入 Prometheus 和 Grafana

Prometheus 是一个开源的系统监控和警报工具包,它可以收集和存储时间序列数据。Grafana 则是一个可视化工具,能够将 Prometheus 收集的数据以直观的图表和仪表盘形式展示出来。在开始监控之前,需要先了解这两个工具的基本概念和作用。

2.5.2 对源代码进行更改以收集应用程序指标

为了让微服务能够向 Prometheus 提供指标数据,需要对源代码进行一些修改。通常会使用一些库来帮助收集指标,例如 Micrometer。以下是一些常见的修改步骤:

  1. 添加依赖 :在项目的构建文件(如 Maven 的 pom.xml 或 Gradle 的 build.gradle )中添加 Micrometer 和 Prometheus 相关的依赖。

Maven 示例:

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-core</artifactId>
    <version>1.9.0</version>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
    <version>1.9.0</version>
</dependency>
  1. 配置 Micrometer :在应用程序的配置文件中配置 Micrometer,使其与 Prometheus 集成。例如,在 Spring Boot 应用中,可以在 application.properties application.yml 中添加以下配置:

application.properties 示例:

management.metrics.export.prometheus.enabled=true
  1. 在代码中记录指标 :在关键的业务逻辑处记录指标,例如记录请求的响应时间、请求次数等。以下是一个简单的示例:
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    private final Counter requestCounter;

    public MyService(MeterRegistry registry) {
        this.requestCounter = registry.counter("my.service.requests");
    }

    public void handleRequest() {
        requestCounter.increment();
        // 业务逻辑
    }
}
2.5.3 构建和部署微服务

完成源代码的修改后,需要将微服务进行构建和部署。具体步骤如下:

  1. 构建项目 :使用构建工具(如 Maven 或 Gradle)将项目打包成可执行的 JAR 文件或 Docker 镜像。

Maven 构建命令示例:

mvn clean package
  1. 部署微服务 :将打包好的微服务部署到目标环境中,例如 Kubernetes 集群。可以使用 Kubernetes 的 Deployment 和 Service 资源来管理微服务的部署和访问。

以下是一个简单的 Kubernetes Deployment 示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-service-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-service
  template:
    metadata:
      labels:
        app: my-service
    spec:
      containers:
      - name: my-service
        image: my-service:1.0.0
        ports:
        - containerPort: 8080
2.5.4 使用 Grafana 仪表盘监控微服务

部署好微服务后,就可以使用 Grafana 来监控微服务的性能指标了。具体步骤如下:

  1. 配置数据源 :在 Grafana 中配置 Prometheus 作为数据源,以便 Grafana 能够从 Prometheus 获取数据。在 Grafana 的界面中,导航到“Configuration” -> “Data Sources”,点击“Add data source”,选择 Prometheus,填写 Prometheus 的地址和其他相关信息。

  2. 创建仪表盘 :在 Grafana 中创建仪表盘,添加需要展示的图表。可以根据需要选择不同的图表类型,如折线图、柱状图等。在创建图表时,使用 PromQL(Prometheus 查询语言)编写查询语句来获取所需的数据。

以下是一个简单的 PromQL 查询示例,用于查询某个服务的请求次数:

sum(my_service_requests_total)
  1. 定制仪表盘 :根据实际需求对仪表盘进行定制,调整图表的样式、布局等,使其更符合监控需求。
2.5.5 在 Grafana 中设置警报

为了及时发现微服务的性能问题,需要在 Grafana 中设置警报。具体步骤如下:

  1. 创建警报规则 :在 Grafana 的仪表盘或单个图表上创建警报规则。定义警报的触发条件,例如当某个指标超过一定阈值时触发警报。

  2. 配置通知渠道 :配置警报的通知渠道,例如邮件、Slack 等。在 Grafana 的“Configuration” -> “Alerting” 中,添加通知渠道并填写相关信息。

  3. 测试警报 :在设置好警报规则和通知渠道后,进行测试,确保警报能够正常触发并通知到相关人员。

2.6 监控过程中的注意事项

  • 指标选择 :选择合适的指标进行监控非常重要,要根据业务需求和系统特点选择能够反映系统性能和健康状况的指标。
  • 数据准确性 :确保收集到的指标数据准确无误,避免因数据不准确导致误判。
  • 资源消耗 :监控本身也会消耗一定的系统资源,要注意监控工具的资源使用情况,避免对系统性能产生过大影响。

2.7 总结与展望

通过使用 EFK 栈进行集中日志记录和 Prometheus、Grafana 进行微服务监控,我们可以更好地管理和维护微服务系统。集中日志记录可以帮助我们快速定位和解决问题,而微服务监控则可以让我们实时了解系统的性能和健康状况,及时发现潜在的问题并采取措施。

未来,随着微服务架构的不断发展和应用场景的不断丰富,监控和日志记录的需求也会越来越高。我们可以进一步探索更高级的监控和日志分析技术,例如使用机器学习算法对日志和指标数据进行分析,以实现更智能的问题预测和解决。同时,也可以关注一些新兴的监控和日志记录工具,不断提升系统的管理和维护能力。

总之,掌握集中日志记录和微服务监控技术是保障微服务系统稳定运行的关键,希望本文介绍的内容能够对读者有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值