MicronautのメトリクスとPrometheus

MicronautでPrometheusでメトリクス取りたい話

Micronautはmicrometer経由でprometheusに対応してるので、create-appするとき--featuresにmicrometer-prometheusつけるとそれっぽいdependencyや設定を生成してくれます。

$ mn create-app foo --features micrometer-prometheus

Gradleはこんな感じ。

    compile "io.micronaut.configuration:micronaut-micrometer-core"
    compile "io.micronaut.configuration:micronaut-micrometer-registry-prometheus"

設定はこんな感じ。

micronaut:
    metrics:
        enabled: true
        export:
            prometheus:
                enabled: true
                step: PT1M
                descriptions: true

それで http://localhost:8080/metrics/ にアクセスするとメトリクス名の一覧がとれます。

{
  "names": [
    "executor",
    "executor.active",
    "executor.completed",
    "executor.pool.size",
    "executor.queued",
    "hikaricp.connections",
...
    "process.uptime",
    "system.cpu.count",
    "system.cpu.usage"
  ]
}

さらにその名前を指定すると具体的な値がとれる感じ
http://localhost:8080/metrics/hikaricp.connections

{
  "name": "hikaricp.connections",
  "measurements": [
    {
      "statistic": "VALUE",
      "value": 0
    }
  ],
  "availableTags": [
    {
      "tag": "pool",
      "values": [
        "HikariPool-1"
      ]
    }
  ]
}

ということでDockerでPrometheusをたてます。
こんな感じの設定ファイルを適当にローカルに置いておきます。targetsの位置はホストのIP。

global:
    scrape_interval: 5s
    
scrape_configs:
    - job_name: 'mystat'
      metrics_path: '/prometheus'
      static_configs:
          - targets:
              - '172.17.0.1:8080'

あとはDockerにその位置をおしえてあげればOK

$ docker run -d --name mystat-prom -p 9090:9090 \
   -v /c/Users/naoki/NetBeansProjects/my-stat-mn:/prom-data \
   prom/prometheus --config.file=/prom-data/prometheus.yml

とするとPrometheusは起動するんですが、MicronautからPrometheus用の情報がでてきません。

なんかこんな感じでEndpointを作ってあげる必要があるっぽい。

import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.micronaut.management.endpoint.annotation.Endpoint;
import io.micronaut.management.endpoint.annotation.Read;
import javax.inject.Inject;

@Endpoint(id = "prometheus", value="/prometheus",
   defaultEnabled=true, defaultSensitive=false)
public class PrometheusEndPoint {
    @Inject
    private PrometheusMeterRegistry prometheus;

    @Read
    public String scrape() {
        return prometheus.scrape();
    }
}

Micronaut: How to get metrics in the Prometheus format? - Stack Overflow

そしたらPrometheusでデータがとれるようになりました。

f:id:nowokay:20190217213656p:plain
Prometheus