在同一个 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 端点读取指标,每个端点代表不同的参与者系统。
我正在尝试使用来自 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 端点读取指标,每个端点代表不同的参与者系统。