TMF: Add memory usage chart for UST traces with libc events enabled
authorGeneviève Bastien <gbastien+lttng@versatic.net>
Tue, 14 Jan 2014 18:35:41 +0000 (13:35 -0500)
committerGenevieve Bastien <gbastien+lttng@versatic.net>
Fri, 7 Feb 2014 14:53:52 +0000 (09:53 -0500)
It uses the date in the memory usage state system module to display in a xy
chart the memory used by the threads of the system.

Change-Id: Ifd435c318be20b19c8c1367a431c82f0a7152ea2
Signed-off-by: Geneviève Bastien <gbastien+lttng@versatic.net>
Signed-off-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/20629
Tested-by: Hudson CI
org.eclipse.linuxtools.lttng2.ust.ui/META-INF/MANIFEST.MF
org.eclipse.linuxtools.lttng2.ust.ui/build.properties
org.eclipse.linuxtools.lttng2.ust.ui/plugin.properties
org.eclipse.linuxtools.lttng2.ust.ui/plugin.xml
org.eclipse.linuxtools.lttng2.ust.ui/src/org/eclipse/linuxtools/internal/lttng2/ust/ui/views/memusage/MemoryUsageView.java [new file with mode: 0644]
org.eclipse.linuxtools.lttng2.ust.ui/src/org/eclipse/linuxtools/internal/lttng2/ust/ui/views/memusage/MemoryUsageViewer.java [new file with mode: 0644]
org.eclipse.linuxtools.lttng2.ust.ui/src/org/eclipse/linuxtools/internal/lttng2/ust/ui/views/memusage/Messages.java [new file with mode: 0644]
org.eclipse.linuxtools.lttng2.ust.ui/src/org/eclipse/linuxtools/internal/lttng2/ust/ui/views/memusage/messages.properties [new file with mode: 0644]
org.eclipse.linuxtools.lttng2.ust.ui/src/org/eclipse/linuxtools/lttng2/ust/ui/analysis/memory/UstMemoryAnalysisModule.java

index 967e474304909046288f99325d7cbd1292dc198b..a9bb905b000d3407ffe129f66efe2a71a67f70e6 100644 (file)
@@ -12,6 +12,8 @@ Require-Bundle: org.eclipse.core.resources,
  org.eclipse.core.runtime,
  org.eclipse.ui,
  org.eclipse.linuxtools.lttng2.ust.core;bundle-version="3.0.0",
- org.eclipse.linuxtools.tmf.core;bundle-version="3.0.0"
+ org.eclipse.linuxtools.tmf.core;bundle-version="3.0.0",
+ org.eclipse.linuxtools.tmf.ui
 Export-Package: org.eclipse.linuxtools.internal.lttng2.ust.ui;x-friends:="org.eclipse.linuxtools.lttng2.ust.ui.tests",
+ org.eclipse.linuxtools.internal.lttng2.ust.ui.views.memusage;x-friends:="org.eclipse.linuxtools.lttng2.ust.ui.tests",
  org.eclipse.linuxtools.lttng2.ust.ui.analysis.memory
index 6d53168301785d46a5fdf1d6e18814eb87ddd862..1347ed5df249e2d9d253c1cc78684885e85eabc8 100644 (file)
@@ -19,3 +19,5 @@ bin.includes = META-INF/,\
                about.html,\
                plugin.properties
 src.includes = about.html
+additional.bundles = org.eclipse.jdt.annotation
+jars.extra.classpath = platform:/plugin/org.eclipse.jdt.annotation
index b5db282a8329e821e4cb17ff333e5b7c77c4b8d9..b2819377c65595de0971992efde6ac90308d5919 100644 (file)
@@ -14,4 +14,5 @@
 Bundle-Vendor = Eclipse Linux Tools
 Bundle-Name = Linux Tools LTTng Userspace Tracer Analysis UI Plug-in
 
-tracetype.type.ust = LTTng UST Trace
\ No newline at end of file
+tracetype.type.ust = LTTng UST Trace
+memoryusage.view.name = UST Memory Usage
index d73b9010a452c211d7510a802b2101e244702d70..133a5db784008ea98ac9734dba4831e526a45109 100644 (file)
             trace_type="org.eclipse.linuxtools.lttng2.ust.core.trace.LttngUstTrace">
       </type>
    </extension>
+   <extension
+         point="org.eclipse.ui.views">
+      <view
+            category="org.eclipse.linuxtools.lttng2.ui.views.category"
+            class="org.eclipse.linuxtools.internal.lttng2.ust.ui.views.memusage.MemoryUsageView"
+            id="org.eclipse.linuxtools.lttng2.ust.memoryusage"
+            name="%memoryusage.view.name"
+            restorable="true">
+      </view>
+   </extension>
    <extension
          point="org.eclipse.linuxtools.tmf.core.analysis">
       <module
diff --git a/org.eclipse.linuxtools.lttng2.ust.ui/src/org/eclipse/linuxtools/internal/lttng2/ust/ui/views/memusage/MemoryUsageView.java b/org.eclipse.linuxtools.lttng2.ust.ui/src/org/eclipse/linuxtools/internal/lttng2/ust/ui/views/memusage/MemoryUsageView.java
new file mode 100644 (file)
index 0000000..aacb49a
--- /dev/null
@@ -0,0 +1,44 @@
+/**********************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Matthew Khouzam - Initial API and implementation
+ **********************************************************************/
+
+package org.eclipse.linuxtools.internal.lttng2.ust.ui.views.memusage;
+
+import org.eclipse.linuxtools.tmf.ui.views.TmfChartView;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Memory Usage View
+ *
+ * @author Matthew Khouzam
+ */
+public class MemoryUsageView extends TmfChartView {
+
+    /** ID string */
+    public static final String ID = "org.eclipse.linuxtools.lttng2.ust.memoryusage"; //$NON-NLS-1$
+
+    /**
+     * Constructor
+     */
+    public MemoryUsageView() {
+        super(Messages.MemoryUsageView_Title);
+    }
+
+    @Override
+    public void createPartControl(Composite parent) {
+        setChartViewer( new MemoryUsageViewer(parent));
+        super.createPartControl(parent);
+    }
+
+    @Override
+    public void setFocus() {
+    }
+}
diff --git a/org.eclipse.linuxtools.lttng2.ust.ui/src/org/eclipse/linuxtools/internal/lttng2/ust/ui/views/memusage/MemoryUsageViewer.java b/org.eclipse.linuxtools.lttng2.ust.ui/src/org/eclipse/linuxtools/internal/lttng2/ust/ui/views/memusage/MemoryUsageViewer.java
new file mode 100644 (file)
index 0000000..66e75d8
--- /dev/null
@@ -0,0 +1,138 @@
+/**********************************************************************
+ * Copyright (c) 2014 Ericsson, École Polytechnique de Montréal
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Bernd Hufmann - Initial API and implementation
+ *   Geneviève Bastien - Create and use base class for XY plots
+ **********************************************************************/
+
+package org.eclipse.linuxtools.internal.lttng2.ust.ui.views.memusage;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.linuxtools.internal.lttng2.ust.core.memoryusage.UstMemoryStrings;
+import org.eclipse.linuxtools.internal.tmf.core.Activator;
+import org.eclipse.linuxtools.lttng2.ust.ui.analysis.memory.UstMemoryAnalysisModule;
+import org.eclipse.linuxtools.tmf.core.exceptions.AttributeNotFoundException;
+import org.eclipse.linuxtools.tmf.core.exceptions.StateSystemDisposedException;
+import org.eclipse.linuxtools.tmf.core.exceptions.StateValueTypeException;
+import org.eclipse.linuxtools.tmf.core.exceptions.TimeRangeException;
+import org.eclipse.linuxtools.tmf.core.statesystem.ITmfStateSystem;
+import org.eclipse.linuxtools.tmf.core.statesystem.TmfStateSystemAnalysisModule;
+import org.eclipse.linuxtools.tmf.core.statevalue.ITmfStateValue;
+import org.eclipse.linuxtools.tmf.ui.viewers.xycharts.linecharts.TmfCommonXLineChartViewer;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Memory usage view
+ *
+ * @author Matthew Khouzam
+ */
+@SuppressWarnings("restriction")
+public class MemoryUsageViewer extends TmfCommonXLineChartViewer {
+
+    private TmfStateSystemAnalysisModule fModule = null;
+
+    private final Map<Integer, double[]> fYValues = new HashMap<>();
+    private final Map<Integer, Integer> fMemoryQuarks = new HashMap<>();
+    private final Map<Integer, String> fSeriesName = new HashMap<>();
+
+    private static final int BYTES_TO_KB = 1024;
+
+    /**
+     * Constructor
+     *
+     * @param parent
+     *            parent view
+     */
+    public MemoryUsageViewer(Composite parent) {
+        super(parent, Messages.MemoryUsageViewer_Title, Messages.MemoryUsageViewer_XAxis, Messages.MemoryUsageViewer_YAxis);
+    }
+
+    @Override
+    protected void initializeDataSource() {
+        if (getTrace() != null) {
+            fModule = getTrace().getAnalysisModuleOfClass(TmfStateSystemAnalysisModule.class, UstMemoryAnalysisModule.ID);
+            if (fModule == null) {
+                return;
+            }
+            fModule.schedule();
+        }
+    }
+
+    @Override
+    protected void updateData(long start, long end, int nb) {
+        try {
+            if (getTrace() == null || fModule == null) {
+                return;
+            }
+            ITmfStateSystem ss = fModule.getStateSystem();
+            /* Don't wait for the module completion, when it's ready, we'll know */
+            if (ss == null) {
+                return;
+            }
+            double[] xvalues = getXAxis(start, end, nb);
+            setXAxis(xvalues);
+            List<Integer> tidQuarks = ss.getSubAttributes(-1, false);
+            long traceStart = getStartTime();
+            long traceEnd = getEndTime();
+            long offset = this.getTimeOffset();
+
+            /* Initialize quarks and series names */
+            for (int quark : tidQuarks) {
+                fYValues.put(quark, new double[xvalues.length]);
+                fMemoryQuarks.put(quark, ss.getQuarkRelative(quark, UstMemoryStrings.UST_MEMORY_MEMORY_ATTRIBUTE));
+                int procNameQuark = ss.getQuarkRelative(quark, UstMemoryStrings.UST_MEMORY_PROCNAME_ATTRIBUTE);
+                try {
+                    ITmfStateValue procnameValue = ss.querySingleState(start, procNameQuark).getStateValue();
+                    String procname = new String();
+                    if (!procnameValue.isNull()) {
+                        procname = procnameValue.unboxStr();
+                    }
+                    fSeriesName.put(quark, new String(procname + ' ' + '(' + ss.getAttributeName(quark) + ')').trim());
+                } catch (TimeRangeException e) {
+                    fSeriesName.put(quark, '(' + ss.getAttributeName(quark) + ')');
+                }
+            }
+
+            /*
+             * TODO: It should only show active threads in the time range. If a
+             * tid does not have any memory value (only 1 interval in the time
+             * range with value null or 0), then its series should not be
+             * displayed.
+             */
+            double yvalue = 0.0;
+            for (int i = 0; i < xvalues.length; i++) {
+                double x = xvalues[i];
+                long time = (long) x + offset;
+                // make sure that time is in the trace range after double to
+                // long conversion
+                time = time < traceStart ? traceStart : time;
+                time = time > traceEnd ? traceEnd : time;
+
+                for (int quark : tidQuarks) {
+                    try {
+                        yvalue = ss.querySingleState(time, fMemoryQuarks.get(quark)).getStateValue().unboxLong() / BYTES_TO_KB;
+                        fYValues.get(quark)[i] = yvalue;
+                    } catch (TimeRangeException e) {
+                        fYValues.get(quark)[i] = 0;
+                    }
+                }
+            }
+            for (int quark : tidQuarks) {
+                setSeries(fSeriesName.get(quark), fYValues.get(quark));
+            }
+            updateDisplay();
+        } catch (AttributeNotFoundException | StateValueTypeException | StateSystemDisposedException e) {
+            Activator.logError("Error updating the data of the Memory usage view", e); //$NON-NLS-1$
+        }
+    }
+
+}
diff --git a/org.eclipse.linuxtools.lttng2.ust.ui/src/org/eclipse/linuxtools/internal/lttng2/ust/ui/views/memusage/Messages.java b/org.eclipse.linuxtools.lttng2.ust.ui/src/org/eclipse/linuxtools/internal/lttng2/ust/ui/views/memusage/Messages.java
new file mode 100644 (file)
index 0000000..29a4bbf
--- /dev/null
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2014 École Polytechnique de Montréal
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Geneviève Bastien - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.lttng2.ust.ui.views.memusage;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Translatable strings for the ust memory usage view
+ *
+ * @author Geneviève Bastien
+ */
+public class Messages extends NLS {
+    private static final String BUNDLE_NAME = "org.eclipse.linuxtools.internal.lttng2.ust.ui.views.memusage.messages"; //$NON-NLS-1$
+    /** Title of the memory usage xy view */
+    public static String MemoryUsageView_Title;
+
+    /** Title of the memory viewer */
+    public static String MemoryUsageViewer_Title;
+    /** X axis caption */
+    public static String MemoryUsageViewer_XAxis;
+    /** Y axis caption */
+    public static String MemoryUsageViewer_YAxis;
+    static {
+        // initialize resource bundle
+        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+    }
+
+    private Messages() {
+    }
+}
diff --git a/org.eclipse.linuxtools.lttng2.ust.ui/src/org/eclipse/linuxtools/internal/lttng2/ust/ui/views/memusage/messages.properties b/org.eclipse.linuxtools.lttng2.ust.ui/src/org/eclipse/linuxtools/internal/lttng2/ust/ui/views/memusage/messages.properties
new file mode 100644 (file)
index 0000000..273c625
--- /dev/null
@@ -0,0 +1,4 @@
+MemoryUsageView_Title=Memory Usage
+MemoryUsageViewer_Title=Memory Allocation vs Time
+MemoryUsageViewer_XAxis=Time
+MemoryUsageViewer_YAxis=Usage (KB)
index 5663a0b15b6765a061e0fc0db1b1fd790d870782..e4f685e225e355fb2710e07d0dd9722cd650a9ae 100644 (file)
 package org.eclipse.linuxtools.lttng2.ust.ui.analysis.memory;
 
 import org.eclipse.linuxtools.internal.lttng2.ust.core.memoryusage.MemoryUsageStateProvider;
+import org.eclipse.linuxtools.internal.lttng2.ust.ui.views.memusage.MemoryUsageView;
 import org.eclipse.linuxtools.lttng2.ust.core.trace.LttngUstTrace;
 import org.eclipse.linuxtools.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.linuxtools.tmf.core.statesystem.ITmfStateProvider;
 import org.eclipse.linuxtools.tmf.core.statesystem.TmfStateSystemAnalysisModule;
 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
+import org.eclipse.linuxtools.tmf.ui.analysis.TmfAnalysisViewOutput;
 
 /**
  * This analysis build a state system from the libc memory instrumentation on a
@@ -38,6 +40,7 @@ public class UstMemoryAnalysisModule extends TmfStateSystemAnalysisModule {
      */
     public UstMemoryAnalysisModule() {
         super();
+        registerOutput(new TmfAnalysisViewOutput(MemoryUsageView.ID));
     }
 
     @Override
This page took 0.029446 seconds and 5 git commands to generate.