可观测性分为指标(Metrics)、日志(Logs)、跟踪(Traces)三个方面。
消息队列有哪些关键指标?
所有的消息队列有通用的核心指标,主要有五类:集群(Cluster)、节点(Node/Broker)、主题(Topic)、分区 / 队列(Partiton/Queue)、消费分组 / 订阅(Group/Subscription)。
集群指标主要是集群资源数量相关的,比如主题数量、分区数量、节点数量等集群维度的信息,这类信息的影响在于数量。
节点指标一般包含节点的生产消费的吞吐量、耗时、消息数,接口的请求数、错误码、耗时,JVM FullGC、YongGC 的次数,节点的 TCP 连接数等等。
主题指标一般是主题维度的吞吐量、消息条数、生产和消费耗时数据。当业务反馈只有某些主题异常时,这些指标可以用来定位问题。分区维度的指标是一样的,只是可以细化到定位分区和队列维度的异常。
消费分组 / 订阅的指标一般是消费速度、未消费的消息数量(堆积数)。
业界有多种指标的记录方式,比较常见的有以下五种:
- Java Metrics
- Prometheus Metrics
- Kafka 基于 Metrics 实现的自定义 KafkaMetrics
- Golang 的指标库 go-metrics(一般各个语言也会有对应的 Metrics 库)
- 可观测性标准 OpenTelemetry 中的 Metrics
如何暴露指标?
当前业界主要的指标暴露方案,大致可以分为四种:
- 自定义 TCP/HTTP 接口:这种方式需要先设计私有协议,然后 Client SDK 封装接口来拉取数据。缺点是私有协议访问,不方便被集成,并且添加定义指标需要修改访问协议,工作量很大。
- JMX Service Server:JMX(Java Management Extensions)是 Java 提供的一套标准的代理和服务,通过基于 TCP 层的 JMX 协议远程获取数据。早期在 Java 里面用得比较多,近几年用的人相对较少。主要缺点是只能在 Java 里面用,而且只能通过 JMX 私有协议访问。
- Prometheus 标准接口:Prometheus 是在服务内部启动一个 HTTP 服务,然后暴露 /Metrics 接口,供客户端拉取数据。
- OpenTelemetry 上报:OpenTelemetry 它定义了一个接收器 Collector,即指标上报方根据 OpenTelemetry 的规范将数据上报到 Collector 中。
怎样打印日志?
OpenTelemetry Logs 推荐的标准规范内容:
可以多用 Trace、Debug 级别的日志,比如接收请求的时间和内容、请求返回的时间和内容可以定义为 Trace。
此文章为11月Day21学习笔记,内容来源于极客时间《深入拆解消息队列 47 讲》