aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics
diff options
context:
space:
mode:
authorRoy Ben-Shabat <Roy@Twine-s.com>2018-11-22 16:54:38 +0200
committerRoy Ben-Shabat <Roy@Twine-s.com>2018-11-22 16:54:38 +0200
commit81311d321be26ccad433143290ddf5b8ee1bbafb (patch)
tree1c81e31068a008ce99e8004e945f7849e3ee596a /Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics
parentb38870afe2ae248c09807f5f2ed6973d13752a07 (diff)
downloadTango-81311d321be26ccad433143290ddf5b8ee1bbafb.tar.gz
Tango-81311d321be26ccad433143290ddf5b8ee1bbafb.zip
Working on Stats.
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics')
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/LabeledSeriesCollection.cs7
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs172
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/MainView.xaml48
3 files changed, 167 insertions, 60 deletions
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/LabeledSeriesCollection.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/LabeledSeriesCollection.cs
index b29c74127..4d3bf5eac 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/LabeledSeriesCollection.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/LabeledSeriesCollection.cs
@@ -12,6 +12,13 @@ namespace Tango.MachineStudio.Statistics.Models
{
public class LabeledSeriesCollection : ExtendedObject
{
+ private String _title;
+ public String Title
+ {
+ get { return _title; }
+ set { _title = value; RaisePropertyChangedAuto(); }
+ }
+
private String _charTitle;
public String ChartTitle
{
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs
index f09ed2e0d..82e47052b 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs
@@ -7,7 +7,9 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
using Tango.BL;
+using Tango.BL.Entities;
using Tango.BL.Enumerations;
+using Tango.Core.Helpers;
using Tango.MachineStudio.Common;
using Tango.MachineStudio.Statistics.Models;
@@ -16,6 +18,8 @@ namespace Tango.MachineStudio.Statistics.ViewModels
public class MainViewVM : StudioViewModel
{
private ObservablesContext _context;
+ private List<JobRun> _job_runs;
+ private bool rendered;
private LabeledSeriesCollection _timelineJobStatusSeries;
public LabeledSeriesCollection TimelineJobStatusSeries
@@ -24,19 +28,16 @@ namespace Tango.MachineStudio.Statistics.ViewModels
set { _timelineJobStatusSeries = value; RaisePropertyChangedAuto(); }
}
+ private LabeledSeriesCollection _pieJobFailedReasons;
+ public LabeledSeriesCollection PieJobFailedReasons
+ {
+ get { return _pieJobFailedReasons; }
+ set { _pieJobFailedReasons = value; RaisePropertyChangedAuto(); }
+ }
+
public MainViewVM()
{
- TimelineJobStatusSeries = new LabeledSeriesCollection()
- {
- ChartTitle = "Monthly Job Runs",
- LabelsTitle = "Date",
- SeriesColors = new List<Color>()
- {
- Colors.Green,
- Colors.Orange,
- Colors.Red,
- },
- };
+
}
public override void OnApplicationReady()
@@ -45,43 +46,128 @@ namespace Tango.MachineStudio.Statistics.ViewModels
{
_context = ObservablesContext.CreateDefault();
DateTime start_date = DateTime.UtcNow.AddMonths(-1);
- var jobs_runs = _context.JobRuns.Where(x => x.StartDate > start_date).OrderBy(x => x.StartDate).ToList();
+ _job_runs = _context.JobRuns.OrderBy(x => x.StartDate).ToList();
+ });
+ }
- InvokeUIOnIdle(() =>
- {
- var completed_job_runs = new ColumnSeries()
- {
- Title = "Completed",
- Values = new ChartValues<int>(),
- Fill = Brushes.Green,
- };
- var aborted_job_runs = new ColumnSeries()
- {
- Title = "Aborted",
- Values = new ChartValues<int>(),
- Fill = Brushes.Orange,
- };
- var failed_job_runs = new ColumnSeries()
- {
- Title = "Failed",
- Values = new ChartValues<int>(),
- Fill = Brushes.Red,
- };
+ private List<JobRun> GetJobRunsByStartDate(DateTime startDate, JobRunStatus? status = null)
+ {
+ return _job_runs.Where(x => x.StartDate.ToLocalTime() >= startDate && (status == null || x.JobRunStatus == status)).ToList();
+ }
- for (DateTime date = DateTime.Now.AddMonths(-1); date.Date <= DateTime.Now.Date; date = date.AddDays(1))
- {
- completed_job_runs.Values.Add(jobs_runs.Where(x => x.StartDate.ToLocalTime().Date == date.Date && x.JobRunStatus == JobRunStatus.Completed).Count());
- aborted_job_runs.Values.Add(jobs_runs.Where(x => x.StartDate.ToLocalTime().Date == date.Date && x.JobRunStatus == JobRunStatus.Aborted).Count());
- failed_job_runs.Values.Add(jobs_runs.Where(x => x.StartDate.ToLocalTime().Date == date.Date && x.JobRunStatus == JobRunStatus.Failed).Count());
+ private List<JobRun> GetJobRunsByDate(DateTime date, JobRunStatus? status = null)
+ {
+ return _job_runs.Where(x => x.StartDate.ToLocalTime().Date == date.Date && (status == null || x.JobRunStatus == status)).ToList();
+ }
+
+ private IEnumerable<DateTime> CreateDates(DateTime start, DateTime end)
+ {
+ for (DateTime date = start.Date; date.Date <= end.Date; date = date.AddDays(1))
+ {
+ yield return date;
+ }
+ }
- TimelineJobStatusSeries.Labels.Add(date.ToShortDateString());
- }
+ public override void OnNavigatedTo()
+ {
+ base.OnNavigatedTo();
+
+ if (rendered) return;
- TimelineJobStatusSeries.SeriesCollection.Add(completed_job_runs);
- TimelineJobStatusSeries.SeriesCollection.Add(aborted_job_runs);
- TimelineJobStatusSeries.SeriesCollection.Add(failed_job_runs);
- });
+ rendered = true;
+
+ InvokeUIOnIdle(() =>
+ {
+ GenerateTimelineJobStatusChart();
+ GeneratePieFailedReasonsChart();
});
}
+
+ private void GenerateTimelineJobStatusChart()
+ {
+ TimelineJobStatusSeries = new LabeledSeriesCollection()
+ {
+ Title = "This Month Job Runs Status",
+ ChartTitle = "Number Of Runs",
+ LabelsTitle = "Date",
+ SeriesColors = new List<Color>()
+ {
+ Colors.Green,
+ Colors.Orange,
+ Colors.Red,
+ },
+ };
+
+ var completed_job_runs = new ColumnSeries()
+ {
+ Title = "Completed",
+ Values = new ChartValues<int>(),
+ Fill = Brushes.Green,
+ };
+ var aborted_job_runs = new ColumnSeries()
+ {
+ Title = "Aborted",
+ Values = new ChartValues<int>(),
+ Fill = Brushes.Orange,
+ };
+ var failed_job_runs = new ColumnSeries()
+ {
+ Title = "Failed",
+ Values = new ChartValues<int>(),
+ Fill = Brushes.Red,
+ };
+
+ foreach (var date in CreateDates(DateTime.Now.AddMonths(-1), DateTime.Now))
+ {
+ completed_job_runs.Values.Add(GetJobRunsByDate(date, JobRunStatus.Completed).Count());
+ aborted_job_runs.Values.Add(GetJobRunsByDate(date, JobRunStatus.Aborted).Count());
+ failed_job_runs.Values.Add(GetJobRunsByDate(date, JobRunStatus.Failed).Count());
+
+ TimelineJobStatusSeries.Labels.Add(date.ToShortDateString());
+ }
+
+ TimelineJobStatusSeries.SeriesCollection.Add(completed_job_runs);
+ TimelineJobStatusSeries.SeriesCollection.Add(aborted_job_runs);
+ TimelineJobStatusSeries.SeriesCollection.Add(failed_job_runs);
+ }
+
+ private void GeneratePieFailedReasonsChart()
+ {
+ var groups = GetJobRunsByStartDate(DateTime.Now.AddMonths(-1), JobRunStatus.Failed).GroupBy(x => x.FailedMessage);
+
+ List<Color> colors = new List<Color>();
+
+ int max = groups.Max(x => x.Count());
+
+ for (int i = 0; i < groups.Count(); i++)
+ {
+ int count = groups.ElementAt(i).Count();
+ double alpha = Math.Max(((double)(count) / max * 200), 20);
+ colors.Add(Color.FromArgb((byte)alpha, 200, 0, 0));
+ }
+
+ PieJobFailedReasons = new LabeledSeriesCollection()
+ {
+ Title = "This Month Job Failure Reasons",
+ SeriesColors = colors,
+ };
+
+ int index = 0;
+
+ foreach (var group in groups)
+ {
+ int count = group.Count();
+
+ var series = new PieSeries()
+ {
+ Title = group.First().FailedMessage,
+ Values = new ChartValues<int>() { count },
+ Fill = new SolidColorBrush(colors[index++]),
+ DataLabels = true,
+ };
+
+ PieJobFailedReasons.SeriesCollection.Add(series);
+ }
+ }
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/MainView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/MainView.xaml
index c1c3a39b6..56a16770a 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/MainView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/MainView.xaml
@@ -10,23 +10,37 @@
mc:Ignorable="d"
d:DesignHeight="1080" d:DesignWidth="1920" Background="Transparent" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MainViewVM}">
<Grid>
- <UniformGrid Columns="2" Margin="50" Rows="2">
- <lvc:CartesianChart Series="{Binding TimelineJobStatusSeries.SeriesCollection}" LegendLocation="Left" SeriesColors="{Binding TimelineJobStatusSeries.SeriesColors}">
- <lvc:CartesianChart.AxisX>
- <lvc:Axis Title="{Binding TimelineJobStatusSeries.LabelsTitle}" Labels="{Binding TimelineJobStatusSeries.Labels}" Foreground="#202020">
- <lvc:Axis.Separator>
- <lvc:Separator Stroke="#A5A5A5" />
- </lvc:Axis.Separator>
- </lvc:Axis>
- </lvc:CartesianChart.AxisX>
- <lvc:CartesianChart.AxisY>
- <lvc:Axis Title="{Binding TimelineJobStatusSeries.ChartTitle}" MinValue="0" Foreground="#202020" >
- <lvc:Axis.Separator>
- <lvc:Separator Stroke="#B0B0B0" />
- </lvc:Axis.Separator>
- </lvc:Axis>
- </lvc:CartesianChart.AxisY>
- </lvc:CartesianChart>
+ <UniformGrid Columns="3" Margin="50" Rows="3">
+ <Border BorderBrush="#181818" Padding="5" BorderThickness="1" CornerRadius="5" Margin="10">
+ <DockPanel>
+ <TextBlock DockPanel.Dock="Top" FontSize="16" FontWeight="Bold" HorizontalAlignment="Center" Padding="10" Text="{Binding TimelineJobStatusSeries.Title}"></TextBlock>
+ <lvc:CartesianChart Series="{Binding TimelineJobStatusSeries.SeriesCollection}" LegendLocation="Bottom" SeriesColors="{Binding TimelineJobStatusSeries.SeriesColors}">
+ <lvc:CartesianChart.AxisX>
+ <lvc:Axis Title="{Binding TimelineJobStatusSeries.LabelsTitle}" Labels="{Binding TimelineJobStatusSeries.Labels}" Foreground="#202020">
+ <lvc:Axis.Separator>
+ <lvc:Separator Stroke="#A5A5A5" />
+ </lvc:Axis.Separator>
+ </lvc:Axis>
+ </lvc:CartesianChart.AxisX>
+ <lvc:CartesianChart.AxisY>
+ <lvc:Axis Title="{Binding TimelineJobStatusSeries.ChartTitle}" MinValue="0" Foreground="#202020" >
+ <lvc:Axis.Separator>
+ <lvc:Separator Stroke="#B0B0B0" />
+ </lvc:Axis.Separator>
+ </lvc:Axis>
+ </lvc:CartesianChart.AxisY>
+ </lvc:CartesianChart>
+ </DockPanel>
+ </Border>
+
+ <Border BorderBrush="#181818" Padding="5" BorderThickness="1" CornerRadius="5" Margin="10">
+ <DockPanel>
+ <TextBlock DockPanel.Dock="Top" FontSize="16" FontWeight="Bold" HorizontalAlignment="Center" Padding="10" Text="{Binding PieJobFailedReasons.Title}"></TextBlock>
+ <lvc:PieChart Series="{Binding PieJobFailedReasons.SeriesCollection}" LegendLocation="Bottom" SeriesColors="{Binding PieJobFailedReasons.SeriesColors}">
+
+ </lvc:PieChart>
+ </DockPanel>
+ </Border>
</UniformGrid>
</Grid>
</UserControl>