Back to Javatutorial

SpringBoot生产环境工具Actuator

docs/Spring全家桶/SpringBoot/SpringBoot生产环境工具Actuator.md

1.0.092.7 KB
Original Source

Back to index

վ(springdoc.cn)еԴ spring.io ԭʼȨ spring.io springboot.io - Spring Boot з룬ɹѧϰоδɣýκתءû֮صΪ ̱Spring Pivotal Software, Inc. Լҵ̱ꡣ

Spring BootһЩĹܣ԰ڽӦó򷢲ʱغ͹Ӧó ѡͨʹHTTP˵ʹJMXͼӦó ơָռҲԶӦӦó

1. Ĺ

spring-boot-actuator ģṩSpring Bootܡ ЩܵƼӶ spring-boot-starter-actuator Starter

ActuatorĶ

actuatorִ һָƶijĻеװáactuator ԴһСı仯в˶

ҪڻMavenĿactuator Starter

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        spring-boot-starter-actuator
    </dependency>
</dependencies>

Gradleʹ

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

2. ˵㣨Endpoint

Actuator ˵㣨endpointԼزӦó򻥶 Spring BootһЩõĶ˵㣬ԼĶ˵㡣 磬health ˵ṩӦó򽡿Ϣ

ûÿĶ˵㣬ͨHTTPJMXǣʹǿԶ̷ʣһ˵㱻úͱ¶ʱΪǿõġõĶ˵ֻǿʱŻᱻԶáӦóѡͨHTTP¶ж˵ID /actuator ǰ׺ӳ䵽һURL磬Ĭ£health ˵㱻ӳ䵽 /actuator/health

Ҫ˽actuatorĶ˵ԼǵӦʽ뿴APIĵ HTML PDF

Ǽ޹صնˡ

<colgroup><col><col></colgroup> | ID | ˵ | | --- | --- | | `auditevents` | ǰӦó¼Ϣ Ҫһ `AuditEventRepository` bean | | `beans` | ʾӦóSpring Beanб | | `caches` | ʾõĻ档 | | `conditions` | ʾúԶԼǷϻ򲻷ϵԭ | | `configprops` | ʾ `@ConfigurationProperties` б | | `env` | ¶Spring `ConfigurableEnvironment` еԡ | | `flyway` | ʾκѾӦõFlywayݿǨơ Ҫһ `Flyway` bean | | `health` | ʾӦóĽϢ | | `httpexchanges` | ʾ HTTP exchange ϢĬ£ 100 HTTP request/response exchange Ҫһ `HttpExchangeRepository` bean | | `info` | ʾӦóϢ | | `integrationgraph` | ʾSpringͼ Ҫ `spring-integration-core` | | `loggers` | ʾ޸Ӧóloggerá | | `liquibase` | ʾκѾӦõLiquibaseݿǨơ Ҫһ `Liquibase` Bean | | `metrics` | ʾǰӦó metrics Ϣ | | `mappings` | ʾ `@RequestMapping` ·б | | `quartz` | ʾйQuartz Scheduler JobϢ | | `scheduledtasks` | ʾӦóеļƻ | | `sessions` | Spring Sessionֵ֧ĻỰ洢мɾûỰ ҪһʹSpring SessionĻServletWebӦó | | `shutdown` | ӦóŵعرաֻʹjarʱЧĬǽõġ | | `startup` | ʾ `ApplicationStartup` ռ[](https://springdoc.cn/spring-boot/features.html#features.spring-application.startup-tracking)Ҫ `SpringApplication` Ϊ `BufferingApplicationStartup` | | `threaddump` | Performs a thread dump. |

ӦóһWebӦóSpring MVCSpring WebFluxJerseyʹ¶Ķ˵㡣

<colgroup><col><col></colgroup> | ID | ˵ | | --- | --- | | `heapdump` | һdumpļ HotSpot JVMϣһ `HPROF` ʽļ OpenJ9 JVMϣһ `PHD` ʽļ | | `logfile` | ־ļݣ `logging.file.name` `logging.file.path` ѱã ֧ʹHTTP `Range` ͷ־ļIJݡ | | `prometheus` | Կɱ Prometheus ץȡĸʽչʾmetric `micrometer-registry-prometheus` |

2.1. ö˵

Ĭ£ shutdown ж˵㶼á Ҫһ˵ãʹ management.endpoint.<id>.enabled ԡ shutdown ˵㡣

Properties

Yaml

management.endpoint.shutdown.enabled=true

ϣ˵ǡѡáǡѡá뽫 management.endpoints.enabled-by-default Ϊ falseʹõ˵ enabled ѡá info ˵㣬˵㡣

Properties

Yaml

management.endpoints.enabled-by-default=false
management.endpoint.info.enabled=true

õĶ˵Ӧóȫɾֻı䱩¶˵ļʹ include exclude

2.2. ¶˵

Ĭ£ֻhealth˵ͨHTTPJMX¶ġ ڶ˵ܰϢӦϸǺʱ¶ǡ

ҪıЩ˵㱻¶ʹض include exclude ԡ

<colgroup><col><col></colgroup> | | Ĭ | | --- | --- | | `management.endpoints.jmx.exposure.exclude` | | | `management.endpoints.jmx.exposure.include` | `health` | | `management.endpoints.web.exposure.exclude` | | | `management.endpoints.web.exposure.include` | `health` |

include г˱¶Ķ˵ID exclude г˲ӦñĶ˵ID exclude include ԡ һ˵IDб include exclude ԡ

磬ҪͨJMXֻ health info ˵㣬ʹԡ

Properties

Yaml

management.endpoints.jmx.exposure.include=health,info

* ѡж˵㡣 磬ҪͨHTTPеĶ env beans ˵㣬ʹԡ

Properties

Yaml

management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,beans

* YAMLо⺬壬ųеĶ˵㣬һҪš
Ӧóǹ¶ģǿҽҲĶ˵
ڶ˵㱩¶ʱʵʩԼIJԣעһ EndpointFilter bean

2.3. ȫSecurity

Ϊ˰ȫĬֻ /health ˵ͨHTTP ʹ management.endpoints.web.exposure.include ñ¶Ķ˵㡣

management.endpoints.web.exposure.include ֮ǰȷ¶ִϢڷǽ֮󣬻Spring Security֮Ķ֤ȫ

Spring Securityclasspathϣû SecurityFilterChain beanô /health ִ֮actuatorSpring BootԶ֤ȫ 㶨һԶ SecurityFilterChain beanSpring BootԶþͻȫִķʹ

ΪHTTP˵Զ尲ȫ磬ֻijֽɫûʣSpring BootṩһЩ RequestMatcher Spring Securityʹá

һ͵Spring Securityÿܿӡ

Java

Kotlin

@Configuration(proxyBeanMethods = false)
public class MySecurityConfiguration {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.securityMatcher(EndpointRequest.toAnyEndpoint());
        http.authorizeHttpRequests((requests) -> requests.anyRequest().hasRole("ENDPOINT_ADMIN"));
        http.httpBasic(withDefaults());
        return http.build();
    }

}

ǰʹ EndpointRequest.toAnyEndpoint() ƥһκζ˵㣬ȻȷеĶ˵㶼 ENDPOINT_ADMIN Ľɫ EndpointRequest ϻƥ APIĵ HTML PDF

ڷǽ沿Ӧóϣִ˵㶼ܱʣҪ֤ ͨı management.endpoints.web.exposure.include һ㣬ʾ

Properties

Yaml

management.endpoints.web.exposure.include=*

⣬Spring SecurityҪԶ尲ȫãδ֤ķʶ˵㣬ʾ

Java

Kotlin

@Configuration(proxyBeanMethods = false)
public class MySecurityConfiguration {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.securityMatcher(EndpointRequest.toAnyEndpoint());
        http.authorizeHttpRequests((requests) -> requests.anyRequest().permitAll());
        return http.build();
    }

}

ǰУֻactuator˵㡣 Spring Bootİȫκ SecurityFilterChain bean¶ȫ˳Ҫһ SecurityFilterChain beanӦó֡

2.3.1. վα챣CSRF

Spring BootSpring SecurityĬֵCSRFĬ±򿪡 ζʹĬϰȫʱҪ POSTshutdownloggers˵㣩PUT DELETE actuator˵403ֹĴ

ǽֻ㴴ķ񱻷ͻʹʱȫCSRF

Springȫοָ ҵCSRFϢ

2.4. ö˵

˵Զ治ҪκβĶȡӦ Ҫö˵㻺Ӧʱ䣬ʹ cache.time-to-live ԡ ӽ beans ˵ĻʱΪ10롣

Properties

Yaml

management.endpoint.beans.cache.time-to-live=10s

management.endpoint.<name> ǰ׺ΨһرʶõĶ˵㡣

2.5. Actuator Web ˵ijý壨Hypermedia

һ discovery page ӵж˵С Ĭ£discovery page /actuator ǿõġ

Ҫ discovery pageӦóԡ

Properties

Yaml

management.endpoints.web.discovery.enabled=false

һԶĹ·ʱdiscovery page Զ /actuator Ƶĵĸ 磬· /managementdiscovery pageԴ /management á ·Ϊ / ʱҳãԷֹmappingͻĿԡ

2.6. CORS֧

ԴԴCORS W3Cһ淶ķʽָֿȨʹSpring MVCSpring WebFluxActuatorWeb˵֧

CORS֧Ĭǽõģֻ management.endpoints.web.cors.allowed-origins ԺŻá example.com е GET POST

Properties

Yaml

management.endpoints.web.cors.allowed-origins=https://example.com
management.endpoints.web.cors.allowed-methods=GET,POST

μ CorsEndpointProperties Իѡб

2.7. ʵԶ˵

һ @Endpoint ע @Beanκδ @ReadOperation``@WriteOperation @DeleteOperation ע͵ķԶͨJMXWebӦóҲͨHTTP ͨʹJerseySpring MVCSpring WebFlux˵ͨHTTP¶ JerseySpring MVCãʹSpring MVC

ӱ¶һһԶ

Java

Kotlin

@ReadOperation
public CustomData getData() {
    return new CustomData("test", 5);
}

Ҳͨʹ @JmxEndpoint @WebEndpoint дضĶ˵㡣 Щ˵㱻ǸԵļϡ 磬@WebEndpoint ֻͨHTTP¶ͨJMX

ͨʹ @EndpointWebExtension @EndpointJmxExtension дضļչ ЩעṩضIJǿеĶ˵㡣

ҪWebܵضܣʵservletSpring @Controller @RestController ˵㣬DzͨJMXʹòͬWebʱá

2.7.1.

˵ϵIJͨ롣 ͨwebʱЩֵURLIJѯJSON塣 ͨJMXʱӳ䵽MBeanIJС Ĭ£DZġ ǿͨʹ @javax.annotation.Nullable @org.springframework.lang.Nullable עΪѡ

ԽJSONеÿӳ䵽˵һ һJSON塣

{
    "name": "test",
    "counter": 42
}

һдòҪ String name int counter ʾ

Java

Kotlin

@WriteOperation
public void updateData(String name, int counter) {
    // injects "test" and 42
}

Ϊ˵Ǽ֪ģڷǩָֻ򵥵͡ رǣ֧ CustomData һ name counter Եĵһ
Ϊӳ䵽IJʵֶ˵JavaӦ -parameters 룬ʵֶ˵KotlinӦ -java-parameters 롣 ʹSpring BootGradleʹMaven spring-boot-starter-parent⽫Զ
ת

бҪݸ˵IJԶתΪ͡ ڵò֮ǰͨJMXHTTPյ뱻תΪͣʹ ApplicationConversionService ʵԼκ Converter GenericConverter Bean @EndpointConverter ޶

2.7.2. ԶWEB˵

@Endpoint``@WebEndpoint @EndpointWebExtension ԶʹJerseySpring MVCSpring WebFluxͨHTTP JerseySpring MVCãʹSpring MVC

WEB˵νʣPredicates

һνʻΪweb¶Ķ˵ϵÿoperationԶɡ

Path

pathνɶ˵ID籩¶Ķ˵Ļ· ĬϵĻ· /actuator 磬һIDΪ sessions Ķ˵νʹ /actuator/sessions Ϊ·

ͨ @Selector עһһ· IJΪһ·ӵ·νС ڵö˵ʱñֵᱻ 벶ʣ·Ԫأһ @Selector(Match=ALL_REMAINING)ʹΪһ String[] תݵ͡

HTTP method

HTTP methodνɲ;ģ±ʾ

<colgroup><col><col></colgroup> | Operation | HTTP method | | --- | --- | | `@ReadOperation` | `GET` | | `@WriteOperation` | `POST` | | `@DeleteOperation` | `DELETE` |
Consumes

ʹrequest body @WriteOperationHTTP POSTνʵ consumes Ӿ application/vnd.spring-boot.actuator.v2+json, application/json consumes Ӿǿյġ

Produces

νʵ produces Ӿ @DeleteOperation``@ReadOperation @WriteOperation ע͵ produces Ծ ǿѡġ ʹproduces ӾԶȷ

void Void produces ӾΪա org.springframework.core.io.Resource``produces Ӿ application/octet-stream produces Ӿ application/vnd.spring-boot.actuator.v2+json, application/json

WEB˵Ӧ״̬

˵ĬӦ״̬ȡڲͣдɾͲصݣеĻ

@ReadOperation һֵӦ״̬200(Ok) ûзһֵӦ״̬404(Not Found)

@WriteOperation @DeleteOperation һֵӦ״̬200OK ûзһֵӦ״̬204No Content

һڵʱûIJ߲ܱתΪͣͲᱻãӦ״̬400Bad Request

WEB˵ Range

ʹHTTP rangeһHTTPԴһ֡ ʹSpring MVCSpring Web Fluxʱ org.springframework.core.io.Resource IJԶַ֧Χ

ʹJerseyʱ֧ Range
Web˵İȫ

web˵webض˵չϵIJԽյǰ java.security.Principal org.springframework.boot.actuate.endpoint.SecurityContext Ϊ ǰͨ @Nullable һʹãΪ֤δ֤ûṩͬΪ ͨͨʹ isUserInRole(String) ִȨ顣

2.7.3. Servlet ˵

һServletΪһ˵㱩¶ʵһ @ServletEndpoint ע࣬ͬʱʵ Supplier<EndpointServlet> Servlet˵ṩservletĸεϣȴ˿ֲԡ ǵĿеServletΪһ˵ µĶ˵㣬Ӧѡ @Endpoint @WebEndpoint ע⡣

2.7.4. Controller ˵

ʹ @ControllerEndpoint @RestControllerEndpoint ʵһSpring MVCSpring WebFluxĶ˵㡣 ͨʹSpring MVCSpring WebFluxı׼עӳ䣬 @RequestMapping @GetMapping˵ID·ǰ׺ ˵ṩSpringWebܸļɣȴ˿ֲԡ Ӧѡ @Endpoint @WebEndpoint ע⡣

2.8. Ϣ

ʹýϢеӦó״̬ ϵͳʱѱˡ health ˵㱩¶Ϣȡ management.endpoint.health.show-details management.endpoint.health.show-components ԣǿΪֵ֮һ

<colgroup><col><col></colgroup> | ֵ | ˵ | | --- | --- | | `never` | ϸڴӲʾ | | `when-authorized` | ϸֻʾȨû ȨĽɫͨʹ `management.endpoint.health.roles` á | | `always` | ʾû |

Ĭֵ never ûڶ˵һɫʱDZΪDZȨġ ˵ûýɫĬֵ֤ûΪȨġ ͨʹ management.endpoint.health.roles ýɫ

ѾӦóϣʹ alwaysİȫãsecurity configuration֤ͷ֤ûhealth˵㡣

ϢǴ HealthContributorRegistry ռģĬ£ HealthContributor ʵ ApplicationContext У Spring BootһЩԶõ HealthContributorҲԱдԼġ

һ HealthContributor һ HealthIndicator һ CompositeHealthContributor һ HealthIndicator ṩʵʵĽϢ Status һ CompositeHealthContributorHealthContributors ϡ ۺcontributorγһ״ṹʾϵͳĽ״

Ĭ£յϵͳ״һ StatusAggregator óģһ״̬бÿ HealthIndicator ״̬ беĵһ״̬彡״̬ û HealthIndicator ص״̬ StatusAggregator ֪ģͻʹ UNKNOWN ״̬

ʹ HealthContributorRegistry ʱעȡעὡָꡣ

2.8.1. ԶõHealthIndicators

ʵʱSpring BootԶ±г HealthIndicators Ҳͨ management.health.key.enabled ûͣѡָꡣ ±г key

<colgroup><col><col><col></colgroup> | Key | Name | ˵ | | --- | --- | --- | | `cassandra` | [`CassandraDriverHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraDriverHealthIndicator.java) | CassandraݿǷѾ | | `couchbase` | [`CouchbaseHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/couchbase/CouchbaseHealthIndicator.java) | CouchbaseȺǷѾ | | `db` | [`DataSourceHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/jdbc/DataSourceHealthIndicator.java) | ǷԻ`DataSource`ӡ | | `diskspace` | [`DiskSpaceHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/system/DiskSpaceHealthIndicator.java) | ̿ռǷ㡣 | | `elasticsearch` | [`ElasticsearchRestHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/elasticsearch/ElasticsearchRestHealthIndicator.java) | ElasticsearchȺǷѾ | | `hazelcast` | [`HazelcastHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/hazelcast/HazelcastHealthIndicator.java) | HazelcastǷѾ | | `influxdb` | [`InfluxDbHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/influx/InfluxDbHealthIndicator.java) | InfluxDBǷѾ | | `jms` | [`JmsHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/jms/JmsHealthIndicator.java) | һJMSǷѾ | | `ldap` | [`LdapHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/ldap/LdapHealthIndicator.java) | һLDAPǷ | | `mail` | [`MailHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/mail/MailHealthIndicator.java) | һʼǷ | | `mongo` | [`MongoHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/data/mongo/MongoHealthIndicator.java) | MongoݿǷѾ | | `neo4j` | [`Neo4jHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/neo4j/Neo4jHealthIndicator.java) | Neo4jݿǷѾ | | `ping` | [`PingHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/PingHealthIndicator.java) | Ӧ `UP` | | `rabbit` | [`RabbitHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/amqp/RabbitHealthIndicator.java) | һRabbitǷѾ | | `redis` | [`RedisHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/data/redis/RedisHealthIndicator.java) | RedisǷѾ |
ͨ management.health.defaults.enabled ǡ

HealthIndicators ǿõģĬ²á

<colgroup><col><col><col></colgroup> | Key | Name | ˵ | | --- | --- | --- | | `livenessstate` | [`LivenessStateHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/availability/LivenessStateHealthIndicator.java) | ʾ Liveness ӦóĿ״̬ | | `readinessstate` | [`ReadinessStateHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/availability/ReadinessStateHealthIndicator.java) | ¶ Readiness ӦóĿ״̬ |

2.8.2. дԶHealthIndicators

ΪṩԶĽϢעʵ HealthIndicator ӿڵSpring Bean Ҫṩһ health() ʵ֣һ Health Ӧ Health ӦӦðһstatusѡҪʾϸڡ Ĵʾһ HealthIndicator ʵ

Java

Kotlin

@Component
public class MyHealthIndicator implements HealthIndicator {

    @Override
    public Health health() {
        int errorCode = check();
        if (errorCode != 0) {
            return Health.down().withDetail("Error Code", errorCode).build();
        }
        return Health.up().build();
    }

    private int check() {
        // perform some specific health check
        return ...
    }

}

һ HealthIndicator ıʶIDû HealthIndicator ׺Bean֣ڵĻ ǰУϢһΪ my Ŀҵ
ָͨͨHTTPõģҪκӳʱ֮ǰӦ κνָӦʱ䳬10룬Spring Boot¼һϢ ֵʹ management.endpoint.health.logging.slow-indicator-threshold ԡ

Spring BootԤ StatusHealth Էشϵͳ״̬Զ Status £㻹Ҫṩ StatusAggregator ӿڵԶʵ֣ͨʹ management.endpoint.health.status.order Ĭʵ֡

磬һ HealthIndicator ʵʹһΪ FATAL Status Ϊ˳Ӧóԡ

Properties

Yaml

management.endpoint.health.status.order=fatal,down,out-of-service,unknown,up

ӦеHTTP״̬뷴ӳ彡״̬ Ĭ£OUT_OF_SERVICE DOWN ӳ䵽503 κδӳĽ״̬ UPӳΪ200 ͨHTTPʽ˵㣬ܻעԶ״̬ӳ䡣 Զӳ DOWN OUT_OF_SERVICE Ĭӳ䡣 뱣Ĭӳ䣬ȷǣԼκԶӳ䡣 磬Խ FATAL ӳΪ503񲻿ã DOWN OUT_OF_SERVICE Ĭӳ䡣

Properties

Yaml

management.endpoint.health.status.http-mapping.down=503
management.endpoint.health.status.http-mapping.fatal=503
management.endpoint.health.status.http-mapping.out-of-service=503

ҪĿƣԶԼ HttpCodeStatusMapper bean

±ʾ״̬Ĭ״̬ӳ䡣

<colgroup><col><col></colgroup> | Status | Mapping | | --- | --- | | `DOWN` | `SERVICE_UNAVAILABLE` (`503`) | | `OUT_OF_SERVICE` | `SERVICE_UNAVAILABLE` (`503`) | | `UP` | Ĭûӳ䣬HTTP״̬Ϊ `200` | | `UNKNOWN` | Ĭûӳ䣬HTTP״̬Ϊ `200` |

2.8.3. Ӧʽָ

ӦʽӦóЩʹSpring WebFluxӦóReactiveHealthContributor ṩһԼȡӦóĽ״ 봫ͳ HealthContributor ƣϢ ReactiveHealthContributorRegistry ռĬ£ HealthContributor ReactiveHealthContributor ʵ ApplicationContext

ӦʽAPIмij HealthContributors ڵԵִС

һӦʽӦóУӦʹ ReactiveHealthContributorRegistry ʱעȡעὡָꡣ Ҫעһͨ HealthContributorӦ ReactiveHealthContributor#adapt װ

Ϊ˴ӦʽAPIṩԶĽϢעʵ ReactiveHealthIndicator ӿڵSpring Bean Ĵʾһ ReactiveHealthIndicator ʾʵ֡

Java

Kotlin

@Component
public class MyReactiveHealthIndicator implements ReactiveHealthIndicator {

    @Override
    public Mono<Health> health() {
        return doHealthCheck().onErrorResume((exception) ->
            Mono.just(new Health.Builder().down(exception).build()));
    }

    private Mono<Health> doHealthCheck() {
        // perform some specific health check
        return ...
    }

}

ΪԶ󣬿ԿǴ AbstractReactiveHealthIndicator չ

2.8.4. Զõ ReactiveHealthIndicators

ʵʱSpring BootԶµ ReactiveHealthIndicators

<colgroup><col><col><col></colgroup> | Key | Name | ˵ | | --- | --- | --- | | `cassandra` | [`CassandraDriverReactiveHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraDriverReactiveHealthIndicator.java) | CassandraݿǷѾ | | `couchbase` | [`CouchbaseReactiveHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/couchbase/CouchbaseReactiveHealthIndicator.java) | CouchbaseȺǷѾ | | `elasticsearch` | [`ElasticsearchReactiveHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/data/elasticsearch/ElasticsearchReactiveHealthIndicator.java) | ElasticsearchȺǷѾ | | `mongo` | [`MongoReactiveHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/data/mongo/MongoReactiveHealthIndicator.java) | MongoݿǷѾ | | `neo4j` | [`Neo4jReactiveHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/neo4j/Neo4jReactiveHealthIndicator.java) | Neo4jݿǷѾ | | `redis` | [`RedisReactiveHealthIndicator`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/data/redis/RedisReactiveHealthIndicator.java) | RedisǷѾ |
бҪӦʽָȡָꡣ ⣬κûбȷ HealthIndicator ᱻԶװ

2.8.5. Health飨Health Groups

ʱָ֯ɿڲͬĿĵǺõġ

Ҫһָ飬ʹ management.endpoint.health.group.<name> ԣָһָIDб include exclude 磬Ҫһֻݿָ飬Զ¡

Properties

Yaml

management.endpoint.health.group.custom.include=db

Ȼͨ [localhost:8080/actuator/health/custom](http://localhost:8080/actuator/health/custom)

ͬҪһ飬ݿָųڸ֮⣬ָ꣬Զ¡

Properties

Yaml

management.endpoint.health.group.custom.exclude=db

Ĭ£̳ϵͳͬ StatusAggregator HttpCodeStatusMapper á ȻҲÿĻ϶Щ ҪҲԸ show-details roles ԡ

Properties

Yaml

management.endpoint.health.group.custom.show-details=when-authorized
management.endpoint.health.group.custom.roles=admin
management.endpoint.health.group.custom.status.order=fatal,up
management.endpoint.health.group.custom.status.http-mapping.fatal=500
management.endpoint.health.group.custom.status.http-mapping.out-of-service=500

ҪעԶ StatusAggregator HttpCodeStatusMapper Bean飬ʹ @Qualifier("groupname")

һҲ԰/ųһ CompositeHealthContributor Ҳֻ/ųһ CompositeHealthContributor ij ʹȫɣʾ

management.endpoint.health.group.custom.include="test/primary"
management.endpoint.health.group.custom.exclude="test/primary/b"

Уcustom 齫Ϊ primary HealthContributorǸ test һɲ֡ primary һ壬Ϊ b HealthContributor ų custom ֮⡣

˿ڻ˿ڵĶ·ṩ KubernetesƻкãЩУڰȫǣΪִ˵ʹһĹ˿Ǻܳġ һĶ˿ڿܵ²ɿĽ飬ΪʹɹӦóҲ޷ һ·ãʾ

management.endpoint.health.group.live.additional-path="server:/healthz"

⽫ʹ live ˿ /healthz Ͽá ǰ׺ǿԵģ server:˿ڣ management:˿ڣã ·һһ·Ρ

2.8.6. Դ

DataSource ָʾ׼Դ·ԴBeanĽ״ ·ԴĽ״ÿĿԴĽ״ ڽ˵ӦУ·ԴÿĿ궼ͨʹ·ɼġ 㲻ϣָа·Դ뽫 management.health.db.ignore-routing-data-sources Ϊ true

2.9. Kubernetes ̽

KubernetesϵӦóͨ ̽ ṩйڲ״̬Ϣ KuberneteskubeletЩ̽벢ԽӦ

Ĭ£Spring BootӦÿ״̬ KubernetesУactuator ApplicationAvailability ӿռ Liveness Readiness ϢרָʹЩϢLivenessStateHealthIndicator ReadinessStateHealthIndicator Щָʾȫֽ˵㣨"/actuator/health" ҲͨʹΪHTTP̽룺"/actuator/health/liveness" "/actuator/health/readiness"

Ȼ¶˵ϢKubernetesʩ

livenessProbe:
  httpGet:
    path: "/actuator/health/liveness"
    port: 
  failureThreshold: ...
  periodSeconds: ...

readinessProbe:
  httpGet:
    path: "/actuator/health/readiness"
    port: 
  failureThreshold: ...
  periodSeconds: ...
`` ӦñΪִ˵õĶ˿ڡ WebĶ˿ڣҲһĹ˿ڣ "management.server.port" Ѿá

ֻеӦóKubernetesʱЩŻԶá ͨʹ management.endpoint.health.probes.enabled κλǡ

һӦóʱ䳬õЧڣKubernetes ᵽ "startupProbe" ΪһܵĽһ˵ﲻһҪ "startupProbe"Ϊ "readinessProbe" ֮ǰʧЧζӦó׼֮ǰյȻӦóҪܳʱԿʹ "startupProbe" ȷKubernetesӦóɱ̽ӦóеΪIJ֡

Actuator˵㱻һĹУôЩ˵Ͳʹͬʩ˿ڡӳء £ʹ磬ܽµӣ̽Ҳܳɹ ԭ˿ liveness readiness Ǹ⡣ ͨʵ֡

management.endpoint.health.probes.add-additional-paths=true

⽫ʹ liveness /livez ãreadiness readyz ˿ڿá

2.9.1. Kubernetes̽ⲿ״̬

ִ liveness readiness ̽Ϊ顣ζеĹǶǿõġ磬öĽָꡣ

Properties

Yaml

management.endpoint.health.group.readiness.include=readinessState,customCheck

Ĭ£Spring BootЩָꡣ

liveness ̽벻ӦⲿϵͳĽ顣ӦóЧ״̬ƻKubernetes᳢ͨӦóʵ⡣ζţһⲿϵͳݿ⡢Web APIⲿ棩ֹϣKubernetesܻӦóʵϡ

readiness ̽⣬ⲿϵͳѡӦó򿪷ԱԭSpring Boot׼״̬̽вκζĽ顣Ӧóʵreadiness stateunreadyKubernetesͲὫ·ɵʵһЩⲿϵͳܲӦʵ£ǿԱ׼״̬̽СⲿϵͳܲӦóĹؼӦóж·ͻˣ£ǾԲӦñڡҵǣһӦʵⲿϵͳܳжϡ׼̽УⲿʱӦóᱻֹͣ񣬻߲ջи߲εĹϣҲͨڵʹö·

һӦóʵû׼ãtype=ClusterIP NodePort Kubernetes񲻽κδӡûHTTPӦ503ȣΪûӡtype=LoadBalancer ķܽҲܲӣȡṩߡһȷ ingress ķҲһȡʵֵķʽӦ?ڷδε connection refusedڸؾڵ£HTTP 503Ǻпܵġ

⣬һӦóʹ Kubernetes autoscalingܻӦó򱻴ӸƽȡͬķӦȡautoscalerá

2.9.2. Ӧóں̽״̬

Kubernetes Probesֵ֧һҪӦóڵһԡ AvailabilityStateӦóڴڲ״̬ʵʵ̽루¶״̬֮ ʵʵ̽루¶˸״̬֮кܴ ӦóڵIJͬ׶Σ̽޷ʹá

Spring Boot͹رڼ䷢application event̽ԼЩ¼¶ AvailabilityState Ϣ

±ʾ˲ͬ׶ε AvailabilityState HTTP connector״̬

һSpring BootӦóʱ

<colgroup><col><col><col><col><col></colgroup> | ׶ | LivenessState | ReadinessState | HTTP server | ע | | --- | --- | --- | --- | --- | | Starting | `BROKEN` | `REFUSING_TRAFFIC` | δ | Kubernetes "liveness" ̽룬ʱӦó | | Started | `CORRECT` | `REFUSING_TRAFFIC` | ܾ | Ӧóıˢ¡Ӧóִ񣬻ûյ | | Ready | `CORRECT` | `ACCEPTING_TRAFFIC` | | ѾɡӦóڽ |

һSpring BootӦóرʱ

<colgroup><col><col><col><col><col></colgroup> | ͣ׶ | Liveness State | Readiness State | HTTP server | ע | | --- | --- | --- | --- | --- | | Running | `CORRECT` | `ACCEPTING_TRAFFIC` | | Ҫرա | | Graceful shutdown | `CORRECT` | `REFUSING_TRAFFIC` | µ󱻾ܾ | ã [ŹػᴦС](https://springdoc.cn/spring-boot/web.html#web.graceful-shutdown) | | Shutdown complete | N/A | N/A | ر | ӦóıرգӦó򱻹رա |
KubernetesĸϢμKubernetes֡

2.10. ӦϢ

ӦóϢ˴ ApplicationContext ж InfoContributor BeanռĸϢ Spring BootһЩԶõ InfoContributor BeanҲԱдԼġ

2.10.1. Զõ InfoContributor

ʵʱSpringԶ InfoContributor Bean

<colgroup><col><col><col><col></colgroup> | ID | Name | ˵ | ǰ | | --- | --- | --- | --- | | `build` | [`BuildInfoContributor`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/info/BuildInfoContributor.java) | ¶˹Ϣ | һ `META-INF/build-info.properties` Դ | | `env` | [`EnvironmentInfoContributor`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/info/EnvironmentInfoContributor.java) | ¶ `Environment` `info.` ͷκԡ | None. | | `git` | [`GitInfoContributor`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/info/GitInfoContributor.java) | ¶gitϢ | һ `git.properties` Դ | | `java` | [`JavaInfoContributor`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/info/JavaInfoContributor.java) | ¶JavaʱRuntimeϢ | None. | | `os` | [`OsInfoContributor`](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/info/OsInfoContributor.java) | ¶ϵͳϢ | None. |

˹ߣcontributorǷ management.info.<id>.enabled Կơ ͬcontributorвͬĬֵȡǵȾ¶Ϣʡ

ûȾӦñãenv``java os contributor Ĭǽõġ ͨ management.info.<id>.enabled Ϊ true ǡ

build git ϢcontributorĬõġ ͨ management.info.<id>.enabled Ϊ false á ⣬ҪÿһĬõcontributor뽫 management.info.defaults.enabled Ϊ false

2.10.2. ԶӦϢApplication Information

env contributor ʱͨ info.* Spring info ˵¶ݡ info keyµ Environment ԶԶ¶ 磬 application.properties ļá

Properties

Yaml

info.app.encoding=UTF-8
info.app.java.source=17
info.app.java.target=17

ӲЩֵ㻹 ڹʱչϢʹMavenԽǰӸд¡PropertiesYaml[email protected]@[email protected]@[email protected]@

2.10.3. Git Commit Ϣ

info ˵һõĹܹ git ԴĿʱ״̬Ϣ һ GitProperties beanʹ info ˵Щԡ

classpathĸ git.properties ļGitProperties BeanͻᱻԶáϸڼ "gitϢ"

Ĭ£˵ᱩ¶ git.branch``git.commit.id git.commit.time ԣڣ 㲻ЩԳڶ˵ӦУҪ git.properties ļųǡ ʾgitϢ git.properties ȫݣʹ management.info.git.mode ԣʾ

Properties

Yaml

management.info.git.mode=full

Ҫ info ˵ȫgitύϢ management.info.git.enabled Ϊ falseʾ

Properties

Yaml

management.info.git.enabled=false

2.10.4. Ϣ

BuildProperties Beanǿõģinfo ˵ҲԷĹϢclasspathе META-INF/build-info.properties ļãͻᷢ

MavenGradleɸļ "ɹϢ"

2.10.5. JavaϢ

info ˵㷢˹JavaлϢϸڼ JavaInfo

2.10.6. ϵͳOSϢ

info ˵㷢IJϵͳϢϸڼ OsInfo`

2.10.7. дԶ InfoContributor

ΪṩԶӦóϢעʵ InfoContributor ӿڵSpring Bean

ӹһֻһֵ example Ŀ

Java

Kotlin

@Component
public class MyInfoContributor implements InfoContributor {

    @Override
    public void contribute(Info.Builder builder) {
        builder.withDetail("example", Collections.singletonMap("key", "value"));
    }

}

info ˵㣬Ӧÿһ¶ĿӦ

{
    "example": {
        "key" : "value"
    }
}

3. ͨHTTPмغ͹

ڿһWebӦóSpring Boot ActuatorԶõĶ˵㣬ʹͨHTTP ĬϵĹʹö˵ id /actuator ǰ׺ΪURL· 磬health /actuator/health ʽ

Actuator ֧ Spring MVCSpring WebFluxJersey JerseySpring MVCãʹSpring MVC
Ϊ˻APIĵ HTML PDF мصȷJSONӦJacksonһҪ

3.1. ƹ˵·

ʱΪ˵㶨ǰ׺Ǻõġ 磬ӦóѾ /actuator Ŀġ ʹ management.endpoints.web.base-path ı˵ǰ׺ʾ

Properties

Yaml

management.endpoints.web.base-path=/manage

ǰ application.properties ӽ˵ /actuator/{id} Ϊ /manage/{id}/manage/info

ǹ˿ڱΪʹòͬHTTP˿¶˵㣬 management.endpoints.web.base-path server.servlet.context-path Servlet WebӦã spring.webflux.base-path reactive WebӦã management.server.port management.endpoints.web.base-path management.server.base-path ġ

Ѷ˵ӳ䵽ͬ·ʹ management.endpoints.web.path-mapping ԡ

ӽ /actuator/health ӳΪ /healthcheck

Properties

Yaml

management.endpoints.web.base-path=/
management.endpoints.web.path-mapping.health=healthcheck

3.2. ƹ˿

ڻƵIJ˵ͨʹĬϵHTTP˿¶˵һǵѡ ȻӦóԼУܸϲʹòͬHTTP˿¶˵㡣

management.server.port ıHTTP˿ڣʾ

Properties

Yaml

management.server.port=8081

Cloud Foundry ϣĬ£Ӧóڶ˿ 8080 Ͻ HTTP TCP ·ɵ Cloud Foundry ʹԶ˿ڣҪȷӦó·ԽתԶ˿ڡ

3.3. ManagementSSL

ΪʹԶ˿ʱҲͨʹø management.server.ssl.* ùSSL 磬ùͨHTTPṩ񣬶ӦóʹHTTPSʾ

Properties

Yaml

server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:store.jks
server.ssl.key-password=secret
management.server.port=8080
management.server.ssl.enabled=false

ߣ͹ʹSSLʹòͬԿ洢ʾ

Properties

Yaml

server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:main.jks
server.ssl.key-password=secret
management.server.port=8080
management.server.ssl.enabled=true
management.server.ssl.key-store=classpath:management.jks
management.server.ssl.key-password=secret

3.4. Managementַ

ͨ management.server.address ƹ˵Ŀõַ ֻڲάϼֻ localhost ӣá

ֻе˿˿ڲͬʱڲͬĵַϽм

application.properties Զ̹ӡ

Properties

Yaml

management.server.port=8081
management.server.address=127.0.0.1

3.5. HTTP˵

㲻ͨHTTP¶˵㣬԰ѹ˿Ϊ -1ʾ

Properties

Yaml

management.server.port=-1

Ҳͨʹ management.endpoints.web.exposure.exclude ʵ֣ʾ

Properties

Yaml

management.endpoints.web.exposure.exclude=*

4. ͨJMXмغ͹

JavaչJMXṩһ׼Ļغ͹Ӧó Ĭ£ùδá ͨ spring.jmx.enabled Ϊ true Spring Bootʵ MBeanServer ΪIDΪ mbeanServer Bean κδSpring JMXעBean@ManagedResource``@ManagedAttribute @ManagedOperationᱩ¶

ƽ̨ṩһ׼ MBeanServer Spring BootʹڱҪʱĬΪVM MBeanServer Щʧˣͻᴴһµ MBeanServer

ϸڼ JmxAutoConfiguration

Ĭ£Spring BootҲ˵ΪJMX MBeans org.springframework.boot ¹ ҪȫJMXеĶ˵עᣬԿעԼ EndpointObjectNameFactory ʵ֡

4.1. ԶMBean

MBeanͨɶ˵ id ɡ 磬 health ˵㱻¶Ϊ org.springframework.boot:type=Endpoint,name=Health

ӦóһϵSpring ApplicationContextַܻᷢͻ Ϊ˽⣬Խ spring.jmx.unique-names Ϊ trueMBean־Ψһġ

㻹Զ屩¶˵JMX ʾ application.properties һӡ

Properties

Yaml

spring.jmx.unique-names=true
management.endpoints.jmx.domain=com.example.myapp

4.2. JMX˵

㲻ͨJMX¶˵㣬԰ management.endpoints.jmx.exposure.exclude Ϊ *ʾ

Properties

Yaml

management.endpoints.jmx.exposure.exclude=*

5. ɹ۲ԣObservability

ɹ۲ָⲿ۲һеϵͳڲ״̬֧ɣ־͸١

ڶ͸٣Spring Bootʹ Micrometer ObservationҪԼĹ۲죨⽫¶͸٣עһ ObservationRegistry

@Component
public class MyCustomObservation {

    private final ObservationRegistry observationRegistry;

    public MyCustomObservation(ObservationRegistry observationRegistry) {
        this.observationRegistry = observationRegistry;
    }

    public void doSomething() {
        Observation.createNotStarted("doSomething", this.observationRegistry)
                .lowCardinalityKeyValue("locale", "en-US")
                .highCardinalityKeyValue("userId", "42")
                .observe(() -> {
                    // Execute business logic here
                });
    }

}

Ϳȵıǩӵָ׷У߿ȵıǩֻӵ׷С

ObservationPredicate``GlobalObservationConvention ObservationHandler ͵ Bean Զעᵽ ObservationRegistry ϡע ObservationRegistryCustomizer Beanһע

ϸ Micrometer Observation ĵ

JDBCR2DBCĿɹ۲ԣObservabilityʹõĿá JDBC Datasource Micrometer Ŀ ṩһ Spring Boot StarterڵJDBCʱԶ۲졣 οĵĶϢR2DBC R2DBC۲Spring BootԶ ΪR2DBCѯô۲졣

½ڽṩ־ָ׷ٵĸϸڡ

6. ־¼Logger

Spring Boot Actuatorʱ鿴Ӧó־Ĺܡ Բ鿴б򵥸־¼ãȷõ־Լ־ܸЧ־ɡ Щ֮һ

  • TRACE

  • DEBUG

  • INFO

  • WARN

  • ERROR

  • FATAL

  • OFF

  • null

null ʾûȷá

6.1. һ Logger

Ҫһļ¼POST һʵ嵽ԴURIʾ

{
    "configuredLevel": "DEBUG"
}
Ҫ reset ã¼ض𣨲ʹĬãԴһ null ֵΪ configuredLevel

7. ָ꣨Metrics

Spring Boot ActuatorΪ Micrometer ṩԶãMicrometerһ֧ ڶϵͳ Ӧóָӿڣ

Ҫ˽MicrometerĹܣμ οĵر 

7.1.

Spring BootԶһϵ MeterRegistryΪclasspathϷֵÿֵ֧ʵһע ʱclasspathж micrometer-registry-{system} Spring Bootעˡ

עйͬص㡣 磬ʹ Micrometer עʵclasspathϣҲԽһضע ӽDatadog

Properties

Yaml

management.datadog.metrics.export.enabled=false

ҲԽеעעض˵ʾ

Properties

Yaml

management.defaults.metrics.export.enabled=false

Spring BootκԶõעӵ Metrics ϵȫ־̬עȷҪ

Properties

Yaml

management.metrics.use-global-registry=false

ע MeterRegistryCustomizer Beanһעκαע֮ǰӦͨǩ

Java

Kotlin

@Configuration(proxyBeanMethods = false)
public class MyMeterRegistryConfiguration {

    @Bean
    public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
        return (registry) -> registry.config().commonTags("region", "us-east-1");
    }

}

ͨķͽӦضעʵ֡

Java

Kotlin

@Configuration(proxyBeanMethods = false)
public class MyMeterRegistryConfiguration {

    @Bean
    public MeterRegistryCustomizer<GraphiteMeterRegistry> graphiteMetricsNamingConvention() {
        return (registry) -> registry.config().namingConvention(this::name);
    }

    private String name(String name, Meter.Type type, String baseUnit) {
        return ...
    }

}

Spring Boot instrumentationͨûרעơ

7.2. ֵ֧ļϵͳ

ڼҪÿֵ֧ļϵͳ

7.2.1. AppOptics

Ĭ£AppOpticsעĻᶨڽָ͵ [api.appoptics.com/v1/measurements](https://api.appoptics.com/v1/measurements)Ҫָ굼 SaaS AppOpticsṩAPIơ

Properties

Yaml

management.appoptics.metrics.export.api-token=YOUR_TOKEN

7.2.2. Atlas

Ĭ£ָᱻ㱾ػϵ AtlasAtlas server λá

Properties

Yaml

management.atlas.metrics.export.uri=https://atlas.example.com:7101/api/v1/publish

7.2.3. Datadog

һDatadogעĻᶨڽָ͵ datadoghq Ҫָ굽 DatadogṩAPIԿ

Properties

Yaml

management.datadog.metrics.export.api-key=YOUR_KEY

ṩһӦԿѡôԪݣDZͺͻλҲ

Properties

Yaml

management.datadog.metrics.export.api-key=YOUR_API_KEY
management.datadog.metrics.export.application-key=YOUR_APPLICATION_KEY

Ĭ£ָ걻͵Datadog site [api.datadoghq.com](https://api.datadoghq.com/) DatadogĿйվϣҪָͨ꣬ӦURI

Properties

Yaml

management.datadog.metrics.export.uri=https://api.datadoghq.eu

㻹ԸıDatadogָʱ

Properties

Yaml

management.datadog.metrics.export.step=30s

7.2.4. Dynatrace

DynatraceṩָȡAPIΪ Micrometer ʵֵġ ҵDynatraceMicrometerָĵv1 ռеֻڵ Timeseries v1 API ʱv2 ռеֻڵ Metrics v2 API ʱע⣬üÿֻܵAPI v1 v2v2 汾ѡ device-idv1Ҫv2вʹã v1 ռбãômetric v1 ˵㡣򣬾ͼٶ v2

v2 API

ַͨʽʹv2 API

Զ

DynatraceԶOneAgentDynatrace Operator for Kubernetesص

OneAgentOneAgentָԶ local OneAgent ingest endpoint ȡ˵㽫ָתDynatraceˡ

Dynatrace Kubernetes OperatorڰװDynatrace OperatorKubernetesʱעԶӲԱȡĶ˵URIAPIơ

ĬΪ io.micrometer:micrometer-registry-dynatrace ֮⣬Ҫرá

ֶ

ûԶãҪ Metrics v2 API Ķ˵һ API ơAPIƱ Ingest metrics metrics.ingestȨáǽ齫ƵķΧһȨϡȷ˵URI·磬/api/v2/metrics/ingest

Metrics API v2ȡ˵URLIJѡͬ

  • SaaS: https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest

  • Managed deployments: https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest

example environment id öֵ

Properties

Yaml

management.dynatrace.metrics.export.uri=https://example.live.dynatrace.com/api/v2/metrics/ingest
management.dynatrace.metrics.export.api-token=YOUR_TOKEN

ʹDynatrace v2 APIʱʹ¿ѡܣϸڿ Dynatraceĵ ҵ

  • Metric key ǰ׺һǰ׺ǰ׺ӵеmetric keyС

  • DynatraceԪʵOneAgentDynatraceԱУöԪݣ磬̻Podḻָꡣ

  • Ĭάȡָӵеļֵԡ Micrometerָ˾ͬıǩǽĬdimension

  • ʹDynatrace Summary instrumentijЩ£Micrometer Dynatraceעָ걻ܾ Micrometer 1.9.xУͨDynatraceضժҪ⡣ Ϊ false ʹMicrometerص1.9.x֮ǰĬΪ ֻڴMicrometer 1.8.xǨƵ1.9.xʱʱſʹá

ԲָURIAPIƣʾ £ʹԶõĶ˵㡣

Properties

Yaml

management.dynatrace.metrics.export.v2.metric-key-prefix=your.key.prefix
management.dynatrace.metrics.export.v2.enrich-with-dynatrace-metadata=true
management.dynatrace.metrics.export.v2.default-dimensions.key1=value1
management.dynatrace.metrics.export.v2.default-dimensions.key2=value2
management.dynatrace.metrics.export.v2.use-dynatrace-summary-instruments=true

v1 API (Legacy)

Dynatrace v1 APIָעͨʹ Timeseries v1 API ڽָ͵õURI Ϊеã device-id ʱv1Ҫv2вʹãָ걻Timeseries v1˵㡣 Ҫ Dynatrace ָ꣬ṩAPIơ豸IDURI

Properties

Yaml

management.dynatrace.metrics.export.uri=https://{your-environment-id}.live.dynatrace.com
management.dynatrace.metrics.export.api-token=YOUR_TOKEN
management.dynatrace.metrics.export.v1.device-id=YOUR_DEVICE_ID

v1APIָURIָ·Ϊv1Ķ˵·Զӡ

汾޹ص

API˵⣬㻹ԸıDynatraceָļʱ䡣 Ĭϵĵʱ 60s ӽʱΪ30롣

Properties

Yaml

management.dynatrace.metrics.export.step=30s

Micrometerĵ Dynatraceĵ ҵΪMicrometerDynatrace exporterĸϢ

7.2.5. Elastic

Ĭ£ָ걻㱾ػϵ Elastic ͨʹṩҪʹõElasticλá

Properties

Yaml

management.elastic.metrics.export.host=https://elastic.example.com:8086

7.2.6. Ganglia

Ĭ£ָ걻㱾ػϵ GangliaGanglia server Ͷ˿ڣʾ

Properties

Yaml

management.ganglia.metrics.export.host=ganglia.example.com
management.ganglia.metrics.export.port=9649

7.2.7. Graphite

Ĭ£ָᱻ㱾ػϵ GraphiteGraphite server Ͷ˿ڣʾ

Properties

Yaml

management.graphite.metrics.export.host=graphite.example.com
management.graphite.metrics.export.port=9004

MicrometerṩһĬϵ HierarchicalNameMapperdimensional meter IDhttps://micrometer.io/docs/registry/graphite#_hierarchical_name_mapping[ӳ䵽 flat hierarchical name]

ҪΪ붨 GraphiteMeterRegistry ṩԼ HierarchicalNameMapper Լ壬ṩһԶõ GraphiteConfig Clock BeanJavaKotlin@Configuration(proxyBeanMethods = false)public class MyGraphiteConfiguration { @Bean public GraphiteMeterRegistry graphiteMeterRegistry(GraphiteConfig config, Clock clock) { return new GraphiteMeterRegistry(config, clock, this::toHierarchicalName); } private String toHierarchicalName(Meter.Id id, NamingConvention convention) { return ... }}

7.2.8. Humio

Ĭ£HumioעĻᶨڽָ͵ cloud.humio.com Ҫָ굼SaaS HumioṩAPIơ

Properties

Yaml

management.humio.metrics.export.api-token=YOUR_TOKEN

㻹ӦһǩȷָԴ

Properties

Yaml

management.humio.metrics.export.tags.alpha=a
management.humio.metrics.export.tags.bravo=b

7.2.9. Influx

Ĭ£ָᱻڱػϵ Influx v1ʵĬáҪָ굽InfluxDB v2 org``bucket дָauthentication tokenͨ·ʽṩҪʹõ Influx server λá

Properties

Yaml

management.influx.metrics.export.uri=https://influx.example.com:8086

7.2.10. JMX

Micrometerṩ˶ JMX ķֲӳ䣬ҪΪһۺͿֲķʽ鿴صĶ Ĭ£ָ걻 metrics JMX ͨ·ʽṩҪʹõ

Properties

Yaml

management.jmx.metrics.export.domain=com.example.app.metrics

MicrometerṩһĬϵ HierarchicalNameMapperdimensional meter ID ӳ䵽 flat hierarchical name

ҪΪ붨 JmxMeterRegistry ṩԼ HierarchicalNameMapper Լ壬ṩһԶõ JmxConfig Clock BeanJavaKotlin@Configuration(proxyBeanMethods = false)public class MyJmxConfiguration { @Bean public JmxMeterRegistry jmxMeterRegistry(JmxConfig config, Clock clock) { return new JmxMeterRegistry(config, clock, this::toHierarchicalName); } private String toHierarchicalName(Meter.Id id, NamingConvention convention) { return ... }}

7.2.11. KairosDB

Ĭ£ָ걻㱾ػϵ KairosDB ͨ·ʽṩҪʹõ KairosDB server λá

Properties

Yaml

management.kairos.metrics.export.uri=https://kairosdb.example.com:8080/api/v1/datapoints

7.2.12. New Relic

New RelicעĻᶨڽָ͵ New RelicҪָ굽 New RelicṩAPIԿ˻ID

Properties

Yaml

management.newrelic.metrics.export.api-key=YOUR_KEY
management.newrelic.metrics.export.account-id=YOUR_ACCOUNT_ID

㻹ԸıNew Relicָʱ

Properties

Yaml

management.newrelic.metrics.export.step=30s

Ĭ£ָͨREST÷ģclasspathJava Agent APIҲʹ

Properties

Yaml

management.newrelic.metrics.export.client-provider-type=insights-agent

ͨԼ NewRelicClientProvider ȫơ

7.2.13. OpenTelemetry

Ĭ£ָ걻㱾ػϵ OpenTelemetry ͨ·ʽṩҪʹõ OpenTelemtry metric endpoint λá

Properties

Yaml

management.otlp.metrics.export.url=https://otlp.example.com:4318/v1/metrics

7.2.14. Prometheus

Prometheus ϣscrapeѯӦóʵָꡣSpring Boot /actuator/prometheus ṩһactuator˵㣬Աʵĸʽ Prometheus scrape

Ĭ£ö˵Dzõģ뱻¶ϸμ¶˵

scrape_config ӵ prometheus.yml

scrape_configs:
  - job_name: "spring"
    metrics_path: "/actuator/prometheus"
    static_configs:
      - targets: ["HOST:PORT"]

Ҳ֧ Prometheus ExemplarsҪܣӦһ SpanContextSupplier Beanʹ Micrometer Tracing⽫ΪԶã룬ǿԴԼġ鿴 Prometheus ĵ ΪҪPrometheusȷãֻ֧ʹ OpenMetrics ʽ

ڶݵĻҵܴڵʱ䲻޷ȡʹ Prometheus Pushgateway ָ֧֣걩¶PrometheusҪPrometheus Pushgateway֧֣Ŀ

<dependency>
    <groupId>io.prometheus</groupId>
    simpleclient_pushgateway
</dependency>

Prometheus Pushgatewayclasspathϣ management.prometheus.metrics.export.pushgateway.enabled ԱΪ true ʱһ PrometheusPushGatewayManager beanͱԶˡ Prometheus PushgatewayָĹ

ͨʹ management.prometheus.metrics.export.pushgateway µ PrometheusPushGatewayManager ڸ߼ãҲṩԼ PrometheusPushGatewayManager bean

7.2.15. SignalFx

SignalFxעĻᶨڽָ͵ SignalFxҪָ굽 SignalFxṩaccess token

Properties

Yaml

management.signalfx.metrics.export.access-token=YOUR_ACCESS_TOKEN

ҲԸıSignalFxָʱ

Properties

Yaml

management.signalfx.metrics.export.step=30s

7.2.16. Simple

Micrometerṩһ򵥵ġڴеĺˣûעú˻ԶΪá㿴 metrics endpoint ռЩ

һʹκõĺˣڴеĺ˾ͻԶرաҲȷؽ

Properties

Yaml

management.simple.metrics.export.enabled=false

7.2.17. Stackdriver

StackdriverעĻᶨ Stackdriver ָꡣҪָ굽SaaS StackdriverṩGoogle Cloud project ID

Properties

Yaml

management.stackdriver.metrics.export.project-id=my-project

㻹ԸıStackdriverָʱ

Properties

Yaml

management.stackdriver.metrics.export.step=30s

7.2.18. StatsD

StatsDעеؽָͨUDP͸StatsD agentĬ£ָ걻㱾ػϵ StatsD agentͨ·ʽṩStatsD˿ںЭ飬Աʹá

Properties

Yaml

management.statsd.metrics.export.host=statsd.example.com
management.statsd.metrics.export.port=9125
management.statsd.metrics.export.protocol=udp

㻹ԸıҪʹõStatsD·Э飨ĬΪDatadog

Properties

Yaml

management.statsd.metrics.export.flavor=etsy

7.2.19. Wavefront

Wavefrontעڽָ͵ Wavefrontֱӽָ굼 WavefrontṩAPI token

Properties

Yaml

management.wavefront.api-token=YOUR_API_TOKEN

⣬ĻʹWavefront sidecarڲתָݵWavefront API

Properties

Yaml

management.wavefront.uri=proxy://localhost:2878

ָ귢Wavefront Wavefrontĵ proxy://HOST:PORT ʽ

ҲԸıWavefrontָʱ

Properties

Yaml

management.wavefront.metrics.export.step=30s

7.3. ֵָ֧ MetricͶMeter

Spring BootΪָļṩԶעᡣ ڴ£Ĭֵṩ˺ָ꣬Էκֵ֧ļϵͳС

7.3.1. JVMָ

Զͨʹú Micrometer JVM JVMָ jvm. meter name ·

ṩJVMָꡣ

  • ڴͻϸ

  • ռйصͳ

  • ߳

  • غжص

  • JVMİ汾Ϣ

  • JIT ʱ

7.3.2. ϵͳָ

ԶͨʹúMicrometerʵϵͳ ϵͳָ system.``process. disk. meter ·

ṩϵͳָꡣ

  • CPUָ

  • ļָ

  • ʱָ꣨ӦóѾеʱ;ʱĹ̶

  • õĴ̿ռ

7.3.3. Ӧóָ

Զñ¶Ӧóʱָꡣ

  • application.started.time: Ӧóʱ䡣

  • application.ready.timeӦó׼Ϊṩʱ䡣

ָӦȫǵġ

7.3.4. ־¼ָ

ԶLogbackLog4J2¼ ϸ log4j2.events. logback.events. meter¹

7.3.5. ִк͵ָ

Զʹпõ ThreadPoolTaskExecutor ThreadPoolTaskScheduler BeanֻܱҪײ ThreadPoolExecutor á ָexecutorǣexecutorBeanơ

7.3.6. Spring MVC ָ

Զܹ Spring MVC Controllerͱʽhandlerж Ĭ£ָ http.server.requests Ϊɵġ ͨ management.observations.http.server.requests.name Ƹơ

ڲĹ۲observationĸϢμ Spring Framework οĵ

ҪӵĬϱǩУṩһ̳ org.springframework.http.server.observation е DefaultServerRequestObservationConvention @BeanҪ滻Ĭϱǩṩһʵ ServerRequestObservationConvention @Bean

ijЩ£Webд쳣ᱻ¼ΪǩӦóѡ벢ͨhandled exception Ϊ request attribute¼쳣

Ĭ£󶼱 ҪԶṩһʵ FilterRegistrationBean<WebMvcMetricsFilter> @Bean

7.3.7. Spring WebFlux ָ

ԶܹSpring WebFlux controllerͱʽhandlerж Ĭ£ָ http.server.requests Ϊɵġ ͨ management.observations.http.server.requests.name Ƹơ

ڲĹ۲observationĸϢμ Spring Framework οĵ

ҪӵĬϱǩУṩ̳ org.springframework.http.server.reactive.observation е DefaultServerRequestObservationConvention @BeanҪ滻Ĭϱǩṩһʵ ServerRequestObservationConvention @Bean

ijЩ£ʹд쳣ᱻ¼ΪǩӦóѡ벢ͨhandled exceptionΪrequest attribute¼쳣

7.3.8. Jersey Server ָ

ԶʹJersey JAX-RSʵܱ Ĭ£ָ http.server.requests Ϊɵġ ͨ management.observations.http.server.requests.name ơ

Ĭ£Jerseyָ걻ΪϢ

<colgroup><col><col></colgroup> | Tag | ˵ | | --- | --- | | `exception` | ʱ׳κ쳣ļ | | `method` | ķ磬`GET` `POST` | | `outcome` | ĽӦ״̬롣 1xx `INFORMATIONAL`2xx `SUCCESS`3xx `REDIRECTION`4xx `CLIENT_ERROR`5xx `SERVER_ERROR` | | `status` | ӦHTTP״̬루磬`200` `500` | | `uri` | ܵĻڽб滻֮ǰURIģ壨磺`/api/person/{id}` |

ҪƱǩṩһʵ JerseyTagsProvider @Bean

7.3.9. HTTP Client ָ

Spring Boot Actuator RestTemplate WebClient ĹߡΪˣעԶõĹʹʵ

  • RestTemplateBuilder RestTemplate

  • WebClient.Builder WebClient

ҲֶӦøߵcustomizer ObservationRestTemplateCustomizer ObservationWebClientCustomizer

Ĭ£ָ http.client.requests ɵġ

ͨ management.observations.http.client.requests.name ֡

ڲĹ۲observationĸϢμ Spring Framework οĵ

Ҫʹ RestTemplate ʱƱǩṩһʵ org.springframework.http.client.observation ClientRequestObservationConvention @BeanҪʹ WebClient ʱԶǩṩһʵ org.springframework.web.reactive.function.client ClientRequestObservationConvention @Bean

7.3.10. Tomcat ָ

Զý MBeanRegistry ʱŻTomcat Ĭ£MBeanRegistry ǽõģͨ server.tomcat.mbeanregistry.enabled Ϊ true

Tomcatָ tomcat. meter ·

7.3.11. Cache ָ

Զÿʱпõ Cache ʵм⣬ָ cache Ϊǰ׺

DZDZ׼Ļָ꼯

ҲʹöġԻָꡣ

֧»⡣

  • Cache2k

  • Caffeine

  • Hazelcast

  • κμݵJCacheJSR-107ʵ

  • Redis

ָɻƺ CacheManager ǣCacheManager Beanġ

ֻʱõĻ汻󶨵ע ûڻжĻ棬׶κʱĻԱ̷ʽĻ棬Ҫȷעᡣ һ CacheMetricsRegistrar Beanʹ̸ס

7.3.12. Spring GraphQL ָ

μ Spring GraphQL οĵ

7.3.13. DataSource ָ

Զʹпõ DataSource ָǰ׺Ϊ jdbc.connections ԴĽDZʾеǰġеġĺСDZ

׼ҲɻbeanƼ DataSource ǡ

Ĭ£Spring BootΪֵ֧ԴṩԪݡ ϲԴ֧֣Ӷ DataSourcePoolMetadataProvider Bean DataSourcePoolMetadataProvidersConfiguration ˽ʵ

⣬Hikariضָ hikaricp ǰ׺¶ ÿָ궼poolǣ spring.datasource.name ƣ

7.3.14. Hibernate ָ

org.hibernate.orm:hibernate-micrometer classpathϣͳƹܵHibernate EntityManagerFactory ʵᱻһΪ hibernate ָ⡣

׼Ҳ EntityManagerFactory ǣBeanġ

Ҫͳƣ׼JPA hibernate.generate_statistics Ϊ true Զõ EntityManagerFactory á

Properties

Yaml

spring.jpa.properties[hibernate.generate_statistics]=true

7.3.15. Spring Data Repository ָ

ԶܹSpring Data Repository ĵýж Ĭ£ָ spring.data.repository.invocations Ϊɡ ͨ management.metrics.data.repository.metric-name Զơ

io.micrometer.core.annotation е @Timed ע֧ Repository ӿںͷ㲻¼ Repository õĶmetricԽ management.metrics.data.repository.autotime.enabled Ϊ falseרʹ @Timed ע⡣

һ longTask = true @Timed עΪ÷һʱʱҪһ metric nameҿʱtask timerӡ

Ĭ£repositoryصĶ׼ΪϢ

<colgroup><col><col></colgroup> | Tag | ˵ | | --- | --- | | `repository` | Դ `Repository` ļ | | `method` | õ `Repository` ơ | | `state` | ״̬`SUCCESS`, `ERROR`, `CANCELED`, `RUNNING` | | `exception` | ׳κ쳣ļ |

Ҫ滻ĬϱǩҪṩһʵ RepositoryTagsProvider @Bean

7.3.16. RabbitMQ ָ

Զʹпõ RabbitMQ ӹָΪ rabbitmq

7.3.17. Spring Integration ָ

ֻҪ MeterRegistry beanSpring IntegrationͻԶṩ Micrometer support ׼ spring.integration. meter ·

7.3.18. Kafka ָ

ԶΪԶõ߹߹ֱעһ MicrometerConsumerListener MicrometerProducerListener Ϊ StreamsBuilderFactoryBean עһ KafkaStreamsMicrometerListener ϸڣSpring Kafkaĵе Micrometer Native Metrics ֡

7.3.19. MongoDB ָ

ڼҪMongoDBĿö

MongoDBָ

Զý MongoMetricsCommandListener Զõ MongoClient עᡣ

һΪ mongodb.driver.commands timerָ걻ײMongoDB driverÿ Ĭ£ÿָ궼ΪϢ

<colgroup><col><col></colgroup> | Tag | ˵ | | --- | --- | | `command` | ơ | | `cluster.id` | ͸ļȺıʶ | | `server.address` | ķĵַ | | `status` | Ľ`SUCCESS` `FAILED |

Ϊ滻ĬϵĶǩһ MongoCommandTagsProvider beanʾ

Java

Kotlin

@Configuration(proxyBeanMethods = false)
public class MyCommandTagsProviderConfiguration {

    @Bean
    public MongoCommandTagsProvider customCommandTagsProvider() {
        return new CustomCommandTagsProvider();
    }

}

ҪԶõԡ

Properties

Yaml

management.metrics.mongo.command.enabled=false

MongoDB ӳָ

Զý MongoMetricsConnectionPoolListener Զõ MongoClient עᡣ

ΪӳشIJָꡣ

  • mongodb.driver.pool.size ӳصĵǰСкʹõijԱ

  • mongodb.driver.pool.checkedout 浱ǰʹе

  • mongodb.driver.pool.waitqueuesize ӵĵȴеĵǰС

Ĭ£ÿָ궼ΪϢ

<colgroup><col><col></colgroup> | Tag | ˵ | | --- | --- | | `cluster.id` | ӳӦļȺıʶ | | `server.address` | ӳӦķĵַ |

ҪȡĬϵĶǩ붨һ MongoConnectionPoolTagsProvider bean

Java

Kotlin

@Configuration(proxyBeanMethods = false)
public class MyConnectionPoolTagsProviderConfiguration {

    @Bean
    public MongoConnectionPoolTagsProvider customConnectionPoolTagsProvider() {
        return new CustomConnectionPoolTagsProvider();
    }

}

ҪԶõӳضԡ

Properties

Yaml

management.metrics.mongo.connectionpool.enabled=false

7.3.20. Jetty ָ

ԶͨʹMicrometer JettyServerThreadPoolMetrics ΪJetty ThreadPool ָꡣ Jetty Connector ʵָͨʹMicrometer JettyConnectionMetrics 󶨣 server.ssl.enabled Ϊ true ʱMicrometer JettySslHandshakeMetrics

7.3.21. @Timed ע֧

ҪSpring Bootֱֵ֧ĵطʹ @Timedο Micrometer ĵ

7.3.22. Redis ָ

ԶΪԶõ LettuceConnectionFactory עһ MicrometerCommandLatencyRecorder ϸڣLettuceĵ Micrometer Metrics

7.4. עԶָ

ҪעԶ뽫 MeterRegistry עС

Java

Kotlin

@Component
public class MyBean {

    private final Dictionary dictionary;

    public MyBean(MeterRegistry registry) {
        this.dictionary = Dictionary.load();
        registry.gauge("dictionary.size", Tags.empty(), this.dictionary.getWords().size());
    }

}

Ķ׼Beanǽʹ MeterBinder עǡ

Java

Kotlin

public class MyMeterBinderConfiguration {

    @Bean
    public MeterBinder queueSize(Queue queue) {
        return (registry) -> Gauge.builder("queueSize", queue::size).register(registry);
    }

}

ʹ MeterBinder ȷȷϵڼֵʱBeanǿõġ 㷢Ӧóظһָ꣬ô MeterBinder ʵҲá

Ĭ£ MeterBinder Beanָ궼Զ󶨵Spring MeterRegistry

7.5. Ƹָ

Ҫض Meter ʵԶ壬ʹ io.micrometer.core.instrument.config.MeterFilter ӿڡ

com.example ͷDZID mytag.region ǩΪ mytag.area¹

Java

Kotlin

@Configuration(proxyBeanMethods = false)
public class MyMetricsFilterConfiguration {

    @Bean
    public MeterFilter renameRegionTagMeterFilter() {
        return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area");
    }

}

Ĭ£е MeterFilter BeanԶ󶨵Spring MeterRegistry ȷʹSpring MeterRegistry עָ꣬ʹ Metrics κξ̬ ЩʹõDzSpringȫע

7.5.1. ǩTag

ͨñǩһڶлά꣬ʵ򡢶ջȡ ñǩDZԽãʾ

Properties

Yaml

management.metrics.tags.region=us-east-1
management.metrics.tags.stack=prod

ǰΪֵΪ us-east-1 prod DZ region stack ǩ

ʹGraphiteͨǩ˳ǺҪġ ʹַܱ֤ǩ˳򣬽GraphiteûһԶ MeterFilter

7.5.2. Per-meter Properties

MeterFilter Bean㻹ʹÿĻӦһ޵Զ幦ܡ ʹSpring Boot PropertiesMeterFilterÿĶƱӦԸƿͷκαID ӹ˵κID example.remote ͷDZ

Properties

Yaml

management.metrics.enable.example.remote=false

per-meterĶơ

<caption>Table 1\. Per-meter customizations</caption><colgroup><col><col></colgroup> | Property | ˵ | | --- | --- | | `management.metrics.enable` | ǷܾضIDMeter ܵMeter `MeterRegistry` й˵ | | `management.metrics.distribution.percentiles-histogram` | Ƿ񷢲ʺϼɾۼάȣİٷλֱֵͼ | | `management.metrics.distribution.minimum-expected-value`, `management.metrics.distribution.maximum-expected-value` | ͨǯԤֵķΧٵֱͼͰ | | `management.metrics.distribution.percentiles` | Ӧóмİٷλֵ | | `management.metrics.distribution.expiry`, `management.metrics.distribution.buffer-length` | ͨڻλлǸȨأλڿõĹںתΪ õĻȡ | | `management.metrics.distribution.slo` | һۻֱͼеͰķˮƽĿ궨塣 |

percentiles-histogram ٷ-ֱͼpercentilesٷ slo ĸĸϸڣμMicrometerĵе Histograms and percentiles ֱͼͰٷ

7.6. ָ˵

Spring Bootṩһ metrics ˵㣬ԵʹӦóռָꡣö˵ĬDzõģ빫ϸμ ¶˵

/actuator/metrics ʾһõDZб ͨṩΪѡ鿴ijضDZϢ磬/actuator/metrics/jvm.memory.max

ʹõӦʹõһ£ļϵͳо淶֡ 仰˵ jvm.memory.max PrometheusʾΪ jvm_memory_maxΪȻӦʹ jvm.memory.max Ϊѡ metrics ˵мDZ

ҲURLĩβ tag=KEY:VALUE ѯԶDZά??磬/actuator/metrics/jvm.memory.max?tag=area:nonheap

IJֵDZƥDZκӦõıǩͳ ܺ ǰУص Value ͳǶѵ Code CacheCompressed Class Space Metaspace ڴ桰㼣֮͡ ֻ Metaspace ߴ磬һ tag=id:Metaspace -- /actuator/metrics/jvm.memory.max?tag=area:nonheap&tag=id:Metaspace

7.7. Micrometer Observation

һ DefaultMeterObservationHandler Զע ObservationRegistry ϣΪÿɵĹ۲죨completed observationmetric

8. ׷٣Tracing

Spring Boot Actuator Ϊ Micrometer Tracing ṩԹԶã Micrometer Tracing е׷tracerһӿڣfacade

Ҫ˽ Micrometer Tracing ܵϢ οĵ

8.1. ֵ֧׷

Spring BootΪ׷ṩԶá

8.2.

Ҫһʼ׷ٵʾӦó򡣾ǵĿĶԣgetting-started.html 漰ļ򵥵 Hello World! web㹻ˡǽʹ OpenTelemetry ׷ Zipkin Ϊ׷ٺˡ

عһ£ǵҪӦô뿴ġ

@RestController
@SpringBootApplication
public class MyApplication {

    private static final Log logger = LogFactory.getLog(MyApplication.class);

    @RequestMapping("/")
    String home() {
        logger.info("home() has been called");
        return "Hello World!";
    }

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

}

home() Уһӵlogger䣬ںҪ

ڣDZ

  • org.springframework.boot:spring-boot-starter-actuator

  • io.micrometer:micrometer-tracing-bridge-otel - Micrometer Observation API OpenTelemetry ıҪ

  • io.opentelemetry:opentelemetry-exporter-zipkin - Zipkin traces Ҫġ

µ application properties:

Properties

Yaml

management.tracing.sampling.probability=1.0

Ĭ£Spring Bootֻ10%вԷֹ׷ٺ˲ظԽлΪ100%ÿ󶼻ᱻ͵ٺˡ

ΪռͿӻ٣ҪһиٵĺˡʹZipkinΪǵĸٺˡ Zipkinָ ṩڱZipkin˵

ZipkinкӦó

web [localhost:8080](http://localhost:8080/)Ӧÿ

Hello World!

ĻѾΪHTTP󴴽һ observationŽӵ OpenTelemetryZipkinһµĸ٣trace

ڣ [localhost:9411](http://localhost:9411/) Zipkinû棬 "Run Query" ťгռĸϢӦÿһ׷١ "Show" ť鿴׷ٵϸڡ

ͨ logging.pattern.level Ϊ %5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]־аǰĸ٣trace span id

8.3. Tracerʵ

Micrometer Tracerֶ֧ʾʵ֣Spring Bootжϡ

׷ʵֶҪ org.springframework.boot:spring-boot-starter-actuator

8.3.1. ʹ Zipkin OpenTelemetry

  • io.micrometer:micrometer-tracing-bridge-otel - Micrometer Observation API OpenTelemetry ıҪ

  • io.opentelemetry:opentelemetry-exporter-zipkin - ZipkintraceҪġ

8.3.2. ʹ Wavefront OpenTelemetry

  • io.micrometer:micrometer-tracing-bridge-otel - Micrometer Observation API OpenTelemetry ıҪ

  • io.micrometer:micrometer-tracing-reporter-wavefront - WavefronttraceҪġ

8.3.3. ʹ Zipkin OpenZipkin Brave

  • io.micrometer:micrometer-tracing-bridge-brave - Micrometer Observation API Brave ıҪ

  • io.zipkin.reporter2:zipkin-reporter-brave - Zipkin trace Ҫġ

ĿûʹSpring MVCSpring WebFluxҲҪʹ io.zipkin.reporter2:zipkin-sender-urlconnection

8.3.4. ʹWavefrontOpenZipkin Brave

  • io.micrometer:micrometer-tracing-bridge-brave - ӲMicrometer Observation APIBraveıҪ

  • io.micrometer:micrometer-tracing-reporter-wavefront - WavefronttraceҪġ

8.4. Զȣspan

ͨһ observation ԼspanΪˣ ObservationRegistry ע뵽С

@Component
class CustomObservation {

    private final ObservationRegistry observationRegistry;

    CustomObservation(ObservationRegistry observationRegistry) {
        this.observationRegistry = observationRegistry;
    }

    void someOperation() {
        Observation observation = Observation.createNotStarted("some-operation", this.observationRegistry);
        observation.lowCardinalityKeyValue("some-tag", "some-value");
        observation.observe(() -> {
            // Business logic ...
        });
    }

}

⽫һΪ "some-operation" observationǩΪǩΪ "some-tag=some-value"

ڲmetric´һspanҪʹ Micrometer ͼTracer API

9.

һSpring SecurityãSpring Boot ActuatorһƿܣԷ¼ĬΪ authentication success, failure access denied 쳣 һܶڱʵʩ֤ʧܵԷdzá

ͨӦóṩһ AuditEventRepository ͵beanơ Ϊ˷㣬Spring Bootṩһ InMemoryAuditEventRepository InMemoryAuditEventRepository Ĺޣǽֻڿʹ 뿼ǴԼ AuditEventRepository ʵ֡

9.1.

Ϊ˶Ʒİȫ¼ṩԼ AbstractAuthenticationAuditListener AbstractAuthorizationAuditListener ʵ֡

ҲΪԼҵ¼ʹƷ Ҫһ㣬Ҫô AuditEventRepository beanעԼֱʹҪôSpring ApplicationEventPublisher AuditApplicationEventͨʵ ApplicationEventPublisherAware

10. ¼ HTTP Exchange

ͨӦóṩһ HttpExchangeRepository ͵ bean HTTP exchange ļ¼Ϊ˷Spring Boot ṩ InMemoryHttpExchangeRepositoryĬ£洢100 request/response exchange׷ٽtracing solutionsȣInMemoryHttpExchangeRepository ޵ģǽֻڿʹǽʹһĸٻ۲ Zipkin OpenTelemetry⣬ҲԴԼ HttpExchangeRepository

ʹ httpexchanges ˵ȡ洢 HttpExchangeRepository е request/response exchange Ϣ

10.1. Զ HTTP Exchange ¼

ҪԶÿ¼ exchange Ŀʹ management.httpexchanges.recording.include ԡ

Ҫȫֹ±룬뽫 management.httpexchanges.recording.enabled Ϊ false

11. ̼

spring-boot ģУҵļ࣬Щļڽ̼ͨá

  • ApplicationPidFileWriter һӦóPIDļĬ£ӦóĿ¼£ļΪ application.pid

  • WebServerPortFileWriter һļеWebĶ˿ڣĬ£ӦóĿ¼£ļΪ application.port

Ĭ£Щдûбǡ

11.1. չ

META-INF/spring.factories ļУԼдPIDļlistenerһ߶

org.springframework.context.ApplicationListener=
org.springframework.boot.context.ApplicationPidFileWriter,
org.springframework.boot.web.context.WebServerPortFileWriter

11.2. Ա̷ʽʵֽ̼

Ҳͨ SpringApplication.addListeners(?) ʵ Writer һ Writer 캯Զļ·

12. Cloud Foundry ֧

Spring Boot actuatorģ֧֣𵽼ݵ Cloud Foundry ʵʱֽ֧ /cloudfoundryapplication ·Ϊ @Endpoint Beanṩһȫ·ߡ

չ֧ʹ Cloud Foundry UI鿴ѲӦó Web Ӧó򣩵õ Spring Boot ִϢǿ 磬Ӧó״̬ҳ԰ĽϢǵ͵ running stopped ״̬

ͨû޷ֱӷ /cloudfoundryapplication · Ҫʹøö˵㣬дһЧ UAA ơ

12.1. չ Cloud Foundry Actuator ֧

ȫ /cloudfoundryapplication ˵㣬 application.properties ļá

Properties

Yaml

management.cloudfoundry.enabled=false

12.2. Cloud Foundryǩ֤

Ĭ£/cloudfoundryapplication ˵İȫ֤Ը Cloud Foundry SSL á Cloud Foundry UAA Cloud Controller ʹǩ֤飬Ҫԡ

Properties

Yaml

management.cloudfoundry.skip-ssl-validation=true

12.3. Զ Context Path

context-path Ϊ / κݣ Cloud Foundry ˵Ӧóĸá 磬 server.servlet.context-path=/app Cloud Foundry ˵ /app/cloudfoundryapplication/* á

ϣ Cloud Foundry ˵ʼ /cloudfoundryapplication/* ã۷·ΣҪӦóȷá ʹõ Web ͬͬ Tomcatá

Java

Kotlin

@Configuration(proxyBeanMethods = false)
public class MyCloudFoundryConfiguration {

    @Bean
    public TomcatServletWebServerFactory servletWebServerFactory() {
        return new TomcatServletWebServerFactory() {

            @Override
            protected void prepareContext(Host host, ServletContextInitializer[] initializers) {
                super.prepareContext(host, initializers);
                StandardContext child = new StandardContext();
                child.addLifecycleListener(new Tomcat.FixContextListener());
                child.setPath("/cloudfoundryapplication");
                ServletContainerInitializer initializer = getServletContextInitializer(getContextPath());
                child.addServletContainerInitializer(initializer, Collections.emptySet());
                child.setCrossContext(true);
                host.addChild(child);
            }

        };
    }

    private ServletContainerInitializer getServletContextInitializer(String contextPath) {
        return (classes, context) -> {
            Servlet servlet = new GenericServlet() {

                @Override
                public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
                    ServletContext context = req.getServletContext().getContext(contextPath);
                    context.getRequestDispatcher("/cloudfoundryapplication").forward(req, res);
                }

            };
            context.addServlet("cloudfoundry", servlet).addMapping("/*");
        };
    }

}

13. ʲô

һ Graphite ͼιߡ

ԼĶ ѡ ǰȥ˽йSpring Boot ߲һЩϢ