public static D3SankeyDescription GetActualExecutionPlanD3Sankey(this ExecutionStatus executionStatus) { var nameToIdDictionary = executionStatus.JobDefinitionStructure.Nodes.Select((Structure, Idx) => new { Structure.Name, Idx }).ToDictionary(i => i.Name, i => i.Idx); return(new D3SankeyDescription { links = executionStatus.JobDefinitionStructure.StreamToNodeLinks.GroupJoin( executionStatus.StreamStatisticCounters, i => i.SourceNodeName, i => i.SourceNodeName, (link, stat) => new D3SankeyStatisticsLink { source = nameToIdDictionary[link.SourceNodeName], target = nameToIdDictionary[link.TargetNodeName], value = stat.DefaultIfEmpty(new StreamStatisticCounter { Counter = 0 }).Sum(i => i.Counter) } ).ToList(), nodes = executionStatus.JobDefinitionStructure.Nodes.Select(i => { string color = "blue"; if (executionStatus.StreamStatisticErrors.Any(e => e.NodeName == i.Name)) { color = "red"; } return new D3SankeyStatisticsNode { id = nameToIdDictionary[i.Name], name = i.Name, color = color }; }).ToList() }); }
public static PlotlySankeyDescription GetActualExecutionPlanPlotlySankey(this ExecutionStatus executionStatus) { var nameToIdDictionary = executionStatus.JobDefinitionStructure.Nodes.Select((Structure, Idx) => new { Structure.Name, Idx }).ToDictionary(i => i.Name, i => i.Idx); var links = executionStatus.JobDefinitionStructure.StreamToNodeLinks.GroupJoin( executionStatus.StreamStatisticCounters, i => i.SourceNodeName, i => i.SourceNodeName, (link, stat) => new { source = nameToIdDictionary[link.SourceNodeName], target = nameToIdDictionary[link.TargetNodeName], value = stat.DefaultIfEmpty(new StreamStatisticCounter { Counter = 0 }).Sum(i => i.Counter) } ).ToList(); return(new PlotlySankeyDescription { NodeColors = executionStatus.JobDefinitionStructure.Nodes.OrderBy(i => nameToIdDictionary[i.Name]).Select(i => { if (executionStatus.StreamStatisticErrors.Any(e => e.NodeName == i.Name)) { return "red"; } return "blue"; }).ToList(), NodeNames = executionStatus.JobDefinitionStructure.Nodes.OrderBy(i => nameToIdDictionary[i.Name]).Select(i => i.Name).ToList(), LinkSources = links.Select(i => i.source).ToList(), LinkTargets = links.Select(i => i.target).ToList(), LinkValues = links.Select(i => i.value).ToList() }); }
public static string GetActualExecutionPlanHtmlD3Sankey(this ExecutionStatus executionStatus) { var json = executionStatus.GetActualExecutionPlanJsonD3Sankey(); string file; var assembly = typeof(ExecutionStatusEx).Assembly; using (var stream = assembly.GetManifestResourceStream("Paillave.Etl.ExecutionPlan.ActualExecutionPlan.D3Sankey.html")) using (var reader = new StreamReader(stream)) file = reader.ReadToEnd(); string html = file.Replace("'<<SANKEY_STATISTICS>>'", json); return(html); }
//public static async Task<string> GetJsonActualExecutionPlanPlotlySankeyAsync<T>(this ExecutionContext<T> executionStatus) //{ // return JsonConvert.SerializeObject(await executionStatus.GetActualExecutionPlanPlotlySankeyAsync()); //} public static string GetActualExecutionPlanHtmlPlotlySankey(this ExecutionStatus executionStatus) { var stats = executionStatus.GetActualExecutionPlanPlotlySankey(); string file; var assembly = typeof(ExecutionStatusEx).Assembly; using (var stream = assembly.GetManifestResourceStream("Paillave.Etl.ExecutionPlan.ActualExecutionPlan.PlotySankey.html")) using (var reader = new StreamReader(stream)) file = reader.ReadToEnd(); string html = file.Replace("'<<NODE_NAMES>>'", JsonConvert.SerializeObject(stats.NodeNames)); html = html.Replace("'<<NODE_COLORS>>'", JsonConvert.SerializeObject(stats.NodeColors)); html = html.Replace("'<<LINK_SOURCES>>'", JsonConvert.SerializeObject(stats.LinkSources)); html = html.Replace("'<<LINK_TARGETS>>'", JsonConvert.SerializeObject(stats.LinkTargets)); html = html.Replace("'<<LINK_VALUES>>'", JsonConvert.SerializeObject(stats.LinkValues)); return(html); }
public static VisNetworkDescription GetActualExecutionPlan(this ExecutionStatus executionStatus) { var nameToIdDictionary = executionStatus.JobDefinitionStructure.Nodes.Select((Structure, Idx) => new { Structure.Name, Idx }).ToDictionary(i => i.Name, i => i.Idx); return(new VisNetworkDescription { edges = executionStatus.JobDefinitionStructure.StreamToNodeLinks.GroupJoin( executionStatus.StreamStatisticCounters, i => i.SourceNodeName, i => i.SourceNodeName, (link, stat) => new VisNetworkStatisticEdge { from = nameToIdDictionary[link.SourceNodeName], to = nameToIdDictionary[link.TargetNodeName], value = stat.DefaultIfEmpty(new StreamStatisticCounter { Counter = 0 }).Sum(i => i.Counter), color = new VisNetworkStatisticColorEdge { color = "#ccd5e2", inherit = false } } ).ToList(), nodes = executionStatus.JobDefinitionStructure.Nodes.GroupJoin( executionStatus.StreamStatisticErrors, i => i.Name, i => i.NodeName, (node, errors) => { var icon = GetNodeIcon(node); bool onError = errors.Any(); return new VisNetworkStatisticNode { borderWidth = GetNodeBorderWidth(node, onError), id = nameToIdDictionary[node.Name], label = node.Name, shape = icon != null ? "icon" : null, icon = icon, color = GetNodeColor(node, onError) }; }).ToList() }); }
public static void OpenActualExecutionPlanD3Sankey(this ExecutionStatus executionStatus) { Tools.OpenFile(executionStatus.GetActualExecutionPlanHtmlD3Sankey(), "html"); }
public static string GetActualExecutionPlanJsonD3Sankey(this ExecutionStatus executionStatus) { return(JsonConvert.SerializeObject(executionStatus.GetActualExecutionPlanD3Sankey())); }
public static void OpenActualExecutionPlanVisNetwork(this ExecutionStatus executionStatus) { Tools.OpenFile(executionStatus.GetActualExecutionPlanHtmlVisNetwork(), "html"); }
public static string GetActualExecutionPlanJsonVisNetwork(this ExecutionStatus executionStatus) { return(JsonConvert.SerializeObject(executionStatus.GetActualExecutionPlan()).Replace(@"""\\u", @"""\u")); }