Подтвердить что ты не робот

Достаточно распечатать вывод JSON из Spring конечных точек исполнительного механизма

Spring Оператор загрузки предоставляет несколько конечных точек для монитора приложения как:

/metrics
/beans
/health
...

Проверка конечных точек с помощью:

curl http://localhost:8080/metrics

приводит к:

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

Это штраф для потребления компьютера, но трудно читается людьми.

Я хотел бы форматировать (т.е. довольно печатать) вывод JSON конечных точек Spring Boot Actuator, чтобы упростить их для чтения операциями personel.

Что-то вроде:

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

Я пробовал настройку

http.mappers.json-pretty-print=true 

но этот параметр не повлиял на выход Actuator.

Есть ли конфигурация до разрешить печать выходного файла Spring JUON?

UPDATE:

Официальный образец работает для меня.

Важно следить за комментариями @DaveSyer: свойство для установки -

http.mappers.jsonPrettyPrint=true

Следствие продолжается.

Тем временем я использую json pretty print командной строки как обходной путь:

Установите jsonpp (например, для OS X):

brew install jsonpp

Затем подключите вывод curl через jsonpp, который форматирует json файл на лету:

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

Результаты в:

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

Ответ 2

Свойство "http.mappers" работает для меня, но я думаю, что вам может понадобиться его верблюд ( "jsonPrettyPrint" ).

Ответ 3

Для Spring Загрузка 1.5.1 У меня в файле YML:

spring:
  jackson:
    serialization:
      INDENT_OUTPUT: true

@BertrandRenuart ответ был самым близким, но по IDE не видел indent_output как правильно.

Ответ 4

Выполните следующие действия:

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


}

Это работает, потому что Spring Boot использует ObjectMapper bean для выполнения всех связанных с JSON операций.

Обратите внимание, что эта конфигурация будет довольно печатать все выходы JSON, а не только связанные с приводом элементы.

UPDATE

Ответ от @DaveSyer, очевидно, лучше! Я не нашел объект HttpMapperProperties, который используется для настройки Jackson. Это это Javadoc

Ответ 5

С spring -boot 1.2.6 вам нужно использовать:

spring.jackson.serialization.INDENT_OUTPUT=true

Из моего журнала при использовании старых http.mappers. *:

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

Ответ 6

Я использую обычно установленный Python модуль json.tool:

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

Ответ 7

К сожалению, свойство приложения

spring.jackson.serialization.INDENT_OUTPUT

не работал у меня (spring загрузочные версии с 1.2.6 до 1.4.0.RELEASE). Вместо этого в моем расширении WebMvcConfigurerAdapter я переопределил configureMessageConverters() и добавил свой собственный 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);
    }

   ...

}

Это похоже на трюк для меня на Spring boot 1.4.0.RELEASE, и мой выход исполнительного механизма теперь довольно напечатан (вместе с каждым другим выходом json)

Ответ 8

Вот моя функция Emacs для извлечения Spring Actuator Json из конечных точек:

(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) ))

Если вам не нравится зависимость от внешней библиотеки json-mode, замените ее на js-mode.

Ответ 9

Я использую jq для печати JSON, а также для его фильтрации. Это в основном sed для JSON. На маке он может быть установлен с доморощенным. (https://stedolan.github.io/jq/)

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

Ответ 10

На самом деле я хотел сделать то же самое. Но потом я спросил: почему? Чтобы лучше отладить мой сервис, который поставляется с небольшим штрафом за производительность.

Просто используйте расширение браузера, как этот:), чтобы получить представление, подобное этому

введите описание изображения здесь