15.3.1 向 /info 端点提供信息
正如您在第 15.2.1 节中所看到的,/info
端点开始时是空的,没有信息。但是,您可以通过创建以 info.
为前缀的属性,轻松地向里边添加数据。
为属性添加 info.
前缀,可以方便的将自定义数据添加到 /info
端点,但这并不是唯一的方法。Spring Boot 提供了一个名为 InfoContributor 的接口,允许您以代码方式,将任何信息添加到 /info
端点的响应数据中。Spring Boot 甚至已经提供了一些实现类,您会发现它们非常有用。
让我们看看如何编写自己的 InfoContributor,并向 /info
端点添加一些自定义信息。
创建自定义 Info Contributor 实现类
假设您想在 /info
端点中,添加一些有于 Taco Cloud 的简单统计信息。例如,有多少玉米卷已经制作出来了。为此,您可以编写一个实现 InfoContributor 接口的实现类,并注入 TacoRepository。然后就可以把 TacoRepository 能够提供的统计数据,提供给 /info
端点使用。以下的程序清单展示了如何实现这样的类。
程序清单 15.3 InfoContributor 的自定义实现类
package tacos.tacos;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import org.springframework.boot.actuate.info.Info.Builder;
@Component
public class TacoCountInfoContributor implements InfoContributor {
private TacoRepository tacoRepo;
public TacoCountInfoContributor(TacoRepository tacoRepo) {
this.tacoRepo = tacoRepo;
}
@Override
public void contribute(Builder builder) {
long tacoCount = tacoRepo.count();
Map<String, Object> tacoMap = new HashMap<String, Object>();
tacoMap.put("count", tacoCount);
builder.withDetail("taco-stats", tacoMap);
}
}
实现 InfoContributor 接口时,TacoCountInfoContributor 需要实现 contribute()
方法。此方法传入了一个 builder 对象,在该对象上调用 withDetail()
以添加详细信息。在上述实现中,通过调用 TacoRepository 的 count()
方法,查找已经制作了多少玉米卷。然后把这个数字放到一个 Map 对象中,最后将标签 taco-stats
提供给 Builder 对象。/info
端点的结果将包括该计数,如下所示:
{
"taco-stats": {
"count": 44
}
}
如您所见,InfoContributor 的实现类可以提供动态统计信息。这与简单地为属性加 info.
前缀形成对比,虽然简单,但仅限于静态值。
将构建信息注入 /INFO 端点
Spring Boot 附带了几个 InfoContributor 的内置实现,可以自动将信息添加到 /info
端点的结果数据中。其中包括 BuildInfoContributor,它将项目构建信息添加到 /info
端点。这包括项目版本、时间戳等基本信息,以及执行构建的主机和用户。
要使生成信息包含在 /info
端点的结果数据中,需要添加 build-info 到 Spring Boot Maven 插件执行目标中,如下所示:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
如果使用 Gradle 构建项目,只需将以下行添加到您的 build.gradle 文件:
springBoot {
buildInfo()
}
在这两种情况下,构建都将在 JAR 或 WAR 文件中生成名为 build-info.properties 的文件,BuildInfoContributor 会把这些信息附加到 /info
端点返回数据中。以下代码片段显示了 /info
端点中的构建信息:
{
"build": {
"artifact": "tacocloud",
"name": "taco-cloud",
"time": "2021-08-08T23:55:16.379Z",
"version": "0.0.15-SNAPSHOT",
"group": "sia"
},
}
此信息有助于准确了解,正在运行的应用程序的版本、构建时间。通过对 /info
端点执行 GET 请求,您将知道您是否正在运行项目的最新版本。
公开 GIT 提交信息
假设您的项目使用 Git 进行源代码版本控制,您可能希望在 /info
端点中包括 Git 提交信息。要做到这一点,您需要在 Maven 项目 pom.xml 中添加以下插件:
<build>
<plugins>
...
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
</plugin>
</plugins>
</build>
如果您是 Gradle 用户,别担心,可以在 build.gradle 文件中添加一个同样功能的插件:
plugins {
id "com.gorylenko.gradle-git-properties" version "2.2.4"
}
基本上这两个插件做的是相同的事情:它们生成一个构建产物 git.properties,包含项目的所有 git 元数据。专门的 InfoContributor 实现类在运行时扫描该文件,并将其内容作为 /info
端点返回数据的一部分。
最简单的形式,/info
端点中显示的 Git 信息包括,构建应用程序所依据的 Git 分支、提交哈希和时间戳:
{
"git": {
"branch": "main",
"commit": {
"id": "df45505",
"time": "2021-08-08T21:51:12Z"
}
},
...
}
此信息非常明确的描述项目启动时的代码状态。还可以将 management.info.git.mode 属性设置为 full,您就可以获得项目构建时有关 Git 提交的详细信息。
management:
info:
git:
mode: full
下面的清单显示了完整 Git 的示例信息。
清单 15.4 通过 /info 端点公开的完整 Git 提交信息
"git":{
"local":{
"branch":{
"ahead":"8",
"behind":"0"
}
},
"commit":{
"id":{
"describe-short":"df45505-dirty",
"abbrev":"df45505",
"full":"df455055daaf3b1347b0ad1d9dca4ebbc6067810",
"describe":"df45505-dirty"
},
"message":{
"short":"Apply chapter 18 edits",
"full":"Apply chapter 18 edits"
},
"user":{
"name":"Craig Walls",
"email":"craig@habuma.com"
},
"author":{
"time":"2021-08-08T15:51:12-0600"
},
"committer":{
"time":"2021-08-08T15:51:12-0600"
},
"time":"2021-08-08T21:51:12Z"
},
"branch":"master",
"build":{
"time":"2021-08-09T00:13:37Z",
"version":"0.0.15-SNAPSHOT",
"host":"Craigs-MacBook-Pro.local",
"user":{
"name":"Craig Walls",
"email":"craig@habuma.com"
}
},
"tags":"",
"total":{
"commit":{
"count":"196"
}
},
"closest":{
"tag":{
"commit":{
"count":""
},
"name":""
}
},
"remote":{
"origin":{
"url":"git@github.com:habuma/spring-in-action-6-samples.git"
}
},
"dirty":"true"
},
除了时间戳和 Git 提交哈希之外,完整版本还包括,提交代码的用户姓名和电子邮件,以及提交消息和其他信息。允许您精确地识别构建项目时使用的代码。事实上,请注意清单 15.4 中的 dirty 字段为 true,指出构建目录中有一些未提交的更改,这样的代码状态,真是没有什么情况比这更槽糕了!