Blog coding and discussion of coding about JavaScript, PHP, CGI, general web building etc.

Saturday, January 23, 2016

Pretty print JSON output of Spring Boot Actuator endpoints

Pretty print JSON output of Spring Boot Actuator endpoints


Spring Boot Actuator provides several endpoints to monitor an application as:

/metrics  /beans  /health  ...  

Checking the endpoints with:

curl http://localhost:8080/metrics  

results in:

{"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}  

This is fine for machine consumption but hard to read by humans.

I'd like to format (i.e. pretty print) the JSON output of the Spring Boot Actuator endpoints to make them easier to read by operations personel.

Something like:

{    "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,    ...  }  

I tried setting

http.mappers.json-pretty-print=true   

but this setting didn't affect the Actuator output.

Is there a configuration to enable pretty print of the Spring Boot Actuator JSON output?

UPDATE:

The official sample works for me.

It's important to follow the comments from @DaveSyer: the property to set is

http.mappers.jsonPrettyPrint=true  

Investigation is still under way.

In the meantime I use the the json pretty print command line as workaround:

Install jsonpp (e.g. for OS X):

brew install jsonpp  

Then pipe the curl output trough jsonpp which formats the json file on the fly:

curl http://localhost:8080/metrics | jsonpp  

Results in:

{    "counter.status.200.env": 1,    "counter.status.200.health": 1,    "counter.status.200.info": 2,    "counter.status.200.metrics": 2,    ...  }  

Answer by geoand for Pretty print JSON output of Spring Boot Actuator endpoints


Do the following:

@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      }      }  

This works because Spring Boot uses an ObjectMapper bean to perform all the JSON related operations.

Note however that this configuration will pretty print all JSON outputs, not just the actuator related stuff.

UPDATE

The answer from @DaveSyer is obviously better! I hadn't found the HttpMapperProperties object which is used to configure Jackson. This is it's Javadoc

Answer by Dave Syer for Pretty print JSON output of Spring Boot Actuator endpoints


The "http.mappers" property works for me but I think you might need it camel cased ("jsonPrettyPrint").

Answer by Samuli Krkkinen for Pretty print JSON output of Spring Boot Actuator endpoints


I use Python's commonly installed json.tool module:

curl --silent http://localhost:8080/metrics | python -mjson.tool  

Answer by Bertrand Renuart for Pretty print JSON output of Spring Boot Actuator endpoints


As per http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper, the official way to enable pretty print with Jackson in Spring Boot (1.2.2 at least) is to set the following property:

 # Pretty-print JSON responses   spring.jackson.serialization.indent_output=true  

Answer by Hakan for Pretty print JSON output of Spring Boot Actuator endpoints


With spring-boot 1.2.6, you need to use:

spring.jackson.serialization.INDENT_OUTPUT=true  

From my log when using the old http.mappers.*:

http.mappers.json-pretty-print is deprecated. If you are using Jackson, spring.jackson.serialization.INDENT_OUTPUT=true should be used instead.  


Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 72

0 comments:

Post a Comment

Popular Posts

Powered by Blogger.