可生产功能
1. 启用生产准备功能
这Spring-启动-执行器模块提供了 Spring Boot 所有可用的生产准备功能。
推荐的启用方式是添加对Spring-启动-执行器“发令员”。
要将执行器添加到基于 Maven 的项目中,需添加以下“Starter”依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
对于Gradle,请使用以下声明:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
2. 端点
执行器端点可以让你监控并与应用交互。
Spring Boot 内置了多个端点,并允许你添加自己的端点。
例如,健康端点提供基本的应用健康信息。
你可以启用或禁用每个端点,并通过HTTP或JMX对它们进行开放(使其可远程访问)。
当一个端点既被启用又暴露时,即被视为可用。
内置端点只有在可用时才会自动配置。
大多数应用选择暴露而非HTTP,HTTP中端点ID和前缀为/驱动器映射到一个URL。
例如,默认情况下,健康端点映射为/执行器/健康.
以下技术无关端点可供选择:
| 身份证 | 描述 |
|---|---|
|
为当前应用暴露审计事件信息。
需要 |
|
显示申请中所有春季豆的完整列表。 |
|
暴露可用的缓存。 |
|
显示配置和自动配置类别评估的条件及其匹配原因。 |
|
显示所有内容的汇总列表 |
|
揭露斯普林的性质 |
|
显示已应用的Flyway数据库迁移情况。
需要一个或多个 |
|
显示应用健康信息。 |
|
显示HTTP交换信息(默认显示最近100次HTTP请求-响应交换)。
需要 |
|
显示任意的应用信息。 |
|
显示Spring集成图。
需要依赖于 |
|
显示并修改应用程序中记录器的配置。 |
|
显示已应用的Liquibase数据库迁移情况。
需要一个或多个 |
|
显示当前应用的“指标”信息。 |
|
显示所有内容的汇总列表 |
|
显示关于Quartz调度器职位的信息。 需进行消毒。 |
|
显示你的应用程序中的计划任务。 |
|
允许从春季会话支持的会话存储中检索和删除用户会话。 需要一个基于 servlet 的网页应用,使用 Spring Session。 |
|
让应用被优雅地关闭。 只有在使用罐装包装时才有效。 默认为禁用。 |
|
|
|
执行线程转储。 |
如果您的应用是Web应用(Spring MVC、Spring WebFlux或Jersey),您可以使用以下额外端点:
| 身份证 | 描述 |
|---|---|
|
返回一个堆导出文件。
在热点JVM上,一个 |
|
返回日志文件的内容(如果 |
|
以Prometheus服务器可抓取的格式暴露指标。
需要依赖于 |
2.1. 启用终端
默认情况下,除关闭已启用。
要配置端点的启用,请使用management.endpoint.<id>.enabled财产。
以下示例使得关闭端点:
management.endpoint.shutdown.enabled=true
management:
endpoint:
shutdown:
enabled: true
如果你更倾向于端点启用是选择加入而非退出,可以设置management.endpoints.enabled-by default属性到false并使用单个端点启用选择重新加入的房源。
以下示例使得信息端点并禁用所有其他端点:
management.endpoints.enabled-by-default=false
management.endpoint.info.enabled=true
management:
endpoints:
enabled-by-default: false
endpoint:
info:
enabled: true
禁用端点会完全从应用上下文中移除。
如果你只想更改终端所接触的技术,可以使用包括和排除性能相反。 |
2.2. 暴露端点
默认情况下,只有健康端点通过HTTP和JMX暴露。 由于端点可能包含敏感信息,您应谨慎考虑何时公开它们。
要更改暴露的端点,请使用以下技术专用工具包括和排除性能:
| 属性 | 默认值 |
|---|---|
|
|
|
|
|
|
|
|
这包括属性列出了被暴露端点的ID。
这排除property 列出了不应暴露的端点 ID。
这排除属性优先于包括财产。
你可以配置这两个包括以及排除带有端点ID列表的属性。
例如,仅暴露健康和信息对于 JMX 端点,可以使用以下性质:
management.endpoints.jmx.exposure.include=health,info
management:
endpoints:
jmx:
exposure:
include: "health,info"
*可以用来选择所有端点。
例如,要通过 HTTP 暴露除环境和豆端点,使用以下属性:
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,beans
management:
endpoints:
web:
exposure:
include: "*"
exclude: "env,beans"
*在 YAML 中有特殊含义,因此如果你想包含(或排除)所有端点,请务必加上引号。 |
| 如果您的应用被公开,我们强烈建议您也保护您的终端安全。 |
如果你想在端点暴露时实施自己的策略,可以注册一个端点Filter豆。 |
2.3. 安全
出于安全考虑,只有/健康端点默认通过HTTP暴露。
你可以使用管理端点.web.exposure.include属性来配置暴露的端点。
在设置管理端点.web.exposure.include确保暴露的执行器不包含敏感信息,通过设置防火墙保护,或由类似Spring Security的软件保护。 |
如果 Spring Security 只在类路径上,没有其他安全滤网链Bean在,所有执行器都存在,除了/健康通过Spring Boot自动配置来保护。
如果你定义了一个自定义安全滤网链Spring Boot 的自动配置会退后,允许你完全控制执行器的访问规则。
如果你想为HTTP端点配置自定义安全性(例如,只允许特定角色的用户访问),Spring Boot提供了一些方便的服务请求匹配器这些对象可以与 Spring Security 结合使用。
一个典型的Spring Security配置可能如下示例:
@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();
}
}
@Configuration(proxyBeanMethods = false)
class MySecurityConfiguration {
@Bean
fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
http.securityMatcher(EndpointRequest.toAnyEndpoint()).authorizeHttpRequests { requests ->
requests.anyRequest().hasRole("ENDPOINT_ADMIN")
}
http.httpBasic(withDefaults())
return http.build()
}
}
前面的例子使用EndpointRequest.toAnyEndpoint()将请求匹配到任意端点,并确保所有端点都拥有ENDPOINT_ADMIN角色。 还有其他几种匹配方法可用端点请求. 详情请参见API文档(HTML或PDF)。
如果你部署应用在防火墙后面,你可能更希望所有执行器端点都能被访问而无需认证。你可以通过更改管理端点.web.exposure.include性质,具体如下:
management.endpoints.web.exposure.include=*
management:
endpoints:
web:
exposure:
include: "*"
此外,如果有 Spring Security,你需要添加自定义安全配置,允许对端点进行非认证访问,如下示例所示:
@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();
}
}
@Configuration(proxyBeanMethods = false)
class MySecurityConfiguration {
@Bean
fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
http.securityMatcher(EndpointRequest.toAnyEndpoint()).authorizeHttpRequests { requests ->
requests.anyRequest().permitAll()
}
return http.build()
}
}
在前面的两个例子中,配置仅适用于执行器端点。由于 Spring Boot 的安全配置在安全滤网链Bean,你需要再配置一个安全滤网链带有适用于其他应用的规则。 |
2.3.1. 跨站点请求伪造保护
由于 Spring Boot 依赖于 Spring Security 的默认设置,CSRF 保护默认开启。这意味着执行器端点需要发布(关闭并记录端点),a放,或删除当默认安全配置正在使用时,会收到403(禁止)错误。
| 我们建议仅在创建非浏览器客户端使用的服务时完全禁用CSRF保护。 |
您可以在春季安全参考指南中找到更多关于CSRF保护的信息。
2.4. 端点配置
端点会自动缓存不带参数的读取作响应。要配置端点缓存响应的时间,请使用cache.time-to-live(存活时间)财产。 以下示例设定了豆端点缓存为10秒:
management.endpoint.beans.cache.time-to-live=10s
management:
endpoint:
beans:
cache:
time-to-live: "10s"
这management.endpoint.<name>前缀唯一标识正在配置的端点。 |
2.5. 对敏感值进行消毒
由/环境,/configprops和/Quartz端点可以是敏感的,因此默认情况下,数总是完全净化(替换为)。******
只有在以下情况下,才能以未净化的形式查看数值:
-
这
展示价值属性被设置为其他从不 -
没有传统
消毒功能Beans应用
这展示价值属性可配置为可净化端点,以下值之一:
-
从不- 值总是完全净化(替换为******) -
总是- 值向所有用户显示(只要没有消毒功能Beans适用) -
WHEN_AUTHORIZED- 仅向授权用户显示值(只要消毒功能Beans适用)
对于HTTP端点,如果用户已认证并通过该端点的角色属性配置了角色,则被视为被授权。默认情况下,任何认证用户均为授权用户。
对于 JMX 端点,所有用户始终获得授权。
以下示例允许所有用户拥有管理用于查看/环境端点的原始形式。未授权用户,或没有管理角色,只会看到被净化的价值观。
management.endpoint.env.show-values=WHEN_AUTHORIZED
management.endpoint.env.roles=admin
management:
endpoint:
env:
show-values: WHEN_AUTHORIZED
roles: "admin"
这个例子假设 不消毒功能豆子已经被定义了。 |
2.6. 执行器网页端点的超媒体
添加一个“发现页面”,并链接到所有端点。“发现页面”可在/驱动器默认。
要禁用“发现页面”,请在你的应用属性中添加以下属性:
management.endpoints.web.discovery.enabled=false
management:
endpoints:
web:
discovery:
enabled: false
当自定义管理上下文路径配置时,“发现页面”会自动从/驱动器到管理上下文的根节点。例如,如果管理上下文路径为/管理,发现页面可从以下网站获取/管理. 当管理上下文路径设置为 时,发现页面会被禁用,以防止与其他映射发生冲突。/
2.7. CORS支持
默认情况下,CORS 支持是被禁用的,只有在你设置了管理端点.web.cors.allowed-origins财产。
以下配置允许获取和发布来自example.com域:
management.endpoints.web.cors.allowed-origins=https://example.com
management.endpoints.web.cors.allowed-methods=GET,POST
management:
endpoints:
web:
cors:
allowed-origins: "https://example.com"
allowed-methods: "GET,POST"
看CorsEndpointProperties提供完整的选项列表。 |
2.8. 实现自定义端点
如果你加上一个@Bean注释为@Endpoint,任何注释为 的方法@ReadOperation,@WriteOperation或@DeleteOperation在 JMX 上自动暴露,在 Web 应用中也可以通过 HTTP 暴露。
端点可以通过 HTTP 访问 Jersey、Spring MVC 或 Spring WebFlux 来暴露。
如果同时有Jersey和春季MVC,则使用春季MVC。
以下示例展示了返回自定义对象的读取作:
@ReadOperation
public CustomData getData() {
return new CustomData("test", 5);
}
@ReadOperation
fun getData(): CustomData {
return CustomData("test", 5)
}
你也可以通过以下方式编写技术专用端点@JmxEndpoint或@WebEndpoint.
这些端点受限于各自的技术。
例如@WebEndpoint仅通过HTTP暴露,不通过JMX暴露。
你可以通过以下方式编写针对特定技术的扩展@EndpointWebExtension和@EndpointJmxExtension.
这些注释允许你提供技术特定的作来增强现有端点。
最后,如果你需要访问Web框架特有的功能,可以实现Servlet或Spring@Controller和@RestController但代价是这些终端无法通过 JMX 或使用其他 Web 框架时可用。
2.8.1. 接收输入
端点上的作通过其参数接收输入。
当这些参数在网络上公开时,取自URL的查询参数和JSON请求体。
在 JMX 上暴露时,参数映射到 MBean作的参数。
参数默认是必需的。
它们可以通过以下注释来实现可选@javax.注释。可空或@org.springframework.lang.Nullable.
你可以将 JSON 请求体中的每个根属性映射到端点的参数。 考虑以下 JSON 请求主体:
{
"name": "test",
"counter": 42
}
你可以用它调用一个写作,该作对字符串名称和内线计数器参数,如下示例所示:
@WriteOperation
public void updateData(String name, int counter) {
// injects "test" and 42
}
@WriteOperation
fun updateData(name: String?, counter: Int) {
// injects "test" and 42
}
由于端点与技术无关,方法签名中只能指定简单类型。
特别地,声明一个参数,其中CustomData定义 一个名称和计数器不支持属性。 |
为了让输入映射到作方法的参数,实现端点的 Java 代码应编译为-参数,实现端点的Kotlin代码应编译为-java参数.
如果你使用 Spring Boot 的 Gradle 插件,或者使用 Maven,这会自动发生Spring靴启动父. |
2.8.2. 自定义网页端点
在@Endpoint,@WebEndpoint或@EndpointWebExtension通过 Jersey、Spring MVC 或 Spring WebFlux 自动通过 HTTP 暴露。
如果同时有Jersey和春季MVC,则使用春季MVC。
路径
谓词的路径由端点的ID和暴露于网络端点的基路径决定。
默认的基础路径是/驱动器.
例如,一个 ID 为会话使用/执行器/会话作为谓词中的路径。
你还可以通过注释作方法的一个或多个参数来进一步自定义路径@Selector.
这样的参数作为路径变量添加到路径谓词中。
当调用端点作时,变量的值会传递到作方法中。
如果你想捕捉所有剩余的路径元素,可以添加@Selector(比赛=ALL_REMAINING)将该参数设为与 A 兼容的类型弦[].
消耗
对于一个@WriteOperation(HTTP发布)使用请求体,即消耗谓词的从句为application/vnd.spring-boot.actuator.v2+json, application/json.
对于所有其他作,以下消耗条款是空的。
生产
这生产谓词的子句可以通过以下方式确定生产属性@DeleteOperation,@ReadOperation和@WriteOperation附注。
该属性是可选的。
如果不使用,则生产条款是自动确定的。
如果作方法返回无效或无效这生产条款是空的。
如果作方法返回org.springframework.core.io.Resource这生产从句为应用/八位元组流.
对于所有其他作,以下生产从句为application/vnd.spring-boot.actuator.v2+json, application/json.
Web端点响应状态
端点作的默认响应状态取决于作类型(读、写或删除)以及作返回的内容(如果有的话)。
如果@ReadOperation返回一个值,响应状态将是200(OK)。
如果没有返回某个值,响应状态将为404(未找到)。
如果@WriteOperation或@DeleteOperation返回一个值,响应状态将是200(OK)。
如果没有返回值,回复状态将是204(无内容)。
如果调用作时没有指定所需参数或参数无法转换为所需类型,则作方法不会被调用,响应状态将为400(错误请求)。
2.9. 健康信息
你可以使用健康信息检查你的申请状态。
监控软件常用它来提醒生产系统宕机。
由健康端点依赖于管理。端点。健康。显示-详情和管理端点.健康.show-components属性,可以配置为以下之一的值:
| 名称 | 描述 |
|---|---|
|
细节从未显示。 |
|
详情仅显示给授权用户。
授权角色可以通过以下方式配置 |
|
详细信息会向所有用户展示。 |
默认值为从不.
当用户处于一个或多个端点的角色时,即被视为被授权。
如果端点没有配置角色(默认配置),所有已认证的用户都被视为已授权。
你可以通过使用管理端点健康角色财产。
如果您已获得申请并希望使用总是您的安全配置必须允许认证和未认证用户访问健康端点。 |
一个健康贡献者可以是健康指标或者CompositeHealth贡献者.
一个健康指标提供实际健康信息,包括地位.
一个CompositeHealth贡献者提供其他的复合HealthContributors.
贡献者合在一起形成树状结构,以表示整体系统的健康状况。
默认情况下,最终系统健康值由状态聚合器,将状态从每个中排序健康指标基于有序的状态列表。
排序列表中的第一个状态用作整体健康状态。
如果没有健康指标返回已知的状态状态聚合器一未知使用状态。
你可以使用健康贡献者登记册在运行时注册和取消注册健康指示器。 |
2.9.1. 自动配置健康指示器
在适当情况下,Spring Boot 会自动配置健康指标列于下表。
你也可以通过配置来启用或禁用选定的指示器management.health.key.enabled,
其中钥匙下表列出:
| 钥匙 | 名称 | 描述 |
|---|---|---|
|
检查Cassandra数据库是否已上线。 |
|
|
检查Couchbase集群是否已启动。 |
|
|
检查连接 |
|
|
检查磁盘空间是否不足。 |
|
|
检查Elasticsearch集群是否已启动。 |
|
|
检查Hazelcast服务器是否已运行。 |
|
|
检查InfluxDB服务器是否已运行。 |
|
|
检查JMS经纪人是否在线。 |
|
|
检查LDAP服务器是否已运行。 |
|
|
检查邮件服务器是否已运行。 |
|
|
检查Mongo数据库是否已上线。 |
|
|
检查Neo4j数据库是否已上线。 |
|
|
总是这样回应 |
|
|
检查兔子服务器是否已运行。 |
|
|
检查Redis服务器是否已运行。 |
你可以通过设置management.health.defaults.enabled财产。 |
附加健康指标可用但默认不启用:
| 钥匙 | 名称 | 描述 |
|---|---|---|
|
暴露“活体性”应用可用性状态。 |
|
|
暴露“准备”应用可用性状态。 |
2.9.2. 编写自定义健康指标
为了提供自定义健康信息,你可以注册实现健康指标接口。
你需要提供健康()方法并返回健康响应。
这健康回复应包含状态,并可选择添加更多细节以展示。
以下代码展示了一个示例健康指标实现:
@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 ...
}
}
@Component
class MyHealthIndicator : HealthIndicator {
override fun health(): Health {
val errorCode = check()
if (errorCode != 0) {
return Health.down().withDetail("Error Code", errorCode).build()
}
return Health.up().build()
}
private fun check(): Int {
// perform some specific health check
return ...
}
}
给定标识符健康指标是没有健康指标如果有后缀,如果存在的话。
在前面的例子中,健康信息出现在一个名为我. |
健康指示通常通过HTTP调用,需要在任何连接超时前做出响应。
Spring Boot 会记录任何健康指示器响应超过 10 秒的警告信息。
如果你想配置这个阈值,可以用管理.端点.健康.日志.慢-指示-阈值财产。 |
例如,假设地位其代码为致命正在使用你的某个健康指标实现。
要配置严重度顺序,请在应用属性中添加以下属性:
management.endpoint.health.status.order=fatal,down,out-of-service,unknown,up
management:
endpoint:
health:
status:
order: "fatal,down,out-of-service,unknown,up"
响应中的HTTP状态码反映了整体健康状态。
默认情况下,OUT_OF_SERVICE和下503号地图。
任何未绘制的健康状态,包括向上映射到200。
如果你通过HTTP访问健康端点,也可以注册自定义状态映射。
配置自定义映射会禁用 的默认映射下和OUT_OF_SERVICE.
如果你想保留默认映射,必须明确配置它们,同时也要自定义映射。
例如,以下性质映射致命到503(服务不可用),并保留了默认映射下和OUT_OF_SERVICE:
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
management:
endpoint:
health:
status:
http-mapping:
down: 503
fatal: 503
out-of-service: 503
如果你需要更多控制权,可以自己定义HttpCodeStatusMapper豆。 |
下表展示了内置状态的默认状态映射:
| 地位 | 映射 |
|---|---|
|
|
|
|
|
默认情况下没有映射,所以 HTTP 状态是 |
|
默认情况下没有映射,所以 HTTP 状态是 |
2.9.3. 反应性健康指标
对于响应式应用,比如使用 Spring WebFlux 的应用,ReactiveHealth贡献者提供一个非阻塞的契约,用于获取应用程序健康状态。
类似于传统健康贡献者,健康信息是从以下内容中收集的ReactiveHealth贡献者注册(默认情况下,全部健康贡献者和ReactiveHealth贡献者在你的应用上下文).
定期HealthContributors未与响应式API进行检查的,则在弹性调度器中执行。
在响应式应用中,你应该使用ReactiveHealth贡献者注册在运行时注册和取消注册健康指示器。
如果你需要注册一个常客健康贡献者你应该用ReactiveHealth贡献者#adapt. |
要从响应式API提供自定义健康信息,你可以注册实现反应健康指示器接口。
以下代码展示了一个示例反应健康指示器实现:
@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 ...
}
}
@Component
class MyReactiveHealthIndicator : ReactiveHealthIndicator {
override fun health(): Mono<Health> {
return doHealthCheck()!!.onErrorResume { exception: Throwable? ->
Mono.just(Health.Builder().down(exception).build())
}
}
private fun doHealthCheck(): Mono<Health>? {
// perform some specific health check
return ...
}
}
为了自动处理错误,考虑从 扩展到摘要:ReactiveHealthIndicator. |
2.9.4. 自动配置的反应健康指示器
在适当情况下,Spring Boot 会自动配置以下内容反应健康指标:
| 钥匙 | 名称 | 描述 |
|---|---|---|
|
检查Cassandra数据库是否已上线。 |
|
|
检查Couchbase集群是否已启动。 |
|
|
检查Elasticsearch集群是否已启动。 |
|
|
检查Mongo数据库是否已上线。 |
|
|
检查Neo4j数据库是否已上线。 |
|
|
检查Redis服务器是否已运行。 |
如有必要,应动指示器替代常规指示器。
另外,任何健康指标未被显式处理的部分会自动包裹。 |
2.9.5. 健康组别
有时将健康指标分组,用于不同用途是有用的。
要创建健康指示组,你可以使用管理.端点.健康.group.<name>属性,并指定健康指示器ID列表为包括或排除.
例如,要创建一个仅包含数据库指标的组,可以定义以下内容:
management.endpoint.health.group.custom.include=db
management:
endpoint:
health:
group:
custom:
include: "db"
然后你可以通过点击来查看结果localhost:8080/actuator/health/custom.
同样,要创建一个排除数据库指标但包含所有其他指标的组,可以定义以下内容:
management.endpoint.health.group.custom.exclude=db
management:
endpoint:
health:
group:
custom:
exclude: "db"
默认情况下,如果健康组包含或排除不存在的健康指标,启动将失败。
要禁用该行为集管理.端点.健康.验证-组-成员自false.
默认情况下,组继承的是相同的状态聚合器和HttpCodeStatusMapper设置为系统健康状态。
不过,你也可以按组定义这些。
你也可以覆盖节目详情和角色如有需要:
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
management:
endpoint:
health:
group:
custom:
show-details: "when-authorized"
roles: "admin"
status:
order: "fatal,up"
http-mapping:
fatal: 500
out-of-service: 500
你可以使用@Qualifier(“组名”)如果你需要注册自定义状态聚合器或HttpCodeStatusMapper豆子,供团队使用。 |
健康团体也可以包含或排除CompositeHealth贡献者.
你也可以只包含或排除某一部分CompositeHealth贡献者.
这可以通过组件的完全限定名称实现,具体如下:
management.endpoint.health.group.custom.include="test/primary"
management.endpoint.health.group.custom.exclude="test/primary/b"
在上述示例中,该习惯该组将包括健康贡献者与名称一起主要它是复合材料的一个组成部分测试.
这里主要它本身是一个复合体,且健康贡献者与名称一起b将被排除在习惯群。
健康小组可以在主端口或管理端口的额外路径上提供。 这在云环境中非常有用,比如 Kubernetes,因为执行器端点通常会为执行器端点使用独立的管理端口以保障安全。 拥有独立端口可能导致健康检查不可靠,因为即使健康检查成功,主应用也可能无法正常工作。 健康组可以通过以下方式配置额外路径:
management.endpoint.health.group.live.additional-path="server:/healthz"
这将使住健康组可在主服务器端口提供,地址为/healthz.
前缀是强制性的,必须是以下之一服务器:(代表主服务器端口)或管理:(表示管理端口,如果配置的话。)
路径必须是单一路径段。
2.10. Kubernetes 探测器
部署在Kubernetes上的应用程序可以通过容器探测提供其内部状态的信息。 根据你的Kubernetes配置,kubelet会调用这些探针并对结果做出反应。
默认情况下,Spring Boot 管理你的应用可用性状态。
如果部署在 Kubernetes 环境中,执行器会从应用可用性接口并用于专门的健康指标:活体状态健康指标和准备状态健康指标.
这些指标显示在全球健康端点(“/执行器/健康”).
它们也通过使用健康组作为独立的HTTP探针被暴露:“/执行器/健康/活力”和“/执行器/健康/准备”.
然后你可以用以下端点信息配置你的Kubernetes基础设施:
livenessProbe:
httpGet:
path: "/actuator/health/liveness"
port: <actuator-port>
failureThreshold: ...
periodSeconds: ...
readinessProbe:
httpGet:
path: "/actuator/health/readiness"
port: <actuator-port>
failureThreshold: ...
periodSeconds: ...
<执行器端口>应该设置为执行器端点可用的端口。
可能是主服务器端口,或者是另一个管理端口,如果“管理.服务器.port”属性已设定。 |
只有当应用程序运行在 Kubernetes 环境中时,这些健康组才会自动启用。
你可以通过使用管理端点.健康探测器.enabled配置属性。
如果应用启动时间超过配置的活跃期,Kubernetes 会提到“启动探针”作为一种可能的解决方案。
一般来说,“启动探针”这里不一定需要,因为“准备探测器”在所有启动任务完成前都会失败。
这意味着你的应用在准备好之前不会收到流量。
不过,如果你的申请启动时间很长,可以考虑使用“启动探针”确保Kubernetes不会在应用启动过程中扼杀它。
请参见描述探针在应用生命周期中行为的部分。 |
如果你的 Actuator 端点部署在独立的管理环境中,端点不会使用与主应用相同的网络基础设施(端口、连接池、框架组件)。
在这种情况下,即使主要应用程序无法正常工作(例如无法接受新连接),探测检查也可能成功。
因此,制作活性和准备主服务器端口上有健康组。
这可以通过设置以下属性来实现:
management.endpoint.health.probes.add-additional-paths=true
这将使活性该组可访问/livez以及准备该组可访问/readyz在主服务器端口上。
路径可以通过以下方式进行自定义附加路径关于每个组的财产,详情请参见健康组。
2.10.1. 使用Kubernetes 探针检查外部状态
执行器将“活跃度”和“准备度”探针配置为健康组。 这意味着所有健康组的功能都为他们开放。 例如,你可以配置额外的健康指标:
management.endpoint.health.group.readiness.include=readinessState,customCheck
management:
endpoint:
health:
group:
readiness:
include: "readinessState,customCheck"
默认情况下,Spring Boot 不会在这些组中添加其他健康指标。
“活体”探针不应依赖于外部系统的健康检查。 如果应用的活体状态被破坏,Kubernetes 会尝试通过重启应用实例来解决这个问题。 这意味着如果外部系统(如数据库、Web API或外部缓存)发生故障,Kubernetes可能会重启所有应用实例,并引发串联故障。
至于“准备度”探针,应用开发者必须谨慎选择检查外部系统。 因此,Spring Boot 在准备度探测中没有包含任何额外的健康检查。 如果应用实例的准备状态尚未准备好,Kubernetes 不会将流量路由到该实例。 某些外部系统可能不被应用实例共享,在这种情况下,它们可以包含在准备探测中。 其他外部系统可能对应用不一定(应用可能有断路器和备份),在这种情况下,这些系统绝对不应被包含在内。 不幸的是,所有应用实例共享的外部系统很常见,你必须做出判断:将其纳入准备探测,预期当外部服务宕机时应用会被停用,还是放弃它,处理栈更上一层的故障,比如调用端的断路器。
如果所有应用实例都未准备好,则有一个 Kubernetes 服务type=ClusterIP或节点端口不接受任何输入连接。
没有HTTP错误响应(如503等),因为没有连接。
一项服务类型=负载均衡器是否接受连接,取决于提供商。
拥有显式入口的服务也会以某种方式响应,取决于实现——入口服务本身必须决定如何处理下游的“拒绝连接”。
HTTP 503 很可能在负载均衡器和入口的情况下都适用。 |
此外,如果应用使用 Kubernetes 自动扩展,应用从负载均衡器中移除应用的反应可能不同,具体取决于其自动扩展器的配置。
2.10.2. 应用生命周期与探针状态
Kubernetes Probes 支持的一个重要方面是其与应用生命周期的一致性。
两者之间存在显著差异可用性状态(即应用程序的内存内部状态)
以及实际探针(暴露该状态)。
根据应用生命周期的阶段,探针可能无法使用。
Spring Boot 会在启动和关闭期间发布应用程序事件,
探测器可以监听此类事件并揭示可用性状态信息。
下表展示了可用性状态以及不同阶段HTTP连接器的状态。
当 Spring Boot 应用程序启动时:
| 创业阶段 | 活态 | 准备状态 | HTTP 服务器 | 笔记 |
|---|---|---|---|---|
开始 |
|
|
还没开始 |
Kubernetes 会检查“活体”探测器,如果时间太长会重启应用。 |
开始 |
|
|
拒绝请求 |
应用上下文被刷新。该应用执行启动任务,尚未接收流量。 |
准备 |
|
|
接受请求 |
启动任务已完成。应用程序正在接收流量。 |
当 Spring Boot 应用程序关闭时:
| 停机阶段 | 活态 | 准备状态 | HTTP 服务器 | 笔记 |
|---|---|---|---|---|
运行 |
|
|
接受请求 |
已请求关闭。 |
优雅地关闭 |
|
|
新的请求被拒绝 |
启用后,优雅关机处理飞行中请求。 |
关闭完成 |
无 |
无 |
服务器关闭 |
应用上下文关闭,应用程序关闭。 |
| 有关Kubernetes部署的更多信息,请参见Kubernetes容器生命周期部分。 |
2.11. 应用信息
应用信息揭示了从所有领域收集的各种信息信息贡献者豆子定义在你的应用上下文.
Spring Boot 包含多种自动配置功能信息贡献者豆子,你也可以自己写。
2.11.1. 自动配置的信息贡献者
在适当情况下,Spring 会自动配置以下内容信息贡献者豆:
| 身份证 | 名称 | 描述 | 前提条件 |
|---|---|---|---|
|
暴露构建信息。 |
一个 |
|
|
暴露出来自 |
没有。 |
|
|
暴露git信息。 |
一个 |
|
|
暴露 Java 运行时信息。 |
没有。 |
|
|
暴露作系统信息。 |
没有。 |
是否允许单个贡献者由其控制management.info.<id>.enabled财产。
不同贡献者对该属性有不同的默认设置,取决于他们的前提条件和所披露信息的性质。
如果没有任何前提条件说明必须启用它们,环境,Java和操作系统贡献者默认被禁用。
每个都可以通过设置其management.info.<id>.enabled属性到true.
这构建和git信息贡献者默认已启用。
每个都可以通过设置其management.info.<id>.enabled属性到false.
或者,要禁用通常默认启用的所有贡献者,请设置management.info.defaults.enabled属性到false.
2.11.2. 自定义应用信息
当环境已启用贡献者,你可以自定义通过信息按设置的终点信息。*春季房产。
都环境在信息密钥会自动曝光。
例如,你可以在你的application.properties文件:
info.app.encoding=UTF-8
info.app.java.source=17
info.app.java.target=17
info:
app:
encoding: "UTF-8"
java:
source: "17"
target: "17"
|
与其硬编码这些值,你也可以在构建时扩展信息属性。 假设你用Maven,你可以把前面的例子重写如下: Yaml
|
2.11.3. Git 提交信息
另一个有用的特性信息端点是它发布关于你状态信息的能力git项目构建时的源代码仓库。
如果GitProperties豆子有供应,你可以使用信息端点以暴露这些属性。
一个GitProperties如果git.properties文件可在类路径的根节点上提供。
详情请参见“如何生成git信息”。 |
默认情况下,端点会暴露git.branch,git.commit.id和git.commit.time如果存在,则具有性质。
如果你不希望这些属性出现在端点响应中,就需要将它们排除在git.properties文件。
如果你想显示完整的 git 信息(也就是git.properties),使用管理信息.git.mode性质,具体如下:
management.info.git.mode=full
management:
info:
git:
mode: "full"
要禁用git提交信息信息端点完全,设management.info.git.enabled属性到false如下:
management.info.git.enabled=false
management:
info:
git:
enabled: false
2.11.4. 构建信息
如果BuildProperties豆子可用,信息Endpoint 也可以发布关于你构建的信息。
如果META-INF/build-info.properties文件可在类路径中获得。
| Maven 和 Gradle 插件都能生成该文件。 详情请参见“如何生成构建信息”。 |
2.11.5. Java 信息
这信息端点发布关于您的 Java 运行环境的信息,参见JavaInfo更多细节请阅读。
2.11.6.作系统信息
这信息端点发布关于作系统的信息,参见OsInfo更多细节请阅读。
2.11.7. 编写自定义信息贡献者
为了提供自定义应用信息,你可以注册实现信息贡献者接口。
以下示例贡献了示例单一值的条目:
@Component
public class MyInfoContributor implements InfoContributor {
@Override
public void contribute(Info.Builder builder) {
builder.withDetail("example", Collections.singletonMap("key", "value"));
}
}
@Component
class MyInfoContributor : InfoContributor {
override fun contribute(builder: Info.Builder) {
builder.withDetail("example", Collections.singletonMap("key", "value"))
}
}
如果你到达信息端点,你应该会看到包含以下额外条目的响应:
{
"example": {
"key" : "value"
}
}
3. 通过HTTP进行监控和管理
如果你正在开发一个网页应用,Spring Boot Actuator 会自动配置所有启用的端点,通过 HTTP 公开。
默认惯例是使用身份证端点的 ,前缀为/驱动器作为URL路径。
例如健康被揭示为/执行器/健康.
| Actuator 原生支持于 Spring MVC、Spring WebFlux 和 Jersey。 如果同时有Jersey和春季MVC,则使用春季MVC。 |
3.1. 定制管理端点路径
有时,定制管理端点的前缀是有用的。
例如,你的应用程序可能已经使用/驱动器为了另一个目的。
你可以使用管理端点.web.base-path用于更改管理端点前缀的property,如下示例所示:
management.endpoints.web.base-path=/manage
management:
endpoints:
web:
base-path: "/manage"
前述application.properties示例将端点从/执行器/{id}自/manage/{id}(例如,/管理/信息).
除非管理端口被配置为通过使用不同的HTTP端口暴露端点,管理端点.web.base-path相对于server.servlet.context-path(对于 servlet web 应用)或spring.webflux.base-path(针对响应式网页应用)。
如果management.server.port配置为,管理端点.web.base-path相对于management.server.base-path. |
如果你想将端点映射到不同的路径,可以使用管理端点.web.path-mapping财产。
以下示例是重新映射的/执行器/健康自/健康检查:
management.endpoints.web.base-path=/
management.endpoints.web.path-mapping.health=healthcheck
management:
endpoints:
web:
base-path: "/"
path-mapping:
health: "healthcheck"
3.2. 管理服务器端口的定制
通过默认HTTP端口暴露管理端点,对于云部署来说是一个明智的选择。 但如果你的应用运行在自己的数据中心内,你可能更倾向于通过不同的HTTP端口来暴露端点。
你可以设置management.server.port以下示例展示了 property 以更改 HTTP 端口:
management.server.port=8081
management:
server:
port: 8081
| 在Cloud Foundry中,默认情况下,应用程序仅在8080端口接收HTTP和TCP路由请求。 如果你想在Cloud Foundry上使用自定义管理端口,你需要明确设置应用路由,将流量转发到该自定义端口。 |
3.3. 配置管理专用SSL
配置为使用自定义端口时,你也可以通过各种management.server.ssl.*性能。
例如,这样做可以让管理服务器通过HTTP可用,而主应用程序使用HTTPS,以下属性设置所示:
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
server:
port: 8443
ssl:
enabled: true
key-store: "classpath:store.jks"
key-password: "secret"
management:
server:
port: 8080
ssl:
enabled: false
另外,主服务器和管理服务器也可以使用SSL,但密钥存储不同,具体如下:
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
server:
port: 8443
ssl:
enabled: true
key-store: "classpath:main.jks"
key-password: "secret"
management:
server:
port: 8080
ssl:
enabled: true
key-store: "classpath:management.jks"
key-password: "secret"
4. 通过JMX进行监控与管理
Java 管理扩展(JMX)提供了一种标准机制来监控和管理应用程序。
默认情况下,此功能未被启用。
你可以通过设置spring.jmx.enabled配置性质为true.
Spring靴展现了最合适的MBeanServer作为一个具有 ID 的豆子mbeanServer.
你任何带有Spring JMX注释的豆子(@ManagedResource,@ManagedAttribute或@ManagedOperation)暴露于其中。
如果你的平台提供标准MBeanServerSpring Boot 使用该系统并默认使用 VMMBeanServer,必要时。
如果这些都失败了,那就换一个新的MBeanServer被创造出来。
spring.jmx.enabled仅影响春季提供的管理豆。
启用其他库(例如 Log4j2 或 Quartz)提供的管理豆是独立的。 |
参见JmxAutoConfiguration更多详情请见班级。
默认情况下,Spring Boot 还将管理端点作为 JMX MBean 暴露于org.springframework.boot域。
要完全控制JMX域中的端点注册,建议自行注册EndpointObjectNameFactory实现。
4.1. 定制MBean名称
MBean的名称通常由身份证终点。
例如,健康端点被暴露为org.springframework.boot:type=Endpoint,name=Health.
如果你的申请包含多个春季应用上下文你可能会发现名字有冲突。
为了解决这个问题,你可以设置spring.jmx.unique-names属性到true因此MBean的名称始终是唯一的。
你还可以自定义端点暴露在该下的 JMX 域。
以下设置展示了在application.properties:
spring.jmx.unique-names=true
management.endpoints.jmx.domain=com.example.myapp
spring:
jmx:
unique-names: true
management:
endpoints:
jmx:
domain: "com.example.myapp"
5. 可观测性
可观测性是指从外部观察运行系统内部状态的能力。 它包括三大支柱:Logging、度量和痕迹。
对于度量和迹量,Spring Boot 使用微米观测。
为了创建自己的观测值(这将导致度量和追踪),你可以注入一个观测登记册.
@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
});
}
}
| 低基数标签将被添加到度量和跟踪中,而高基数标签只会添加到跟踪中。 |
类型的豆子观察谓词,全球观察大会,观察Filter和观察处理器将自动注册观测登记册.
你也可以注册任意数量的观察登记定制器Beans 以进一步配置注册表。
可观察性支持依赖上下文传播库,用于将当前观察数据转发到线程和响应式流水线之间。
默认情况下,ThreadLocal在响应式运算符中,值不会自动恢复。
这种行为通过spring.reactor.context-propagation属性,可以设置为自动以实现自动传播。
有关观测的更多细节,请参阅Micrometer Observation文档。
| JDBC 的可观测性可以通过单独的项目进行配置。 Datasource Micrometer 项目提供了一个 Spring Boot Starters,当调用 JDBC作时自动生成观测值。 可以阅读参考文献中的更多信息。 |
R2DBC 的可观测性内置于 Spring Boot 中。
要启用它,添加io.r2dbc:r2dbc-proxy对项目的依赖。 |
5.1. 常见标签
常见标签通常用于对作环境进行维度下降,如主机、实例、区域、堆栈等。 所有观测都以低基数标签的形式应用通用标签,并且可以配置,如下示例所示:
management.observations.key-values.region=us-east-1
management.observations.key-values.stack=prod
management:
observations:
key-values:
region: "us-east-1"
stack: "prod"
前述例子补充地区和叠所有值为 的观测值的标签美国东1号和刺分别。
5.2. 防止观测
如果你想防止某些观测被报告,可以使用management.observations.enable性能:
management.observations.enable.denied.prefix=false
management.observations.enable.another.denied.prefix=false
management:
observations:
enable:
denied:
prefix: false
another:
denied:
prefix: false
上述示例将阻止所有以denied.前缀或另一个.denied.前缀.
如果你想阻止Spring Security报告观测值,就设置属性管理。观察。使得能。春。安全自false. |
如果你需要更好地控制观察的预防,可以登记类型的豆子观察谓词.
只有当所有观察谓词豆子回归true感谢你的观察。
@Component
class MyObservationPredicate implements ObservationPredicate {
@Override
public boolean test(String name, Context context) {
return !name.contains("denied");
}
}
上述示例将阻止所有包含“拒绝”的观测。
5.3. OpenTelemetry 支持
| 在您的应用中支持OpenTelemetry有多种方式。 你可以使用 OpenTelemetry Java Agent 或 OpenTelemetry Spring Boot Starter, 这些都得到了OTel社区的支持;度量和痕迹使用了 OTel 库定义的语义约定。 本文档描述了 OpenTelemetry 由 Spring 团队官方支持 ,使用 Micrometer 和 OTLP 导出器; 度量和痕迹使用了 Spring 项目文档中描述的语义惯例,如 Spring Framework。 |
Spring Boot 的执行器模块包含对 OpenTelemetry 的基本支持。
它提供了一种类型的“豆子”开放遥测,如果存在 的豆子类型SdkTracerProvider,上下文传播器,SdkLoggerProvider或SdkMeterProvider在应用环境中,它们会自动注册。
此外,它还提供了资源豆。
自动配置的属性资源可以通过管理.opentelemetry.resource-attributes配置属性。
如果你已经定义了自己的资源Bean,这种情况将不再发生。
| Spring Boot 不提供 OpenTelemetry 指标或日志的自动配置。 OpenTelemetry 追踪只有在与微米追踪一起使用时才会自动配置。 |
接下来的章节将提供更多关于日志记录、指标和痕迹的细节。
5.4. 微米观测注释支持
以便扫描度量和追踪注释,如@Timed,@Counted,@MeterTag和@NewSpan注释,你需要设置管理。观察。注释.启用属性到true.
该功能直接支持Micrometer,请参阅Micrometer和Micrometer Tracs参考文档。
7. 度量
Spring Boot Actuator 为 Micrometer 提供了依赖管理和自动配置,Micrometer 是一个支持多种监控系统的应用指标界面,包括:
7.1. 入门
Spring Boot 会自动配置复合图MeterRegistry并且为类路径上每个支持的实现添加一个注册表。
对Micrometer-registry-{system}在你的运行时,Spring Boot 已经足够配置注册表了。
大多数注册机构有共同特征。 例如,即使Micrometer注册表实现在类路径上,你也可以禁用某个特定的注册表。 以下示例禁用了Datadog:
management.datadog.metrics.export.enabled=false
management:
datadog:
metrics:
export:
enabled: false
除非注册表特定属性另有说明,否则您也可以禁用所有注册表,如下示例所示:
management.defaults.metrics.export.enabled=false
management:
defaults:
metrics:
export:
enabled: false
Spring Boot 还会将任何自动配置的注册表添加到全局静态复合注册表中指标除非你明确告诉它不要:
management.metrics.use-global-registry=false
management:
metrics:
use-global-registry: false
你可以注册任意数量的MeterRegistryCustomizerBEANS 用于进一步配置注册表,例如在任何电表注册前应用公共标签:
@Configuration(proxyBeanMethods = false)
public class MyMeterRegistryConfiguration {
@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return (registry) -> registry.config().commonTags("region", "us-east-1");
}
}
@Configuration(proxyBeanMethods = false)
class MyMeterRegistryConfiguration {
@Bean
fun metricsCommonTags(): MeterRegistryCustomizer<MeterRegistry> {
return MeterRegistryCustomizer { registry ->
registry.config().commonTags("region", "us-east-1")
}
}
}
您可以通过更具体地针对通用类型,对特定注册表实现进行自定义:
@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 ...
}
}
@Configuration(proxyBeanMethods = false)
class MyMeterRegistryConfiguration {
@Bean
fun graphiteMetricsNamingConvention(): MeterRegistryCustomizer<GraphiteMeterRegistry> {
return MeterRegistryCustomizer { registry: GraphiteMeterRegistry ->
registry.config().namingConvention(this::name)
}
}
private fun name(name: String, type: Meter.Type, baseUnit: String?): String {
return ...
}
}
Spring Boot 还配置内置仪表,可以通过配置或专用注释标记来控制。
7.2. 支持的监控系统
本节简要介绍了支持的每一套监控系统。
7.2.1. 应用光学
默认情况下,AppOptics 注册表会定期推送指标于api.appoptics.com/v1/measurements.
要将指标导出到 SaaS AppOptics,您的 API Tokens必须提供:
management.appoptics.metrics.export.api-token=YOUR_TOKEN
management:
appoptics:
metrics:
export:
api-token: "YOUR_TOKEN"
7.2.2. 阿特拉斯
management.atlas.metrics.export.uri=https://atlas.example.com:7101/api/v1/publish
management:
atlas:
metrics:
export:
uri: "https://atlas.example.com:7101/api/v1/publish"
7.2.3. 数据狗
management.datadog.metrics.export.api-key=YOUR_KEY
management:
datadog:
metrics:
export:
api-key: "YOUR_KEY"
如果您还提供应用密钥(可选),那么电表描述、类型和基准单元等元数据也会被导出:
management.datadog.metrics.export.api-key=YOUR_API_KEY
management.datadog.metrics.export.application-key=YOUR_APPLICATION_KEY
management:
datadog:
metrics:
export:
api-key: "YOUR_API_KEY"
application-key: "YOUR_APPLICATION_KEY"
默认情况下,指标会发送到Datadog美国网站 (api.datadoghq.com).
如果你的Datadog项目托管在其他站点,或者你需要通过代理发送指标,请相应配置URI:
management.datadog.metrics.export.uri=https://api.datadoghq.eu
management:
datadog:
metrics:
export:
uri: "https://api.datadoghq.eu"
你还可以更改向Datadog发送指标的间隔:
management.datadog.metrics.export.step=30s
management:
datadog:
metrics:
export:
step: "30s"
7.2.4. Dynatrace
Dynatrace 提供两个指标导入 API,均为 Micrometer 实现。
你可以在这里找到Dynatrace关于微米计量导入的文档。
配置属性在第一版命名空间仅在导出到 Timeseries v1 API 时应用。
配置属性在V2命名空间仅在导出到 Metrics v2 API 时应用。
注意,该集成只能导出为任一第一版或V2API版本,且V2被优先考虑。
如果设备标识(v1 需要,但 v2 中未使用)被设置在第一版命名空间,度量导出为第一版端点。
否则V2被假定。
v2 API
你可以用 v2 API 有两种方式。
自动配置
Dynatrace 自动配置适用于由 OneAgent 或 Dynatrace 操作员监控的 Kubernetes 托管主机。
本地OneAgent:如果主机上运行着OneAgent,指标会自动导出到本地OneAgent的导入端点。 导入端点将指标转发到 Dynatrace 后端。
Dynatrace Kubernetes Operator:在安装了Dynatrace Operator的Kubernetes中运行时,注册表会自动从作符处获取你的端点URI和APITokens。
这是默认行为,除了依赖于io.micrometer:micrometer-registry-dynatrace.
手动配置
如果没有自动配置,则需要 Metrics v2 API 的端点和 API Tokens。
API Tokens必须包含“导入指标”(metrics.ingest) 权限设置。
我们建议将Tokens的权限限制在这一个权限范围内。
您必须确保端点 URI 包含路径(例如,/api/v2/metrics/ingest):
Metrics API v2 导入端点的 URL 会根据你的部署选项不同而有所不同:
-
SaaS:
https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest -
托管部署:
https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest
下面的示例是通过以下方式配置指标导出示例环境ID:
management.dynatrace.metrics.export.uri=https://example.live.dynatrace.com/api/v2/metrics/ingest
management.dynatrace.metrics.export.api-token=YOUR_TOKEN
management:
dynatrace:
metrics:
export:
uri: "https://example.live.dynatrace.com/api/v2/metrics/ingest"
api-token: "YOUR_TOKEN"
使用 Dynatrace v2 API 时,可以使用以下可选功能(更多细节可见 Dynatrace 文档):
-
度量键前缀:设置一个前缀,该前缀会加在所有导出的度量键前。
-
丰富Dynatrace元数据:如果OneAgent或Dynatrace操作员正在运行,可以用额外的元数据丰富指标(例如关于主机、进程或Pod的元数据)。
-
默认维度:指定添加到所有导出指标中的键值对。 如果用Micrometer指定了带有相同密钥的标签,它们会覆盖默认尺寸。
-
使用Dynatrace汇总工具:在某些情况下,Micrometer Dynatrace注册系统创建的指标被拒绝。 在Micrometer 1.9.x中,通过引入Dynatrace专用的摘要仪器解决了这个问题。 将此开关设置为
falseMicrometer 强制退回到 1.9.x 之前的默认行为。 只有在从 Micrometer 1.8.x 迁移到 1.9.x 时遇到问题时才应使用。 -
导出电表元数据:从 Micrometer 1.12.0 起,Dynatrace 导出器默认还会导出电表元数据,如单位和描述。 使用该
导出-计量元数据切换关闭此功能。
也可以不指定 URI 和 API Tokens,如下例所示。 在这种情况下,自动配置端点使用的是:
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
management.dynatrace.metrics.export.v2.export-meter-metadata=true
management:
dynatrace:
metrics:
export:
# Specify uri and api-token here if not using the local OneAgent endpoint.
v2:
metric-key-prefix: "your.key.prefix"
enrich-with-dynatrace-metadata: true
default-dimensions:
key1: "value1"
key2: "value2"
use-dynatrace-summary-instruments: true # (default: true)
export-meter-metadata: true # (default: true)
v1 API(遗留)
Dynatrace v1 API 的指标注册表通过使用时间序列 v1 API 定期向配置好的 URI 推送指标。
为了向后兼容现有设置,当设备标识是设置的(v1 必须,但 v2 中不使用),指标会导出到 Timeseries v1 端点。
要将指标导出到 Dynatrace,必须提供 API Tokens、设备 ID 和 URI:
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
management:
dynatrace:
metrics:
export:
uri: "https://{your-environment-id}.live.dynatrace.com"
api-token: "YOUR_TOKEN"
v1:
device-id: "YOUR_DEVICE_ID"
对于v1 API,你必须指定基础环境URI但没有路径,因为v1端点路径是自动添加的。
版本无关设置
除了API端点和Tokens外,你还可以更改指标发送到Dynatrace的间隔。
默认导出间隔为60年代.
以下示例将导出间隔设置为30秒:
management.dynatrace.metrics.export.step=30s
management:
dynatrace:
metrics:
export:
step: "30s"
你可以在Micrometer文档和Dynatrace文档中找到更多关于如何设置Micrometer导出器的信息。
7.2.5. 弹性
默认情况下,指标会导出到运行在本地机器上的 Elastic。 您可以通过以下属性提供弹性服务器的位置:
management.elastic.metrics.export.host=https://elastic.example.com:8086
management:
elastic:
metrics:
export:
host: "https://elastic.example.com:8086"
7.2.6. 神经节
默认情况下,指标会导出到运行在本地机器上的Ganglia。 你可以提供Ganglia服务器的主机和端口,如下示例所示:
management.ganglia.metrics.export.host=ganglia.example.com
management.ganglia.metrics.export.port=9649
management:
ganglia:
metrics:
export:
host: "ganglia.example.com"
port: 9649
7.2.7. 石墨
默认情况下,指标会导出到运行在本地机器上的Graphite。 你可以提供Graphite服务器的主机和端口,如下示例所示:
management.graphite.metrics.export.host=graphite.example.com
management.graphite.metrics.export.port=9004
management:
graphite:
metrics:
export:
host: "graphite.example.com"
port: 9004
Micrometer是默认的层级NameMapper这决定了维度计ID如何映射到平面层级名称。
|
要控制这种行为,请定义你的 Java
Kotlin
|
7.2.8. 胡米奥
默认情况下,Humio注册表会定期推送指标到 cloud.humio.com。 要将指标导出到 SaaS Humio,您必须提供您的 API Tokens:
management.humio.metrics.export.api-token=YOUR_TOKEN
management:
humio:
metrics:
export:
api-token: "YOUR_TOKEN"
你还应配置一个或多个标签,以识别推送指标的数据来源:
management.humio.metrics.export.tags.alpha=a
management.humio.metrics.export.tags.bravo=b
management:
humio:
metrics:
export:
tags:
alpha: "a"
bravo: "b"
7.2.9. 涌入
默认情况下,指标会导出到运行在本地机器上的 Influx v1 实例,使用默认配置。
要将指标导出到 InfluxDB v2,请配置组织,桶,以及认证Tokens用于写度量。
您可以通过以下方式提供Influx服务器的位置:
management.influx.metrics.export.uri=https://influx.example.com:8086
management:
influx:
metrics:
export:
uri: "https://influx.example.com:8086"
7.2.10. JMX
Micrometer 提供了与 JMX 的层级映射,主要作为一种廉价且便携的本地指标查看方式。
默认情况下,指标会导出为指标JMX域。
您可以通过以下方式提供域名:
management.jmx.metrics.export.domain=com.example.app.metrics
management:
jmx:
metrics:
export:
domain: "com.example.app.metrics"
Micrometer是默认的层级NameMapper这决定了维度计ID如何映射到平面层级名称。
|
要控制这种行为,请定义你的 Java
Kotlin
|
7.2.11. KairosDB
默认情况下,指标会导出到运行在本地机器上的 KairosDB。 您可以通过以下方式提供 KairosDB 服务器的位置:
management.kairos.metrics.export.uri=https://kairosdb.example.com:8080/api/v1/datapoints
management:
kairos:
metrics:
export:
uri: "https://kairosdb.example.com:8080/api/v1/datapoints"
7.2.12. 新遗物
management.newrelic.metrics.export.api-key=YOUR_KEY
management.newrelic.metrics.export.account-id=YOUR_ACCOUNT_ID
management:
newrelic:
metrics:
export:
api-key: "YOUR_KEY"
account-id: "YOUR_ACCOUNT_ID"
你还可以更改向New Relic发送指标的间隔:
management.newrelic.metrics.export.step=30s
management:
newrelic:
metrics:
export:
step: "30s"
默认情况下,度量通过 REST 调用发布,但如果你在类路径上有 Java Agent API,也可以使用它:
management.newrelic.metrics.export.client-provider-type=insights-agent
management:
newrelic:
metrics:
export:
client-provider-type: "insights-agent"
最后,你可以通过定义自己的方式来完全掌控NewRelicClientProvider豆。
7.2.13. 开放遥测
默认情况下,指标会导出到运行在本地机器上的OpenTelemetry。 您可以通过以下方式提供OpenTelemetry指标端点的位置:
management.otlp.metrics.export.url=https://otlp.example.com:4318/v1/metrics
management:
otlp:
metrics:
export:
url: "https://otlp.example.com:4318/v1/metrics"
7.2.14. 普罗米修斯
Prometheus 期望抓取或轮查单个应用实例以获取指标。
Spring Boot 提供了一个执行器端点于/执行器/普罗米修斯以适当格式呈现普罗米修斯抓取。
| 默认情况下,端点不可用,必须被公开。详情请参见“暴露端点”。 |
以下示例scrape_config增加于prometheus.yml:
scrape_configs:
- job_name: "spring"
metrics_path: "/actuator/prometheus"
static_configs:
- targets: ["HOST:PORT"]
普罗米修斯·范例也被支持。
要启用此功能,需要SpanContextSupplier豆豆应该在场。
如果你用微尺追踪,这个会自动配置,但如果你愿意,也可以自己创建。
请查看Prometheus文档,因为此功能需要在Prometheus端明确启用,且仅支持OpenMetrics格式。
对于可能存在时间不够长、无法被抓取的临时或批处理作业,你可以使用 Prometheus Pushgateway 支持将指标暴露给 Prometheus。 要启用Prometheus Pushgateway支持,请在您的项目中添加以下依赖:
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_pushgateway</artifactId>
</dependency>
当Prometheus Pushgateway依赖存在于类路径和管理.prometheus.metrics.export.pushgateway.enabled属性设置为true一个PrometheusPushGatewayManagerBean是自动配置的。
这用于管理向Prometheus Pushgateway推送指标。
你可以调音PrometheusPushGatewayManager通过利用以下属性管理.prometheus.metrics.export.pushgateway.
对于高级配置,你也可以提供自己的配置PrometheusPushGatewayManager豆。
2015年2月7日。信号效果器
management.signalfx.metrics.export.access-token=YOUR_ACCESS_TOKEN
management:
signalfx:
metrics:
export:
access-token: "YOUR_ACCESS_TOKEN"
你也可以更改向 SignalFx 发送度量的间隔:
management.signalfx.metrics.export.step=30s
management:
signalfx:
metrics:
export:
step: "30s"
7.2.16. 简单
Micrometer 自带一个简单的内存后端,如果没有配置其他注册表,后端会自动作为备用。 这让你可以看到指标端点收集了哪些指标。
内存后端一旦使用其他可用后端,就会自动禁用。 你也可以明确禁用它:
management.simple.metrics.export.enabled=false
management:
simple:
metrics:
export:
enabled: false
7.2.17. 堆叠驱动
Stackdriver 注册表会定期将度量推送到 Stackdriver。 要将指标导出到 SaaS Stackdriver,您必须提供您的 Google Cloud 项目 ID:
management.stackdriver.metrics.export.project-id=my-project
management:
stackdriver:
metrics:
export:
project-id: "my-project"
你也可以更改向 Stackdriver 发送指标的间隔:
management.stackdriver.metrics.export.step=30s
management:
stackdriver:
metrics:
export:
step: "30s"
2018年2月7日。统计部
StatsD 注册局积极地通过 UDP 向 StatsD 代理推送指标。 默认情况下,指标会导出到运行在本地机器上的 StatsD 代理。 你可以通过以下方式提供StatsD代理主机、端口和协议:
management.statsd.metrics.export.host=statsd.example.com
management.statsd.metrics.export.port=9125
management.statsd.metrics.export.protocol=udp
management:
statsd:
metrics:
export:
host: "statsd.example.com"
port: 9125
protocol: "udp"
你也可以更改 StatsD 线协议(默认为 Datadog):
management.statsd.metrics.export.flavor=etsy
management:
statsd:
metrics:
export:
flavor: "etsy"
2.19 7.2.19. 波前
management.wavefront.api-token=YOUR_API_TOKEN
management:
wavefront:
api-token: "YOUR_API_TOKEN"
或者,您也可以在环境中使用Wavefront的侧车或内部代理,将指标数据转发到Wavefront API主机:
management.wavefront.uri=proxy://localhost:2878
management:
wavefront:
uri: "proxy://localhost:2878"
如果你向Wavefront代理发布指标(如Wavefront文档所述),主机必须在proxy/HOST:PORT格式。 |
你还可以更改向 Wavefront 发送指标的间隔:
management.wavefront.metrics.export.step=30s
management:
wavefront:
metrics:
export:
step: "30s"
7.3. 支持的度量和计量器
Spring Boot 为多种技术提供自动电表注册功能。 在大多数情况下,默认数据提供了可行的指标,可以发布到任何支持的监控系统。
7.3.1. JVM 指标
通过使用核心的千米类自动配置,实现JVM指标。
JVM指标以以下方式发布,JVM。仪表名称。
以下JVM指标提供:
-
各种内存和缓冲池细节
-
垃圾回收相关的统计数据
-
线程利用
-
载入和卸载的类别数量
-
JVM 版本信息
-
JIT 编译时间
7.3.2. 系统度量
自动配置通过使用核心的微米类实现系统度量。
系统度量以系统。,过程。和磁盘。计价器名称。
提供以下系统指标:
-
CPU指标
-
文件描述符度量
-
运行时间指标(包括应用程序运行时间和固定的绝对启动时间指标)
-
可用磁盘空间
7.3.5. 任务执行与调度指标
自动配置支持所有可用仪器线程池任务执行者和ThreadPoolTaskScheduler豆子,只要手下线程池执行器已开放。
指标以执行人名称标记,执行人名称源自豆子名称。
7.3.6. JMS度量
自动配置支持所有可用仪器Jms模板豆子和@JmsListener注释方法。
这将产生“jms.message.publish”和“jms.message.process”分别是指标。
有关产生观测的更多信息,请参见春季框架参考文档。
7.3.7. 春季MVC指标
自动配置支持对Spring MVC控制器和功能处理程序处理的所有请求进行仪器化。
默认情况下,指标以以下名称生成,http.server.requests.
你可以通过设置management.observations.http.server.requests.name财产。
为了添加默认标签,请提供@Bean这在DefaultServerRequestObservationConvention来自org.springframework.http.server.observation包。
要替换默认标签,请提供@Bean实现ServerRequestObservationConvention.
| 在某些情况下,网页控制器处理的异常不会被记录为请求度量标签。 应用程序可以通过将处理异常设置为请求属性来选择加入并记录异常。 |
默认情况下,所有请求都会被处理。
要自定义过滤器,请提供@Bean实现FilterRegistrationBean<ServerHttpObservationFilter>.
7.3.8. 春季WebFlux指标
自动配置支持对 Spring WebFlux 控制器和功能处理程序处理的所有请求进行仪表化。
默认情况下,指标以以下名称生成,http.server.requests.
你可以通过设置management.observations.http.server.requests.name财产。
为了添加默认标签,请提供@Bean这在DefaultServerRequestObservationConvention来自org.springframework.http.server.reactive.observation包。
要替换默认标签,请提供@Bean实现ServerRequestObservationConvention.
| 在某些情况下,控制器和处理函数处理的异常不会作为请求度量标签记录。 应用程序可以通过将处理异常设置为请求属性来选择加入并记录异常。 |
7.3.9. Jersey服务器指标
自动配置支持对JerseyJAX-RS实现处理的所有请求进行仪器化。
默认情况下,指标以以下名称生成,http.server.requests.
你可以通过设置management.observations.http.server.requests.name财产。
默认情况下,Jersey服务器的指标会被标记为以下信息:
| 标记 | 描述 |
|---|---|
|
处理请求时抛出的任何异常的简单类名称。 |
|
请求的方法(例如, |
|
请求的结果,基于响应的状态代码。
1xx 是 |
|
响应的HTTP状态码(例如, |
|
请求在变量替换前的URI模板(例如, |
要自定义标签,请提供@Bean实现Jersey标签提供者.
7.3.10. HTTP 客户端指标
Spring套执行器管理Rest模板,Web客户端和Rest客户端.
为此,你需要注入自动配置的构建器并用它来创建实例:
-
Rest模板构建器为Rest模板 -
WebClient.Builder为Web客户端 -
RestClient.Builder为Rest客户端
你也可以手动应用负责这些仪器的自定义器,具体来说ObservationRestTemplateCustomizer,ObservationWebClientCustomizer和ObservationRestClientCustomizer.
默认情况下,指标以以下名称生成,http.client.requests.
你可以通过设置management.observations.http.client.requests.name财产。
使用时可以自定义标签Rest模板或Rest客户端,提供一个@Bean实现客户端请求观察约定来自org.springframework.http.client.observation包。
使用时可以自定义标签Web客户端,提供一个@Bean实现客户端请求观察约定来自org.springframework.web.reactive.function.client包。
7.3.11. Tomcat队指标
自动配置仅在MBean注册处已启用。
默认情况下,MBean注册处禁用了,但你可以通过设置来启用server.tomcat.mbeanregistry.enabled自true.
Tomcat的指标以以下形式发布公猫。仪表名称。
7.3.12. 缓存指标
自动配置支持所有可用仪器缓存启动时的实例,指标前缀为缓存.
缓存仪器已标准化为一组基本的指标。
此外,还提供针对缓存的额外指标。
支持以下缓存库:
-
缓存2k
-
咖啡因
-
Hazelcast
-
任何符合标准的 JCache(JSR-107) 实现
-
Redis
度量以缓存名称和缓存管理器,这个名字源自豆子的名字。
只有启动时配置好的缓存才绑定到注册表。
对于缓存配置中未定义的缓存,如即时创建或启动阶段后程序创建的缓存,则需要显式注册。
一个CacheMetrics注册商豆子的推出是为了简化这一过程。 |
7.3.13. Spring Session指标
请参阅春季批次参考文档。
7.3.15. 数据源指标
自动配置支持所有可用仪器数据来源以 为 的度量为前缀的对象JDBC.connections.
数据源仪器生成的规范表示池中当前活跃、空闲、最大允许和最小允许连接。
度量指标也会以数据来源根据豆子的名字计算。
默认情况下,Spring Boot 为所有支持的数据源提供元数据。
你可以添加额外的内容DataSourcePoolMetadataProvider如果你喜欢的数据源不支持,那就用豆子。
看DataSourcePoolMetadataProvidersConfiguration举个例子。 |
此外,光的专属指标通过以下内容暴露希卡里普前缀。
每个指标都标注池名(你可以用spring.datasource.name).
7.3.16. 休眠度量
如果org.hibernate.orm:hibernate-micrometer在类路径上,所有可用的休眠状态EntityManagerFactory启用统计的实例会用一个名为Hibernate.
度量指标也会以EntityManagerFactory,这个名字源自豆子的名字。
为了启用统计,标准的JPA性质hibernate.generate_statistics必须设置为true.
你可以在自动配置中启用EntityManagerFactory:
spring.jpa.properties[hibernate.generate_statistics]=true
spring:
jpa:
properties:
"[hibernate.generate_statistics]": true
7.3.17. 春季数据仓库指标
自动配置支持所有 Spring 数据的测量存储 库方法调用。
默认情况下,指标以以下名称生成,spring.data.repository.invocations.
你可以通过设置management.metrics.data.repository.metric-name财产。
这@Timed注释来自io.micrometer.core.annotation包在存储 库接口和方法。
如果你不想为所有人记录指标存储 库调用,你可以设置管理.metrics.data.repository.autotime.enabled自false并且仅用于@Timed而是注释。
一个@Timed注释longTask = 真该方法使得长时间的任务计时器得以实现。
长任务计时器需要单独的度量名称,并且可以与短任务计时器叠加使用。 |
默认情况下,与仓库调用相关的指标会被标记为以下信息:
| 标记 | 描述 |
|---|---|
|
源的简单类名 |
|
名称 |
|
结果状态( |
|
任何从调用中抛出的例外的简单类名称。 |
要替换默认标签,请提供@Bean实现RepositoryTagsProvider.
7.3.19. 春季集成指标
Spring集成自动提供微米支持,只要MeterRegistry豆子是有供应的。
指标发布于以下spring.integration。仪表名称。
2020年3月7日。卡夫卡度量
自动配置寄存器MicrometerConsumerListener和MicrometerProducerListener分别用于自动配置的消费工厂和生产者工厂。
它还会识别KafkaStreamsMicrometerListener为StreamsBuilderFactoryBean.
更多细节请参见Spring Kafka文档中的Micrometer Native Metric部分。
7.3.21. MongoDB 指标
本节简要介绍MongoDB可用的指标。
MongoDB 命令度量
自动配置寄存器MongoMetricsCommandListener带有自动配置的Mongo客户端.
一个名为mongodb.driver.commands为每个命令下达底层 MongoDB 驱动创建。
每个指标默认标注以下信息:
| 标记 | 描述 |
|---|---|
|
命令名称。 |
|
命令发送到的集群标识符。 |
|
命令发送到服务器的地址。 |
|
命令的结果( |
要替换默认的度量标签,定义一个MongoCommandTagsProvider(蒙戈指令标签提供者)Bean,正如以下例子所示:
@Configuration(proxyBeanMethods = false)
public class MyCommandTagsProviderConfiguration {
@Bean
public MongoCommandTagsProvider customCommandTagsProvider() {
return new CustomCommandTagsProvider();
}
}
@Configuration(proxyBeanMethods = false)
class MyCommandTagsProviderConfiguration {
@Bean
fun customCommandTagsProvider(): MongoCommandTagsProvider? {
return CustomCommandTagsProvider()
}
}
要禁用自动配置的命令指标,请设置以下属性:
management.metrics.mongo.command.enabled=false
management:
metrics:
mongo:
command:
enabled: false
MongoDB 连接池指标
自动配置寄存器MongoMetricsConnectionPoolListener带有自动配置的Mongo客户端.
为连接池创建了以下规范指标:
-
mongodb.driver.pool.size报告当前连接池规模,包括闲置和正在使用的成员。 -
mongodb.driver.pool.已退查报告当前正在使用的连接数量。 -
mongodb.driver.pool.waitqueuesize报告当前连接池等待队列的大小。
每个指标默认标注以下信息:
| 标记 | 描述 |
|---|---|
|
连接池对应的集群标识符。 |
|
连接池对应的服务器地址。 |
要替换默认的度量标签,定义一个MongoConnectionPoolTagsProvider豆:
@Configuration(proxyBeanMethods = false)
public class MyConnectionPoolTagsProviderConfiguration {
@Bean
public MongoConnectionPoolTagsProvider customConnectionPoolTagsProvider() {
return new CustomConnectionPoolTagsProvider();
}
}
@Configuration(proxyBeanMethods = false)
class MyConnectionPoolTagsProviderConfiguration {
@Bean
fun customConnectionPoolTagsProvider(): MongoConnectionPoolTagsProvider {
return CustomConnectionPoolTagsProvider()
}
}
要禁用自动配置的连接池指标,请设置以下属性:
management.metrics.mongo.connectionpool.enabled=false
management:
metrics:
mongo:
connectionpool:
enabled: false
7.3.22. Jetty指标
自动配置绑定了 Jetty 的度量线程池通过使用微米JettyServerThreadPoolMetrics.
Jetty的指标连接器实例通过使用微米Jetty连接指标以及server.ssl.enabled设置为true,微米的JettySslHandshakeMetrics.
7.3.23. @Timed注释支持
以实现扫描@Timed注释,你需要设置管理。观察。注释.启用属性到true.
请参阅Micrometer文档。
7.3.24. Redis 指标
自动配置寄存器MicrometerCommandLatencyRecorder对于自动配置生菜连接工厂.
更多细节请参见生菜文档中的“微米级”部分。
7.4. 注册自定义指标
要注册自定义指标,注入MeterRegistry进入你的组件:
@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());
}
}
@Component
class MyBean(registry: MeterRegistry) {
private val dictionary: Dictionary
init {
dictionary = Dictionary.load()
registry.gauge("dictionary.size", Tags.empty(), dictionary.words.size)
}
}
如果你的指标依赖其他豆子,我们建议你使用MeterBinder注册方式:
public class MyMeterBinderConfiguration {
@Bean
public MeterBinder queueSize(Queue queue) {
return (registry) -> Gauge.builder("queueSize", queue::size).register(registry);
}
}
class MyMeterBinderConfiguration {
@Bean
fun queueSize(queue: Queue): MeterBinder {
return MeterBinder { registry ->
Gauge.builder("queueSize", queue::size).register(registry)
}
}
}
使用MeterBinder确保建立正确的依赖关系,并且在检索度量值时豆子仍然可用。
一个MeterBinder如果你发现自己会反复在组件或应用之间进行一套指标的测量,实施也会非常有用。
默认情况下,所有指标MeterBinder豆子会自动绑定到Spring管理的MeterRegistry. |
7.5. 个性化指标
如果你需要对特定用户应用自定义米实例中,你可以使用io.micrometer.core.instrument.config.MeterFilter接口。
例如,如果你想重命名mytag.region标签到mytag.area对于所有以com.example,你可以这样做:
@Configuration(proxyBeanMethods = false)
public class MyMetricsFilterConfiguration {
@Bean
public MeterFilter renameRegionTagMeterFilter() {
return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area");
}
}
@Configuration(proxyBeanMethods = false)
class MyMetricsFilterConfiguration {
@Bean
fun renameRegionTagMeterFilter(): MeterFilter {
return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area")
}
}
默认情况下,全部计量Filter豆子会自动绑定到Spring管理的MeterRegistry.
务必通过使用Spring管理的系统注册你的指标MeterRegistry而不是 上的任何静态方法指标.
这些都使用了非Spring管理的全局注册表。 |
7.5.1. 通用标签
常见标签通常用于对作环境进行维度下降,如主机、实例、区域、堆栈等。 Commons 标签适用于所有电表,并可配置,如下示例所示:
management.metrics.tags.region=us-east-1
management.metrics.tags.stack=prod
management:
metrics:
tags:
region: "us-east-1"
stack: "prod"
前述例子补充地区和叠所有计量表的标签,值为美国东1号和刺分别。
如果你用Graphite,常见标签的顺序很重要。
由于使用这种方法无法保证常见标签的顺序,建议Graphite用户定义自定义标签计量Filter相反。 |
7.5.2. 每米属性
此外计量Filter豆子,你可以根据属性在每米范围内有限度地自定义。
按米数进行自定义,使用Spring靴PropertiesMeterFilter,变为任何以名字开头的电表编号。
以下示例过滤掉所有编号为example.remote.
management.metrics.enable.example.remote=false
management:
metrics:
enable:
example:
remote: false
以下特性允许按米进行定制:
| 属性 | 描述 |
|---|---|
|
是否接受带有特定身份标识的电表。
不被接受的电表会被过滤到 |
|
是否发布适合计算可聚合(跨维)百分位近似的直方图。 |
|
通过限制期望值范围,减少发布直方图桶。 |
|
发布申请中计算的百分位数值 |
|
通过将近期样本积累在环形缓冲区中,这些缓冲区在可配置的到期后旋转,赋予其更大权重,且 可配置缓冲区长度。 |
|
发布一个累计直方图,桶由你的服务水平目标定义。 |
关于背后概念的更多细节百分位-直方图,百分位数和慢速,请参见Micrometer文档中的“直方图和百分位”部分。
7.6. 指标终点
Spring靴提供了指标端点,你可以用它来诊断性地检查应用程序收集的指标。
该端点默认不可用,必须被暴露。
详情请参见“暴露端点”。
导航至/执行器/度量显示可用电表名称列表。
您可以通过选择器提供该仪表的名称,向下查看其信息——例如,/执行器/度量/jvm.memory.max.
|
你在这里使用的名称应与代码中使用的名字一致,而不是在被规范命名规范后,针对该监控系统而定。
换句话说,如果 |
你也可以添加任意数量的标签=键:值查询URL末尾的参数以在度量上向下钻探——例如,/actuator/metrics/jvm.memory.max?tag=area:nonheap.
|
报告的测量数据是所有与仪表名称相符的电表统计数据和所有已贴标签的总和。
在上述例子中,返回的 |
8. 描摹
Spring Boot Actuator 为微米追踪(Micrometer Tracing)提供了依赖管理和自动配置,这是流行追踪器库的表象。
| 想了解更多关于微米追踪能力的信息,请参阅其参考文档。 |
8.2. 入门指南
我们需要一个示例应用,用来开始追踪。 就我们而言,“getting-started.html”部分介绍的简单“Hello World!”网页应用就足够了。 我们将使用 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);
}
}
在主页()方法,后面会很重要。 |
现在我们需要添加以下依赖关系:
-
org.springframework.boot:spring-boot-starter-actuator -
io.micrometer:micrometer-tracing-bridge-otel- 将Micrometer Observation API与OpenTelemetry连接起来。 -
io.opentelemetry:opentelemetry-exporter-zipkin- 报告有Zipkin的线索。
添加以下应用属性:
management.tracing.sampling.probability=1.0
management:
tracing:
sampling:
probability: 1.0
默认情况下,Spring Boot只采样10%的请求,以防止跟踪后端过载。 这个特性会把它切换到100%,这样每个请求都会发送到追踪后端。
为了收集和可视化这些痕迹,我们需要一个正在运行的痕迹后端。 我们这里用Zipkin作为追踪后台。 Zipkin 快速入门指南提供了如何在本地启动 Zipkin 的说明。
Zipkin运行后,你可以启动应用。
如果你打开网页浏览器本地主持人:8080你应该会看到以下输出:
Hello World!
在幕后,已经为 HTTP 请求创建了一个观测值,该请求再被桥接到 OpenTelemetry,OpenTelemetry 报告了一个新的 Zipkin 追踪线。
现在打开Zipkin的界面本地主持:9411并点击“运行查询”按钮列出所有收集的痕迹。
你应该看到一个痕迹。
点击“显示”按钮查看该追踪的详细信息。
8.3. 日志相关ID
相关ID为日志文件中的线路与跨度/痕迹提供了一种有用的连接方式。 如果你使用微尺追踪,Spring Boot 默认会在日志中包含相关ID。
默认的相关ID 由traceId和西班牙语 民主化原则价值观。
例如,如果Micrometer Tracering添加了MDCtraceId之803B448A0489F84084905D3093480352以及一个多元发展委员会(MDC)西班牙语之3425F23BB2432450日志输出将包含相关ID[803B448A0489F84084905D3093480352-3425F23BB2432450].
如果你更喜欢用不同的格式来做相关ID,可以用logging.pattern.correlation用来定义一。
例如,以下表格将为 Spring Cloud Sleuth 之前使用的 Logback 格式提供关联 ID:
logging.pattern.correlation=[${spring.application.name:},%X{traceId:-},%X{spanId:-}]
logging.include-application-name=false
logging:
pattern:
correlation: "[${spring.application.name:},%X{traceId:-},%X{spanId:-}] "
include-application-name: false
在上述示例中,logging.include-application-name设置为false为了避免应用程序名称在日志消息中重复(logging.pattern.correlation已经包含了它)。
还值得一提的是logging.pattern.correlation包含一个尾部空格,因此默认与紧随其后的日志器名称分开。 |
8.4. 传播痕迹
要自动传播线路,请使用自动配置Rest模板构建器,RestClient.Builder或WebClient.Builder构建客户端。
如果你创建了Rest模板这Rest客户端或者Web客户端如果不使用自动配置的构建器,自动追踪传播是无法实现的! |
8.5. 追踪器实现
由于Micrometer Tracer支持多种tracer实现,Spring Boot可以实现多种依赖组合。
所有追踪器实现都需要org.springframework.boot:spring-boot-starter-actuatorDependency。
8.5.1. OpenTelemetry with Zipkin
使用 OpenTelemetry 进行追踪并向 Zipkin 报告需要以下依赖关系:
-
io.micrometer:micrometer-tracing-bridge-otel- 将Micrometer Observation API与OpenTelemetry连接起来。 -
io.opentelemetry:opentelemetry-exporter-zipkin- 报告有Zipkin的线索。
使用该管理.zipkin.追踪。*配置属性用于配置向 Zipkin 报告。
8.5.2. 带波前的开放遥测
使用 OpenTelemetry 进行追踪并向 Wavefront 报告需要以下依赖关系:
-
io.micrometer:micrometer-tracing-bridge-otel- 将Micrometer Observation API与OpenTelemetry连接起来。 -
io.micrometer:微米追踪报告波前- 向波前报告了线索。
使用该管理。波前。*配置属性用于配置向 Wavefront 报告。
8.5.3. 基于OTLP的OpenTelemetry
使用 OpenTelemetry 进行追踪并使用 OTLP 进行报告,需要满足以下依赖关系:
-
io.micrometer:micrometer-tracing-bridge-otel- 将Micrometer Observation API与OpenTelemetry连接起来。 -
io.opentelemetry:opentelemetry-exporter-otlp- 将追踪报告给能够接受OTLP的收集者。
使用该管理。OTLP.追踪。*配置属性用于使用 OTLP 配置报表。
8.5.4. OpenZipkin Brave with Zipkin
使用 OpenZipkin Brave 进行追踪并向 Zipkin 报告需要以下依赖关系:
-
io.micrometer:微米-追踪-桥-勇敢- 将Micrometer Observation API与Brave连接起来。 -
io.zipkin.reporter2:zipkin-reporter-brave- 报告有Zipkin的线索。
如果你的项目不使用 Spring MVC 或 Spring WebFlux,io.zipkin.reporter2:zipkin-sender-urlconnection依赖感也是必要的。 |
使用该管理.zipkin.追踪。*配置属性用于配置向 Zipkin 报告。
8.7. 创建自定义跨度
你可以通过开始观测来创建自己的跨度。
为此,注射观测登记册进入你的组件:
@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”的观察,标签为“some-tag=some-value”。
如果你想创建跨度但不创建度量,你需要使用下层示 踪应用程序接口来自Micrometer。 |
8.8. 行李
你可以用示 踪应用程序接口:
@Component
class CreatingBaggage {
private final Tracer tracer;
CreatingBaggage(Tracer tracer) {
this.tracer = tracer;
}
void doSomething() {
try (BaggageInScope scope = this.tracer.createBaggageInScope("baggage1", "value1")) {
// Business logic
}
}
}
这个例子会生成名为行李1其中值为值1.
如果你使用 W3C 传播,行李会自动通过网络传播。
如果你用的是B3传播,行李不会自动传播。
要手动在网络上传播行李,请使用管理。追踪。行李。远程字段配置属性(这对W3C同样适用)。
以上述例子为例,将该属性设为行李1结果生成HTTP头部行李1:价值1.
如果你想将包袱传播到多元中心,可以使用管理。追踪。行李。关联。字段配置属性。
以上述例子为例,将该属性设为行李1结果是一个MDC条目,名为行李1.
8.9. 测试
用于报告数据的追踪组件在使用时并非自动配置@SpringBootTest.
详情请参见测试部分。
9. 审计
一旦 Spring Security 启动,Spring Boot Actuator 拥有一个灵活的审计框架,发布事件(默认情况下,“认证成功”、“失败”和“访问拒绝”例外)。 该功能对于报告和基于认证失败实施锁定策略非常有用。
你可以通过提供一个类型的工具来实现审计审计事件仓库在你的应用配置中。
为了方便,Spring Boot 提供了InMemoryAuditEventRepository.InMemoryAuditEventRepository功能有限,我们建议仅在开发环境中使用。
对于生产环境,考虑自己开发替代方案审计事件仓库实现。
10. 记录HTTP交换
你可以通过提供 类型的 bean 来启用 HTTP 交换的记录HttpExchangeRepository在你的应用配置中。
为了方便,Spring Boot 提供了InMemoryHttpExchangeRepository默认情况下,该交换存储了最近100次请求-响应交换。InMemoryHttpExchangeRepository与追踪解决方案相比,它有限制,我们建议仅在开发环境中使用它。
对于生产环境,我们建议使用生产准备的追踪或可观测性解决方案,如Zipkin或OpenTelemetry。
或者,你也可以自己创建HttpExchangeRepository.
你可以使用http交换端点获取存储在HttpExchangeRepository.
11. 过程监控
在Spring靴模块中,你可以找到两个类来创建通常对进程监控有用的文件:
-
应用PidFileWriter创建一个包含应用程序PID的文件(默认情况下,在应用目录中,文件名为application.pid). -
WebServerPortFileWriter创建一个(或多个文件),包含运行中的网页服务器的端口(默认在应用程序目录中,文件名为application.port).
默认情况下,这些写手不会被激活,但你可以启用它们:
12. 云铸造厂支持
Spring Boot 的执行器模块包含额外支持,部署到兼容的 Cloud Foundry 实例时会激活。
这/cloudfoundryapplication路径为所有用户提供一条替代的安全路由@Endpoint豆。
扩展支持让Cloud Foundry的管理界面(比如你可以用来查看已部署应用的网页应用)能够加入Spring Boot执行器信息。 例如,应用状态页面可以包含完整的健康信息,而不是典型的“运行中”或“停止”状态。
这/cloudfoundryapplication普通用户无法直接访问路径。
要使用该端点,您必须在请求中传递有效的UAATokens。 |
12.1. 禁用扩展云铸造执行器支持功能
如果你想完全禁用/cloudfoundryapplication端点,你可以在你的application.properties文件:
management.cloudfoundry.enabled=false
management:
cloudfoundry:
enabled: false
12.2. Cloud Foundry 自签名证书
默认情况下,安全验证/cloudfoundryapplication端点对各种Cloud Foundry服务进行SSL调用。
如果您的Cloud Foundry的UAA或Cloud Controller服务使用自签名证书,您需要设置以下属性:
management.cloudfoundry.skip-ssl-validation=true
management:
cloudfoundry:
skip-ssl-validation: true
12.3. 自定义上下文路径
如果服务器的上下文路径配置为非 ,Cloud Foundry 的端点在应用根部无法使用。
例如,如果/server.servlet.context-path=/appCloud Foundry 端点可于/app/cloudfoundryapplication/*.
如果你期望Cloud Foundry的端点始终可用,那就在/cloudfoundryapplication/*无论服务器的上下文路径如何,你都需要在应用中显式配置它。
配置方式因所用的网络服务器而异。
对于Tomcat,你可以添加以下配置:
@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("/*");
};
}
}
@Configuration(proxyBeanMethods = false)
class MyCloudFoundryConfiguration {
@Bean
fun servletWebServerFactory(): TomcatServletWebServerFactory {
return object : TomcatServletWebServerFactory() {
override fun prepareContext(host: Host, initializers: Array<ServletContextInitializer>) {
super.prepareContext(host, initializers)
val child = StandardContext()
child.addLifecycleListener(FixContextListener())
child.path = "/cloudfoundryapplication"
val initializer = getServletContextInitializer(contextPath)
child.addServletContainerInitializer(initializer, emptySet())
child.crossContext = true
host.addChild(child)
}
}
}
private fun getServletContextInitializer(contextPath: String): ServletContainerInitializer {
return ServletContainerInitializer { classes: Set<Class<*>?>?, context: ServletContext ->
val servlet: Servlet = object : GenericServlet() {
@Throws(ServletException::class, IOException::class)
override fun service(req: ServletRequest, res: ServletResponse) {
val servletContext = req.servletContext.getContext(contextPath)
servletContext.getRequestDispatcher("/cloudfoundryapplication").forward(req, res)
}
}
context.addServlet("cloudfoundry", servlet).addMapping("/*")
}
}
}
如果你使用的是基于Webflux的应用程序,可以使用以下配置:
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(WebFluxProperties.class)
public class MyReactiveCloudFoundryConfiguration {
@Bean
public HttpHandler httpHandler(ApplicationContext applicationContext, WebFluxProperties properties) {
HttpHandler httpHandler = WebHttpHandlerBuilder.applicationContext(applicationContext).build();
return new CloudFoundryHttpHandler(properties.getBasePath(), httpHandler);
}
private static final class CloudFoundryHttpHandler implements HttpHandler {
private final HttpHandler delegate;
private final ContextPathCompositeHandler contextPathDelegate;
private CloudFoundryHttpHandler(String basePath, HttpHandler delegate) {
this.delegate = delegate;
this.contextPathDelegate = new ContextPathCompositeHandler(Map.of(basePath, delegate));
}
@Override
public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) {
// Remove underlying context path first (e.g. Servlet container)
String path = request.getPath().pathWithinApplication().value();
if (path.startsWith("/cloudfoundryapplication")) {
return this.delegate.handle(request, response);
}
else {
return this.contextPathDelegate.handle(request, response);
}
}
}
}
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(WebFluxProperties::class)
class MyReactiveCloudFoundryConfiguration {
@Bean
fun httpHandler(applicationContext: ApplicationContext, properties: WebFluxProperties): HttpHandler {
val httpHandler = WebHttpHandlerBuilder.applicationContext(applicationContext).build()
return CloudFoundryHttpHandler(properties.basePath, httpHandler)
}
private class CloudFoundryHttpHandler(basePath: String, private val delegate: HttpHandler) : HttpHandler {
private val contextPathDelegate = ContextPathCompositeHandler(mapOf(basePath to delegate))
override fun handle(request: ServerHttpRequest, response: ServerHttpResponse): Mono<Void> {
// Remove underlying context path first (e.g. Servlet container)
val path = request.path.pathWithinApplication().value()
return if (path.startsWith("/cloudfoundryapplication")) {
delegate.handle(request, response)
} else {
contextPathDelegate.handle(request, response)
}
}
}
}