Skip to content

Commit ac3b396

Browse files
committed
Errors/Crashes per platform
1 parent a6e76a7 commit ac3b396

File tree

5 files changed

+130
-22
lines changed

5 files changed

+130
-22
lines changed

TinyInsights.Web/Pages/Errors.razor

Lines changed: 73 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
@inject IInsightsService Service
88
@inject TooltipService tooltipService
9-
9+
<div>
1010
<RadzenStack Gap="20">
1111
<RadzenRow JustifyContent="JustifyContent.End">
1212
<GlobalFilters />
@@ -34,26 +34,51 @@
3434
</RadzenCard>
3535
}
3636

37-
<RadzenCard>
38-
<RadzenStack>
39-
<h2>@perDayHeader</h2>
40-
@if (isLoadingGraph)
41-
{
42-
<RadzenProgressBarCircular Value="100" ShowValue="false" Mode="ProgressBarMode.Indeterminate"/>
43-
}
44-
else
45-
{
46-
<RadzenChart>
47-
<RadzenLegend Visible="false"/>
48-
<RadzenLineSeries Data="@errorsPerDays" CategoryProperty="Date" ValueProperty="Count">
49-
<RadzenMarkers MarkerType="MarkerType.Circle"/>
50-
<RadzenSeriesDataLabels/>
51-
</RadzenLineSeries>
52-
<RadzenCategoryAxis Visible="false"></RadzenCategoryAxis>
53-
</RadzenChart>
54-
}
55-
</RadzenStack>
56-
</RadzenCard>
37+
<!-- begin wrapbox with per-platform (left) and per-day (right) -->
38+
<div class="wrapbox">
39+
<div class="wrapitem">
40+
<RadzenCard>
41+
<RadzenStack>
42+
<h2>@perDayHeader</h2>
43+
@if (isLoadingGraph)
44+
{
45+
<RadzenProgressBarCircular Value="100" ShowValue="false" Mode="ProgressBarMode.Indeterminate"/>
46+
}
47+
else
48+
{
49+
<RadzenChart>
50+
<RadzenLegend Visible="false"/>
51+
<RadzenLineSeries Data="@errorsPerDays" CategoryProperty="Date" ValueProperty="Count">
52+
<RadzenMarkers MarkerType="MarkerType.Circle"/>
53+
<RadzenSeriesDataLabels/>
54+
</RadzenLineSeries>
55+
<RadzenCategoryAxis Visible="false"></RadzenCategoryAxis>
56+
</RadzenChart>
57+
}
58+
</RadzenStack>
59+
</RadzenCard>
60+
</div>
61+
<div class="wrapitem wrapitem-small">
62+
<RadzenCard>
63+
<RadzenStack>
64+
<h2>@perPlatformHeader</h2>
65+
@if (isLoadingPerPlatform)
66+
{
67+
<RadzenProgressBarCircular Value="100" ShowValue="false" Mode="ProgressBarMode.Indeterminate" />
68+
}
69+
else
70+
{
71+
<RadzenChart>
72+
<RadzenPieSeries Data="@perPlatform" Title="@perPlatformHeader" CategoryProperty="@nameof(CountPerKey.Key)" ValueProperty="@nameof(CountPerKey.Count)">
73+
<RadzenSeriesDataLabels Visible="true" />
74+
</RadzenPieSeries>
75+
</RadzenChart>
76+
}
77+
</RadzenStack>
78+
</RadzenCard>
79+
</div>
80+
</div>
81+
<!-- end wrapbox -->
5782

5883
<RadzenCard>
5984
<RadzenStack>
@@ -102,6 +127,7 @@
102127
</RadzenStack>
103128
</RadzenCard>
104129
</RadzenStack>
130+
</div>
105131
@code {
106132

107133
[Parameter]
@@ -120,6 +146,10 @@
120146
private bool isCrash;
121147
private string perDayHeader, listHeader = string.Empty;
122148

149+
private List<CountPerKey> perPlatform = new();
150+
private bool isLoadingPerPlatform = true;
151+
private string perPlatformHeader = string.Empty;
152+
123153
protected override async Task OnParametersSetAsync()
124154
{
125155
await base.OnParametersSetAsync();
@@ -132,12 +162,14 @@
132162
isCrash = true;
133163
perDayHeader = "Crashes per day";
134164
listHeader = "Crashes";
165+
perPlatformHeader = "Crashes per platform";
135166
}
136167
else
137168
{
138169
isCrash = false;
139170
perDayHeader = "Errors per day";
140171
listHeader = "Errors";
172+
perPlatformHeader = "Errors per platform";
141173
}
142174

143175
await LoadData();
@@ -149,8 +181,9 @@
149181
{
150182
var graphTask = LoadGraph();
151183
var listTask = LoadList();
184+
var platformTask = LoadPerPlatform();
152185

153-
await Task.WhenAll(graphTask, listTask);
186+
await Task.WhenAll(graphTask, listTask, platformTask);
154187
}
155188
catch (Exception ex)
156189
{
@@ -196,6 +229,24 @@
196229
await InvokeAsync(StateHasChanged);
197230
}
198231

232+
private async Task LoadPerPlatform()
233+
{
234+
isLoadingPerPlatform = true;
235+
236+
if (isCrash)
237+
{
238+
perPlatform = await Service.GetCrashesPerOperatingSystem(GlobalFilter);
239+
}
240+
else
241+
{
242+
var filter = selectedSeverities.Where(x => x != All).ToList();
243+
perPlatform = await Service.GetErrorsPerOperatingSystem(GlobalFilter, filter);
244+
}
245+
246+
isLoadingPerPlatform = false;
247+
await InvokeAsync(StateHasChanged);
248+
}
249+
199250
private async Task LoadList()
200251
{
201252
isLoadingList = true;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
.wrapitem {
2+
max-width: 66% !important;
3+
min-width:600px !important;
4+
}
5+
.wrapitem-small {
6+
max-width: 32% !important;
7+
}

TinyInsights.Web/Services/IInsightsService.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ public interface IInsightsService
2626
Task<List<CountPerDay>> GetFailedDependenciesPerDay(GlobalFilter filter, CancellationToken cancellationToken = default);
2727
Task<List<CountPerDay>> GetCrashDetailsPerDay(string problemId, GlobalFilter filter, CancellationToken cancellationToken = default);
2828
Task<List<CountPerDay>> GetErrorDetailsPerDay(string problemId, GlobalFilter filter, string? severity = null, CancellationToken cancellationToken = default);
29+
Task<List<CountPerKey>> GetErrorsPerOperatingSystem(GlobalFilter filter, List<string>? errorSeverities = null, CancellationToken cancellationToken = default);
30+
Task<List<CountPerKey>> GetCrashesPerOperatingSystem(GlobalFilter filter, CancellationToken cancellationToken = default);
2931
#endregion
3032

3133
#region Analytics

TinyInsights.Web/Services/InsightsService.Diagnostics.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,49 @@ public Task<ErrorDetails> GetCrashDetails(string id, GlobalFilter filter, Cancel
174174
return GetErrorDetails(query, cancellationToken);
175175
}
176176

177+
public async Task<List<CountPerKey>> GetErrorsPerOperatingSystem(GlobalFilter filter, List<string>? errorSeverities = null, CancellationToken cancellationToken = default)
178+
{
179+
var queryFilter = GetFilter(filter);
180+
181+
if (errorSeverities is { Count: > 0 })
182+
{
183+
var filterBuilder = new StringBuilder();
184+
filterBuilder.Append(queryFilter);
185+
filterBuilder.Append("customDimensions.ErrorSeverity in (");
186+
filterBuilder.AppendJoin(',', errorSeverities.Select(x => $"'{x}'"));
187+
filterBuilder.Append(") and ");
188+
queryFilter = filterBuilder.ToString();
189+
}
190+
191+
var query = $"exceptions | where{queryFilter} and customDimensions.IsCrash != 'true' | summarize count_sum = sum(itemCount) by client_OS";
192+
193+
var queryResult = await GetQueryResult<QueryResult>(query, cancellationToken);
194+
var result = new List<CountPerKey>();
195+
196+
foreach (var row in queryResult.Tables.First().Rows)
197+
{
198+
result.Add(new CountPerKey(row[0].ToString(), int.Parse(row[1].ToString())));
199+
}
200+
201+
return result;
202+
}
203+
204+
public async Task<List<CountPerKey>> GetCrashesPerOperatingSystem(GlobalFilter filter, CancellationToken cancellationToken = default)
205+
{
206+
var queryFilter = GetFilter(filter);
207+
var query = $"exceptions | where{queryFilter} and customDimensions.IsCrash == 'true' | summarize count_sum = sum(itemCount) by client_OS";
208+
209+
var queryResult = await GetQueryResult<QueryResult>(query, cancellationToken);
210+
var result = new List<CountPerKey>();
211+
212+
foreach (var row in queryResult.Tables.First().Rows)
213+
{
214+
result.Add(new CountPerKey(row[0].ToString(), int.Parse(row[1].ToString())));
215+
}
216+
217+
return result;
218+
}
219+
177220
private async Task<ErrorDetails> GetErrorDetails(string query, CancellationToken cancellationToken = default)
178221
{
179222
var queryResult = await GetQueryResult<QueryResult>(query, cancellationToken);

TinyInsights.Web/wwwroot/css/app.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ body {
1818
-ms-user-select:text !important;
1919
pointer-events:all !important;
2020
}
21+
22+
h2 {
23+
margin:0;
24+
}
25+
2126
.rz-unselectable-text {
2227
user-select: auto !important;
2328
-webkit-user-select: auto !important;

0 commit comments

Comments
 (0)