使用 OpenTelemetry Java Agent 获取 JMX 指标洞察

JMX(Java Management Extensions)是一种用于管理和监视基于 Java 的应用程序的技术。通过 JMX 指标可以获取有关应用程序性能和资源使用情况的详细信息。这些数据可以帮助您识别应用程序的趋势或潜在问题,并在它们变成严重问题之前采取行动来解决问题。如果有任何问题,我们可以通过收集的指标诊断问题,并对系统进行精细调整以获得最佳性能。

通过将 JMX 指标洞察 模块添加到 OpenTelemetry Java agent 中,我们不再需要部署单独的服务来收集用于监视我们的应用程序的 JMX 指标。代理现在可以直接收集和导出应用程序服务器通过本地 MBeans 公开的指标。您可以使用 YAML 配置文件来描述所需的 MBeans 和相应的指标。各个指标配置允许精确选择和识别指标。JMX 指标洞察预先提供了一些预定义的配置,其中包含了流行应用服务器或框架的精选集:

您还可以通过一个或多个 YAML 文件提供自己的指标定义。有关 YAML 文件语法的文档可在此处找到。

监控 Kafka Broker 指标

让我们使用 JMX 指标洞察模块将预定义集合的指标导出并导出到 Prometheus,以观察我们的 Kafka Broker 的运行状况。

在 macOS 上,可以按照以下步骤使用 Homebrew 安装 Kafka:

brew install kafka

启动 Zookeeper:

zookeeper-server-start /usr/local/etc/kafka/zookeeper.properties

添加 OpenTelemetry Java instrumentation 代理

在启动 Kafka Broker 之前,通过在 KAFKA_OPTS 环境变量中提供选项,将 OpenTelemetry Java instrumentation 代理附加到 Kafka Broker 上。您可以从此处下载代理的最新版本。

export KAFKA_OPTS="-Dapplication.name=my-kafka-app
-Dotel.metrics.exporter=prometheus
-Dotel.exporter.prometheus.port=9464
-Dotel.service.name=my-kafka-broker
-Dotel.jmx.target.system=kafka-broker
-javaagent:/path/to/opentelemetry-javaagent.jar"

现在我们可以启动 Kafka Broker:

kafka-server-start /usr/local/etc/kafka/server.properties

Kafka Broker 现在应该已经启动。为了测试安装情况,我们可以创建一个主题并使用 Kafka 控制台生产者和消费者。创建 Kafka 主题:

kafka-topics --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic my-test-topic

启动 Kafka 控制台生产者将消息发送到我们创建的主题:

$ kafka-console-producer --broker-list localhost:9092 --topic test
>First message
>Second message

现在我们将启动 Kafka 控制台消费者,该消费者将从开头消费主题中的消息:

$ kafka-console-consumer --bootstrap-server localhost:9092 --topic test --from-beginning
First message
Second message

如果我们能够看到消费者接收的两条消息,则验证了我们的 Kafka 安装正常工作。

将指标导出到 Prometheus

指标可以通过任何受支持的指标导出器导出到您选择的后端。导出器的完整列表和其配置选项可以在此处找到。例如,您可以使用 OTLP 导出器将指标导出到 OTel 收集器,执行一些处理,然后在您选择的后端上使用这些指标。在本示例中,为了简单起见,我们直接将指标导出到 Prometheus。

我们将使用 Prometheus 作为数据源,在 Grafana 仪表板上可视化指标。在此演示中,我们将在 Docker 上部署 Prometheus。我们可以创建一个包含以下最小配置的 prometheus.yml 文件:

global:
  scrape_interval: 10s
  evaluation_interval: 10s

scrape_configs:
  - job_name: my-kafka-broker
    scrape_interval: 5s
    static_configs:
      - targets: [host.docker.internal:9464]

然后运行以下命令在 Docker 上部署 Prometheus:

docker run -d \
    -p 9090:9090 \
    -v path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
    prom/prometheus

Prometheus 容器现在应该正在运行。您现在可以导航到 http://localhost:9090 并浏览 Prometheus 仪表板。这里我们正在查看 Prometheus 上的指标 kafka_request_count_total

在 Prometheus 上显示的样本 Kafka Broker 指标

有关 Prometheus 的更多安装选项可以在此处找到。

在 Grafana 仪表板上查看指标

现在,我们将在 Grafana 仪表板上可视化 Prometheus 指标。为此,首先使用以下命令拉取 Grafana Docker 镜像:

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

您现在可以导航到 http://localhost:3000 并浏览 Grafana 主页。单击“添加数据源”,然后选择 Prometheus。添加 HTTP URL,默认为 http://localhost:9090。之后,我们可以创建新的仪表板,有多个可供选择的可视化选项(图形、单个统计、仪表、表格、文本等)。然后,我们可以创建新的面板并添加任何我们想要观察的指标。这是一个由 6 个面板组成的示例仪表板,我们在每个面板中观察一个指标。我们可以实时观察我们的 Kafka Broker 的运行状况。

Grafana 仪表板显示 6 个 Kafka Broker 指标

OTel 演示应用中的 JMX 指标洞察模块

您还可以探索官方的 OpenTelemetry 天文店演示应用消息队列服务 将结账服务与会计和欺诈检测服务连接起来,基于 Kafka 并利用 JMX 指标洞察模块来导出 Kafka Broker 指标。您可以查看 文档

在 Prometheus 上显示 kafka_request_count 指标的仪表板在度量资源浏览器中查看的 kafka 指标列表

模块的其他功能

在此示例中,我们仅观察了预定义集合中的一些 Kafka Broker 指标。并非 Kafka 公开的所有指标都属于该集合,因此,如果您的需求不在此预定义集合中,不必担心!该模块提供了创建自定义指标定义 YAML 文件的选项,因此可以观察作为 MBean 属性公开的任何指标。为了了解 YAML 文件的结构,我们可以查看 kafka-broker.yaml 的一部分:

---
rules:
  - bean: kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec
    mapping:
      Count:
        metric: kafka.message.count
        type: counter
        desc: The number of messages received by the broker
        unit: '{messages}'

每个文件可以包含多个规则。每个规则可以通过对象名称来识别一组一个或多个 MBeans。在此示例中,kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec 识别了一个唯一的 MBean。我们对此 MBean 的属性 Count 感兴趣,该属性在 mapping 下指定。报告的指标将具有名称 kafka.message.count,仪表类型将为 counter,表示该指标是单调和累积的计数。其单位为 {messages}。我们还提供了指标的描述。这个 YAML 的片段很简单,要尝试更多配置选项,您可以查看文档以了解和尝试模块的所有功能。

最后,如果您认为某些指标对于预定义指标集合来说很重要,或者一般来说,如果您对模块的增强有任何想法,欢迎贡献到仓库