spring-boot - actuator - spring boot admin
¿Cómo agrego cosas al punto final/info en el arranque de primavera programáticamente? (4)
Debería ser posible agregar un PropertySource personalizado dentro de un ApplicationListener para agregar propiedades personalizadas de información * al entorno (consulte esta respuesta para ver un ejemplo: Cómo anular la aplicación de inicio de Spring.properties programáticamente )
¿Cómo agrego cosas al punto final /info
en Spring Boot programáticamente? La documentation indica que esto es posible para el punto final /health
mediante el uso de la interfaz HealthIndicator
. ¿Hay algo para el punto final /info
también?
Me gustaría agregar el nombre y la versión del sistema operativo y otra información de tiempo de ejecución allí.
En Spring Boot 1.4, puedes declarar los beans de InfoContributer
para que esto sea mucho más fácil:
@Component
public class ExampleInfoContributor implements InfoContributor {
@Override
public void contribute(Info.Builder builder) {
builder.withDetail("example",
Collections.singletonMap("key", "value"));
}
}
Consulte http://docs.spring.io/spring-boot/docs/1.4.0.RELEASE/reference/htmlsingle/#production-ready-application-info-custom para obtener más información.
La respuesta aceptada en realidad afecta al InfoEndpoint y no se agrega a ella.
Una forma que encontré para agregar a la información es, en una clase @Configuration
, agregar un método @Autowired
que agregue propiedades adicionales siguiendo las convenciones de info.*
entorno. Luego InfoEndpoint
los recogerá cuando se invoque.
Puedes hacer algo como lo siguiente:
@Autowired
public void setInfoProperties(ConfigurableEnvironment env) {
/* These properties will show up in the Spring Boot Actuator /info endpoint */
Properties props = new Properties();
props.put("info.timeZone", ZoneId.systemDefault().toString());
env.getPropertySources().addFirst(new PropertiesPropertySource("extra-info-props", props));
}
Una forma de hacer lo que quiere (en el caso de que tenga propiedades totalmente personalizadas que deba mostrar) es declarar un bean de tipo InfoEndpoint que anulará el valor predeterminado.
@Bean
public InfoEndpoint infoEndpoint() {
final LinkedHashMap<String, Object> map = new LinkedHashMap<String, Object>();
map.put("test", "value"); //put whatever other values you need here
return new InfoEndpoint(map);
}
Como puede ver en el código anterior, el mapa puede contener cualquier información que necesite.
En el caso de que los datos que desea mostrar puedan ser recuperados por el entorno y no sean personalizados, no necesita reemplazar el bean InfoEndpoint
, sino que simplemente puede agregar propiedades al archivo de propiedades con un prefijo de info
. Un ejemplo donde se evalúa el nombre del sistema operativo es el siguiente:
info.os = ${os.name}
En el código anterior, Spring Boot evaluará la expresión de la mano derecha antes de devolver la propiedad en el punto final /info
.
Una nota final es que hay una tonelada de información de entorno que ya está disponible en el punto final /env
Actualizar
Como lo señaló @shabinjo, en las versiones más recientes de Spring Boot no hay InfoEndpoint
constructor de InfoEndpoint
que acepte un mapa. Sin embargo, puede utilizar el siguiente fragmento de código:
@Bean
public InfoEndpoint infoEndpoint() {
final Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("test", "value"); //put whatever other values you need here
return new InfoEndpoint(new MapInfoContributor(map));
}
El código anterior anulará completamente la información predeterminada que terminaría en /info
. Para superar este problema se podría agregar el siguiente bean
@Bean
public MapInfoContributor mapInfoContributor() {
return new MapInfoContributor(new HashMap<String, Object>() {{
put("test", "value");
}});
}