gpt4 book ai didi

java - 添加Spring Actuator的healthcheck without Boot和@EnableAutoConfiguration

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:00 29 4
gpt4 key购买 nike

我想将 Actuator 添加到我的 Spring 应用程序(不是 Spring Boot)。准确地说,我需要使用执行器 HealthCheck,这样我就能够创建不同健康指标的 bean,并且它们将在/health 上创建完整的健康检查。

起初,我尝试将@EndpointAutoConfiguration添加到我的@Configuration类中,但是存在bean冲突,因为我有我真正需要的自定义bean,因此除了HealthIndicatorAutoConfiguration之外不需要其他配置

最佳答案

可能的解决方案是创建具有关键字段的自定义 HealthIndicator 和 HealthIndicatorCollector。还添加一个 servlet:

contextHandler.addServlet(new ServletHolder(platformHealthCheckServlet), "/healthcheck");

它从上下文中收集所有自定义 HealthIndicators 并在/healthcheck 端点创建良好的状态 json:

@Autowired
public CustomHealthCheckServlet(Map<String, CustomHealthIndicator> healthIndicatorMap, ObjectMapper objectMapper) {
this.healthIndicatorMap = Collections.unmodifiableMap(healthIndicatorMap);
this.mapper = objectMapper;
}

CustomHealthIndicator,添加了setCritical方法:

public interface CustomHealthIndicator extends HealthIndicator {
void setCritical(boolean var1);
}

CustomAbstractHealthIndicator 重写 AbstractHealthIndicator 中的 doHealthCheck 方法,向其构建器添加关键细节并创建自己的抽象方法 doCheck:

public abstract class CustomAbstractHealthIndicator extends AbstractHealthIndicator 
implements CustomHealthIndicator {
private boolean critical = false;

public CustomAbstractHealthIndicator() {
}

public void setCritical(boolean critical) {
this.critical = critical;
}

@Override
protected void doHealthCheck(Builder builder) throws Exception {
builder.withDetail("critical", this.critical);
this.doCheck(builder);
}

protected abstract Builder doCheck(Builder var1) throws Exception;
}

还有另一个自定义类,它聚合运行状况 bean,并根据每个运行状况的关键状态计算整个应用程序的状态,忽略不关键但可能对监控有用的指标:

public class CustomHealthAggregator implements HealthAggregator {

private List<String> statusOrder;

public CustomHealthAggregator() {
setStatusOrder(Status.DOWN, Status.OUT_OF_SERVICE, Status.UP,
Status.UNKNOWN);
}

public void setStatusOrder(Status... statusOrder) {
String[] order = new String[statusOrder.length];
for (int i = 0; i < statusOrder.length; i++) {
order[i] = statusOrder[i].getCode();
}
setStatusOrder(Arrays.asList(order));
}

public void setStatusOrder(List<String> statusOrder) {
Assert.notNull(statusOrder, "StatusOrder must not be null");
this.statusOrder = statusOrder;
}

protected Status aggregateStatus(List<Status> candidates) {
// Only sort those status instances that we know about
List<Status> filteredCandidates = new ArrayList<Status>();
for (Status candidate : candidates) {
if (this.statusOrder.contains(candidate.getCode())) {
filteredCandidates.add(candidate);
}
}
// If no status is given return UP
if (filteredCandidates.isEmpty()) {
return Status.UP;
}
// Sort given Status instances by configured order
Collections.sort(filteredCandidates,
new StatusComparator(this.statusOrder));
return filteredCandidates.get(0);
}

@Override
public Health aggregate(Map<String, Health> healths) {
List<Status> statusCandidates = healths.entrySet()
.stream()
.filter(healthEntry ->
healthEntry.getValue().getDetails().get("critical").equals(true))
.map(e -> e.getValue().getStatus())
.collect(Collectors.toList());

Status status = aggregateStatus(statusCandidates);
Map<String, Object> details = new LinkedMap();
details.put("version", AppVersionUtil.getAppVersion());
details.putAll(aggregateDetails(healths));
return new Health.Builder(status, details).build();
}

protected Map<String, Object> aggregateDetails(Map<String, Health> healths)
{
return new LinkedHashMap<String, Object>(healths);
}

private class StatusComparator implements Comparator<Status> {

private final List<String> statusOrder;

StatusComparator(List<String> statusOrder) {
this.statusOrder = statusOrder;
}

@Override
public int compare(Status s1, Status s2) {
int i1 = this.statusOrder.indexOf(s1.getCode());
int i2 = this.statusOrder.indexOf(s2.getCode());
return (i1 < i2 ? -1 : (i1 == i2 ? s1.getCode().compareTo(s2.getCode()) : 1));
}

}
}

关于java - 添加Spring Actuator的healthcheck without Boot和@EnableAutoConfiguration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40258893/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com