Skip to content

Commit

Permalink
linux.core: Add priority statistics data provider factory
Browse files Browse the repository at this point in the history
This commit creates a new data provider for the new priority statistics
analysis by extending the
AbstractSegmentStoreStatisticsDataProviderFactory class. The data
provider has a private class called PriorityStatisticsAnalysis
which specifies that entries for the priority statistics
analysis should be grouped by priority of each segment.

[Added] Data provider factory for priority statistics analysis

Change-Id: Id169d66c67337f653a7b503b456827db994b4f47
Signed-off-by: Hoang Thuan Pham <hoang.pham@calian.ca>
Reviewed-on: https://git.eclipse.org/r/c/tracecompass/org.eclipse.tracecompass/+/204774
Reviewed-by: Patrick Tasse <patrick.tasse@gmail.com>
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Tested-by: Trace Compass Bot <tracecompass-bot@eclipse.org>
Tested-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
  • Loading branch information
hoangphamEclipse authored and PatrickTasse committed Oct 13, 2023
1 parent 2eeea8d commit 1bbe313
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 0 deletions.
Expand Up @@ -148,4 +148,11 @@
id="org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider">
</dataProviderFactory>
</extension>
<extension
point="org.eclipse.tracecompass.tmf.core.dataprovider">
<dataProviderFactory
class="org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProviderFactory"
id="org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProvider">
</dataProviderFactory>
</extension>
</plugin>
Expand Up @@ -39,6 +39,23 @@ public class Messages extends NLS {
*/
public static @Nullable String PriorityThreadNameStatisticsAnalysis_segmentType;

/**
* Name of the Priority statistics data provider
*/
public static @Nullable String PriorityStatisticsDataProviderFactory_AnalysisName;
/**
* Title of the Priority statistics data provider
*/
public static @Nullable String PriorityStatisticsDataProviderFactory_title;
/**
* Description of the Priority statistics data provider
*/
public static @Nullable String PriorityStatisticsDataProviderFactory_description;
/**
* The segment type format of the PriorityStatisticsAnalysis
*/
public static @Nullable String PriorityStatisticsAnalysis_segmentType;

static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
Expand Down
@@ -0,0 +1,91 @@
/**********************************************************************
* Copyright (c) 2023 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/

package org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore;

import java.util.Objects;

import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.osgi.util.NLS;
import org.eclipse.tracecompass.analysis.timing.core.segmentstore.GenericSegmentStatisticsAnalysis;
import org.eclipse.tracecompass.analysis.timing.core.segmentstore.statistics.AbstractSegmentStatisticsAnalysis;
import org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.AbstractSegmentStoreStatisticsDataProviderFactory;
import org.eclipse.tracecompass.segmentstore.core.ISegment;
import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
import org.eclipse.tracecompass.tmf.core.component.DataProviderConstants;
import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor.ProviderType;
import org.eclipse.tracecompass.tmf.core.model.DataProviderDescriptor;
import org.eclipse.tracecompass.tmf.core.model.DataProviderDescriptor.Builder;

/**
* A data provider factory for Priority Statistics analysis.
*
* @author Hoang Thuan Pham
*/
public class PriorityStatisticsDataProviderFactory extends AbstractSegmentStoreStatisticsDataProviderFactory {
/**
* The data provider ID
*/
public static final String DATA_PROVIDER_ID = "org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProvider"; //$NON-NLS-1$

/**
* A statistics analysis that groups entries based on the priority of each segment.
*/
private final class PriorityStatisticsAnalysis extends GenericSegmentStatisticsAnalysis {
/**
* Constructor
*
* @param secondaryId The ID of the analysis which generates the segment store
*/
private PriorityStatisticsAnalysis(String secondaryId) {
super(secondaryId);
}

@Override
protected @Nullable String getSegmentType(@NonNull ISegment segment) {
if (segment instanceof IPrioritySegment) {
// The segment type is the priority of the segment
return NLS.bind(Messages.PriorityStatisticsAnalysis_segmentType, ((IPrioritySegment) segment).getPriority());
}
return null;
}
}

@Override
protected AbstractSegmentStatisticsAnalysis getAnalysis(String analysisId) {
/**
* Return the {@link AbstractSegmentStatisticsAnalysis} that has the new
* getSegmentType logic to bind it to the data provider.
*/
return new PriorityStatisticsAnalysis(analysisId);
}

@Override
protected String getDataProviderId() {
return DATA_PROVIDER_ID;
}

@Override
protected void setStatisticsAnalysisModuleName(AbstractSegmentStatisticsAnalysis statisticsAnalysisModule, IAnalysisModule baseAnalysisModule) {
statisticsAnalysisModule.setName(Objects.requireNonNull(NLS.bind(Messages.PriorityStatisticsDataProviderFactory_AnalysisName, baseAnalysisModule.getName())));
}

@Override
protected Builder getDataProviderDescriptor(IAnalysisModule analysis) {
DataProviderDescriptor.Builder builder = new DataProviderDescriptor.Builder();
builder.setId(DATA_PROVIDER_ID + DataProviderConstants.ID_SEPARATOR + analysis.getId())
.setName(Objects.requireNonNull(NLS.bind(Messages.PriorityStatisticsDataProviderFactory_title, analysis.getName())))
.setDescription(Objects.requireNonNull(NLS.bind(Messages.PriorityStatisticsDataProviderFactory_description, analysis.getHelpText())))
.setProviderType(ProviderType.DATA_TREE);
return builder;
}
}
Expand Up @@ -13,3 +13,7 @@ PriorityThreadNameStatisticsDataProviderFactory_AnalysisName=Priority/Thread nam
PriorityThreadNameStatisticsDataProviderFactory_title={0} - Priority/Thread name Statistics Table
PriorityThreadNameStatisticsDataProviderFactory_description=Show Priority/Thread name Statistics Table provided by {0}
PriorityThreadNameStatisticsAnalysis_segmentType=Prio: {0}; {1}
PriorityStatisticsDataProviderFactory_AnalysisName=Priority Statistics for {0}
PriorityStatisticsDataProviderFactory_title={0} - Priority Statistics Table
PriorityStatisticsDataProviderFactory_description=Show Priority Statistics Table provided by {0}
PriorityStatisticsAnalysis_segmentType=Prio: {0}
Expand Up @@ -104,6 +104,12 @@ public class DataProviderManagerTest {
.setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider:lttng.analysis.futex");
EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build());
builder = new DataProviderDescriptor.Builder();
builder.setName("Futex Contention Analysis - Priority Statistics Table")
.setDescription("Show Priority Statistics Table provided by Analysis module: Futex Contention Analysis")
.setProviderType(ProviderType.DATA_TREE)
.setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProvider:lttng.analysis.futex");
EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build());
builder = new DataProviderDescriptor.Builder();
builder.setName("Histogram")
.setDescription("Show a histogram of number of events to time for a trace")
.setProviderType(ProviderType.TREE_TIME_XY)
Expand Down Expand Up @@ -140,6 +146,12 @@ public class DataProviderManagerTest {
.setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider:lttng.analysis.irq");
EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build());
builder = new DataProviderDescriptor.Builder();
builder.setName("IRQ Analysis - Priority Statistics Table")
.setDescription("Show Priority Statistics Table provided by Analysis module: IRQ Analysis")
.setProviderType(ProviderType.DATA_TREE)
.setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProvider:lttng.analysis.irq");
EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build());
builder = new DataProviderDescriptor.Builder();
builder.setName("Memory Usage")
.setDescription("Show the relative memory usage in the Linux kernel by process, can be filtered to show only the processes which were active on a time range")
.setProviderType(ProviderType.TREE_TIME_XY)
Expand Down Expand Up @@ -182,6 +194,12 @@ public class DataProviderManagerTest {
.setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider:org.eclipse.tracecompass.analysis.os.linux.latency.syscall");
EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build());
builder = new DataProviderDescriptor.Builder();
builder.setName("System Call Latency - Priority Statistics Table")
.setDescription("Show Priority Statistics Table provided by Analysis module: System Call Latency")
.setProviderType(ProviderType.DATA_TREE)
.setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProvider:org.eclipse.tracecompass.analysis.os.linux.latency.syscall");
EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build());
builder = new DataProviderDescriptor.Builder();
builder.setName("Thread Status")
.setDescription("Show the hierarchy of Linux threads and their status (RUNNING, SYSCALL, IRQ, IDLE)")
.setProviderType(ProviderType.TIME_GRAPH)
Expand Down Expand Up @@ -211,6 +229,13 @@ public class DataProviderManagerTest {
.setProviderType(ProviderType.DATA_TREE)
.setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider:org.eclipse.tracecompass.analysis.os.linux.core.swslatency.sws");
EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build());
builder = new DataProviderDescriptor.Builder();
builder.setName("Scheduler Wakeup to Scheduler Switch Latency - Priority Statistics Table")
.setDescription("Show Priority Statistics Table provided by Analysis module: Scheduler Wakeup to Scheduler Switch Latency")
.setProviderType(ProviderType.DATA_TREE)
.setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProvider:org.eclipse.tracecompass.analysis.os.linux.core.swslatency.sws");
EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build());

// UST Trace
builder = new DataProviderDescriptor.Builder();
builder.setName("Events Table")
Expand Down Expand Up @@ -266,6 +291,12 @@ public class DataProviderManagerTest {
.setProviderType(ProviderType.DATA_TREE)
.setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider:org.eclipse.linuxtools.lttng2.ust.analysis.callstack");
EXPECTED_UST_DP_DESCRIPTORS.add(builder.build());
builder = new DataProviderDescriptor.Builder();
builder.setName("LTTng-UST CallStack - Priority Statistics Table")
.setDescription("Show Priority Statistics Table provided by Analysis module: LTTng-UST CallStack")
.setProviderType(ProviderType.DATA_TREE)
.setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityStatisticsDataProvider:org.eclipse.linuxtools.lttng2.ust.analysis.callstack");
EXPECTED_UST_DP_DESCRIPTORS.add(builder.build());
}

/**
Expand Down

0 comments on commit 1bbe313

Please sign in to comment.