package org.stagemonitor.jvm;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.jvm.GarbageCollectorMetricSet;
import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.stagemonitor.core.CorePlugin;
import org.stagemonitor.core.StagemonitorPlugin;
import org.stagemonitor.core.elasticsearch.ElasticsearchClient;
import org.stagemonitor.core.grafana.GrafanaClient;
import org.stagemonitor.core.metrics.metrics2.Metric2Set;
import org.stagemonitor.core.metrics.metrics2.MetricName;
import org.stagemonitor.core.metrics.metrics2.MetricNameConverter;
import static org.stagemonitor.core.metrics.metrics2.MetricName.name;
public class JvmPlugin extends StagemonitorPlugin {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void initializePlugin(StagemonitorPlugin.InitArguments initArguments) {
initArguments.getMetricRegistry().registerAll(Metric2Set.Converter.convert(new GarbageCollectorMetricSet(), new MetricNameConverter() {
@Override
public MetricName convert(String name) {
final String[] split = name.split("\\.");
return name("jvm_gc_" + split[1]).tag("collector", split[0]).build();
}
}));
initArguments.getMetricRegistry().registerAll(Metric2Set.Converter.convert(new MemoryUsageGaugeSet(), new MetricNameConverter() {
@Override
public MetricName convert(String name) {
final String[] split = name.split("\\.");
if (split.length == 3) {
return name("jvm_memory_" + split[0]).tag("memory_pool", split[1]).type(split[2]).build();
}
return name("jvm_memory_" + split[0].replace('-', '_')).type(split[1]).build();
}
}));
final CpuUtilisationWatch cpuWatch;
try {
cpuWatch = new CpuUtilisationWatch();
cpuWatch.start();
initArguments.getMetricRegistry().register(name("jvm_process_cpu_usage").build(), new Gauge<Float>() {
@Override
public Float getValue() {
try {
return cpuWatch.getCpuUsagePercent() * 100F;
} finally {
cpuWatch.start();
}
}
});
} catch (Exception e) {
logger.warn("Could not register cpu usage. ({})", e.getMessage());
}
final CorePlugin config = initArguments.getPlugin(CorePlugin.class);
ElasticsearchClient elasticsearchClient = config.getElasticsearchClient();
final GrafanaClient grafanaClient = config.getGrafanaClient();
if (config.isReportToGraphite()) {
elasticsearchClient.sendGrafana1DashboardAsync("grafana/Grafana1GraphiteJvmMemory.json");
elasticsearchClient.sendGrafana1DashboardAsync("grafana/Grafana1GraphiteJvmOverview.json");
}
if (config.isReportToElasticsearch()) {
elasticsearchClient.sendClassPathRessourceBulkAsync("kibana/JVM.bulk");
grafanaClient.sendGrafanaDashboardAsync("grafana/ElasticsearchJvm.json");
}
}
@Override
public void registerWidgetMetricTabPlugins(WidgetMetricTabPluginsRegistry widgetMetricTabPluginsRegistry) {
widgetMetricTabPluginsRegistry.addWidgetMetricTabPlugin("/stagemonitor/static/tabs/metrics/jvm-metrics");
}
}