001package nl.nlighten.prometheus.wildfly; 002 003import io.prometheus.client.Collector; 004import io.prometheus.client.CounterMetricFamily; 005import io.prometheus.client.GaugeMetricFamily; 006 007import javax.management.MBeanServer; 008import javax.management.ObjectInstance; 009import javax.management.ObjectName; 010import java.lang.management.ManagementFactory; 011import java.util.ArrayList; 012import java.util.Arrays; 013import java.util.List; 014import java.util.Set; 015 016/** 017 * Exports infinispan metrics. 018 * <p> 019 * Example usage: 020 * <pre> 021 * {@code 022 * new InfinispanExports().register(); 023 * } 024 * </pre> 025 * <p> 026 * Example metrics being exported: 027 * <pre> 028 * infinispan_hit_ratio{name="myReplicatedCache(repl_sync)",manager="myCacheContainer",} 0.93 029 * infinispan_hit_total{name="myReplicatedCache(repl_sync)",manager="myCacheContainer",} 930.0 030 * infinispan_miss_total{name="myReplicatedCache(repl_sync)",manager="myCacheContainer",} 70.0 031 * infinispan_entries_total{myReplicatedCache(repl_sync)="foo",manager="myCacheContainer",} 1021.0 032 * infinispan_evictions_total{myReplicatedCache(repl_sync)="foo",manager="myCacheContainer",} 0.0 033 * </pre> 034 */ 035public class InfinispanExports extends Collector { 036 037 public List<MetricFamilySamples> collect() { 038 List<MetricFamilySamples> mfs = new ArrayList<>(); 039 try { 040 final MBeanServer server = ManagementFactory.getPlatformMBeanServer(); 041 final ObjectName filterName = new ObjectName("jboss.infinispan:component=Statistics,name=*,manager=*,type=Cache"); 042 Set<ObjectInstance> mBeans = server.queryMBeans(filterName, null); 043 if (mBeans.size() > 0) { 044 045 GaugeMetricFamily hitRatioGauge = new GaugeMetricFamily( 046 "infinispan_hit_ratio", 047 "Cache hit ratio", 048 Arrays.asList("name", "manager")); 049 050 CounterMetricFamily hitsCounter = new CounterMetricFamily( 051 "infinispan_hit_total", 052 "Number of hits", 053 Arrays.asList("name", "manager")); 054 055 CounterMetricFamily missesCounter = new CounterMetricFamily( 056 "infinispan_miss_total", 057 "Number of misses", 058 Arrays.asList("name", "manager")); 059 060 GaugeMetricFamily numberOfEntriesGauge = new GaugeMetricFamily( 061 "infinispan_entries_total", 062 "Number of entries", 063 Arrays.asList("name", "manager")); 064 065 CounterMetricFamily evictionsCounter = new CounterMetricFamily( 066 "infinispan_evictions_total", 067 "Number of evictions", 068 Arrays.asList("name", "manager")); 069 070 for (final ObjectInstance mBean : mBeans) { 071 072 hitRatioGauge.addMetric( 073 Arrays.asList(Util.sanitizeLabel(mBean.getObjectName().getKeyProperty("name")), Util.sanitizeLabel(mBean.getObjectName().getKeyProperty("manager"))), 074 (Double) server.getAttribute(mBean.getObjectName(), "hitRatio")); 075 hitsCounter.addMetric( 076 Arrays.asList(Util.sanitizeLabel(mBean.getObjectName().getKeyProperty("name")), Util.sanitizeLabel(mBean.getObjectName().getKeyProperty("manager"))), 077 ((Long) server.getAttribute(mBean.getObjectName(), "hits")).doubleValue()); 078 079 missesCounter.addMetric( 080 Arrays.asList(Util.sanitizeLabel(mBean.getObjectName().getKeyProperty("name")), Util.sanitizeLabel(mBean.getObjectName().getKeyProperty("manager"))), 081 ((Long) server.getAttribute(mBean.getObjectName(), "misses")).doubleValue()); 082 083 numberOfEntriesGauge.addMetric( 084 Arrays.asList(Util.sanitizeLabel(mBean.getObjectName().getKeyProperty("name")), Util.sanitizeLabel(mBean.getObjectName().getKeyProperty("manager"))), 085 ((Integer) server.getAttribute(mBean.getObjectName(), "numberOfEntries")).doubleValue()); 086 087 evictionsCounter.addMetric( 088 Arrays.asList(Util.sanitizeLabel(mBean.getObjectName().getKeyProperty("name")), Util.sanitizeLabel(mBean.getObjectName().getKeyProperty("manager"))), 089 ((Long) server.getAttribute(mBean.getObjectName(), "evictions")).doubleValue()); 090 091 } 092 mfs.add(hitRatioGauge); 093 mfs.add(hitsCounter); 094 mfs.add(missesCounter); 095 mfs.add(numberOfEntriesGauge); 096 mfs.add(evictionsCounter); 097 098 } 099 } catch (Exception e) { 100 e.printStackTrace(); 101 } 102 return mfs; 103 } 104} 105