32、微服务可观测性工具实践指南

微服务可观测性工具实践指南

1. 分布式追踪与OpenTracing

1.1 向Zipkin发布追踪数据

要向Zipkin发布OpenTracing兼容的追踪数据,首先需要在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>io.opentracing.contrib</groupId>
    <artifactId>opentracing-spring-zipkin-starter</artifactId>
    <version>0.1.1</version>
</dependency>

接着,在 application.properties 文件中添加 opentracing.zipkin.http-sender.baseUrl 属性,指定Zipkin服务器的URL:

opentracing.zipkin.http-sender.baseUrl=http://localhost:9411/

运行订单处理微服务并使用以下cURL命令进行调用(从相应目录执行):

> mvn clean install
> mvn spring-boot:run
> curl http://localhost:9000/order/11

多次执行调用后,可通过Zipkin的Web控制台( http://localhost:9411/zipkin/ )查看记录的数据。

1.2 向Jaeger发布追踪数据

Jaeger是另一个受Zipkin和Dapper启发的开源分布式追踪系统。以下是向Jaeger发布追踪数据的步骤:
1. 使用Docker启动Jaeger实例:

> docker run -d -p 5775:5775/udp -p 16686:16686 jaegertracing/all-in-one:latest

启动后,可通过 http://localhost:16686/ 访问其Web控制台。
2. 在 pom.xml 文件中添加以下Maven依赖:

<dependency>
    <groupId>io.opentracing.contrib</groupId>
    <artifactId>opentracing-spring-cloud-starter</artifactId>
    <version>0.1.13</version>
</dependency>
<dependency>
    <groupId>io.opentracing.contrib</groupId>
    <artifactId>opentracing-spring-cloud-starter-jaeger</artifactId>
    <version>0.1.13</version>
</dependency>
  1. application.properties 文件中添加以下属性,指定Jaeger服务器的地址和端口:
opentracing.jaeger.udp-sender.host=localhost
opentracing.jaeger.udp-sender.port=5775
  1. 运行订单处理微服务并使用以下cURL命令进行调用(从相应目录执行):
> mvn clean install
> mvn spring-boot:run
> curl http://localhost:9000/order/11

多次执行调用后,可通过Jaeger的Web控制台( http://localhost:16686/ )查看记录的数据。

2. 使用Prometheus进行指标监控

2.1 从Spring Boot微服务暴露指标

要让Spring Boot微服务以Prometheus能理解的格式暴露指标,需进行以下操作:
1. 在 pom.xml 文件中添加以下Maven依赖:

<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_spring_boot</artifactId>
    <version>0.1.0</version>
</dependency>
<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_hotspot</artifactId>
    <version>0.1.0</version>
</dependency>
  1. OrderProcessingApp.java 类文件中添加 @EnablePrometheusEndpoint @EnableSpringBootMetricsCollector 注解。
  2. application.properties 文件中添加以下属性,以无安全方式暴露指标:
management.security.enabled=false
  1. 启动订单处理微服务:
> mvn clean install
> mvn spring-boot:run

服务启动后,可通过 http://localhost:9000/prometheus 访问其发布的指标。以下是部分指标输出示例:

# HELP httpsessions_max httpsessions_max
# TYPE httpsessions_max gauge
httpsessions_max -1.0
# HELP httpsessions_active httpsessions_active
# TYPE httpsessions_active gauge
httpsessions_active 0.0
# HELP mem mem
# TYPE mem gauge
mem 549365.0
# HELP mem_free mem_free
# TYPE mem_free gauge
mem_free 211808.0
# HELP processors processors
# TYPE processors gauge
processors 8.0
# HELP instance_uptime instance_uptime
# TYPE instance_uptime gauge
instance_uptime 313310.0
# HELP uptime uptime
# TYPE uptime gauge
uptime 317439.0
# HELP systemload_average systemload_average
# TYPE systemload_average gauge
systemload_average 2.13720703125
# HELP heap_committed heap_committed
# TYPE heap_committed gauge
heap_committed 481280.0
# HELP heap_init heap_init
# TYPE heap_init gauge
heap_init 262144.0
# HELP heap_used heap_used
# TYPE heap_used gauge
heap_used 269471.0
# HELP heap heap
# TYPE heap gauge
heap 3728384.0
# HELP nonheap_committed nonheap_committed
# TYPE nonheap_committed gauge
nonheap_committed 71696.0

2.2 设置Prometheus

使用Docker设置Prometheus很简单,步骤如下:
1. 创建 prometheus.yml 文件,指定要监控的服务。示例如下:

scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 10s
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'orderprocessing'
    scrape_interval: 10s
    metrics_path: '/prometheus'
    static_configs:
      - targets: ['10.0.0.93:9000']
  1. 使用以下命令启动Prometheus Docker实例:
> docker run -p 9090:9090 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
  1. 启动后,访问 http://localhost:9090/targets ,可查看Prometheus监控的服务及各端点的状态。

2.3 使用Prometheus构建图表

要使用Prometheus构建图表来监控发布的指标,可按以下步骤操作:
1. 访问 http://localhost:9090/graph
2. 选择要监控的指标,例如 heap_used
3. 点击 Graph 标签,即可查看使用堆内存随时间变化的图表。

以下是一个简单的mermaid流程图,展示了Prometheus监控微服务指标的流程:

graph LR
    A[微服务] -->|暴露指标| B[Prometheus]
    B -->|拉取指标| C[存储指标]
    C -->|查询指标| D[构建图表]

2.4 使用Grafana进行分析和监控

Grafana是一个用于分析和监控的开源工具,在构建仪表盘方面比Prometheus更强大。以下是使用Grafana构建仪表盘的步骤:
1. 使用Docker启动Grafana实例:

> docker run -d -p 3000:3000 grafana/grafana

启动后,使用 admin/admin 凭证登录 http://localhost:3000
2. 添加新的数据源:
- 点击 Add Data Source ,选择 Prometheus 作为数据源类型。
- 为数据源命名,如 prometheus_ds
- 设置 HTTP URL 属性,指向Prometheus服务器。
3. 创建新的仪表盘:
- 访问 http://localhost:3000/dashboard/new
- 选择 Graph ,点击面板标题并选择 Edit
- 在 Metrics 下选择通过所选数据源提供的任何指标,可定义多个查询。例如,选择 heap heap_used
- 完成配置后,可在Grafana主页的“最近查看的仪表盘”中找到新创建的仪表盘。

2.5 使用Grafana创建警报

Grafana允许创建警报并将其与图表或仪表盘面板关联。创建警报的步骤如下:
1. 编辑要关联警报的图表,点击其标题并选择 Edit
2. 在 Alerts 下创建规则,指定系统应在何种条件下触发警报。例如,以下查询表示当指标 A (这里是 heap )的最大值在接下来的五分钟内高于3时触发警报,规则每60秒评估一次:

WHEN max() OF query(A, 5m, now) IS ABOVE 3

Grafana还支持多种函数,如 avg() min() sum() 等。
3. 设置警报规则后,可在 Notifications 菜单下配置通知接收方和消息内容。Grafana支持多种通知渠道,包括电子邮件、PagerDuty、Telegram、Slack等。

2.6 使用Fluentd日志收集器

Fluentd是一个可扩展的数据收集工具,可作为守护进程运行。微服务可以将日志发布到Fluentd,它能处理不同格式的日志并将其转发到第三方系统。以下是使用Fluentd从Docker容器中的微服务收集日志的步骤:

2.6.1 以Docker容器方式启动Fluentd

使用以下命令启动Fluentd Docker容器:

> docker run -d -p 24224:24224 -v ~/data:/fluentd/log fluent/fluentd

在启动前,确保主机文件系统的主目录中有一个名为 data 的目录。通过 -v 选项将主机的 ~/data 目录映射到容器的 /fluentd/log 目录,以持久化日志数据。

2.6.2 从Docker容器中的微服务向Fluentd发布日志

使用以下命令启动包含订单处理微服务的Docker容器:

> docker run -d -p 9000:9000 --log-driver=fluentd prabath/sample01

通过 --log-driver=fluentd 参数,Docker将使用Fluentd驱动将微服务的标准输出日志发布到Fluentd。如果Fluentd运行在不同的端口,需要通过 fluentd-address 参数指定其地址。

2.6.3 Fluentd的工作原理

Fluentd使用配置文件 fluent.conf (默认位于容器文件系统的 /fluentd/etc 目录)定义输入源和输出目标。以下是默认 fluent.conf 文件的内容:

<source>
  @type  forward
  @id    input1
  @label @mainstream
  port  24224
</source>
<filter **>
  @type stdout
</filter>
<label @mainstream>
  <match docker.**>
    @type file
    @id   output_docker1
    path         /fluentd/log/docker.*.log
    symlink_path /fluentd/log/docker.log
    append       true
    time_slice_format %Y%m%d
    time_slice_wait   1m
    time_format       %Y%m%dT%H%M%S%z
  </match>
  <match **>
    @type file
    @id   output1
    path         /fluentd/log/data.*.log
    symlink_path /fluentd/log/data.log
    append       true
    time_slice_format %Y%m%d
    time_slice_wait   10m
    time_format       %Y%m%dT%H%M%S%z
  </match>
</label>

source 标签定义输入源, match 标签根据事件的标签匹配规则处理消息并定义输出目标。

以下是一个表格总结各工具的相关信息:
| 工具名称 | 功能 | 启动命令 | 访问地址 |
| ---- | ---- | ---- | ---- |
| Zipkin | 分布式追踪 | 需提前启动 | http://localhost:9411/zipkin/ |
| Jaeger | 分布式追踪 | docker run -d -p 5775:5775/udp -p 16686:16686 jaegertracing/all-in-one:latest | http://localhost:16686/ |
| Prometheus | 指标监控 | docker run -p 9090:9090 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus | http://localhost:9090/ |
| Grafana | 分析和监控 | docker run -d -p 3000:3000 grafana/grafana | http://localhost:3000/ |
| Fluentd | 日志收集 | docker run -d -p 24224:24224 -v ~/data:/fluentd/log fluent/fluentd | 无直接访问地址 |

通过以上步骤和工具,我们可以实现微服务的分布式追踪、指标监控、日志收集和可视化分析,提高微服务系统的可观测性和运维效率。

2.7 各工具使用流程总结

为了更清晰地展示各个工具的使用流程,下面以表格形式呈现:
| 工具 | 使用流程 |
| ---- | ---- |
| Zipkin | 1. 添加依赖到 pom.xml
xml<br><dependency><br> <groupId>io.opentracing.contrib</groupId><br> <artifactId>opentracing-spring-zipkin-starter</artifactId><br> <version>0.1.1</version><br></dependency><br>
2. 在 application.properties 添加配置:
properties<br>opentracing.zipkin.http-sender.baseUrl=http://localhost:9411/<br>
3. 运行微服务:
bash<br>> mvn clean install<br>> mvn spring-boot:run<br>> curl http://localhost:9000/order/11<br>
4. 访问 http://localhost:9411/zipkin/ 查看数据 |
| Jaeger | 1. 启动Docker实例:
bash<br>> docker run -d -p 5775:5775/udp -p 16686:16686 jaegertracing/all-in-one:latest<br>
2. 添加依赖到 pom.xml
xml<br><dependency><br> <groupId>io.opentracing.contrib</groupId><br> <artifactId>opentracing-spring-cloud-starter</artifactId><br> <version>0.1.13</version><br></dependency><br><dependency><br> <groupId>io.opentracing.contrib</groupId><br> <artifactId>opentracing-spring-cloud-starter-jaeger</artifactId><br> <version>0.1.13</version><br></dependency><br>
3. 在 application.properties 添加配置:
properties<br>opentracing.jaeger.udp-sender.host=localhost<br>opentracing.jaeger.udp-sender.port=5775<br>
4. 运行微服务:
bash<br>> mvn clean install<br>> mvn spring-boot:run<br>> curl http://localhost:9000/order/11<br>
5. 访问 http://localhost:16686/ 查看数据 |
| Prometheus | 1. 微服务添加依赖到 pom.xml
xml<br><dependency><br> <groupId>io.prometheus</groupId><br> <artifactId>simpleclient_spring_boot</artifactId><br> <version>0.1.0</version><br></dependency><br><dependency><br> <groupId>io.prometheus</groupId><br> <artifactId>simpleclient_hotspot</artifactId><br> <version>0.1.0</version><br></dependency><br>
2. 在 OrderProcessingApp.java 添加注解: @EnablePrometheusEndpoint @EnableSpringBootMetricsCollector
3. 在 application.properties 添加配置:
properties<br>management.security.enabled=false<br>
4. 启动微服务:
bash<br>> mvn clean install<br>> mvn spring-boot:run<br>
5. 创建 prometheus.yml
yaml<br>scrape_configs:<br> - job_name: 'prometheus'<br> scrape_interval: 10s<br> static_configs:<br> - targets: ['localhost:9090']<br> - job_name: 'orderprocessing'<br> scrape_interval: 10s<br> metrics_path: '/prometheus'<br> static_configs:<br> - targets: ['10.0.0.93:9000']<br>
6. 启动Prometheus Docker实例:
bash<br>> docker run -p 9090:9090 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus<br>
7. 访问 http://localhost:9090/targets 查看状态 |
| Grafana | 1. 启动Docker实例:
bash<br>> docker run -d -p 3000:3000 grafana/grafana<br>
2. 登录 http://localhost:3000 admin/admin
3. 添加数据源:选择 Prometheus ,设置URL等
4. 创建仪表盘:访问 http://localhost:3000/dashboard/new ,选择指标等
5. 创建警报:编辑图表,设置规则,配置通知 |
| Fluentd | 1. 启动Docker实例:
bash<br>> docker run -d -p 24224:24224 -v ~/data:/fluentd/log fluent/fluentd<br>
2. 启动微服务容器:
bash<br>> docker run -d -p 9000:9000 --log-driver=fluentd prabath/sample01<br> |

2.8 工具之间的交互关系

各工具在微服务可观测性中相互协作,形成一个完整的体系。以下是一个mermaid流程图,展示它们之间的交互关系:

graph LR
    A[微服务] -->|追踪数据| B[Zipkin]
    A -->|追踪数据| C[Jaeger]
    A -->|指标数据| D[Prometheus]
    D -->|数据提供| E[Grafana]
    A -->|日志数据| F[Fluentd]
    F -->|日志转发| G[第三方系统]

2.9 注意事项

在使用这些工具时,有一些注意事项需要关注:
1. 网络和权限 :确保各个工具之间的网络连通性,例如Grafana要能访问Prometheus服务器,Fluentd要能接收微服务的日志。同时,注意工具的权限设置,如Prometheus和Grafana的安全配置。
2. 版本兼容性 :不同工具的不同版本可能存在兼容性问题,在选择版本时要进行充分的测试和验证。例如,某些依赖的版本可能会影响微服务与工具之间的集成。
3. 资源占用 :这些工具在运行过程中会占用一定的系统资源,如内存、CPU等。在生产环境中,要合理规划资源,避免因资源不足导致系统性能下降。

2.10 总结

通过使用Zipkin、Jaeger进行分布式追踪,Prometheus进行指标监控,Grafana进行可视化分析和警报设置,以及Fluentd进行日志收集和转发,我们可以全面提升微服务系统的可观测性。各个工具都有其独特的功能和优势,相互配合使用能更好地满足微服务运维和监控的需求。在实际应用中,要根据具体的业务场景和需求,合理选择和配置这些工具,以确保微服务系统的稳定运行和高效管理。

希望以上内容能帮助你更好地理解和应用这些微服务可观测性工具,提升微服务系统的可维护性和可靠性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值