弹簧启动器执行器健康状况恢复正常

时间:2015-06-09 15:30:35

标签: spring-boot

当我从Spring Boot应用程序(1.2.4.RELEASE)访问/health端点时,它返回状态DOWN

{
    status: "DOWN"
}

是否有任何已知的初始项目或库会覆盖状态?是否还有其他原因(除了编写自定义原因)为什么会返回DOWN

13 个答案:

答案 0 :(得分:25)

在Spring属性中,设置endpoints.health.sensitive = false。然后/health端点将返回各种运行状况指示器的列表,您可以从那里进行调试。

对于生产环境,您应该在/health端点周围启用安全性。

修改

正如Vincent在下面指出的那样,如果健康端点是安全的,那么您还需要management.security.enabled = false,这似乎是更新版Spring Boot的默认设置。

我在Spring Boot中看到的一个常见问题是它自动配置Solr,如果没有其他配置,/health端点表明Solr为DOWN。解决此问题的一种简单方法是使用此批注禁用Application.java中的Solr自动配置: @SpringBootApplication(exclude={SolrAutoConfiguration.class})

答案 1 :(得分:15)

在我的情况下,我需要两者这些属性才能获得更多详细信息:

endpoints.health.sensitive: false
management.security.enabled: false

否则,我得到的只是一个DOWN状态。

我遇到了RabbitMQ连接的问题:我的应用程序还没有使用它,但是我们已经开始连接一些与之相关的代码。该应用程序工作正常,但我们得到DOWN健康状态,这是非常令人费解的:Spring Boot在日志中出乎意料地保持沉默,因为启动时没有显示错误(我可能需要更改我的配置以使其更详细)

答案 2 :(得分:9)

如果运行状况URL显示“ DOWN”或HTTP 503-服务不可用错误,则尝试在 application.properties

中添加以下属性

URL-http://localhost:8080/actuator/health

management.endpoint.health.show-details=always

现在,URL应该显示的不仅仅是DOWN。 如果无法访问Solr主机,则使用以下排除项-

忽略Solr检查
@SpringBootApplication(exclude = { SolrAutoConfiguration.class })

现在身体应该好了。健康检查基本上是在内部验证预定义的健康检查(示例-DataSourceHealthIndicator, DiskSpaceHealthIndicator, CassandraHealthIndicator等)。

如果运行状况指示器之一关闭,则运行状况将关闭,并且将上述属性添加到 application.properties。 后,您可以看到错误作为响应。 >

答案 3 :(得分:3)

你的家伙可能正在使用Consul 1.0。在使用Consul 1.0的Spring Can Consul 1.1.0中有一个已知问题。见到这一点 - https://github.com/spring-cloud/spring-cloud-consul/issues/365和此 - https://github.com/hashicorp/consul/issues/3635

你必须升级到Spring Can Consul 1.3.0.RELEASE。

答案 4 :(得分:2)

我在Springboot 2.1.0中存在相同的问题,其中/ actuator / health { status: "DOWN" } 即使应用程序启动了。 新增中 management.health.defaults.enabled=false 属性文件中的问题已解决。

答案 5 :(得分:1)

根据此链接:https://github.com/indrabasak/spring-consul-example/blob/master/client/README.md,我们应严格使用以下属性以避免出现以下错误。

management.security.enabled=false
management.health.consul.enabled=false

enter image description here

答案 6 :(得分:1)

对于springboot 2.3.2及更高版本,只需添加

  1. management.health.defaults.enabled = false解决了我的问题。
  2. 使用/ management / health击打相同的API现在返回“ UP”

答案 7 :(得分:0)

我使用下面的代码解决了这个问题。

编写一个接受“ / private / health”映射的控制器(您可以改用/ health)。

import io.swagger.annotations.Api;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping
@Api(value = "Heath Service Health", description = "Heath Service Health")
public class HeathController {
  @GetMapping(value = "/private/health")
  @ResponseStatus(HttpStatus.OK)
  HealthStatusDto healthCheck() {
    return HealthStatusDto.builder().status("UP").build();
  }
}

下面的类是可选的。代替在上面的控制器中返回HealthStatusDto,您可以将任何其他消息作为String返回。

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

@Data
@AllArgsConstructor
@Builder
public final class HealthStatusDto {
  private final String status;
}

在application.yml中的配置下面添加

# actuator
# Disable Spring security
management:
  security:
    enabled: false

# Disable actuators
endpoints:
  actuator:
    enabled: false
  enabled: false

希望这会有所帮助

答案 8 :(得分:0)

我构建了一个过滤器,以记录运行状况响应失败时的运行状况。

package br.gov.go.sspj.k9.util;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
public class BadHealthCheckLogFilter implements Filter {

  private @Autowired HealthMvcEndpoint hme;

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    chain.doFilter(request, response);
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
    if (req.getRequestURI().endsWith("/health") && res.getStatus() != 200)
      log.error(hme.invoke(req, null).toString());
  }

  @Override
  public void init(FilterConfig filterConfig) {
  }

  @Override
  public void destroy() {
  }
}

答案 9 :(得分:0)

如果您刚刚添加了端点并且它已关闭检查,则默认检查可能已关闭,请参见link以查看默认检查的内容。就我而言,我忘记运行弹性,因此运行状况检查报告为“下降”,正如Rashmi指出的那样,您可以通过management.health.defaults.enabled=false禁用默认值,但是最好查找

的实际原因。

答案 10 :(得分:0)

management.endpoint.health.show-details =,它总是有助于调试Health处于DOWN的原因,这有助于我解决问题。

答案 11 :(得分:0)

将应用程序从Spring Boot 1.5升级到2.3.5.RELEASE时,我遇到了同样的问题。

添加endpoints.health.sensitive和其他application.properties答案中提到的其他属性对我来说不起作用。

我通过排除RabbitAutoConfiguration解决了该问题。

@EnableAutoConfiguration(exclude = { RabbitAutoConfiguration.class })

答案 12 :(得分:0)

就我而言,Spring (v2.1.5.RELEASE)

endpoints.actuator.enabled=true management.health.defaults.enabled=false

添加上述属性解决了我的问题。

给予状态“UP”