Есть ли у Spring Boot Actuator API Java?
Мы настраиваем конечную точку информации Spring Boot Actuator для включения номера версии приложения, сгенерированного во время нашей сборки Jenkins. Мы используем gradle для этого:
if (project.hasProperty('BUILD_NUMBER')) {
version = "${BUILD_NUMBER}"
} else {
version = "0.0.1-SNAPSHOT"
}
Это прекрасно подходит для добавления версии в конечную точку / info, но я хотел бы получить к ней доступ при запуске приложения и распечатать ее в журнале приложения.
Я надеюсь, что значения выставляются в некотором значении свойства (аналогично spring.profiles.active
) или через API Java. Таким образом, я мог бы сделать что-то вроде этого:
public class MyApplication{
public static void main(String[] args) throws Exception {
SpringApplication.run(MyApplication.class, args);
ConfigurableEnvironment environment = applicationContext.getEnvironment();
System.out.println(environment.getProperty("spring.fancy.path.to.info.version"));
}
}
Просматривая документы, я не нахожу способ легко получить доступ к этим значениям в коде. Кому-нибудь еще повезло с этим?
1 ответ
Чтобы получить точно такие же свойства конечной точки привода, которые доступны через конечные точки REST, вы можете внедрить в один из ваших классов экземпляр соответствующего класса конечной точки. В вашем случае "правильным" классом конечной точки будет InfoEndpoint. Существуют аналогичные классы конечных точек для показателей, состояния и т. Д.
Интерфейс немного изменился между Spring Boot 1.5.x и Spring Boot 2.x. Таким образом, точное полное имя класса или имя метода чтения могут различаться в зависимости от используемой версии Spring Boot. В Boot 1.5.x вы можете найти большинство конечных точек в org.springframework.boot.actuate.endpoint
пакет.
Грубо говоря, именно так вы могли бы создать простой компонент для чтения вашего свойства версии (при условии, что имя свойства внутри конечной точки информации просто build.version
):
@Component
public class VersionAccessor {
private final InfoEndpoint endpoint;
@Autowired
public VersionAccessor(InfoEndpoint endpoint) {
this.endpoint = endpoint;
}
public String getVersion() {
// Spring Boot 2.x
return String.valueOf(getValueFromMap(endpoint.info()));
// Spring Boot 1.x
return String.valueOf(getValueFromMap(endpoint.invoke()));
}
// the info returned from the endpoint may contain nested maps
// the exact steps for retrieving the right value depends on
// the exact property name(s). Here, we assume that we are
// interested in the build.version property
private Object getValueFromMap(Map<String, Object> info) {
return ((Map<String, Object>) info.get("build")).get("version");
}
}