0

현재 스프링 부트 액추에이터 "상태"끝점을 사용하여 구현 된 상태 모니터링 프레임 워크로 작업하고 있습니다. Actuator 인프라 스트럭처는 맞춤형 건강 검진의 생성을 지원하고 내장 된 건강 검진을 제공합니다. 이 중 하나는 DataSourceHealthIndicator입니다.기본 DataSourceHealthIndicator 비활성화 및 바꾸기

DataSourceHealthIndicatororg.springframework.boot.actuate.health 패키지의 일부이며 현재 데이터 소스의 상태를 확인하기 위해 Health 프레임 워크에서 사용 중입니다. DataSourceHealthIndicator의 약간 수정 된 버전을 사용하고 "기본값"을 비활성화해야합니다.

나는 제안 된 해결책을 시도했다 herehere, 운 없음으로. 나는 무엇을 잘못 할 수 있 었는가?

감사합니다.


편집 :

@Bean 
public HealthIndicator dbHealthIndicator() { 
    return new dbHealthIndicator(); 
} 

: 2016년 8월 18일, 동부 표준시 오후 3시 38분

나는 내 구성 클래스에 다음 dbHealthIndicator에 내 콩의 이름을 변경하고 추가 한 지금 다음 예외가 발생합니다 :

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataAccessMapperFactory' defined in class path resource [udtContext.xml]

java.lang.RuntimeException: java.sql.SQLException: Unable to start the Universal Connection Pool: oracle.ucp.UniversalConnectionPoolException

363,210

편집 : 2016년 8월 19일는,이 도움이 될 수 동부 표준시 오전 9시 22분

은 내가 뭘하려고 오전 보여합니다. 현재 내 /health 엔드 포인트는 다음과 같다 뭔가를 반환

dataSource: { 
    status: "UP", 
    database: "mySql", 
    hello: "hello" 
} 

더 "결과"옆에있는 정수가 내 데이터베이스에 저장 프로 시저에 의해 반환 된 상태 코드입니다이 같은 뭔가를 반환 할 싶습니다 :

private void doDataSourceHealthCheck(Health.Builder builder) throws Exception { 
    String product = getProduct(); 
    builder.up().withDetail("database", product); 
    String validationQuery = getValidationQuery(product); 
    if (StringUtils.hasText(validationQuery)) { 
     try { 
      // Avoid calling getObject as it breaks MySQL on Java 7 
      List<Object> results = this.jdbcTemplate.query(validationQuery, 
        new SingleColumnRowMapper()); 
      Object result = DataAccessUtils.requiredSingleResult(results); 
      builder.withDetail("hello", result); 
     } 
     catch (Exception ex) { 
      builder.down(ex); 
     } 
    } 
} 

I 대구 8 개 라인을 추가해야

dataSource: { 
    status: "UP", 
    database: "mySql", 
    hello: "hello", 
    result: 0 
} 

이 체크를 수행 DataSourceHealthIndicator.java의 방법은 e를 builder.withDetail("hello", result); 아래에서 호출하여 저장된 프로 시저에 대한 호출을 수행합니다. 나는 기본 클래스를 "디 컴파일"하고 싶지 않고 private이기 때문에이 메서드를 재정의 할 수 없다. 나는 내 자신의 bean에 DataSourceHealthIndicator.java 코드를 복사하고, 코드를 추가하고,이 버전을 대신 사용하도록 Spring을 재구성 할 수 있다고 생각했지만, 이것이 가능한지 모르겠습니다.

+0

왜 당신이 당신의 자신의 필요합니까'HealthIndicator' 당신이 시도하고 그것을 무엇인가 그렇게하지 않으면 작동하지 않습니다/원래 하나의 기능? –

+0

M. Deinum, 내 데이터베이스의 저장 프로 시저를 호출하기 위해 내장 DataSourceHealthIndicator에서 doDataSourceHealthCheck() 메서드를 재정의하거나 확장하고 싶습니다. 그러나 Java는 개인 메소드의 대체 또는 확장을 지원하지 않습니다. 그래서, 내가 한 것은 DataSourceHealthIndicator를 복사하고 사용자 정의 빈에 약 8 줄의 코드를 추가하는 것입니다. 이 기본값 대신 "확장 된"버전을 사용하고 싶습니다. 이것이 가능한지 아십니까? – keharris

+0

하지만 기본 정보를 비활성화 하시겠습니까, 아니면이 추가 정보입니까? 너의 것은 작동하지 않을 것이고 나는 너 자신의 구현에서 autowiring을 사용하려고 노력할 것으로 기대한다. 그것은 작동하지 않을 것이다. 원래의 상태 표시기 (constructor에 의해 전달 된대로'DataSource'가 전달됨)를 살펴보십시오. 이것을 구성해야합니다. 그러나 당신이 기존의 것을 당신의 것과 바꾸고 싶지는 않을 것입니다. 나는 둘 다 원한다고 생각합니다. –

답변

0

일반적으로 그 구성은 HealthIndicator입니다. 이 경우는 HealthIndicatorAutoConfiguration.DataSourcesHealthIndicatorConfiguration입니다. 처음으로 링크 된 제안이 명시된대로. 사용자 정의 bean dbHealthIndicator의 이름을 지정하여 @ConditionalOnMissingBean(name = "dbHealthIndicator")이 기본값을 허용하지 않도록해야합니다.

일부 시작 로그를 제공하거나 제대로 작동하지 않는 세부 정보를 제공하면 사람들이 문제를 해결하는 데 도움이됩니다.

@SpringBootApplication 
public class StackoverflowWebmvcSandboxApplication { 
    @Bean 
    public HealthIndicator dbHealthIndicator() { 
     return new HealthIndicator() { 

      @Override 
      public Health health() { 
       return Health.status(Status.UP).withDetail("hello", "hi").build(); 
      } 
     }; 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(StackoverflowWebmvcSandboxApplication.class, args); 
    } 

    @RestController 
    public class HelloController { 
     @GetMapping("/hello") 
     public String hello() { 
      return "hello"; 
     } 
    } 
} 

/health 엔드 포인트는 다음 반환 : 여기

내가 일을하는 데있어 방법의 예입니다

{ 
    "status": "UP", 
    "db": { 
     "status": "UP", 
     "hello": "hi" 
    }, 
    "diskSpace": { 
     "status": "UP", 
     "total": 127927316480, 
     "free": 17191956480, 
     "threshold": 10485760 
    } 
} 
+0

도와 줘서 고마워, 션! 조금 더 자세하게 설명하기 위해, 사용자 정의 빈의 이름을 dbHealthIndicator로 변경하더라도 프레임 워크는 여전히 기본값을 사용하는 것 같습니다 (오류 메시지는 반환되지 않습니다). 대신 건강 검진을 등록하기 위해 수행해야하는 추가 구성 또는 "재배 선"이 있습니까? – keharris

+0

빈 구성 방법을 보여줄 수 있습니까? –

+0

Shawn, 나는 원래의 게시물을 편집하여 빈 설정 코드와 함께 현재 예외를 포함시켰다. – keharris