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

博客文章在发布后不会更新。这篇文章已经发布一年多了,其内容可能已过时,部分链接可能无效。在依赖任何信息之前,请务必核实。

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

通过将 JMX 指标洞察 模块添加到 OpenTelemetry Java Agent 中,我们无需部署单独的服务即可收集 JMX 指标来监控我们的应用程序。该代理现在可以本地收集和导出由应用程序服务器通过仪器化应用程序中可用的本地 MBeans 公开的指标。所需的 MBeans 和相应的指标可以使用 YAML 配置文件进行描述。各个指标配置允许精确的指标选择和识别。JMX 指标洞察随附了许多预定义配置,其中包含流行应用程序服务器或框架的精选 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 仪器代理

在启动 Kafka Broker 之前,通过在 KAFKA_OPTS 环境变量中提供选项来将 OpenTelemetry Java 仪器代理附加到 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 Topic

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 Collector,执行一些处理,然后在您选择的后端上消费这些指标。在此示例中,为简单起见,我们直接将指标导出到 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 容器现在应该正在运行。您现在可以导航到 https://:9090 并探索 Prometheus 仪表板。在这里,我们在 Prometheus 上查看指标 kafka_request_count_total

A sample Kafka Broker metric shown on Prometheus

请参阅 Prometheus 的安装选项

在 Grafana 仪表板上查看指标

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

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

您现在可以导航到 https://:3000 并探索 Grafana 主页。单击 Add Data Source 并选择 Prometheus。添加 HTTP URL,默认值为 https://:9090。之后,我们可以创建新的仪表板,其中有多种可视化选项可供选择(Graph、Singlestat、Gauge、Table、Text 等)。然后,我们可以创建新的面板并添加我们想要观察的任何指标。这是一个由 6 个面板组成的仪表板示例,我们在每个面板中观察一个指标。我们可以在此仪表板上实时观察 Kafka Broker 的运行状况。

Grafana dashboard showing 6 Kafka Broker metrics

OTel 演示应用程序中的 JMX 指标洞察

您还可以探索官方的 OpenTelemetry Astronomy shop 演示应用程序。连接结账服务与会计和欺诈检测服务的 消息队列服务 基于 Kafka,并利用 JMX 指标洞察模块开箱即用地导出 Kafka Broker 指标。您可以访问 文档

Prometheus dashboard showing kafka_request_count metricList of kafka metrics viewed on metrics explorer

模块的进一步功能

在此示例中,我们仅观察了 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 片段很简单,要尝试更多配置选项,您可以访问 文档 以了解和尝试模块的所有功能。

最后,如果您认为某些指标对于包含在预定义的指标集中很重要,或者总的来说,如果您对改进模块有任何想法,请随时为 存储库 做出贡献。

最后修改于 2025 年 5 月 22 日:[chore] Accessible links 1 (#6049) (801233d0)