WEB/시행착오

Spring actuator

Tony Lim 2024. 6. 17. 17:28
728x90

현재는 JMX MBean기반으로 정보를 export하고 있다. 

이 정보들을 actuator로 뿌려줘서 다른 모니터링 팀에서 수월하게 정보를 가져올 수 있게 하자

기본적으로 Gague.builder를 통해 custom한 것을 추가하면

        gauges.add(Gauge.builder("my.datasource.jndi.export.name", jeusDataSourcePoolMetadata, ds -> ds.getJndiExportName().hashCode())
                .description("JNDI Export Name of the datasource")
                .tags("name", beanName)
                .register(registry));

주입받은 MeterRegistry의 meterMap에 DefaultGauge로 추가가 된다.

이떄 동적으로 서버의 datasource들이 추가및 삭제가 될 때 도 반영해줘야하는데

meterMap에 들어간 DefaultGauge의 id를 참고하여 하나씩 임의로 지워주면된다.

주의 할것은 DefaultGauge의 ref 필드다

public DefaultGauge(Meter.Id id, @Nullable T obj, ToDoubleFunction<T> value) {
    super(id);
    this.ref = new WeakReference<>(obj);
    this.value = value;
}

WeakReference라 전해준 lambda를 제공해주는 객체가 어디서도 참조되어있지 않으면 null이 되어 문제가 생긴다.

public void metricsInitializer(DataSourceWrapper dataSourceWrapper) {
    MyDataSourcePoolMetadata myDataSourcePoolMetadata = new MyDataSourcePoolMetadata(dataSourceWrapper);
    preventWeakRefNull.put(dataSourceWrapper.getExportName(),myDataSourcePoolMetadata);
    ...
    Map<String, List<Gauge>> registeredMetrics= registerMetrics(meterRegistry, myDataSourcePoolMetadata, dataSourceWrapper.getExportName());
    ...
}

현재 myDataSourcePoolMetaData가 참조하고 있는데 동적으로 적용해준다고 이 참조를 잃어버리면 안된다.

이를 방지하기 위해 어딘가에 저장을 해줘야한다.

728x90