在同一个 JVM 中的多个 ActorSystems 上启用 Prometheus

Enable Prometheus on multiple ActorSystems in the same JVM

我正在尝试使用来自 Lightbend Telemetry 的 Prometheus 和 Grafana 来监控我的 Akka 系统。我的配置看起来像

cinnamon {
akka.actors = {
default-by-class {
  includes = "/user/*"
  report-by = class
}
  }
  }
cinnamon.prometheus {
      exporters += http-server
    }

使用一个 ActorSystem 一切正常,但是当我实例化另一个 ActorSystem 时,我立即收到 WARN,并且不再有任何工作。

[info] [WARN] [02/23/2022 11:47:30.051] [main] [PrometheusHttpServer] Could not start Prometheus HTTP server. Is there already a server running on this port? (This can happen when running multiple actor systems in the same JVM.)

我想知道如何 运行 Prometheus 在同一个 JVM 上使用多个 ActorSystems。 谁能帮帮我?

问题是 cinnamon 为 prometheus 指标启动一个单独的 http 服务器,并在第二个参与者系统启动时使用相同的端口。该端口是通过 cinnamon.prometheus.http-server.port 配置的,但您不能只在 application.conf 文件中更改它,因为它将在不同的参与者系统之间共享,并且该端口将再次被重用。

你应该只使用单演员系统。没有真正的理由拥有多个。但是,如果这超出了您的控制范围,您可以对您启动的 actor 系统执行以下操作。

您需要更改加载配置的默认行为。一种方法如下。

import akka.actor.ActorSystem
import com.typesafe.config.{Config, ConfigFactory}
import scala.jdk.CollectionConverters._

def overriddenConfig(map: Map[String, String]): Config = {
  ConfigFactory.parseMap(map.asJava).withFallback(ConfigFactory.load())
}

现在您可以通过以下方式启动actor系统

ActorSystem("system1", overriddenConfig(Map("cinnamon.prometheus.http-server.port" -> "9091")))
ActorSystem("system2", overriddenConfig(Map("cinnamon.prometheus.http-server.port" -> "9092")))

另一种选择是为每个演员系统拆分配置文件,每个演员系统将从不同的文件加载。我将省略代码,但可以通过 ConfigFactory 方法完成。

另请注意,此方法需要 Prometheus 从多个 http 端点读取指标,每个端点代表不同的参与者系统。