prosource

상태 점검을 위해 특정 데이터 소스를 모니터링하지 않음

probook 2023. 7. 22. 10:11
반응형

상태 점검을 위해 특정 데이터 소스를 모니터링하지 않음

SpringBoot Actuator에 의한 특정 데이터 소스 모니터링을 비활성화할 수 있는 방법이 있는지 알고 싶습니다.

시나리오:One Microservice는 3개의 데이터 소스를 사용하지만 비즈니스상의 이유로 Spring Boot Health Indicator를 통해 모니터링할 필요가 없습니다.

하나의 특정 데이터 소스에 대한 모니터링을 비활성화하는 방법은 무엇입니까?

미리 감사 드려요

후안 안토니오

이 속성으로 수행할 수 있는 기본 데이터 소스 상태 표시기를 비활성화해야 합니다.

management.health.db.enabled=false

그런 다음 관심 있는 데이터 소스만 다루는 자체 상태 지표를 구성합니다. 다음과 같은 것이 있습니다.

@Autowired
private DataSource dataSourceA;

@Autowired
private DataSource dataSourceB;

@Bean
public DataSourceHealthIndicator dataSourceHealthIndicatorA() {
    return new DataSourceHealthIndicator(dataSourceA);
}

@Bean
public DataSourceHealthIndicator dataSourceHealthIndicatorB() {
    return new DataSourceHealthIndicator(dataSourceB);
}

또는 확장하여 자체 '복수 데이터 소스 상태 표시기'를 작성합니다.AbstractHealthIndicator그리고 그것에 주입하는 것은 오직.Datasources모니터링에 관심이 있습니다.유형의 모든 봄 콩HealthIndicator자동으로 에 등록됩니다.health작동기는 스프링이 당신의 사용자 정의를 만들도록 내버려두면 됩니다.HealthIndicator작동기에 의해 노출될 것입니다.

배경의 경우 Spring에서 기본 데이터 소스 상태 점검을 구성하는 방법을 확인할 수 있습니다.org.springframework.boot.actuate.autoconfigure.DataSourcesHealthIndicatorConfiguration.

Spring Boot 2 이후에는 상태 점검에서 데이터 소스를 필터링할 수 있습니다. 우선 순위를 수행할 수 있습니다.org.springframework.boot.actuate.autoconfigure.jdbcDataSourceHealthIndicatorAutoConfiguration아래 예제에서는 풀 이름이 없는 데이터 소스가 필터링됩니다.

@Configuration
public class YourDataSourceHealthIndicatorAutoConfiguration extends DataSourceHealthIndicatorAutoConfiguration {

    public NonMigrationDataSourceHealthIndicatorAutoConfiguration(Map<String, DataSource> dataSources, ObjectProvider<DataSourcePoolMetadataProvider> metadataProviders) {
        // Filter out datasources without a pool name
        super(filterDataSources(dataSources), metadataProviders);
    }

    private static Map<String, DataSource> filterDataSources(Map<String, DataSource> dataSources) {
        return dataSources.entrySet().stream()
                .filter(dataSourceEntry -> {
                    if (dataSourceEntry.getValue() instanceof HikariDataSource) {
                        HikariDataSource hikariDataSource = (HikariDataSource) dataSourceEntry.getValue();
                        return hikariDataSource.getPoolName() != null;
                    } else {
                        return true;
                    }
                }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    }
}

가장 쉬운 방법은 다음과 같습니다.

@Configuration
        public class DatasourceHealthCheckConfig  extends DataSourceHealthContributorAutoConfiguration {
    
    
        public DatasourceHealthCheckConfig(Map<String, DataSource> dataSources, ObjectProvider<DataSourcePoolMetadataProvider> metadataProviders) {
            super(dataSources, metadataProviders);
        }
    
        @Override
        public HealthContributor dbHealthContributor(Map<String, DataSource> dataSources) {
            // remove the required datasource from the dataSources map by its name
            
            return super.dbHealthContributor(dataSources);
        }
    }

Spring Boot 2.1.2용 솔루션.상태를 비활성화하려면 특정 데이터 소스만 확인하십시오.좀 부끄럽지만, 저를 위해 일했습니다.

@Configuration
public class DatasourceHealthCheckConfig extends DataSourceHealthIndicatorAutoConfiguration {

  public DatasourceHealthCheckConfig(ObjectProvider<Map<String, DataSource>> dataSources,
                                     ObjectProvider<DataSourcePoolMetadataProvider> metadataProviders) {
    super(filterDataSources(dataSources), metadataProviders);
  }

  private static ObjectProvider<Map<String, DataSource>> filterDataSources(ObjectProvider<Map<String, DataSource>> dataSources) {
    final Map<String, DataSource> map = dataSources.getObject();
    map.remove("specificDataSource"); // name of datasource for removal

    return new ObjectProvider<>() {
      @Override
      public Map<String, DataSource> getObject(Object... args) throws BeansException {
        return map;
      }

      @Override
      public Map<String, DataSource> getIfAvailable() throws BeansException {
        return map;
      }

      @Override
      public Map<String, DataSource> getIfUnique() throws BeansException {
        return map;
      }

      @Override
      public Map<String, DataSource> getObject() throws BeansException {
        return map;
      }
    };
  }
}

언급URL : https://stackoverflow.com/questions/46746784/not-monitor-a-specific-datasource-for-health-check

반응형