Spring Boot Actuator} fournit plusieurs points de terminaison à moniteur un application comme:
/metrics
/beans
/health
...
Vérification des terminaux avec:
curl http://localhost:8080/metrics
résulte 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}
C'est très bien pour la consommation de machine mais difficile à lire par humain.
Je voudrais formater (c'est-à-dire une jolie impression) le JSON sortie des noeuds finaux Spring Boot Actuator _ _ afin de faciliter leur lecture par les opérations.
Quelque chose comme:
{
"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,
...
}
J'ai essayé de mettre
http.mappers.json-pretty-print=true
mais ce paramètre n'a pas affecté la sortie de l'actionneur.
Existe-t-il une configuration à activer la jolie impression de la sortie JSON de Spring Boot Actuator?
METTRE À JOUR:
Le échantillon officiel fonctionne pour moi.
Il est important de suivre les commentaires de @DaveSyer: la propriété à définir est
http.mappers.jsonPrettyPrint=true
L'enquête est toujours en cours.
En attendant, j’utilise la jolie impression json ligne de commande comme solution de contournement:
Installez jsonpp (pour OS X, par exemple):
brew install jsonpp
Puis dirigez la sortie curl vers jsonpp qui formate le fichier json à la volée:
curl http://localhost:8080/metrics | jsonpp
Résulte en:
{
"counter.status.200.env": 1,
"counter.status.200.health": 1,
"counter.status.200.info": 2,
"counter.status.200.metrics": 2,
...
}
Selon http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper , le moyen officiel de Activer jolie impression avec Jackson dans Spring Boot (1.2.2 au moins) consiste à définir la propriété suivante:
# Pretty-print JSON responses
spring.jackson.serialization.indent_output=true
Pour Spring Boot 1.5.1, j'ai dans mon fichier YML:
spring:
jackson:
serialization:
INDENT_OUTPUT: true
La réponse de @BertrandRenuart était la plus proche, mais d'après IDE, indent_output n'était pas correct.
La propriété "http.mappers" fonctionne pour moi, mais je pense que vous pourriez avoir besoin de cette option chamel ("jsonPrettyPrint").
Faites ce qui suit:
@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
}
}
Cela fonctionne car Spring Boot utilise un bean ObjectMapper
pour effectuer toutes les opérations liées à JSON.
Notez cependant que cette configuration imprimera plutôt toutes les sorties JSON, pas seulement les éléments liés à l'actionneur.
METTRE À JOUR
La réponse de @DaveSyer est évidemment meilleure! Je n'avais pas trouvé l'objet HttpMapperProperties
utilisé pour configurer Jackson. Ceci est-ce que c'est Javadoc
J'utilise le module json.tool
couramment installé de Python:
curl --silent http://localhost:8080/metrics | python -mjson.tool
En fait, je voulais faire la même chose. Mais ensuite j'ai demandé: pourquoi? Pour mieux déboguer mon service ce qui vient avec une petite pénalité de performance.
Utilisez simplement une extension de navigateur, comme celle-ci :) pour obtenir une vue comme celle-ci.
Avec spring-boot 1.2.6, vous devez utiliser:
spring.jackson.serialization.INDENT_OUTPUT=true
À partir de mon journal lorsque j'utilise les anciens http.mappers. *:
http.mappers.json-pretty-print is deprecated. If you are using Jackson, spring.jackson.serialization.INDENT_OUTPUT=true should be used instead.
Au lieu d'utiliser curl
, j'aime utiliser httpie
en tant que client en ligne de commande http:
http http://localhost:8080/metrics
Cela mettrait déjà en forme et en syntaxe la réponse JSON en surbrillance sans avoir à canaliser la sortie dans une autre commande. En outre, la syntaxe de commande est un peu plus conviviale.
Si vous utilisez gson serialization avec Spring, aucune autre réponse ne fonctionnera pour vous. Vous devrez utiliser cette option de configuration:
spring.gson.pretty-printing=true
Confirmé de travailler avec Spring Boot à partir de la version 2.0.3.Release
.
J'utilise jq
pour l'impression JSON ainsi que pour le filtrer. C'est fondamentalement sed
pour JSON. Sur le mac, il peut être installé avec homebrew. ( https://stedolan.github.io/jq/ )
curl http://localhost:8080/metrics | jq
Au cas où quelqu'un avec Spring Boot 2 (2.1.1 dans mon cas) trébucherait sur cette question, comme je l'ai fait: nous avons rencontré le même problème et aucune des réponses n'a permis de résoudre le problème pour 2.1.1.
Nous avons donc remplacé le point final existant (health
dans notre cas) par un nouveau. Je l'ai décrit à la fin de cette réponse . Et oui, cela limite notre solution à ce seul point de terminaison, mais offre en revanche l’avantage de pouvoir formater la sortie comme vous le souhaitez - y compris le joli JSON imprimé, mais aussi le code HTML de sortie si technicien dans un navigateur dans notre cas). Notez l'attribut produces
de @ReadOperation
pour y parvenir.
Malheureusement, la propriété de l'application
spring.jackson.serialization.INDENT_OUTPUT
n'a pas fonctionné pour moi (versions de démarrage de printemps 1.2.6 à 1.4.0.RELEASE). Au lieu de cela, dans mon extension de WebMvcConfigurerAdapter , j'ai remplacé configureMessageConverters () et ajouté mon propre 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);
}
...
}
Cela semble faire l'affaire pour moi sur Spring Boot 1.4.0.RELEASE et la sortie de mon actionneur est maintenant bien imprimée (avec toutes les autres sorties Json)
Voici ma fonction Emacs permettant de récupérer Spring Actuator Json à partir de points de terminaison:
(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 vous n'aimez pas la dépendance à la bibliothèque externe json-mode
, remplacez-la par js-mode
.