👻

Spring Boot Actuatorのmetricsエンドポイントの公開

2023/12/12に公開

今回は Spring Boot Actutor の発展版としてhealth以外のエンドポイントの公開方法を紹介します。

そもそも、Spring Boot Actuatorって何?と言う方はこちらをご確認ください。

health 以外のエンドポイントの公開設定

Spring Boot Actuatorを有効化した時点では以下の通り、healthエンドポイントのみが公開されています。

curl -XGET localhost:8080/actuator | jq .

結果を見やすくするため、jqコマンドを使用しています。こちらはインストールが必要です。
また、Spring Bootをローカル環境で起動して確認しています。

デフォルトのポート番号である8080を利用していますが、設定に応じて変更してください。

{
  "_links": {
    "self": {
      "href": "http://localhost:8080/actuator",
      "templated": false
    },
    "health-path": {
      "href": "http://localhost:8080/actuator/health/{*path}",
      "templated": true
    },
    "health": {
      "href": "http://localhost:8080/actuator/health",
      "templated": false
    }
  }
} 

デフォルト以外のエンドポイントを全て公開にする場合は以下をapplication.propertiesへ追加すれば完了です。

management.endpoints.web.exposure.include=*

ただし、利用しないエンドポイントまで公開する必要はないため、設定で*とすることはほとんどありません。

以下の通り、たくさんのエンドポイントが表示されます。

curl -XGET localhost:8080/actuator | jq .
{
  "_links": {
    "self": {
      "href": "http://localhost:8080/actuator",
      "templated": false
    },
    "beans": {
      "href": "http://localhost:8080/actuator/beans",
      "templated": false
    },
    "caches-cache": {
      "href": "http://localhost:8080/actuator/caches/{cache}",
      "templated": true
    },
    "caches": {
      "href": "http://localhost:8080/actuator/caches",
      "templated": false
    },
    "health-path": {
      "href": "http://localhost:8080/actuator/health/{*path}",
      "templated": true
    },
    "health": {
      "href": "http://localhost:8080/actuator/health",
      "templated": false
    },
    "info": {
      "href": "http://localhost:8080/actuator/info",
      "templated": false
    },
    "conditions": {
      "href": "http://localhost:8080/actuator/conditions",
      "templated": false
    },
    "configprops-prefix": {
      "href": "http://localhost:8080/actuator/configprops/{prefix}",
      "templated": true
    },
    "configprops": {
      "href": "http://localhost:8080/actuator/configprops",
      "templated": false
    },
    "env": {
      "href": "http://localhost:8080/actuator/env",
      "templated": false
    },
    "env-toMatch": {
      "href": "http://localhost:8080/actuator/env/{toMatch}",
      "templated": true
    },
    "loggers": {
      "href": "http://localhost:8080/actuator/loggers",
      "templated": false
    },
    "loggers-name": {
      "href": "http://localhost:8080/actuator/loggers/{name}",
      "templated": true
    },
    "heapdump": {
      "href": "http://localhost:8080/actuator/heapdump",
      "templated": false
    },
    "threaddump": {
      "href": "http://localhost:8080/actuator/threaddump",
      "templated": false
    },
    "metrics-requiredMetricName": {
      "href": "http://localhost:8080/actuator/metrics/{requiredMetricName}",
      "templated": true
    },
    "metrics": {
      "href": "http://localhost:8080/actuator/metrics",
      "templated": false
    },
    "scheduledtasks": {
      "href": "http://localhost:8080/actuator/scheduledtasks",
      "templated": false
    },
    "mappings": {
      "href": "http://localhost:8080/actuator/mappings",
      "templated": false
    }
  }
}

今回はこのうち metricsエンドポイントを有効にして使い方を確認します。

エンドポイントの設定

metricsエンドポイントのみを公開する場合は、application.propetiesファイルへ以下のように指定します。

management.endpoints.web.exposure.include=metrics

有効化すると以下のが返されます。

curl -XGET localhost:8080/actuator | jq .
{
  "_links": {
    "self": {
      "href": "http://localhost:8080/actuator",
      "templated": false
    },
    "metrics": {
      "href": "http://localhost:8080/actuator/metrics",
      "templated": false
    },
    "metrics-requiredMetricName": {
      "href": "http://localhost:8080/actuator/metrics/{requiredMetricName}",
      "templated": true
    }
  }
}

あれ、healthエンドポイント確認できなくなってる。。。と言うことからわかるようにapplication.propertiesファイルの設定が優先されます。
healthを引き続き見る場合は、設定へ加えておきましょう。

curl -XGET localhost:8080/actuator/health | jq .
 {
  "timestamp": "2023-08-04T04:00:57.699+00:00",
  "status": 404,
  "error": "Not Found",
  "path": "/actuator/health"
}

有効化したエンドポイントの詳細の確認方法

次に有効化したエンドポイントでどのような情報が見れるかを確認手順を紹介します。

確認できる情報自体はSpring Bootのドキュメントに記載もされているのですが、エンドポイントを叩く方が確実です。
(中には、ドキュメントに記載されていない情報もあるため)

では、有効化したエンドポイントを叩いてみましょう。
actuator/有効化したエンドポイントを指定すれば、エンドポイントで確認できる情報が表示されます。

curl -XGET localhost:8080/actuator/metrics | jq .
{
  "names": [
    "application.ready.time",
    "application.started.time",
    "disk.free",
    "disk.total",
    "executor.active",
    "executor.completed",
    "executor.pool.core",
    "executor.pool.max",
    "executor.pool.size",
    "executor.queue.remaining",
    "executor.queued",
    "hikaricp.connections",
    "hikaricp.connections.acquire",
    "hikaricp.connections.active",
    "hikaricp.connections.creation",
    "hikaricp.connections.idle",
    "hikaricp.connections.max",
    "hikaricp.connections.min",
    "hikaricp.connections.pending",
    "hikaricp.connections.timeout",
    "hikaricp.connections.usage",
    "http.server.requests",
    "http.server.requests.active",
    "jdbc.connections.max",
    "jdbc.connections.min",
    "jvm.buffer.count",
    "jvm.buffer.memory.used",
    "jvm.buffer.total.capacity",
    "jvm.classes.loaded",
    "jvm.classes.unloaded",
    "jvm.compilation.time",
    "jvm.gc.live.data.size",
    "jvm.gc.max.data.size",
    "jvm.gc.memory.allocated",
    "jvm.gc.memory.promoted",
    "jvm.gc.overhead",
    "jvm.gc.pause",
    "jvm.info",
    "jvm.memory.committed",
    "jvm.memory.max",
    "jvm.memory.usage.after.gc",
    "jvm.memory.used",
    "jvm.threads.daemon",
    "jvm.threads.live",
    "jvm.threads.peak",
    "jvm.threads.states",
    "logback.events",
    "process.cpu.usage",
    "process.files.max",
    "process.files.open",
    "process.start.time",
    "process.uptime",
    "system.cpu.count",
    "system.cpu.usage",
    "system.load.average.1m",
    "tomcat.sessions.active.current",
    "tomcat.sessions.active.max",
    "tomcat.sessions.alive.max",
    "tomcat.sessions.created",
    "tomcat.sessions.expired",
    "tomcat.sessions.rejected"
  ]
}

例えば application.ready.timeを確認したい場合は以下のように指定します。

レスポンスのdescriptionへ具体的に確認できる情報が記載されているので、目的にあったものかはdescriptionで確認すると良いと思います。

curl -XGET localhost:8080/actuator/metrics/application.started.time | jq .
{
  "name": "application.started.time",
  "description": "Time taken (ms) to start the application",
  "baseUnit": "seconds",
  "measurements": [
    {
      "statistic": "VALUE",
      "value": 1.16
    }
  ],
  "availableTags": [
    {
      "tag": "main.application.class",
      "values": [
        "com.xxxxxApplication"
      ]
    }
  ]
}

Spring Boot Actuatorを使うことでデバッグはもちろん開発時にも役にたつ情報を取得できます。
他にも役立つエンドポイントを見つけたら、適宜記事へ追加してみようと思います。

参考

Spring Boot Actuator Web API Documentation
本番対応機能 > 2.エンドポイント

Discussion