linux.core: Add priority statistics data provider factory 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>
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/plugin.xml b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/plugin.xml index d663007..d890596 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/plugin.xml +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/plugin.xml
@@ -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>
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/Messages.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/Messages.java index e5e806d..6295531 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/Messages.java +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/Messages.java
@@ -39,6 +39,23 @@ */ 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);
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/PriorityStatisticsDataProviderFactory.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/PriorityStatisticsDataProviderFactory.java new file mode 100644 index 0000000..b4b8bac --- /dev/null +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/PriorityStatisticsDataProviderFactory.java
@@ -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; + } +}
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/messages.properties b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/messages.properties index 1a8fc63..bc0d759 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/messages.properties +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/segmentstore/messages.properties
@@ -13,3 +13,7 @@ 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}
diff --git a/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java b/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java index fb0fd44..417869c 100644 --- a/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java +++ b/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java
@@ -104,6 +104,12 @@ .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) @@ -140,6 +146,12 @@ .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) @@ -182,6 +194,12 @@ .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) @@ -211,6 +229,13 @@ .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") @@ -266,6 +291,12 @@ .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()); } /**