この API ドキュメントでは、Spring Boot アクチュエーターの Web エンドポイントについて説明しています。
1. 概要
先に進む前に、次のトピックを読む必要があります。
| 以下に記載されている正しい JSON レスポンスを取得するには、Jackson が使用可能である必要があります。 |
1.1. URL
デフォルトでは、すべての Web エンドポイントは、/actuator/{id} という形式の URL を持つパス /actuator で使用可能です。/actuator ベースパスは、次の例に示すように、management.endpoints.web.base-path プロパティを使用して構成できます。
management.endpoints.web.base-path=/manage 上記の application.properties の例は、エンドポイント URL の形式を /actuator/{id} から /manage/{id} に変更します。例: URL info エンドポイントは /manage/info になります。
1.2. タイムスタンプ
クエリパラメーターとして、またはリクエスト本文でエンドポイントによって消費されるすべてのタイムスタンプは、ISO 8601 [Wikipedia] (英語) で指定されたオフセット日時としてフォーマットする必要があります。
2. イベントの監査 (auditevents)
auditevents エンドポイントは、アプリケーションの監査イベントに関する情報を提供します。
2.1. 監査イベントの取得
監査イベントを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/auditevents に作成します。
$ curl 'http://localhost:8080/actuator/auditevents?principal=alice&after=2020-05-14T23%3A39%3A35.095Z&type=logout' -i -X GET 前述の例では、UTC タイムゾーンで 2017 年 11 月 7 日に 09:37 の後に発生したプリンシパル alice の logout イベントを取得します。結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 121
{
"events" : [ {
"timestamp" : "2020-05-14T23:39:35.095Z",
"principal" : "alice",
"type" : "logout"
} ]
}2.1.1. クエリパラメーター
エンドポイントはクエリパラメーターを使用して、返すイベントを制限します。次の表は、サポートされているクエリパラメーターを示しています。
| パラメーター | 説明 |
|---|---|
| 指定された時間後に発生したイベントにイベントを制限します。オプション。 |
| 指定されたプリンシパルを持つイベントにイベントを制限します。オプション。 |
| 指定された型のイベントにイベントを制限します。オプション。 |
2.1.2. レスポンス構造
レスポンスには、クエリに一致したすべての監査イベントの詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| 監査イベントの配列。 |
|
| イベントが発生したときのタイムスタンプ。 |
|
| イベントをトリガーしたプリンシパル。 |
|
| イベントの型。 |
3. Bean (beans)
beans エンドポイントは、アプリケーションの Bean に関する情報を提供します。
3.1. Bean の取得
Bean を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/beans に作成します。
$ curl 'http://localhost:8080/actuator/beans' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 1062
{
"contexts" : {
"application" : {
"beans" : {
"defaultServletHandlerMapping" : {
"aliases" : [ ],
"scope" : "singleton",
"type" : "org.springframework.web.servlet.HandlerMapping",
"resource" : "class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]",
"dependencies" : [ ]
},
"org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration" : {
"aliases" : [ ],
"scope" : "singleton",
"type" : "org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration",
"dependencies" : [ ]
},
"org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration" : {
"aliases" : [ ],
"scope" : "singleton",
"type" : "org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration",
"dependencies" : [ ]
}
}
}
}
}3.1.1. レスポンス構造
レスポンスには、アプリケーションの Bean の詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| ID をキーとするアプリケーションコンテキスト。 |
|
| 親アプリケーションコンテキストの ID(存在する場合)。 |
|
| 名前をキーとするアプリケーションコンテキストの Bean。 |
|
| エイリアスの名前。 |
|
| Bean の範囲。 |
|
| Bean の完全修飾型。 |
|
| Bean が定義されたリソース(ある場合)。 |
|
| 依存関係の名前。 |
4. キャッシュ (caches)
caches エンドポイントは、アプリケーションのキャッシュへのアクセスを提供します。
4.1. すべてのキャッシュを取得する
アプリケーションのキャッシュを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/caches に作成します。
$ curl 'http://localhost:8080/actuator/caches' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 435
{
"cacheManagers" : {
"anotherCacheManager" : {
"caches" : {
"countries" : {
"target" : "java.util.concurrent.ConcurrentHashMap"
}
}
},
"cacheManager" : {
"caches" : {
"cities" : {
"target" : "java.util.concurrent.ConcurrentHashMap"
},
"countries" : {
"target" : "java.util.concurrent.ConcurrentHashMap"
}
}
}
}
}4.1.1. レスポンス構造
レスポンスには、アプリケーションのキャッシュの詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| ID をキーとするキャッシュマネージャー。 |
|
| 名前をキーとするアプリケーションコンテキストのキャッシュ。 |
|
| ネイティブキャッシュの完全修飾名。 |
4.2. 名前によるキャッシュの取得
キャッシュを名前で取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/caches/{name} に作成します。
$ curl 'http://localhost:8080/actuator/caches/cities' -i -X GET 上記の例では、cities という名前のキャッシュに関する情報を取得します。結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 113
{
"target" : "java.util.concurrent.ConcurrentHashMap",
"name" : "cities",
"cacheManager" : "cacheManager"
}4.2.1. クエリパラメーター
リクエストされた名前が単一のキャッシュを識別するのに十分具体的である場合、追加のパラメーターは必要ありません。それ以外の場合は、cacheManager を指定する必要があります。次の表は、サポートされているクエリパラメーターを示しています。
| パラメーター | 説明 |
|---|---|
| キャッシュを修飾する cacheManager の名前。キャッシュ名が一意の場合は省略できます。 |
4.2.2. レスポンス構造
レスポンスには、リクエストされたキャッシュの詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| キャッシュ名。 |
|
| キャッシュマネージャー名。 |
|
| ネイティブキャッシュの完全修飾名。 |
4.3. すべてのキャッシュを削除する
使用可能なすべてのキャッシュをクリアするには、次の curl ベースの例に示すように、DELETE を /actuator/caches にリクエストします。
$ curl 'http://localhost:8080/actuator/caches' -i -X DELETE4.4. 名前によるキャッシュの削除
特定のキャッシュを削除するには、次の curl ベースの例に示すように、DELETE を /actuator/caches/{name} にリクエストします。
$ curl 'http://localhost:8080/actuator/caches/countries?cacheManager=anotherCacheManager' -i -X DELETEcountries という名前の 2 つのキャッシュがあるため、Cache をクリアする必要があることを指定するには、cacheManager を提供する必要があります。 |
4.4.1. リクエスト構造
リクエストされた名前が単一のキャッシュを識別するのに十分具体的である場合、追加のパラメーターは必要ありません。それ以外の場合は、cacheManager を指定する必要があります。次の表は、サポートされているクエリパラメーターを示しています。
| パラメーター | 説明 |
|---|---|
| キャッシュを修飾する cacheManager の名前。キャッシュ名が一意の場合は省略できます。 |
5. 条件評価レポート (conditions)
conditions エンドポイントは、構成および自動構成クラスの条件の評価に関する情報を提供します。
5.1. レポートの取得
レポートを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/conditions に作成します。
$ curl 'http://localhost:8080/actuator/conditions' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 3255
{
"contexts" : {
"application" : {
"positiveMatches" : {
"EndpointAutoConfiguration#endpointOperationParameterMapper" : [ {
"condition" : "OnBeanCondition",
"message" : "@ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.invoke.ParameterValueMapper; SearchStrategy: all) did not find any beans"
} ],
"EndpointAutoConfiguration#endpointCachingOperationInvokerAdvisor" : [ {
"condition" : "OnBeanCondition",
"message" : "@ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.invoker.cache.CachingOperationInvokerAdvisor; SearchStrategy: all) did not find any beans"
} ],
"WebEndpointAutoConfiguration" : [ {
"condition" : "OnWebApplicationCondition",
"message" : "@ConditionalOnWebApplication (required) found 'session' scope"
} ]
},
"negativeMatches" : {
"WebFluxEndpointManagementContextConfiguration" : {
"notMatched" : [ {
"condition" : "OnWebApplicationCondition",
"message" : "not a reactive web application"
} ],
"matched" : [ {
"condition" : "OnClassCondition",
"message" : "@ConditionalOnClass found required classes 'org.springframework.web.reactive.DispatcherHandler', 'org.springframework.http.server.reactive.HttpHandler'"
} ]
},
"GsonHttpMessageConvertersConfiguration.GsonHttpMessageConverterConfiguration" : {
"notMatched" : [ {
"condition" : "GsonHttpMessageConvertersConfiguration.PreferGsonOrJacksonAndJsonbUnavailableCondition",
"message" : "AnyNestedCondition 0 matched 2 did not; NestedCondition on GsonHttpMessageConvertersConfiguration.PreferGsonOrJacksonAndJsonbUnavailableCondition.JacksonJsonbUnavailable NoneNestedConditions 1 matched 1 did not; NestedCondition on GsonHttpMessageConvertersConfiguration.JacksonAndJsonbUnavailableCondition.JsonbPreferred @ConditionalOnProperty (spring.mvc.converters.preferred-json-mapper=jsonb) did not find property 'spring.mvc.converters.preferred-json-mapper'; NestedCondition on GsonHttpMessageConvertersConfiguration.JacksonAndJsonbUnavailableCondition.JacksonAvailable @ConditionalOnBean (types: org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; SearchStrategy: all) found bean 'mappingJackson2HttpMessageConverter'; NestedCondition on GsonHttpMessageConvertersConfiguration.PreferGsonOrJacksonAndJsonbUnavailableCondition.GsonPreferred @ConditionalOnProperty (spring.mvc.converters.preferred-json-mapper=gson) did not find property 'spring.mvc.converters.preferred-json-mapper'"
} ],
"matched" : [ ]
},
"JsonbHttpMessageConvertersConfiguration" : {
"notMatched" : [ {
"condition" : "OnClassCondition",
"message" : "@ConditionalOnClass did not find required class 'javax.json.bind.Jsonb'"
} ],
"matched" : [ ]
}
},
"unconditionalClasses" : [ "org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration", "org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration" ]
}
}
}5.1.1. レスポンス構造
レスポンスには、アプリケーションの条件評価の詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| ID をキーとするアプリケーションコンテキスト。 |
|
| 一致した条件を持つクラスとメソッド。 |
|
| 条件の名前。 |
|
| 条件が一致した理由の詳細。 |
|
| 一致しなかった条件を持つクラスとメソッド。 |
|
| 一致した条件。 |
|
| 条件の名前。 |
|
| 条件が一致しなかった理由の詳細。 |
|
| 一致した条件。 |
|
| 条件の名前。 |
|
| 条件が一致した理由の詳細。 |
|
| 無条件の自動構成クラスの名前(ある場合)。 |
|
| 親アプリケーションコンテキストの ID(存在する場合)。 |
6. プロパティの構成 (configprops)
configprops エンドポイントは、アプリケーションの @ConfigurationProperties Bean に関する情報を提供します。
6.1. @ConfigurationProperties Bean の取得
@ConfigurationProperties Bean を取得するには、次の curl ベースの例に示すように、/actuator/configprops に対して GET リクエストを作成します。
$ curl 'http://localhost:8080/actuator/configprops' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 2958
{
"contexts" : {
"application" : {
"beans" : {
"management.endpoints.web.cors-org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties" : {
"prefix" : "management.endpoints.web.cors",
"properties" : {
"allowedHeaders" : [ ],
"allowedMethods" : [ ],
"allowedOrigins" : [ ],
"maxAge" : "PT30M",
"exposedHeaders" : [ ]
},
"inputs" : {
"allowedHeaders" : [ ],
"allowedMethods" : [ ],
"allowedOrigins" : [ ],
"maxAge" : { },
"exposedHeaders" : [ ]
}
},
"management.endpoints.web-org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties" : {
"prefix" : "management.endpoints.web",
"properties" : {
"pathMapping" : { },
"exposure" : {
"include" : [ "*" ],
"exclude" : [ ]
},
"basePath" : "/actuator"
},
"inputs" : {
"pathMapping" : { },
"exposure" : {
"include" : [ {
"origin" : "\"management.endpoints.web.exposure.include\" from property source \"Inlined Test Properties\"",
"value" : "*"
} ],
"exclude" : [ ]
},
"basePath" : { }
}
},
"spring.resources-org.springframework.boot.autoconfigure.web.ResourceProperties" : {
"prefix" : "spring.resources",
"properties" : {
"addMappings" : true,
"chain" : {
"cache" : true,
"htmlApplicationCache" : false,
"compressed" : false,
"strategy" : {
"fixed" : {
"enabled" : false,
"paths" : [ "/**" ]
},
"content" : {
"enabled" : false,
"paths" : [ "/**" ]
}
}
},
"cache" : {
"cachecontrol" : { }
},
"staticLocations" : [ "classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/" ]
},
"inputs" : {
"addMappings" : { },
"chain" : {
"cache" : { },
"htmlApplicationCache" : { },
"compressed" : { },
"strategy" : {
"fixed" : {
"enabled" : { },
"paths" : [ { } ]
},
"content" : {
"enabled" : { },
"paths" : [ { } ]
}
}
},
"cache" : {
"cachecontrol" : { }
},
"staticLocations" : [ { }, { }, { }, { } ]
}
}
}
}
}
}6.1.1. レスポンス構造
レスポンスには、アプリケーションの @ConfigurationProperties Bean の詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| ID をキーとするアプリケーションコンテキスト。 |
|
|
|
|
| Bean のプロパティの名前に適用されるプレフィックス。 |
|
| 名前と値のペアとしての Bean のプロパティ。 |
|
| この Bean にバインドするときに使用される構成プロパティの起源と値。 |
|
| 親アプリケーションコンテキストの ID(存在する場合)。 |
7. 環境 (env)
env エンドポイントは、アプリケーションの Environment に関する情報を提供します。
7.1. 環境全体を取得する
環境全体を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/env に作成します。
$ curl 'http://localhost:8080/actuator/env' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 788
{
"activeProfiles" : [ ],
"propertySources" : [ {
"name" : "systemProperties",
"properties" : {
"java.runtime.name" : {
"value" : "OpenJDK Runtime Environment"
},
"java.vm.version" : {
"value" : "25.252-b09"
},
"java.vm.vendor" : {
"value" : "AdoptOpenJDK"
}
}
}, {
"name" : "systemEnvironment",
"properties" : {
"JAVA_HOME" : {
"value" : "/opt/openjdk",
"origin" : "System Environment Property \"JAVA_HOME\""
}
}
}, {
"name" : "applicationConfig: [classpath:/application.properties]",
"properties" : {
"com.example.cache.max-size" : {
"value" : "1000",
"origin" : "class path resource [application.properties]:1:29"
}
}
} ]
}7.1.1. レスポンス構造
レスポンスには、アプリケーションの Environment の詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| アクティブなプロファイルの名前(ある場合)。 |
|
| 優先度順のプロパティソース。 |
|
| プロパティソースの名前。 |
|
| プロパティ名をキーとするプロパティソースのプロパティ。 |
|
| プロパティの値。 |
|
| プロパティの起源(ある場合)。 |
7.2. 単一のプロパティを取得する
単一のプロパティを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/env/{property.name} に作成します。
$ curl 'http://localhost:8080/actuator/env/com.example.cache.max-size' -i -X GET 上記の例では、com.example.cache.max-size という名前のプロパティに関する情報を取得します。結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Disposition: inline;filename=f.txt
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 445
{
"property" : {
"source" : "applicationConfig: [classpath:/application.properties]",
"value" : "1000"
},
"activeProfiles" : [ ],
"propertySources" : [ {
"name" : "systemProperties"
}, {
"name" : "systemEnvironment"
}, {
"name" : "applicationConfig: [classpath:/application.properties]",
"property" : {
"value" : "1000",
"origin" : "class path resource [application.properties]:1:29"
}
} ]
}7.2.1. レスポンス構造
レスポンスには、リクエストされたプロパティの詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| 環境のプロパティ(見つかった場合)。 |
|
| プロパティのソースの名前。 |
|
| プロパティの値。 |
|
| アクティブなプロファイルの名前(ある場合)。 |
|
| 優先度順のプロパティソース。 |
|
| プロパティソースの名前。 |
|
| プロパティソース内のプロパティ(ある場合)。 |
|
| プロパティの値。 |
|
| プロパティの起源(ある場合)。 |
8. Flyway (flyway)
flyway エンドポイントは、Flyway によって実行されるデータベース移行に関する情報を提供します。
8.1. 移行の取得
移行を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/flyway に作成します。
$ curl 'http://localhost:8080/actuator/flyway' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 515
{
"contexts" : {
"application" : {
"flywayBeans" : {
"flyway" : {
"migrations" : [ {
"type" : "SQL",
"checksum" : -156244537,
"version" : "1",
"description" : "init",
"script" : "V1__init.sql",
"state" : "SUCCESS",
"installedBy" : "SA",
"installedOn" : "2020-05-14T23:39:30.260Z",
"installedRank" : 1,
"executionTime" : 2
} ]
}
}
}
}
}8.1.1. レスポンス構造
レスポンスには、アプリケーションの Flyway 移行の詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| ID をキーとするアプリケーションコンテキスト |
|
| Flyway Bean 名をキーとする、Flyway インスタンスによって実行される移行。 |
|
| 移行のチェックサム(ある場合)。 |
|
| 移行の説明(ある場合)。 |
|
| 適用された移行のミリ秒単位の実行時間。 |
|
| 適用された移行をインストールしたユーザー(存在する場合)。 |
|
| 適用された移行がインストールされたときのタイムスタンプ(ある場合)。 |
|
| 適用された移行のランク(ある場合)。後の移行のランクは高くなります。 |
|
| 移行の実行に使用されるスクリプトの名前(ある場合)。 |
|
| 移行の状態。( |
|
| 移行の型。( |
|
| 移行を適用した後のデータベースのバージョン(ある場合)。 |
|
| 親アプリケーションコンテキストの ID(存在する場合)。 |
9. 状態 (health)
health エンドポイントは、アプリケーションの状態に関する詳細情報を提供します。
9.1. アプリケーションの正常性の取得
アプリケーションの正常性を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/health に作成します。
$ curl 'http://localhost:8080/actuator/health' -i -X GET \
-H 'Accept: application/json'結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 704
{
"status" : "UP",
"components" : {
"broker" : {
"status" : "UP",
"components" : {
"us1" : {
"status" : "UP",
"details" : {
"version" : "1.0.2"
}
},
"us2" : {
"status" : "UP",
"details" : {
"version" : "1.0.4"
}
}
}
},
"db" : {
"status" : "UP",
"details" : {
"database" : "H2",
"validationQuery" : "isValid()"
}
},
"diskSpace" : {
"status" : "UP",
"details" : {
"total" : 194686709760,
"free" : 174531383296,
"threshold" : 10485760,
"exists" : true
}
}
}
}9.1.1. レスポンス構造
レスポンスには、アプリケーションの正常性の詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| アプリケーションの全体的なステータス。 |
|
| 正常性を構成するコンポーネント。 |
|
| アプリケーションの特定の部分のステータス。 |
|
| 正常性を構成するネストされたコンポーネント。 |
|
| アプリケーションの特定の部分の正常性の詳細。存在は |
上記のレスポンスフィールドは V3 API 用です。V2 JSON を返す必要がある場合は、accept ヘッダーまたは application/vnd.spring-boot.actuator.v2+json を使用する必要があります |
9.2. コンポーネントの正常性の取得
アプリケーションのヘルスの特定のコンポーネントのヘルスを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/health/{component} に送信します。
$ curl 'http://localhost:8080/actuator/health/db' -i -X GET \
-H 'Accept: application/json'結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 101
{
"status" : "UP",
"details" : {
"database" : "H2",
"validationQuery" : "isValid()"
}
}9.2.1. レスポンス構造
レスポンスには、アプリケーションの正常性の特定のコンポーネントの正常性の詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| アプリケーションの特定の部分のステータス |
|
| アプリケーションの特定の部分の正常性の詳細。 |
9.3. ネストされたコンポーネントのヘルスを取得する
特定のコンポーネントに他のネストされたコンポーネントが含まれる場合(上記の例の broker インジケーターとして)、次の curl ベースの例に示すように、GET リクエストを /actuator/health/{component}/{subcomponent} に発行することにより、そのようなネストされたコンポーネントのヘルスを取得できます:
$ curl 'http://localhost:8080/actuator/health/broker/us1' -i -X GET \
-H 'Accept: application/json'結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 66
{
"status" : "UP",
"details" : {
"version" : "1.0.2"
}
} アプリケーションの正常性のコンポーネントは、アプリケーションの正常性インジケーターとそれらがどのようにグループ化されているかに応じて、任意の深さにネストできます。ヘルスエンドポイントは、URL で任意の数の /{component} 識別子をサポートし、任意の深さでコンポーネントのヘルスを取得できるようにします。
9.3.1. レスポンス構造
レスポンスには、アプリケーションの特定のコンポーネントのインスタンスの正常性の詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| アプリケーションの特定の部分のステータス |
|
| アプリケーションの特定の部分の正常性の詳細。 |
10. ヒープダンプ (heapdump)
heapdump エンドポイントは、アプリケーションの JVM からのヒープダンプを提供します。
10.1. ヒープダンプの取得
ヒープダンプを取得するには、GET を /actuator/heapdump にリクエストします。レスポンスは HPROF [Oracle] 形式のバイナリデータであり、大きくなる可能性があります。通常、後続の分析のためにレスポンスをディスクに保存する必要があります。curl を使用する場合、次の例に示すように、-O オプションを使用してこれを実現できます。
$ curl 'http://localhost:8080/actuator/heapdump' -O 上記の例では、heapdump という名前のファイルが現在の作業ディレクトリに書き込まれます。
11. HTTP トレース (httptrace)
httptrace エンドポイントは、HTTP リクエスト / レスポンス交換に関する情報を提供します。
11.1. トレースの取得
トレースを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/httptrace に作成します。
$ curl 'http://localhost:8080/actuator/httptrace' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 503
{
"traces" : [ {
"timestamp" : "2020-05-14T23:39:34.175Z",
"principal" : {
"name" : "alice"
},
"session" : {
"id" : "39e6f693-8d2d-4ca5-a09d-1a33f9182bd0"
},
"request" : {
"method" : "GET",
"uri" : "https://api.example.com",
"headers" : {
"Accept" : [ "application/json" ]
}
},
"response" : {
"status" : 200,
"headers" : {
"Content-Type" : [ "application/json" ]
}
},
"timeTaken" : 1
} ]
}11.1.1. レスポンス構造
レスポンスには、トレースされた HTTP リクエストとレスポンスの交換の詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| トレースされた HTTP リクエスト / レスポンス交換の配列。 |
|
| トレースされた交換が発生したときのタイムスタンプ。 |
|
| 交換のプリンシパル(ある場合)。 |
|
| プリンシパルの名前。 |
|
| リクエストの HTTP メソッド。 |
|
| リクエストが受信されたリモートアドレス(わかっている場合)。 |
|
| リクエストの URI。 |
|
| ヘッダー名でキー付けされたリクエストのヘッダー。 |
|
| ヘッダーの値 |
|
| レスポンスのステータス |
|
| ヘッダー名でキー付けされたレスポンスのヘッダー。 |
|
| ヘッダーの値 |
|
| 交換に関連付けられたセッション(ある場合)。 |
|
| セッションの ID。 |
|
| 交換の処理にかかった時間(ミリ秒)。 |
12. 情報 (info)
info エンドポイントは、アプリケーションに関する一般情報を提供します。
12.1. 情報を取得する
アプリケーションに関する情報を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/info に作成します。
$ curl 'http://localhost:8080/actuator/info' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 235
{
"git" : {
"commit" : {
"time" : "+52339-03-28T21:10:34Z",
"id" : "df027cf"
},
"branch" : "master"
},
"build" : {
"version" : "1.0.3",
"artifact" : "application",
"group" : "com.example"
}
}12.1.1. レスポンス構造
レスポンスには、アプリケーションに関する一般情報が含まれています。レスポンスの各セクションは、InfoContributor によって提供されます。Spring Boot は、build および git の貢献を提供します。
レスポンス構造の構築
次の表に、レスポンスの build セクションの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| アプリケーションのアーティファクト ID(ある場合)。 |
|
| アプリケーションのグループ ID(ある場合)。 |
|
| アプリケーションの名前(ある場合)。 |
|
| アプリケーションのバージョン(ある場合)。 |
|
| アプリケーションが作成されたときのタイムスタンプ(ある場合)。 |
Git レスポンス構造
次の表に、レスポンスの git セクションの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| Git ブランチの名前(ある場合)。 |
|
| Git コミットの詳細(ある場合)。 |
|
| コミットのタイムスタンプ(ある場合)。 |
|
| コミットの ID(ある場合)。 |
13. Spring Integration グラフ (integrationgraph)
integrationgraph エンドポイントは、すべての Spring Integration コンポーネントを含むグラフを公開します。
13.1. Spring Integration グラフの取得
アプリケーションに関する情報を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/integrationgraph に作成します。
$ curl 'http://localhost:8080/actuator/integrationgraph' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 969
{
"contentDescriptor" : {
"providerVersion" : "5.3.0.RELEASE",
"providerFormatVersion" : 1.2,
"provider" : "spring-integration"
},
"nodes" : [ {
"nodeId" : 1,
"componentType" : "null-channel",
"integrationPatternType" : "null_channel",
"integrationPatternCategory" : "messaging_channel",
"properties" : { },
"name" : "nullChannel"
}, {
"nodeId" : 2,
"componentType" : "publish-subscribe-channel",
"integrationPatternType" : "publish_subscribe_channel",
"integrationPatternCategory" : "messaging_channel",
"properties" : { },
"name" : "errorChannel"
}, {
"nodeId" : 3,
"componentType" : "logging-channel-adapter",
"integrationPatternType" : "outbound_channel_adapter",
"integrationPatternCategory" : "messaging_endpoint",
"properties" : { },
"input" : "errorChannel",
"name" : "errorLogger"
} ],
"links" : [ {
"from" : 2,
"to" : 3,
"type" : "input"
} ]
}13.1.1. レスポンス構造
レスポンスには、アプリケーション内で使用されるすべての Spring Integration コンポーネントとそれらの間のリンクが含まれます。構造の詳細については、リファレンスドキュメントを参照してください (英語) 。
13.2. Spring Integration グラフの再構築
公開されたグラフを再構築するには、次の curl ベースの例に示すように、POST リクエストを /actuator/integrationgraph に作成します。
$ curl 'http://localhost:8080/actuator/integrationgraph' -i -X POST これにより、204 - No Content レスポンスが発生します。
HTTP/1.1 204 No Content14. Liquibase (liquibase)
liquibase エンドポイントは、Liquibase によって適用されたデータベース変更セットに関する情報を提供します。
14.1. 変更を取得する
変更を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/liquibase に作成します。
$ curl 'http://localhost:8080/actuator/liquibase' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 688
{
"contexts" : {
"application" : {
"liquibaseBeans" : {
"liquibase" : {
"changeSets" : [ {
"author" : "marceloverdijk",
"changeLog" : "classpath:/db/changelog/db.changelog-master.yaml",
"comments" : "",
"contexts" : [ ],
"dateExecuted" : "2020-05-14T23:39:33.157Z",
"deploymentId" : "9499573128",
"description" : "createTable tableName=customer",
"execType" : "EXECUTED",
"id" : "1",
"labels" : [ ],
"checksum" : "8:46debf252cce6d7b25e28ddeb9fc4bf6",
"orderExecuted" : 1
} ]
}
}
}
}
}14.1.1. レスポンス構造
レスポンスには、アプリケーションの Liquibase 変更セットの詳細が含まれます。次の表は、レスポンスの構造を示しています。
| パス | タイプ | 説明 |
|---|---|---|
|
| ID をキーとするアプリケーションコンテキスト |
|
| Bean 名をキーとする、Liquibase Bean によって作成された変更セット。 |
|
| 変更セットの作成者。 |
|
| 変更セットを含む変更ログ。 |
|
| 変更セットに関するコメント。 |
|
| 変更セットのコンテキスト。 |
|
| 変更セットが実行されたときのタイムスタンプ。 |
|
| 変更セットを実行したデプロイの ID。 |
|
| 変更セットの説明。 |
|
| 変更セットの実行型( |
|
| 変更セットの ID。 |
|
| 変更セットに関連付けられたラベル。 |
|
| 変更セットのチェックサム。 |
|
| 変更セットの実行順序。 |
|
| 変更セットに関連付けられているタグ(ある場合)。 |
|
| 親アプリケーションコンテキストの ID(存在する場合)。 |
15. ログファイル (logfile)
logfile エンドポイントは、アプリケーションのログファイルのコンテンツへのアクセスを提供します。
15.1. ログファイルの取得
ログファイルを取得するには、次の curl ベースの例に示すように、GET を /actuator/logfile にリクエストします。
$ curl 'http://localhost:8080/actuator/logfile' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: text/plain;charset=UTF-8
Content-Length: 4723
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::
2017-08-08 17:12:30.910 INFO 19866 --- [ main] s.f.SampleWebFreeMarkerApplication : Starting SampleWebFreeMarkerApplication on host.local with PID 19866
2017-08-08 17:12:30.913 INFO 19866 --- [ main] s.f.SampleWebFreeMarkerApplication : No active profile set, falling back to default profiles: default
2017-08-08 17:12:30.952 INFO 19866 --- [ main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@76b10754: startup date [Tue Aug 08 17:12:30 BST 2017]; root of context hierarchy
2017-08-08 17:12:31.878 INFO 19866 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2017-08-08 17:12:31.889 INFO 19866 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2017-08-08 17:12:31.890 INFO 19866 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.16
2017-08-08 17:12:31.978 INFO 19866 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2017-08-08 17:12:31.978 INFO 19866 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1028 ms
2017-08-08 17:12:32.080 INFO 19866 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2017-08-08 17:12:32.084 INFO 19866 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-08-08 17:12:32.084 INFO 19866 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-08-08 17:12:32.084 INFO 19866 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-08-08 17:12:32.084 INFO 19866 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]
2017-08-08 17:12:32.349 INFO 19866 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@76b10754: startup date [Tue Aug 08 17:12:30 BST 2017]; root of context hierarchy
2017-08-08 17:12:32.420 INFO 19866 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2017-08-08 17:12:32.421 INFO 19866 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2017-08-08 17:12:32.444 INFO 19866 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-08-08 17:12:32.444 INFO 19866 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-08-08 17:12:32.471 INFO 19866 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-08-08 17:12:32.600 INFO 19866 --- [ main] o.s.w.s.v.f.FreeMarkerConfigurer : ClassTemplateLoader for Spring macros added to FreeMarker configuration
2017-08-08 17:12:32.681 INFO 19866 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2017-08-08 17:12:32.744 INFO 19866 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http)
2017-08-08 17:12:32.750 INFO 19866 --- [ main] s.f.SampleWebFreeMarkerApplication : Started SampleWebFreeMarkerApplication in 2.172 seconds (JVM running for 2.479)15.2. ログファイルの一部を取得する
| Jersey を使用する場合、ログファイルの一部の取得はサポートされていません。 |
ログファイルの一部を取得するには、次の curl ベースの例に示すように、Range ヘッダーを使用して GET リクエストを /actuator/logfile に作成します。
$ curl 'http://localhost:8080/actuator/logfile' -i -X GET \
-H 'Range: bytes=0-1023'上記の例は、ログファイルの最初の 1024 バイトを取得します。結果のレスポンスは次のようになります。
HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Type: text/plain;charset=UTF-8
Content-Range: bytes 0-1023/4723
Content-Length: 1024
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::
2017-08-08 17:12:30.910 INFO 19866 --- [ main] s.f.SampleWebFreeMarkerApplication : Starting SampleWebFreeMarkerApplication on host.local with PID 19866
2017-08-08 17:12:30.913 INFO 19866 --- [ main] s.f.SampleWebFreeMarkerApplication : No active profile set, falling back to default profiles: default
2017-08-08 17:12:30.952 INFO 19866 --- [ main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@76b10754: startup date [Tue Aug 08 17:12:30 BST 2017]; root of context hierarchy
2017-08-08 17:12:31.878 INFO 19866 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(16. ロガー (loggers)
loggers エンドポイントは、アプリケーションのロガーおよびそのレベルの構成へのアクセスを提供します。
16.1. すべてのロガーの取得
アプリケーションのロガーを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/loggers に作成します。
$ curl 'http://localhost:8080/actuator/loggers' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 791
{
"levels" : [ "OFF", "FATAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE" ],
"loggers" : {
"ROOT" : {
"configuredLevel" : "INFO",
"effectiveLevel" : "INFO"
},
"com.example" : {
"configuredLevel" : "DEBUG",
"effectiveLevel" : "DEBUG"
}
},
"groups" : {
"test" : {
"configuredLevel" : "INFO",
"members" : [ "test.member1", "test.member2" ]
},
"web" : {
"members" : [ "org.springframework.core.codec", "org.springframework.http", "org.springframework.web", "org.springframework.boot.actuate.endpoint.web", "org.springframework.boot.web.servlet.ServletContextInitializerBeans" ]
},
"sql" : {
"members" : [ "org.springframework.jdbc.core", "org.hibernate.SQL", "org.jooq.tools.LoggerListener" ]
}
}
}16.1.1. レスポンス構造
レスポンスには、アプリケーションのロガーの詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| ロギングシステムによるレベルのサポート。 |
|
| 名前をキーとするロガー。 |
|
| 名前をキーとするロガーグループ |
|
| ロガーの構成レベル(ある場合)。 |
|
| ロガーの有効レベル。 |
|
| ロガーグループの設定レベル(ある場合)。 |
|
| このグループの一部であるロガー |
16.2. 単一のロガーの取得
単一のロガーを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/loggers/{logger.name} に作成します。
$ curl 'http://localhost:8080/actuator/loggers/com.example' -i -X GET 上記の例では、com.example というロガーに関する情報を取得します。結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Disposition: inline;filename=f.txt
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 61
{
"configuredLevel" : "INFO",
"effectiveLevel" : "INFO"
}16.2.1. レスポンス構造
レスポンスには、リクエストされたロガーの詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| ロガーの構成レベル(ある場合)。 |
|
| ロガーの有効レベル。 |
16.3. 単一グループの取得
単一のグループを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/loggers/{group.name} に作成します。
$ curl 'http://localhost:8080/actuator/loggers/test' -i -X GET 上記の例は、test という名前のロガーグループに関する情報を取得します。結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 82
{
"configuredLevel" : "INFO",
"members" : [ "test.member1", "test.member2" ]
}16.3.1. レスポンス構造
レスポンスには、リクエストされたグループの詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| ロガーグループの設定レベル(ある場合)。 |
|
| このグループの一部であるロガー |
16.4. ログレベルの設定
ロガーのレベルを設定するには、次の curl ベースの例に示すように、ロガーに設定されたレベルを指定する JSON 本文を使用して、POST を /actuator/loggers/{logger.name} にリクエストします。
$ curl 'http://localhost:8080/actuator/loggers/com.example' -i -X POST \
-H 'Content-Type: application/json' \
-d '{"configuredLevel":"debug"}' 上記の例では、com.example ロガーの configuredLevel を DEBUG に設定します。
16.4.1. リクエスト構造
リクエストは、ロガーの望ましいレベルを指定します。次の表に、リクエストの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| ロガーのレベル。レベルをクリアするために省略できます。 |
16.5. グループのログレベルの設定
ロガーのレベルを設定するには、次の curl ベースの例に示すように、ロガーグループに設定されたレベルを指定する JSON ボディを使用して、POST を /actuator/loggers/{group.name} にリクエストします。
$ curl 'http://localhost:8080/actuator/loggers/test' -i -X POST \
-H 'Content-Type: application/json' \
-d '{"configuredLevel":"debug"}' 上記の例では、test ロガーグループの configuredLevel を DEBUG に設定します。
16.5.1. リクエスト構造
リクエストは、ロガーグループの目的のレベルを指定します。次の表に、リクエストの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| ロガーのレベル。レベルをクリアするために省略できます。 |
16.6. ログレベルのクリア
ロガーのレベルをクリアするには、次の curl ベースの例に示すように、空のオブジェクトを含む JSON ボディを使用して POST を /actuator/loggers/{logger.name} にリクエストします。
$ curl 'http://localhost:8080/actuator/loggers/com.example' -i -X POST \
-H 'Content-Type: application/json' \
-d '{}' 上記の例は、com.example ロガーの構成済みレベルをクリアします。
17. マッピング (mappings)
mappings エンドポイントは、アプリケーションのリクエストマッピングに関する情報を提供します。
17.1. マッピングの取得
マッピングを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/mappings に作成します。
$ curl 'http://localhost:40299/actuator/mappings' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Transfer-Encoding: chunked
Date: Thu, 14 May 2020 23:39:40 GMT
Content-Length: 5476
{
"contexts" : {
"application" : {
"mappings" : {
"dispatcherServlets" : {
"dispatcherServlet" : [ {
"handler" : "Actuator web endpoint 'mappings'",
"predicate" : "{GET /actuator/mappings, produces [application/vnd.spring-boot.actuator.v3+json || application/vnd.spring-boot.actuator.v2+json || application/json]}",
"details" : {
"handlerMethod" : {
"className" : "org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping.OperationHandler",
"name" : "handle",
"descriptor" : "(Ljavax/servlet/http/HttpServletRequest;Ljava/util/Map;)Ljava/lang/Object;"
},
"requestMappingConditions" : {
"consumes" : [ ],
"headers" : [ ],
"methods" : [ "GET" ],
"params" : [ ],
"patterns" : [ "/actuator/mappings" ],
"produces" : [ {
"mediaType" : "application/vnd.spring-boot.actuator.v3+json",
"negated" : false
}, {
"mediaType" : "application/vnd.spring-boot.actuator.v2+json",
"negated" : false
}, {
"mediaType" : "application/json",
"negated" : false
} ]
}
}
}, {
"handler" : "Actuator root web endpoint",
"predicate" : "{GET /actuator, produces [application/vnd.spring-boot.actuator.v3+json || application/vnd.spring-boot.actuator.v2+json || application/json]}",
"details" : {
"handlerMethod" : {
"className" : "org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping.WebMvcLinksHandler",
"name" : "links",
"descriptor" : "(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)Ljava/lang/Object;"
},
"requestMappingConditions" : {
"consumes" : [ ],
"headers" : [ ],
"methods" : [ "GET" ],
"params" : [ ],
"patterns" : [ "/actuator" ],
"produces" : [ {
"mediaType" : "application/vnd.spring-boot.actuator.v3+json",
"negated" : false
}, {
"mediaType" : "application/vnd.spring-boot.actuator.v2+json",
"negated" : false
}, {
"mediaType" : "application/json",
"negated" : false
} ]
}
}
}, {
"handler" : "org.springframework.boot.actuate.autoconfigure.endpoint.web.documentation.MappingsEndpointServletDocumentationTests$ExampleController#example()",
"predicate" : "{POST /, params [a!=alpha], headers [X-Custom=Foo], consumes [application/json || !application/xml], produces [text/plain]}",
"details" : {
"handlerMethod" : {
"className" : "org.springframework.boot.actuate.autoconfigure.endpoint.web.documentation.MappingsEndpointServletDocumentationTests.ExampleController",
"name" : "example",
"descriptor" : "()Ljava/lang/String;"
},
"requestMappingConditions" : {
"consumes" : [ {
"mediaType" : "application/json",
"negated" : false
}, {
"mediaType" : "application/xml",
"negated" : true
} ],
"headers" : [ {
"name" : "X-Custom",
"value" : "Foo",
"negated" : false
} ],
"methods" : [ "POST" ],
"params" : [ {
"name" : "a",
"value" : "alpha",
"negated" : true
} ],
"patterns" : [ "/" ],
"produces" : [ {
"mediaType" : "text/plain",
"negated" : false
} ]
}
}
}, {
"handler" : "ResourceHttpRequestHandler [\"classpath:/META-INF/resources/webjars/\"]",
"predicate" : "/webjars/**"
}, {
"handler" : "ResourceHttpRequestHandler [\"classpath:/META-INF/resources/\", \"classpath:/resources/\", \"classpath:/static/\", \"classpath:/public/\", \"/\"]",
"predicate" : "/**"
} ]
},
"servletFilters" : [ {
"servletNameMappings" : [ ],
"urlPatternMappings" : [ "/*" ],
"name" : "requestContextFilter",
"className" : "org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter"
}, {
"servletNameMappings" : [ ],
"urlPatternMappings" : [ "/*" ],
"name" : "formContentFilter",
"className" : "org.springframework.boot.web.servlet.filter.OrderedFormContentFilter"
} ],
"servlets" : [ {
"mappings" : [ ],
"name" : "default",
"className" : "org.apache.catalina.servlets.DefaultServlet"
}, {
"mappings" : [ "/" ],
"name" : "dispatcherServlet",
"className" : "org.springframework.web.servlet.DispatcherServlet"
} ]
}
}
}
}17.1.1. レスポンス構造
レスポンスには、アプリケーションのマッピングの詳細が含まれます。レスポンスで見つかった項目は、Web アプリケーションの型(リアクティブまたはサーブレットベース)によって異なります。次の表に、レスポンスの一般的な要素の構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| ID をキーとするアプリケーションコンテキスト。 |
|
| マッピング型によってキー設定されたコンテキスト内のマッピング。 |
|
| ディスパッチャーサーブレットマッピング(ある場合)。 |
|
| サーブレットフィルターマッピング(ある場合)。 |
|
| サーブレットマッピング(ある場合)。 |
|
| ディスパッチャーハンドラーマッピング(ある場合)。 |
|
| 親アプリケーションコンテキストの ID(存在する場合)。 |
contexts.*.mappings で見つかる可能性のあるエントリについては、次のセクションで説明します。
17.1.2. ディスパッチャーサーブレットのレスポンス構造
Spring MVC を使用する場合、レスポンスには contexts.*.mappings.dispatcherServlets にあるすべての DispatcherServlet リクエストマッピングの詳細が含まれます。次の表は、レスポンスのこのセクションの構造を示しています。
| パス | タイプ | 説明 |
|---|---|---|
|
| ディスパッチャーサーブレットマッピング(ある場合)は、ディスパッチャーサーブレット Bean 名によってキー設定されます。 |
|
| マッピングに関する追加の実装固有の詳細。オプション。 |
|
| マッピングのハンドラー。 |
|
| マッピングの述語。 |
|
| このマッピングへのリクエストを処理するメソッドの詳細(ある場合)。 |
|
| メソッドのクラスの完全修飾名。 |
|
| メソッドの名前。 |
|
| Java 言語仕様で指定されているメソッドの記述子。 |
|
| リクエストマッピング条件の詳細。 |
|
| 消費状態の詳細 |
|
| 消費されたメディア型。 |
|
| メディア型が否定されるかどうか。 |
|
| ヘッダー条件の詳細。 |
|
| ヘッダーの名前。 |
|
| ヘッダーの必須値(ある場合)。 |
|
| 値が否定されるかどうか。 |
|
| 処理される HTTP メソッド。 |
|
| params 条件の詳細。 |
|
| パラメーターの名前。 |
|
| パラメーターの必須値(ある場合)。 |
|
| 値が否定されるかどうか。 |
|
| マッピングによって処理されるパスを識別するパターン。 |
|
| 生産条件の詳細。 |
|
| 作成されたメディア型。 |
|
| メディア型が否定されるかどうか。 |
17.1.3. サーブレットのレスポンス構造
サーブレットスタックを使用する場合、レスポンスには contexts.*.mappings.servlets の Servlet マッピングの詳細が含まれます。次の表に、レスポンスのこのセクションの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| サーブレットのマッピング。 |
|
| サーブレットの名前。 |
|
| サーブレットのクラス名 |
17.1.4. サーブレットフィルターのレスポンス構造
サーブレットスタックを使用する場合、レスポンスには contexts.*.mappings.servletFilters の Filter マッピングの詳細が含まれます。次の表に、レスポンスのこのセクションの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| フィルターがマップされるサーブレットの名前。 |
|
| フィルターがマップされる URL パターン。 |
|
| フィルターの名前。 |
|
| フィルターのクラス名 |
17.1.5. ディスパッチャーハンドラーのレスポンス構造
Spring WebFlux を使用する場合、レスポンスには contexts.*.mappings.dispatcherHandlers の DispatcherHandler リクエストマッピングの詳細が含まれます。次の表に、レスポンスのこのセクションの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| ディスパッチャーハンドラー Bean 名をキーとするディスパッチャーハンドラーマッピング(ある場合)。 |
|
| マッピングに関する追加の実装固有の詳細。オプション。 |
|
| マッピングのハンドラー。 |
|
| マッピングの述語。 |
|
| リクエストマッピング条件の詳細。 |
|
| 消費状態の詳細 |
|
| 消費されたメディア型。 |
|
| メディア型が否定されるかどうか。 |
|
| ヘッダー条件の詳細。 |
|
| ヘッダーの名前。 |
|
| ヘッダーの必須値(ある場合)。 |
|
| 値が否定されるかどうか。 |
|
| 処理される HTTP メソッド。 |
|
| params 条件の詳細。 |
|
| パラメーターの名前。 |
|
| パラメーターの必須値(ある場合)。 |
|
| 値が否定されるかどうか。 |
|
| マッピングによって処理されるパスを識別するパターン。 |
|
| 生産条件の詳細。 |
|
| 作成されたメディア型。 |
|
| メディア型が否定されるかどうか。 |
|
| このマッピングへのリクエストを処理するメソッドの詳細(ある場合)。 |
|
| メソッドのクラスの完全修飾名。 |
|
| メソッドの名前。 |
|
| Java 言語仕様で指定されているメソッドの記述子。 |
|
| このマッピングへのリクエストを処理する関数の詳細(ある場合)。 |
|
| 関数のクラスの完全修飾名。 |
18. メトリクス (metrics)
metrics エンドポイントは、アプリケーションメトリクスへのアクセスを提供します。
18.1. メトリクス名の取得
使用可能なメトリクスの名前を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/metrics に作成します。
$ curl 'http://localhost:8080/actuator/metrics' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 154
{
"names" : [ "jvm.buffer.count", "jvm.buffer.memory.used", "jvm.buffer.total.capacity", "jvm.memory.committed", "jvm.memory.max", "jvm.memory.used" ]
}18.1.1. レスポンス構造
レスポンスには、メトリクス名の詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| 既知のメトリクスの名前。 |
18.2. メトリクスの取得
メトリクスを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/metrics/{metric.name} に作成します。
$ curl 'http://localhost:8080/actuator/metrics/jvm.memory.max' -i -X GET 上記の例は、jvm.memory.max という名前のメトリクスに関する情報を取得します。結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Disposition: inline;filename=f.txt
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 474
{
"name" : "jvm.memory.max",
"description" : "The maximum amount of memory in bytes that can be used for memory management",
"baseUnit" : "bytes",
"measurements" : [ {
"statistic" : "VALUE",
"value" : 2.355625983E9
} ],
"availableTags" : [ {
"tag" : "area",
"values" : [ "heap", "nonheap" ]
}, {
"tag" : "id",
"values" : [ "Compressed Class Space", "PS Old Gen", "PS Survivor Space", "Metaspace", "PS Eden Space", "Code Cache" ]
} ]
}18.2.1. クエリパラメーター
エンドポイントは、クエリパラメーターを使用して、タグを使用してメトリクスにドリルダウンします。次の表に、サポートされている単一のクエリパラメーターを示します。
| パラメーター | 説明 |
|---|---|
|
|
18.2.2. レスポンス構造
レスポンスには、メトリクスの詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| メトリクスの名前 |
|
| メトリクスの説明 |
|
| メトリクスの基本単位 |
|
| メトリクスの測定 |
|
| 測定の統計。( |
|
| 測定値。 |
|
| ドリルダウンに使用できるタグ。 |
|
| タグの名前。 |
|
| タグの可能な値。 |
18.3. ドリルダウン
メトリクスにドリルダウンするには、次の curl ベースの例に示すように、tag クエリパラメーターを使用して GET リクエストを /actuator/metrics/{metric.name} に作成します。
$ curl 'http://localhost:8080/actuator/metrics/jvm.memory.max?tag=area%3Anonheap&tag=id%3ACompressed+Class+Space' -i -X GET 上記の例では、jvm.memory.max メトリクスを取得します。area タグの値は nonheap で、id 属性の値は Compressed Class Space です。結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Disposition: inline;filename=f.txt
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 263
{
"name" : "jvm.memory.max",
"description" : "The maximum amount of memory in bytes that can be used for memory management",
"baseUnit" : "bytes",
"measurements" : [ {
"statistic" : "VALUE",
"value" : 1.073741824E9
} ],
"availableTags" : [ ]
}19. Prometheus (prometheus)
prometheus エンドポイントは、Spring Boot アプリケーションのメトリクスを、Prometheus サーバーによるスクレイピングに必要な形式で提供します。
19.1. メトリクスの取得
メトリクスを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/prometheus に作成します。
$ curl 'http://localhost:8080/actuator/prometheus' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: text/plain;version=0.0.4;charset=utf-8
Content-Length: 2370
# HELP jvm_buffer_count_buffers An estimate of the number of buffers in the pool
# TYPE jvm_buffer_count_buffers gauge
jvm_buffer_count_buffers{id="direct",} 12.0
jvm_buffer_count_buffers{id="mapped",} 0.0
# HELP jvm_buffer_memory_used_bytes An estimate of the memory that the Java virtual machine is using for this buffer pool
# TYPE jvm_buffer_memory_used_bytes gauge
jvm_buffer_memory_used_bytes{id="direct",} 434177.0
jvm_buffer_memory_used_bytes{id="mapped",} 0.0
# HELP jvm_memory_max_bytes The maximum amount of memory in bytes that can be used for memory management
# TYPE jvm_memory_max_bytes gauge
jvm_memory_max_bytes{area="heap",id="PS Survivor Space",} 4.194304E7
jvm_memory_max_bytes{area="heap",id="PS Old Gen",} 7.16177408E8
jvm_memory_max_bytes{area="heap",id="PS Eden Space",} 2.74202624E8
jvm_memory_max_bytes{area="nonheap",id="Metaspace",} -1.0
jvm_memory_max_bytes{area="nonheap",id="Code Cache",} 2.5165824E8
jvm_memory_max_bytes{area="nonheap",id="Compressed Class Space",} 1.073741824E9
# HELP jvm_memory_committed_bytes The amount of memory in bytes that is committed for the Java virtual machine to use
# TYPE jvm_memory_committed_bytes gauge
jvm_memory_committed_bytes{area="heap",id="PS Survivor Space",} 4.194304E7
jvm_memory_committed_bytes{area="heap",id="PS Old Gen",} 2.01326592E8
jvm_memory_committed_bytes{area="heap",id="PS Eden Space",} 2.71581184E8
jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 1.68251392E8
jvm_memory_committed_bytes{area="nonheap",id="Code Cache",} 4.882432E7
jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 2.4403968E7
# HELP jvm_memory_used_bytes The amount of used memory
# TYPE jvm_memory_used_bytes gauge
jvm_memory_used_bytes{area="heap",id="PS Survivor Space",} 2.0631288E7
jvm_memory_used_bytes{area="heap",id="PS Old Gen",} 8.643396E7
jvm_memory_used_bytes{area="heap",id="PS Eden Space",} 2.50809032E8
jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 1.57194392E8
jvm_memory_used_bytes{area="nonheap",id="Code Cache",} 4.7927552E7
jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 2.221168E7
# HELP jvm_buffer_total_capacity_bytes An estimate of the total capacity of the buffers in this pool
# TYPE jvm_buffer_total_capacity_bytes gauge
jvm_buffer_total_capacity_bytes{id="direct",} 434176.0
jvm_buffer_total_capacity_bytes{id="mapped",} 0.020. スケジュールされたタスク (scheduledtasks)
scheduledtasks エンドポイントは、アプリケーションのスケジュールされたタスクに関する情報を提供します。
20.1. スケジュールされたタスクの取得
スケジュールされたタスクを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/scheduledtasks に作成します。
$ curl 'http://localhost:8080/actuator/scheduledtasks' -i -X GET結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 628
{
"cron" : [ {
"runnable" : {
"target" : "com.example.Processor.processOrders"
},
"expression" : "0 0 0/3 1/1 * ?"
} ],
"fixedDelay" : [ {
"runnable" : {
"target" : "com.example.Processor.purge"
},
"initialDelay" : 5000,
"interval" : 5000
} ],
"fixedRate" : [ {
"runnable" : {
"target" : "com.example.Processor.retrieveIssues"
},
"initialDelay" : 10000,
"interval" : 3000
} ],
"custom" : [ {
"runnable" : {
"target" : "com.example.Processor$CustomTriggeredRunnable"
},
"trigger" : "com.example.Processor$CustomTrigger@17f8a5c"
} ]
}20.1.1. レスポンス構造
レスポンスには、アプリケーションのスケジュールされたタスクの詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| cron タスク(ある場合)。 |
|
| 実行されるターゲット。 |
|
| cron 式。 |
|
| 遅延タスクがある場合は修正されました。 |
|
| 実行されるターゲット。 |
|
| 最初の実行までの遅延(ミリ秒単位)。 |
|
| 最後の実行の終了から次の実行の開始までの間隔(ミリ秒単位)。 |
|
| 固定レートタスク(ある場合)。 |
|
| 実行されるターゲット。 |
|
| 各実行の開始間の間隔(ミリ秒単位)。 |
|
| 最初の実行までの遅延(ミリ秒単位)。 |
|
| カスタムトリガーがある場合は、タスク。 |
|
| 実行されるターゲット。 |
|
| タスクのトリガー。 |
21. セッション (sessions)
sessions エンドポイントは、Spring Session によって管理されるアプリケーションの HTTP セッションに関する情報を提供します。
21.1. セッションの取得
セッションを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/sessions に作成します。
$ curl 'http://localhost:8080/actuator/sessions?username=alice' -i -X GET 前述の例では、ユーザー名が alice であるユーザーのすべてのセッションを取得します。結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 753
{
"sessions" : [ {
"id" : "46aaa4ef-aa50-49f0-abea-7a3eee0cec1e",
"attributeNames" : [ ],
"creationTime" : "2020-05-14T21:39:35.123Z",
"lastAccessedTime" : "2020-05-14T23:39:23.123Z",
"maxInactiveInterval" : 1800,
"expired" : false
}, {
"id" : "e30930b0-95de-49c7-8a41-c336dda6e9bc",
"attributeNames" : [ ],
"creationTime" : "2020-05-14T11:39:35.122Z",
"lastAccessedTime" : "2020-05-14T23:38:50.122Z",
"maxInactiveInterval" : 1800,
"expired" : false
}, {
"id" : "4db5efcc-99cb-4d05-a52c-b49acfbb7ea9",
"attributeNames" : [ ],
"creationTime" : "2020-05-14T18:39:35.123Z",
"lastAccessedTime" : "2020-05-14T23:38:58.123Z",
"maxInactiveInterval" : 1800,
"expired" : false
} ]
}21.1.1. クエリパラメーター
エンドポイントはクエリパラメーターを使用して、返すセッションを制限します。次の表に、単一の必須クエリパラメーターを示します。
| パラメーター | 説明 |
|---|---|
| ユーザーの名前。 |
21.1.2. レスポンス構造
レスポンスには、一致するセッションの詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| 指定されたユーザー名のセッション。 |
|
| セッションの ID。 |
|
| セッションに保存されている属性の名前。 |
|
| セッションが作成されたときのタイムスタンプ。 |
|
| セッションが最後にアクセスされたときのタイムスタンプ。 |
|
| セッションが期限切れになるまでの最大非アクティブ期間(秒単位)。 |
|
| セッションの有効期限が切れているかどうか。 |
21.2. 単一セッションの取得
単一のセッションを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/sessions/{id} に作成します。
$ curl 'http://localhost:8080/actuator/sessions/4db5efcc-99cb-4d05-a52c-b49acfbb7ea9' -i -X GET 上記の例は、id が 4db5efcc-99cb-4d05-a52c-b49acfbb7ea9 のセッションを取得します。結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 228
{
"id" : "4db5efcc-99cb-4d05-a52c-b49acfbb7ea9",
"attributeNames" : [ ],
"creationTime" : "2020-05-14T18:39:35.123Z",
"lastAccessedTime" : "2020-05-14T23:38:58.123Z",
"maxInactiveInterval" : 1800,
"expired" : false
}21.2.1. レスポンス構造
レスポンスには、リクエストされたセッションの詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| セッションの ID。 |
|
| セッションに保存されている属性の名前。 |
|
| セッションが作成されたときのタイムスタンプ。 |
|
| セッションが最後にアクセスされたときのタイムスタンプ。 |
|
| セッションが期限切れになるまでの最大非アクティブ期間(秒単位)。 |
|
| セッションの有効期限が切れているかどうか。 |
21.3. セッションを削除する
セッションを削除するには、次の curl ベースの例に示すように、DELETE リクエストを /actuator/sessions/{id} に作成します。
$ curl 'http://localhost:8080/actuator/sessions/4db5efcc-99cb-4d05-a52c-b49acfbb7ea9' -i -X DELETE 上記の例は、id が 4db5efcc-99cb-4d05-a52c-b49acfbb7ea9 であるセッションを削除します。
22. シャットダウン (shutdown)
shutdown エンドポイントは、アプリケーションをシャットダウンするために使用されます。
22.1. アプリケーションのシャットダウン
アプリケーションをシャットダウンするには、次の curl ベースの例に示すように、POST を /actuator/shutdown にリクエストします。
$ curl 'http://localhost:8080/actuator/shutdown' -i -X POST次のようなレスポンスが生成されます。
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 41
{
"message" : "Shutting down, bye..."
}22.1.1. レスポンス構造
レスポンスには、シャットダウンリクエストの結果の詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| リクエストの結果を説明するメッセージ。 |
23. スレッドダンプ (threaddump)
threaddump エンドポイントは、アプリケーションの JVM からのスレッドダンプを提供します。
23.1. スレッドダンプを JSON として取得する
スレッドダンプを JSON として取得するには、次の curl ベースの例に示すように、適切な Accept ヘッダーを使用して GET リクエストを /actuator/threaddump に作成します。
$ curl 'http://localhost:8080/actuator/threaddump' -i -X GET \
-H 'Accept: application/json'結果のレスポンスは次のようになります。
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 7535
{
"threads" : [ {
"threadName" : "Thread-2985",
"threadId" : 3598,
"blockedTime" : -1,
"blockedCount" : 0,
"waitedTime" : -1,
"waitedCount" : 1,
"lockName" : "java.util.concurrent.CountDownLatch$Sync@2a0c822c",
"lockOwnerId" : -1,
"inNative" : false,
"suspended" : false,
"threadState" : "WAITING",
"stackTrace" : [ {
"methodName" : "park",
"fileName" : "Unsafe.java",
"lineNumber" : -2,
"className" : "sun.misc.Unsafe",
"nativeMethod" : true
}, {
"methodName" : "park",
"fileName" : "LockSupport.java",
"lineNumber" : 175,
"className" : "java.util.concurrent.locks.LockSupport",
"nativeMethod" : false
}, {
"methodName" : "parkAndCheckInterrupt",
"fileName" : "AbstractQueuedSynchronizer.java",
"lineNumber" : 836,
"className" : "java.util.concurrent.locks.AbstractQueuedSynchronizer",
"nativeMethod" : false
}, {
"methodName" : "doAcquireSharedInterruptibly",
"fileName" : "AbstractQueuedSynchronizer.java",
"lineNumber" : 997,
"className" : "java.util.concurrent.locks.AbstractQueuedSynchronizer",
"nativeMethod" : false
}, {
"methodName" : "acquireSharedInterruptibly",
"fileName" : "AbstractQueuedSynchronizer.java",
"lineNumber" : 1304,
"className" : "java.util.concurrent.locks.AbstractQueuedSynchronizer",
"nativeMethod" : false
}, {
"methodName" : "await",
"fileName" : "CountDownLatch.java",
"lineNumber" : 231,
"className" : "java.util.concurrent.CountDownLatch",
"nativeMethod" : false
}, {
"methodName" : "lambda$jsonThreadDump$0",
"fileName" : "ThreadDumpEndpointDocumentationTests.java",
"lineNumber" : 56,
"className" : "org.springframework.boot.actuate.autoconfigure.endpoint.web.documentation.ThreadDumpEndpointDocumentationTests",
"nativeMethod" : false
}, {
"methodName" : "run",
"lineNumber" : -1,
"className" : "org.springframework.boot.actuate.autoconfigure.endpoint.web.documentation.ThreadDumpEndpointDocumentationTests$$Lambda$2935/334838288",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "Thread.java",
"lineNumber" : 748,
"className" : "java.lang.Thread",
"nativeMethod" : false
} ],
"lockedMonitors" : [ ],
"lockedSynchronizers" : [ {
"className" : "java.util.concurrent.locks.ReentrantLock$NonfairSync",
"identityHashCode" : 269684612
} ],
"lockInfo" : {
"className" : "java.util.concurrent.CountDownLatch$Sync",
"identityHashCode" : 705462828
}
}, {
"threadName" : "http-nio-auto-28-Acceptor",
"threadId" : 3550,
"blockedTime" : -1,
"blockedCount" : 0,
"waitedTime" : -1,
"waitedCount" : 0,
"lockOwnerId" : -1,
"inNative" : true,
"suspended" : false,
"threadState" : "RUNNABLE",
"stackTrace" : [ {
"methodName" : "accept0",
"fileName" : "ServerSocketChannelImpl.java",
"lineNumber" : -2,
"className" : "sun.nio.ch.ServerSocketChannelImpl",
"nativeMethod" : true
}, {
"methodName" : "accept",
"fileName" : "ServerSocketChannelImpl.java",
"lineNumber" : 419,
"className" : "sun.nio.ch.ServerSocketChannelImpl",
"nativeMethod" : false
}, {
"methodName" : "accept",
"fileName" : "ServerSocketChannelImpl.java",
"lineNumber" : 247,
"className" : "sun.nio.ch.ServerSocketChannelImpl",
"nativeMethod" : false
}, {
"methodName" : "serverSocketAccept",
"fileName" : "NioEndpoint.java",
"lineNumber" : 469,
"className" : "org.apache.tomcat.util.net.NioEndpoint",
"nativeMethod" : false
}, {
"methodName" : "serverSocketAccept",
"fileName" : "NioEndpoint.java",
"lineNumber" : 71,
"className" : "org.apache.tomcat.util.net.NioEndpoint",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "Acceptor.java",
"lineNumber" : 95,
"className" : "org.apache.tomcat.util.net.Acceptor",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "Thread.java",
"lineNumber" : 748,
"className" : "java.lang.Thread",
"nativeMethod" : false
} ],
"lockedMonitors" : [ {
"className" : "java.lang.Object",
"identityHashCode" : 968329834,
"lockedStackDepth" : 2,
"lockedStackFrame" : {
"methodName" : "accept",
"fileName" : "ServerSocketChannelImpl.java",
"lineNumber" : 247,
"className" : "sun.nio.ch.ServerSocketChannelImpl",
"nativeMethod" : false
}
} ],
"lockedSynchronizers" : [ ]
}, {
"threadName" : "http-nio-auto-28-ClientPoller",
"threadId" : 3549,
"blockedTime" : -1,
"blockedCount" : 0,
"waitedTime" : -1,
"waitedCount" : 0,
"lockOwnerId" : -1,
"inNative" : true,
"suspended" : false,
"threadState" : "RUNNABLE",
"stackTrace" : [ {
"methodName" : "epollWait",
"fileName" : "EPollArrayWrapper.java",
"lineNumber" : -2,
"className" : "sun.nio.ch.EPollArrayWrapper",
"nativeMethod" : true
}, {
"methodName" : "poll",
"fileName" : "EPollArrayWrapper.java",
"lineNumber" : 269,
"className" : "sun.nio.ch.EPollArrayWrapper",
"nativeMethod" : false
}, {
"methodName" : "doSelect",
"fileName" : "EPollSelectorImpl.java",
"lineNumber" : 93,
"className" : "sun.nio.ch.EPollSelectorImpl",
"nativeMethod" : false
}, {
"methodName" : "lockAndDoSelect",
"fileName" : "SelectorImpl.java",
"lineNumber" : 86,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}, {
"methodName" : "select",
"fileName" : "SelectorImpl.java",
"lineNumber" : 97,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "NioEndpoint.java",
"lineNumber" : 709,
"className" : "org.apache.tomcat.util.net.NioEndpoint$Poller",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "Thread.java",
"lineNumber" : 748,
"className" : "java.lang.Thread",
"nativeMethod" : false
} ],
"lockedMonitors" : [ {
"className" : "sun.nio.ch.Util$3",
"identityHashCode" : 2026559947,
"lockedStackDepth" : 3,
"lockedStackFrame" : {
"methodName" : "lockAndDoSelect",
"fileName" : "SelectorImpl.java",
"lineNumber" : 86,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}
}, {
"className" : "java.util.Collections$UnmodifiableSet",
"identityHashCode" : 976911721,
"lockedStackDepth" : 3,
"lockedStackFrame" : {
"methodName" : "lockAndDoSelect",
"fileName" : "SelectorImpl.java",
"lineNumber" : 86,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}
}, {
"className" : "sun.nio.ch.EPollSelectorImpl",
"identityHashCode" : 143151187,
"lockedStackDepth" : 3,
"lockedStackFrame" : {
"methodName" : "lockAndDoSelect",
"fileName" : "SelectorImpl.java",
"lineNumber" : 86,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}
} ],
"lockedSynchronizers" : [ ]
} ]
}23.1.1. レスポンス構造
レスポンスには、JVM のスレッドの詳細が含まれます。次の表に、レスポンスの構造を示します。
| パス | タイプ | 説明 |
|---|---|---|
|
| JVM のスレッド。 |
|
| スレッドがブロックされた合計回数。 |
|
| スレッドがブロックに費やした時間(ミリ秒)。スレッド競合監視を無効にする場合は -1。 |
|
| スレッドがデーモンスレッドかどうか。Java 9 以降でのみ利用可能。 |
|
| スレッドがネイティブコードを実行しているかどうか。 |
|
| スレッドがブロックされているオブジェクトの説明(ある場合)。 |
|
| スレッドが待機をブロックされているオブジェクト。 |
|
| ロックオブジェクトの完全修飾クラス名。 |
|
| ロックオブジェクトの ID ハッシュコード。 |
|
| このスレッドによってロックされているモニター(ある場合) |
|
| ロックオブジェクトのクラス名。 |
|
| ロックオブジェクトの ID ハッシュコード。 |
|
| モニターがロックされたスタックの深さ。 |
|
| モニターをロックしたスタックフレーム。 |
|
| このスレッドによってロックされたシンクロナイザー。 |
|
| ロックされたシンクロナイザーのクラス名。 |
|
| ロックされたシンクロナイザーの ID ハッシュコード。 |
|
| スレッドがブロックされているオブジェクトを所有するスレッドの ID。スレッドがブロックされていない場合は、 |
|
| スレッドがブロックされているオブジェクトがある場合、そのオブジェクトを所有するスレッドの名前。 |
|
| スレッドの優先度。Java 9 以降でのみ利用可能。 |
|
| スレッドのスタックトレース。 |
|
| 存在する場合、このエントリによって識別される実行ポイントを含むクラスのクラスローダーの名前。Java 9 以降でのみ利用可能。 |
|
| このエントリで識別される実行ポイントを含むクラスの名前。 |
|
| このエントリによって識別される実行ポイントがある場合、それを含むソースファイルの名前。 |
|
| このエントリによって識別される実行ポイントの行番号。不明な場合は負。 |
|
| メソッドの名前。 |
|
| このエントリで識別される実行ポイントがある場合、その実行ポイントを含むモジュールの名前。Java 9 以降でのみ利用可能。 |
|
| このエントリで識別される実行ポイントがある場合、そのバージョンを含むモジュールのバージョン。Java 9 以降でのみ利用可能。 |
|
| 実行ポイントがネイティブメソッドであるかどうか。 |
|
| スレッドが中断されているかどうか。 |
|
| スレッドの ID。 |
|
| スレッドの名前。 |
|
| スレッドの状態( |
|
| スレッドが通知を待機した合計回数。 |
|
| スレッドが待機に費やした時間(ミリ秒)。-1 スレッド競合監視が無効になっている場合 |
23.2. スレッドダンプをテキストとして取得する
スレッドダンプをテキストとして取得するには、次の curl ベースの例に示すように、text/plain を受け入れる /actuator/threaddump に GET リクエストを行います。
$ curl 'http://localhost:8080/actuator/threaddump' -i -X GET \
-H 'Accept: text/plain'結果のレスポンスは次のようになります。
HTTP/1.1 200 OK Content-Type: text/plain;charset=UTF-8 Content-Length: 47476 2020-05-14 23:39:41 Full thread dump OpenJDK 64-Bit Server VM (25.252-b09 mixed mode): "http-nio-auto-28-Acceptor" - Thread t@3550 java.lang.Thread.State: RUNNABLE at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:419) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:247) - locked <39b78a6a> (a java.lang.Object) at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:469) at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:71) at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:95) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-ClientPoller" - Thread t@3549 java.lang.Thread.State: RUNNABLE at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93) at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) - locked <78cad9cb> (a sun.nio.ch.Util$3) - locked <3a3a7d69> (a java.util.Collections$UnmodifiableSet) - locked <8885053> (a sun.nio.ch.EPollSelectorImpl) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:709) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-10" - Thread t@3548 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-9" - Thread t@3547 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-8" - Thread t@3546 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-7" - Thread t@3545 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-6" - Thread t@3544 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-5" - Thread t@3543 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-4" - Thread t@3542 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-3" - Thread t@3541 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-2" - Thread t@3540 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-1" - Thread t@3539 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-BlockPoller" - Thread t@3538 java.lang.Thread.State: RUNNABLE at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93) at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) - locked <2343fb05> (a sun.nio.ch.Util$3) - locked <4afb0b31> (a java.util.Collections$UnmodifiableSet) - locked <3bd0f5> (a sun.nio.ch.EPollSelectorImpl) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) at org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller.run(NioBlockingSelector.java:313) Locked ownable synchronizers: - None "Catalina-utility-2" - Thread t@3537 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <466b29ef> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "container-0" - Thread t@3536 java.lang.Thread.State: TIMED_WAITING at java.lang.Thread.sleep(Native Method) at org.apache.catalina.core.StandardServer.await(StandardServer.java:570) at org.springframework.boot.web.embedded.tomcat.TomcatWebServer$1.run(TomcatWebServer.java:197) Locked ownable synchronizers: - None "Catalina-utility-1" - Thread t@3535 java.lang.Thread.State: TIMED_WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <466b29ef> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "HikariPool-1 connection adder" - Thread t@3443 java.lang.Thread.State: TIMED_WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <7a4c69f4> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1073) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "HikariPool-1 housekeeper" - Thread t@3442 java.lang.Thread.State: TIMED_WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <68fc570f> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "server" - Thread t@3138 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <369e8e9d> (a java.util.concurrent.CountDownLatch$Sync) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836) at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304) at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231) at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:87) at reactor.core.publisher.Mono.block(Mono.java:1678) at org.springframework.boot.web.embedded.netty.NettyWebServer$1.run(NettyWebServer.java:160) Locked ownable synchronizers: - None "pool-14-thread-1" - Thread t@3100 java.lang.Thread.State: RUNNABLE at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-8" - Thread t@2383 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-7" - Thread t@2382 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-6" - Thread t@2381 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-5" - Thread t@2380 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-4" - Thread t@2379 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-3" - Thread t@2378 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-2" - Thread t@2377 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-1" - Thread t@2376 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "nioEventLoopGroup-4-1" - Thread t@1570 java.lang.Thread.State: RUNNABLE at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93) at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) - locked <29a5fdf0> (a io.netty.channel.nio.SelectedSelectionKeySet) - locked <303f32f9> (a java.util.Collections$UnmodifiableSet) - locked <3a714fde> (a sun.nio.ch.EPollSelectorImpl) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101) at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:68) at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:803) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:457) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "nioEventLoopGroup-2-1" - Thread t@909 java.lang.Thread.State: RUNNABLE at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93) at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) - locked <7859d46b> (a io.netty.channel.nio.SelectedSelectionKeySet) - locked <7e15eced> (a java.util.Collections$UnmodifiableSet) - locked <37f4b12c> (a sun.nio.ch.EPollSelectorImpl) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101) at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:68) at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:803) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:457) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "boundedElastic-1" - Thread t@15 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <7cb07b3> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "boundedElastic-evictor-1" - Thread t@14 java.lang.Thread.State: TIMED_WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <318771ad> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "/127.0.0.1:42314 to /127.0.0.1:42969 workers Thread 3" - Thread t@13 java.lang.Thread.State: RUNNABLE at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93) at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) - locked <602491f4> (a sun.nio.ch.Util$3) - locked <72cb310d> (a java.util.Collections$UnmodifiableSet) - locked <2d624678> (a sun.nio.ch.EPollSelectorImpl) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101) at org.gradle.internal.remote.internal.inet.SocketConnection$SocketInputStream.read(SocketConnection.java:185) at com.esotericsoftware.kryo.io.Input.fill(Input.java:146) at com.esotericsoftware.kryo.io.Input.require(Input.java:178) at com.esotericsoftware.kryo.io.Input.readByte(Input.java:295) at org.gradle.internal.serialize.kryo.KryoBackedDecoder.readByte(KryoBackedDecoder.java:82) at org.gradle.internal.remote.internal.hub.InterHubMessageSerializer$MessageReader.read(InterHubMessageSerializer.java:64) at org.gradle.internal.remote.internal.hub.InterHubMessageSerializer$MessageReader.read(InterHubMessageSerializer.java:52) at org.gradle.internal.remote.internal.inet.SocketConnection.receive(SocketConnection.java:81) at org.gradle.internal.remote.internal.hub.MessageHub$ConnectionReceive.run(MessageHub.java:269) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - Locked <78e94dcf> (a java.util.concurrent.ThreadPoolExecutor$Worker) "/127.0.0.1:42314 to /127.0.0.1:42969 workers Thread 2" - Thread t@12 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <27e24060> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at org.gradle.internal.remote.internal.hub.queue.EndPointQueue.take(EndPointQueue.java:49) at org.gradle.internal.remote.internal.hub.MessageHub$ConnectionDispatch.run(MessageHub.java:321) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - Locked <223f3642> (a java.util.concurrent.ThreadPoolExecutor$Worker) "Test worker" - Thread t@11 java.lang.Thread.State: RUNNABLE at sun.management.ThreadImpl.dumpThreads0(Native Method) at sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:454) at org.springframework.boot.actuate.management.ThreadDumpEndpoint.getFormattedThreadDump(ThreadDumpEndpoint.java:51) at org.springframework.boot.actuate.management.ThreadDumpEndpoint.textThreadDump(ThreadDumpEndpoint.java:47) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) at org.springframework.boot.actuate.endpoint.invoke.reflect.ReflectiveOperationInvoker.invoke(ReflectiveOperationInvoker.java:77) at org.springframework.boot.actuate.endpoint.annotation.AbstractDiscoveredOperation.invoke(AbstractDiscoveredOperation.java:60) at org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$ServletWebOperationAdapter.handle(AbstractWebMvcEndpointHandlerMapping.java:305) at org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(AbstractWebMvcEndpointHandlerMapping.java:388) at sun.reflect.GeneratedMethodAccessor548.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:645) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72) at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) at org.springframework.boot.actuate.autoconfigure.endpoint.web.documentation.ThreadDumpEndpointDocumentationTests.textThreadDump(ThreadDumpEndpointDocumentationTests.java:186) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$120/1790441099.apply(Unknown Source) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall$$Lambda$121/1818507846.apply(Unknown Source) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.ExecutableInvoker$$Lambda$234/358919109.apply(Unknown Source) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:212) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$273/2123029078.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:208) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$178/284706674.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$177/1120248930.invoke(Unknown Source) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$176/480836340.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$182/251724271.accept(Unknown Source) at java.util.ArrayList.forEach(ArrayList.java:1257) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$178/284706674.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$177/1120248930.invoke(Unknown Source) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$176/480836340.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$182/251724271.accept(Unknown Source) at java.util.ArrayList.forEach(ArrayList.java:1257) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$178/284706674.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$177/1120248930.invoke(Unknown Source) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$176/480836340.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248) at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211) at org.junit.platform.launcher.core.DefaultLauncher$$Lambda$145/1427429381.accept(Unknown Source) at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at com.sun.proxy.$Proxy2.stop(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:132) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164) at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:413) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - Locked <3e3047e6> (a java.util.concurrent.ThreadPoolExecutor$Worker) "Signal Dispatcher" - Thread t@4 java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "Finalizer" - Thread t@3 java.lang.Thread.State: WAITING at java.lang.Object.wait(Native Method) - waiting on <630dde59> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216) Locked ownable synchronizers: - None "Reference Handler" - Thread t@2 java.lang.Thread.State: WAITING at java.lang.Object.wait(Native Method) - waiting on <48e5c86c> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:502) at java.lang.ref.Reference.tryHandlePending(Reference.java:191) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153) Locked ownable synchronizers: - None