写点什么

Sermant 指标采集功能:构建指标可观测性实践

作者:华为云开源
  • 2025-07-01
    广东
  • 本文字数:5978 字

    阅读完需:约 20 分钟

Sermant指标采集功能:构建指标可观测性实践

Sermant 指标采集功能:构建指标可观测性实践

作者:Sermant 社区 Maintainer zwmagic

一、前言

在复杂的微服务架构中,确保每个服务的稳定运行至关重要。Sermant 作为一款业界领先的云原生无代理服务网格,凭借其强大的流量治理、容错增强等能力,为微服务保驾护航。然而,要真正做到“心中有数”,仅仅依赖治理能力是不够的,还需要一套完善的可观测性体系。Sermant 在 v2.2.0 推出了指标采集功能。这项功能允许开发者和运维人员通过 Prometheus 等主流监控工具,实时洞察 Sermant Agent 的运行状态,以及每个加载插件的健康度与性能表现。这不仅增强了 Sermant 自身的稳定性保障,也为微服务应用的深度优化提供了数据支撑。本文将结合实际应用场景,揭示这项功能如何在生产环境中发挥作用。

二、设计理念与数据模型

2.1 为什么需要 Sermant 指标采集?

在微服务场景下,我们常常面临以下挑战:

  • Sermant Agent 稳定性量化观测:我们需要了解 Sermant Agent 的启动耗时、心跳信息、内部功能加载情况,以便及时发现潜在的性能瓶颈或稳定性问题。

  • 观测插件运行情况:每个应用实例加载的 Sermant 插件数量、异常情况、异常率、加载耗时以及插件执行耗时等信息,对于评估插件效能、定位问题至关重要。

  • 标签路由(如全链路灰度)流量流转追踪难:在灰度发布场景下,我们希望实时观测流量是否按照预期进行流转,是否存在流量逃逸,确保灰度策略的有效性。

  • 动态方法指标埋点需求:对于特定的业务逻辑或中间件,我们可能需要动态地对其方法进行指标埋点,例如观测某个方法的执行耗时、异常情况等,以精准定位性能瓶颈 Sermant 的指标采集功能正是为解决这些痛点而设计。通过将 Sermant 内部的核心指标和插件自定义指标暴露给 Prometheus,并结合 Grafana 等可视化工具,我们能够构建可靠的监控体系,实现对微服务应用的整体观测。

2.2 设计理念

为了确保 Sermant 指标采集功能的通用性、易用性和与开源生态的兼容性,其设计理念与主流的指标监控框架,如 Micrometer,保持高度一致。Micrometer 作为 Java 领域的事实标准,提供了统一的指标 API,屏蔽了底层监控系统的差异,使得开发者可以专注于业务逻辑,而无需关心指标最终上报到哪个监控系统(Prometheus、InfluxDB、Datadog 等)。

Sermant 通过集成 Micrometer,对外暴露了统一的 MetricService 接口:

  • API 一致性与易用性:开发者在 Sermant Agent 核心或插件中定义指标时,可以沿用 Micrometer 的 API 风格,降低学习成本,提高开发效率。无论是计数器、度量器还是计时器,都通过统一的接口进行操作。

  • 可插拔与可扩展性:使得 Sermant 能够轻松支持更多主流监控系统。未来即使需要切换或增加新的监控后端,也无需修改 Sermant 内部或插件中的指标定义逻辑,只需适配新的 Micrometer 注册表即可。

  • 融入现有生态:与 Micrometer 的对齐,确保了 Sermant 采集的指标能够无缝融入用户已有的微服务监控体系,方便统一管理、查询和可视化。

2.3 架构设计和数据模型

Sermant 的 MetricService 支持 Micrometer 定义的四大核心指标类型:

  • Counter(计数器):用于记录单调递增的事件数量,例如请求总数、错误发生次数、特定业务操作完成次数等。它提供了一种简单而有效的方式来跟踪累积量。

  • Gauge(度量器):用于记录瞬时数值,反映某个时间点的状态或当前值,例如当前内存使用量、线程池活跃线程数、队列中待处理消息数量等。其值可以随时上下波动。

  • Timer(计时器):用于测量事件的持续时间以及事件发生的次数。它是性能监控的利器,常用于测量方法执行耗时、HTTP 请求响应时间、数据库查询耗时等。Timer 同时提供计数值和总时间,并能计算平均耗时。

  • Summary(分布摘要):用于统计观测值的分布情况,例如请求延迟的 P50、P90、P99 分位数。它能够提供比平均值更丰富的统计信息,帮助理解数据在不同百分位上的表现,尤其适用于分析延迟抖动等场景。



如上图所示,Sermant 的指标监控总体设计围绕以下核心组件展开:

  • MetricService: Sermant 内部统一的指标能力封装接口,提供了 Counter、Gauge、Timer、Summary 等指标类型的 API。Sermant Agent 核心模块和各类插件均通过此服务定义和更新指标,从而保证了指标定义的标准化和一致性。

  • ServiceManager: 作为 Sermant 的服务管理中心,通过 getService(MetricService.class)方式提供 MetricService 的获取,方便 Agent Core 和插件进行调用。

  • HTTP Server: Sermant 内部启动一个轻量级的 HTTP Server,用于将采集到的指标数据按照 Prometheus 的文本格式进行暴露。Prometheus 通过配置的端口和路径(默认http://localhost:47128/sermant/metrics)定时拉取这些指标数据

2.4 性能考量

Sermant 对指标采集的性能开销进行了测试与优化,减少对宿主应用的影响:

  • CPU 占用率:开启指标监控后,Sermant 的总 CPU 占用率不超过 5%

  • 内存增量:开启指标监控后,Sermant 的总内存增加量控制在 20MB 以内

三、 路由插件指标采集最佳实践

Sermant 有丰富的插件库,而路由插件作为实现微服务流量治理的核心能力,是全链路灰度、蓝绿发布、同可用区优先调用等高级场景的基础。通过集成指标采集功能,路由插件能够将其内部的流量流转状态透明化,为复杂流量策略的验证和运维提供了关键数据支撑。

3.1 路由插件的功能与可观测性需求

标签路由插件通过对服务提供者配置路由规则,将特定流量引导至预设的服务实例或分组,从而实现流量隔离和精细化控制。在全链路灰度等场景中,确保流量严格按照预期路径流转至关重要。这就对路由插件的运行时可观测性提出了极高要求:

  • 流量是否成功路由?

  • 特定标签的流量是否进入了预期的灰度环境?

  • 是否存在未匹配到路由规则的“异常”流量?

  • 请求是否成功被染色并携带了灰度标识?

Sermant 的指标采集功能与路由插件的结合,可以解答这些问题。

3.2 路由插件采集的核心指标

路由插件通过 MetricService 定义并采集了一系列关键指标,这些指标能够全方位地反映流量的流转情况,为用户提供实时、准确的洞察。以下是路由插件采集的主要指标及其详细说明:

3.2.1 router_request_count 指标

  • 描述:记录流经路由插件的请求总次数。这是衡量服务流量负载的基础指标。

  • 指标 Tag:protocol: 协议类型,例如:http、dubbo。通过此标签,可以区分不同协议的请求量。client_service_name: 发送请求的客户端服务的名称,有助于追溯流量的源头。erver_address: 接收请求的服务的地址,用于识别具体的服务实例。scope: 指标的来源范围,固定为 server-router,明确该指标由路由插件提供。

  • 价值:通过此指标,可以直观地了解每个服务的总请求量,作为评估服务压力的基础数据。

3.2.2 router_destination_tag_count 指标

  • 描述:记录根据路由规则成功路由到目标服务的次数。此指标是验证路由策略是否生效的关键。

  • 指标 Tag:protocol: 协议类型。client_service_name: 发送请求的客户端服务的名称。service_meta_service: 根据服务标签匹配到的目标服务的 service 标签信息。service_meta_version: 根据版本标签匹配到的目标服务的 version 标签信息。service_meta_application: 根据应用标签匹配到的目标服务的 application 标签信息。service_meta_zone: 根据可用区标签匹配到的目标服务的 zone 标签信息。service_meta_project: 根据项目标签匹配到的目标服务的 project 标签信息。service_meta_environment: 根据环境标签匹配到的目标服务的 environment 标签信息。service_meta_parameters: 根据用户自定义标签匹配到的目标服务的自定义标签信息。scope: 指标来源范围,固定为 server-router。

  • 价值:通过细粒度的标签,用户可以精确地统计特定标签流量(如灰度流量)是否成功路由到预期的服务版本或集群,是验证全链路灰度策略有效性的核心依据。


3.2.3 router_unmatched_request_count 指标

  • 描述:记录未匹配到任何路由规则的请求次数。

  • 指标 Tag:protocol: 协议类型。client_service_name: 发送请求的客户端服务的名称。scope: 指标来源范围,固定为 server-router。

  • 价值:这是一个重要的预警指标。未匹配的请求可能意味着路由规则配置有误、流量来源异常或存在未考虑到的边缘情况。实时监测此指标,有助于及时发现并修复潜在的流量风险,避免流量“逃逸”到非预期路径。

3.2.4 lane_tag_count 指标

  • 描述:记录请求被成功进行标签染色的次数。

  • 指标 Tag:protocol: 协议类型。client_service_name: 发送请求的客户端服务的名称。scope: 指标来源范围,固定为 server-router。lane_tag: 染色规则匹配成功后,请求实际带上的染色标记(例如,gray-release、v2)。

  • 价值: 在全链路灰度场景中,确保流量从入口到链路各节点都被正确染色是前提。此指标可用于验证流量染色机制的有效性,配合后续服务的 router_destination_tag_count,能够构建完整的灰度流量可视化路径。


3.3 路由插件指标带来的运维监控体验

通过上述路由插件指标的采集,Sermant 为使用全链路灰度场景的用户带来了革命性的运维监控体验:

  • 流量流转可视化:结合 Grafana 等可视化工具,用户可以构建仪表板,实时呈现带有不同标签的流量在微服务架构中的流转路径。从入口服务的 lane_tag_count 到链路各节点的 router_destination_tag_count,每一步流量的走向都清晰可见。

  • 灰度策略验证与风险规避:实时对比入口流量和各节点按标签路由的流量,可以直观判断灰度流量是否完全按照预期路径流转,及时发现并阻止流量逃逸。例如,如果应进入灰度环境的流量大量出现在生产环境,router_unmatched_request_count 和 router_destination_tag_count 的异常波动将立即发出警报。

  • 决策支持:通过对不同灰度标签流量的统计和分析,团队可以评估灰度发布的效果,逐步扩大灰度范围,直至全量上线,降低发布风险。

Sermant 路由插件的指标采集,将以往“黑盒”的流量流转变为“白盒”的实时监控,让微服务治理的每一步都“心中有数”。

四、 Sermant 指标采集应用场景与价值

Sermant 的指标采集功能远不止于路由插件。它为微服务应用的整体可观测性提供了全面而深入的支持,其价值体现在多个核心应用场景中:

4.1 洞察 Sermant Agent 运行状态

Sermant Agent 作为微服务应用的“守护者”,其自身的健康状况直接影响着整个应用的稳定性。指标采集功能为我们提供了对 Sermant Agent 运行状态的“透视镜”,帮助我们实现对其生命周期的管理:

  • 监控心跳信息:实时掌握 Sermant Agent 与其宿主应用之间的心跳状态,判断 Agent 是否正常工作,及时发现 Agent 的异常离线。

  • 分析内部功能加载情况:监测 Sermant 内部各个模块和服务的加载状态,例如 HTTP Server、XDS Service、各种插件的初始化耗时等,确保所有功能都按预期启动并正常运行。这些核心指标的采集,使得我们能够精准地感知 Sermant 的“健康状况”,提前预警并解决潜在的稳定性问题,确保 Agent 自身不成为系统的短板。

4.2 掌握插件使用情况

Sermant 的强大在于其丰富的插件生态,每个插件都承载着特定的治理能力。然而,插件的运行状况直接影响着应用的性能和稳定性。通过指标采集功能,我们可以深入了解:

  • 插件加载数量:统计每个应用实例加载的 Sermant 插件数量,有助于我们核对配置,避免因插件加载失败导致的功能缺失。

  • 插件异常与异常率:实时捕获插件执行过程中产生的异常,并计算异常率,帮助我们快速定位存在缺陷的插件或业务逻辑,提升插件质量。

  • 插件加载耗时:监测每个插件的加载耗时,识别耗时过长的插件,从而优化插件的初始化过程,减少应用启动时间,提升用户体验。

  • 插件执行耗时:针对关键插件(如流量治理、链路追踪插件的核心方法),我们可以通过自定义 Timer 指标,精准测量其核心逻辑的执行耗时,及时发现潜在的性能瓶颈,指导插件优化。这些细致的插件指标,使得插件的“效能”和“健康度”被量化呈现,极大地方便了插件的开发、测试、部署与运维。

4.3 动态方法指标埋点,精准定位性能瓶颈

Sermant 强大的 JavaAgent 动态增强能力,使得我们无需修改业务代码、无需重新编译或部署,即可对指定方法进行指标埋点。这在以下场景中尤为实用,能够提供前所未有的观测粒度:

  • 业务核心方法性能监测:针对交易核心流程、库存扣减、支付等关键业务方法,我们可以动态地埋点 Timer 指标,实时观测其执行耗时,识别潜在的性能瓶颈,优化业务响应速度。

  • 中间件运行状况观测: 洞察应用所依赖的中间件,如数据库连接池的使用情况(Gauge)、RPC 调用耗时(Timer)、缓存命中率(Gauge)等。通过对相关方法进行埋点,获取 Gauge 或 Timer 指标,帮助我们更细致地了解中间件的运行状况,及时发现并解决资源瓶颈。

  • 异常行为捕捉与量化: 对可能出现异常的方法进行 Counter 埋点,统计异常发生次数,结合异常率,快速定位并解决业务逻辑中的潜在问题,提高系统健壮性。

这种无需侵入业务代码的动态埋点能力,提升了我们对系统运行时行为的观测粒度,使得性能调优和问题排查变得更加高效、灵活和精准。

五、如何启用 Sermant 指标采集功能?

开启 Sermant 的指标采集功能非常简单,只需通过简单的配置即可实现:

  1. 开启 HTTP Server 服务: Sermant 的指标数据通过内置的 HTTP 端口暴露,因此首先需要确保 HTTP Server 服务已启用。在 Sermant 的配置文件中设置:agent.service.httpserver.enable=true

  2. 开启 Metric 服务: 在 Sermant 的 agent/config/config.properties 文件中设置指标采集功能为启用状态:

 agent.service.metric.enable=true

  1. 配置 Prometheus 抓取: 在 Prometheus 的 yml 配置文件中,添加 Sermant 的指标端点,以便 Prometheus 能够定时抓取数据:

scrape_configs:   - job_name: 'sermant-metrics'     static_configs:       - targets: ['localhost:47128'] # 根据实际Sermant Agent部署的IP和端口进行配置     metrics_path: '/sermant/metrics' # Sermant指标暴露的默认路径
复制代码

通过 Sermant 提供的 MetricService 接口,开发者可以在自己的 Sermant 插件中轻松自定义各种类型的指标,包括 Counter、Gauge、Timer 和 Summary,以满足不同维度和粒度的监控需求。

六、总结

Sermant 的指标采集功能增强了 Sermant 自身及其所治理的微服务应用的可观测性。它不仅提供了对 Sermant Agent 和插件运行状态的透明化观测,更通过动态埋点等高级能力,赋予了开发者更强大的系统洞察力。


在复杂的微服务架构、全链路灰度发布以及异地多活等高可用场景下,Sermant 的指标采集功能将成为保障系统稳定、优化性能、提升可观测性的重要工具。通过将核心指标和业务自定义指标统一暴露,并与 Prometheus、Grafana 等主流监控生态无缝集成,Sermant 使得微服务应用的运维监控变得更加精准、实时和高效。


我们相信,随着 Sermant 社区的不断发展,以及更多开发者和用户对其指标采集功能的实践和反馈,Sermant 将在微服务治理领域发挥越来越重要的作用。


Sermant 作为专注于服务治理领域的字节码增强框架,致力于提供高性能、可扩展、易接入、功能丰富的服务治理体验,并会在每个版本中做好性能、功能、体验的看护,广泛欢迎大家的加入。

  • Sermant 官网:https://sermant.io

  • GitHub 仓库地址:https://github.com/sermant-io/Sermant

  • 扫码加入 Sermant 社区交流群



用户头像

华为云开源官方博客--携手共建云原生根社区 2023-03-13 加入

还未添加个人简介

评论

发布
暂无评论
Sermant指标采集功能:构建指标可观测性实践_开源_华为云开源_InfoQ写作社区