この 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=2022-03-31T13%3A35%3A04.206Z&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" : "2022-03-31T13:35:04.207Z",
    "principal" : "alice",
    "type" : "logout"
  } ]
}

2.1.1. クエリパラメーター

エンドポイントはクエリパラメーターを使用して、返すイベントを制限します。次の表は、サポートされているクエリパラメーターを示しています。

パラメーター 説明

after

指定された時間後に発生したイベントにイベントを制限します。オプション。

principal

指定されたプリンシパルを持つイベントにイベントを制限します。オプション。

type

指定された型のイベントにイベントを制限します。オプション。

2.1.2. レスポンス構造

レスポンスには、クエリに一致したすべての監査イベントの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

events

Array

監査イベントの配列。

events.[].timestamp

String

イベントが発生したときのタイムスタンプ。

events.[].principal

String

イベントをトリガーしたプリンシパル。

events.[].type

String

イベントの型。

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: 1089

{
  "contexts" : {
    "application" : {
      "beans" : {
        "org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletRegistrationConfiguration" : {
          "aliases" : [ ],
          "scope" : "singleton",
          "type" : "org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletRegistrationConfiguration",
          "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 の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

contexts

Object

ID をキーとするアプリケーションコンテキスト。

contexts.*.parentId

String

親アプリケーションコンテキストの ID(存在する場合)。

contexts.*.beans

Object

名前をキーとするアプリケーションコンテキストの Bean。

contexts.*.beans.*.aliases

Array

エイリアスの名前。

contexts.*.beans.*.scope

String

Bean の範囲。

contexts.*.beans.*.type

String

Bean の完全修飾型。

contexts.*.beans.*.resource

String

Bean が定義されたリソース(ある場合)。

contexts.*.beans.*.dependencies

Array

依存関係の名前。

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. レスポンス構造

レスポンスには、アプリケーションのキャッシュの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

cacheManagers

Object

ID をキーとするキャッシュマネージャー。

cacheManagers.*.caches

Object

名前をキーとするアプリケーションコンテキストのキャッシュ。

cacheManagers.*.caches.*.target

String

ネイティブキャッシュの完全修飾名。

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

キャッシュを限定する cacheManager の名前。キャッシュ名が一意の場合は省略できます。

4.2.2. レスポンス構造

レスポンスには、リクエストされたキャッシュの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

name

String

キャッシュ名。

cacheManager

String

キャッシュマネージャー名。

target

String

ネイティブキャッシュの完全修飾名。

4.3. すべてのキャッシュを削除する

使用可能なすべてのキャッシュをクリアするには、次の curl ベースの例に示すように、DELETE を /actuator/caches にリクエストします。

$ curl 'http://localhost:8080/actuator/caches' -i -X DELETE

4.4. 名前によるキャッシュの削除

特定のキャッシュを削除するには、次の curl ベースの例に示すように、DELETE を /actuator/caches/{name} にリクエストします。

$ curl 'http://localhost:8080/actuator/caches/countries?cacheManager=anotherCacheManager' -i -X DELETE
countries という名前の 2 つのキャッシュがあるため、Cache をクリアする必要があることを指定するには、cacheManager を提供する必要があります。

4.4.1. リクエスト構造

リクエストされた名前が単一のキャッシュを識別するのに十分具体的である場合、追加のパラメーターは必要ありません。それ以外の場合は、cacheManager を指定する必要があります。次の表は、サポートされているクエリパラメーターを示しています。

パラメーター 説明

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: 3322

{
  "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" : [ ]
        },
        "WebMvcEndpointManagementContextConfiguration#managementHealthEndpointWebMvcHandlerMapping" : {
          "notMatched" : [ {
            "condition" : "OnManagementPortCondition",
            "message" : "Management Port actual port type (SAME) did not match required type (DIFFERENT)"
          } ],
          "matched" : [ ]
        }
      },
      "unconditionalClasses" : [ "org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration", "org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration" ]
    }
  }
}

5.1.1. レスポンス構造

レスポンスには、アプリケーションの条件評価の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

contexts

Object

ID をキーとするアプリケーションコンテキスト。

contexts.*.positiveMatches

Object

一致した条件を持つクラスとメソッド。

contexts.*.positiveMatches.*.[].condition

String

条件の名前。

contexts.*.positiveMatches.*.[].message

String

条件が一致した理由の詳細。

contexts.*.negativeMatches

Object

一致しなかった条件を持つクラスとメソッド。

contexts.*.negativeMatches.*.notMatched

Array

一致した条件。

contexts.*.negativeMatches.*.notMatched.[].condition

String

条件の名前。

contexts.*.negativeMatches.*.notMatched.[].message

String

条件が一致しなかった理由の詳細。

contexts.*.negativeMatches.*.matched

Array

一致した条件。

contexts.*.negativeMatches.*.matched.[].condition

String

条件の名前。

contexts.*.negativeMatches.*.matched.[].message

String

条件が一致した理由の詳細。

contexts.*.unconditionalClasses

Array

無条件の自動構成クラスの名前(ある場合)。

contexts.*.parentId

String

親アプリケーションコンテキストの ID(存在する場合)。

6. プロパティの構成 (configprops)

configprops エンドポイントは、アプリケーションの @ConfigurationProperties Bean に関する情報を提供します。

6.1. すべての @ConfigurationProperties Bean の取得

すべての @ConfigurationProperties Bean を取得するには、次のカールベースの例に示すように、/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: 3411

{
  "contexts" : {
    "application" : {
      "beans" : {
        "management.endpoints.web.cors-org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties" : {
          "prefix" : "management.endpoints.web.cors",
          "properties" : {
            "allowedOrigins" : [ ],
            "maxAge" : "PT30M",
            "exposedHeaders" : [ ],
            "allowedOriginPatterns" : [ ],
            "allowedHeaders" : [ ],
            "allowedMethods" : [ ]
          },
          "inputs" : {
            "allowedOrigins" : [ ],
            "maxAge" : { },
            "exposedHeaders" : [ ],
            "allowedOriginPatterns" : [ ],
            "allowedHeaders" : [ ],
            "allowedMethods" : [ ]
          }
        },
        "management.endpoints.web-org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties" : {
          "prefix" : "management.endpoints.web",
          "properties" : {
            "pathMapping" : { },
            "exposure" : {
              "include" : [ "*" ],
              "exclude" : [ ]
            },
            "basePath" : "/actuator",
            "discovery" : {
              "enabled" : true
            }
          },
          "inputs" : {
            "pathMapping" : { },
            "exposure" : {
              "include" : [ {
                "value" : "*",
                "origin" : "\"management.endpoints.web.exposure.include\" from property source \"Inlined Test Properties\""
              } ],
              "exclude" : [ ]
            },
            "basePath" : { },
            "discovery" : {
              "enabled" : { }
            }
          }
        },
        "spring.web-org.springframework.boot.autoconfigure.web.WebProperties" : {
          "prefix" : "spring.web",
          "properties" : {
            "localeResolver" : "ACCEPT_HEADER",
            "resources" : {
              "staticLocations" : [ "classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/" ],
              "addMappings" : true,
              "chain" : {
                "cache" : true,
                "compressed" : false,
                "strategy" : {
                  "fixed" : {
                    "enabled" : false,
                    "paths" : [ "/**" ]
                  },
                  "content" : {
                    "enabled" : false,
                    "paths" : [ "/**" ]
                  }
                }
              },
              "cache" : {
                "cachecontrol" : { },
                "useLastModified" : true
              }
            }
          },
          "inputs" : {
            "localeResolver" : { },
            "resources" : {
              "staticLocations" : [ { }, { }, { }, { } ],
              "addMappings" : { },
              "chain" : {
                "cache" : { },
                "compressed" : { },
                "strategy" : {
                  "fixed" : {
                    "enabled" : { },
                    "paths" : [ { } ]
                  },
                  "content" : {
                    "enabled" : { },
                    "paths" : [ { } ]
                  }
                }
              },
              "cache" : {
                "cachecontrol" : { },
                "useLastModified" : { }
              }
            }
          }
        }
      }
    }
  }
}

6.1.1. レスポンス構造

レスポンスには、アプリケーションの @ConfigurationProperties Bean の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

contexts

Object

ID をキーとするアプリケーションコンテキスト。

contexts.*.beans.*

Object

@ConfigurationProperties beans keyed by bean name.

contexts.*.beans.*.prefix

String

Bean のプロパティの名前に適用されるプレフィックス。

contexts.*.beans.*.properties

Object

名前と値のペアとしての Bean のプロパティ。

contexts.*.beans.*.inputs

Object

この Bean にバインドするときに使用される構成プロパティの起源と値。

contexts.*.parentId

String

親アプリケーションコンテキストの ID(存在する場合)。

6.2. プレフィックスによる @ConfigurationProperties Bean の取得

特定のプレフィックスにマップされた @ConfigurationProperties Bean を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/configprops/{prefix} に送信します。

$ curl 'http://localhost:8080/actuator/configprops/spring.jackson' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Disposition: inline;filename=f.txt
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 1215

{
  "contexts" : {
    "application" : {
      "beans" : {
        "spring.jackson-org.springframework.boot.autoconfigure.jackson.JacksonProperties" : {
          "prefix" : "spring.jackson",
          "properties" : {
            "serialization" : {
              "INDENT_OUTPUT" : true
            },
            "defaultPropertyInclusion" : "NON_NULL",
            "visibility" : { },
            "parser" : { },
            "deserialization" : { },
            "generator" : { },
            "mapper" : { }
          },
          "inputs" : {
            "serialization" : {
              "INDENT_OUTPUT" : {
                "value" : "true",
                "origin" : "\"spring.jackson.serialization.indent_output\" from property source \"Inlined Test Properties\""
              }
            },
            "defaultPropertyInclusion" : {
              "value" : "non_null",
              "origin" : "\"spring.jackson.default-property-inclusion\" from property source \"Inlined Test Properties\""
            },
            "visibility" : { },
            "parser" : { },
            "deserialization" : { },
            "generator" : { },
            "mapper" : { }
          }
        }
      }
    }
  }
}
{prefix} は正確である必要はありません。より一般的なプレフィックスは、そのプレフィックスステムにマップされたすべての Bean を返します。

6.2.1. レスポンス構造

レスポンスには、アプリケーションの @ConfigurationProperties Bean の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

contexts

Object

ID をキーとするアプリケーションコンテキスト。

contexts.*.beans.*

Object

@ConfigurationProperties beans keyed by bean name.

contexts.*.beans.*.prefix

String

Bean のプロパティの名前に適用されるプレフィックス。

contexts.*.beans.*.properties

Object

名前と値のペアとしての Bean のプロパティ。

contexts.*.beans.*.inputs

Object

この Bean にバインドするときに使用される構成プロパティの起源と値。

contexts.*.parentId

String

親アプリケーションコンテキストの 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: 891

{
  "activeProfiles" : [ ],
  "propertySources" : [ {
    "name" : "servletContextInitParams",
    "properties" : { }
  }, {
    "name" : "systemProperties",
    "properties" : {
      "java.runtime.name" : {
        "value" : "OpenJDK Runtime Environment"
      },
      "java.vm.version" : {
        "value" : "25.322-b06"
      },
      "java.vm.vendor" : {
        "value" : "Temurin"
      }
    }
  }, {
    "name" : "systemEnvironment",
    "properties" : {
      "JAVA_HOME" : {
        "value" : "/opt/openjdk",
        "origin" : "System Environment Property \"JAVA_HOME\""
      }
    }
  }, {
    "name" : "Config resource 'class path resource [application.properties]' via location 'classpath:/'",
    "properties" : {
      "com.example.cache.max-size" : {
        "value" : "1000",
        "origin" : "class path resource [application.properties] - 1:29"
      }
    }
  } ]
}

7.1.1. レスポンス構造

レスポンスには、アプリケーションの Environment の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

activeProfiles

Array

アクティブなプロファイルの名前(ある場合)。

propertySources

Array

優先度順のプロパティソース。

propertySources.[].name

String

プロパティソースの名前。

propertySources.[].properties

Object

プロパティ名をキーとするプロパティソースのプロパティ。

propertySources.[].properties.*.value

String

プロパティの値。

propertySources.[].properties.*.origin

String

プロパティの起源(ある場合)。

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: 564

{
  "property" : {
    "source" : "Config resource 'class path resource [application.properties]' via location 'classpath:/'",
    "value" : "1000"
  },
  "activeProfiles" : [ ],
  "propertySources" : [ {
    "name" : "servletContextInitParams"
  }, {
    "name" : "systemProperties"
  }, {
    "name" : "systemEnvironment"
  }, {
    "name" : "Config resource 'class path resource [application.properties]' via location 'classpath:/'",
    "property" : {
      "value" : "1000",
      "origin" : "class path resource [application.properties] - 1:29"
    }
  } ]
}

7.2.1. レスポンス構造

レスポンスには、リクエストされたプロパティの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

property

Object

環境のプロパティ(見つかった場合)。

property.source

String

プロパティのソースの名前。

property.value

String

プロパティの値。

activeProfiles

Array

アクティブなプロファイルの名前(ある場合)。

propertySources

Array

優先度順のプロパティソース。

propertySources.[].name

String

プロパティソースの名前。

propertySources.[].property

Object

プロパティソース内のプロパティ(ある場合)。

propertySources.[].property.value

Varies

プロパティの値。

propertySources.[].property.origin

String

プロパティの起源(ある場合)。

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" : "2022-03-31T13:35:03.078Z",
            "installedRank" : 1,
            "executionTime" : 4
          } ]
        }
      }
    }
  }
}

8.1.1. レスポンス構造

レスポンスには、アプリケーションの Flyway 移行の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

contexts

Object

ID をキーとするアプリケーションコンテキスト

contexts.*.flywayBeans.*.migrations

Array

Flyway Bean 名をキーとする、Flyway インスタンスによって実行される移行。

contexts.*.flywayBeans.*.migrations.[].checksum

Number

移行のチェックサム(ある場合)。

contexts.*.flywayBeans.*.migrations.[].description

String

移行の説明(ある場合)。

contexts.*.flywayBeans.*.migrations.[].executionTime

Number

適用された移行のミリ秒単位の実行時間。

contexts.*.flywayBeans.*.migrations.[].installedBy

String

適用された移行をインストールしたユーザー(存在する場合)。

contexts.*.flywayBeans.*.migrations.[].installedOn

String

適用された移行がインストールされたときのタイムスタンプ(ある場合)。

contexts.*.flywayBeans.*.migrations.[].installedRank

Number

適用された移行のランク(ある場合)。後の移行のランクは高くなります。

contexts.*.flywayBeans.*.migrations.[].script

String

移行の実行に使用されるスクリプトの名前(ある場合)。

contexts.*.flywayBeans.*.migrations.[].state

String

移行の状態。(PENDINGABOVE_TARGETBELOW_BASELINEBASELINEIGNOREDMISSING_SUCCESSMISSING_FAILEDSUCCESSUNDONEAVAILABLEFAILEDOUT_OF_ORDERFUTURE_SUCCESSFUTURE_FAILEDOUTDATEDSUPERSEDEDDELETED)

contexts.*.flywayBeans.*.migrations.[].type

String

移行の型。(SCHEMABASELINEDELETESQLSQL_BASELINEUNDO_SQLJDBCJDBC_BASELINEUNDO_JDBCCUSTOMUNDO_CUSTOM)

contexts.*.flywayBeans.*.migrations.[].version

String

移行を適用した後のデータベースのバージョン(ある場合)。

contexts.*.parentId

String

親アプリケーションコンテキストの 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" : 325496897536,
        "free" : 113233457152,
        "threshold" : 10485760,
        "exists" : true
      }
    }
  }
}

9.1.1. レスポンス構造

レスポンスには、アプリケーションの正常性の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

status

String

アプリケーションの全体的なステータス。

components

Object

正常性を構成するコンポーネント。

components.*.status

String

アプリケーションの特定の部分のステータス。

components.*.components

Object

正常性を構成するネストされたコンポーネント。

components.*.details

Object

アプリケーションの特定の部分の正常性の詳細。存在は management.endpoint.health.show-details によって制御されます。

上記のレスポンスフィールドは 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. レスポンス構造

レスポンスには、アプリケーションの正常性の特定のコンポーネントの正常性の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

status

String

アプリケーションの特定の部分のステータス

details

Object

アプリケーションの特定の部分の正常性の詳細。

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. レスポンス構造

レスポンスには、アプリケーションの特定のコンポーネントのインスタンスの正常性の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

status

String

アプリケーションの特定の部分のステータス

details

Object

アプリケーションの特定の部分の正常性の詳細。

10. ヒープダンプ (heapdump)

heapdump エンドポイントは、アプリケーションの JVM からのヒープダンプを提供します。

10.1. ヒープダンプの取得

ヒープダンプを取得するには、/actuator/heapdump に対して GET リクエストを行います。レスポンスはバイナリデータであり、サイズが大きくなる場合があります。その形式は、アプリケーションが実行される JVM によって異なります。HotSpot JVM で実行している場合、形式は HPROF [Oracle] で、OpenJ9 の場合は PHD (英語) です。通常、レスポンスは後で分析できるようにディスクに保存する必要があります。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" : "2022-03-31T13:35:06.002Z",
    "principal" : {
      "name" : "alice"
    },
    "session" : {
      "id" : "fd710d4b-c284-4015-a5a3-2c4c930954c9"
    },
    "request" : {
      "method" : "GET",
      "uri" : "https://api.example.com",
      "headers" : {
        "Accept" : [ "application/json" ]
      }
    },
    "response" : {
      "status" : 200,
      "headers" : {
        "Content-Type" : [ "application/json" ]
      }
    },
    "timeTaken" : 0
  } ]
}

11.1.1. レスポンス構造

レスポンスには、トレースされた HTTP リクエストとレスポンスの交換の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

traces

Array

トレースされた HTTP リクエスト / レスポンス交換の配列。

traces.[].timestamp

String

トレースされた交換が発生したときのタイムスタンプ。

traces.[].principal

Object

交換のプリンシパル(ある場合)。

traces.[].principal.name

String

プリンシパルの名前。

traces.[].request.method

String

リクエストの HTTP メソッド。

traces.[].request.remoteAddress

String

リクエストが受信されたリモートアドレス(わかっている場合)。

traces.[].request.uri

String

リクエストの URI。

traces.[].request.headers

Object

ヘッダー名でキー付けされたリクエストのヘッダー。

traces.[].request.headers.*.[]

Array

ヘッダーの値

traces.[].response.status

Number

レスポンスのステータス

traces.[].response.headers

Object

ヘッダー名でキー付けされたレスポンスのヘッダー。

traces.[].response.headers.*.[]

Array

ヘッダーの値

traces.[].session

Object

交換に関連付けられたセッション(ある場合)。

traces.[].session.id

String

セッションの ID。

traces.[].timeTaken

Number

交換の処理にかかった時間(ミリ秒)。

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: 233

{
  "git" : {
    "commit" : {
      "time" : "+54216-04-16T21:51:32Z",
      "id" : "df027cf"
    },
    "branch" : "main"
  },
  "build" : {
    "version" : "1.0.3",
    "artifact" : "application",
    "group" : "com.example"
  }
}

12.1.1. レスポンス構造

レスポンスには、アプリケーションに関する一般情報が含まれています。レスポンスの各セクションは、InfoContributor によって提供されます。Spring Boot は、build および git の貢献を提供します。

レスポンス構造の構築

次の表に、レスポンスの build セクションの構造を示します。

パス タイプ 説明

artifact

String

アプリケーションのアーティファクト ID(ある場合)。

group

String

アプリケーションのグループ ID(ある場合)。

name

String

アプリケーションの名前(ある場合)。

version

String

アプリケーションのバージョン(ある場合)。

time

Varies

アプリケーションが作成されたときのタイムスタンプ(ある場合)。

Git レスポンス構造

次の表に、レスポンスの git セクションの構造を示します。

パス タイプ 説明

branch

String

Git ブランチの名前(ある場合)。

commit

Object

Git コミットの詳細(ある場合)。

commit.time

Varies

コミットのタイムスタンプ(ある場合)。

commit.id

String

コミットの 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: 962

{
  "contentDescriptor" : {
    "providerVersion" : "5.5.10",
    "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 Content

14. 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: 677

{
  "contexts" : {
    "application" : {
      "liquibaseBeans" : {
        "liquibase" : {
          "changeSets" : [ {
            "author" : "marceloverdijk",
            "changeLog" : "db/changelog/db.changelog-master.yaml",
            "comments" : "",
            "contexts" : [ ],
            "dateExecuted" : "2022-03-31T13:34:59.156Z",
            "deploymentId" : "8733698982",
            "description" : "createTable tableName=customer",
            "execType" : "EXECUTED",
            "id" : "1",
            "labels" : [ ],
            "checksum" : "8:46debf252cce6d7b25e28ddeb9fc4bf6",
            "orderExecuted" : 1
          } ]
        }
      }
    }
  }
}

14.1.1. レスポンス構造

レスポンスには、アプリケーションの Liquibase 変更セットの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

contexts

Object

ID をキーとするアプリケーションコンテキスト

contexts.*.liquibaseBeans.*.changeSets

Array

Bean 名をキーとする Liquibase Bean によって行われた変更セット。

contexts.*.liquibaseBeans.*.changeSets[].author

String

変更セットの作成者。

contexts.*.liquibaseBeans.*.changeSets[].changeLog

String

変更セットを含む変更ログ。

contexts.*.liquibaseBeans.*.changeSets[].comments

String

変更セットに関するコメント。

contexts.*.liquibaseBeans.*.changeSets[].contexts

Array

変更セットのコンテキスト。

contexts.*.liquibaseBeans.*.changeSets[].dateExecuted

String

変更セットが実行されたときのタイムスタンプ。

contexts.*.liquibaseBeans.*.changeSets[].deploymentId

String

変更セットを実行したデプロイの ID。

contexts.*.liquibaseBeans.*.changeSets[].description

String

変更セットの説明。

contexts.*.liquibaseBeans.*.changeSets[].execType

String

変更セットの実行型(EXECUTEDFAILEDSKIPPEDRERANMARK_RAN)。

contexts.*.liquibaseBeans.*.changeSets[].id

String

変更セットの ID。

contexts.*.liquibaseBeans.*.changeSets[].labels

Array

変更セットに関連付けられたラベル。

contexts.*.liquibaseBeans.*.changeSets[].checksum

String

変更セットのチェックサム。

contexts.*.liquibaseBeans.*.changeSets[].orderExecuted

Number

変更セットの実行順序。

contexts.*.liquibaseBeans.*.changeSets[].tag

String

変更セットに関連付けられているタグ(ある場合)。

contexts.*.parentId

String

親アプリケーションコンテキストの 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. レスポンス構造

レスポンスには、アプリケーションのロガーの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

levels

Array

ロギングシステムによるレベルのサポート。

loggers

Object

名前をキーとするロガー。

groups

Object

名前をキーとするロガーグループ

loggers.*.configuredLevel

String

ロガーの構成レベル(ある場合)。

loggers.*.effectiveLevel

String

ロガーの有効レベル。

groups.*.configuredLevel

String

ロガーグループの設定レベル(ある場合)。

groups.*.members

Array

このグループの一部であるロガー

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. レスポンス構造

レスポンスには、リクエストされたロガーの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

configuredLevel

String

ロガーの構成レベル(ある場合)。

effectiveLevel

String

ロガーの有効レベル。

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. レスポンス構造

レスポンスには、リクエストされたグループの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

configuredLevel

String

ロガーグループの設定レベル(ある場合)。

members

Array

このグループの一部であるロガー

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. リクエスト構造

リクエストは、ロガーの望ましいレベルを指定します。次の表に、リクエストの構造を示します。

パス タイプ 説明

configuredLevel

String

ロガーのレベル。レベルをクリアするために省略できます。

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. リクエスト構造

リクエストは、ロガーグループの目的のレベルを指定します。次の表に、リクエストの構造を示します。

パス タイプ 説明

configuredLevel

String

ロガーのレベル。レベルをクリアするために省略できます。

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:36903/actuator/mappings' -i -X GET \
    -H 'accept-encoding: gzip' \
    -H 'user-agent: ReactorNetty/1.0.17' \
    -H 'accept: */*'

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Transfer-Encoding: chunked
Date: Thu, 31 Mar 2022 13:34:53 GMT
Content-Length: 5339

{
  "contexts" : {
    "application" : {
      "mappings" : {
        "dispatcherServlets" : {
          "dispatcherServlet" : [ {
            "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" : "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" : "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/], ServletContext [/]]",
            "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" : "dispatcherServlet",
          "className" : "org.springframework.web.servlet.DispatcherServlet"
        } ]
      }
    }
  }
}

17.1.1. レスポンス構造

レスポンスには、アプリケーションのマッピングの詳細が含まれます。レスポンスで見つかった項目は、Web アプリケーションの型(リアクティブまたはサーブレットベース)によって異なります。次の表に、レスポンスの一般的な要素の構造を示します。

パス タイプ 説明

contexts

Object

ID をキーとするアプリケーションコンテキスト。

contexts.*.mappings

Object

マッピング型によってキー設定されたコンテキスト内のマッピング。

contexts.*.mappings.dispatcherServlets

Object

ディスパッチャーサーブレットマッピング(ある場合)。

contexts.*.mappings.servletFilters

Array

サーブレットフィルターマッピング(ある場合)。

contexts.*.mappings.servlets

Array

サーブレットマッピング(ある場合)。

contexts.*.mappings.dispatcherHandlers

Object

ディスパッチャーハンドラーマッピング(ある場合)。

contexts.*.parentId

String

親アプリケーションコンテキストの ID(存在する場合)。

contexts.*.mappings で見つかる可能性のあるエントリについては、次のセクションで説明します。

17.1.2. ディスパッチャーサーブレットのレスポンス構造

Spring MVC を使用する場合、レスポンスには contexts.*.mappings.dispatcherServlets にあるすべての DispatcherServlet リクエストマッピングの詳細が含まれます。次の表は、レスポンスのこのセクションの構造を示しています。

パス タイプ 説明

*

Array

ディスパッチャーサーブレットマッピング(ある場合)は、ディスパッチャーサーブレット Bean 名によってキー設定されます。

*.[].details

Object

マッピングに関する追加の実装固有の詳細。オプション。

*.[].handler

String

マッピングのハンドラー。

*.[].predicate

String

マッピングの述語。

*.[].details.handlerMethod

Object

このマッピングへのリクエストを処理するメソッドの詳細(ある場合)。

*.[].details.handlerMethod.className

Varies

メソッドのクラスの完全修飾名。

*.[].details.handlerMethod.name

Varies

メソッドの名前。

*.[].details.handlerMethod.descriptor

Varies

Java 言語仕様で指定されているメソッドの記述子。

*.[].details.requestMappingConditions

Object

リクエストマッピング条件の詳細。

*.[].details.requestMappingConditions.consumes

Varies

消費状態の詳細

*.[].details.requestMappingConditions.consumes.[].mediaType

Varies

消費されたメディア型。

*.[].details.requestMappingConditions.consumes.[].negated

Varies

メディア型が否定されるかどうか。

*.[].details.requestMappingConditions.headers

Varies

ヘッダー条件の詳細。

*.[].details.requestMappingConditions.headers.[].name

Varies

ヘッダーの名前。

*.[].details.requestMappingConditions.headers.[].value

Varies

ヘッダーの必須値(ある場合)。

*.[].details.requestMappingConditions.headers.[].negated

Varies

値が否定されるかどうか。

*.[].details.requestMappingConditions.methods

Varies

処理される HTTP メソッド。

*.[].details.requestMappingConditions.params

Varies

params 条件の詳細。

*.[].details.requestMappingConditions.params.[].name

Varies

パラメーターの名前。

*.[].details.requestMappingConditions.params.[].value

Varies

パラメーターの必須値(ある場合)。

*.[].details.requestMappingConditions.params.[].negated

Varies

値が否定されるかどうか。

*.[].details.requestMappingConditions.patterns

Varies

マッピングによって処理されるパスを識別するパターン。

*.[].details.requestMappingConditions.produces

Varies

生産条件の詳細。

*.[].details.requestMappingConditions.produces.[].mediaType

Varies

作成されたメディア型。

*.[].details.requestMappingConditions.produces.[].negated

Varies

メディア型が否定されるかどうか。

17.1.3. サーブレットのレスポンス構造

サーブレットスタックを使用する場合、レスポンスには contexts.*.mappings.servlets の Servlet マッピングの詳細が含まれます。次の表に、レスポンスのこのセクションの構造を示します。

パス タイプ 説明

[].mappings

Array

サーブレットのマッピング。

[].name

String

サーブレットの名前。

[].className

String

サーブレットのクラス名

17.1.4. サーブレットフィルターのレスポンス構造

サーブレットスタックを使用する場合、レスポンスには contexts.*.mappings.servletFilters の Filter マッピングの詳細が含まれます。次の表に、レスポンスのこのセクションの構造を示します。

パス タイプ 説明

[].servletNameMappings

Array

フィルターがマップされるサーブレットの名前。

[].urlPatternMappings

Array

フィルターがマップされる URL パターン。

[].name

String

フィルターの名前。

[].className

String

フィルターのクラス名

17.1.5. ディスパッチャーハンドラーのレスポンス構造

Spring WebFlux を使用する場合、レスポンスには contexts.*.mappings.dispatcherHandlers の DispatcherHandler リクエストマッピングの詳細が含まれます。次の表に、レスポンスのこのセクションの構造を示します。

パス タイプ 説明

*

Array

ディスパッチャーハンドラー Bean 名をキーとするディスパッチャーハンドラーマッピング(ある場合)。

*.[].details

Object

マッピングに関する追加の実装固有の詳細。オプション。

*.[].handler

String

マッピングのハンドラー。

*.[].predicate

String

マッピングの述語。

*.[].details.requestMappingConditions

Object

リクエストマッピング条件の詳細。

*.[].details.requestMappingConditions.consumes

Array

消費状態の詳細

*.[].details.requestMappingConditions.consumes.[].mediaType

String

消費されたメディア型。

*.[].details.requestMappingConditions.consumes.[].negated

Boolean

メディア型が否定されるかどうか。

*.[].details.requestMappingConditions.headers

Array

ヘッダー条件の詳細。

*.[].details.requestMappingConditions.headers.[].name

String

ヘッダーの名前。

*.[].details.requestMappingConditions.headers.[].value

String

ヘッダーの必須値(ある場合)。

*.[].details.requestMappingConditions.headers.[].negated

Boolean

値が否定されるかどうか。

*.[].details.requestMappingConditions.methods

Array

処理される HTTP メソッド。

*.[].details.requestMappingConditions.params

Array

params 条件の詳細。

*.[].details.requestMappingConditions.params.[].name

String

パラメーターの名前。

*.[].details.requestMappingConditions.params.[].value

String

パラメーターの必須値(ある場合)。

*.[].details.requestMappingConditions.params.[].negated

Boolean

値が否定されるかどうか。

*.[].details.requestMappingConditions.patterns

Array

マッピングによって処理されるパスを識別するパターン。

*.[].details.requestMappingConditions.produces

Array

生産条件の詳細。

*.[].details.requestMappingConditions.produces.[].mediaType

String

作成されたメディア型。

*.[].details.requestMappingConditions.produces.[].negated

Boolean

メディア型が否定されるかどうか。

*.[].details.handlerMethod

Object

このマッピングへのリクエストを処理するメソッドの詳細(ある場合)。

*.[].details.handlerMethod.className

String

メソッドのクラスの完全修飾名。

*.[].details.handlerMethod.name

String

メソッドの名前。

*.[].details.handlerMethod.descriptor

String

Java 言語仕様で指定されているメソッドの記述子。

*.[].details.handlerFunction

Object

このマッピングへのリクエストを処理する関数の詳細(ある場合)。

*.[].details.handlerFunction.className

String

関数のクラスの完全修飾名。

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. レスポンス構造

レスポンスには、メトリクス名の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

names

Array

既知のメトリクスの名前。

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.354053119E9
  } ],
  "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. クエリパラメーター

エンドポイントは、クエリパラメーターを使用して、タグを使用してメトリクスにドリルダウンします。次の表に、サポートされている単一のクエリパラメーターを示します。

パラメーター 説明

tag

name:value 形式のドリルダウンに使用するタグ。

18.2.2. レスポンス構造

レスポンスには、メトリクスの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

name

String

メトリクスの名前

description

String

メトリクスの説明

baseUnit

String

メトリクスの基本単位

measurements

Array

メトリクスの測定

measurements[].statistic

String

測定の統計。(TOTALTOTAL_TIMECOUNTMAXVALUEUNKNOWNACTIVE_TASKSDURATION)。

measurements[].value

Number

測定値。

availableTags

Array

ドリルダウンに使用できるタグ。

availableTags[].tag

String

タグの名前。

availableTags[].values

Array

タグの可能な値。

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: 2374

# 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.5432952E7
jvm_memory_used_bytes{area="heap",id="PS Old Gen",} 1.18250408E8
jvm_memory_used_bytes{area="heap",id="PS Eden Space",} 1.56371304E8
jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 1.5036196E8
jvm_memory_used_bytes{area="nonheap",id="Code Cache",} 5.7034496E7
jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 2.1919864E7
# 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",} 5.6623104E7
jvm_memory_committed_bytes{area="heap",id="PS Old Gen",} 6.16562688E8
jvm_memory_committed_bytes{area="heap",id="PS Eden Space",} 2.40123904E8
jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 1.6809984E8
jvm_memory_committed_bytes{area="nonheap",id="Code Cache",} 5.7737216E7
jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 2.5493504E7
# 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",} 465142.0
jvm_buffer_total_capacity_bytes{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",} 465143.0
jvm_buffer_memory_used_bytes{id="mapped",} 0.0
# 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",} 14.0
jvm_buffer_count_buffers{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",} 5.6623104E7
jvm_memory_max_bytes{area="heap",id="PS Old Gen",} 7.16177408E8
jvm_memory_max_bytes{area="heap",id="PS Eden Space",} 2.43269632E8
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

デフォルトのレスポンスコンテンツ型は text/plain;version=0.0.4 です。次のカールベースの例に示すように、適切な Accept ヘッダーを使用して呼び出された場合、エンドポイントは application/openmetrics-text;version=1.0.0 を生成することもできます。

$ curl 'http://localhost:8080/actuator/prometheus' -i -X GET \
    -H 'Accept: application/openmetrics-text; version=1.0.0; charset=utf-8'

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/openmetrics-text;version=1.0.0;charset=utf-8
Content-Length: 2356

# TYPE jvm_memory_used_bytes gauge
# HELP jvm_memory_used_bytes The amount of used memory
jvm_memory_used_bytes{area="heap",id="PS Survivor Space"} 2.5432952E7
jvm_memory_used_bytes{area="heap",id="PS Old Gen"} 1.18250408E8
jvm_memory_used_bytes{area="heap",id="PS Eden Space"} 1.51811664E8
jvm_memory_used_bytes{area="nonheap",id="Metaspace"} 1.5033436E8
jvm_memory_used_bytes{area="nonheap",id="Code Cache"} 5.7007936E7
jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space"} 2.1915976E7
# TYPE jvm_memory_committed_bytes gauge
# HELP jvm_memory_committed_bytes The amount of memory in bytes that is committed for the Java virtual machine to use
jvm_memory_committed_bytes{area="heap",id="PS Survivor Space"} 5.6623104E7
jvm_memory_committed_bytes{area="heap",id="PS Old Gen"} 6.16562688E8
jvm_memory_committed_bytes{area="heap",id="PS Eden Space"} 2.40123904E8
jvm_memory_committed_bytes{area="nonheap",id="Metaspace"} 1.6809984E8
jvm_memory_committed_bytes{area="nonheap",id="Code Cache"} 5.7737216E7
jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space"} 2.5493504E7
# TYPE jvm_buffer_total_capacity_bytes gauge
# HELP jvm_buffer_total_capacity_bytes An estimate of the total capacity of the buffers in this pool
jvm_buffer_total_capacity_bytes{id="direct"} 465142.0
jvm_buffer_total_capacity_bytes{id="mapped"} 0.0
# TYPE jvm_buffer_memory_used_bytes gauge
# HELP jvm_buffer_memory_used_bytes An estimate of the memory that the Java virtual machine is using for this buffer pool
jvm_buffer_memory_used_bytes{id="direct"} 465143.0
jvm_buffer_memory_used_bytes{id="mapped"} 0.0
# TYPE jvm_buffer_count_buffers gauge
# HELP jvm_buffer_count_buffers An estimate of the number of buffers in the pool
jvm_buffer_count_buffers{id="direct"} 14.0
jvm_buffer_count_buffers{id="mapped"} 0.0
# TYPE jvm_memory_max_bytes gauge
# HELP jvm_memory_max_bytes The maximum amount of memory in bytes that can be used for memory management
jvm_memory_max_bytes{area="heap",id="PS Survivor Space"} 5.6623104E7
jvm_memory_max_bytes{area="heap",id="PS Old Gen"} 7.16177408E8
jvm_memory_max_bytes{area="heap",id="PS Eden Space"} 2.43269632E8
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
# EOF

19.1.1. クエリパラメーター

エンドポイントはクエリパラメーターを使用して、返されるサンプルを制限します。次の表は、サポートされているクエリパラメーターを示しています。

パラメーター 説明

includedNames

サンプルを名前と一致するものに制限します。オプション。

19.2. フィルタリングされたメトリクスの取得

特定の名前に一致するメトリクスを取得するには、次のカールベースの例に示すように、includedNames クエリパラメーターを使用して GET リクエストを /actuator/prometheus に送信します。

$ curl 'http://localhost:8080/actuator/prometheus?includedNames=jvm_memory_used_bytes%2Cjvm_memory_committed_bytes' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: text/plain;version=0.0.4;charset=utf-8
Content-Length: 1108

# 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.5432952E7
jvm_memory_used_bytes{area="heap",id="PS Old Gen",} 1.18250408E8
jvm_memory_used_bytes{area="heap",id="PS Eden Space",} 1.56371304E8
jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 1.5037696E8
jvm_memory_used_bytes{area="nonheap",id="Code Cache",} 5.705024E7
jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 2.192156E7
# 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",} 5.6623104E7
jvm_memory_committed_bytes{area="heap",id="PS Old Gen",} 6.16562688E8
jvm_memory_committed_bytes{area="heap",id="PS Eden Space",} 2.40123904E8
jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 1.6809984E8
jvm_memory_committed_bytes{area="nonheap",id="Code Cache",} 5.7737216E7
jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 2.5493504E7

20. Quartz (quartz)

quartz エンドポイントは、Quartz スケジューラによって管理されるジョブとトリガーに関する情報を提供します。

20.1. 登録済みグループの取得

ジョブとトリガーはグループで管理されます。登録されたジョブとトリガーグループのリストを取得するには、次の curl ベースの例に示すように、/actuator/quartz に GET リクエストを送信します。

$ curl 'http://localhost:8080/actuator/quartz' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 120

{
  "jobs" : {
    "groups" : [ "samples", "tests" ]
  },
  "triggers" : {
    "groups" : [ "samples", "DEFAULT" ]
  }
}

20.1.1. レスポンス構造

レスポンスには、登録されたジョブとトリガーのグループ名が含まれます。次の表は、レスポンスの構造を示しています。

パス タイプ 説明

jobs.groups

Array

ジョブグループ名の配列。

triggers.groups

Array

トリガーグループ名の配列。

20.2. 登録されたジョブ名の取得

登録されたジョブ名のリストを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/quartz/jobs に送信します。

$ curl 'http://localhost:8080/actuator/quartz/jobs' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 137

{
  "groups" : {
    "samples" : {
      "jobs" : [ "jobOne", "jobTwo" ]
    },
    "tests" : {
      "jobs" : [ "jobThree" ]
    }
  }
}

20.2.1. レスポンス構造

レスポンスには、各グループの登録済みジョブ名が含まれます。次の表は、レスポンスの構造を示しています。

パス タイプ 説明

groups

Object

名前でキー設定されたジョブグループ。

groups.*.jobs

Array

ジョブ名の配列。

20.3. 登録されたトリガー名の取得

登録されたトリガー名のリストを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/quartz/triggers に送信します。

$ curl 'http://localhost:8080/actuator/quartz/triggers' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 229

{
  "groups" : {
    "samples" : {
      "paused" : false,
      "triggers" : [ "3am-weekdays", "every-day", "once-a-week" ]
    },
    "DEFAULT" : {
      "paused" : false,
      "triggers" : [ "every-hour-tue-thu" ]
    }
  }
}

20.3.1. レスポンス構造

レスポンスには、各グループに登録されたトリガー名が含まれます。次の表は、レスポンスの構造を示しています。

パス タイプ 説明

groups

Object

名前でキー付けされたトリガーグループ。

groups.*.paused

Boolean

このトリガーグループが一時停止されているかどうか。

groups.*.triggers

Array

トリガー名の配列。

20.4. ジョブグループの概要の取得

特定のグループ内のジョブの概要を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/quartz/jobs/{groupName} に送信します。

$ curl 'http://localhost:8080/actuator/quartz/jobs/samples' -i -X GET

前述の例では、samples グループ内のジョブの概要を取得します。結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 201

{
  "group" : "samples",
  "jobs" : {
    "jobOne" : {
      "className" : "org.springframework.scheduling.quartz.DelegatingJob"
    },
    "jobTwo" : {
      "className" : "org.quartz.Job"
    }
  }
}

20.4.1. レスポンス構造

レスポンスには、特定のグループ内のジョブの概要が含まれます。次の表は、レスポンスの構造を示しています。

パス タイプ 説明

group

String

グループの名前。

jobs

Object

名前でキー設定されたジョブの詳細。

jobs.*.className

String

ジョブ実装の完全修飾名。

20.5. トリガーグループの概要を取得する

特定のグループ内のトリガーの概要を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/quartz/triggers/{groupName} に送信します。

$ curl 'http://localhost:8080/actuator/quartz/triggers/tests' -i -X GET

前述の例では、tests グループ内のトリガーの概要を取得します。結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 1268

{
  "group" : "tests",
  "paused" : false,
  "triggers" : {
    "cron" : {
      "3am-week" : {
        "previousFireTime" : "2020-12-04T03:00:00.000+00:00",
        "nextFireTime" : "2020-12-07T03:00:00.000+00:00",
        "priority" : 3,
        "expression" : "0 0 3 ? * 1,2,3,4,5",
        "timeZone" : "Europe/Paris"
      }
    },
    "simple" : {
      "every-day" : {
        "nextFireTime" : "2020-12-04T12:00:00.000+00:00",
        "priority" : 7,
        "interval" : 86400000
      }
    },
    "dailyTimeInterval" : {
      "tue-thu" : {
        "priority" : 5,
        "interval" : 3600000,
        "daysOfWeek" : [ 3, 5 ],
        "startTimeOfDay" : "09:00:00",
        "endTimeOfDay" : "18:00:00"
      }
    },
    "calendarInterval" : {
      "once-a-week" : {
        "previousFireTime" : "2020-12-02T14:00:00.000+00:00",
        "nextFireTime" : "2020-12-08T14:00:00.000+00:00",
        "priority" : 5,
        "interval" : 604800000,
        "timeZone" : "Etc/UTC"
      }
    },
    "custom" : {
      "once-a-year-custom" : {
        "previousFireTime" : "2020-07-14T16:00:00.000+00:00",
        "nextFireTime" : "2021-07-14T16:00:00.000+00:00",
        "priority" : 10,
        "trigger" : "com.example.CustomTrigger@fdsfsd"
      }
    }
  }
}

20.5.1. レスポンス構造

レスポンスには、特定のグループのトリガーの概要が含まれます。トリガー実装固有の詳細が利用可能です。次の表は、レスポンスの構造を示しています。

パス タイプ 説明

group

String

グループの名前。

paused

Boolean

グループが一時停止されているかどうか。

triggers.cron

Object

名前でキー指定された Cron トリガー (存在する場合)。

triggers.simple

Object

名前でキー指定された単純なトリガー(存在する場合)。

triggers.dailyTimeInterval

Object

名前でキー指定された毎日の時間間隔トリガー(存在する場合)。

triggers.calendarInterval

Object

名前でキー指定されたカレンダー間隔トリガー(存在する場合)。

triggers.custom

Object

名前でキー指定されたその他のトリガー(存在する場合)。

triggers.cron.*.previousFireTime

String

トリガーが最後に起動した時刻(ある場合)。

triggers.cron.*.nextFireTime

String

トリガーが次に起動する予定の時刻(ある場合)。

triggers.cron.*.priority

Number

2 つのトリガーのスケジュールされた発動時刻が同じ場合に使用する優先順位。

triggers.cron.*.expression

String

使用する Cron 式。

triggers.cron.*.timeZone

String

式が解決されるタイムゾーン(存在する場合)。

triggers.simple.*.previousFireTime

String

トリガーが最後に起動した時刻(ある場合)。

triggers.simple.*.nextFireTime

String

トリガーが次に起動する予定の時刻(ある場合)。

triggers.simple.*.priority

Number

2 つのトリガーのスケジュールされた発動時刻が同じ場合に使用する優先順位。

triggers.simple.*.interval

Number

2 回の実行間の間隔 (ミリ秒単位)。

triggers.dailyTimeInterval.*.previousFireTime

String

トリガーが最後に起動した時刻(ある場合)。

triggers.dailyTimeInterval.*.nextFireTime

String

トリガーが次に起動する予定の時刻(ある場合)。

triggers.dailyTimeInterval.*.priority

Number

2 つのトリガーのスケジュールされた発動時刻が同じ場合に使用する優先順位。

triggers.dailyTimeInterval.*.interval

Number

次のトリガー繰り返しの時間を計算するために、発火時間に追加される間隔 (ミリ秒単位)。

triggers.dailyTimeInterval.*.daysOfWeek

Array

実行する曜日の配列。

triggers.dailyTimeInterval.*.startTimeOfDay

String

指定された間隔で発射を開始する時刻(ある場合)。

triggers.dailyTimeInterval.*.endTimeOfDay

String

指定された間隔で発射を完了する時刻(ある場合)。

triggers.calendarInterval.*.previousFireTime

String

トリガーが最後に起動した時刻(ある場合)。

triggers.calendarInterval.*.nextFireTime

String

トリガーが次に起動する予定の時刻(ある場合)。

triggers.calendarInterval.*.priority

Number

2 つのトリガーのスケジュールされた発動時刻が同じ場合に使用する優先順位。

triggers.calendarInterval.*.interval

Number

次のトリガー繰り返しの時間を計算するために、発火時間に追加される間隔 (ミリ秒単位)。

triggers.calendarInterval.*.timeZone

String

時間計算が実行されるタイムゾーン(存在する場合)。

triggers.custom.*.previousFireTime

String

トリガーが最後に起動した時刻(ある場合)。

triggers.custom.*.nextFireTime

String

トリガーが次に起動する予定の時刻(ある場合)。

triggers.custom.*.priority

Number

2 つのトリガーのスケジュールされた発動時刻が同じ場合に使用する優先順位。

triggers.custom.*.trigger

String

カスタムトリガーインスタンスの toString 表現。

20.6. ジョブの詳細を取得する

特定のジョブの詳細を取得するには、次の curl ベースの例に示すように、/actuator/quartz/jobs/{groupName}/{jobName} に対して GET リクエストを実行します。

$ curl 'http://localhost:8080/actuator/quartz/jobs/samples/jobOne' -i -X GET

上記の例では、samples グループと jobOne 名で識別されるジョブの詳細を取得します。結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 609

{
  "group" : "samples",
  "name" : "jobOne",
  "description" : "A sample job",
  "className" : "org.springframework.scheduling.quartz.DelegatingJob",
  "durable" : false,
  "requestRecovery" : false,
  "data" : {
    "password" : "******",
    "user" : "admin"
  },
  "triggers" : [ {
    "group" : "samples",
    "name" : "every-day",
    "previousFireTime" : "2020-12-04T03:00:00.000+00:00",
    "nextFireTime" : "2020-12-04T12:00:00.000+00:00",
    "priority" : 7
  }, {
    "group" : "samples",
    "name" : "3am-weekdays",
    "nextFireTime" : "2020-12-07T03:00:00.000+00:00",
    "priority" : 3
  } ]
}

データマップ内のキーが機密情報として識別された場合、その値はサニタイズされます。

20.6.1. レスポンス構造

レスポンスには、ジョブの完全な詳細と、それに関連付けられているトリガーの概要(存在する場合)が含まれます。トリガーは、次回の起動時間と優先度で並べ替えられます。次の表は、レスポンスの構造を示しています。

パス タイプ 説明

group

String

グループの名前。

name

String

ジョブの名前。

description

String

ジョブの説明(ある場合)。

className

String

ジョブ実装の完全修飾名。

durable

Boolean

ジョブが孤立した後も保存されたままにするかどうか。

requestRecovery

Boolean

「リカバリ」または「フェイルオーバー」の状況が発生した場合にジョブを再実行する必要があるかどうか。

data.*

String

ジョブデータは、存在する場合はキー / 値のペアとしてマップされます。

triggers

Array

ジョブに関連付けられているトリガーの配列(存在する場合)。

triggers.[].group

String

トリガーグループの名前。

triggers.[].name

String

トリガーの名前。

triggers.[].previousFireTime

String

トリガーが最後に起動した時刻(ある場合)。

triggers.[].nextFireTime

String

トリガーが次に起動する予定の時刻(ある場合)。

triggers.[].priority

Number

2 つのトリガーのスケジュールされた発動時刻が同じ場合に使用する優先順位。

20.7. トリガーの詳細を取得する

特定のトリガーに関する詳細を取得するには、次の curl ベースの例に示すように、/actuator/quartz/triggers/{groupName}/{triggerName} に対して GET リクエストを実行します。

$ curl 'http://localhost:8080/actuator/quartz/triggers/samples/example' -i -X GET

上記の例では、samples グループと example 名で識別されるトリガーの詳細を取得します。

20.7.1. 共通レスポンス構造

レスポンスには共通の構造と、トリガーの型に固有の追加オブジェクトがあります。サポートされている型は次の 5 つです。

  •  CronTriggercron 

  •  SimpleTriggersimple 

  •  DailyTimeIntervalTriggerdailyTimeInterval 

  •  CalendarIntervalTriggercalendarInterval 

  • その他のトリガー実装の場合は custom 

次の表は、レスポンスの共通要素の構造を示しています。

パス タイプ 説明

group

String

グループの名前。

name

String

トリガーの名前。

description

String

トリガーの説明(ある場合)。

state

String

トリガーの状態(NONENORMALPAUSEDCOMPLETEERRORBLOCKED)。

type

String

トリガーの型 (calendarIntervalcroncustomdailyTimeIntervalsimple)。型固有の詳細を含むオブジェクトのキーを決定します。

calendarName

String

このトリガーに関連付けられているカレンダーの名前(存在する場合)。

startTime

String

トリガーが有効になる時間(ある場合)。

endTime

String

残りの繰り返しの有無に関係なく、トリガーが繰り返しを終了する時間。

previousFireTime

String

トリガーが最後に起動した時刻(ある場合)。

nextFireTime

String

トリガーが次に起動する予定の時刻(ある場合)。

priority

Number

2 つのトリガーのスケジュールされた発動時刻が同じ場合に使用する優先順位。

finalFireTime

String

トリガーが最後に発動する時刻(ある場合)。

data

Object

名前でキー付けされたジョブデータマップ (存在する場合)。

calendarInterval

Object

カレンダー時間間隔トリガーの詳細(存在する場合)。type が calendarInterval の場合に存在します。

custom

Object

カスタムトリガーの詳細 (存在する場合)。type が custom の場合に存在します。

cron

Object

Cron トリガーの詳細 (存在する場合)。type が cron の場合に存在します。

dailyTimeInterval

Object

毎日の時間間隔トリガーの詳細(ある場合)。type が dailyTimeInterval の場合に存在します。

simple

Object

単純なトリガーの詳細(ある場合)。type が simple の場合に存在します。

20.7.2. Cron トリガーレスポンス構造

cron トリガーは、トリガーをいつ起動するかを決定するために使用される cron 式を定義します。このようなトリガー実装の結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 490

{
  "group" : "samples",
  "name" : "example",
  "description" : "Example trigger",
  "state" : "NORMAL",
  "type" : "cron",
  "calendarName" : "bankHolidays",
  "startTime" : "2020-11-30T17:00:00.000+00:00",
  "endTime" : "2020-12-30T03:00:00.000+00:00",
  "previousFireTime" : "2020-12-04T03:00:00.000+00:00",
  "nextFireTime" : "2020-12-07T03:00:00.000+00:00",
  "priority" : 3,
  "data" : { },
  "cron" : {
    "expression" : "0 0 3 ? * 1,2,3,4,5",
    "timeZone" : "Europe/Paris"
  }
}

レスポンスの大部分は、すべてのトリガー型に共通です。レスポンスの共通要素の構造については、前に説明しました。次の表は、cron トリガーに固有のレスポンス部分の構造を示しています。

パス タイプ 説明

cron

Object

Cron トリガー固有の詳細。

cron.expression

String

使用する Cron 式。

cron.timeZone

String

式が解決されるタイムゾーン(存在する場合)。

20.7.3. シンプルなトリガーレスポンス構造

シンプルなトリガーは、特定の時点でジョブを起動するために使用され、オプションで指定された間隔で繰り返し実行されます。このようなトリガー実装の結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 549

{
  "group" : "samples",
  "name" : "example",
  "description" : "Example trigger",
  "state" : "NORMAL",
  "type" : "simple",
  "calendarName" : "bankHolidays",
  "startTime" : "2020-11-30T17:00:00.000+00:00",
  "endTime" : "2020-12-30T03:00:00.000+00:00",
  "previousFireTime" : "2020-12-04T03:00:00.000+00:00",
  "nextFireTime" : "2020-12-07T03:00:00.000+00:00",
  "priority" : 7,
  "finalFireTime" : "2020-12-29T17:00:00.000+00:00",
  "data" : { },
  "simple" : {
    "interval" : 86400000,
    "repeatCount" : -1,
    "timesTriggered" : 0
  }
}

レスポンスの大部分は、すべてのトリガー型に共通です。レスポンスの共通要素の構造については、前に説明しました。次の表は、単純なトリガーに固有のレスポンス部分の構造を示しています。

パス タイプ 説明

simple

Object

シンプルなトリガー固有の詳細。

simple.interval

Number

2 回の実行間の間隔 (ミリ秒単位)。

simple.repeatCount

Number

トリガーを繰り返す回数。無期限に繰り返す場合は -1 を指定します。

simple.timesTriggered

Number

トリガーがすでに起動された回数。

20.7.4. 毎日の時間間隔トリガーレスポンス構造

毎日の時間間隔トリガーは、毎日繰り返される時間間隔に基づいてジョブを起動するために使用されます。このようなトリガー実装の結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 667

{
  "group" : "samples",
  "name" : "example",
  "description" : "Example trigger",
  "state" : "PAUSED",
  "type" : "dailyTimeInterval",
  "calendarName" : "bankHolidays",
  "startTime" : "2020-11-30T17:00:00.000+00:00",
  "endTime" : "2020-12-30T03:00:00.000+00:00",
  "previousFireTime" : "2020-12-04T03:00:00.000+00:00",
  "nextFireTime" : "2020-12-07T03:00:00.000+00:00",
  "priority" : 5,
  "finalFireTime" : "2020-12-30T18:00:00.000+00:00",
  "data" : { },
  "dailyTimeInterval" : {
    "interval" : 3600000,
    "daysOfWeek" : [ 3, 5 ],
    "startTimeOfDay" : "09:00:00",
    "endTimeOfDay" : "18:00:00",
    "repeatCount" : -1,
    "timesTriggered" : 0
  }
}

レスポンスの大部分は、すべてのトリガー型に共通です。レスポンスの共通要素の構造については、前に説明しました。次の表は、毎日の時間間隔トリガーに固有のレスポンス部分の構造を示しています。

パス タイプ 説明

dailyTimeInterval

Object

毎日の時間間隔トリガーの特定の詳細。

dailyTimeInterval.interval

Number

次のトリガー繰り返しの時間を計算するために、発火時間に追加される間隔 (ミリ秒単位)。

dailyTimeInterval.daysOfWeek

Array

実行する曜日の配列。

dailyTimeInterval.startTimeOfDay

String

指定された間隔で発射を開始する時刻(ある場合)。

dailyTimeInterval.endTimeOfDay

String

指定された間隔で発射を完了する時刻(ある場合)。

dailyTimeInterval.repeatCount

Number

トリガーを繰り返す回数。無期限に繰り返す場合は -1 を指定します。

dailyTimeInterval.timesTriggered

Number

トリガーがすでに起動された回数。

20.7.5. カレンダー間隔トリガーレスポンス構造

カレンダー間隔トリガーは、カレンダーの時間間隔の繰り返しに基づいてジョブを起動するために使用されます。このようなトリガー実装の結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 669

{
  "group" : "samples",
  "name" : "example",
  "description" : "Example trigger",
  "state" : "NORMAL",
  "type" : "calendarInterval",
  "calendarName" : "bankHolidays",
  "startTime" : "2020-11-30T17:00:00.000+00:00",
  "endTime" : "2020-12-30T03:00:00.000+00:00",
  "previousFireTime" : "2020-12-04T03:00:00.000+00:00",
  "nextFireTime" : "2020-12-07T03:00:00.000+00:00",
  "priority" : 5,
  "finalFireTime" : "2020-12-28T17:00:00.000+00:00",
  "data" : { },
  "calendarInterval" : {
    "interval" : 604800000,
    "timeZone" : "Etc/UTC",
    "timesTriggered" : 0,
    "preserveHourOfDayAcrossDaylightSavings" : false,
    "skipDayIfHourDoesNotExist" : false
  }
}

レスポンスの大部分は、すべてのトリガー型に共通です。レスポンスの共通要素の構造については、前に説明しました。次の表は、カレンダー間隔トリガーに固有のレスポンス部分の構造を示しています。

パス タイプ 説明

calendarInterval

Object

カレンダー間隔トリガー固有の詳細。

calendarInterval.interval

Number

次のトリガー繰り返しの時間を計算するために、発火時間に追加される間隔 (ミリ秒単位)。

calendarInterval.timeZone

String

時間計算が実行されるタイムゾーン(存在する場合)。

calendarInterval.timesTriggered

Number

トリガーがすでに起動された回数。

calendarInterval.preserveHourOfDayAcrossDaylightSavings

Boolean

夏時間の移行に関係なく、同じ時間にトリガーを起動するかどうか。

calendarInterval.skipDayIfHourDoesNotExist

Boolean

特定の日にその時間が存在しない場合、スキップするかどうか。

20.7.6. カスタムトリガーレスポンス構造

カスタムトリガーは、その他の実装です。このようなトリガー実装の結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 457

{
  "group" : "samples",
  "name" : "example",
  "description" : "Example trigger.",
  "state" : "NORMAL",
  "type" : "custom",
  "calendarName" : "bankHolidays",
  "startTime" : "2020-11-30T17:00:00.000+00:00",
  "endTime" : "2020-12-30T03:00:00.000+00:00",
  "previousFireTime" : "2020-12-04T03:00:00.000+00:00",
  "nextFireTime" : "2020-12-07T03:00:00.000+00:00",
  "priority" : 10,
  "custom" : {
    "trigger" : "com.example.CustomTrigger@fdsfsd"
  }
}

レスポンスの大部分は、すべてのトリガー型に共通です。レスポンスの共通要素の構造については、前に説明しました。次の表は、カスタムトリガーに固有のレスポンス部分の構造を示しています。

パス タイプ 説明

custom

Object

カスタムトリガー固有の詳細。

custom.trigger

String

カスタムトリガーインスタンスの toString 表現。

21. スケジュールされたタスク (scheduledtasks)

scheduledtasks エンドポイントは、アプリケーションのスケジュールされたタスクに関する情報を提供します。

21.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: 629

{
  "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@1d7b4b5c"
  } ]
}

21.1.1. レスポンス構造

レスポンスには、アプリケーションのスケジュールされたタスクの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

cron

Array

cron タスク(ある場合)。

cron.[].runnable.target

String

実行されるターゲット。

cron.[].expression

String

cron 式。

fixedDelay

Array

遅延タスクがある場合は修正されました。

fixedDelay.[].runnable.target

String

実行されるターゲット。

fixedDelay.[].initialDelay

Number

最初の実行までの遅延(ミリ秒単位)。

fixedDelay.[].interval

Number

最後の実行の終了から次の実行の開始までの間隔(ミリ秒単位)。

fixedRate

Array

固定レートタスク(ある場合)。

fixedRate.[].runnable.target

String

実行されるターゲット。

fixedRate.[].interval

Number

各実行の開始間の間隔(ミリ秒単位)。

fixedRate.[].initialDelay

Number

最初の実行までの遅延(ミリ秒単位)。

custom

Array

カスタムトリガーがある場合は、タスク。

custom.[].runnable.target

String

実行されるターゲット。

custom.[].trigger

String

タスクのトリガー。

22. セッション (sessions)

sessions エンドポイントは、Spring Session によって管理されるアプリケーションの HTTP セッションに関する情報を提供します。

22.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" : "816f5dba-37dd-4165-a7b7-00a4969ff643",
    "attributeNames" : [ ],
    "creationTime" : "2022-03-31T11:34:51.238Z",
    "lastAccessedTime" : "2022-03-31T13:34:39.238Z",
    "maxInactiveInterval" : 1800,
    "expired" : false
  }, {
    "id" : "4db5efcc-99cb-4d05-a52c-b49acfbb7ea9",
    "attributeNames" : [ ],
    "creationTime" : "2022-03-31T08:34:51.238Z",
    "lastAccessedTime" : "2022-03-31T13:34:14.238Z",
    "maxInactiveInterval" : 1800,
    "expired" : false
  }, {
    "id" : "450e01d9-371e-4645-88e1-f85520810173",
    "attributeNames" : [ ],
    "creationTime" : "2022-03-31T01:34:51.238Z",
    "lastAccessedTime" : "2022-03-31T13:34:06.238Z",
    "maxInactiveInterval" : 1800,
    "expired" : false
  } ]
}

22.1.1. クエリパラメーター

エンドポイントはクエリパラメーターを使用して、返すセッションを制限します。次の表に、単一の必須クエリパラメーターを示します。

パラメーター 説明

username

ユーザーの名前。

22.1.2. レスポンス構造

レスポンスには、一致するセッションの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

sessions

Array

指定されたユーザー名のセッション。

sessions.[].id

String

セッションの ID。

sessions.[].attributeNames

Array

セッションに保存されている属性の名前。

sessions.[].creationTime

String

セッションが作成されたときのタイムスタンプ。

sessions.[].lastAccessedTime

String

セッションが最後にアクセスされたときのタイムスタンプ。

sessions.[].maxInactiveInterval

Number

セッションが期限切れになるまでの最大非アクティブ期間(秒単位)。

sessions.[].expired

Boolean

セッションの有効期限が切れているかどうか。

22.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" : "2022-03-31T08:34:51.238Z",
  "lastAccessedTime" : "2022-03-31T13:34:14.238Z",
  "maxInactiveInterval" : 1800,
  "expired" : false
}

22.2.1. レスポンス構造

レスポンスには、リクエストされたセッションの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

id

String

セッションの ID。

attributeNames

Array

セッションに保存されている属性の名前。

creationTime

String

セッションが作成されたときのタイムスタンプ。

lastAccessedTime

String

セッションが最後にアクセスされたときのタイムスタンプ。

maxInactiveInterval

Number

セッションが期限切れになるまでの最大非アクティブ期間(秒単位)。

expired

Boolean

セッションの有効期限が切れているかどうか。

22.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 であるセッションを削除します。

23. シャットダウン (shutdown)

shutdown エンドポイントは、アプリケーションをシャットダウンするために使用されます。

23.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..."
}

23.1.1. レスポンス構造

レスポンスには、シャットダウンリクエストの結果の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

message

String

リクエストの結果を説明するメッセージ。

24. アプリケーションの起動 (startup)

startup エンドポイントは、アプリケーションの起動シーケンスに関する情報を提供します。

24.1. アプリケーションの起動手順の取得

アプリケーションの起動ステップは、スナップショットとして取得するか (GET)、バッファから排出する (POST) ことができます。

24.1.1. アプリケーション起動ステップのスナップショットを取得する

アプリケーションの起動フェーズ中にこれまでに記録されたステップを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/startup に送信します。

$ curl 'http://localhost:8080/actuator/startup' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 839

{
  "springBootVersion" : "2.6.6",
  "timeline" : {
    "startTime" : "2022-03-31T13:34:53.754Z",
    "events" : [ {
      "endTime" : "2022-03-31T13:34:53.949Z",
      "duration" : "PT0S",
      "startupStep" : {
        "name" : "spring.beans.instantiate",
        "id" : 3,
        "tags" : [ {
          "key" : "beanName",
          "value" : "homeController"
        } ],
        "parentId" : 2
      },
      "startTime" : "2022-03-31T13:34:53.949Z"
    }, {
      "endTime" : "2022-03-31T13:34:53.949Z",
      "duration" : "PT0S",
      "startupStep" : {
        "name" : "spring.boot.application.starting",
        "id" : 2,
        "tags" : [ {
          "key" : "mainApplicationClass",
          "value" : "com.example.startup.StartupApplication"
        } ]
      },
      "startTime" : "2022-03-31T13:34:53.949Z"
    } ]
  }
}

24.1.2. アプリケーションの起動手順の実行

アプリケーションの起動フェーズ中にこれまでに記録されたステップを排出して返すには、次の curl ベースの例に示すように、POST リクエストを /actuator/startup に作成します。

$ curl 'http://localhost:8080/actuator/startup' -i -X POST

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 847

{
  "springBootVersion" : "2.6.6",
  "timeline" : {
    "startTime" : "2022-03-31T13:34:53.754Z",
    "events" : [ {
      "endTime" : "2022-03-31T13:34:53.894Z",
      "duration" : "PT0.002S",
      "startupStep" : {
        "name" : "spring.beans.instantiate",
        "id" : 1,
        "tags" : [ {
          "key" : "beanName",
          "value" : "homeController"
        } ],
        "parentId" : 0
      },
      "startTime" : "2022-03-31T13:34:53.892Z"
    }, {
      "endTime" : "2022-03-31T13:34:53.894Z",
      "duration" : "PT0.016S",
      "startupStep" : {
        "name" : "spring.boot.application.starting",
        "id" : 0,
        "tags" : [ {
          "key" : "mainApplicationClass",
          "value" : "com.example.startup.StartupApplication"
        } ]
      },
      "startTime" : "2022-03-31T13:34:53.878Z"
    } ]
  }
}

24.1.3. レスポンス構造

レスポンスには、アプリケーションの起動手順の詳細が含まれます。次の表は、レスポンスの構造を示しています。

パス タイプ 説明

springBootVersion

String

このアプリケーションの Spring Boot バージョン。

timeline.startTime

String

アプリケーションの開始時刻。

timeline.events

Array

アプリケーションの起動中にこれまでに収集されたステップの配列。

timeline.events.[].startTime

String

このイベントの開始時のタイムスタンプ。

timeline.events.[].endTime

String

このイベントの終了のタイムスタンプ。

timeline.events.[].duration

String

このイベントの正確な期間。

timeline.events.[].startupStep.name

String

StartupStep の名前。

timeline.events.[].startupStep.id

Number

この StartupStep の ID。

timeline.events.[].startupStep.parentId

Number

この StartupStep の親 ID。

timeline.events.[].startupStep.tags

Array

追加のステップ情報を含むキーと値のペアの配列。

timeline.events.[].startupStep.tags[].key

String

StartupStep タグのキー。

timeline.events.[].startupStep.tags[].value

String

StartupStep タグの値。

25. スレッドダンプ (threaddump)

threaddump エンドポイントは、アプリケーションの JVM からのスレッドダンプを提供します。

25.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: 7699

{
  "threads" : [ {
    "threadName" : "Thread-88",
    "threadId" : 1632,
    "blockedTime" : -1,
    "blockedCount" : 0,
    "waitedTime" : -1,
    "waitedCount" : 0,
    "lockOwnerId" : -1,
    "inNative" : false,
    "suspended" : false,
    "threadState" : "RUNNABLE",
    "stackTrace" : [ ],
    "lockedMonitors" : [ ],
    "lockedSynchronizers" : [ ]
  }, {
    "threadName" : "server",
    "threadId" : 1628,
    "blockedTime" : -1,
    "blockedCount" : 0,
    "waitedTime" : -1,
    "waitedCount" : 1,
    "lockName" : "java.util.concurrent.CountDownLatch$Sync@1ff949a0",
    "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" : "blockingGet",
      "fileName" : "BlockingSingleSubscriber.java",
      "lineNumber" : 87,
      "className" : "reactor.core.publisher.BlockingSingleSubscriber",
      "nativeMethod" : false
    }, {
      "methodName" : "block",
      "fileName" : "Mono.java",
      "lineNumber" : 1707,
      "className" : "reactor.core.publisher.Mono",
      "nativeMethod" : false
    }, {
      "methodName" : "run",
      "fileName" : "NettyWebServer.java",
      "lineNumber" : 180,
      "className" : "org.springframework.boot.web.embedded.netty.NettyWebServer$1",
      "nativeMethod" : false
    } ],
    "lockedMonitors" : [ ],
    "lockedSynchronizers" : [ ],
    "lockInfo" : {
      "className" : "java.util.concurrent.CountDownLatch$Sync",
      "identityHashCode" : 536431008
    }
  }, {
    "threadName" : "pool-32-thread-1",
    "threadId" : 1618,
    "blockedTime" : -1,
    "blockedCount" : 0,
    "waitedTime" : -1,
    "waitedCount" : 1,
    "lockOwnerId" : -1,
    "inNative" : false,
    "suspended" : false,
    "threadState" : "RUNNABLE",
    "stackTrace" : [ {
      "methodName" : "siftUp",
      "fileName" : "ScheduledThreadPoolExecutor.java",
      "lineNumber" : 886,
      "className" : "java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue",
      "nativeMethod" : false
    }, {
      "methodName" : "offer",
      "fileName" : "ScheduledThreadPoolExecutor.java",
      "lineNumber" : 1020,
      "className" : "java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue",
      "nativeMethod" : false
    }, {
      "methodName" : "add",
      "fileName" : "ScheduledThreadPoolExecutor.java",
      "lineNumber" : 1037,
      "className" : "java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue",
      "nativeMethod" : false
    }, {
      "methodName" : "add",
      "fileName" : "ScheduledThreadPoolExecutor.java",
      "lineNumber" : 809,
      "className" : "java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue",
      "nativeMethod" : false
    }, {
      "methodName" : "delayedExecute",
      "fileName" : "ScheduledThreadPoolExecutor.java",
      "lineNumber" : 328,
      "className" : "java.util.concurrent.ScheduledThreadPoolExecutor",
      "nativeMethod" : false
    }, {
      "methodName" : "schedule",
      "fileName" : "ScheduledThreadPoolExecutor.java",
      "lineNumber" : 533,
      "className" : "java.util.concurrent.ScheduledThreadPoolExecutor",
      "nativeMethod" : false
    }, {
      "methodName" : "schedule",
      "fileName" : "Executors.java",
      "lineNumber" : 729,
      "className" : "java.util.concurrent.Executors$DelegatedScheduledExecutorService",
      "nativeMethod" : false
    }, {
      "methodName" : "schedule",
      "fileName" : "ReschedulingRunnable.java",
      "lineNumber" : 82,
      "className" : "org.springframework.scheduling.concurrent.ReschedulingRunnable",
      "nativeMethod" : false
    }, {
      "methodName" : "run",
      "fileName" : "ReschedulingRunnable.java",
      "lineNumber" : 101,
      "className" : "org.springframework.scheduling.concurrent.ReschedulingRunnable",
      "nativeMethod" : false
    }, {
      "methodName" : "call",
      "fileName" : "Executors.java",
      "lineNumber" : 511,
      "className" : "java.util.concurrent.Executors$RunnableAdapter",
      "nativeMethod" : false
    }, {
      "methodName" : "run",
      "fileName" : "FutureTask.java",
      "lineNumber" : 266,
      "className" : "java.util.concurrent.FutureTask",
      "nativeMethod" : false
    }, {
      "methodName" : "access$201",
      "fileName" : "ScheduledThreadPoolExecutor.java",
      "lineNumber" : 180,
      "className" : "java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask",
      "nativeMethod" : false
    }, {
      "methodName" : "run",
      "fileName" : "ScheduledThreadPoolExecutor.java",
      "lineNumber" : 293,
      "className" : "java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask",
      "nativeMethod" : false
    }, {
      "methodName" : "runWorker",
      "fileName" : "ThreadPoolExecutor.java",
      "lineNumber" : 1149,
      "className" : "java.util.concurrent.ThreadPoolExecutor",
      "nativeMethod" : false
    }, {
      "methodName" : "run",
      "fileName" : "ThreadPoolExecutor.java",
      "lineNumber" : 624,
      "className" : "java.util.concurrent.ThreadPoolExecutor$Worker",
      "nativeMethod" : false
    }, {
      "methodName" : "run",
      "fileName" : "Thread.java",
      "lineNumber" : 750,
      "className" : "java.lang.Thread",
      "nativeMethod" : false
    } ],
    "lockedMonitors" : [ {
      "className" : "java.lang.Object",
      "identityHashCode" : 1567080025,
      "lockedStackDepth" : 7,
      "lockedStackFrame" : {
        "methodName" : "schedule",
        "fileName" : "ReschedulingRunnable.java",
        "lineNumber" : 82,
        "className" : "org.springframework.scheduling.concurrent.ReschedulingRunnable",
        "nativeMethod" : false
      }
    }, {
      "className" : "java.lang.Object",
      "identityHashCode" : 1567080025,
      "lockedStackDepth" : 8,
      "lockedStackFrame" : {
        "methodName" : "run",
        "fileName" : "ReschedulingRunnable.java",
        "lineNumber" : 101,
        "className" : "org.springframework.scheduling.concurrent.ReschedulingRunnable",
        "nativeMethod" : false
      }
    } ],
    "lockedSynchronizers" : [ {
      "className" : "java.util.concurrent.ThreadPoolExecutor$Worker",
      "identityHashCode" : 670306568
    }, {
      "className" : "java.util.concurrent.locks.ReentrantLock$NonfairSync",
      "identityHashCode" : 841493401
    } ]
  } ]
}

25.1.1. レスポンス構造

レスポンスには、JVM のスレッドの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

threads

Array

JVM のスレッド。

threads.[].blockedCount

Number

スレッドがブロックされた合計回数。

threads.[].blockedTime

Number

スレッドがブロックに費やした時間(ミリ秒)。スレッド競合監視を無効にする場合は -1。

threads.[].daemon

Boolean

スレッドがデーモンスレッドかどうか。Java 9 以降でのみ利用可能。

threads.[].inNative

Boolean

スレッドがネイティブコードを実行しているかどうか。

threads.[].lockName

String

スレッドがブロックされているオブジェクトの説明(ある場合)。

threads.[].lockInfo

Object

スレッドが待機をブロックされているオブジェクト。

threads.[].lockInfo.className

String

ロックオブジェクトの完全修飾クラス名。

threads.[].lockInfo.identityHashCode

Number

ロックオブジェクトの ID ハッシュコード。

threads.[].lockedMonitors

Array

このスレッドによってロックされているモニター(ある場合)

threads.[].lockedMonitors.[].className

String

ロックオブジェクトのクラス名。

threads.[].lockedMonitors.[].identityHashCode

Number

ロックオブジェクトの ID ハッシュコード。

threads.[].lockedMonitors.[].lockedStackDepth

Number

モニターがロックされたスタックの深さ。

threads.[].lockedMonitors.[].lockedStackFrame

Object

モニターをロックしたスタックフレーム。

threads.[].lockedSynchronizers

Array

このスレッドによってロックされたシンクロナイザー。

threads.[].lockedSynchronizers.[].className

String

ロックされたシンクロナイザーのクラス名。

threads.[].lockedSynchronizers.[].identityHashCode

Number

ロックされたシンクロナイザーの ID ハッシュコード。

threads.[].lockOwnerId

Number

スレッドがブロックされているオブジェクトを所有するスレッドの ID。スレッドがブロックされていない場合は、-1

threads.[].lockOwnerName

String

スレッドがブロックされているオブジェクトがある場合、そのオブジェクトを所有するスレッドの名前。

threads.[].priority

Number

スレッドの優先度。Java 9 以降でのみ利用可能。

threads.[].stackTrace

Array

スレッドのスタックトレース。

threads.[].stackTrace.[].classLoaderName

String

存在する場合、このエントリによって識別される実行ポイントを含むクラスのクラスローダーの名前。Java 9 以降でのみ利用可能。

threads.[].stackTrace.[].className

String

このエントリで識別される実行ポイントを含むクラスの名前。

threads.[].stackTrace.[].fileName

String

このエントリによって識別される実行ポイントがある場合、それを含むソースファイルの名前。

threads.[].stackTrace.[].lineNumber

Number

このエントリによって識別される実行ポイントの行番号。不明な場合は負。

threads.[].stackTrace.[].methodName

String

メソッドの名前。

threads.[].stackTrace.[].moduleName

String

このエントリで識別される実行ポイントがある場合、その実行ポイントを含むモジュールの名前。Java 9 以降でのみ利用可能。

threads.[].stackTrace.[].moduleVersion

String

このエントリで識別される実行ポイントがある場合、そのバージョンを含むモジュールのバージョン。Java 9 以降でのみ利用可能。

threads.[].stackTrace.[].nativeMethod

Boolean

実行ポイントがネイティブメソッドであるかどうか。

threads.[].suspended

Boolean

スレッドが中断されているかどうか。

threads.[].threadId

Number

スレッドの ID。

threads.[].threadName

String

スレッドの名前。

threads.[].threadState

String

スレッドの状態(NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED)。

threads.[].waitedCount

Number

スレッドが通知を待機した合計回数。

threads.[].waitedTime

Number

スレッドが待機に費やした時間(ミリ秒)。-1 スレッド競合監視が無効になっている場合

25.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: 65452

2022-03-31 13:35:06
Full thread dump OpenJDK 64-Bit Server VM (25.322-b06 mixed mode):

"server" - Thread t@1628
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <1ff949a0> (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:1707)
	at org.springframework.boot.web.embedded.netty.NettyWebServer$1.run(NettyWebServer.java:180)

   Locked ownable synchronizers:
	- None

"pool-32-thread-1" - Thread t@1618
   java.lang.Thread.State: RUNNABLE
	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:750)

   Locked ownable synchronizers:
	- None

"HikariPool-1 housekeeper" - Thread t@1613
   java.lang.Thread.State: TIMED_WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <41ae0dcf> (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:750)

   Locked ownable synchronizers:
	- None

"http-nio-auto-74-Acceptor" - Thread t@1601
   java.lang.Thread.State: RUNNABLE
	at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
	at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:421)
	at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:249)
	- locked <7f970b69> (a java.lang.Object)
	at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:546)
	at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:79)
	at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:129)
	at java.lang.Thread.run(Thread.java:750)

   Locked ownable synchronizers:
	- None

"http-nio-auto-74-Poller" - Thread t@1600
   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 <5a930ec2> (a sun.nio.ch.Util$3)
	- locked <ff2f879> (a java.util.Collections$UnmodifiableSet)
	- locked <3e035c3d> (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:807)
	at java.lang.Thread.run(Thread.java:750)

   Locked ownable synchronizers:
	- None

"http-nio-auto-74-exec-10" - Thread t@1599
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <7908c4d7> (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:146)
	at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:750)

   Locked ownable synchronizers:
	- None

"http-nio-auto-74-exec-9" - Thread t@1598
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <7908c4d7> (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:146)
	at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:750)

   Locked ownable synchronizers:
	- None

"http-nio-auto-74-exec-8" - Thread t@1597
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <7908c4d7> (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:146)
	at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:750)

   Locked ownable synchronizers:
	- None

"http-nio-auto-74-exec-7" - Thread t@1596
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <7908c4d7> (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:146)
	at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:750)

   Locked ownable synchronizers:
	- None

"http-nio-auto-74-exec-6" - Thread t@1595
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <7908c4d7> (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:146)
	at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:750)

   Locked ownable synchronizers:
	- None

"http-nio-auto-74-exec-5" - Thread t@1594
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <7908c4d7> (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:146)
	at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:750)

   Locked ownable synchronizers:
	- None

"http-nio-auto-74-exec-4" - Thread t@1593
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <7908c4d7> (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:146)
	at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:750)

   Locked ownable synchronizers:
	- None

"http-nio-auto-74-exec-3" - Thread t@1592
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <7908c4d7> (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:146)
	at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:750)

   Locked ownable synchronizers:
	- None

"http-nio-auto-74-exec-2" - Thread t@1591
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <7908c4d7> (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:146)
	at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:750)

   Locked ownable synchronizers:
	- None

"http-nio-auto-74-exec-1" - Thread t@1590
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <7908c4d7> (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:146)
	at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:750)

   Locked ownable synchronizers:
	- None

"Catalina-utility-2" - Thread t@1589
   java.lang.Thread.State: TIMED_WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <3b2f302a> (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:750)

   Locked ownable synchronizers:
	- None

"container-0" - Thread t@1588
   java.lang.Thread.State: TIMED_WAITING
	at java.lang.Thread.sleep(Native Method)
	at org.apache.catalina.core.StandardServer.await(StandardServer.java:563)
	at org.springframework.boot.web.embedded.tomcat.TomcatWebServer$1.run(TomcatWebServer.java:197)

   Locked ownable synchronizers:
	- None

"Catalina-utility-1" - Thread t@1587
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <3b2f302a> (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:750)

   Locked ownable synchronizers:
	- None

"reactor-http-epoll-8" - Thread t@1306
   java.lang.Thread.State: RUNNABLE
	at io.netty.channel.epoll.Native.epollWait(Native Method)
	at io.netty.channel.epoll.Native.epollWait(Native.java:193)
	at io.netty.channel.epoll.Native.epollWait(Native.java:186)
	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:986)
	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:750)

   Locked ownable synchronizers:
	- None

"reactor-http-epoll-7" - Thread t@1305
   java.lang.Thread.State: RUNNABLE
	at io.netty.channel.epoll.Native.epollWait(Native Method)
	at io.netty.channel.epoll.Native.epollWait(Native.java:193)
	at io.netty.channel.epoll.Native.epollWait(Native.java:186)
	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:986)
	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:750)

   Locked ownable synchronizers:
	- None

"reactor-http-epoll-6" - Thread t@1304
   java.lang.Thread.State: RUNNABLE
	at io.netty.channel.epoll.Native.epollWait(Native Method)
	at io.netty.channel.epoll.Native.epollWait(Native.java:193)
	at io.netty.channel.epoll.Native.epollWait(Native.java:186)
	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:986)
	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:750)

   Locked ownable synchronizers:
	- None

"reactor-http-epoll-5" - Thread t@1303
   java.lang.Thread.State: RUNNABLE
	at io.netty.channel.epoll.Native.epollWait(Native Method)
	at io.netty.channel.epoll.Native.epollWait(Native.java:193)
	at io.netty.channel.epoll.Native.epollWait(Native.java:186)
	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:986)
	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:750)

   Locked ownable synchronizers:
	- None

"reactor-http-epoll-4" - Thread t@1302
   java.lang.Thread.State: RUNNABLE
	at io.netty.channel.epoll.Native.epollWait(Native Method)
	at io.netty.channel.epoll.Native.epollWait(Native.java:193)
	at io.netty.channel.epoll.Native.epollWait(Native.java:186)
	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:986)
	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:750)

   Locked ownable synchronizers:
	- None

"reactor-http-epoll-3" - Thread t@1301
   java.lang.Thread.State: RUNNABLE
	at io.netty.channel.epoll.Native.epollWait(Native Method)
	at io.netty.channel.epoll.Native.epollWait(Native.java:193)
	at io.netty.channel.epoll.Native.epollWait(Native.java:186)
	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:986)
	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:750)

   Locked ownable synchronizers:
	- None

"reactor-http-epoll-2" - Thread t@1300
   java.lang.Thread.State: RUNNABLE
	at io.netty.channel.epoll.Native.epollWait(Native Method)
	at io.netty.channel.epoll.Native.epollWait(Native.java:193)
	at io.netty.channel.epoll.Native.epollWait(Native.java:186)
	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:986)
	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:750)

   Locked ownable synchronizers:
	- None

"reactor-http-epoll-1" - Thread t@1299
   java.lang.Thread.State: RUNNABLE
	at io.netty.channel.epoll.Native.epollWait(Native Method)
	at io.netty.channel.epoll.Native.epollWait(Native.java:193)
	at io.netty.channel.epoll.Native.epollWait(Native.java:186)
	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:986)
	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:750)

   Locked ownable synchronizers:
	- None

"boundedElastic-2" - Thread t@1297
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <23062606> (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:750)

   Locked ownable synchronizers:
	- None

"Keep-Alive-Timer" - Thread t@1188
   java.lang.Thread.State: TIMED_WAITING
	at java.lang.Thread.sleep(Native Method)
	at sun.net.www.http.KeepAliveCache.run(KeepAliveCache.java:172)
	at java.lang.Thread.run(Thread.java:750)

   Locked ownable synchronizers:
	- None

"boundedElastic-1" - Thread t@867
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <217cba63> (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:750)

   Locked ownable synchronizers:
	- None

"parallel-8" - Thread t@596
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <6ab97f6e> (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:750)

   Locked ownable synchronizers:
	- None

"boundedElastic-evictor-1" - Thread t@558
   java.lang.Thread.State: TIMED_WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <1dd10a7f> (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:750)

   Locked ownable synchronizers:
	- None

"parallel-7" - Thread t@557
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <c577a1b> (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:750)

   Locked ownable synchronizers:
	- None

"parallel-6" - Thread t@518
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <48bc7650> (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:750)

   Locked ownable synchronizers:
	- None

"parallel-5" - Thread t@478
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <69df3226> (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:750)

   Locked ownable synchronizers:
	- None

"nioEventLoopGroup-10-2" - Thread t@283
   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 <7cc84f90> (a io.netty.channel.nio.SelectedSelectionKeySet)
	- locked <4bf875b0> (a java.util.Collections$UnmodifiableSet)
	- locked <605d8469> (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:813)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:460)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	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:750)

   Locked ownable synchronizers:
	- None

"nioEventLoopGroup-10-1" - Thread t@282
   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 <7083d446> (a io.netty.channel.nio.SelectedSelectionKeySet)
	- locked <4e89a109> (a java.util.Collections$UnmodifiableSet)
	- locked <4654189d> (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:813)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:460)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	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:750)

   Locked ownable synchronizers:
	- None

"nioEventLoopGroup-8-2" - Thread t@257
   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 <4a26a2f2> (a io.netty.channel.nio.SelectedSelectionKeySet)
	- locked <24696e14> (a java.util.Collections$UnmodifiableSet)
	- locked <276b0279> (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:813)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:460)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	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:750)

   Locked ownable synchronizers:
	- None

"nioEventLoopGroup-8-1" - Thread t@256
   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 <411d76f9> (a io.netty.channel.nio.SelectedSelectionKeySet)
	- locked <3e537d1a> (a java.util.Collections$UnmodifiableSet)
	- locked <5125ad0a> (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:813)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:460)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	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:750)

   Locked ownable synchronizers:
	- None

"nioEventLoopGroup-6-2" - Thread t@234
   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 <2ea2159d> (a io.netty.channel.nio.SelectedSelectionKeySet)
	- locked <4a2140e> (a java.util.Collections$UnmodifiableSet)
	- locked <21bc022d> (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:813)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:460)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	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:750)

   Locked ownable synchronizers:
	- None

"nioEventLoopGroup-6-1" - Thread t@233
   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 <5d8da6ed> (a io.netty.channel.nio.SelectedSelectionKeySet)
	- locked <633d4e3c> (a java.util.Collections$UnmodifiableSet)
	- locked <772b2431> (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:813)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:460)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	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:750)

   Locked ownable synchronizers:
	- None

"nioEventLoopGroup-4-1" - Thread t@161
   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 <36c7ed93> (a io.netty.channel.nio.SelectedSelectionKeySet)
	- locked <6cd9f68> (a java.util.Collections$UnmodifiableSet)
	- locked <f086d23> (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:813)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:460)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	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:750)

   Locked ownable synchronizers:
	- None

"nioEventLoopGroup-4-2" - Thread t@160
   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 <212cca5f> (a io.netty.channel.nio.SelectedSelectionKeySet)
	- locked <288e109c> (a java.util.Collections$UnmodifiableSet)
	- locked <4252fc3a> (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:813)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:460)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	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:750)

   Locked ownable synchronizers:
	- None

"parallel-4" - Thread t@115
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <e7ff026> (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:750)

   Locked ownable synchronizers:
	- None

"nioEventLoopGroup-2-2" - Thread t@72
   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 <4946ad84> (a io.netty.channel.nio.SelectedSelectionKeySet)
	- locked <11144ec0> (a java.util.Collections$UnmodifiableSet)
	- locked <44f2c3f4> (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:813)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:460)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	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:750)

   Locked ownable synchronizers:
	- None

"nioEventLoopGroup-2-1" - Thread t@71
   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 <357de58c> (a io.netty.channel.nio.SelectedSelectionKeySet)
	- locked <49ab542a> (a java.util.Collections$UnmodifiableSet)
	- locked <7afa7191> (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:813)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:460)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	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:750)

   Locked ownable synchronizers:
	- None

"parallel-3" - Thread t@19
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <2845f059> (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:750)

   Locked ownable synchronizers:
	- None

"parallel-2" - Thread t@15
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <724e2158> (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:750)

   Locked ownable synchronizers:
	- None

"parallel-1" - Thread t@14
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <6157213f> (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:750)

   Locked ownable synchronizers:
	- None

"/127.0.0.1:53652 to /127.0.0.1:33753 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 <4888a27d> (a sun.nio.ch.Util$3)
	- locked <4f48440d> (a java.util.Collections$UnmodifiableSet)
	- locked <4c0ff85d> (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:270)
	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:750)

   Locked ownable synchronizers:
	- Locked <2ddc8ecb> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"/127.0.0.1:53652 to /127.0.0.1:33753 workers Thread 2" - Thread t@12
   java.lang.Thread.State: WAITING
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for <1489663a> (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:322)
	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:750)

   Locked ownable synchronizers:
	- Locked <1fe20588> (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:496)
	at sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:484)
	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:74)
	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:353)
	at org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(AbstractWebMvcEndpointHandlerMapping.java:458)
	at sun.reflect.GeneratedMethodAccessor329.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:205)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
	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:497)
	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:584)
	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:199)
	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:725)
	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$138/738417235.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$139/1633417395.apply(Unknown Source)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
	at org.junit.jupiter.engine.execution.ExecutableInvoker$$Lambda$289/1384270042.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$7(TestMethodTestDescriptor.java:214)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$328/1699408254.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:210)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$228/30104610.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$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$227/1758664395.invoke(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$226/300259659.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:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$232/1583323218.accept(Unknown Source)
	at java.util.ArrayList.forEach(ArrayList.java:1259)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$228/30104610.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$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$227/1758664395.invoke(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$226/300259659.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:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$232/1583323218.accept(Unknown Source)
	at java.util.ArrayList.forEach(ArrayList.java:1259)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$228/30104610.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$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$227/1758664395.invoke(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$226/300259659.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:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator$$Lambda$181/1584886834.accept(Unknown Source)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
	at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
	at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)
	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:133)
	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:414)
	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:750)

   Locked ownable synchronizers:
	- Locked <add0edd> (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 <147ae28e> (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 <27043d4c> (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