Скрыть детали для индикаторов здоровья в Spring Boot Actuator

Я использую индикатор работоспособности Spring Boot от привода. Пока пример ответа выглядит так:

{
   "status":"DOWN",
   "details": {
      "diskSpace": {
         "status":"UP",
         "details": {
            "total":499963170816,
            "free":250067189760,
            "threshold":10485760
         }
      }
   }
}

Потому что мне нужно сделать /actuator/health Для конечной точки общественности мне нужно скрыть детали для показателей здоровья, поэтому я ожидаю получить что-то вроде этого:

{
   "status":"DOWN",
   "details": {
      "diskSpace": {
         "status":"UP"
      }
   }
}

Для дискового пространства это не большая проблема, но, например, для базы данных я не хочу делиться сообщением об исключении и подробностями в случае его сбоя. Кроме того (как я уже упоминал в начале), он должен быть общедоступным, поэтому я не хочу делать эту конечную точку "разрешенной". И в конце - было бы здорово, если бы это можно было сделать без написания моей собственной конечной точки.

Это вообще возможно?

3 ответа

Решение

Это невозможно во время написания (в Spring Boot 2.1 и более ранних версиях) без написания вашей собственной конечной точки. Я открыл проблему, чтобы рассмотреть ее как усовершенствование будущей версии Spring Boot.

Есть способ добиться этого в Spring Boot 2.X

management:
  health:
    db:
      enabled: false
    diskspace:
      enabled: false
    mongo:
      enabled: false
    refresh:
      enabled: false

Дополнительную информацию можно найти здесь https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html

У меня сегодня было похожее задание. Почему бы тебе не попробовать это?

В свойствах приложения «Файл» отключите такие компоненты diskSpace.

management.health.diskspace.enabled=false

затем я создал свой собственный DiskSpaceHealthIndicator следующим образом:

      /**
 * Custom Response Generator of Health diskSpace Conponent status
 * 
 * "diskSpace": {
 *           "status": "UP",
 *           "details": {
 *               "total": "100%",
 *               "exists": true,
 *               "threshold": 8388608000,
 *               "used": "41%",
 *               "free": "59%"
 *           }
 *    } 
 */
   @Component("diskSpace")
   public class CustomDiskSpaceHealthIndicator extends DiskSpaceHealthIndicator {
    
   private static Logger logger = LoggerFactory.getLogger(CustomDiskSpaceHealthIndicator.class);
  
   private File path;
   private DataSize threshold;
   
    /**
     * new File("/") - means root Path, if we want we can pass custom Path
     * DataSize.ofMegabytes(8000) - we have set thresHold to be 1 Gb
     * @param path
     * @param threshold
     */
    public CustomDiskSpaceHealthIndicator() {
       // new File("/") - represents root Path
        // DataSize.ofMegabytes(8000) - Kept My threshold to 1 Gb 
        super(new File("/"), DataSize.ofMegabytes(8000) );
        this.path = new File("/");
        this.threshold = DataSize.ofMegabytes(8000);
    }
    
    /**
     * we Override Default doHealthCheck Method of DiskSpaceHealthIndicator
     * for given Path we fetch getUsableSpace
     * if diskFreeInBytes >= this.threshold.toBytes()
     * we say Status is Up else Down
     * we fetch Total free Space from path
     * calculate percentage of free Space ,usedSpace and set in Map
     * set ThresHold and  send Response
     * <p>
     */
    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        long diskFreeInBytes = this.path.getUsableSpace();
        if (diskFreeInBytes >= this.threshold.toBytes()) {
            builder.up();
        }
        else {
            logger.warn("Free disk space below threshold. Available: {} bytes 
            (threshold: {})", diskFreeInBytes, this.threshold);
            builder.down();
        }
        // Skip These if you don't  need response, In My case I needed 
        // response  details in percentages 
         
        long total = this.path.getTotalSpace();
            
        double freePrecentage = ((double) (diskFreeInBytes) / total) * 100;
        double subtract = total - diskFreeInBytes;
        double usedPercentage = ((subtract/total)*100);
            
       
        Map<String, Object> customDiskDetails = new HashMap<>();
        customDiskDetails.put("total", "100%");
        customDiskDetails.put("free", Math.round(freePrecentage) +"%");
        customDiskDetails.put("used", Math.round(usedPercentage)+"%");
        customDiskDetails.put("exists", this.path.exists());
        customDiskDetails.put("threshold", this.threshold.toBytes());
        builder.withDetails(customDiskDetails);
   }
Другие вопросы по тегам