json - enable - spring boot actuator properties
Salida JSON de impresiĆ³n bonita de los puntos finales de Spring Boot Actuator (13)
Aquí está mi función de Emacs para recuperar Spring Actuator Json desde los puntos finales:
(defvar my/spring-actuator-server-history nil)
(defvar my/spring-actuator-last-server "http://localhost:8080")
(defvar my/spring-actuator-path-history nil)
(defvar my/spring-actuator-path-completion
''("actuator" "auditevents" "autoconfig" "beans" "configprops" "dump" "env" "flyway" "health" "heapdump"
"info" "jolokia" "liquibase" "logfile" "loggers" "mappings" "metrics" "shutdown" "trace")))
(defun my/spring-actuator (server path)
(interactive (list (read-string "Server: " my/spring-actuator-last-server ''my/spring-actuator-server-history)
(completing-read "Path: " my/spring-actuator-path-completion nil nil "" ''my/spring-actuator-path-history)))
(setq my/spring-actuator-last-server server)
(let ( (bufname (format "actuator: %s" path)) )
(when (get-buffer bufname)
(kill-buffer bufname))
(switch-to-buffer (url-retrieve-synchronously (format "%s/%s" server path)))
(rename-buffer bufname)
(goto-char (point-min))
(re-search-forward "^$" nil ''move)
(forward-char)
(delete-region (point-min) (point))
(json-pretty-print-buffer)
(json-mode) ))
Si no le gusta la dependencia de la biblioteca externa json-mode
reemplácela con js-mode
.
Spring Boot Actuator proporciona varios puntos finales para monitorear una aplicación como:
/metrics
/beans
/health
...
Comprobando los puntos finales con:
curl http://localhost:8080/metrics
resultados en:
{"counter.status.200.env":1,"counter.status.200.health":1,"counter.status.200.info":2,"counter.status.200.metrics":2,"gauge.response.env":5.0,"gauge.response.health":22.0,"gauge.response.info":1.0,"gauge.response.metrics":1.0,"mem":1030144,"mem.free":56118,"processors":8,"uptime":5108095,"instance.uptime":5102906,"heap.committed":1030144,"heap.init":262144,"heap.used":974031,"heap":3728384,"threads.peak":81,"threads.daemon":21,"threads":77,"classes":8854,"classes.loaded":8860,"classes.unloaded":6,"gc.ps_scavenge.count":119,"gc.ps_scavenge.time":7223,"gc.ps_marksweep.count":12,"gc.ps_marksweep.time":17573}
Esto está bien para el consumo de la máquina pero es difícil de leer para los humanos .
Me gustaría formatear (es decir, en letra pequeña) la salida JSON de los puntos finales de Spring Boot Actuator para que sea más fácil de leer por el personal de operaciones.
Algo como:
{
"counter.status.200.env":1,
"counter.status.200.health":1,
"counter.status.200.info":2,
"counter.status.200.metrics":2,
"gauge.response.env":5.0,
"gauge.response.health":22.0,
"gauge.response.info":1.0,
...
}
Intenté establecer
http.mappers.json-pretty-print=true
pero esta configuración no afectó la salida del Actuador.
¿Hay una configuración para habilitar una impresión bonita de la salida JSON del actuador de arranque Spring ?
ACTUALIZAR:
La muestra oficial me funciona.
Es importante seguir los comentarios de @DaveSyer: la propiedad que se establece es
http.mappers.jsonPrettyPrint=true
La investigación aún está en curso.
Mientras tanto, uso la línea de comandos json pretty print como solución alternativa :
Instale jsonpp (por ejemplo para OS X):
brew install jsonpp
Luego canalice la salida de enrollamiento a través de jsonpp que formatea el archivo json sobre la marcha:
curl http://localhost:8080/metrics | jsonpp
Resultados en:
{
"counter.status.200.env": 1,
"counter.status.200.health": 1,
"counter.status.200.info": 2,
"counter.status.200.metrics": 2,
...
}
Con spring-boot 1.2.6, necesitas usar:
spring.jackson.serialization.INDENT_OUTPUT=true
De mi registro cuando uso los antiguos http.mappers. *:
http.mappers.json-pretty-print is deprecated. If you are using Jackson, spring.jackson.serialization.INDENT_OUTPUT=true should be used instead.
Desafortunadamente, la propiedad de la aplicación
spring.jackson.serialization.INDENT_OUTPUT
No me funcionó (versiones de arranque de primavera 1.2.6 a 1.4.0.RELEASE). En lugar de eso, en mi extensión de WebMvcConfigurerAdapter , he invalidado configureMessageConverters () y he agregado mi propio Jackson2ObjectMapperBuilder:
@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {
...
private MappingJackson2HttpMessageConverter jacksonMessageConverter() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
.featuresToDisable(SerializationFeature.FAIL_ON_EMPTY_BEANS,
SerializationFeature.WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS)
.featuresToEnable(SerializationFeature.INDENT_OUTPUT).modulesToInstall(hibernate4Module());
// can use this instead of featuresToEnable(...)
builder.indentOutput(true);
return new MappingJackson2HttpMessageConverter(builder.build());
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(jacksonMessageConverter());
super.configureMessageConverters(converters);
}
...
}
Eso parece ser el truco para mí en Spring boot 1.4.0.RELEASE y la salida de mi actuador ahora está bastante impresa (junto con todas las demás salidas json)
En lugar de usar curl
me gusta usar httpie
como un cliente de línea de comandos http:
http http://localhost:8080/metrics
Esto ya daría formato y la sintaxis destacaría la respuesta json sin tener que canalizar la salida en otro comando. También la sintaxis del comando es un poco más amigable para los humanos.
En realidad yo quería hacer lo mismo. Pero luego pregunté: ¿por qué? Para depurar mejor mi servicio que viene con una pequeña penalización de rendimiento.
Solo usa una extensión del navegador, como esta :) para obtener una vista como esta
Haz lo siguiente:
@Configuration
public class JacksonConfig {
@Autowired
private ObjectMapper objectMapper; //reuse the pre-configured mapper
@PostConstruct
public void setup() {
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
//whatever else you need
}
}
Esto funciona porque Spring Boot usa un bean ObjectMapper
para realizar todas las operaciones relacionadas con JSON.
Sin embargo, tenga en cuenta que esta configuración imprimirá bastante todas las salidas JSON, no solo las cosas relacionadas con el actuador.
ACTUALIZAR
¡La respuesta de @DaveSyer es obviamente mejor! No había encontrado el objeto HttpMapperProperties
que se usa para configurar Jackson. This es Javadoc.
La propiedad "http.mappers" funciona para mí, pero creo que podría necesitarla en camello ("jsonPrettyPrint").
Para Spring Boot 1.5.1 tengo en mi archivo YML:
spring:
jackson:
serialization:
INDENT_OUTPUT: true
La respuesta de @BertrandRenuart fue la más cercana, pero según IDE no vio a indent_output como correcta.
Según http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper , la forma oficial de habilitar una impresión bonita con Jackson en Spring Boot (1.2.2 como mínimo) es configurar la siguiente propiedad:
# Pretty-print JSON responses
spring.jackson.serialization.indent_output=true
Si está utilizando la serialización GSON con Spring, ninguna de las otras respuestas funcionará para usted. Tendrás que usar esta opción de configuración:
spring.gson.pretty-printing=true
Confirmado trabajando con Spring Boot a partir de la versión 2.0.3.Release
. 2.0.3.Release
.
Uso el módulo json.tool
comúnmente instalado de json.tool
:
curl --silent http://localhost:8080/metrics | python -mjson.tool
Yo uso jq
para imprimir JSON y para filtrarlo. Es básicamente sed
para JSON. En el mac, se puede instalar con homebrew. ( https://stedolan.github.io/jq/ )
curl http://localhost:8080/metrics | jq
esto no funciona
spring.jackson.serialization.INDENT_OUTPUT=true
esto funciona spring.jackson.serialization.indent-output=true