From 974f43af025e611888eddfde1812abe9c13ea121 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Blu=CC=88mke?= <lbl@informatik.uni-kiel.de>
Date: Fri, 8 Apr 2016 11:54:48 +0200
Subject: [PATCH] Migration of CPUUtilizationFilter from Kieker FilterPlugin to
 TeeTime Filter

---
 .../sink/CPUUtilizationDisplayFilter.java     | 132 ++++++++++++++++++
 1 file changed, 132 insertions(+)
 create mode 100644 src/main/java/kieker/analysis/plugin/filter/sink/CPUUtilizationDisplayFilter.java

diff --git a/src/main/java/kieker/analysis/plugin/filter/sink/CPUUtilizationDisplayFilter.java b/src/main/java/kieker/analysis/plugin/filter/sink/CPUUtilizationDisplayFilter.java
new file mode 100644
index 00000000..7db39869
--- /dev/null
+++ b/src/main/java/kieker/analysis/plugin/filter/sink/CPUUtilizationDisplayFilter.java
@@ -0,0 +1,132 @@
+/***************************************************************************
+ * Copyright 2015 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+
+package kieker.analysis.plugin.filter.sink;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
+import kieker.analysis.IProjectContext;
+import kieker.analysis.display.MeterGauge;
+import kieker.analysis.display.XYPlot;
+import kieker.analysis.display.annotation.Display;
+import kieker.analysis.plugin.annotation.Plugin;
+import kieker.analysis.plugin.annotation.Property;
+import kieker.analysis.plugin.filter.AbstractKiekerFilter;
+import kieker.common.configuration.Configuration;
+import kieker.common.record.system.CPUUtilizationRecord;
+
+/**
+ * This is a filter which accepts {@link CPUUtilizationRecord} instances and provides different views to visualize them.
+ *
+ * @author Bjoern Weissenfels, Nils Christian Ehmke
+ *
+ * @since 1.8
+ */
+@Plugin(configuration = {
+	@Property(name = CPUUtilizationDisplayFilter.CONFIG_PROPERTY_NAME_NUMBER_OF_ENTRIES, defaultValue = CPUUtilizationDisplayFilter.CONFIG_PROPERTY_VALUE_NUMBER_OF_ENTRIES, description = "Sets the number of max plot entries per cpu"),
+	@Property(name = CPUUtilizationDisplayFilter.CONFIG_PROPERTY_NAME_DISPLAY_WARNING_INTERVALS, defaultValue = CPUUtilizationDisplayFilter.CONFIG_PROPERTY_VALUE_DISPLAY_WARNING_INTERVALS) })
+@SuppressWarnings("rawtypes")
+public class CPUUtilizationDisplayFilter extends AbstractKiekerFilter {
+
+	public static final String INPUT_PORT_NAME_EVENTS = "inputEvents";
+
+	public static final String CONFIG_PROPERTY_NAME_NUMBER_OF_ENTRIES = "numberOfEntries";
+	public static final String CONFIG_PROPERTY_VALUE_NUMBER_OF_ENTRIES = "100";
+
+	public static final String CONFIG_PROPERTY_NAME_DISPLAY_WARNING_INTERVALS = "displayWarningIntervals";
+	public static final String CONFIG_PROPERTY_VALUE_DISPLAY_WARNING_INTERVALS = "70|90|100";
+
+	private static final String TOTAL_UTILIZATION = "totalUtilization";
+	private static final String IDLE = "idle";
+	private static final String IRQ = "irq";
+	private static final String NICE = "nice";
+	private static final String SYSTEM = "system";
+	private static final String USER = "user";
+
+	private final MeterGauge meterGauge;
+	private final XYPlot xyplot;
+
+	private final int numberOfEntries;
+	private final Number[] warningIntervals;
+
+	public CPUUtilizationDisplayFilter(final Configuration configuration, final IProjectContext projectContext) {
+		super(configuration, projectContext);
+
+		// Read the configuration
+		this.numberOfEntries = configuration.getIntProperty(CONFIG_PROPERTY_NAME_NUMBER_OF_ENTRIES);
+
+		final String[] warningIntervalsAsString = configuration.getStringArrayProperty(CONFIG_PROPERTY_NAME_DISPLAY_WARNING_INTERVALS);
+		this.warningIntervals = new Number[warningIntervalsAsString.length];
+		for (int i = 0; i < warningIntervalsAsString.length; i++) {
+			this.warningIntervals[i] = Long.parseLong(warningIntervalsAsString[i]);
+		}
+
+		// Create the display objects
+		this.meterGauge = new MeterGauge();
+		this.xyplot = new XYPlot(this.numberOfEntries);
+	}
+
+	@Override
+	protected void execute(final Object record) {
+		if (record instanceof CPUUtilizationRecord) {
+			this.updateDisplays((CPUUtilizationRecord) record);
+		} else {
+			throw new IllegalArgumentException("Argument must be of type CPUUtilizationRecord.");
+		}
+
+	}
+
+	private void updateDisplays(final CPUUtilizationRecord record) {
+		// Calculate the minutes and seconds of the logging timestamp of the record
+		final Date date = new Date(TimeUnit.MILLISECONDS.convert(record.getLoggingTimestamp(), super.recordsTimeUnitFromProjectContext));
+		final String minutesAndSeconds = date.toString().substring(14, 19);
+
+		final String id = record.getHostname() + " - " + record.getCpuID();
+
+		this.meterGauge.setIntervals(id, Arrays.asList(this.warningIntervals), Arrays.asList("66cc66", "E7E658", "cc6666"));
+		this.meterGauge.setValue(id, record.getTotalUtilization() * 100);
+
+		this.xyplot.setEntry(id + " - " + CPUUtilizationDisplayFilter.TOTAL_UTILIZATION, minutesAndSeconds, record.getTotalUtilization() * 100);
+		this.xyplot.setEntry(id + " - " + CPUUtilizationDisplayFilter.IDLE, minutesAndSeconds, record.getIdle() * 100);
+		this.xyplot.setEntry(id + " - " + CPUUtilizationDisplayFilter.IRQ, minutesAndSeconds, record.getIrq() * 100);
+		this.xyplot.setEntry(id + " - " + CPUUtilizationDisplayFilter.NICE, minutesAndSeconds, record.getNice() * 100);
+		this.xyplot.setEntry(id + " - " + CPUUtilizationDisplayFilter.SYSTEM, minutesAndSeconds, record.getSystem() * 100);
+		this.xyplot.setEntry(id + " - " + CPUUtilizationDisplayFilter.USER, minutesAndSeconds, record.getUser() * 100);
+	}
+
+	@Display(name = "Meter Gauge CPU total utilization Display")
+	public MeterGauge getMeterGauge() {
+		return this.meterGauge;
+	}
+
+	@Display(name = "XYPlot CPU utilization Display")
+	public XYPlot getXYPlot() {
+		return this.xyplot;
+	}
+
+	@Override
+	public Configuration getCurrentConfiguration() {
+		final Configuration configuration = new Configuration();
+
+		configuration.setProperty(CONFIG_PROPERTY_NAME_NUMBER_OF_ENTRIES, String.valueOf(this.numberOfEntries));
+		configuration.setProperty(CONFIG_PROPERTY_NAME_DISPLAY_WARNING_INTERVALS, Configuration.toProperty(this.warningIntervals));
+
+		return configuration;
+	}
+
+}
-- 
GitLab