Я могу найти различную статистику, просматривая через объекты в отладчике, но я не могу найти способ запросить эту статистику через классы реализации JMS 2.0 (например, ActiveMQProducer, который реализует JMSProducer). Например, при использовании отражения это работает:
Код: Выделить всё
public static void instrumentProducer(JMSProducer producer) {
if (!(producer instanceof ActiveMQProducer amqProducer)) {
throw new IllegalArgumentException("Expected an instance of ActiveMQProducer, but got: " + producer.getClass());
}
/* Is there a way to do this without reflection? */
var field = Arrays.stream(ActiveMQProducer.class.getDeclaredFields())
.filter(f -> ActiveMQMessageProducer.class.isAssignableFrom(f.getType()))
.findFirst()
.orElseThrow(() -> new NoSuchElementException("Could not find ActiveMQMessageProducer field to scrape metrics from"));
try {
field.trySetAccessible();
var messageProducer = (ActiveMQMessageProducer) field.get(amqProducer);
messageProducer.getStats().setEnabled(true);
var messageCount = messageProducer.getProducerStats().getMessageCount();
// Ideally this should be a counter, but I'll figure that out.
Gauge.builder("activemq.producer.message.count", messageCount::getCount)
.baseUnit(messageCount.getUnit())
.description(messageCount.getDescription())
.register(globalRegistry);
} catch (IllegalAccessException e) {
throw new RuntimeException("Unable to instrument JMSProducer", e);
}
}
Есть ли способ получить доступ к этой статистике без использования отражения или есть ли способ библиотека, которая может сделать это за меня, чтобы моей команде не приходилось поддерживать этот хрупкий, неочевидный код?
Наше приложение построено на Quarkus (мы намеренно не используем smallrye-messaging) в Java 17.
Подробнее здесь: https://stackoverflow.com/questions/790 ... statistics