将指标从ActiveMQ Artemis发送到Prometheus。

4

我有一个问题卡住了,不确定该如何解决。

在我的工作项目中,我有一个 ActiveMQ 队列,并希望将一些指标发送到 Prometheus,以帮助我在 Grafana 中创建一些警报。我知道对于 ActiveMQ Artemis,我可以使用这个插件,但我不完全理解如何配置它。

我的应用程序部署在 Kubernetes 集群上,ActiveMQ broker 也在那里。因此,我创建了一个实现org.apache.activemq.artemis.core.server.metrics.ActiveMQMetricsPluginActiveMQPrometheusMetricsPlugin类。现在我感到困惑的地方是:我应该部署我的应用程序,然后 Prometheus 收集指标吗?我需要做更多的配置吗?

我们通常不在本地环境中构建应用程序。我们使用的是一个流水线,将应用程序构建并部署到各种环境(dev、test、prod)。我应该像 GitHub 插件项目一样进行配置,然后部署它,之后找到那些 jar 包在 Kubernetes 上移动到正确的位置吗?另外,开发运维告诉我,我们正在使用默认的配置。我不知道是否有一个broker.xml文件。


你的DevOps所说的“默认配置”是什么意思?如果没有broker.xml文件,那么代理是如何配置的? - Justin Bertram
你的应用程序如何与Prometheus从代理获取指标相关?一般来说,这两件事情是100%独立的。 - Justin Bertram
在我的第一个评论中,我有两个问题。我询问了有关配置Artemis Prometheus度量插件的具体内容,您不理解的是什么。我没有看到对这个问题的答案。我还问了为什么您要创建自己的插件,因为您说“已经创建了ActiveMQPrometheusMetricsPlugin类”。我只能假设那是您编写的类,因为在Artemis Prometheus Metrics Plugin中没有这个名称的类。我假设您创建了自己的类,因为您无法确定如何配置Artemis Prometheus Metrics Plugin。 - Justin Bertram
我应该克隆仓库,本地构建后,再按照自述文件中的配置进行操作吗? - AdrianMirica
这回到了我的第一个评论。你能澄清一下你确切地不理解什么吗?你在哪里卡住了(例如构建、部署、配置)?请澄清一下。 - Justin Bertram
显示剩余7条评论
4个回答

6
在开始之前,有几个重要的点需要理解:
  • 使用 Artemis Prometheus Metrics 插件时,代理和应用程序都不会将指标 "发送" 到 Prometheus。Prometheus 必须从代理检索或“抓取”指标。这就是为什么该插件带有一个 servlet。该 servlet 公开了一个 HTTP 端点,Prometheus 可以用来抓取指标。
  • Artemis Prometheus Metrics 插件是代理基础设施的一部分。它不应作为应用程序的一部分部署。插件的 jar 和 war 文件部署在代理上,并分别在 broker.xml 和 bootstrap.xml 中进行配置。
Artemis Prometheus Metrics 插件提供了两个模块与 Prometheus 进行集成:
  • artemis-prometheus-metrics-plugin: 提供 org.apache.activemq.artemis.core.server.metrics.ActiveMQMetricsPlugin 的实际实现,并将其与 Micrometer 和 Prometheus 依赖项打包在一个“超级”jar 中。

  • artemis-prometheus-metrics-plugin-servlet: 提供一个 war 文件,其中包含一个简单的 servlet,可部署到代理的嵌入式 Web 服务器中,然后 Prometheus 可以使用该 servlet 抓取指标。

一旦您克隆了 Artemis Prometheus Metrics 插件存储库,只需运行 mvn install 来构建这两个模块。输出将在它们各自的 target 目录中。
构建模块后,请按照以下步骤部署和配置 Artemis Prometheus Metrics 插件。如果您有一些管理和配置代理的 dev-ops 组,则他们将按照这些步骤进行操作。
  1. Copy artemis-prometheus-metrics-plugin/target/artemis-prometheus-metrics-plugin-<VERSION>.jar to <ARTEMIS_INSTANCE>/lib.

  2. Add this to your <ARTEMIS_INSTANCE>/etc/broker.xml:

    <metrics-plugin class-name="org.apache.activemq.artemis.core.server.metrics.plugins.ArtemisPrometheusMetricsPlugin"/>
    
  3. Create the directory <ARTEMIS_INSTANCE>/web.

  4. Copy artemis-prometheus-metrics-plugin-servlet/target/metrics.war to <ARTEMIS_INSTANCE>/web.

  5. Add this to the web element in <ARTEMIS_INSTANCE>/etc/bootstrap.xml:

    <app url="metrics" war="metrics.war"/>
    

非常感谢您花时间向我解释这些事情。我之前没有任何相关经验。我明天会尝试,希望一切顺利。 - AdrianMirica

0

artemis-prometheus-metrics-plugin 是一个不错的选择,但在具有Colocated复制的集群环境中运行不佳:

2021-11-16 12:15:46,374 WARN  [org.apache.activemq.artemis.core.server] AMQ222261: Failed to activate a backup: java.security.PrivilegedActionException: java.io.NotSerializableException: io.micrometer.prometheus.PrometheusMeterRegistry
    at java.base/java.security.AccessController.doPrivileged(Native Method) [java.base:]
    at org.apache.activemq.artemis.core.config.impl.ConfigurationImpl.copy(ConfigurationImpl.java:2328) [artemis-server-2.19.0.jar:2.19.0]
    at org.apache.activemq.artemis.core.server.cluster.ha.ColocatedHAManager.activateReplicatedBackup(ColocatedHAManager.java:186) [artemis-server-2.19.0.jar:2.19.0]
    at org.apache.activemq.artemis.core.server.cluster.ha.ColocatedHAManager.activateBackup(ColocatedHAManager.java:99) [artemis-server-2.19.0.jar:2.19.0]
    at org.apache.activemq.artemis.core.server.impl.ColocatedActivation$1.handlePacket(ColocatedActivation.java:127) [artemis-server-2.19.0.jar:2.19.0]
    at org.apache.activemq.artemis.core.server.cluster.ClusterController$ClusterControllerChannelHandler.handlePacket(ClusterController.java:469) [artemis-server-2.19.0.jar:2.19.0]
    at org.apache.activemq.artemis.core.protocol.core.impl.ChannelImpl.handlePacket(ChannelImpl.java:820) [artemis-core-client-2.19.0.jar:2.19.0]
    at org.apache.activemq.artemis.core.protocol.core.impl.RemotingConnectionImpl.doBufferReceived(RemotingConnectionImpl.java:428) [artemis-core-client-2.19.0.jar:2.19.0]
    at org.apache.activemq.artemis.core.protocol.core.impl.RemotingConnectionImpl.bufferReceived(RemotingConnectionImpl.java:396) [artemis-core-client-2.19.0.jar:2.19.0]
    at org.apache.activemq.artemis.core.remoting.server.impl.RemotingServiceImpl$DelegatingBufferHandler.bufferReceived(RemotingServiceImpl.java:688) 

0
除了接受的答案之外,我想补充一点,即metrics-plugin标签在此期间已经过时。broker.xml中的有效配置应为:
<metrics>
    <jvm-gc>true</jvm-gc>
    <jvm-memory>true</jvm-memory>  
    <jvm-threads>true</jvm-threads>
    <plugin class-name="com.redhat.amq.broker.core.server.metrics.plugins.ArtemisPrometheusMetricsPlugin"/>
</metrics>

指定的类名与https://github.com/rh-messaging/artemis-prometheus-metrics-plugin中的插件匹配,如果您选择一个发布标签,如v2.0.0,则可以直接下载它,无需自行编译。

请注意,“jvm”标签是可选的,您可以将其删除。


0

我偶然发现了这个帖子,因为我正在尝试为Artemis MQ 2.19.1进行这个确切的设置。下面是我添加的一些指点,希望能对你有所帮助。

  • 在Artemis MQ {instance}/etc/broker.xml文件中,我将其更改为以下内容
<metrics>
    <plugin class-name="org.apache.activemq.artemis.core.server.metrics.plugins.ArtemisPrometheusMetricsPlugin"/>
</metrics>

假设Prometheus和Grafana的设置已经完成,请将以下内容添加到prometheus.yml文件中。
- job_name: "artemismq"
  scrape_interval: 5s
  static_configs:
    - targets: ["localhost:8161"]

这样就可以让您开始运行了。然后您可以根据需要进行修改。

非常感谢Justin的贡献。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接