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=2021-01-15T02%3A59%3A13.632Z&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" : "2021-01-15T02:59:13.633Z",
"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.2.2. Response Structure
The response contains details of the requested cache. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Cache name. |
|
|
Cache manager name. |
|
|
Fully qualified name of the native cache. |
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: 3255
{
"contexts" : {
"application" : {
"positiveMatches" : {
"EndpointAutoConfiguration#endpointOperationParameterMapper" : [ {
"condition" : "OnBeanCondition",
"message" : "@ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.invoke.ParameterValueMapper; SearchStrategy: all) did not find any beans"
} ],
"EndpointAutoConfiguration#endpointCachingOperationInvokerAdvisor" : [ {
"condition" : "OnBeanCondition",
"message" : "@ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.invoker.cache.CachingOperationInvokerAdvisor; SearchStrategy: all) did not find any beans"
} ],
"WebEndpointAutoConfiguration" : [ {
"condition" : "OnWebApplicationCondition",
"message" : "@ConditionalOnWebApplication (required) found 'session' scope"
} ]
},
"negativeMatches" : {
"WebFluxEndpointManagementContextConfiguration" : {
"notMatched" : [ {
"condition" : "OnWebApplicationCondition",
"message" : "not a reactive web application"
} ],
"matched" : [ {
"condition" : "OnClassCondition",
"message" : "@ConditionalOnClass found required classes 'org.springframework.web.reactive.DispatcherHandler', 'org.springframework.http.server.reactive.HttpHandler'"
} ]
},
"GsonHttpMessageConvertersConfiguration.GsonHttpMessageConverterConfiguration" : {
"notMatched" : [ {
"condition" : "GsonHttpMessageConvertersConfiguration.PreferGsonOrJacksonAndJsonbUnavailableCondition",
"message" : "AnyNestedCondition 0 matched 2 did not; NestedCondition on GsonHttpMessageConvertersConfiguration.PreferGsonOrJacksonAndJsonbUnavailableCondition.JacksonJsonbUnavailable NoneNestedConditions 1 matched 1 did not; NestedCondition on GsonHttpMessageConvertersConfiguration.JacksonAndJsonbUnavailableCondition.JsonbPreferred @ConditionalOnProperty (spring.mvc.converters.preferred-json-mapper=jsonb) did not find property 'spring.mvc.converters.preferred-json-mapper'; NestedCondition on GsonHttpMessageConvertersConfiguration.JacksonAndJsonbUnavailableCondition.JacksonAvailable @ConditionalOnBean (types: org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; SearchStrategy: all) found bean 'mappingJackson2HttpMessageConverter'; NestedCondition on GsonHttpMessageConvertersConfiguration.PreferGsonOrJacksonAndJsonbUnavailableCondition.GsonPreferred @ConditionalOnProperty (spring.mvc.converters.preferred-json-mapper=gson) did not find property 'spring.mvc.converters.preferred-json-mapper'"
} ],
"matched" : [ ]
},
"JsonbHttpMessageConvertersConfiguration" : {
"notMatched" : [ {
"condition" : "OnClassCondition",
"message" : "@ConditionalOnClass did not find required class 'javax.json.bind.Jsonb'"
} ],
"matched" : [ ]
}
},
"unconditionalClasses" : [ "org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration", "org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration" ]
}
}
}
5.1.1. 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 the @ConfigurationProperties Bean
To retrieve 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: 3178
{
"contexts" : {
"application" : {
"beans" : {
"management.endpoints.web.cors-org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties" : {
"prefix" : "management.endpoints.web.cors",
"properties" : {
"allowedHeaders" : [ ],
"allowedMethods" : [ ],
"allowedOrigins" : [ ],
"maxAge" : "PT30M",
"exposedHeaders" : [ ]
},
"inputs" : {
"allowedHeaders" : [ ],
"allowedMethods" : [ ],
"allowedOrigins" : [ ],
"maxAge" : { },
"exposedHeaders" : [ ]
}
},
"management.endpoints.web-org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties" : {
"prefix" : "management.endpoints.web",
"properties" : {
"pathMapping" : { },
"exposure" : {
"include" : [ "*" ],
"exclude" : [ ]
},
"basePath" : "/actuator"
},
"inputs" : {
"pathMapping" : { },
"exposure" : {
"include" : [ {
"value" : "*",
"origin" : "\"management.endpoints.web.exposure.include\" from property source \"Inlined Test Properties\""
} ],
"exclude" : [ ]
},
"basePath" : { }
}
},
"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. |
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: 825
{
"activeProfiles" : [ ],
"propertySources" : [ {
"name" : "systemProperties",
"properties" : {
"java.runtime.name" : {
"value" : "OpenJDK Runtime Environment"
},
"java.vm.version" : {
"value" : "25.275-b01"
},
"java.vm.vendor" : {
"value" : "AdoptOpenJDK"
}
}
}, {
"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: 517
{
"property" : {
"source" : "Config resource 'class path resource [application.properties]' via location 'classpath:/'",
"value" : "1000"
},
"activeProfiles" : [ ],
"propertySources" : [ {
"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" : "2021-01-15T02:59:15.604Z",
"installedRank" : 1,
"executionTime" : 3
} ]
}
}
}
}
}
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" : 194687758336,
"free" : 110091403264,
"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 in HPROF format and can be large.
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" : "2021-01-15T02:59:14.448Z",
"principal" : {
"name" : "alice"
},
"session" : {
"id" : "d07633b0-6803-4c95-b04a-e931b5f44d8b"
},
"request" : {
"method" : "GET",
"uri" : "https://api.example.com",
"headers" : {
"Accept" : [ "application/json" ]
}
},
"response" : {
"status" : 200,
"headers" : {
"Content-Type" : [ "application/json" ]
}
},
"timeTaken" : 1
} ]
}
11.1.1. 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: 235
{
"git" : {
"commit" : {
"time" : "+53010-05-28T10:08:57Z",
"id" : "df027cf"
},
"branch" : "master"
},
"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 build
and git
contributions.
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. |
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: 961
{
"contentDescriptor" : {
"providerVersion" : "5.4.3",
"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: 688
{
"contexts" : {
"application" : {
"liquibaseBeans" : {
"liquibase" : {
"changeSets" : [ {
"author" : "marceloverdijk",
"changeLog" : "classpath:/db/changelog/db.changelog-master.yaml",
"comments" : "",
"contexts" : [ ],
"dateExecuted" : "2021-01-15T02:59:06.376Z",
"deploymentId" : "0679546339",
"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.2.1. Response Structure
The response contains details of the requested logger. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Configured level of the logger, if any. |
|
|
Effective level of the logger. |
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.3.1. Response Structure
The response contains details of the requested group. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Configured level of the logger group, if any. |
|
|
Loggers that are part of this group |
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.4.1. Request Structure
The request specifies the desired level of the logger. The following table describes the structure of the request:
Path | Type | Description |
---|---|---|
|
|
Level for the logger. May be omitted to clear the level. |
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.5.1. Request Structure
The request specifies the desired level of the logger group. The following table describes the structure of the request:
Path | Type | Description |
---|---|---|
|
|
Level for the logger. May be omitted to clear the level. |
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:40643/actuator/mappings' -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
Transfer-Encoding: chunked
Date: Fri, 15 Jan 2021 02:59:16 GMT
Content-Length: 5398
{
"contexts" : {
"application" : {
"mappings" : {
"dispatcherServlets" : {
"dispatcherServlet" : [ {
"handler" : "Actuator root web endpoint",
"predicate" : "{GET [/actuator], produces [application/vnd.spring-boot.actuator.v3+json || application/vnd.spring-boot.actuator.v2+json || application/json]}",
"details" : {
"handlerMethod" : {
"className" : "org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping.WebMvcLinksHandler",
"name" : "links",
"descriptor" : "(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)Ljava/lang/Object;"
},
"requestMappingConditions" : {
"consumes" : [ ],
"headers" : [ ],
"methods" : [ "GET" ],
"params" : [ ],
"patterns" : [ "/actuator" ],
"produces" : [ {
"mediaType" : "application/vnd.spring-boot.actuator.v3+json",
"negated" : false
}, {
"mediaType" : "application/vnd.spring-boot.actuator.v2+json",
"negated" : false
}, {
"mediaType" : "application/json",
"negated" : false
} ]
}
}
}, {
"handler" : "Actuator web endpoint 'mappings'",
"predicate" : "{GET [/actuator/mappings], produces [application/vnd.spring-boot.actuator.v3+json || application/vnd.spring-boot.actuator.v2+json || application/json]}",
"details" : {
"handlerMethod" : {
"className" : "org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping.OperationHandler",
"name" : "handle",
"descriptor" : "(Ljavax/servlet/http/HttpServletRequest;Ljava/util/Map;)Ljava/lang/Object;"
},
"requestMappingConditions" : {
"consumes" : [ ],
"headers" : [ ],
"methods" : [ "GET" ],
"params" : [ ],
"patterns" : [ "/actuator/mappings" ],
"produces" : [ {
"mediaType" : "application/vnd.spring-boot.actuator.v3+json",
"negated" : false
}, {
"mediaType" : "application/vnd.spring-boot.actuator.v2+json",
"negated" : false
}, {
"mediaType" : "application/json",
"negated" : false
} ]
}
}
}, {
"handler" : "org.springframework.boot.actuate.autoconfigure.endpoint.web.documentation.MappingsEndpointServletDocumentationTests$ExampleController#example()",
"predicate" : "{POST [/], params [a!=alpha], headers [X-Custom=Foo], consumes [application/json || !application/xml], produces [text/plain]}",
"details" : {
"handlerMethod" : {
"className" : "org.springframework.boot.actuate.autoconfigure.endpoint.web.documentation.MappingsEndpointServletDocumentationTests.ExampleController",
"name" : "example",
"descriptor" : "()Ljava/lang/String;"
},
"requestMappingConditions" : {
"consumes" : [ {
"mediaType" : "application/json",
"negated" : false
}, {
"mediaType" : "application/xml",
"negated" : true
} ],
"headers" : [ {
"name" : "X-Custom",
"value" : "Foo",
"negated" : false
} ],
"methods" : [ "POST" ],
"params" : [ {
"name" : "a",
"value" : "alpha",
"negated" : true
} ],
"patterns" : [ "/" ],
"produces" : [ {
"mediaType" : "text/plain",
"negated" : false
} ]
}
}
}, {
"handler" : "ResourceHttpRequestHandler [class path resource [META-INF/resources/webjars/]]",
"predicate" : "/webjars/**"
}, {
"handler" : "ResourceHttpRequestHandler [class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], ServletContext resource [/]]",
"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.1.1. Response Structure
The response contains details of the metric names. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Names of the known metrics. |
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.375548927E9
} ],
"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: 2369
# 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",} 458752.0
jvm_buffer_total_capacity_bytes{id="mapped",} 0.0
# HELP jvm_memory_max_bytes The maximum amount of memory in bytes that can be used for memory management
# TYPE jvm_memory_max_bytes gauge
jvm_memory_max_bytes{area="heap",id="PS Survivor Space",} 1.1534336E7
jvm_memory_max_bytes{area="heap",id="PS Old Gen",} 7.16177408E8
jvm_memory_max_bytes{area="heap",id="PS Eden Space",} 3.34495744E8
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_count_buffers An estimate of the number of buffers in the pool
# TYPE jvm_buffer_count_buffers gauge
jvm_buffer_count_buffers{id="direct",} 14.0
jvm_buffer_count_buffers{id="mapped",} 0.0
# HELP jvm_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",} 458753.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",} 5131192.0
jvm_memory_used_bytes{area="heap",id="PS Old Gen",} 1.73511496E8
jvm_memory_used_bytes{area="heap",id="PS Eden Space",} 9162936.0
jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 1.60745216E8
jvm_memory_used_bytes{area="nonheap",id="Code Cache",} 5.1102144E7
jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 2.3439392E7
# 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",} 1.1534336E7
jvm_memory_committed_bytes{area="heap",id="PS Old Gen",} 4.26246144E8
jvm_memory_committed_bytes{area="heap",id="PS Eden Space",} 3.3292288E8
jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 1.75439872E8
jvm_memory_committed_bytes{area="nonheap",id="Code Cache",} 5.144576E7
jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 2.6083328E7
19.1.1. Query Parameters
The endpoint uses query parameters to limit the samples that it returns. The following table shows the supported query parameters:
Parameter | Description |
---|---|
|
Restricts the samples to those that match the names. Optional. |
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: 1105
# 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",} 1.1534336E7
jvm_memory_committed_bytes{area="heap",id="PS Old Gen",} 4.26246144E8
jvm_memory_committed_bytes{area="heap",id="PS Eden Space",} 3.3292288E8
jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 1.75439872E8
jvm_memory_committed_bytes{area="nonheap",id="Code Cache",} 5.144576E7
jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 2.6083328E7
# 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",} 5131192.0
jvm_memory_used_bytes{area="heap",id="PS Old Gen",} 1.73511496E8
jvm_memory_used_bytes{area="heap",id="PS Eden Space",} 1.832812E7
jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 1.60751168E8
jvm_memory_used_bytes{area="nonheap",id="Code Cache",} 5.1124544E7
jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 2.343996E7
20. Scheduled Tasks (scheduledtasks
)
The scheduledtasks
endpoint provides information about the application’s scheduled tasks.
20.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@580398f9"
} ]
}
20.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. |
21. Sessions (sessions
)
The sessions
endpoint provides information about the application’s HTTP sessions that are managed by Spring Session.
21.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" : "7fb10ba6-5bf0-4e6f-9fad-bed755792675",
"attributeNames" : [ ],
"creationTime" : "2021-01-14T14:59:10.261Z",
"lastAccessedTime" : "2021-01-15T02:58:25.261Z",
"maxInactiveInterval" : 1800,
"expired" : false
}, {
"id" : "4db5efcc-99cb-4d05-a52c-b49acfbb7ea9",
"attributeNames" : [ ],
"creationTime" : "2021-01-14T21:59:10.262Z",
"lastAccessedTime" : "2021-01-15T02:58:33.262Z",
"maxInactiveInterval" : 1800,
"expired" : false
}, {
"id" : "e94bbccb-4f67-4353-9555-c525d4966ed2",
"attributeNames" : [ ],
"creationTime" : "2021-01-15T00:59:10.262Z",
"lastAccessedTime" : "2021-01-15T02:58:58.262Z",
"maxInactiveInterval" : 1800,
"expired" : false
} ]
}
21.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. |
21.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. |
21.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" : "2021-01-14T21:59:10.262Z",
"lastAccessedTime" : "2021-01-15T02:58:33.262Z",
"maxInactiveInterval" : 1800,
"expired" : false
}
21.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. |
21.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
.
22. Shutdown (shutdown
)
The shutdown
endpoint is used to shut down the application.
22.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..."
}
22.1.1. Response Structure
The response contains details of the result of the shutdown request. The following table describes the structure of the response:
Path | Type | Description |
---|---|---|
|
|
Message describing the result of the request. |
23. Application Startup (startup
)
The startup
endpoint provides information about the application’s startup sequence.
23.1. Retrieving the Application Startup steps
To retrieve 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: 907
{
"springBootVersion" : "2.4.2",
"timeline" : {
"startTime" : "2021-01-15T02:59:13.138Z",
"events" : [ {
"startupStep" : {
"name" : "spring.boot.application.starting",
"id" : 1,
"parentId" : 0,
"tags" : [ {
"key" : "mainApplicationClass",
"value" : "com.example.startup.StartupApplication"
} ]
},
"startTime" : "2021-01-15T02:59:13.233328375Z",
"endTime" : "2021-01-15T02:59:13.233643016Z",
"duration" : "PT0.000314641S"
}, {
"startupStep" : {
"name" : "spring.beans.instantiate",
"id" : 2,
"parentId" : 0,
"tags" : [ {
"key" : "beanName",
"value" : "homeController"
} ]
},
"startTime" : "2021-01-15T02:59:13.233689006Z",
"endTime" : "2021-01-15T02:59:13.233694178Z",
"duration" : "PT0.000005172S"
} ]
}
}
23.1.1. Response Structure
The response contains details of the application startup steps recorded so far by the application. 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. |
24. Thread Dump (threaddump
)
The threaddump
endpoint provides a thread dump from the application’s JVM.
24.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: 8349
{
"threads" : [ {
"threadName" : "Thread-33",
"threadId" : 484,
"blockedTime" : -1,
"blockedCount" : 0,
"waitedTime" : -1,
"waitedCount" : 0,
"lockOwnerId" : -1,
"inNative" : false,
"suspended" : false,
"threadState" : "RUNNABLE",
"stackTrace" : [ ],
"lockedMonitors" : [ ],
"lockedSynchronizers" : [ ]
}, {
"threadName" : "nioEventLoopGroup-10-2",
"threadId" : 433,
"blockedTime" : -1,
"blockedCount" : 0,
"waitedTime" : -1,
"waitedCount" : 0,
"lockOwnerId" : -1,
"inNative" : true,
"suspended" : false,
"threadState" : "RUNNABLE",
"stackTrace" : [ {
"methodName" : "epollWait",
"fileName" : "EPollArrayWrapper.java",
"lineNumber" : -2,
"className" : "sun.nio.ch.EPollArrayWrapper",
"nativeMethod" : true
}, {
"methodName" : "poll",
"fileName" : "EPollArrayWrapper.java",
"lineNumber" : 269,
"className" : "sun.nio.ch.EPollArrayWrapper",
"nativeMethod" : false
}, {
"methodName" : "doSelect",
"fileName" : "EPollSelectorImpl.java",
"lineNumber" : 93,
"className" : "sun.nio.ch.EPollSelectorImpl",
"nativeMethod" : false
}, {
"methodName" : "lockAndDoSelect",
"fileName" : "SelectorImpl.java",
"lineNumber" : 86,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}, {
"methodName" : "select",
"fileName" : "SelectorImpl.java",
"lineNumber" : 97,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}, {
"methodName" : "select",
"fileName" : "SelectorImpl.java",
"lineNumber" : 101,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}, {
"methodName" : "select",
"fileName" : "SelectedSelectionKeySetSelector.java",
"lineNumber" : 68,
"className" : "io.netty.channel.nio.SelectedSelectionKeySetSelector",
"nativeMethod" : false
}, {
"methodName" : "select",
"fileName" : "NioEventLoop.java",
"lineNumber" : 810,
"className" : "io.netty.channel.nio.NioEventLoop",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "NioEventLoop.java",
"lineNumber" : 457,
"className" : "io.netty.channel.nio.NioEventLoop",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "SingleThreadEventExecutor.java",
"lineNumber" : 989,
"className" : "io.netty.util.concurrent.SingleThreadEventExecutor$4",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "ThreadExecutorMap.java",
"lineNumber" : 74,
"className" : "io.netty.util.internal.ThreadExecutorMap$2",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "FastThreadLocalRunnable.java",
"lineNumber" : 30,
"className" : "io.netty.util.concurrent.FastThreadLocalRunnable",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "Thread.java",
"lineNumber" : 748,
"className" : "java.lang.Thread",
"nativeMethod" : false
} ],
"lockedMonitors" : [ {
"className" : "io.netty.channel.nio.SelectedSelectionKeySet",
"identityHashCode" : 20314701,
"lockedStackDepth" : 3,
"lockedStackFrame" : {
"methodName" : "lockAndDoSelect",
"fileName" : "SelectorImpl.java",
"lineNumber" : 86,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}
}, {
"className" : "java.util.Collections$UnmodifiableSet",
"identityHashCode" : 728358327,
"lockedStackDepth" : 3,
"lockedStackFrame" : {
"methodName" : "lockAndDoSelect",
"fileName" : "SelectorImpl.java",
"lineNumber" : 86,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}
}, {
"className" : "sun.nio.ch.EPollSelectorImpl",
"identityHashCode" : 357704034,
"lockedStackDepth" : 3,
"lockedStackFrame" : {
"methodName" : "lockAndDoSelect",
"fileName" : "SelectorImpl.java",
"lineNumber" : 86,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}
} ],
"lockedSynchronizers" : [ ]
}, {
"threadName" : "nioEventLoopGroup-10-1",
"threadId" : 431,
"blockedTime" : -1,
"blockedCount" : 0,
"waitedTime" : -1,
"waitedCount" : 0,
"lockOwnerId" : -1,
"inNative" : true,
"suspended" : false,
"threadState" : "RUNNABLE",
"stackTrace" : [ {
"methodName" : "epollWait",
"fileName" : "EPollArrayWrapper.java",
"lineNumber" : -2,
"className" : "sun.nio.ch.EPollArrayWrapper",
"nativeMethod" : true
}, {
"methodName" : "poll",
"fileName" : "EPollArrayWrapper.java",
"lineNumber" : 269,
"className" : "sun.nio.ch.EPollArrayWrapper",
"nativeMethod" : false
}, {
"methodName" : "doSelect",
"fileName" : "EPollSelectorImpl.java",
"lineNumber" : 93,
"className" : "sun.nio.ch.EPollSelectorImpl",
"nativeMethod" : false
}, {
"methodName" : "lockAndDoSelect",
"fileName" : "SelectorImpl.java",
"lineNumber" : 86,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}, {
"methodName" : "select",
"fileName" : "SelectorImpl.java",
"lineNumber" : 97,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}, {
"methodName" : "select",
"fileName" : "SelectorImpl.java",
"lineNumber" : 101,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}, {
"methodName" : "select",
"fileName" : "SelectedSelectionKeySetSelector.java",
"lineNumber" : 68,
"className" : "io.netty.channel.nio.SelectedSelectionKeySetSelector",
"nativeMethod" : false
}, {
"methodName" : "select",
"fileName" : "NioEventLoop.java",
"lineNumber" : 810,
"className" : "io.netty.channel.nio.NioEventLoop",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "NioEventLoop.java",
"lineNumber" : 457,
"className" : "io.netty.channel.nio.NioEventLoop",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "SingleThreadEventExecutor.java",
"lineNumber" : 989,
"className" : "io.netty.util.concurrent.SingleThreadEventExecutor$4",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "ThreadExecutorMap.java",
"lineNumber" : 74,
"className" : "io.netty.util.internal.ThreadExecutorMap$2",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "FastThreadLocalRunnable.java",
"lineNumber" : 30,
"className" : "io.netty.util.concurrent.FastThreadLocalRunnable",
"nativeMethod" : false
}, {
"methodName" : "run",
"fileName" : "Thread.java",
"lineNumber" : 748,
"className" : "java.lang.Thread",
"nativeMethod" : false
} ],
"lockedMonitors" : [ {
"className" : "io.netty.channel.nio.SelectedSelectionKeySet",
"identityHashCode" : 1385992940,
"lockedStackDepth" : 3,
"lockedStackFrame" : {
"methodName" : "lockAndDoSelect",
"fileName" : "SelectorImpl.java",
"lineNumber" : 86,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}
}, {
"className" : "java.util.Collections$UnmodifiableSet",
"identityHashCode" : 2094398816,
"lockedStackDepth" : 3,
"lockedStackFrame" : {
"methodName" : "lockAndDoSelect",
"fileName" : "SelectorImpl.java",
"lineNumber" : 86,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}
}, {
"className" : "sun.nio.ch.EPollSelectorImpl",
"identityHashCode" : 431231784,
"lockedStackDepth" : 3,
"lockedStackFrame" : {
"methodName" : "lockAndDoSelect",
"fileName" : "SelectorImpl.java",
"lineNumber" : 86,
"className" : "sun.nio.ch.SelectorImpl",
"nativeMethod" : false
}
} ],
"lockedSynchronizers" : [ ]
} ]
}
24.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 |
24.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: 25878
2021-01-15 02:58:59
Full thread dump OpenJDK 64-Bit Server VM (25.275-b01 mixed mode):
"nioEventLoopGroup-10-2" - Thread t@433
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 <135fa4d> (a io.netty.channel.nio.SelectedSelectionKeySet)
- locked <2b69ddb7> (a java.util.Collections$UnmodifiableSet)
- locked <15522162> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101)
at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:68)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:810)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:457)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"nioEventLoopGroup-10-1" - Thread t@431
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 <529c92ec> (a io.netty.channel.nio.SelectedSelectionKeySet)
- locked <7cd5fd60> (a java.util.Collections$UnmodifiableSet)
- locked <19b41328> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101)
at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:68)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:810)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:457)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"nioEventLoopGroup-8-2" - Thread t@358
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 <1de9684d> (a io.netty.channel.nio.SelectedSelectionKeySet)
- locked <2bd482ee> (a java.util.Collections$UnmodifiableSet)
- locked <78395409> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101)
at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:68)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:810)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:457)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"nioEventLoopGroup-8-1" - Thread t@356
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 <412d2575> (a io.netty.channel.nio.SelectedSelectionKeySet)
- locked <1750861d> (a java.util.Collections$UnmodifiableSet)
- locked <189ca5eb> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101)
at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:68)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:810)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:457)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"boundedElastic-1" - Thread t@307
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <2ab733ed> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"boundedElastic-evictor-1" - Thread t@306
java.lang.Thread.State: TIMED_WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <299bd43> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"/127.0.0.1:33606 to /127.0.0.1:44259 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 <11eab363> (a sun.nio.ch.Util$3)
- locked <6c24ff48> (a java.util.Collections$UnmodifiableSet)
- locked <7f9f817a> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101)
at org.gradle.internal.remote.internal.inet.SocketConnection$SocketInputStream.read(SocketConnection.java:185)
at com.esotericsoftware.kryo.io.Input.fill(Input.java:146)
at com.esotericsoftware.kryo.io.Input.require(Input.java:178)
at com.esotericsoftware.kryo.io.Input.readByte(Input.java:295)
at org.gradle.internal.serialize.kryo.KryoBackedDecoder.readByte(KryoBackedDecoder.java:82)
at org.gradle.internal.remote.internal.hub.InterHubMessageSerializer$MessageReader.read(InterHubMessageSerializer.java:64)
at org.gradle.internal.remote.internal.hub.InterHubMessageSerializer$MessageReader.read(InterHubMessageSerializer.java:52)
at org.gradle.internal.remote.internal.inet.SocketConnection.receive(SocketConnection.java:81)
at org.gradle.internal.remote.internal.hub.MessageHub$ConnectionReceive.run(MessageHub.java:270)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- Locked <12b0404f> (a java.util.concurrent.ThreadPoolExecutor$Worker)
"/127.0.0.1:33606 to /127.0.0.1:44259 workers Thread 2" - Thread t@12
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <3023486f> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at org.gradle.internal.remote.internal.hub.queue.EndPointQueue.take(EndPointQueue.java:49)
at org.gradle.internal.remote.internal.hub.MessageHub$ConnectionDispatch.run(MessageHub.java:322)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- Locked <163e4e87> (a java.util.concurrent.ThreadPoolExecutor$Worker)
"Test worker" - Thread t@11
java.lang.Thread.State: RUNNABLE
at sun.management.ThreadImpl.dumpThreads0(Native Method)
at sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:454)
at org.springframework.boot.actuate.management.ThreadDumpEndpoint.getFormattedThreadDump(ThreadDumpEndpoint.java:51)
at org.springframework.boot.actuate.management.ThreadDumpEndpoint.textThreadDump(ThreadDumpEndpoint.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282)
at org.springframework.boot.actuate.endpoint.invoke.reflect.ReflectiveOperationInvoker.invoke(ReflectiveOperationInvoker.java:77)
at org.springframework.boot.actuate.endpoint.annotation.AbstractDiscoveredOperation.invoke(AbstractDiscoveredOperation.java:60)
at org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$ServletWebOperationAdapter.handle(AbstractWebMvcEndpointHandlerMapping.java:290)
at org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(AbstractWebMvcEndpointHandlerMapping.java:373)
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.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)
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:1060)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:645)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)
at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183)
at org.springframework.boot.actuate.autoconfigure.endpoint.web.documentation.ThreadDumpEndpointDocumentationTests.textThreadDump(ThreadDumpEndpointDocumentationTests.java:186)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
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$129/1000109549.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$130/443365413.apply(Unknown Source)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.ExecutableInvoker$$Lambda$252/2025823566.apply(Unknown Source)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$291/581078778.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:206)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$199/64249365.execute(Unknown Source)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$198/113247403.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$8(NodeTestTask.java:127)
at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$197/639184045.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:126)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$203/486852709.accept(Unknown Source)
at java.util.ArrayList.forEach(ArrayList.java:1259)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$199/64249365.execute(Unknown Source)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$198/113247403.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$8(NodeTestTask.java:127)
at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$197/639184045.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:126)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$203/486852709.accept(Unknown Source)
at java.util.ArrayList.forEach(ArrayList.java:1259)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$199/64249365.execute(Unknown Source)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$198/113247403.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$8(NodeTestTask.java:127)
at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$197/639184045.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:126)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
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$158/1469989850.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:96)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
at com.sun.proxy.$Proxy2.stop(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:133)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- Locked <23986957> (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 <741694a3> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
Locked ownable synchronizers:
- None
"Reference Handler" - Thread t@2
java.lang.Thread.State: WAITING
at java.lang.Object.wait(Native Method)
- waiting on <3f83fbd6> (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