Skip to content

Commit ba00be5

Browse files
authored
Add Parent/Child Name Tree to GenericEvents to provide new non-default Hierarchical / Stack view (#46)
* Add ParentTree to GenericEvents and provide new non-default Hierarchical / Stack view of this named "Perfetto Trace Events - Process-Thread-ParentNameTree"
1 parent 4d35a59 commit ba00be5

7 files changed

Lines changed: 118 additions & 60 deletions

File tree

PerfDataExtensions/Tables/CpuSamplingTable.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
using PerfDataExtensions.DataOutputTypes;
1212
using PerfDataExtensions.Tables.Generators;
1313
using System.Linq;
14-
using PerfDataExtensions.Tables.AccessProviders;
1514
using static PerfDataExtensions.Tables.TimeHelper;
15+
using Utilities.AccessProviders;
1616

1717
namespace PerfDataExtensions.Tables
1818
{

PerfDataExtensions/Tables/PerfTxtCpuSamplingTable.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using Microsoft.Diagnostics.Tracing.Stacks;
66
using Microsoft.Performance.SDK;
77
using Microsoft.Performance.SDK.Processing;
8-
using PerfDataExtensions.Tables.AccessProviders;
98
using PerfDataExtensions.Tables.Generators;
109
using System;
1110
using System.Collections.Concurrent;
@@ -14,6 +13,7 @@
1413
using System.Linq;
1514
using System.Threading;
1615
using static PerfDataExtensions.Tables.TimeHelper;
16+
using Utilities.AccessProviders;
1717

1818
namespace PerfDataExtensions.Tables
1919
{

PerfettoCds/Pipeline/CompositeDataCookers/PerfettoGenericEventCooker.cs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public sealed class PerfettoGenericEventCooker : CookedDataReflector, IComposite
5050
public static readonly DataCookerPath DataCookerPath = PerfettoPluginConstants.GenericEventCookerPath;
5151

5252
public string Description => "Generic Event composite cooker";
53+
const string Root = "[Root]";
5354

5455
public DataCookerPath Path => DataCookerPath;
5556

@@ -90,6 +91,9 @@ public sealed class PerfettoGenericEventCooker : CookedDataReflector, IComposite
9091
// The name of the optional ProviderGuid mapping file
9192
private const string ProviderMappingXmlFilename = "ProviderMapping.xml";
9293

94+
// In order to consolidate like paths for common events and thus reduce memory / processing
95+
private Dictionary<int, string[]> ParentEventNameTreeBranchDictKeyNotReversed = new Dictionary<int, string[]>();
96+
9397
public PerfettoGenericEventCooker() : base(PerfettoPluginConstants.GenericEventCookerPath)
9498
{
9599
this.GenericEvents =
@@ -236,15 +240,37 @@ join processTrack in processTrackData on slice.TrackId equals processTrack.Id in
236240

237241
int parentTreeDepthLevel = 0;
238242
long? currentParentId = result.slice.ParentId;
239-
243+
List<string> tmpParentEventNameTreeBranch = new List<string>();
244+
tmpParentEventNameTreeBranch.Add(result.slice.Name);
245+
240246
// Walk the parent tree
241247
while (currentParentId.HasValue)
242248
{
243249
var parentPerfettoSliceEvent = sliceData[(int) currentParentId.Value];
244250
// Debug.Assert(parentPerfettoSliceEvent == null || (parentPerfettoSliceEvent.Id == currentParentId.Value)); // Should be guaranteed by slice Id ordering. Since we are relying on index being the Id
245-
currentParentId = parentPerfettoSliceEvent != null ? parentPerfettoSliceEvent.ParentId : null;
251+
252+
if (parentPerfettoSliceEvent != null)
253+
{
254+
currentParentId = parentPerfettoSliceEvent.ParentId;
255+
tmpParentEventNameTreeBranch.Add(parentPerfettoSliceEvent.Name);
256+
}
257+
else
258+
{
259+
currentParentId = null;
260+
}
261+
246262
parentTreeDepthLevel++;
247263
}
264+
tmpParentEventNameTreeBranch.Add(Root);
265+
266+
string[] finalParentEventNameTreeBranch;
267+
var tmpParentEventNameTreeBranchHashCodeNotReversed = tmpParentEventNameTreeBranch.GetHashCode();
268+
if (!ParentEventNameTreeBranchDictKeyNotReversed.TryGetValue(tmpParentEventNameTreeBranchHashCodeNotReversed, out finalParentEventNameTreeBranch))
269+
{
270+
tmpParentEventNameTreeBranch.Reverse();
271+
finalParentEventNameTreeBranch = tmpParentEventNameTreeBranch.ToArray();
272+
ParentEventNameTreeBranchDictKeyNotReversed.Add(tmpParentEventNameTreeBranchHashCodeNotReversed, finalParentEventNameTreeBranch);
273+
}
248274

249275
PerfettoGenericEvent ev = new PerfettoGenericEvent
250276
(
@@ -264,7 +290,8 @@ join processTrack in processTrackData on slice.TrackId equals processTrack.Id in
264290
provider,
265291
result.threadTrack,
266292
result.slice.ParentId,
267-
parentTreeDepthLevel
293+
parentTreeDepthLevel,
294+
finalParentEventNameTreeBranch
268295
);
269296
this.GenericEvents.AddEvent(ev);
270297
}

PerfettoCds/Pipeline/DataOutput/PerfettoGenericEvent.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ public readonly struct PerfettoGenericEvent
4141

4242
public PerfettoThreadTrackEvent ThreadTrack { get; }
4343

44+
public string[] ParentEventNameTree { get; }
45+
4446
public PerfettoGenericEvent(string eventName,
4547
string type,
4648
TimestampDelta duration,
@@ -55,7 +57,8 @@ public PerfettoGenericEvent(string eventName,
5557
string provider,
5658
PerfettoThreadTrackEvent threadTrack,
5759
long? parentId,
58-
int parentTreeDepthLevel)
60+
int parentTreeDepthLevel,
61+
string[] parentEventNameTree)
5962
{
6063
EventName = eventName;
6164
Type = type;
@@ -72,6 +75,7 @@ public PerfettoGenericEvent(string eventName,
7275
ThreadTrack = threadTrack;
7376
ParentId = parentId;
7477
ParentTreeDepthLevel = parentTreeDepthLevel;
78+
ParentEventNameTree = parentEventNameTree;
7579
}
7680
}
7781
}

0 commit comments

Comments
 (0)