diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-11-22 16:54:38 +0200 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-11-22 16:54:38 +0200 |
| commit | 81311d321be26ccad433143290ddf5b8ee1bbafb (patch) | |
| tree | 1c81e31068a008ce99e8004e945f7849e3ee596a /Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics | |
| parent | b38870afe2ae248c09807f5f2ed6973d13752a07 (diff) | |
| download | Tango-81311d321be26ccad433143290ddf5b8ee1bbafb.tar.gz Tango-81311d321be26ccad433143290ddf5b8ee1bbafb.zip | |
Working on Stats.
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics')
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> |
