[libvirt] [java] [PATCH 2/2] Edits to getCPUStats bindings

Pasquale.phate867 at gmail.com Pasquale.phate867 at gmail.com
Tue Apr 15 09:48:29 UTC 2014


From: Pasquale Di Rienzo <phate867 at gmail.com>

-fixed some bindings
-reworked the CPUStat class introducing a CPUStats class which
encaplulates an HashMap and is more user friendly.
-added a convenience method Connection.getOverallStats() for retrieving
overall stats, instead of passing -1 as cpu number for
Connection.getCPUStats(int cpunum)
---
 src/main/java/org/libvirt/CPUStat.java             | 57 --------------
 src/main/java/org/libvirt/CPUStats.java            | 92 ++++++++++++++++++++++
 src/main/java/org/libvirt/Connect.java             | 62 ++++++++-------
 src/main/java/org/libvirt/jna/Libvirt.java         |  6 +-
 src/main/java/org/libvirt/jna/virNodeCPUStats.java | 10 ++-
 5 files changed, 133 insertions(+), 94 deletions(-)
 delete mode 100644 src/main/java/org/libvirt/CPUStat.java
 create mode 100644 src/main/java/org/libvirt/CPUStats.java

diff --git a/src/main/java/org/libvirt/CPUStat.java b/src/main/java/org/libvirt/CPUStat.java
deleted file mode 100644
index 527049c..0000000
--- a/src/main/java/org/libvirt/CPUStat.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.libvirt;
-
-import java.nio.charset.Charset;
-import org.libvirt.jna.virNodeCPUStats;
-import org.libvirt.jna.virTypedParameter;
-
-/**
- * This class holds a cpu time.
- * The tag attribute is a string of either "kernel","user","idle","iowait"
- * while the value attribute is the actual time value
- * @author Pasquale Di Rienzo
- *
- */
-public class CPUStat {
-	public String tag;
-    public long value;
-    
-    private String createStringFromBytes(byte[] b){
-    	Charset ch = Charset.forName("UTF-8");
-    	int i = 0;
-    	while ((i<b.length) && (b[i]!=0))	
-    		i++;
-    	
-    	return new String(b,0,i,ch);
-    }
-    
-    public CPUStat(virNodeCPUStats stat){
-    	tag = createStringFromBytes(stat.field);
-    	value = stat.value.longValue();
-    }
-    
-    public CPUStat(virTypedParameter stat){
-    	tag = createStringFromBytes(stat.field);
-		value = stat.value.l;
-    }
-
-    public String getTag() {
-        return tag;
-    }
-
-    public long getValue() {
-        return value;
-    }
-
-    public void setTag(String tag) {
-        this.tag = tag;
-    }
-
-    public void setValue(long val) {
-        this.value = val;
-    }
-
-    @Override
-    public String toString() {
-        return String.format("tag:%s%nval:%d%n", tag, value);
-    }
-}
diff --git a/src/main/java/org/libvirt/CPUStats.java b/src/main/java/org/libvirt/CPUStats.java
new file mode 100644
index 0000000..71e3b33
--- /dev/null
+++ b/src/main/java/org/libvirt/CPUStats.java
@@ -0,0 +1,92 @@
+package org.libvirt;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.libvirt.jna.virNodeCPUStats;
+
+import com.sun.jna.Native;
+
+/**
+ * This class holds a cpu time.
+ * The tag attribute is a string of either "kernel","user","idle","iowait"
+ * while the value attribute is the actual time value
+ * @author Pasquale Di Rienzo
+ *
+ */
+public class CPUStats {
+    public enum Type {kernel, user, idle, iowait, intr, utilization};
+    private HashMap<Type,Long> values;
+	
+	CPUStats(){
+		values = new HashMap<Type,Long>();
+	}
+	
+	void putStat(virNodeCPUStats stat){
+		Type t = Type.valueOf(Native.toString(stat.field, "UTF-8"));
+		values.put(t, stat.value);
+	}
+	
+	/**
+	 * @return the kernel time if present, null otherwise
+	 */
+	public Long getKernelTime(){
+		return values.get(Type.kernel);
+	}
+	
+	/**
+	 * @return the user time if present, null otherwise
+	 */
+	public Long getUserTime(){
+		return values.get(Type.user);
+	}
+	
+	/**
+	 * @return the idle time if present, null otherwise
+	 */
+	public Long getIdleTime(){
+		return values.get(Type.idle);
+	}
+	
+	/**
+	 * @return the I/O time if present, null otherwise
+	 */
+	public Long getIoTime(){
+		return values.get(Type.iowait);
+	}
+	
+	/**
+	 * @return the intr time if present, null otherwise
+	 */
+    public Long getIntrTime(){
+        return values.get(Type.intr);
+    }
+	
+	/**
+	 * @return the utilization time if present, null otherwise
+	 */
+    public Long getUtilizationTime(){
+        return values.get(Type.utilization);
+    }
+	
+	/**
+	 * Gets a generic time stat, good for iterations over the Type enum. If you need
+	 * a specific cpu time just use the convenience methods
+	 * 
+	 * @param stat
+	 * @return the time stat corresponding to the passed type, null otherwise
+	 */
+    public Long getCpuTimeStat(Type stat){
+	    return values.get(stat);
+    }
+
+    @Override
+    public String toString() {
+    	StringBuilder sb = new StringBuilder();
+    	for(Map.Entry<Type, Long> entry : values.entrySet()){
+    		sb.append(String.format("tag:%s%nval:%d%n", entry.getKey(), entry.getValue()));
+    	}
+    	
+    	return sb.toString();
+    }
+}
diff --git a/src/main/java/org/libvirt/Connect.java b/src/main/java/org/libvirt/Connect.java
index d8a4ce2..e2eb9d3 100644
--- a/src/main/java/org/libvirt/Connect.java
+++ b/src/main/java/org/libvirt/Connect.java
@@ -3,6 +3,7 @@ package org.libvirt;
 import java.util.UUID;
 
 import org.libvirt.CPUStat;
+import org.libvirt.CPUStats;
 import org.libvirt.LibvirtException;
 import org.libvirt.jna.ConnectionPointer;
 import org.libvirt.jna.DevicePointer;
@@ -219,46 +220,47 @@ public class Connect {
      * 
      * Note that not all these stats are granted to be retrieved.
      *  
-     * @param the number of the cpu you want to retrieve stats from.
-     * passing -1 will make this function retrieve a mean value
-     * from all cpus the system has. 
+     * @param the number of the cpu you want to retrieve stats from. On a single core cpu pass 0
      * 
-     * @param some flags
      * @return a cpustat object for each cpu
      * @throws LibvirtException
      */
-    public CPUStat[] getCPUStats(int cpuNumber,long flags) throws LibvirtException{
-    	CPUStat[] stats = null;
-    	
-    	IntByReference nParams = new IntByReference();
-    	
+    public CPUStats getCPUStats(int cpuNumber) throws LibvirtException{
+        CPUStats stats = null;
+        IntByReference nParams = new IntByReference();
+        
     	//according to libvirt reference you call this function once passing
-    	//null as param paramether to get the actual stats (kernel,user,io,idle) number into the 
+    	//null as param parameter to get the actual stats (kernel,user,io,idle) number into the 
     	//nParams reference. Generally this number would be 4, but some systems
-    	//may not give all 4 times, so it is always good to call it.
-    	int result = libvirt.virNodeGetCPUStats(
-    			VCP, cpuNumber, null, nParams, flags);
+    	//may not give all 4 times, so it is always good to call it. 	
+        int result = libvirt.virNodeGetCPUStats(VCP, cpuNumber, null, nParams, 0);
+        processError(result);
     	
-    	processError(result);
+        //this time we create an array to fit the number of parameters
+        virNodeCPUStats[] params = new virNodeCPUStats[nParams.getValue()];
     	
-    	if(result == 0){//dunno if this check is actually needed
-    		
-    		//this time we create an array to fit the number of paramethers
-    		virNodeCPUStats[] params = new virNodeCPUStats[nParams.getValue()];
-    		//and we pass it to the function
-    		result = libvirt.virNodeGetCPUStats(VCP, cpuNumber , params, nParams, flags);
-    		processError(result);
+    	//and we pass it to the function
+        result = libvirt.virNodeGetCPUStats(VCP, cpuNumber , params, nParams, 0);
+        processError(result);
     		
-    		//finally we parse the result in an user friendly class which does
-    		//not expose libvirt's internal paramethers
-    		if(result >= 0){
-    			stats = new CPUStat[params.length];
-    			for(int i=0;i<params.length;i++)
-					stats[i] = new CPUStat(params[i]);
-    		}	
-    	}
+        //finally we parse the result in an user friendly class which does
+        //not expose libvirt's internal parameters
+        stats = new CPUStats();
+        for( int i=0; i<params.length; i++ )
+		    stats.putStat(params[i]);
     	
-    	return stats;	
+        return stats;	
+    }
+    
+    /**
+     * For a multiprocessor node returns a CPUStats object containing a mean value
+     * among each cpu, for each cpu time
+     * 
+     * @return a CPUStat object containing a mean value for each cpu time
+     * @throws LibvirtException
+     */
+    public CPUStats getTotalCPUStatistics() throws LibvirtException{
+    	return getCPUStats(-1);
     }
 
     /**
diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java
index 658299f..05c1b3f 100644
--- a/src/main/java/org/libvirt/jna/Libvirt.java
+++ b/src/main/java/org/libvirt/jna/Libvirt.java
@@ -106,7 +106,8 @@ public interface Libvirt extends Library {
     public static int VIR_UUID_BUFLEN = 16;
     public static int VIR_UUID_STRING_BUFLEN = (36 + 1);
     public static int VIR_DOMAIN_SCHED_FIELD_LENGTH = 80;
-
+    public static int NODE_CPU_STATS_FIELD_LENGTH = 80;
+    
     // Connection Functions
     String virConnectBaselineCPU(ConnectionPointer virConnectPtr, String[] xmlCPUs, int ncpus, int flags);
 
@@ -270,8 +271,7 @@ public interface Libvirt extends Library {
     int virNetworkUndefine(NetworkPointer virConnectPtr);
 
     // Node functions
-    int virNodeGetCPUStats(ConnectionPointer virConnectPtr, int cpuNum,
-    		virNodeCPUStats[] stats,IntByReference nparams, long flags);
+    int virNodeGetCPUStats(ConnectionPointer virConnectPtr, int cpuNum, virNodeCPUStats[] stats, IntByReference nparams, int flags);
     int virNodeGetInfo(ConnectionPointer virConnectPtr, virNodeInfo virNodeInfo);
     int virNodeGetCellsFreeMemory(ConnectionPointer virConnectPtr, LongByReference freeMems, int startCell,
             int maxCells);
diff --git a/src/main/java/org/libvirt/jna/virNodeCPUStats.java b/src/main/java/org/libvirt/jna/virNodeCPUStats.java
index a8f2dca..7b128d5 100644
--- a/src/main/java/org/libvirt/jna/virNodeCPUStats.java
+++ b/src/main/java/org/libvirt/jna/virNodeCPUStats.java
@@ -3,17 +3,19 @@ package org.libvirt.jna;
 import java.util.Arrays;
 import java.util.List;
 
+import org.libvirt.jna.Libvirt;
+
 import com.sun.jna.NativeLong;
 import com.sun.jna.Structure;
 
 public class virNodeCPUStats extends Structure{
-	public byte[] field = new byte[80];
-    public NativeLong value ;
+    public byte[] field = new byte[Libvirt.NODE_CPU_STATS_FIELD_LENGTH];
+    public long value ;
 
-    private static final List fields = Arrays.asList( "field", "value");
+    private static final List<String> fields = Arrays.asList( "field", "value");
 
     @Override
-    protected List getFieldOrder() {
+    protected List<String> getFieldOrder() {
         return fields;
     }
 }
-- 
1.8.3.2




More information about the libvir-list mailing list