analysis.io: Introduce an I/O Activity view
authorHoussem Daoud <houssemmh@gmail.com>
Tue, 29 Mar 2016 18:39:43 +0000 (14:39 -0400)
committerGenevieve Bastien <gbastien+lttng@versatic.net>
Mon, 11 Apr 2016 19:03:46 +0000 (15:03 -0400)
This view is linked to the Input/Output Analysis Module.

Change-Id: I4647540aee7ee9e78f949da9a1de0e01385e21cc
Signed-off-by: Geneviève Bastien <gbastien+lttng@versatic.net>
Signed-off-by: Houssem Daoud <houssemmh@gmail.com>
Reviewed-on: https://git.eclipse.org/r/69670
Reviewed-by: Hudson CI
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
analysis/org.eclipse.tracecompass.analysis.os.linux.core/META-INF/MANIFEST.MF
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/META-INF/MANIFEST.MF
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/plugin.properties
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/plugin.xml
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/io/diskioactivity/DiskIOActivityView.java [new file with mode: 0644]
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/io/diskioactivity/DisksIOActivityViewer.java [new file with mode: 0644]
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/io/diskioactivity/Messages.java [new file with mode: 0644]
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/io/diskioactivity/messages.properties [new file with mode: 0644]
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/io/diskioactivity/package-info.java [new file with mode: 0644]

index 7a09596bc5e684b2129a5803d5b8df9271f54657..3c306fb005832bb4908f3687be1b6fd5f468cf97 100644 (file)
@@ -31,7 +31,7 @@ Export-Package: org.eclipse.tracecompass.analysis.os.linux.core.contextswitch,
  org.eclipse.tracecompass.analysis.os.linux.core.tid,
  org.eclipse.tracecompass.analysis.os.linux.core.trace,
  org.eclipse.tracecompass.internal.analysis.os.linux.core;x-internal:=true,
- org.eclipse.tracecompass.internal.analysis.os.linux.core.inputoutput;x-friends:="org.eclipse.tracecompass.analysis.os.linux.core.tests",
+ org.eclipse.tracecompass.internal.analysis.os.linux.core.inputoutput;x-friends:="org.eclipse.tracecompass.analysis.os.linux.ui,org.eclipse.tracecompass.analysis.os.linux.core.tests",
  org.eclipse.tracecompass.internal.analysis.os.linux.core.inputoutput.handlers;x-internal:=true,
  org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel;x-friends:="org.eclipse.tracecompass.analysis.os.linux.core.tests",
  org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers;x-friends:="org.eclipse.tracecompass.analysis.os.linux.core.tests",
index f75d85bb100da11b71308d97aab88fccd27d6ad9..84c4d0125009c50f9793889e40b91085e5c34f36 100644 (file)
@@ -29,6 +29,7 @@ Export-Package: org.eclipse.tracecompass.analysis.os.linux.ui.views.controlflow,
  org.eclipse.tracecompass.internal.analysis.os.linux.ui;x-friends:="org.eclipse.tracecompass.analysis.os.linux.ui.swtbot.tests",
  org.eclipse.tracecompass.internal.analysis.os.linux.ui.actions;x-internal:=true,
  org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.controlflow;x-friends:="org.eclipse.tracecompass.analysis.os.linux.ui.swtbot.tests,org.eclipse.tracecompass.analysis.os.linux.ui.tests",
+ org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.io.diskioactivity;x-internal:=true,
  org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.kernelmemoryusage;x-internal:=true,
  org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.latency;x-friends:="org.eclipse.tracecompass.analysis.os.linux.ui.swtbot.tests",
  org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.latency.statistics;x-friends:="org.eclipse.tracecompass.analysis.os.linux.ui.swtbot.tests",
index ba96e867a21c793f60dab696cb5155af3d0e5af5..dc26cd55143dbf28157305c7e99ef89f9bd8fd17 100644 (file)
@@ -18,8 +18,10 @@ kernel.perspective.name = LTTng Kernel
 controlflow.view.name = Control Flow
 resources.view.name = Resources
 cpuusage.view.name = CPU Usage
+
 latency.view.name = System Call Latencies
 latency.scatter.view.name = System Call Latency vs Time
 latency.stats.view.name = System Call Latency Statistics
 latency.density.view.name = System Call Density
 kernelmemoryusageview.view.name = Kernel Memory Usage View
+diskioactivity.view.name = Disk I/O Activity
index c99d611ecfcdbbe7076f6f3fc5fd31f2ac1cb016..e3bcef7c9c2309c734f48207e1fd0ab30210b4c6 100644 (file)
             name="%kernelmemoryusageview.view.name"
             restorable="true">
       </view>
+      <view
+            category="org.eclipse.linuxtools.lttng2.ui.views.category"
+            class="org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.io.diskioactivity.DiskIOActivityView"
+            icon="icons/eview16/resources_view.gif"
+            id="org.eclipse.tracecompass.analysis.os.linux.views.diskioactivity"
+            name="%diskioactivity.view.name"
+            restorable="true">
+      </view>
    </extension>
    <extension
          point="org.eclipse.linuxtools.tmf.core.analysis">
                class="org.eclipse.tracecompass.analysis.os.linux.core.kernelmemoryusage.KernelMemoryAnalysisModule">
          </analysisModuleClass>
       </output>
+      <output
+            class="org.eclipse.tracecompass.tmf.ui.analysis.TmfAnalysisViewOutput"
+            id="org.eclipse.tracecompass.analysis.os.linux.views.diskioactivity">
+         <analysisModuleClass
+               class="org.eclipse.tracecompass.analysis.os.linux.core.inputoutput.InputOutputAnalysisModule">
+         </analysisModuleClass>
+      </output>
    </extension>
 </plugin>
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/io/diskioactivity/DiskIOActivityView.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/io/diskioactivity/DiskIOActivityView.java
new file mode 100644 (file)
index 0000000..7d31760
--- /dev/null
@@ -0,0 +1,38 @@
+/**********************************************************************
+ * Copyright (c) 2016 É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
+ **********************************************************************/
+
+package org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.io.diskioactivity;
+
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer;
+import org.eclipse.tracecompass.tmf.ui.views.TmfChartView;
+
+/**
+ * Main view to show the Disk IO Activity
+ *
+ * @author Houssem Daoud
+ */
+public class DiskIOActivityView extends TmfChartView {
+
+    /** ID string */
+    public static final String ID = "org.eclipse.tracecompass.analysis.os.linux.views.diskioactivity"; //$NON-NLS-1$
+
+    /**
+     * Constructor
+     */
+    public DiskIOActivityView() {
+        super(Messages.DiskIOActivityView_Title);
+    }
+
+    @Override
+    protected TmfXYChartViewer createChartViewer(@Nullable Composite parent) {
+        return new DisksIOActivityViewer(parent);
+    }
+}
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/io/diskioactivity/DisksIOActivityViewer.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/io/diskioactivity/DisksIOActivityViewer.java
new file mode 100644 (file)
index 0000000..be38180
--- /dev/null
@@ -0,0 +1,157 @@
+/**********************************************************************
+ * Copyright (c) 2016 É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
+ **********************************************************************/
+
+package org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.io.diskioactivity;
+
+import java.util.Collection;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.tracecompass.analysis.os.linux.core.inputoutput.Disk;
+import org.eclipse.tracecompass.analysis.os.linux.core.inputoutput.InputOutputAnalysisModule;
+import org.eclipse.tracecompass.analysis.os.linux.core.inputoutput.InputOutputInformationProvider;
+import org.eclipse.tracecompass.analysis.os.linux.core.inputoutput.IoOperationType;
+import org.eclipse.tracecompass.common.core.format.DataSpeedWithUnitFormat;
+import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
+import org.eclipse.tracecompass.statesystem.core.exceptions.TimeRangeException;
+import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
+import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
+import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfCommonXLineChartViewer;
+import org.swtchart.Chart;
+
+/**
+ * Disk IO Activity viewer, shows read and write bandwidth used over time.
+ *
+ * @author Houssem Daoud
+ */
+public class DisksIOActivityViewer extends TmfCommonXLineChartViewer {
+
+    // Timeout between updates in the updateData thread
+    private static final long BUILD_UPDATE_TIMEOUT = 500;
+    private static final double RESOLUTION = 0.2;
+    private static final int BYTES_PER_SECTOR = 512;
+    private static final int SECOND_TO_NANOSECOND = (int) Math.pow(10, 9);
+
+    private @Nullable InputOutputAnalysisModule fModule = null;
+
+    /**
+     * Constructor
+     *
+     * @param parent
+     *            parent view
+     */
+    public DisksIOActivityViewer(@Nullable Composite parent) {
+        super(parent, Messages.DiskIOActivityViewer_Title, Messages.DiskIOActivityViewer_XAxis, Messages.DiskIOActivityViewer_YAxis);
+        setResolution(RESOLUTION);
+        Chart chart = getSwtChart();
+        chart.getAxisSet().getYAxis(0).getTick().setFormat(new DataSpeedWithUnitFormat());
+        chart.getLegend().setPosition(SWT.LEFT);
+    }
+
+    @Override
+    protected void initializeDataSource() {
+        ITmfTrace trace = getTrace();
+        if (trace != null) {
+            InputOutputAnalysisModule module = TmfTraceUtils.getAnalysisModuleOfClass(trace, InputOutputAnalysisModule.class, InputOutputAnalysisModule.ID);
+            if (module == null) {
+                return;
+            }
+            module.schedule();
+            fModule = module;
+        }
+    }
+
+    @Override
+    protected void updateData(long start, long end, int nb, @Nullable IProgressMonitor monitor) {
+        InputOutputAnalysisModule module = fModule;
+        if (getTrace() == null || module == null) {
+            return;
+        }
+        if (!module.waitForInitialization()) {
+            return;
+        }
+        ITmfStateSystem ss = module.getStateSystem();
+        if (ss == null) {
+            return;
+        }
+
+        double[] xvalues = getXAxis(start, end, nb);
+        setXAxis(xvalues);
+
+        boolean complete = false;
+        long currentEnd = start;
+
+        while (!complete && currentEnd < end) {
+            if (monitor != null && monitor.isCanceled()) {
+                return;
+            }
+            complete = ss.waitUntilBuilt(BUILD_UPDATE_TIMEOUT);
+            currentEnd = ss.getCurrentEndTime();
+            long traceStart = getStartTime();
+            long traceEnd = getEndTime();
+            long offset = this.getTimeOffset();
+
+            Collection<Disk> disks = InputOutputInformationProvider.getDisks(module);
+
+            for (Disk disk : disks) {
+                if (!disk.hasActivity()) {
+                    continue;
+                }
+
+                String diskName = disk.getDiskName();
+
+                /* Initialize quarks and series names */
+                double[] yValuesWritten = new double[xvalues.length];
+                double[] yValuesRead = new double[xvalues.length];
+                String seriesNameWritten = new String(diskName + Messages.DisksIOActivityViewer_Write);
+                String seriesNameRead = new String(diskName + Messages.DisksIOActivityViewer_Read);
+
+                double prevX = xvalues[0];
+                long prevTime = (long) prevX + offset;
+                /*
+                 * make sure that time is in the trace range after double to
+                 * long conversion
+                 */
+                prevTime = Math.max(traceStart, prevTime);
+                prevTime = Math.min(traceEnd, prevTime);
+                long prevCountRead = disk.getSectorsAt(prevTime, IoOperationType.READ);
+                long prevCountWrite = disk.getSectorsAt(prevTime, IoOperationType.WRITE);
+                for (int i = 1; i < xvalues.length; i++) {
+                    if (monitor != null && monitor.isCanceled()) {
+                        return;
+                    }
+                    double x = xvalues[i];
+                    long time = (long) x + offset;
+                    time = Math.max(traceStart, time);
+                    time = Math.min(traceEnd, time);
+                    try {
+                        long count = disk.getSectorsAt(time, IoOperationType.WRITE);
+                        yValuesWritten[i] = (count - prevCountWrite) * BYTES_PER_SECTOR / ((double) (time - prevTime) / SECOND_TO_NANOSECOND);
+                        prevCountWrite = count;
+                        count = disk.getSectorsAt(time, IoOperationType.READ);
+                        yValuesRead[i] = (count - prevCountRead) * BYTES_PER_SECTOR / ((double) (time - prevTime) / SECOND_TO_NANOSECOND);
+                        prevCountRead = count;
+                    } catch (TimeRangeException e) {
+                        yValuesWritten[i] = 0;
+                        yValuesRead[i] = 0;
+                    }
+                    prevTime = time;
+                }
+                setSeries(seriesNameWritten, yValuesWritten);
+                setSeries(seriesNameRead, yValuesRead);
+                if (monitor != null && monitor.isCanceled()) {
+                    return;
+                }
+                updateDisplay();
+            }
+        }
+    }
+}
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/io/diskioactivity/Messages.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/io/diskioactivity/Messages.java
new file mode 100644 (file)
index 0000000..eb309cc
--- /dev/null
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2016 É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
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.io.diskioactivity;
+
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Translatable strings for the Disk I/O Activity View
+ *
+ * @author Houssem Daoud
+ */
+public class Messages extends NLS {
+    private static final String BUNDLE_NAME = "org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.io.diskioactivity.messages"; //$NON-NLS-1$
+    /** Title of the Disk I/O view */
+    public static @Nullable String DiskIOActivityView_Title;
+    /** Title of the Disk I/O activity viewer */
+    public static @Nullable String DiskIOActivityViewer_Title;
+    /** X axis caption */
+    public static @Nullable String DiskIOActivityViewer_XAxis;
+    /** Y axis caption */
+    public static @Nullable String DiskIOActivityViewer_YAxis;
+    /** Read text */
+    public static @Nullable String DisksIOActivityViewer_Read;
+    /** Write text */
+    public static @Nullable String DisksIOActivityViewer_Write;
+    static {
+        // initialize resource bundle
+        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+    }
+
+    private Messages() {
+    }
+}
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/io/diskioactivity/messages.properties b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/io/diskioactivity/messages.properties
new file mode 100644 (file)
index 0000000..d7f517a
--- /dev/null
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2016 É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
+###############################################################################
+DiskIOActivityView_Title=Disk I/O View
+DiskIOActivityViewer_Title=Disk I/O View
+DiskIOActivityViewer_XAxis=Time
+DiskIOActivityViewer_YAxis=Throughput
+DisksIOActivityViewer_Read=\ read
+DisksIOActivityViewer_Write=\ write
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/io/diskioactivity/package-info.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/io/diskioactivity/package-info.java
new file mode 100644 (file)
index 0000000..dbb6a85
--- /dev/null
@@ -0,0 +1,11 @@
+/*******************************************************************************
+ * Copyright (c) 2016 É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
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.io.diskioactivity;
This page took 0.029356 seconds and 5 git commands to generate.