web-dev-qa-db-fra.com

Jolie sortie JSON des points de terminaison Spring Boot Actuator

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,
  ...
}
23

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
46
Bertrand Renuart

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.

13
Witold Kaczurba

La propriété "http.mappers" fonctionne pour moi, mais je pense que vous pourriez avoir besoin de cette option chamel ("jsonPrettyPrint").

10
Dave Syer

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

6
geoand

J'utilise le module json.tool couramment installé de Python:

curl --silent http://localhost:8080/metrics | python -mjson.tool
3
Samuli Kärkkäinen

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.

 enter image description here

3
Alex

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.
2
Hakan

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.

1
Seakayone

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.

1
forresthopkinsa

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 
0
gregory

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.

0
crusy

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)

0
Tom Silverman

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.

0
gavenkoa