FlameGraph.Net
1.0.0
There is a newer version of this package available.
See the version list below for details.
See the version list below for details.
dotnet add package FlameGraph.Net --version 1.0.0
NuGet\Install-Package FlameGraph.Net -Version 1.0.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="FlameGraph.Net" Version="1.0.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="FlameGraph.Net" Version="1.0.0" />
<PackageReference Include="FlameGraph.Net" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add FlameGraph.Net --version 1.0.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: FlameGraph.Net, 1.0.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package FlameGraph.Net@1.0.0
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=FlameGraph.Net&version=1.0.0
#tool nuget:?package=FlameGraph.Net&version=1.0.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Flame Graph .NET
Description
A .NET library that makes creating flame graph, output svg content easily.
Get started
- Generate a flame graph like this:
- Add reference to the package:
dotnet add package FlameGraph.Net
- Crate a class that implements the IFlameGraphNode interface:
class SimpleNode : IFlameGraphNode
{
public string Content { get; set; }
public double Metric { get; set; }
public List<IFlameGraphNode> Children { get; } = new List<IFlameGraphNode>();
}
- Create tree structure using the the node class above:
private static void SimpleNodeExample()
{
// Get the tree
const int nodeCount = 20;
SimpleNode root = new SimpleNode()
{
Content = $"Node {nodeCount.ToString("0")}",
Metric = nodeCount,
};
root = AppendChildren(root, nodeCount);
// Create a graph factory with options.
FlameGraph newGraph = new FlameGraph(new FlameGraphOptions()
{
Title = "Hello Flame Graph",
Width = 800,
Height = 600,
});
// Output the svg
string fileName = nameof(SimpleNodeExample) + ".svg";
DeleteFileWhenExists(fileName);
newGraph.BuildTo(root, fileName);
}
// Generate a simple tree.
private static SimpleNode AppendChildren(SimpleNode current, double metricValue)
{
metricValue--;
if (metricValue > 0)
{
SimpleNode newChild = new SimpleNode()
{
Content = $"Node {metricValue.ToString("0")}",
Metric = metricValue,
};
current.Children.Add(AppendChildren(newChild, metricValue));
}
return current;
}
private static void DeleteFileWhenExists(string resultFilePath)
{
if (File.Exists(resultFilePath))
{
File.Delete(resultFilePath);
}
}
Advanced Topics
Using any existing tree node as flame graph node
The key is to provide 3 delegates to extract the following items from a existing object:
- Content
- Metric
- Children
Here's an example:
private static void NodeAdapterExample()
{
// Create delegates for adaption
Func<TreeNode, string> getContent = n => n.Text;
Func<TreeNode, double> getMetric = n => n.Value;
Func<TreeNode, IEnumerable<TreeNode>> getChildren = n => n.Children;
// Generate an example tree
const int levels = 20;
TreeNode root = new TreeNode("Root", levels);
root = AppendChildren(root, levels);
// Adapter the tree
var wrappedRoot = new FlameGraphNode<TreeNode>(root, getContent, getMetric, getChildren);
// Output the svg stream to file.
FlameGraph graph = new FlameGraph(new FlameGraphOptions()
{
Title = "Hello Flame Graph",
Width = 800,
Height = 600,
});
using Stream svgStream = graph.Build(wrappedRoot);
using FileStream fileStream = new FileStream($"{nameof(NodeAdapterExample)}.svg", FileMode.Create, FileAccess.Write);
svgStream.CopyTo(fileStream);
}
private static TreeNode AppendChildren(TreeNode current, double metricValue)
{
metricValue--;
if (metricValue > 0)
{
TreeNode newChild = new TreeNode($"Node {metricValue.ToString("0")}", metricValue);
current.Children.Add(AppendChildren(newChild, metricValue));
}
return current;
}
TreeNode is a class that doesn't implement IFlameGraphNode. 3 delegates are crated to extract enough information from it:
// Create delegates for adaption
Func<TreeNode, string> getContent = n => n.Text;
Func<TreeNode, double> getMetric = n => n.Value;
Func<TreeNode, IEnumerable<TreeNode>> getChildren = n => n.Children;
And then a wrappedRoot is created based on the info:
var wrappedRoot = new FlameGraphNode<TreeNode>(root, getContent, getMetric, getChildren);
The rest of it shows to write the stream output to a file directly.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- Svg (>= 3.1.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.