Скрыть детали для индикаторов здоровья в 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);
}