Akka Stream & Kamon-Prometheus не возвращает метрик, но загружает пустую страницу

Я попытался интегрировать kamon-prometheus с проектом потока akka, но по адресу http://localhost:9095/ он загружает пустую страницу. В консоли я увидел сообщение о том, что информация о метриках доступна по адресу http://localhost:9095/. Когда я попробовал с проектом akka quickstart, он работал нормально.

Поддерживается ли kamon для потоков akka?

2 ответа

Решение

Я пытался запустить Main из Intellij, и именно поэтому я не получил метрики. С предложением @Ivan Stanislavciuc я попытался sbt run и это сработало.

Камон активно использует aspecj для сбора некоторых метрик. Пожалуйста, убедитесь, что java agent aspectj-weaver добавлен к загрузке вашей JVM. Смотрите различные варианты в этой документации.

Вы также должны добавить зависимости build.sbt

libraryDependencies += "io.kamon" %% "kamon-core" % "1.1.0""
libraryDependencies += "io.kamon" %% "kamon-prometheus" % "1.0.0"

Отключить встроенный сервер в kamon-prometheus изменив этот ключ настройки в application.conf файл.

kamon.prometheus.start-embedded-http-server = no

добавлять PrometheusReporter в Kamon

import kamon.Kamon
import kamon.prometheus.PrometheusReporter

private val reporter = new PrometheusReporter()
private val registry = Kamon.addReporter(reporter)

И обслуживать результаты метрик с akka-http путем определения маршрута и получения данных от reporter.scrapeData(),

 val metrics = path("metrics") {
  encodeResponse {
    val prometheusContentType: ContentType.NonBinary = {
      ContentType.parse("text/plain; version=0.0.4; charset=utf-8").right.get.asInstanceOf[ContentType.NonBinary]
    }
    Kamon.gauge("metrics_called").increment()
    complete(
      HttpResponse(
        status = StatusCodes.OK,
        entity = HttpEntity(prometheusContentType, reporter.scrapeData())
      )
    )
  }
}

Или обслуживать метрики для любого входящего HTTP-запроса с кодом

akka.http.scaladsl
  .Http(actorSystem)
  .bindAndHandleSync(
    _ => {
      Kamon.gauge("metrics_called").increment()
      HttpResponse(
        status = StatusCodes.OK,
        entity = HttpEntity(prometheusContentType, reporter.scrapeData())
      )
    },
    "0.0.0.0",
    9015
  )

В случае, если вы получаете пустую страницу, убедитесь, что Kamon собирает некоторые метрики в системе. Вы можете проверить это, добавив Kamon.gauge("metrics_called").increment() в HTTP-маршрут, например.

Другие вопросы по тегам