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