initializr - spring-boot-starter-actuator maven
Actuador de la bota de primavera (7)
Cuando accedo al punto final /health
desde mi aplicación Spring Boot (1.2.4.RELEASE), está devolviendo un estado de DOWN
:
{
status: "DOWN"
}
¿Hay proyectos o bibliotecas de inicio que se sabe que sobrescriben el estado? ¿Hay alguna otra razón (además de escribir una personalizada) por la que se devolvería DOWN
?
Agregué estas 2 propiedades
endpoints.health.sensitive = false
management.security.enabled = false
Sin uso, el estado todavía está abajo las application.properties
son las siguientes
server.port=8098
server.host=localhost
spring.application.name=school-service
spring.cloud.consul.host=http://dockerhost
spring.cloud.consul.port=8500
endpoints.health.sensitive=false
management.security.enabled=false
spring.cloud.consul.enabled=true
spring.cloud.consul.discovery.enabled=true
spring.cloud.consul.discovery.register=true
endpoints.restart.enabled= true
endpoints.shutdown.enabled=true
¿Alguna pista por favor?
El estado se devuelve como abajo siempre
{"status":"DOWN","diskSpace":{"status":"UP","total":241207078912,"free":63632199680,"threshold":10485760},"refreshScope":{"status":"UP"},"consul":{"status":"DOWN","services":{"consul":[],"school-service":[],"student-service":[]},"error":"java.lang.IllegalArgumentException: Value must not be null"},"hystrix":{"status":"UP"}}
Mi pom.xml es el siguiente
<?xml version="1.0" encoding="UTF-8"?>
http://maven.apache.org/xsd/maven-4.0.0.xsd "> 4.0.0
<groupId>com.example.howtodoinjava</groupId>
<artifactId>spring-cloud-consul-school</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-cloud-consul-school</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Camden.SR7</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Conseguí esto arreglado usando el código de abajo.
Escribió un controlador que acepta la asignación "/ private / health" (en su lugar puede usar / 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();
}
}
Debajo de la clase es opcional En lugar de devolver HealthStatusDto en el controlador anterior, puede devolver cualquier otro mensaje como una cadena.
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@Data
@AllArgsConstructor
@Builder
public final class HealthStatusDto {
private final String status;
}
Agregue la siguiente configuración en application.yml
# actuator
# Disable Spring security
management:
security:
enabled: false
# Disable actuators
endpoints:
actuator:
enabled: false
enabled: false
Espero que esto ayude
En mi caso, necesitaba ambas propiedades para obtener más detalles:
endpoints.health.sensitive: false
management.security.enabled: false
De lo contrario, todo lo que estaba obteniendo era un estado ABAJO.
Tuve un problema con la conexión RabbitMQ: mi aplicación no la está utilizando todavía, pero hemos comenzado a cablear algunos códigos relacionados con ella. La aplicación funciona bien, pero obtuvimos un estado de salud ABAJO, que fue bastante desconcertante: Spring Boot es sorprendentemente silencioso en los registros, ya que no aparece ningún error en el inicio (probablemente deba cambiar mi configuración para hacerlo más detallado)
En sus propiedades Spring, establezca endpoints.health.sensitive = false
. El punto final /health
luego devolverá la lista de varios indicadores de salud y puede depurar desde allí.
Para un entorno de producción, debe habilitar la seguridad alrededor del punto final /health
.
Editar
Como señala Vincent a continuación, también necesitará management.security.enabled = false
si el punto final de salud está protegido, lo que parece ser el predeterminado en las versiones más recientes de Spring Boot.
Un problema común que he visto con Spring Boot fuera de la caja es que configura automáticamente Solr y, sin configuración adicional, el punto final /health
indica que Solr está DOWN
. Una manera fácil de solucionar esto es deshabilitar la configuración automática de Solr en su Application.java con esta anotación: @SpringBootApplication(exclude={SolrAutoConfiguration.class})
Según este enlace: https://github.com/indrabasak/spring-consul-example/blob/master/client/README.md , debemos usar estrictamente las siguientes propiedades para evitar el error que se muestra a continuación.
management.security.enabled=false
management.health.consul.enabled=false
Si la URL de estado muestra "ABAJO" o HTTP 503 - Error de servicio no disponible, intente agregar la propiedad a continuación en application.properties
URL - http://localhost:8080/actuator/health
management.endpoint.health.show-details=always
Ahora la url debería mostrar más que solo ABAJO. Si no se puede acceder al host de Solr, ignore la comprobación de Solr utilizando la siguiente exclusión:
@SpringBootApplication(exclude = { SolrAutoConfiguration.class })
Ahora la salud debería subir. La comprobación de estado básicamente valida la comprobación de estado predefinida internamente (Ejemplo: DataSourceHealthIndicator, DiskSpaceHealthIndicator, CassandraHealthIndicator
, etc.).
Si uno de los indicadores de estado está inactivo, el estado estará inactivo y podrá ver el error como respuesta después de agregar la propiedad mencionada anteriormente a application.properties.
Tu chico probablemente esté usando el cónsul 1.0. Hay un problema conocido en Spring Could Consul 1.1.0 o similar con Consul 1.0. Vea esto - https://github.com/spring-cloud/spring-cloud-consul/issues/365 y esto - https://github.com/hashicorp/consul/issues/3635
Tendrá que actualizar a Spring Could Consul 1.3.0.RELEASE.