2023年3月28日

RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践
作者简介:艾阳坤,Apache RocketMQ PMC Member/Committer,CNCF OpenTelemetry Member,CNCF Envoy contributor。 在分布式系统中,多个服务之间的交互涉及到复杂的网络通信和数据传输,其中每个服务可能由不同的团队或组织负责维护和开发。因此,在这样的环境下,当一个请求被发出并经过多个服务的处理后,如果出现了问题或错误,很难快速定位到根因。分布式全链路追踪技术则可以帮助我们解决这个问题,它能够跟踪和记录请求在系统中的传输过程,并提供详细的性能和日志信息,使得开发人员能够快速诊断和定位问题。对于分布式系统的可靠性、性能和可维护性起到了非常重要的作用。 RocketMQ 5.0 与分布式全链路追踪 Apache RocketMQ 5.0 版本作为近几年来最大的一次迭代,在整个可观测性上也进行了诸多改进。其中,支持标准化的分布式全链路追踪就是一个重要的特性。 RocketMQ 5.0 可观测 而由 Google、Microsoft、Uber 和 LightStep 联合发起的 CNCF OpenTelemetry 作为 OpenTracing 和 OpenCensus 的官方继任者,已经成为可观测领域的事实标准,RocketMQ 的分布式全链路追踪也围绕 OpenTelemetry 进行展开。 分布式链路追踪系统的起源可以追溯到 2007 年 Google 发布的论文。这篇论文详细介绍了 Google 内部使用的链路追踪系统 Dapper,其中使用的 span 概念被广泛采用,并成为后来开源链路追踪系统中的基础概念之一。 Dapper Trace Tree 在 Dapper 中,每个请求或事务被追踪时都会创建一个 span,记录整个请求或事务处理过程中的各个组件和操作的时间和状态信息。这些 span 可以嵌套,形成一个树形结构,用于表示整个请求或事务处理过程中各个组件之间的依赖关系和调用关系。后来,很多开源链路追踪系统,如 Zipkin 和 OpenTracing,也采用了类似的 span 概念来描述分布式系统中的链路追踪信息。现在,合并了 OpenTracing 和 OpenCensus 的 CNCF OpenTelemetry 自然也一样采用了 span 概念,并在此基础上进行了进一步发展。 OpenTelemetry 为 messaging 相关的 span 定义了,旨在制定一套与特定消息系统无关的 specification,而 OpenTelmetry 自身的开发其实也都是由 specification 驱动进行展开。 Specification Driven Development Messaging Span 定义 Specifaition 中描述了 messaging span 的拓扑关系,包括代表消息发送、接收和处理的不同 span 之间的父子和链接关系。关于具体的定义可以参考:。对应到 RocketMQ 中,有三种不同的 span: | Span | Description | | | | | send | 消息的发送过程。span 以一次发送行为开始,成功或者失败/抛异常结束。消息发送的内部重试会被记录成多条 span。 | | receive | 消费者中接收消息的长轮询过程,与长轮询的生命周期保持一致。 | | process | 对应 PushConsumer 里 MessageListener 中对消息的处理过程,span 以进入 MessageListener 为开始,离开 MessageListener 为结束。 | 特别地,默认情况下,receive span 是不启用的。在 receive span 启用和不启用的两种情况下,span 之间的组织关系是不同的: 启用 receive span 前后的 span 关系 在没有启用 receive span 的情况下,process span 会作为 send span 的 child;而当 receive span 启用的情况下,process span 会作为 receive span 的 child,同时 link 到 send span。 Messaging Attributes 定义 语义约定中规定了随 span 携带的通用属性的统一名称,这包括但不限于: messaging.message.id: 消息的唯一标识符。 messaging.destination:消息发送的目的地,通常是一个队列或主题名称。 messaging.operation:对消息的操作类型,例如发送、接收、确认等。 具体可以查看 。 特别地,不同的消息系统可能会有自己特定的行为和属性,,这包括: | Attribute | Type | Description | | | | | | messaging.rocketmq.namespace | string | RocketMQ 资源命名空间,暂未启用 | | messaging.rocketmq.client_group | string | RocketMQ producer/consumer 负载均衡组,5.0 只对 consumer 生效 | | messaging.rocketmq.client_id | string | 客户端唯一标识符 | | messaging.rocketmq.message.delivery_timestamp | int | 定时消息定时时间,只对 5.0 生效 | | messaging.rocketmq.message.delay_time_level | int | 定时消息定时级别,只对 4.0 生效 | | messaging.rocketmq.message.group | string | 顺序消息分组,只对 5.0 生效 | | messaging.rocketmq.message.type | string | 消息类型,可能为 normal/fifo/delay/transaction,只对 5.0 生效 | | messaging.rocketmq.message.tag | string | 消息 tag | | messaging.rocketmq.message.keys | string[] | 消息 keys,可以有多个 | | messaging.rocketmq.consumption_model | string | 消息消费模型,可能为 clustering/broadcasting,5.0 broadcasting 被废弃 | 快速开始 在 OpenTelemetry 中有两种不同的方式可以为应用程序添加可观测信息: Automatic Instrumentation:无需编写任何代码,只需进行简单的配置即可自动生成可观测信息,包括应用程序中使用的类库和框架,这样可以更方便地获取基本的性能和行为数据。 Manual Instrumentation:需要编写代码来创建和管理可观测数据,并通过 exporter 导出到指定的目标。这样可以更灵活自由地控制用户想要观测的逻辑和功能。 在 Java 类库中,前者是一种更为常见的使用形式。RocketMQ 5.0 客户端的 trace 也依托于 automatic instrumentation 进行实现。在 Java 程序中,automatic instrumentation 的表现形式为挂载 Java agent。在过去的一年里,我们将 推入了 OpenTelemetry 官方社区。现在,只需要在 Java 程序运行时挂载上 OpenTelemetry agent,即可实现对应用程序透明的分布式全链路追踪。 除此之外,Automatic Instrumentation 和 Manual Instrumentation 并不冲突,Automatic Instrumentation 中所使用的关键对象会被注册成全局对象,在 Manual Instrumentation 的使用方式中也可以非常方便的获取。实现两个 Instrumentation 共用一套配置,非常灵活和方便。 首先准备好 RocketMQ 5.0 Java 客户端,可以参考 进行消息的收发。关于 RocketMQ 5.0 的更多细节,欢迎大家参考和关注 和 。 然后准备好 OpenTelemetry agent jar,可以从 OpenTelemetry 官方,在应用程序启动时增加 javaagent:yourpath/opentelemetryjavaagent.jar 即可。可以通过设置 OTEL_EXPORTER_OTLP_ENDPOINT 环境变量来设置 OpenTelemetry collector 的接入点。 默认情况下,按照 OpenTelemetry 中关于 messaging 的规范,只有 send 和 process 的 span 会被启用,receive 的 span 是默认不启用的,如果想要启用 receive span,需要手动设置 Dotel.instrumentation.messaging.experimental.receivetelemetry.enabled=true。 场景最佳实践 目前,主流的云服务供应商都为 OpenTelemetry 提供了良好的支持,阿里云上的 SLS 和 ARMS 两款可观测产品都提供了基于 OpenTelemetry 的分布式全链路追踪服务。 为了更好地展示分布式全链路追踪的过程,这里提供了一个代码示例: 。在这个代码示例中,会启动三个不同的进程,涉及三种不同类库和业务逻辑之间的相互调用,展示了一个在分布式环境较复杂中间件之间进行交互的典型案例。 请求首先会从 gRPC 客户端发往 gRPC 服务端,在 gRPC 服务端收到请求之后,会向 RocketMQ 5.0 的 Producer 往服务端发送一条消息,然后再回复对应的 response 给客户端。在 RocketMQ 5.0 的 PushConsumer 接受到消息之后,会在 MessageListener 中使用 Apache HttpClient 往淘宝网发送一条 GET 请求。 示例代码调用链路 特别地,gRPC 客户端在发起具体的调用是在一个上游业务 span 的生命周期之内进行的,这个 span 我们称之为 ExampleUpstreamSpan,RocketMQ 5.0 PushConsumer 在收到消息之后,也会在 MessageListener 里执行其他的业务操作,也会有对应的 span,我们称之为 ExampleDownstreamSpan。那么默认在 receive span 没有启用的情况下,按照开始时间的顺序,会先后存在 7 个 span。分别是: ExampleUpstreamSpan。 gRPC 客户端请求 span。 gRPC 服务端响应 span。 RocketMQ 5.0 Producer 的 send span。 RocketMQ 5.0 Producer 的 process span。 HTTP 请求 span。 ExampleDownstreamSpan。 RocketMQ 5.0 对接 SLS Trace 服务 首先在阿里云日志服务中创建 Trace 服务。然后获取接入点,项目和实例名称等信息,具体可以参考。 在补充好信息之后完成接入之后,稍等一会就可以看到对应的 Trace 信息已经被上传到 SLS trace 服务中: SLS Trace 服务分布式全链路展示 Trace 服务其实是将相关数据存储到日志中,因此这些数据也可以通过 SLS 的 SQL 语法查询得到。 通过 Trace 数据,我们可以很方便知道用户的操作系统环境,Java 版本等一系列基础信息。消息的发送延时,失败与否,消息是否准时投递到了客户端,以及客户端本地消费耗时,消费失败与否等一系列有效信息,可以帮助我们十分有效地进行问题排查。 除此之外,SLS Trace 服务的 demo 页也提供了基于 RocketMQ 5.0 定制的消息中间件大盘,生动展示了利用 Trace 数据得到的发送成功率,端到端延时等一系列指标。 :展示利用 Trace 数据得到的包括发送延时、发送成功率、消费成功率、端到端延时在内的一系列指标。 :可以根据上一步得到的差错长 message id 进行进一步的细粒度查询。 消息中间件分析 RocketMQ 5.0 对接应用实时监控服务(ARMS) 首先进入应用实时监控服务 ARMS 控制台,点击接入中心中的 OpenTelemetry,选择 java 应用程序下的自动探测,获取启动参数并修改至自己的 java 应用程序,具体可以参考。 配置好参数之后,启动自己的相关应用程序,稍等一会儿,就可以在 ARMS Trace Explorer 里看到对应的数据了。 Trace Explorer 还可以查看 span 之间的时序关系。 ARMS Trace Explorer 分布式全链路追踪展示 具体地,可以点进每个 span 查看详细的 attributes/resources/events 等信息。除此之外,ARMS 还支持通过使用 OpenTelemetry Collector 转发的形式来收集应用程序的 Trace 数据。 趋势与思考 随着现代应用程序架构的不断演进,可观测性的重要性日益凸显。它不仅可以帮助我们快速发现和解决系统中的问题,还提高应用程序的可靠性和性能,同时也是实现 DevOps 的关键部分。在相关领域,也陆续诞生了像 DataDog 和 Dynatrace 这样的明星公司。 近年来涌现了一些新兴技术,如 eBPF(Extended Berkeley Packet Filter)和 Service Mesh 也为可观测领域提供了一些新的思路: eBPF 可以在内核层面运行,通过动态注入代码来监控系统的行为。它被广泛应用于实时网络和系统性能监控、安全审计和调试等任务,并且性能影响很小,未来也可以作为 continuous profiling 的一种选择。Service Mesh 则通过在应用程序之间注入代理层实现流量管理、安全和可观测性等功能。代理层可以收集和报告有关流量的各种指标和元数据,从而帮助我们了解系统中各个组件的行为和性能。 Service Mesh 中反映出的技术趋势很大一部分已经在 RocketMQ 5.0 proxy 中得到了应用,我们也在更多地将可观测指标往 proxy 进行收敛。当前的 Trace 链路未来也在考虑和服务端一起进行关联,并打造用户侧,运维侧,跨多应用的全方位链路追踪体系。除此之外还可以将 Trace 数据与 Metrics 数据通过 Exemplars 等技术进行联动。实现面到线,线到点的终极排查效果。 在可观测领域,RocketMQ 也在不断探索和摸索更加领先的可观测手段,以帮助开发者和客户更快更省心地发现系统中的隐患。 特别感谢阿里云 SLS 团队的千乘同学和 ARMS 团队的垆皓同学在接入过程提供的帮助和支持! 相关链接 RocketMQ 5.0 客户端: OpenTelemetry Instrumentation for RocketMQ 5.0: RocketMQ OpenTelemetry 示例: 活动推荐 阿里云基于 Apache RocketMQ 构建的企业级产品消息队列 RocketMQ 5.0 版现开启活动: 1、新用户首次购买包年包月,即可享受全系列 85 折优惠! 了解活动详情:
作者:艾阳坤
#行业实践 #可观测

2023年1月6日

RocketMQ 监控告警:生产环境如何快速通过监控预警发现堆积、收发失败等问题?
本文主要向大家介绍如何利用 RocketMQ 可观测体系中的指标监控,对生产环境中典型场景:消息堆积、消息收发失败等场景配置合理的监控预警,快速发现问题,定位问题。 RocketMQ 可观测体系 作为一款典型的分布式中间件产品,RocketMQ 被广泛应用于业务核心链路中,每条消息都关联着核心业务数据的变化。业务链路有其明显的复杂性: 生产者、消费者多对多:业务调用链路网状结构,上下游梳理困难 上下游解耦、异步链路:异步化调用,信息收集不完整 消息是状态数据:未消费成功、定时中等状态增加排查的复杂度 消息链路耦合复杂的业务处理逻辑:无法快速定位问题边界 鉴于消息链路耦合业务系统,复杂带状态,RocketMQ 通过强大的可观测系统和经验支撑,及时发现问题、定位问题、解决问题有助于提升运维效率,对于业务运行是一项重要的保障能力。 RocketMQ 的可观测体系主要由指标(Metrics)、轨迹(Tracing)和日志(Logging)组成。 指标 RocketMQ中定义了详细的Metrics指标,这些指标覆盖生产者、消费者、服务端及消息收发关键接口和流程的统计数据,并支持从实例、Topic和Group等多个维度进行聚合展示,帮助您实时监控消息业务或RocketMQ服务的运行状态。和4.x版本相比,RocketMQ服务端5.x版本增加了消息堆积场景相关指标、关键接口的耗时指标、错误分布指标、存储读写流量等指标,帮助您更好地监控异常场景。 消息轨迹 在分布式应用中,RocketMQ作为全链路中异步解耦的关键服务,提供的Tracing数据可有效将业务上下游信息串联起来,帮助您更好地排查异常,定位问题。和4.x版本相比,RocketMQ服务端5.x版本支持OpenTelemetry开源标准,提供更加丰富的轨迹指标,针对消费场景、高级消息类型场景等细化轨迹内容,为问题定位提供更多关键信息。 日志 RocketMQ为不同的异常情况定义唯一的错误码及错误信息,并划分不同的错误级别,您可以根据客户端返回的错误码信息快速获取异常原因。和4.x版本相比,RocketMQ服务端5.x版本统一了ErrorCode和ErrorMessage,异常日志中增加了RequestID、资源信息,细化了错误信息,保证日志内容明确靠。 RocketMQ 监控告警介绍 RocketMQ 联合阿里云云监控提供了开箱即用且免费的监控报警服务,可帮助您解决如下问题: 实例规格水位监控预警 若您实际使用的指标值超过实例的规格限制,RocketMQ会进行强制限流。提前配置实例规格水位告警可以提前发现规格超限风险并及时升配,避免因限流导致的业务故障。 业务逻辑错误监控预警 您在消息收发时可能会收到异常报错,配置调用错误告警可以提前在业务反馈前发现异常,帮助您提前判断异常来源并及时修复。 业务性能指标监控预警 如果您的消息链路有相关性能指标要求,例如RT耗时、消息延迟等,提前配置业务指标告警可以帮助您提前治理业务风险。 RocketMQ 版提供了丰富的 Metric 指标和告警监控项。各监控项可分为运行水位、收发性能、异常错误事件三类告警。根据大量生产环境实践经验,建议您根据以下原则配置如下告警 接下来重点通过消息堆积和消息收发失败这两个典型场景来阐述基于可观测体系中的指标(Metrics),RocketMQ 如何通过云监控创建监控规则,将关键的 Metrics 指标作为告警项,帮助您自动监控服务的运行状态,并自动发送报警通知, 便于您及时预警服务的异常信息,提高运维效率。 应用场景1:消息堆积问题 消息堆积指标及监控配置 业界通用指标:使用消息堆积量(ready + inflight)来度量消费健康度,表示未处理完成的消息量;部分产品额外增加已就绪消息量来度量消息拉取的及时性;使用上述 2 个指标直接来配置报警有以下缺点: 有误报或无法触发报警的问题 及时性的间接指标,不直观 RocketMQ 指标:额外支持延时时间来度量消费健康度,涵盖了所有业务场景,根据业务容忍延迟度直接配置时间告警阈值。 消息处理延迟时间:表示业务处理完成及时度 已就绪消息排队时间:表示拉取消息及时度 建议对消息堆积敏感的用户,都在 RocketMQ 实例页的监控报警,添加如下报警指标,并设置符合业务需求的阈值。 如何定位和处理堆积问题 假如收到堆积报警,确认消息出现堆积情况,可参考以下措施进行定位和处理。 1. 判断消息堆积在 RocketMQ 服务端还是客户端 查看客户端本地日志文件 ons.log,搜索是否出现如下信息:the cached message count exceeds the threshold 出现相关日志信息,说明客户端本地缓冲队列已满,消息堆积在客户端,请执行步骤2。 若未出现相关日志,说明消息堆积不在客户端,若出现这种特殊情况,请直接提交工单联系阿里云技术支持。 2. 确认消息的消费耗时是否合理 若查看到消费耗时较长,则需要查看客户端堆栈信息排查具体业务逻辑,请执行步骤3。 若查看到消费耗时正常,则有可能是因为消费并发度不够导致消息堆积,需要逐步调大消费线程或扩容节点来解决。 消息的消费耗时可以通过以下方式查看: 查看消费者状态,在客户端连接信息中查看业务处理时间,获取消费耗时的平均值。 3. 查看客户端堆栈信息。只需要关注线程名为 ConsumeMessageThread 的线程,这些都是业务消费消息的逻辑。 客户端堆栈信息可以通过以下方式获取:查看消费者状态,在客户端连接信息中查看 Java 客户端堆栈信息 使用 Jstack 工具打印堆栈信息。 常见的异常堆栈信息如下: 消费逻辑有抢锁休眠等待等情况。消费线程阻塞在内部的一个睡眠等待上,导致消费缓慢。 示例一: 消费逻辑操作数据库等外部存储卡住。消费线程阻塞在外部的 HTTP 调用上,导致消费缓慢。 示例二: 4. 针对某些特殊业务场景,如果消息堆积已经影响到业务运行,且堆积的消息本身可以跳过不消费,您可以通过重置消费位点跳过这些堆积的消息从最新位点开始消费,快速恢复业务。 如何避免消息堆积 为了避免在业务使用时出现非预期的消息堆积和延迟问题,需要在前期设计阶段对整个业务逻辑进行完善的排查和梳理。整理出正常业务运行场景下的性能基线,才能在故障场景下迅速定位到阻塞点。其中最重要的就是梳理消息的消费耗时和消息消费的并发度。 梳理消息的消费耗时通过压测获取消息的消费耗时,并对耗时较高的操作的代码逻辑进行分析。梳理消息的消费耗时需要关注以下信息: 消息消费逻辑的计算复杂度是否过高,代码是否存在无限循环和递归等缺陷。 消息消费逻辑中的 I/O 操作(如:外部调用、读写存储等)是否是必须的,能否用本地缓存等方案规避。外部 I/O 操作通常包括如下业务逻辑: 读写外部数据库,例如 MySQL 数据库读写。 读写外部缓存等系统,例如 Redis 读写。 下游系统调用,例如 Dubbo 调用或者下游 HTTP 接口调用。 消费逻辑中的复杂耗时的操作是否可以做异步化处理,如果可以是否会造成逻辑错乱(消费完成但异步操作未完成)。 设置消息的消费并发度 逐步调大线程的单个节点的线程数,并观测节点的系统指标,得到单个节点最优的消费线程数和消息吞吐量。 得到单个节点的最优线程数和消息吞吐量后,根据上下游链路的流量峰值计算出需要设置的节点数,节点数=流量峰值/单线程消息吞吐量。 应用场景2:消息收发失败问题 消息收发的核心流程 从上图中可以看出消息收发都要先从 NameServer 返回路由,再通过 broker 的鉴权以及实例规格是否超限的判断,才能进行正常收发消息。根据经验检消息收发失败的原因有如下情况: API 请求频率是否超过实例规格限制 查网络是否正常 服务端是否是有重启造成的短期收发失败 操作资源是否有权限 常见的消息收发失败异常 在无论开发阶段还是生产运行阶段,遇到收发失败问题,我们都可以从客户端日志出发进行排查。以下列举下常见的消息收发失败异常场景: 1. 在客户端日志中出现ClusterName consumer groupId consumer topic messages flow control, flow limit threshold is , remainMs 异常信息 原因:RocketMQ 每个实例都明确了消息收发 API 调用 TPS,例如,标准版实例支持每秒 5000 次 API 调用,若实例消息收发 API 调用频率超过规格限制,会导致实例被限流。实例被限流后,导致部分消息收发请求失败。 建议措施: 1. 配置实例 API 调用频率监控告警 建议设置为规格上限的 70%。例如,您购买的实例消息收发 TPS 上限为 10000,则告警阈值建议设置为 7000。 1. 配置限流次数告警 RocketMQ 支持将指定实例触发限流的事件作为监控项,通过对限流次数的监控,可以帮助您了解当前业务的受损情况。 2. 在客户端日志中出现RemotingConnectException: connect to failed 或者 RemotingTimeoutException 等异常信息。 可能有如下原因: MQ 服务升级过程中 , 会出现短暂的网络闪断,查看官网公告看是否在服务升级窗口 检查应用服务器到broker的网络是否通畅,是否有网络延迟 检查应用的网络带宽情况,是否被打满 确认下应用是否出现 FGC 现象,FGC 会造成一定的网络延迟 3. 在客户端日志当中出现 system busy, start flow control for a while 或者 broker busy, start flow control for a while等异常信息。 可能原因:共享集群 broker(出现网络,磁盘,IO 等抖动)压力大,造成消息收发出现排队现象;若是偶尔短暂抖动,此类错误 SDK 会自动重试,但建议在自己的业务代码做好异常处理,当自动重试次数超限仍失败情况下,业务根据需要做好容灾。若长时间持续出现,可以提工单让技术人员跟进排查。 活动推荐 阿里云基于 Apache RocketMQ 构建的企业级产品消息队列RocketMQ 5.0版现开启活动: 1、新用户首次购买包年包月,即可享受全系列 85折优惠! 了解活动详情:
作者:合伯
#技术探索 #可观测

2022年11月30日

RocketMQ 5.0 可观测能力升级:Metrics 指标分析
从消息的生命周期看可观测能力 在进入主题之前先来看一下 RocketMQ 生产者、消费者和服务端交互的流程: message produce and consume process RocketMQ 的消息是按照队列的方式分区有序储存的,这种队列模型使得生产者、消费者和读写队列都是多对多的映射关系,彼此之间可以无限水平扩展。对比传统的消息队列如 RabbitMQ 是很大的优势,尤其是在流式处理场景下能够保证同一队列的消息被相同的消费者处理,对于批量处理、聚合处理更友好。 接下来我们来看一下消息的整个生命周期中需要关注的重要节点: message life cycle 首先是消息发送:发送耗时是指一条消息从生产者开始发送到服务端接收到并储存在硬盘上的时间。如果是定时消息,需要到达指定的定时时间才能被消费者可见。 服务端收到消息后需要根据消息类型进行处理,对于定时/事务消息只有到了定时时间/事务提交才对消费者可见。RocketMQ 提供了消息堆积的特性,即消息发送到服务端后并不一定立即被拉取,可以按照客户端的消费能力进行投递。 从消费者的角度上看,有三个需要关注的阶段: 拉取消息:消息从开始拉取到抵达客户端的网络和服务端处理耗时; 消息排队:等待处理资源,即从消息抵达客户端到开始处理消息; 消息消费:从开始处理消息到最后提交位点/返回 ACK。 消息在生命周期的任何一个阶段,都可以清晰地被定义并且被观测到,这就是 RocketMQ 可观测的核心理念。而本文要介绍的 Metrics 就践行了这种理念,提供覆盖消息生命周期各个阶段的监控埋点。借助 Metrics 提供的原子能力我们可以搭建适合业务需要的监控系统: 日常巡检与监控预警; 宏观趋势/集群容量分析; 故障问题诊断。 RocketMQ 4.x Metrics 实现 – Exporter RocketMQ 团队贡献的 RocketMQ exporter 已被 Prometheus 官方的开源 Exporter 生态所收录,提供了 Broker、Producer、Consumer 各个阶段丰富的监控指标。 exporter metrics spec Exporter 原理解析 RocketMQ expoter 获取监控指标的流程如下图所示,Expoter 通过 MQAdminExt 向 RocketMQ 集群请求数据。获取的数据转换成 Prometheus 需要的格式,然后通过 /metics 接口暴露出来。 rocketmq exporter 随着 RocketMQ 的演进,exporter 模式逐渐暴露出一些缺陷: 无法支持 RocketMQ 5.x 中新加入的 Proxy 等模块的可观测需求; 指标定义不符合开源规范,难以和其他开源可观测组件搭配使用; 大量 RPC 调用给 Broker 带来额外的压力; 拓展性差,增加/修改指标需要先修改 Broker 的 admin 接口。 为解决以上问题,RocketMQ 社区决定拥抱社区标准,在 RocketMQ 5.x 中推出了基于 OpenTelemtry 的 Metrics 方案。 RocketMQ 5.x 原生 Metrics 实现 基于 OpenTelemtry 的 Metrics OpenTelemetry 是 CNCF 的一个可观测性项目,旨在提供可观测性领域的标准化方案,解决观测数据的数据模型、采集、处理、导出等的标准化问题,提供与三方 vendor 无关的服务。 在讨论新的 Metrics 方案时 RocketMQ 社区决定遵守 OpenTelemetry 规范,完全重新设计新 metrics 的指标定义:数据类型选用兼容 Promethues 的 Counter、Guage、Histogram,并且遵循 Promethues 推荐的指标命名规范,不兼容旧有的 rocketmqexporter 指标。新指标覆盖 broker、proxy、producer、consumer 等各个 module,对消息生命周期的全阶段提供监控能力。 指标上报方式 我们提供了三种指标上报的方式: Pull 模式:适合自运维 K8s 和 Promethues 集群的用户; Push 模式:适合希望对 metrics 数据做后处理或接入云厂商的可观测服务的用户; Exporter 兼容模式:适合已经在使用 Exporter 和有跨数据中心(或其他网络隔离环境)传输 metrics 数据需求的用户。 Pull Pull 模式旨在与 Prometheus 兼容。在 K8s 部署环境中无需部署额外的组件,prometheus 可以通过社区提供的 K8s 服务发现机制(创建 PodMonitor、ServiceMonitor CDR)自动获取要拉取的 broker/proxy 列表,并从他们提供的 endpoint 中拉取 metrics 数据。 pull mode Push OpenTelemetry 推荐使用 Push 模式,这意味着它需要部署一个 collector 来传输指标数据。 push mode OpenTelemetry 官方提供了 collector 的实现,支持对指标做自定义操作如过滤、富化,可以利用社区提供的插件实现自己的 collector。并且云厂商提供的可观测服务(如 AWS CloudWatch、阿里云 SLS)大多已经拥抱了 OpenTelemetry 社区,可以直接将数据推送到它们提供的 collector 中,无需额外的组件进行桥接。 OpenTelemetry collector 兼容 RocketMQ Exporter 新的 Metrics 也提供对 RocketMQ Exporter 的兼容,现在使用 exporter 的用户无需变更部署架构即可接入新 Metrics。而且控制面应用(如 Promethues)和数据面应用(如 RocketMQ)有可能隔离部署。因此借助 Exporter 作为代理来获取新的 Metrics 数据也不失为一种好的选择。 RocketMQ 社区在 Exporter 中嵌入了一个 OpenTelemetry collector 实现,Broker 将 Metrics 数据导出到 Exporter,Exporter 提供了一个新的 endpoint(下图中的 metricsv2)供 Prometheus 拉取。 exporter mode 构建监控体系最佳实践 丰富的指标覆盖与对社区标准的遵循使得可以轻而易举的借助 RocketMQ 的 Metrics 能力构建出适合业务需求的监控体系,这个章节主要以一个典型的流程介绍构建监控体系的最佳实践: 集群监控/巡检 触发告警 排查分析。 集群状态监控与巡检 我们将指标采集到 Promethues 后就可以基于这些指标配置监控,这里给出一些示例: 接口监控: 监控接口调用情况,可以据此快速抓出异常的请求对症下药 下图给出一些相关示例:所有 RPC 的耗时(avg、pt90、pt99 等)、成功率、失败原因、接口调用与返回值分布情况等。 rpc metrics 客户端监控: 监控客户端的使用情况,发现非预期的客户端使用如超大消息发送、客户端上下线、客户端版本治理等。 下图给出一些相关示例:客户端连接数、客户端语言/版本分布、发送的消息大小/类型分布。 client metrics Broker 监控: 监控 Broker 的水位和服务质量,及时发现集群容量瓶颈。 下图给出一些相关示例:Dispatch 延迟、消息保留时间、线程池排队、消息堆积情况。 broker metrics 以上的示例只是 Metrics 的冰山一角,需要根据业务需要灵活组合不同的指标配置监控与巡检。 告警配置 有了完善的监控就可以对需要关注的指标配置告警,比如可以配置 Broker 监控中 Dispatch 延迟这个指标的告警: broker alert 收到告警后可以联动监控查看具体原因,关联发送接口的失败率可以发现有 1.7% 的消费发送失败,对应的报错是没有创建订阅组: promblem analysis 问题排查分析 最后以消息堆积这个场景为例来看一下如何基于 Metrics 分析线上问题。 从消息生命周期看堆积问题 正如本文开篇所述,排查 RocketMQ 的问题需要结合消息的生命周期综合分析,如果片面的认定是服务端/客户端的故障未免会误入歧途。 对于堆积问题,我们主要关注消息生命周期中的两个阶段: 就绪消息:就绪消息是可供消费但还未被拉取的消息,即在服务端堆积的消息; 处理中消息:处理中的消息是被客户端拉取但是还未被消费的消息。 consume lag 多维度指标分析堆积问题 对于堆积问题,RocketMQ 提供了消费延迟相关指标 rocketmq_consumer_lag_latency 可以基于这个指标配置告警。告警的阈值需要根据当前业务对消费延迟的容忍程度灵活指定。 触发告警后就需要对消息堆积在还是就绪消息和处理中消息进行分析,RocketMQ 提供了 rocketmq_consumer_ready_messages 和 rocketmq_consumer_inflight_messages 这两个指标,结合其他消费相关指标与客户端配置综合分析即可判断出消息堆积的根因: case 1:就绪消息持续上涨,处理中消息达到客户端堆积上限 这是最常见的堆积场景,客户端处理中的消息量 rocketmq_consumer_inflight_messages 达到了客户端配置的阈值,即消费者的消费能力低于消息发送量。如果业务要求尽可能实时的消费消息就需要增加消费者机器数量,如果业务对消息延迟不是很敏感可以等待业务高峰过去后再消化堆积的消息。 case 2:就绪消息几乎为 0,处理中消息持续上涨 这个 case 多出现在使用 RocketMQ 4.x 客户端的场景,此时消费位点是顺序提交的,如果某条消息的消费卡住会导致位点无法提交。看起来的现象是消息在客户端大量堆积,即处理中消息持续上涨。可以结合消费轨迹和 rocketmq_process_time 这个指标抓出消费慢的消息分析上下游链路,找到根因优化消费逻辑。 case 3: 就绪消息持续上涨,处理中消息几乎为 0 此种场景说明客户端没有拉取到消息,一般有如下几种情况: 鉴权问题:检查 ACL 配置,如果使用公有云产品请检查 AK、SK 配置; 消费者 hang 住:尝试打印线程堆栈或 gc 信息判断是否是进程卡死; 服务端响应慢:结合 RPC 相关指标查看拉取消息接口调用量与耗时、硬盘读写延迟。检查是否为服务端问题,如硬盘 IOPS 被打满了等等。 活动推荐 阿里云基于 Apache RocketMQ 构建的企业级产品消息队列RocketMQ 5.0版现开启活动: 1、新用户首次购买包年包月,即可享受全系列 85折优惠! 了解活动详情:
作者:玄珏
#技术探索 #可观测

2022年1月20日

消息队列 RocketMQ 遇上可观测:业务核心链路可视化
引言:本篇文章主要介绍 RocketMQ 的可观测性工具在线上生产环境的最佳实践。RocketMQ的可观测性能力领先业界同类产品,RocketMQ 的 Dashboard 和消息轨迹等功能为业务核心链路保驾护航,有效应对线上大规模生产使用过程中遇到的容量规划、消息收发问题排查以及自定义监控等场景。 消息队列简介 进入主题之前,首先简要介绍下什么是阿里云的消息队列? 阿里云提供了丰富的消息产品家族,消息产品矩阵涵盖了互联网、大数据、物联网等各个业务场景的领域,为云上客户提供了多维度可选的消息解决方案。无论哪一款消息队列产品,核心都是帮助用户解决业务和系统的异步、解耦以及应对流量洪峰时的削峰填谷,同时具备分布式、高吞吐、低延迟、高可扩展等特性。 但是不同的消息产品在面向客户业务的应用中也有不同的侧重。简单来做,消息队列 RocketMQ 是业务领域的首选消息通道;Kafka 是大数据领域不可或缺的消息产品;MQTT 是物联网领域的消息解决方案;RabbitMQ 侧重于传统业务消息领域;云原生的产品集成和事件流通道是通过消息队列 MNS 来完成;最后事件总线 EventBridge 是一个阿里云上的一个事件枢纽,统一构建事件中心。 本篇主要讲的是业务领域的消息首选通道:消息队列 RocketMQ。RocketMQ 诞生于阿里的电商系统,具有高性能、低延迟、削峰填谷等能力,并且提供了丰富的在业务和消息场景上应对瞬时流量洪峰的功能,被集成在用户的核心业务链路上。 作为一个核心业务链路上的消息,就要求 RocketMQ 具备非常高的可观测性能力,用户能通过可观测性能力及时的监控定位异常波动,同时对具体的业务数据问题进行排查。由此,可观测性能力逐步成为消息队列 RocketMQ 的核心能力之一。 那么什么是可观测能力呢?下面简单对可观测能力进行介绍。 可观测能力 提到可观测能力,大家可能最先想到的是可观测的三要素:Metrics(指标)、Tracing(追踪)和 Logging(日志)。 结合消息队列的理解,可观测能力三要素的细化解释如下: Metrics:Dashborad 大盘 1)指标涵盖丰富:包含消息量、堆积量、各个阶段耗时等指标,每个指标从实例、Topic、消费 GroupID 多维度做聚合和展示; 2)消息团队最佳实践模板:为用户提供最佳模板,特别是在复杂的消费消息场景,提供了丰富的指标帮助快速定位问题,并持续迭代更新; 3)Prometheus + Grafana:Prometheus标准数据格式、利用Grafana展示,除了模板,用户也可以自定义展示大盘。 Tracing:消息轨迹 1)OpenTelemetry tracing标准:RocketMQ tracing 标准已经合并到 OpenTelemetry 开源标准,规范和丰富 messaging tracing 场景定义; 2)消息领域定制化展示:按照消息维度重新组织抽象的请求 span 数据,展示一对多的消费,多次消费信息,直观、方便理解; 3)可衔接 tracing链路上下游:消息的 tracing 可继承调用上下文,补充到完整调用链路中,消息链路信息串联了异步链路的上游和下游链路信息。 Logging:客户端日志标准化 1)Error Code标准化:不同的错误有唯一的 error code; 2)Error Message 完整:包含完整的错误信息和排序所需要的资源信息; 3)Error Level 标准化:细化了各种不同错误信息的日志级别,让用户根据 Error、Warn 等级别配置更合适和监控告警。 了解消息队列和可观测能力的基础概念,让我们来看看当消息队列 RocketMQ 遇到可观测,会产生什么样的火花? RocketMQ 的可观测性工具的概念介绍 从上文的介绍中可以看到 RocketMQ 的可观测能力能够帮助用户根据错误信息排查消息在生产和消费过程中哪些环节出了问题,为了帮助大家更好的理解功能的应用,先简要介绍下消息生产消费流程过程中的一些概念。 消息生产和消费流程概念 首先我们先明确以下几个概念: Topic:消息主题,一级消息类型,通过Topic对消息进行分类; 消息(Message):消息队列中信息传递的载体; Broker:消息中转角色,负责存储消息,转发消息; Producer:消息生产者,也称为消息发布者,负责生产并发送消息; Consumer:消息消费者,也称为消息订阅者,负责接收并消费消息。 消息生产和消费的流程简单来说就是生产者将消息发送到 topic 的 MessageQueue 上进行存储,然后消费者去消费这些 MessageQueue 上的消息,如果有多个消费者,那么一个完整的一次消息生产发生的生命周期是什么样子的? 这里我们以定时消息为例,生产者 Producer 发送消息经过一定的耗时到达 MQ Server,MQ 将消息存储在 MessageQueue,这时队列中有一个存储时间,如果是定时消息,还需要经过一定的定时时间之后才能被消费者消费,这个时间就是消息就绪的时间;经过定时的时间后消费者 Consumer 开始消费,消费者从 MessageQueue 中拉取消息,然后经过网络的耗时之后到达消费者客户端,这时候不是低码进行消费的,会有一个等待消费者资源线程的过程,等到消费者的线程资源后才开始进行真正的业务消息处理。 从上面的介绍中可以看出,业务消息有一定的耗时处理,完成之后才会向服务端返回ack的结果,在整个生产和消费的过程中,最复杂的便是消费的过程,因为耗时等原因,会经常有消息堆积的场景,下面来重点看一下在消息堆积场景下各个指标表示的含义。 消息堆积场景 如上图,消息队列中,灰色部分的消息表示是已完成的消息量,就是消费者已处理完成并返回 ack 的消息;橙色部分的消息表示这些消息已经被拉取到消费者客户端,正在被处理中,但是还没有返回处理结果的消息,这个消息其实有一个非常重要的指标,就是消息处理耗时;最后绿色的消息表示这些消息在已经发生的 MQ 队列中已存储完成,并且已经是可被消费者消费的一个状态,称为已就绪的消息。 _已就绪消息量(Ready messages):_ _含义:已就绪消息的消息的条数。_ _作用:消息量的大小反映还未被消费的消息规模,在消费者异常情况下,就绪消息量会变多。_ _消息排队时间(Queue time)_ _含义:最早一条就绪消息的就绪时间和当前时间差。_ _作用:这个时间大小反映了还未被处理消息的时间延迟情况,对于时间敏感的业务来说是非常重要的度量指标。_ RocketMQ 的可观测性工具的功能介绍 结合上文介绍的消息队列 RocketMQ 可观测概念,下面具体对 RocketMQ 的可观测性工具的两个核心功能进行介绍。 可观测功能介绍 Dashboard Dashboard 大盘可以根据各种参数查看指定的指标数据,主要的指标数据包含下面三点: 1)Overview(概览): 查看实例据总的消息收发量、TPS、消息类型分布情况。 查看是的各个指标当前的分布和排序情况:发送消息量最多的 Topic、消费消息量最多的 GroupID、堆积消息量最多的 GroupID、排队时间最长的 GroupID 等。 2)Topic(消息发送): 查看指定 Topic 的发送消息量曲线图。 查看指定 Topic 的发送成功率曲线图。 查看指定 Topic 的发送耗时曲线图。 3)GroupID(消息消费): 查看指定 Group 订阅指定 Topic 的消息量曲线图。 查看指定 Group 订阅指定 Topic 的消费成功率。 查看指定 Group 订阅指定 Topic 的消费耗时等指标。 查看指定 Group 订阅指定 Topic 的消息堆积相关指标。 可观测功能介绍 消息轨迹 在 Tracing 方面提供了消息轨迹功能,主要包含以下三方面能力: 1)便捷的查询能力:可根据消息基本信息查询相关的轨迹;二期还可以根据结果状态、耗时时长来过滤查询,过滤出有效轨迹快速定位问题。 2)详细的 tracing 信息:除了各个生命周期的时间和耗时数据,还包含了生产者、消费者的账号和机器信息。 3)优化展示效果:不同的消息类型轨迹;多个消费 GroupID 的场景;同个消费 GroupID 多次重投的场景等。 最佳实践 场景一:问题排查 1)目标:消息生产消费健康情况 2)原则 一级指标:用来报警的指标,公认的没有异议的指标。 二级指标:一级指标发生变化的时候,通过查看二级指标,能够快速定位问题的原因所在。 三级指标:定位二级指标波动原因。根据各自业务的特点和经验添加。 基于目标和原则,生产者用户和消费者用户问题排查和分析方式如下: 场景二:容量规划 容量规划场景下只要解决下面三个问题: 1)问题一:怎样评估实例容量? 解决方法: 实例详情页》查看指定实例数据统计,可以看到所选时间段内的最大消息收发的 TPS 峰值。 铂金版实例可以根据这个数据来添加报警监控和判断业务。 2)问题二:怎样查看标准版实例的消耗 解决方法: 可以查看概览总消息量模块 3)问题三:有哪些已下线,需要清理资源? 解决方法: 指定一段时间内(例如近一周),按 Topic 的消息发送量由小到大排序,查看是否有消息发送量为 0 的 Topic,这些 Topic 相关的业务或许已下线。 指定一段时间内(例如近一周),按 GroupID 的消息消费量由小到大排序,查看是否有消息消费量为 0 的 GroupID,这些 GroupID 相关的业务或许已下线。 场景三:业务规划 业务规划场景下主要解决以下三个问题: 1)问题一:如何查看业务峰值分布情况? 解决方法: 查看 Topic 消息接收量的每天的高峰时间段。 查看 Topic 消息接收量周末和非周某的消息量差别。 查看 Topic 消息接收量节假日的变化情况。 2)问题二:如何判断目前哪些业务有上升趋势? 解决方法: 查看消息量辅助判断业务量变化趋势。 3)问题三 :怎样优化消费者系统性能? 解决方法: 查看消息处理耗时,判断是否在合理范围内有提升的空间。 本篇文章通过消息队列、可观测能力、RocketMQ 可观测概念及功能和最佳实践的介绍,呈现了 RocketMQ 的可观测性工具在业务核心链路上的可视化能力,希望给大家在日常的线上的一些问题排查和运维过程中带来一些帮助。 活动推荐 阿里云基于 Apache RocketMQ 构建的企业级产品消息队列RocketMQ 5.0版现开启活动: 1、新用户首次购买包年包月,即可享受全系列 85折优惠! 了解活动详情:
作者:文婷、不周
#行业实践 #可观测

2021年4月6日

基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台
导读:本文将对 RocketMQExporter 的设计实现做一个简单的介绍,读者可通过本文了解到 RocketMQExporter 的实现过程,以及通过 RocketMQExporter 来搭建自己的 RocketMQ 监控系统。RocketMQ 在线可交互教程现已登录知行动手实验室,PC 端登录 start.aliyun.com 即可直达。 RocketMQ 云原生系列文章: (本文) RocketMQExporter 项目的 GitHub 地址: 文章主要内容包含以下几个方面: 1. RocketMQ 介绍 2. Prometheus 简介 3. RocketMQExporter 的具体实现 4. RocketMQExporter 的监控指标和告警指标 5. RocketMQExporter 使用示例 RocketMQ 介绍 RocketMQ 是一个分布式消息和流数据平台,具有低延迟、高性能、高可靠性、万亿级容量和灵活的可扩展性。简单的来说,它由 Broker 服务器和客户端两部分组成,其中客户端一个是消息发布者客户端(Producer),它负责向 Broker 服务器发送消息;另外一个是消息的消费者客户端(Consumer),多个消费者可以组成一个消费组,来订阅和拉取消费 Broker 服务器上存储的消息。 正由于它具有高性能、高可靠性和高实时性的特点,与其他协议组件在 MQTT 等各种消息场景中的结合也越来越多,应用越来越广泛。而对于这样一个强大的消息中间件平台,在实际使用的时候还缺少一个监控管理平台。 当前在开源界,使用最广泛监控解决方案的就是 Prometheus。与其它传统监控系统相比较,Prometheus 具有易于管理,监控服务的内部运行状态,强大的数据模型,强大的查询语言 PromQL,高效的数据处理,可扩展,易于集成,可视化,开放性等优点。并且借助于 Prometheus 可以很快速的构建出一个能够监控 RocketMQ 的监控平台。 Prometheus 简介 下图展示了 Prometheus 的基本架构: 1. Prometheus Server Prometheus Server 是 Prometheus 组件中的核心部分,负责实现对监控数据的获取,存储以及查询。Prometheus Server 可以通过静态配置管理监控目标,也可以配合使用 Service Discovery 的方式动态管理监控目标,并从这些监控目标中获取数据。其次 Prometheus Server 需要对采集到的监控数据进行存储,Prometheus Server 本身就是一个时序数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中。最后 Prometheus Server 对外提供了自定义的 PromQL 语言,实现对数据的查询以及分析。 2. Exporters Exporter 将监控数据采集的端点通过 HTTP 服务的形式暴露给 Prometheus Server,Prometheus Server 通过访问该 Exporter 提供的 Endpoint 端点,即可获取到需要采集的监控数据。RocketMQExporter 就是这样一个 Exporter,它首先从 RocketMQ 集群采集数据,然后借助 Prometheus 提供的第三方客户端库将采集的数据规范化成符合 Prometheus 系统要求的数据,Prometheus 定时去从 Exporter 拉取数据即可。 当前 RocketMQ Exporter 已被 Prometheus 官方收录,其地址为:。 RocketMQExporter 的具体实现 当前在 Exporter 当中,实现原理如下图所示: 整个系统基于 spring boot 框架来实现。由于 MQ 内部本身提供了比较全面的数据统计信息,所以对于 Exporter 而言,只需要将 MQ 集群提供的统计信息取出然后进行加工而已。所以 RocketMQExporter 的基本逻辑是内部启动多个定时任务周期性的从 MQ 集群拉取数据,然后将数据规范化后通过端点暴露给 Prometheus 即可。其中主要包含如下主要的三个功能部分: MQAdminExt 模块通过封装 MQ 系统客户端提供的接口来获取 MQ 集群内部的统计信息。 MetricService 负责将 MQ 集群返回的结果数据进行加工,使其符合 Prometheus 要求的格式化数据。 Collect 模块负责存储规范化后的数据,最后当 Prometheus 定时从 Exporter 拉取数据的时候,Exporter 就将 Collector 收集的数据通过 HTTP 的形式在/metrics 端点进行暴露。 RocketMQExporter 的监控指标和告警指标 RocketMQExporter 主要是配合 Prometheus 来做监控,下面来看看当前在 Expoter 中定义了哪些监控指标和告警指标。 监控指标 rocketmq_message_accumulation 是一个聚合指标,需要根据其它上报指标聚合生成。 告警指标 消费者堆积告警指标也是一个聚合指标,它根据消费堆积的聚合指标生成,value 这个阈值对每个消费者是不固定的,当前是根据过去 5 分钟生产者生产的消息数量来定,用户也可以根据实际情况自行设定该阈值。告警指标设置的值只是个阈值只是象征性的值,用户可根据在实际使用 RocketMQ 的情况下自行设定。这里重点介绍一下消费者堆积告警指标,在以往的监控系统中,由于没有像 Prometheus 那样有强大的 PromQL 语言,在处理消费者告警问题时势必需要为每个消费者设置告警,那这样就需要 RocketMQ 系统的维护人员为每个消费者添加,要么在系统后台检测到有新的消费者创建时自动添加。在 Prometheus 中,这可以通过一条如下的语句来实现: (sum(rocketmq_producer_offset) by (topic) on(topic) group_right sum(rocketmq_consumer_offset) by (group,topic)) ignoring(group) group_left sum (avg_over_time(rocketmq_producer_tps[5m])) by (topic)560 0 借助 PromQL 这一条语句不仅可以实现为任意一个消费者创建消费告警堆积告警,而且还可以使消费堆积的阈值取一个跟生产者发送速度相关的阈值。这样大大增加了消费堆积告警的准确性。 RocketMQExporter 使用示例 1. 启动 NameServer 和 Broker 要验证 RocketMQ 的 SpringBoot 客户端,首先要确保 RocketMQ 服务正确的下载并启动。可以参考 RocketMQ 主站的快速开始来进行操作。确保启动 NameServer 和 Broker 已经正确启动。 2. 编译 RocketMQExporter 用户当前使用,需要自行下载 git 源码编译: git clone https://github.com/apache/rocketmqexporter cd rocketmqexporter mvn clean install 3. 配置和运行 RocketMQExporter 有如下的运行选项: 以上的运行选项既可以在下载代码后在配置文件中更改,也可以通过命令行来设置。 编译出来的 jar 包就叫 rocketmqexporter0.0.1SNAPSHOT.jar,可以通过如下的方式来运行。 java jar rocketmqexporter0.0.1SNAPSHOT.jar [rocketmq.config.namesrvAddr="127.0.0.1:9876" ...] 4. 安装 Prometheus 首先到 Prometheus去下载 Prometheus 安装包,当前以 linux 系统安装为例,选择的安装包为 prometheus2.7.0rc.1.linuxamd64.tar.gz,经过如下的操作步骤就可以启动 prometheus 进程。 tar xzf prometheus2.7.0rc.1.linuxamd64.tar.gzcd prometheus2.7.0rc.1.linuxamd64/./prometheus config.file=prometheus.yml web.listenaddress=:5555 Prometheus 默认监听端口号为 9090,为了不与系统上的其它进程监听端口冲突,我们在启动参数里面重新设置了监听端口号为 5555。然后通过浏览器访问 ;服务器 IP 地址:5555,就可以验证 Prometheus 是否已成功安装,显示界面如下: 由于 RocketMQExporter 进程已启动,这个时候可以通过 Prometheus 来抓取 RocketMQExporter 的数据,这个时候只需要更改 Prometheus 启动的配置文件即可。 整体配置文件如下: my global config global: scrape_interval: 15s Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s Evaluate rules every 15 seconds. The default is every 1 minute. scrape_timeout is set to the global default (10s). Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: "first_rules.yml" "second_rules.yml" scrape_configs: job_name: 'prometheus' static_configs: targets: ['localhost:5555'] job_name: 'exporter' static_configs: targets: ['localhost:5557'] 更改配置文件后,重启服务即可。重启后就可以在 Prometheus 界面查询 RocketMQExporter 上报的指标,例如查询 rocketmq_broker_tps 指标,其结果如下: 5. 告警规则添加 在 Prometheus 可以展示 RocketMQExporter 的指标后,就可以在 Prometheus 中配置 RocketMQ 的告警指标了。在 Prometheus 的配置文件中添加如下的告警配置项,.rules 表示可以匹配多个后缀为 rules 的文件。 rule_files: "first_rules.yml" "second_rules.yml" /home/prometheus/prometheus2.7.0rc.1.linuxamd64/rules/.rules 当前设置的告警配置文件为 warn.rules,其文件具体内容如下所示。其中的阈值只起一个示例的作用,具体的阈值还需用户根据实际使用情况来自行设定。 Sample prometheus rules/alerts for rocketmq. Galera Alerts groups: name: GaleraAlerts rules: alert: RocketMQClusterProduceHigh expr: sum(rocketmq_producer_tps) by (cluster) = 10 for: 3m labels: severity: warning annotations: description: '{{$labels.cluster}} Sending tps too high.' summary: cluster send tps too high alert: RocketMQClusterProduceLow expr: sum(rocketmq_producer_tps) by (cluster) = 10 for: 3m labels: severity: warning annotations: description: '{{$labels.cluster}} consuming tps too high.' summary: cluster consume tps too high alert: RocketMQClusterConsumeLow expr: sum(rocketmq_consumer_tps) by (cluster) 0 for: 3m labels: severity: warning annotations: description: 'consumer {{$labels.group}} on {{$labels.topic}} lag behind and is falling behind (behind value {{$value}}).' summary: consumer lag behind alert: GroupGetLatencyByStoretime expr: rocketmq_group_get_latency_by_storetime 1000 for: 3m labels: severity: warning annotations: description: 'consumer {{$labels.group}} on {{$labels.broker}}, {{$labels.topic}} consume time lag behind message store time and (behind value is {{$value}}).' summary: message consumes time lag behind message store time too much 最终,可以在 Prometheus 的看一下告警展示效果,红色表示当前处于告警状态的项,绿色表示正常状态。 6. Grafana dashboard for RocketMQ Prometheus 自身的指标展示平台没有当前流行的展示平台 Grafana 好, 为了更好的展示 RocketMQ 的指标,可以使用 Grafana 来展示 Prometheus 获取的指标。 首先到官网去下载:,这里仍以二进制文件安装为例进行介绍。 wget https://dl.grafana.com/oss/release/grafana6.2.5.linuxamd64.tar.gz tar zxvf grafana6.2.5.linuxamd64.tar.gz cd grafana5.4.3/ 同样为了不与其它进程的使用端口冲突,可以修改 conf 目录下的 defaults.ini 文件的监听端口,当前将 grafana 的监听端口改为 55555,然后使用如下的命令启动即可: ./bin/grafanaserver web 然后通过浏览器访问 ;服务器 IP 地址:55555,就可以验证 grafana 是否已成功安装。系统默认用户名和密码为 admin/admin,第一次登陆系统会要求修改密码,修改密码后登陆,界面显示如下: 点击 Add data source 按钮,会要求选择数据源。 选择数据源为 Prometheus,设置数据源的地址为前面步骤启动的 Prometheus 的地址。 回到主界面会要求创建新的 Dashboard。 点击创建 dashboard,创建 dashboard 可以自己手动创建,也可以以配置文件导入的方式创建,当前已将 RocketMQ 的 dashboard 配置文件上传到 Grafana 的官网,这里以配置文件导入的方式进行创建。 点击 New dashboard 下拉按钮。 选择 import dashboard。 这个时候可以到 Grafana 官网去下载当前已为 RocketMQ 创建好的配置文件,地址为:,如下图所示: 点击 download 就可以下载配置文件,下载配置文件然后,复制配置文件中的内容粘贴到上图的粘贴内容处。 最后按上述方式就将配置文件导入到 Grafana 了。 最终的效果如下所示: 作者简介 陈厚道,曾就职于腾讯、盛大、斗鱼等互联网公司。目前就职于尚德机构,在尚德机构负责基础架构方面的设计和开发工作。对分布式消息队列、微服务架构和落地、DevOps 和监控平台有比较深入的研究。 冯庆,曾就职于华为。目前就职于尚德机构,在尚德机构基础架构团队负责基础组件的开发工作。 在 PC 端登录 知行动手实验室,沉浸式体验在线交互教程。 活动推荐 阿里云基于 Apache RocketMQ 构建的企业级产品消息队列RocketMQ 5.0版现开启活动: 1、新用户首次购买包年包月,即可享受全系列 85折优惠! 了解活动详情:
作者:陈厚道、冯庆
#技术探索 #可观测