This API documentation describes Spring Boot Actuators web endpoints.
1. Overview
Before you proceed, you should read the following topics:
In order to get the correct JSON responses documented below, Jackson must be available. |
1.1. URLs
By default, all web endpoints are available beneath the path /actuator
with URLs of
the form /actuator/{id}
. The /actuator
base path can be configured by using the
management.endpoints.web.base-path
property, as shown in the following example:
management.endpoints.web.base-path=/manage
The preceding application.properties
example changes the form of the endpoint URLs from
/actuator/{id}
to /manage/{id}
. For example, the URL info
endpoint would become
/manage/info
.
1.2. Timestamps
All timestamps that are consumed by the endpoints, either as query parameters or in the request body, must be formatted as an offset date and time as specified in ISO 8601.
2. Audit Events (auditevents
)
The auditevents
endpoint provides information about the application’s audit events.
2.1. Retrieving Audit Events
To retrieve the audit events, make a GET
request to /actuator/auditevents
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/auditevents?principal=alice&after=2023-01-19T14%3A12%3A55.203Z&type=logout' -i -X GET
The preceding example retrieves logout
events for the principal, alice
, that occurred after 09:37 on 7 November 2017 in the UTC timezone.
The resulting response is similar to the following:
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 121
{
"events" : [ {
"timestamp" : "2023-01-19T14:12:55.204Z",
"principal" : "alice",
"type" : "logout"
} ]
}
2.1.1. Query Parameters
The endpoint uses query parameters to limit the events that it returns. The following table shows the supported query parameters:
Parameter | Description |
---|---|
|
Restricts the events to those that occurred after the given time. Optional. |
|
Restricts the events to those with the given principal. Optional. |
|
Restricts the events to those with the given type. Optional. |
2.1.2. Response Structure
The response contains details of all of the audit events that matched the query. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
An array of audit events. |
|
|
The timestamp of when the event occurred. |
|
|
The principal that triggered the event. |
|
|
The type of the event. |
3. Beans (beans
)
The beans
endpoint provides information about the application’s beans.
3.1. Retrieving the Beans
To retrieve the beans, make a GET
request to /actuator/beans
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/beans' -i -X GET
The resulting response is similar to the following:
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. Response Structure
The response contains details of the application’s beans. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Application contexts keyed by id. |
|
|
Id of the parent application context, if any. |
|
|
Beans in the application context keyed by name. |
|
|
Names of any aliases. |
|
|
Scope of the bean. |
|
|
Fully qualified type of the bean. |
|
|
Resource in which the bean was defined, if any. |
|
|
Names of any dependencies. |
4. Caches (caches
)
The caches
endpoint provides access to the application’s caches.
4.1. Retrieving All Caches
To retrieve the application’s caches, make a GET
request to /actuator/caches
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/caches' -i -X GET
The resulting response is similar to the following:
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. Response Structure
The response contains details of the application’s caches. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Cache managers keyed by id. |
|
|
Caches in the application context keyed by name. |
|
|
Fully qualified name of the native cache. |
4.2. Retrieving Caches by Name
To retrieve a cache by name, make a GET
request to /actuator/caches/{name}
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/caches/cities' -i -X GET
The preceding example retrieves information about the cache named cities
.
The resulting response is similar to the following:
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. Query Parameters
If the requested name is specific enough to identify a single cache, no extra parameter is required.
Otherwise, the cacheManager
must be specified.
The following table shows the supported query parameters:
Parameter | Description |
---|---|
|
Name of the cacheManager to qualify the cache. May be omitted if the cache name is unique. |
4.3. Evict All Caches
To clear all available caches, make a DELETE
request to /actuator/caches
as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/caches' -i -X DELETE
4.4. Evict a Cache by Name
To evict a particular cache, make a DELETE
request to /actuator/caches/{name}
as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/caches/countries?cacheManager=anotherCacheManager' -i -X DELETE
As there are two caches named countries , the cacheManager has to be provided to specify which Cache should be cleared.
|
4.4.1. Request Structure
If the requested name is specific enough to identify a single cache, no extra parameter is required.
Otherwise, the cacheManager
must be specified.
The following table shows the supported query parameters:
Parameter | Description |
---|---|
|
Name of the cacheManager to qualify the cache. May be omitted if the cache name is unique. |
5. Conditions Evaluation Report (conditions
)
The conditions
endpoint provides information about the evaluation of conditions on configuration and auto-configuration classes.
5.1. Retrieving the Report
To retrieve the report, make a GET
request to /actuator/conditions
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/conditions' -i -X GET
The resulting response is similar to the following:
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. Response Structure
The response contains details of the application’s condition evaluation. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Application contexts keyed by id. |
|
|
Classes and methods with conditions that were matched. |
|
|
Name of the condition. |
|
|
Details of why the condition was matched. |
|
|
Classes and methods with conditions that were not matched. |
|
|
Conditions that were matched. |
|
|
Name of the condition. |
|
|
Details of why the condition was not matched. |
|
|
Conditions that were matched. |
|
|
Name of the condition. |
|
|
Details of why the condition was matched. |
|
|
Names of unconditional auto-configuration classes if any. |
|
|
Id of the parent application context, if any. |
6. Configuration Properties (configprops
)
The configprops
endpoint provides information about the application’s @ConfigurationProperties
beans.
6.1. Retrieving All @ConfigurationProperties Beans
To retrieve all of the @ConfigurationProperties
beans, make a GET
request to /actuator/configprops
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/configprops' -i -X GET
The resulting response is similar to the following:
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. Response Structure
The response contains details of the application’s @ConfigurationProperties
beans.
The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Application contexts keyed by id. |
|
|
|
|
|
Prefix applied to the names of the bean’s properties. |
|
|
Properties of the bean as name-value pairs. |
|
|
Origin and value of the configuration property used when binding to this bean. |
|
|
Id of the parent application context, if any. |
6.2. Retrieving @ConfigurationProperties Beans By Prefix
To retrieve the @ConfigurationProperties
beans mapped under a certain prefix, make a GET
request to /actuator/configprops/{prefix}
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/configprops/spring.jackson' -i -X GET
The resulting response is similar to the following:
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" : { }
}
}
}
}
}
}
The {prefix} does not need to be exact, a more general prefix will return all beans mapped under that prefix stem.
|
6.2.1. Response Structure
The response contains details of the application’s @ConfigurationProperties
beans.
The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Application contexts keyed by id. |
|
|
|
|
|
Prefix applied to the names of the bean’s properties. |
|
|
Properties of the bean as name-value pairs. |
|
|
Origin and value of the configuration property used when binding to this bean. |
|
|
Id of the parent application context, if any. |
7. Environment (env
)
The env
endpoint provides information about the application’s Environment
.
7.1. Retrieving the Entire Environment
To retrieve the entire environment, make a GET
request to /actuator/env
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/env' -i -X GET
The resulting response is similar to the following:
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 892
{
"activeProfiles" : [ ],
"propertySources" : [ {
"name" : "servletContextInitParams",
"properties" : { }
}, {
"name" : "systemProperties",
"properties" : {
"java.runtime.name" : {
"value" : "OpenJDK Runtime Environment"
},
"java.vm.version" : {
"value" : "25.362-b09"
},
"java.vm.vendor" : {
"value" : "BellSoft"
}
}
}, {
"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. Response Structure
The response contains details of the application’s Environment
.
The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Names of the active profiles, if any. |
|
|
Property sources in order of precedence. |
|
|
Name of the property source. |
|
|
Properties in the property source keyed by property name. |
|
|
Value of the property. |
|
|
Origin of the property, if any. |
7.2. Retrieving a Single Property
To retrieve a single property, make a GET
request to /actuator/env/{property.name}
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/env/com.example.cache.max-size' -i -X GET
The preceding example retrieves information about the property named com.example.cache.max-size
.
The resulting response is similar to the following:
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. Response Structure
The response contains details of the requested property. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Property from the environment, if found. |
|
|
Name of the source of the property. |
|
|
Value of the property. |
|
|
Names of the active profiles, if any. |
|
|
Property sources in order of precedence. |
|
|
Name of the property source. |
|
|
Property in the property source, if any. |
|
|
Value of the property. |
|
|
Origin of the property, if any. |
8. Flyway (flyway
)
The flyway
endpoint provides information about database migrations performed by Flyway.
8.1. Retrieving the Migrations
To retrieve the migrations, make a GET
request to /actuator/flyway
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/flyway' -i -X GET
The resulting response is similar to the following:
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" : "2023-01-19T14:13:00.115Z",
"installedRank" : 1,
"executionTime" : 2
} ]
}
}
}
}
}
8.1.1. Response Structure
The response contains details of the application’s Flyway migrations. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Application contexts keyed by id |
|
|
Migrations performed by the Flyway instance, keyed by Flyway bean name. |
|
|
Checksum of the migration, if any. |
|
|
Description of the migration, if any. |
|
|
Execution time in milliseconds of an applied migration. |
|
|
User that installed the applied migration, if any. |
|
|
Timestamp of when the applied migration was installed, if any. |
|
|
Rank of the applied migration, if any. Later migrations have higher ranks. |
|
|
Name of the script used to execute the migration, if any. |
|
|
State of the migration. ( |
|
|
Type of the migration. ( |
|
|
Version of the database after applying the migration, if any. |
|
|
Id of the parent application context, if any. |
9. Health (health
)
The health
endpoint provides detailed information about the health of the application.
9.1. Retrieving the Health of the Application
To retrieve the health of the application, make a GET
request to /actuator/health
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/health' -i -X GET \
-H 'Accept: application/json'
The resulting response is similar to the following:
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" : 325426569216,
"free" : 236722896896,
"threshold" : 10485760,
"exists" : true
}
}
}
}
9.1.1. Response Structure
The response contains details of the health of the application. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Overall status of the application. |
|
|
The components that make up the health. |
|
|
Status of a specific part of the application. |
|
|
The nested components that make up the health. |
|
|
Details of the health of a specific part of the application. Presence is controlled by |
The response fields above are for the V3 API.
If you need to return V2 JSON you should use an accept header or application/vnd.spring-boot.actuator.v2+json
|
9.2. Retrieving the Health of a Component
To retrieve the health of a particular component of the application’s health, make a GET
request to /actuator/health/{component}
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/health/db' -i -X GET \
-H 'Accept: application/json'
The resulting response is similar to the following:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 101
{
"status" : "UP",
"details" : {
"database" : "H2",
"validationQuery" : "isValid()"
}
}
9.2.1. Response Structure
The response contains details of the health of a particular component of the application’s health. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Status of a specific part of the application |
|
|
Details of the health of a specific part of the application. |
9.3. Retrieving the Health of a Nested Component
If a particular component contains other nested components (as the broker
indicator in the example above), the health of such a nested component can be retrieved by issuing a GET
request to /actuator/health/{component}/{subcomponent}
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/health/broker/us1' -i -X GET \
-H 'Accept: application/json'
The resulting response is similar to the following:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 66
{
"status" : "UP",
"details" : {
"version" : "1.0.2"
}
}
Components of an application’s health may be nested arbitrarily deep depending on the application’s health indicators and how they have been grouped.
The health endpoint supports any number of /{component}
identifiers in the URL to allow the health of a component at any depth to be retrieved.
9.3.1. Response Structure
The response contains details of the health of an instance of a particular component of the application. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Status of a specific part of the application |
|
|
Details of the health of a specific part of the application. |
10. Heap Dump (heapdump
)
The heapdump
endpoint provides a heap dump from the application’s JVM.
10.1. Retrieving the Heap Dump
To retrieve the heap dump, make a GET
request to /actuator/heapdump
.
The response is binary data and can be large.
Its format depends upon the JVM on which the application is running.
When running on a HotSpot JVM the format is HPROF
and on OpenJ9 it is PHD.
Typically, you should save the response to disk for subsequent analysis.
When using curl, this can be achieved by using the -O
option, as shown in the following example:
$ curl 'http://localhost:8080/actuator/heapdump' -O
The preceding example results in a file named heapdump
being written to the current working directory.
11. HTTP Trace (httptrace
)
The httptrace
endpoint provides information about HTTP request-response exchanges.
11.1. Retrieving the Traces
To retrieve the traces, make a GET
request to /actuator/httptrace
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/httptrace' -i -X GET
The resulting response is similar to the following:
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 503
{
"traces" : [ {
"timestamp" : "2023-01-19T14:13:01.437Z",
"principal" : {
"name" : "alice"
},
"session" : {
"id" : "dbd97968-7948-435e-937f-606638cc5a1c"
},
"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. Response Structure
The response contains details of the traced HTTP request-response exchanges. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
An array of traced HTTP request-response exchanges. |
|
|
Timestamp of when the traced exchange occurred. |
|
|
Principal of the exchange, if any. |
|
|
Name of the principal. |
|
|
HTTP method of the request. |
|
|
Remote address from which the request was received, if known. |
|
|
URI of the request. |
|
|
Headers of the request, keyed by header name. |
|
|
Values of the header |
|
|
Status of the response |
|
|
Headers of the response, keyed by header name. |
|
|
Values of the header |
|
|
Session associated with the exchange, if any. |
|
|
ID of the session. |
|
|
Time, in milliseconds, taken to handle the exchange. |
12. Info (info
)
The info
endpoint provides general information about the application.
12.1. Retrieving the Info
To retrieve the information about the application, make a GET
request to /actuator/info
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/info' -i -X GET
The resulting response is similar to the following:
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 231
{
"git" : {
"commit" : {
"time" : "2023-01-19T14:13:01Z",
"id" : "df027cf"
},
"branch" : "main"
},
"build" : {
"version" : "1.0.3",
"artifact" : "application",
"group" : "com.example"
}
}
12.1.1. Response Structure
The response contains general information about the application.
Each section of the response is contributed by an InfoContributor
.
Spring Boot provides several contributors that are described below.
Build Response Structure
The following table describe the structure of the build
section of the response:
Path | Type | Description |
---|---|---|
|
|
Artifact ID of the application, if any. |
|
|
Group ID of the application, if any. |
|
|
Name of the application, if any. |
|
|
Version of the application, if any. |
|
|
Timestamp of when the application was built, if any. |
Git Response Structure
The following table describes the structure of the git
section of the response:
Path | Type | Description |
---|---|---|
|
|
Name of the Git branch, if any. |
|
|
Details of the Git commit, if any. |
|
|
Timestamp of the commit, if any. |
|
|
ID of the commit, if any. |
This is the "simple" output. The contributor can also be configured to output all available data. |
13. Spring Integration graph (integrationgraph
)
The integrationgraph
endpoint exposes a graph containing all Spring Integration components.
13.1. Retrieving the Spring Integration Graph
To retrieve the information about the application, make a GET
request to /actuator/integrationgraph
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/integrationgraph' -i -X GET
The resulting response is similar to the following:
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 962
{
"contentDescriptor" : {
"providerVersion" : "5.5.16",
"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. Response Structure
The response contains all Spring Integration components used within the application, as well as the links between them. More information about the structure can be found in the reference documentation.
13.2. Rebuilding the Spring Integration Graph
To rebuild the exposed graph, make a POST
request to /actuator/integrationgraph
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/integrationgraph' -i -X POST
This will result in a 204 - No Content
response:
HTTP/1.1 204 No Content
14. Liquibase (liquibase
)
The liquibase
endpoint provides information about database change sets applied by Liquibase.
14.1. Retrieving the Changes
To retrieve the changes, make a GET
request to /actuator/liquibase
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/liquibase' -i -X GET
The resulting response is similar to the following:
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" : "2023-01-19T14:13:06.111Z",
"deploymentId" : "4137585917",
"description" : "createTable tableName=customer",
"execType" : "EXECUTED",
"id" : "1",
"labels" : [ ],
"checksum" : "8:46debf252cce6d7b25e28ddeb9fc4bf6",
"orderExecuted" : 1
} ]
}
}
}
}
}
14.1.1. Response Structure
The response contains details of the application’s Liquibase change sets. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Application contexts keyed by id |
|
|
Change sets made by the Liquibase beans, keyed by bean name. |
|
|
Author of the change set. |
|
|
Change log that contains the change set. |
|
|
Comments on the change set. |
|
|
Contexts of the change set. |
|
|
Timestamp of when the change set was executed. |
|
|
ID of the deployment that ran the change set. |
|
|
Description of the change set. |
|
|
Execution type of the change set ( |
|
|
ID of the change set. |
|
|
Labels associated with the change set. |
|
|
Checksum of the change set. |
|
|
Order of the execution of the change set. |
|
|
Tag associated with the change set, if any. |
|
|
Id of the parent application context, if any. |
15. Log File (logfile
)
The logfile
endpoint provides access to the contents of the application’s log file.
15.1. Retrieving the Log File
To retrieve the log file, make a GET
request to /actuator/logfile
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/logfile' -i -X GET
The resulting response is similar to the following:
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. Retrieving Part of the Log File
Retrieving part of the log file is not supported when using Jersey. |
To retrieve part of the log file, make a GET
request to /actuator/logfile
by using the Range
header, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/logfile' -i -X GET \
-H 'Range: bytes=0-1023'
The preceding example retrieves the first 1024 bytes of the log file. The resulting response is similar to the following:
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
)
The loggers
endpoint provides access to the application’s loggers and the configuration of their levels.
16.1. Retrieving All Loggers
To retrieve the application’s loggers, make a GET
request to /actuator/loggers
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/loggers' -i -X GET
The resulting response is similar to the following:
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. Response Structure
The response contains details of the application’s loggers. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Levels support by the logging system. |
|
|
Loggers keyed by name. |
|
|
Logger groups keyed by name |
|
|
Configured level of the logger, if any. |
|
|
Effective level of the logger. |
|
|
Configured level of the logger group, if any. |
|
|
Loggers that are part of this group |
16.2. Retrieving a Single Logger
To retrieve a single logger, make a GET
request to /actuator/loggers/{logger.name}
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/loggers/com.example' -i -X GET
The preceding example retrieves information about the logger named com.example
.
The resulting response is similar to the following:
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.3. Retrieving a Single Group
To retrieve a single group, make a GET
request to /actuator/loggers/{group.name}
,
as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/loggers/test' -i -X GET
The preceding example retrieves information about the logger group named test
.
The resulting response is similar to the following:
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.4. Setting a Log Level
To set the level of a logger, make a POST
request to /actuator/loggers/{logger.name}
with a JSON body that specifies the configured level for the logger, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/loggers/com.example' -i -X POST \
-H 'Content-Type: application/json' \
-d '{"configuredLevel":"debug"}'
The preceding example sets the configuredLevel
of the com.example
logger to DEBUG
.
16.5. Setting a Log Level for a Group
To set the level of a logger, make a POST
request to /actuator/loggers/{group.name}
with a JSON body that specifies the configured level for the logger group, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/loggers/test' -i -X POST \
-H 'Content-Type: application/json' \
-d '{"configuredLevel":"debug"}'
The preceding example sets the configuredLevel
of the test
logger group to DEBUG
.
16.6. Clearing a Log Level
To clear the level of a logger, make a POST
request to /actuator/loggers/{logger.name}
with a JSON body containing an empty object, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/loggers/com.example' -i -X POST \
-H 'Content-Type: application/json' \
-d '{}'
The preceding example clears the configured level of the com.example
logger.
17. Mappings (mappings
)
The mappings
endpoint provides information about the application’s request mappings.
17.1. Retrieving the Mappings
To retrieve the mappings, make a GET
request to /actuator/mappings
, as shown in the following curl-based example:
$ curl 'http://localhost:38041/actuator/mappings' -i -X GET \
-H 'accept-encoding: gzip' \
-H 'user-agent: ReactorNetty/1.0.27' \
-H 'accept: */*'
The resulting response is similar to the following:
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Transfer-Encoding: chunked
Date: Thu, 19 Jan 2023 14:13:09 GMT
Content-Length: 5336
{
"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/util/Map;"
},
"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. Response Structure
The response contains details of the application’s mappings. The items found in the response depend on the type of web application (reactive or Servlet-based). The following table describes the structure of the common elements of the response:
Path | Type | Description |
---|---|---|
|
|
Application contexts keyed by id. |
|
|
Mappings in the context, keyed by mapping type. |
|
|
Dispatcher servlet mappings, if any. |
|
|
Servlet filter mappings, if any. |
|
|
Servlet mappings, if any. |
|
|
Dispatcher handler mappings, if any. |
|
|
Id of the parent application context, if any. |
The entries that may be found in contexts.*.mappings
are described in the following sections.
17.1.2. Dispatcher Servlets Response Structure
When using Spring MVC, the response contains details of any DispatcherServlet
request mappings beneath contexts.*.mappings.dispatcherServlets
.
The following table describes the structure of this section of the response:
Path | Type | Description |
---|---|---|
|
|
Dispatcher servlet mappings, if any, keyed by dispatcher servlet bean name. |
|
|
Additional implementation-specific details about the mapping. Optional. |
|
|
Handler for the mapping. |
|
|
Predicate for the mapping. |
|
|
Details of the method, if any, that will handle requests to this mapping. |
|
|
Fully qualified name of the class of the method. |
|
|
Name of the method. |
|
|
Descriptor of the method as specified in the Java Language Specification. |
|
|
Details of the request mapping conditions. |
|
|
Details of the consumes condition |
|
|
Consumed media type. |
|
|
Whether the media type is negated. |
|
|
Details of the headers condition. |
|
|
Name of the header. |
|
|
Required value of the header, if any. |
|
|
Whether the value is negated. |
|
|
HTTP methods that are handled. |
|
|
Details of the params condition. |
|
|
Name of the parameter. |
|
|
Required value of the parameter, if any. |
|
|
Whether the value is negated. |
|
|
Patterns identifying the paths handled by the mapping. |
|
|
Details of the produces condition. |
|
|
Produced media type. |
|
|
Whether the media type is negated. |
17.1.3. Servlets Response Structure
When using the Servlet stack, the response contains details of any Servlet
mappings beneath contexts.*.mappings.servlets
.
The following table describes the structure of this section of the response:
Path | Type | Description |
---|---|---|
|
|
Mappings of the servlet. |
|
|
Name of the servlet. |
|
|
Class name of the servlet |
17.1.4. Servlet Filters Response Structure
When using the Servlet stack, the response contains details of any Filter
mappings beneath contexts.*.mappings.servletFilters
.
The following table describes the structure of this section of the response:
Path | Type | Description |
---|---|---|
|
|
Names of the servlets to which the filter is mapped. |
|
|
URL pattern to which the filter is mapped. |
|
|
Name of the filter. |
|
|
Class name of the filter |
17.1.5. Dispatcher Handlers Response Structure
When using Spring WebFlux, the response contains details of any DispatcherHandler
request mappings beneath contexts.*.mappings.dispatcherHandlers
.
The following table describes the structure of this section of the response:
Path | Type | Description |
---|---|---|
|
|
Dispatcher handler mappings, if any, keyed by dispatcher handler bean name. |
|
|
Additional implementation-specific details about the mapping. Optional. |
|
|
Handler for the mapping. |
|
|
Predicate for the mapping. |
|
|
Details of the request mapping conditions. |
|
|
Details of the consumes condition |
|
|
Consumed media type. |
|
|
Whether the media type is negated. |
|
|
Details of the headers condition. |
|
|
Name of the header. |
|
|
Required value of the header, if any. |
|
|
Whether the value is negated. |
|
|
HTTP methods that are handled. |
|
|
Details of the params condition. |
|
|
Name of the parameter. |
|
|
Required value of the parameter, if any. |
|
|
Whether the value is negated. |
|
|
Patterns identifying the paths handled by the mapping. |
|
|
Details of the produces condition. |
|
|
Produced media type. |
|
|
Whether the media type is negated. |
|
|
Details of the method, if any, that will handle requests to this mapping. |
|
|
Fully qualified name of the class of the method. |
|
|
Name of the method. |
|
|
Descriptor of the method as specified in the Java Language Specification. |
|
|
Details of the function, if any, that will handle requests to this mapping. |
|
|
Fully qualified name of the class of the function. |
18. Metrics (metrics
)
The metrics
endpoint provides access to application metrics.
18.1. Retrieving Metric Names
To retrieve the names of the available metrics, make a GET
request to /actuator/metrics
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/metrics' -i -X GET
The resulting response is similar to the following:
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.2. Retrieving a Metric
To retrieve a metric, make a GET
request to /actuator/metrics/{metric.name}
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/metrics/jvm.memory.max' -i -X GET
The preceding example retrieves information about the metric named jvm.memory.max
.
The resulting response is similar to the following:
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.361917439E9
} ],
"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. Query Parameters
The endpoint uses query parameters to drill down into a metric by using its tags. The following table shows the single supported query parameter:
Parameter | Description |
---|---|
|
A tag to use for drill-down in the form |
18.2.2. Response structure
The response contains details of the metric. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Name of the metric |
|
|
Description of the metric |
|
|
Base unit of the metric |
|
|
Measurements of the metric |
|
|
Statistic of the measurement. ( |
|
|
Value of the measurement. |
|
|
Tags that are available for drill-down. |
|
|
Name of the tag. |
|
|
Possible values of the tag. |
18.3. Drilling Down
To drill down into a metric, make a GET
request to /actuator/metrics/{metric.name}
using the tag
query parameter, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/metrics/jvm.memory.max?tag=area%3Anonheap&tag=id%3ACompressed+Class+Space' -i -X GET
The preceding example retrieves the jvm.memory.max
metric, where the area
tag has a value of nonheap
and the id
attribute has a value of Compressed Class Space
.
The resulting response is similar to the following:
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
)
The prometheus
endpoint provides Spring Boot application’s metrics in the format required for scraping by a Prometheus server.
19.1. Retrieving All Metrics
To retrieve all metrics, make a GET
request to /actuator/prometheus
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/prometheus' -i -X GET
The resulting response is similar to the following:
HTTP/1.1 200 OK
Content-Type: text/plain;version=0.0.4;charset=utf-8
Content-Length: 2374
# 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",} 3.8797312E7
jvm_memory_max_bytes{area="heap",id="PS Old Gen",} 7.16177408E8
jvm_memory_max_bytes{area="heap",id="PS Eden Space",} 2.81542656E8
jvm_memory_max_bytes{area="nonheap",id="Metaspace",} -1.0
jvm_memory_max_bytes{area="nonheap",id="Code Cache",} 2.5165824E8
jvm_memory_max_bytes{area="nonheap",id="Compressed Class Space",} 1.073741824E9
# HELP jvm_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",} 458960.0
jvm_buffer_memory_used_bytes{id="mapped",} 0.0
# 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",} 1.7196768E7
jvm_memory_used_bytes{area="heap",id="PS Old Gen",} 6.7367008E7
jvm_memory_used_bytes{area="heap",id="PS Eden Space",} 1.97414992E8
jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 1.1320696E8
jvm_memory_used_bytes{area="nonheap",id="Code Cache",} 4.0180992E7
jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 1.5537648E7
# 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",} 458959.0
jvm_buffer_total_capacity_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",} 15.0
jvm_buffer_count_buffers{id="mapped",} 0.0
# 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",} 3.8797312E7
jvm_memory_committed_bytes{area="heap",id="PS Old Gen",} 5.74619648E8
jvm_memory_committed_bytes{area="heap",id="PS Eden Space",} 2.78921216E8
jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 1.21962496E8
jvm_memory_committed_bytes{area="nonheap",id="Code Cache",} 4.0435712E7
jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 1.7145856E7
The default response content type is text/plain;version=0.0.4
.
The endpoint can also produce application/openmetrics-text;version=1.0.0
when called with an appropriate Accept
header, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/prometheus' -i -X GET \
-H 'Accept: application/openmetrics-text; version=1.0.0; charset=utf-8'
The resulting response is similar to the following:
HTTP/1.1 200 OK
Content-Type: application/openmetrics-text;version=1.0.0;charset=utf-8
Content-Length: 2357
# 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"} 3.8797312E7
jvm_memory_max_bytes{area="heap",id="PS Old Gen"} 7.16177408E8
jvm_memory_max_bytes{area="heap",id="PS Eden Space"} 2.81542656E8
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
# 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"} 458960.0
jvm_buffer_memory_used_bytes{id="mapped"} 0.0
# 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"} 1.7196768E7
jvm_memory_used_bytes{area="heap",id="PS Old Gen"} 6.7367008E7
jvm_memory_used_bytes{area="heap",id="PS Eden Space"} 1.92007504E8
jvm_memory_used_bytes{area="nonheap",id="Metaspace"} 1.13196448E8
jvm_memory_used_bytes{area="nonheap",id="Code Cache"} 4.0150912E7
jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space"} 1.5535256E7
# 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"} 458959.0
jvm_buffer_total_capacity_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"} 15.0
jvm_buffer_count_buffers{id="mapped"} 0.0
# 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"} 3.8797312E7
jvm_memory_committed_bytes{area="heap",id="PS Old Gen"} 5.74619648E8
jvm_memory_committed_bytes{area="heap",id="PS Eden Space"} 2.78921216E8
jvm_memory_committed_bytes{area="nonheap",id="Metaspace"} 1.21962496E8
jvm_memory_committed_bytes{area="nonheap",id="Code Cache"} 4.0370176E7
jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space"} 1.7145856E7
# EOF
19.2. Retrieving Filtered Metrics
To retrieve metrics matching specific names, make a GET
request to /actuator/prometheus
with the includedNames
query parameter, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/prometheus?includedNames=jvm_memory_used_bytes%2Cjvm_memory_committed_bytes' -i -X GET
The resulting response is similar to the following:
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",} 1.7196768E7
jvm_memory_used_bytes{area="heap",id="PS Old Gen",} 6.7367008E7
jvm_memory_used_bytes{area="heap",id="PS Eden Space",} 2.02822408E8
jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 1.13220288E8
jvm_memory_used_bytes{area="nonheap",id="Code Cache",} 4.01824E7
jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 1.5539344E7
# 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",} 3.8797312E7
jvm_memory_committed_bytes{area="heap",id="PS Old Gen",} 5.74619648E8
jvm_memory_committed_bytes{area="heap",id="PS Eden Space",} 2.78921216E8
jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 1.2222464E8
jvm_memory_committed_bytes{area="nonheap",id="Code Cache",} 4.0435712E7
jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 1.7145856E7
20. Quartz (quartz
)
The quartz
endpoint provides information about jobs and triggers that are managed by the Quartz Scheduler.
20.1. Retrieving Registered Groups
Jobs and triggers are managed in groups.
To retrieve the list of registered job and trigger groups, make a GET
request to /actuator/quartz
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/quartz' -i -X GET
The resulting response is similar to the following:
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.2. Retrieving Registered Job Names
To retrieve the list of registered job names, make a GET
request to /actuator/quartz/jobs
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/quartz/jobs' -i -X GET
The resulting response is similar to the following:
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.3. Retrieving Registered Trigger Names
To retrieve the list of registered trigger names, make a GET
request to /actuator/quartz/triggers
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/quartz/triggers' -i -X GET
The resulting response is similar to the following:
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. Response Structure
The response contains the registered trigger names for each group. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Trigger groups keyed by name. |
|
|
Whether this trigger group is paused. |
|
|
An array of trigger names. |
20.4. Retrieving Overview of a Job Group
To retrieve an overview of the jobs in a particular group, make a GET
request to /actuator/quartz/jobs/{groupName}
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/quartz/jobs/samples' -i -X GET
The preceding example retrieves the summary for jobs in the samples
group.
The resulting response is similar to the following:
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. Response Structure
The response contains an overview of jobs in a particular group. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Name of the group. |
|
|
Job details keyed by name. |
|
|
Fully qualified name of the job implementation. |
20.5. Retrieving Overview of a Trigger Group
To retrieve an overview of the triggers in a particular group, make a GET
request to /actuator/quartz/triggers/{groupName}
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/quartz/triggers/tests' -i -X GET
The preceding example retrieves the summary for triggers in the tests
group.
The resulting response is similar to the following:
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. Response Structure
The response contains an overview of triggers in a particular group. Trigger implementation specific details are available. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Name of the group. |
|
|
Whether the group is paused. |
|
|
Cron triggers keyed by name, if any. |
|
|
Simple triggers keyed by name, if any. |
|
|
Daily time interval triggers keyed by name, if any. |
|
|
Calendar interval triggers keyed by name, if any. |
|
|
Any other triggers keyed by name, if any. |
|
|
Last time the trigger fired, if any. |
|
|
Next time at which the Trigger is scheduled to fire, if any. |
|
|
Priority to use if two triggers have the same scheduled fire time. |
|
|
Cron expression to use. |
|
|
Time zone for which the expression will be resolved, if any. |
|
|
Last time the trigger fired, if any. |
|
|
Next time at which the Trigger is scheduled to fire, if any. |
|
|
Priority to use if two triggers have the same scheduled fire time. |
|
|
Interval, in milliseconds, between two executions. |
|
|
Last time the trigger fired, if any. |
|
|
Next time at which the Trigger is scheduled to fire, if any. |
|
|
Priority to use if two triggers have the same scheduled fire time. |
|
|
Interval, in milliseconds, added to the fire time in order to calculate the time of the next trigger repeat. |
|
|
An array of days of the week upon which to fire. |
|
|
Time of day to start firing at the given interval, if any. |
|
|
Time of day to complete firing at the given interval, if any. |
|
|
Last time the trigger fired, if any. |
|
|
Next time at which the Trigger is scheduled to fire, if any. |
|
|
Priority to use if two triggers have the same scheduled fire time. |
|
|
Interval, in milliseconds, added to the fire time in order to calculate the time of the next trigger repeat. |
|
|
Time zone within which time calculations will be performed, if any. |
|
|
Last time the trigger fired, if any. |
|
|
Next time at which the Trigger is scheduled to fire, if any. |
|
|
Priority to use if two triggers have the same scheduled fire time. |
|
|
A toString representation of the custom trigger instance. |
20.6. Retrieving Details of a Job
To retrieve the details about a particular job, make a GET
request to /actuator/quartz/jobs/{groupName}/{jobName}
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/quartz/jobs/samples/jobOne' -i -X GET
The preceding example retrieves the details of the job identified by the samples
group and jobOne
name.
The resulting response is similar to the following:
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
} ]
}
If a key in the data map is identified as sensitive, its value is sanitized.
20.6.1. Response Structure
The response contains the full details of a job including a summary of the triggers associated with it, if any. The triggers are sorted by next fire time and priority. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Name of the group. |
|
|
Name of the job. |
|
|
Description of the job, if any. |
|
|
Fully qualified name of the job implementation. |
|
|
Whether the job should remain stored after it is orphaned. |
|
|
Whether the job should be re-executed if a 'recovery' or 'fail-over' situation is encountered. |
|
|
Job data map as key/value pairs, if any. |
|
|
An array of triggers associated to the job, if any. |
|
|
Name of the trigger group. |
|
|
Name of the trigger. |
|
|
Last time the trigger fired, if any. |
|
|
Next time at which the Trigger is scheduled to fire, if any. |
|
|
Priority to use if two triggers have the same scheduled fire time. |
20.7. Retrieving Details of a Trigger
To retrieve the details about a particular trigger, make a GET
request to /actuator/quartz/triggers/{groupName}/{triggerName}
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/quartz/triggers/samples/example' -i -X GET
The preceding example retrieves the details of trigger identified by the samples
group and example
name.
20.7.1. Common Response Structure
The response has a common structure and an additional object that is specific to the trigger’s type. There are five supported types:
-
cron
forCronTrigger
-
simple
forSimpleTrigger
-
dailyTimeInterval
forDailyTimeIntervalTrigger
-
calendarInterval
forCalendarIntervalTrigger
-
custom
for any other trigger implementations
The following table describes the structure of the common elements of the response:
Path | Type | Description |
---|---|---|
|
|
Name of the group. |
|
|
Name of the trigger. |
|
|
Description of the trigger, if any. |
|
|
State of the trigger ( |
|
|
Type of the trigger ( |
|
|
Name of the Calendar associated with this Trigger, if any. |
|
|
Time at which the Trigger should take effect, if any. |
|
|
Time at which the Trigger should quit repeating, regardless of any remaining repeats, if any. |
|
|
Last time the trigger fired, if any. |
|
|
Next time at which the Trigger is scheduled to fire, if any. |
|
|
Priority to use if two triggers have the same scheduled fire time. |
|
|
Last time at which the Trigger will fire, if any. |
|
|
Job data map keyed by name, if any. |
|
|
Calendar time interval trigger details, if any. Present when |
|
|
Custom trigger details, if any. Present when |
|
|
Cron trigger details, if any. Present when |
|
|
Daily time interval trigger details, if any. Present when |
|
|
Simple trigger details, if any. Present when |
20.7.2. Cron Trigger Response Structure
A cron trigger defines the cron expression that is used to determine when it has to fire. The resulting response for such a trigger implementation is similar to the following:
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"
}
}
Much of the response is common to all trigger types. The structure of the common elements of the response was described previously. The following table describes the structure of the parts of the response that are specific to cron triggers:
Path | Type | Description |
---|---|---|
|
|
Cron trigger specific details. |
|
|
Cron expression to use. |
|
|
Time zone for which the expression will be resolved, if any. |
20.7.3. Simple Trigger Response Structure
A simple trigger is used to fire a Job at a given moment in time, and optionally repeated at a specified interval. The resulting response for such a trigger implementation is similar to the following:
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
}
}
Much of the response is common to all trigger types. The structure of the common elements of the response was described previously. The following table describes the structure of the parts of the response that are specific to simple triggers:
Path | Type | Description |
---|---|---|
|
|
Simple trigger specific details. |
|
|
Interval, in milliseconds, between two executions. |
|
|
Number of times the trigger should repeat, or -1 to repeat indefinitely. |
|
|
Number of times the trigger has already fired. |
20.7.4. Daily Time Interval Trigger Response Structure
A daily time interval trigger is used to fire a Job based upon daily repeating time intervals. The resulting response for such a trigger implementation is similar to the following:
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
}
}
Much of the response is common to all trigger types. The structure of the common elements of the response was described previously. The following table describes the structure of the parts of the response that are specific to daily time interval triggers:
Path | Type | Description |
---|---|---|
|
|
Daily time interval trigger specific details. |
|
|
Interval, in milliseconds, added to the fire time in order to calculate the time of the next trigger repeat. |
|
|
An array of days of the week upon which to fire. |
|
|
Time of day to start firing at the given interval, if any. |
|
|
Time of day to complete firing at the given interval, if any. |
|
|
Number of times the trigger should repeat, or -1 to repeat indefinitely. |
|
|
Number of times the trigger has already fired. |
20.7.5. Calendar Interval Trigger Response Structure
A calendar interval trigger is used to fire a Job based upon repeating calendar time intervals. The resulting response for such a trigger implementation is similar to the following:
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
}
}
Much of the response is common to all trigger types. The structure of the common elements of the response was described previously. The following table describes the structure of the parts of the response that are specific to calendar interval triggers:
Path | Type | Description |
---|---|---|
|
|
Calendar interval trigger specific details. |
|
|
Interval, in milliseconds, added to the fire time in order to calculate the time of the next trigger repeat. |
|
|
Time zone within which time calculations will be performed, if any. |
|
|
Number of times the trigger has already fired. |
|
|
Whether to fire the trigger at the same time of day, regardless of daylight saving time transitions. |
|
|
Whether to skip if the hour of the day does not exist on a given day. |
20.7.6. Custom Trigger Response Structure
A custom trigger is any other implementation. The resulting response for such a trigger implementation is similar to the following:
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"
}
}
Much of the response is common to all trigger types. The structure of the common elements of the response was described previously. The following table describes the structure of the parts of the response that are specific to custom triggers:
Path | Type | Description |
---|---|---|
|
|
Custom trigger specific details. |
|
|
A toString representation of the custom trigger instance. |
21. Scheduled Tasks (scheduledtasks
)
The scheduledtasks
endpoint provides information about the application’s scheduled tasks.
21.1. Retrieving the Scheduled Tasks
To retrieve the scheduled tasks, make a GET
request to /actuator/scheduledtasks
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/scheduledtasks' -i -X GET
The resulting response is similar to the following:
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@3a63653b"
} ]
}
21.1.1. Response Structure
The response contains details of the application’s scheduled tasks. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Cron tasks, if any. |
|
|
Target that will be executed. |
|
|
Cron expression. |
|
|
Fixed delay tasks, if any. |
|
|
Target that will be executed. |
|
|
Delay, in milliseconds, before first execution. |
|
|
Interval, in milliseconds, between the end of the last execution and the start of the next. |
|
|
Fixed rate tasks, if any. |
|
|
Target that will be executed. |
|
|
Interval, in milliseconds, between the start of each execution. |
|
|
Delay, in milliseconds, before first execution. |
|
|
Tasks with custom triggers, if any. |
|
|
Target that will be executed. |
|
|
Trigger for the task. |
22. Sessions (sessions
)
The sessions
endpoint provides information about the application’s HTTP sessions that are managed by Spring Session.
22.1. Retrieving Sessions
To retrieve the sessions, make a GET
request to /actuator/sessions
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/sessions?username=alice' -i -X GET
The preceding examples retrieves all of the sessions for the user whose username is alice
.
The resulting response is similar to the following:
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 753
{
"sessions" : [ {
"id" : "e8122e73-4485-4080-b9ab-8b36b4e8442c",
"attributeNames" : [ ],
"creationTime" : "2023-01-19T12:13:12.259Z",
"lastAccessedTime" : "2023-01-19T14:13:00.259Z",
"maxInactiveInterval" : 1800,
"expired" : false
}, {
"id" : "f67fca10-c72a-402b-8093-be3d5b86bc5f",
"attributeNames" : [ ],
"creationTime" : "2023-01-19T02:13:12.258Z",
"lastAccessedTime" : "2023-01-19T14:12:27.258Z",
"maxInactiveInterval" : 1800,
"expired" : false
}, {
"id" : "4db5efcc-99cb-4d05-a52c-b49acfbb7ea9",
"attributeNames" : [ ],
"creationTime" : "2023-01-19T09:13:12.259Z",
"lastAccessedTime" : "2023-01-19T14:12:35.259Z",
"maxInactiveInterval" : 1800,
"expired" : false
} ]
}
22.1.1. Query Parameters
The endpoint uses query parameters to limit the sessions that it returns. The following table shows the single required query parameter:
Parameter | Description |
---|---|
|
Name of the user. |
22.1.2. Response Structure
The response contains details of the matching sessions. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Sessions for the given username. |
|
|
ID of the session. |
|
|
Names of the attributes stored in the session. |
|
|
Timestamp of when the session was created. |
|
|
Timestamp of when the session was last accessed. |
|
|
Maximum permitted period of inactivity, in seconds, before the session will expire. |
|
|
Whether the session has expired. |
22.2. Retrieving a Single Session
To retrieve a single session, make a GET
request to /actuator/sessions/{id}
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/sessions/4db5efcc-99cb-4d05-a52c-b49acfbb7ea9' -i -X GET
The preceding example retrieves the session with the id
of 4db5efcc-99cb-4d05-a52c-b49acfbb7ea9
.
The resulting response is similar to the following:
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" : "2023-01-19T09:13:12.259Z",
"lastAccessedTime" : "2023-01-19T14:12:35.259Z",
"maxInactiveInterval" : 1800,
"expired" : false
}
22.2.1. Response Structure
The response contains details of the requested session. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
ID of the session. |
|
|
Names of the attributes stored in the session. |
|
|
Timestamp of when the session was created. |
|
|
Timestamp of when the session was last accessed. |
|
|
Maximum permitted period of inactivity, in seconds, before the session will expire. |
|
|
Whether the session has expired. |
22.3. Deleting a Session
To delete a session, make a DELETE
request to /actuator/sessions/{id}
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/sessions/4db5efcc-99cb-4d05-a52c-b49acfbb7ea9' -i -X DELETE
The preceding example deletes the session with the id
of 4db5efcc-99cb-4d05-a52c-b49acfbb7ea9
.
23. Shutdown (shutdown
)
The shutdown
endpoint is used to shut down the application.
23.1. Shutting Down the Application
To shut down the application, make a POST
request to /actuator/shutdown
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/shutdown' -i -X POST
A response similar to the following is produced:
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 41
{
"message" : "Shutting down, bye..."
}
24. Application Startup (startup
)
The startup
endpoint provides information about the application’s startup sequence.
24.1. Retrieving the Application Startup Steps
The application startup steps can either be retrieved as a snapshot (GET
) or drained from the buffer (POST
).
24.1.1. Retrieving a snapshot of the Application Startup Steps
To retrieve the steps recorded so far during the application startup phase, make a GET
request to /actuator/startup
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/startup' -i -X GET
The resulting response is similar to the following:
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 839
{
"springBootVersion" : "2.7.8",
"timeline" : {
"startTime" : "2023-01-19T14:13:14.528Z",
"events" : [ {
"endTime" : "2023-01-19T14:13:14.821Z",
"duration" : "PT0S",
"startTime" : "2023-01-19T14:13:14.821Z",
"startupStep" : {
"name" : "spring.beans.instantiate",
"id" : 3,
"tags" : [ {
"key" : "beanName",
"value" : "homeController"
} ],
"parentId" : 2
}
}, {
"endTime" : "2023-01-19T14:13:14.821Z",
"duration" : "PT0S",
"startTime" : "2023-01-19T14:13:14.821Z",
"startupStep" : {
"name" : "spring.boot.application.starting",
"id" : 2,
"tags" : [ {
"key" : "mainApplicationClass",
"value" : "com.example.startup.StartupApplication"
} ]
}
} ]
}
}
24.1.2. Draining the Application Startup Steps
To drain and return the steps recorded so far during the application startup phase, make a POST
request to /actuator/startup
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/startup' -i -X POST
The resulting response is similar to the following:
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 843
{
"springBootVersion" : "2.7.8",
"timeline" : {
"startTime" : "2023-01-19T14:13:14.528Z",
"events" : [ {
"endTime" : "2023-01-19T14:13:14.778Z",
"duration" : "PT0S",
"startTime" : "2023-01-19T14:13:14.778Z",
"startupStep" : {
"name" : "spring.beans.instantiate",
"id" : 1,
"tags" : [ {
"key" : "beanName",
"value" : "homeController"
} ],
"parentId" : 0
}
}, {
"endTime" : "2023-01-19T14:13:14.778Z",
"duration" : "PT0.002S",
"startTime" : "2023-01-19T14:13:14.776Z",
"startupStep" : {
"name" : "spring.boot.application.starting",
"id" : 0,
"tags" : [ {
"key" : "mainApplicationClass",
"value" : "com.example.startup.StartupApplication"
} ]
}
} ]
}
}
24.1.3. Response Structure
The response contains details of the application startup steps. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Spring Boot version for this application. |
|
|
Start time of the application. |
|
|
An array of steps collected during application startup so far. |
|
|
The timestamp of the start of this event. |
|
|
The timestamp of the end of this event. |
|
|
The precise duration of this event. |
|
|
The name of the StartupStep. |
|
|
The id of this StartupStep. |
|
|
The parent id for this StartupStep. |
|
|
An array of key/value pairs with additional step info. |
|
|
The key of the StartupStep Tag. |
|
|
The value of the StartupStep Tag. |
25. Thread Dump (threaddump
)
The threaddump
endpoint provides a thread dump from the application’s JVM.
25.1. Retrieving the Thread Dump as JSON
To retrieve the thread dump as JSON, make a GET
request to /actuator/threaddump
with an appropriate Accept
header, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/threaddump' -i -X GET \
-H 'Accept: application/json'
The resulting response is similar to the following:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 9678
{
"threads" : [ {
"threadName" : "Thread-63",
"threadId" : 381,
"blockedTime" : -1,
"blockedCount" : 0,
"waitedTime" : -1,
"waitedCount" : 1,
"lockName" : "java.util.concurrent.CountDownLatch$Sync@48d37d0a",
"lockOwnerId" : -1,
"inNative" : false,
"suspended" : false,
"threadState" : "WAITING",
"stackTrace" : [ {
"methodName" : "park",
"fileName" : "Unsafe.java",
"lineNumber" : -2,
"className" : "sun.misc.Unsafe",
"nativeMethod" : true
}, {
"methodName" : "park",
"fileName" : "LockSupport.java",
"lineNumber" : 175,
"className" : "java.util.concurrent.locks.LockSupport",
"nativeMethod" : false
}, {
"methodName" : "parkAndCheckInterrupt",
"fileName" : "AbstractQueuedSynchronizer.java",
"lineNumber" : 836,
"className" : "java.util.concurrent.locks.AbstractQueuedSynchronizer",
"nativeMethod" : false
}, {
"methodName" : "doAcquireSharedInterruptibly",
"fileName" : "AbstractQueuedSynchronizer.java",
"lineNumber" : 997,
"className" : "java.util.concurrent.locks.AbstractQueuedSynchronizer",
"nativeMethod" : false
}, {
"methodName" : "acquireSharedInterruptibly",
"fileName" : "AbstractQueuedSynchronizer.java",
"lineNumber" : 1304,
"className" : "java.util.concurrent.locks.AbstractQueuedSynchronizer",
"nativeMethod" : false
}, {
"methodName" : "await",
"fileName" : "CountDownLatch.java",
"lineNumber" : 231,
"className" : "java.util.concurrent.CountDownLatch",
"nativeMethod" : false
}, {
"methodName" : "lambda$jsonThreadDump$0",
"fileName" : "ThreadDumpEndpointDocumentationTests.java",
"lineNumber" : 56,
"className" : "org.springframework.boot.actuate.autoconfigure.endpoint.web.documentation.ThreadDumpEndpointDocumentationTests",
"nativeMethod" : false
}, {
"methodName" : "run",
"lineNumber" : -1,
"className" : "org.springframework.boot.actuate.autoconfigure.endpoint.web.documentation.ThreadDumpEndpointDocumentationTests$$Lambda$2714/741144125",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "Thread.java",
"lineNumber" : 750,
"className" : "java.lang.Thread",
"nativeMethod" : false
} ],
"lockedMonitors" : [ ],
"lockedSynchronizers" : [ {
"className" : "java.util.concurrent.locks.ReentrantLock$NonfairSync",
"identityHashCode" : 50724425
} ],
"lockInfo" : {
"className" : "java.util.concurrent.CountDownLatch$Sync",
"identityHashCode" : 1221819658
}
}, {
"threadName" : "pool-14-thread-1",
"threadId" : 374,
"blockedTime" : -1,
"blockedCount" : 0,
"waitedTime" : -1,
"waitedCount" : 0,
"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" : 1429408166,
"lockedStackDepth" : 7,
"lockedStackFrame" : {
"methodName" : "schedule",
"fileName" : "ReschedulingRunnable.java",
"lineNumber" : 82,
"className" : "org.springframework.scheduling.concurrent.ReschedulingRunnable",
"nativeMethod" : false
}
}, {
"className" : "java.lang.Object",
"identityHashCode" : 1429408166,
"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" : 1712511402
}, {
"className" : "java.util.concurrent.locks.ReentrantLock$NonfairSync",
"identityHashCode" : 2138165375
} ]
}, {
"threadName" : "http-nio-auto-14-Acceptor",
"threadId" : 369,
"blockedTime" : -1,
"blockedCount" : 0,
"waitedTime" : -1,
"waitedCount" : 0,
"lockOwnerId" : -1,
"inNative" : true,
"suspended" : false,
"threadState" : "RUNNABLE",
"stackTrace" : [ {
"methodName" : "accept0",
"fileName" : "ServerSocketChannelImpl.java",
"lineNumber" : -2,
"className" : "sun.nio.ch.ServerSocketChannelImpl",
"nativeMethod" : true
}, {
"methodName" : "accept",
"fileName" : "ServerSocketChannelImpl.java",
"lineNumber" : 421,
"className" : "sun.nio.ch.ServerSocketChannelImpl",
"nativeMethod" : false
}, {
"methodName" : "accept",
"fileName" : "ServerSocketChannelImpl.java",
"lineNumber" : 249,
"className" : "sun.nio.ch.ServerSocketChannelImpl",
"nativeMethod" : false
}, {
"methodName" : "serverSocketAccept",
"fileName" : "NioEndpoint.java",
"lineNumber" : 547,
"className" : "org.apache.tomcat.util.net.NioEndpoint",
"nativeMethod" : false
}, {
"methodName" : "serverSocketAccept",
"fileName" : "NioEndpoint.java",
"lineNumber" : 79,
"className" : "org.apache.tomcat.util.net.NioEndpoint",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "Acceptor.java",
"lineNumber" : 129,
"className" : "org.apache.tomcat.util.net.Acceptor",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "Thread.java",
"lineNumber" : 750,
"className" : "java.lang.Thread",
"nativeMethod" : false
} ],
"lockedMonitors" : [ {
"className" : "java.lang.Object",
"identityHashCode" : 422632617,
"lockedStackDepth" : 2,
"lockedStackFrame" : {
"methodName" : "accept",
"fileName" : "ServerSocketChannelImpl.java",
"lineNumber" : 249,
"className" : "sun.nio.ch.ServerSocketChannelImpl",
"nativeMethod" : false
}
} ],
"lockedSynchronizers" : [ ]
} ]
}
25.1.1. Response Structure
The response contains details of the JVM’s threads. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
JVM’s threads. |
|
|
Total number of times that the thread has been blocked. |
|
|
Time in milliseconds that the thread has spent blocked. -1 if thread contention monitoring is disabled. |
|
|
Whether the thread is a daemon thread. Only available on Java 9 or later. |
|
|
Whether the thread is executing native code. |
|
|
Description of the object on which the thread is blocked, if any. |
|
|
Object for which the thread is blocked waiting. |
|
|
Fully qualified class name of the lock object. |
|
|
Identity hash code of the lock object. |
|
|
Monitors locked by this thread, if any |
|
|
Class name of the lock object. |
|
|
Identity hash code of the lock object. |
|
|
Stack depth where the monitor was locked. |
|
|
Stack frame that locked the monitor. |
|
|
Synchronizers locked by this thread. |
|
|
Class name of the locked synchronizer. |
|
|
Identity hash code of the locked synchronizer. |
|
|
ID of the thread that owns the object on which the thread is blocked. |
|
|
Name of the thread that owns the object on which the thread is blocked, if any. |
|
|
Priority of the thread. Only available on Java 9 or later. |
|
|
Stack trace of the thread. |
|
|
Name of the class loader of the class that contains the execution point identified by this entry, if any. Only available on Java 9 or later. |
|
|
Name of the class that contains the execution point identified by this entry. |
|
|
Name of the source file that contains the execution point identified by this entry, if any. |
|
|
Line number of the execution point identified by this entry. Negative if unknown. |
|
|
Name of the method. |
|
|
Name of the module that contains the execution point identified by this entry, if any. Only available on Java 9 or later. |
|
|
Version of the module that contains the execution point identified by this entry, if any. Only available on Java 9 or later. |
|
|
Whether the execution point is a native method. |
|
|
Whether the thread is suspended. |
|
|
ID of the thread. |
|
|
Name of the thread. |
|
|
State of the thread ( |
|
|
Total number of times that the thread has waited for notification. |
|
|
Time in milliseconds that the thread has spent waiting. -1 if thread contention monitoring is disabled |
25.2. Retrieving the Thread Dump as Text
To retrieve the thread dump as text, make a GET
request to /actuator/threaddump
that
accepts text/plain
, as shown in the following curl-based example:
$ curl 'http://localhost:8080/actuator/threaddump' -i -X GET \
-H 'Accept: text/plain'
The resulting response is similar to the following:
HTTP/1.1 200 OK
Content-Type: text/plain;charset=UTF-8
Content-Length: 46135
2023-01-19 14:13:15
Full thread dump OpenJDK 64-Bit Server VM (25.362-b09 mixed mode):
"pool-14-thread-1" - Thread t@374
java.lang.Thread.State: RUNNABLE
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)
Locked ownable synchronizers:
- Locked <6612d9aa> (a java.util.concurrent.ThreadPoolExecutor$Worker)
"http-nio-auto-14-Acceptor" - Thread t@369
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 <1930dca9> (a java.lang.Object)
at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:547)
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-14-Poller" - Thread t@368
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 <1d03aacd> (a sun.nio.ch.Util$3)
- locked <2d381e8d> (a java.util.Collections$UnmodifiableSet)
- locked <3f3444b2> (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:805)
at java.lang.Thread.run(Thread.java:750)
Locked ownable synchronizers:
- None
"http-nio-auto-14-exec-10" - Thread t@367
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <207e1269> (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:141)
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-14-exec-9" - Thread t@366
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <207e1269> (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:141)
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-14-exec-8" - Thread t@365
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <207e1269> (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:141)
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-14-exec-7" - Thread t@364
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <207e1269> (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:141)
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-14-exec-6" - Thread t@363
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <207e1269> (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:141)
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-14-exec-5" - Thread t@362
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <207e1269> (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:141)
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-14-exec-4" - Thread t@361
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <207e1269> (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:141)
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-14-exec-3" - Thread t@360
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <207e1269> (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:141)
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-14-exec-2" - Thread t@359
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <207e1269> (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:141)
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-14-exec-1" - Thread t@358
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <207e1269> (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:141)
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@357
java.lang.Thread.State: TIMED_WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <20ab8169> (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@356
java.lang.Thread.State: TIMED_WAITING
at java.lang.Thread.sleep(Native Method)
at org.apache.catalina.core.StandardServer.await(StandardServer.java:566)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer$1.run(TomcatWebServer.java:197)
Locked ownable synchronizers:
- None
"Catalina-utility-1" - Thread t@355
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <20ab8169> (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
"server" - Thread t@353
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <4d0a2f87> (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:1742)
at org.springframework.boot.web.embedded.netty.NettyWebServer$1.run(NettyWebServer.java:180)
Locked ownable synchronizers:
- None
"HikariPool-1 housekeeper" - Thread t@342
java.lang.Thread.State: TIMED_WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <5006f340> (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
"Keep-Alive-Timer" - Thread t@275
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
"reactor-http-epoll-8" - Thread t@141
java.lang.Thread.State: RUNNABLE
at io.netty.channel.epoll.Native.epollWait(Native Method)
at io.netty.channel.epoll.Native.epollWait(Native.java:209)
at io.netty.channel.epoll.Native.epollWait(Native.java:202)
at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:306)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:363)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
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@140
java.lang.Thread.State: RUNNABLE
at io.netty.channel.epoll.Native.epollWait(Native Method)
at io.netty.channel.epoll.Native.epollWait(Native.java:209)
at io.netty.channel.epoll.Native.epollWait(Native.java:202)
at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:306)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:363)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
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@139
java.lang.Thread.State: RUNNABLE
at io.netty.channel.epoll.Native.epollWait(Native Method)
at io.netty.channel.epoll.Native.epollWait(Native.java:209)
at io.netty.channel.epoll.Native.epollWait(Native.java:202)
at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:306)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:363)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
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@138
java.lang.Thread.State: RUNNABLE
at io.netty.channel.epoll.Native.epollWait(Native Method)
at io.netty.channel.epoll.Native.epollWait(Native.java:209)
at io.netty.channel.epoll.Native.epollWait(Native.java:202)
at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:306)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:363)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
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@137
java.lang.Thread.State: RUNNABLE
at io.netty.channel.epoll.Native.epollWait(Native Method)
at io.netty.channel.epoll.Native.epollWait(Native.java:209)
at io.netty.channel.epoll.Native.epollWait(Native.java:202)
at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:306)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:363)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
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@136
java.lang.Thread.State: RUNNABLE
at io.netty.channel.epoll.Native.epollWait(Native Method)
at io.netty.channel.epoll.Native.epollWait(Native.java:209)
at io.netty.channel.epoll.Native.epollWait(Native.java:202)
at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:306)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:363)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
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@135
java.lang.Thread.State: RUNNABLE
at io.netty.channel.epoll.Native.epollWait(Native Method)
at io.netty.channel.epoll.Native.epollWait(Native.java:209)
at io.netty.channel.epoll.Native.epollWait(Native.java:202)
at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:306)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:363)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
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@134
java.lang.Thread.State: RUNNABLE
at io.netty.channel.epoll.Native.epollWait(Native Method)
at io.netty.channel.epoll.Native.epollWait(Native.java:209)
at io.netty.channel.epoll.Native.epollWait(Native.java:202)
at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:306)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:363)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
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@16
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <3b5e73> (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-1" - Thread t@15
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <7c6737d4> (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@14
java.lang.Thread.State: TIMED_WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <608d49c8> (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
"/127.0.0.1:46230 to /127.0.0.1:45059 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 <7f62a6a> (a sun.nio.ch.Util$3)
- locked <5de43421> (a java.util.Collections$UnmodifiableSet)
- locked <18f871de> (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:88)
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:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)
Locked ownable synchronizers:
- Locked <64cd705f> (a java.util.concurrent.ThreadPoolExecutor$Worker)
"/127.0.0.1:46230 to /127.0.0.1:45059 workers Thread 2" - Thread t@12
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <1231a800> (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:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)
Locked ownable synchronizers:
- Locked <57c758ac> (a java.util.concurrent.ThreadPoolExecutor$Worker)
"/127.0.0.1:46230 to /127.0.0.1:45059 workers" - Thread t@11
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <24a26556> (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$Handler.run(MessageHub.java:403)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)
Locked ownable synchronizers:
- Locked <433d61fb> (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 <589b08df> (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:188)
Locked ownable synchronizers:
- None
"Reference Handler" - Thread t@2
java.lang.Thread.State: WAITING
at java.lang.Object.wait(Native Method)
- waiting on <3b6e493> (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
"Test worker" - Thread t@1
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.GeneratedMethodAccessor152.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:1071)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964)
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:201)
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/183155105.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/172794870.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/623051334.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$329/1311544814.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$227/1404834600.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$226/1048128739.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$225/279781579.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$231/1780399359.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$227/1404834600.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$226/1048128739.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$225/279781579.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$231/1780399359.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$227/1404834600.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$226/1048128739.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$225/279781579.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/2108440536.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:62)
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$3.run(TestWorker.java:193)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60)
at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:113)
at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:65)
at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
Locked ownable synchronizers:
- None