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