Есть ли у 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");
    }

}
Другие вопросы по тегам