summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorShireesh Anjal <shireesh@gluster.com>2011-07-19 22:04:46 +0530
committerShireesh Anjal <shireesh@gluster.com>2011-07-19 22:04:46 +0530
commit1a86dd92fc0a41f7d99ab20985acf90f28b05c2d (patch)
treeb818d49a16fed0615af3b1f2bcb08e3354ad1793 /src
parent7f3340c007bd6bb5f421373b0c7334fc8d5fd8ac (diff)
Story #38 - CPU Usage graph
Diffstat (limited to 'src')
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java26
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java36
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java23
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java52
4 files changed, 91 insertions, 46 deletions
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java
index b9fe7b31..0ee933f0 100644
--- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java
@@ -30,6 +30,7 @@ import com.gluster.storage.management.core.constants.RESTConstants;
import com.gluster.storage.management.core.model.GlusterServer;
import com.gluster.storage.management.core.model.Server;
import com.gluster.storage.management.core.model.ServerStats;
+import com.gluster.storage.management.core.model.ServerStatsRow;
import com.gluster.storage.management.core.response.GlusterServerListResponse;
import com.gluster.storage.management.core.utils.GlusterCoreUtil;
import com.sun.jersey.api.representation.Form;
@@ -84,28 +85,15 @@ public class GlusterServersClient extends AbstractClient {
deleteSubResource(serverName);
}
+ public ServerStats getCPUStats(String serverName) {
+ MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
+ queryParams.add(RESTConstants.QUERY_PARAM_TYPE, RESTConstants.STATISTICS_TYPE_CPU);
+ return fetchSubResource(serverName + "/" + RESTConstants.RESOURCE_STATISTICS, queryParams, ServerStats.class);
+ }
+
public ServerStats getAggregatedCPUStats() {
MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
queryParams.add(RESTConstants.QUERY_PARAM_TYPE, RESTConstants.STATISTICS_TYPE_CPU);
return fetchSubResource(RESTConstants.RESOURCE_STATISTICS, queryParams, ServerStats.class);
}
-
- public static void main(String[] args) {
- UsersClient usersClient = new UsersClient();
- try {
- usersClient.authenticate("gluster", "gluster");
- GlusterServersClient glusterServersClient = new GlusterServersClient(usersClient.getSecurityToken(), "cluster1");
- List<GlusterServer> glusterServers = glusterServersClient.getServers();
- for (GlusterServer server : glusterServers) {
- System.out.println(server.getName());
- }
-
- // Add server
- Server srv = new Server();
- srv.setName("server3");
- glusterServersClient.addServer(srv);
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java
index bf81b3aa..b371bb7e 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java
@@ -20,6 +20,7 @@
*/
package com.gluster.storage.management.gui.views;
+import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -40,6 +41,7 @@ import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.part.ViewPart;
import com.gluster.storage.management.client.GlusterDataModelManager;
+import com.gluster.storage.management.client.GlusterServersClient;
import com.gluster.storage.management.core.model.Alert;
import com.gluster.storage.management.core.model.Cluster;
import com.gluster.storage.management.core.model.EntityGroup;
@@ -47,6 +49,8 @@ import com.gluster.storage.management.core.model.GlusterDataModel;
import com.gluster.storage.management.core.model.GlusterServer;
import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS;
import com.gluster.storage.management.core.model.Server;
+import com.gluster.storage.management.core.model.ServerStats;
+import com.gluster.storage.management.core.model.ServerStatsRow;
import com.gluster.storage.management.core.model.TaskInfo;
import com.gluster.storage.management.core.utils.NumberUtil;
import com.gluster.storage.management.gui.IImageKeys;
@@ -229,24 +233,26 @@ public class ClusterSummaryView extends ViewPart {
toolkit.createLabel(section, "This section will be populated after at least\none server is added to the storage cloud.");
return;
}
- //toolkit.createLabel(section, "Historical CPU Usage graph aggregated across\nall servers will be displayed here.");
+
+ ServerStats stats = new GlusterServersClient().getAggregatedCPUStats();
+ List<Calendar> timestamps = new ArrayList<Calendar>();
+ List<Double> data = new ArrayList<Double>();
+ for(ServerStatsRow row : stats.getRows()) {
+ timestamps.add(new CDateTime(row.getTimestamp() * 1000));
+ // in case of CPU usage, there are three elements in usage data: user, system and total. we use total.
+ data.add(row.getUsageData().get(2));
+ }
-// Date[] timestamps = new Date[] { new Date(1310468100), new Date(1310468400), new Date(1310468700),
-// new Date(1310469000), new Date(1310469300), new Date(1310469600), new Date(1310469900),
-// new Date(1310470200), new Date(1310470500), new Date(1310470800), new Date(1310471100),
-// new Date(1310471400), new Date(1310471700), new Date(1310472000), new Date(1310472300),
-// new Date(1310472600), new Date(1310472900), new Date(1310473200), new Date(1310473500),
-// new Date(1310473800) };
- Calendar[] timestamps = new Calendar[] { new CDateTime(1000l*1310468100), new CDateTime(1000l*1310468400), new CDateTime(1000l*1310468700),
- new CDateTime(1000l*1310469000), new CDateTime(1000l*1310469300), new CDateTime(1000l*1310469600), new CDateTime(1000l*1310469900),
- new CDateTime(1000l*1310470200), new CDateTime(1000l*1310470500), new CDateTime(1000l*1310470800), new CDateTime(1000l*1310471100),
- new CDateTime(1000l*1310471400), new CDateTime(1000l*1310471700), new CDateTime(1000l*1310472000), new CDateTime(1000l*1310472300),
- new CDateTime(1000l*1310472600), new CDateTime(1000l*1310472900), new CDateTime(1000l*1310473200), new CDateTime(1000l*1310473500),
- new CDateTime(1000l*1310473800) };
+// Calendar[] timestamps = new Calendar[] { new CDateTime(1000l*1310468100), new CDateTime(1000l*1310468400), new CDateTime(1000l*1310468700),
+// new CDateTime(1000l*1310469000), new CDateTime(1000l*1310469300), new CDateTime(1000l*1310469600), new CDateTime(1000l*1310469900),
+// new CDateTime(1000l*1310470200), new CDateTime(1000l*1310470500), new CDateTime(1000l*1310470800), new CDateTime(1000l*1310471100),
+// new CDateTime(1000l*1310471400), new CDateTime(1000l*1310471700), new CDateTime(1000l*1310472000), new CDateTime(1000l*1310472300),
+// new CDateTime(1000l*1310472600), new CDateTime(1000l*1310472900), new CDateTime(1000l*1310473200), new CDateTime(1000l*1310473500),
+// new CDateTime(1000l*1310473800) };
//String[] timestampsarr = new String[] {"t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "t9", "t10", "t11", "t12", "t13", "t14", "t15", "t16", "t17", "t18", "t19", "t20"};
- Double[] values = new Double[] { 10d, 11.23d, 17.92d, 18.69d, 78.62d, 89.11d, 92.43d, 89.31d, 57.39d, 18.46d, 10.44d, 16.28d, 13.51d, 17.53d, 12.21, 20d, 21.43d, 16.45d, 14.86d, 15.27d };
- createLineChart(section, timestamps, values);
+ //Double[] values = new Double[] { 10d, 11.23d, 17.92d, 18.69d, 78.62d, 89.11d, 92.43d, 89.31d, 57.39d, 18.46d, 10.44d, 16.28d, 13.51d, 17.53d, 12.21, 20d, 21.43d, 16.45d, 14.86d, 15.27d };
+ createLineChart(section, timestamps.toArray(new Calendar[0]), data.toArray(new Double[0]));
}
private void createNetworkUsageSection() {
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java
index 50da72ff..1a89ae7e 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java
@@ -23,6 +23,7 @@ package com.gluster.storage.management.gui.views;
import java.util.ArrayList;
import java.util.List;
+import org.eclipse.birt.chart.util.CDateTime;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
@@ -42,18 +43,21 @@ import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.part.ViewPart;
import com.gluster.storage.management.client.GlusterDataModelManager;
+import com.gluster.storage.management.client.GlusterServersClient;
import com.gluster.storage.management.core.model.ClusterListener;
import com.gluster.storage.management.core.model.DefaultClusterListener;
import com.gluster.storage.management.core.model.Event;
import com.gluster.storage.management.core.model.GlusterServer;
+import com.gluster.storage.management.core.model.ServerStatsRow;
import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS;
+import com.gluster.storage.management.core.model.ServerStats;
import com.gluster.storage.management.core.utils.NumberUtil;
import com.gluster.storage.management.gui.IImageKeys;
import com.gluster.storage.management.gui.NetworkInterfaceTableLabelProvider;
import com.gluster.storage.management.gui.toolbar.GlusterToolbarManager;
import com.gluster.storage.management.gui.utils.ChartViewerComposite;
-import com.gluster.storage.management.gui.utils.ChartViewerComposite.CHART_TYPE;
import com.gluster.storage.management.gui.utils.GUIHelper;
+import com.ibm.icu.util.Calendar;
import com.richclientgui.toolbox.gauges.CoolGauge;
public class GlusterServerSummaryView extends ViewPart {
@@ -101,7 +105,7 @@ public class GlusterServerSummaryView extends ViewPart {
GlusterDataModelManager.getInstance().removeClusterListener(serverChangedListener);
}
- private void createLineChart(Composite section, String timestamps[], Double values[]) {
+ private void createLineChart(Composite section, Calendar timestamps[], Double values[]) {
ChartViewerComposite chartViewerComposite = new ChartViewerComposite(section, SWT.NONE, timestamps, values);
GridData data = new GridData(SWT.FILL, SWT.FILL, false, false);
data.widthHint = 450;
@@ -119,9 +123,18 @@ public class GlusterServerSummaryView extends ViewPart {
Composite section = guiHelper.createSection(form, toolkit, "CPU Usage (aggregated)", null, 1, false);
//toolkit.createLabel(section, "Historical CPU Usage graph aggregated across\nall servers will be displayed here.");
- String[] timestamps = new String[] {"t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "t9", "t10", "t11", "t12", "t13", "t14", "t15", "t16", "t17", "t18", "t19", "t20"};
- Double[] values = new Double[] { 10d, 11.23d, 17.92d, 18.69d, 78.62d, 89.11d, 92.43d, 20.31d, 19.63d, 18.46d, 10.44d, 16.28d, 13.51d, 17.53d, 12.21, 20d, 40d, 10d, 90d, 40d };
- createLineChart(section, timestamps, values);
+// String[] timestamps = new String[] {"t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "t9", "t10", "t11", "t12", "t13", "t14", "t15", "t16", "t17", "t18", "t19", "t20"};
+// Double[] values = new Double[] { 10d, 11.23d, 17.92d, 18.69d, 78.62d, 89.11d, 92.43d, 20.31d, 19.63d, 18.46d, 10.44d, 16.28d, 13.51d, 17.53d, 12.21, 20d, 40d, 10d, 90d, 40d };
+ ServerStats stats = new GlusterServersClient().getAggregatedCPUStats();
+ List<Calendar> timestamps = new ArrayList<Calendar>();
+ List<Double> data = new ArrayList<Double>();
+ for(ServerStatsRow row : stats.getRows()) {
+ timestamps.add(new CDateTime(row.getTimestamp() * 1000));
+ // in case of CPU usage, there are three elements in usage data: user, system and total. we use total.
+ data.add(row.getUsageData().get(2));
+ }
+
+ createLineChart(section, timestamps.toArray(new Calendar[0]), data.toArray(new Double[0]));
}
private void createSections(Composite parent) {
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java
index 65a338ea..775ca221 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java
@@ -21,6 +21,7 @@
package com.gluster.storage.management.server.utils;
import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
@@ -29,6 +30,7 @@ import java.util.List;
import javax.servlet.ServletContext;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import org.apache.log4j.Logger;
@@ -225,7 +227,7 @@ public class ServerUtil {
}
public ServerStats fetchCPUUsageData(String serverName) {
- String cpuUsageData = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?> <xport> <meta> <start>1310468100</start> <step>300</step> <end>1310471700</end> <rows>13</rows> <columns>3</columns> <legend> <entry>user</entry> <entry>system</entry> <entry>total</entry> </legend> </meta> <data> <row><t>1310468100</t><v>NaN</v><v>4.3747778209e-01</v><v>6.6128073384e-01</v></row> <row><t>1310468400</t><v>2.3387347338e-01</v><v>4.4642717442e-01</v><v>6.8030064780e-01</v></row> <row><t>1310468700</t><v>5.5043873220e+00</v><v>6.2462376636e+00</v><v>1.1750624986e+01</v></row> <row><t>1310469000</t><v>2.4350593653e+01</v><v>2.6214585217e+01</v><v>5.0565178869e+01</v></row> <row><t>1310469300</t><v>4.0786489953e+01</v><v>4.6784713828e+01</v><v>8.7571203781e+01</v></row> <row><t>1310469600</t><v>4.1459955508e+01</v><v>5.2546309044e+01</v><v>9.4006264551e+01</v></row> <row><t>1310469900</t><v>4.2312286165e+01</v><v>5.2390588332e+01</v><v>9.4702874497e+01</v></row> <row><t>1310470200</t><v>4.2603794982e+01</v><v>5.1598861493e+01</v><v>9.4202656475e+01</v></row> <row><t>1310470500</t><v>3.8238751290e+01</v><v>4.5312089966e+01</v><v>8.3550841256e+01</v></row> <row><t>1310470800</t><v>1.7949961224e+01</v><v>2.1282058418e+01</v><v>3.9232019642e+01</v></row> <row><t>1310471100</t><v>1.2330371421e-01</v><v>4.6347832868e-01</v><v>5.8678204289e-01</v></row> <row><t>1310471400</t><v>1.6313260492e-01</v><v>5.4088119561e-01</v><v>7.0401380052e-01</v></row> <row><t>1310471700</t><v>NaN</v><v>NaN</v><v>NaN</v></row> </data> </xport>";
+ String cpuUsageData = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?> <xport> <meta> <start>1310468100</start> <step>300</step> <end>1310471700</end> <rows>13</rows> <columns>3</columns> <legend> <entry>user</entry> <entry>system</entry> <entry>total</entry> </legend> </meta> <data> <row><t>1310468100</t><v>2.23802952e-1</v><v>4.3747778209e-01</v><v>6.6128073384e-01</v></row> <row><t>1310468400</t><v>2.3387347338e-01</v><v>4.4642717442e-01</v><v>6.8030064780e-01</v></row> <row><t>1310468700</t><v>5.5043873220e+00</v><v>6.2462376636e+00</v><v>1.1750624986e+01</v></row> <row><t>1310469000</t><v>2.4350593653e+01</v><v>2.6214585217e+01</v><v>5.0565178869e+01</v></row> <row><t>1310469300</t><v>4.0786489953e+01</v><v>4.6784713828e+01</v><v>8.7571203781e+01</v></row> <row><t>1310469600</t><v>4.1459955508e+01</v><v>5.2546309044e+01</v><v>9.4006264551e+01</v></row> <row><t>1310469900</t><v>4.2312286165e+01</v><v>5.2390588332e+01</v><v>9.4702874497e+01</v></row> <row><t>1310470200</t><v>4.2603794982e+01</v><v>5.1598861493e+01</v><v>9.4202656475e+01</v></row> <row><t>1310470500</t><v>3.8238751290e+01</v><v>4.5312089966e+01</v><v>8.3550841256e+01</v></row> <row><t>1310470800</t><v>1.7949961224e+01</v><v>2.1282058418e+01</v><v>3.9232019642e+01</v></row> <row><t>1310471100</t><v>1.2330371421e-01</v><v>4.6347832868e-01</v><v>5.8678204289e-01</v></row> <row><t>1310471400</t><v>1.6313260492e-01</v><v>5.4088119561e-01</v><v>7.0401380052e-01</v></row> <row><t>1310471700</t><v>NaN</v><v>NaN</v><v>NaN</v></row> </data> </xport>";
Object output = unmarshal(ServerStats.class, cpuUsageData, false);
if(output instanceof Status) {
throw new GlusterRuntimeException(((Status)output).toString());
@@ -240,6 +242,7 @@ public class ServerUtil {
if(removeOnlineServer) {
serverNames.remove(serverName);
}
+ return stats;
} catch(Exception e) {
// server might be offline - continue with next one
logger.warn("Couldn't fetch CPU stats from server [" + serverName + "]!", e);
@@ -265,21 +268,29 @@ public class ServerUtil {
}
private void aggregateCPUStats(List<String> serverNames, ServerStats aggregatedStats) {
- int[][] dataCount = new int[aggregatedStats.getMetadata().getRowCount()][aggregatedStats.getMetadata()
- .getLegend().size()];
+ if(serverNames.isEmpty()) {
+ return;
+ }
+
+ int rowCount = aggregatedStats.getMetadata().getRowCount();
+ int columnCount = aggregatedStats.getMetadata().getLegend().size();
+ int[][] dataCount = initDataCountArray(rowCount, columnCount);
for (String serverName : serverNames) {
- ServerStats serverStats;
try {
- serverStats = fetchCPUUsageData(serverName);
+ // fetch the stats and add to aggregated stats
+ addServerStats(fetchCPUUsageData(serverName), aggregatedStats, dataCount);
} catch(Exception e) {
// server might be offline - continue with next one
logger.warn("Couldn't fetch CPU stats from server [" + serverName + "]!", e);
continue;
}
- addServerStats(serverStats, aggregatedStats, dataCount);
}
+ averageAggregatedStats(aggregatedStats, dataCount);
+ }
+
+ private void averageAggregatedStats(ServerStats aggregatedStats, int[][] dataCount) {
List<ServerStatsRow> rows = aggregatedStats.getRows();
for(int rowNum = 0; rowNum < rows.size(); rowNum++) {
List<Double> data = rows.get(rowNum).getUsageData();
@@ -289,6 +300,17 @@ public class ServerUtil {
}
}
+ private int[][] initDataCountArray(int rowCount, int columnCount) {
+ int[][] dataCount = new int[rowCount][columnCount];
+ // initialize all data counts to 1
+ for(int rowNum = 0; rowNum < rowCount; rowNum++) {
+ for(int columnNum = 0; columnNum < columnCount; columnNum++) {
+ dataCount[rowNum][columnNum] = 1;
+ }
+ }
+ return dataCount;
+ }
+
/**
*
* @param statsToBeAdded
@@ -320,6 +342,22 @@ public class ServerUtil {
public static void main(String[] args) {
ServerStats stats = new ServerUtil().fetchCPUUsageData("s1");
- System.out.println(stats.getMetadata().getLegend());
+ for(ServerStatsRow row : stats.getRows()) {
+ System.out.println(row.getUsageData().get(2));
+ }
+ JAXBContext context;
+ try {
+ context = JAXBContext.newInstance(ServerStats.class);
+ Marshaller m = context.createMarshaller();
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ m.marshal(stats, out);
+ ServerStats stats1 = (ServerStats)new ServerUtil().unmarshal(ServerStats.class, out.toString(), false);
+ for(ServerStatsRow row : stats1.getRows()) {
+ System.out.println(row.getUsageData().get(2));
+ }
+ } catch (JAXBException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
}
}