@@ -19,9 +19,9 @@ public partial class StructuredLogs
19
19
20
20
private TotalItemsFooter _totalItemsFooter = default ! ;
21
21
private List < SelectViewModel < string > > _applications = default ! ;
22
- private List < SelectViewModel < LogLevel > > _logLevels = default ! ;
22
+ private List < SelectViewModel < LogLevel ? > > _logLevels = default ! ;
23
23
private SelectViewModel < string > _selectedApplication = s_allApplication ;
24
- private SelectViewModel < LogLevel > _selectedLogLevel = default ! ;
24
+ private SelectViewModel < LogLevel ? > _selectedLogLevel = default ! ;
25
25
private Subscription ? _applicationsSubscription ;
26
26
private Subscription ? _logsSubscription ;
27
27
private bool _applicationChanged ;
@@ -48,6 +48,10 @@ public partial class StructuredLogs
48
48
[ SupplyParameterFromQuery ]
49
49
public string ? SpanId { get ; set ; }
50
50
51
+ [ Parameter ]
52
+ [ SupplyParameterFromQuery ( Name = "level" ) ]
53
+ public string ? LogLevelText { get ; set ; }
54
+
51
55
private ValueTask < GridItemsProviderResult < OtlpLogEntry > > GetData ( GridItemsProviderRequest < OtlpLogEntry > request )
52
56
{
53
57
ViewModel . StartIndex = request . StartIndex ;
@@ -59,6 +63,8 @@ private ValueTask<GridItemsProviderResult<OtlpLogEntry>> GetData(GridItemsProvid
59
63
// The workaround is to put the count inside a control and explicitly update and refresh the control.
60
64
_totalItemsFooter . SetTotalItemCount ( logs . TotalItemCount ) ;
61
65
66
+ TelemetryRepository . MarkViewedErrorLogs ( ViewModel . ApplicationServiceId ) ;
67
+
62
68
return ValueTask . FromResult ( GridItemsProviderResult . From ( logs . Items , logs . TotalItemCount ) ) ;
63
69
}
64
70
@@ -73,15 +79,15 @@ protected override Task OnInitializedAsync()
73
79
ViewModel . AddFilter ( new LogFilter { Field = "SpanId" , Condition = FilterCondition . Equals , Value = SpanId } ) ;
74
80
}
75
81
76
- _logLevels = new List < SelectViewModel < LogLevel > >
82
+ _logLevels = new List < SelectViewModel < LogLevel ? > >
77
83
{
78
- new SelectViewModel < LogLevel > { Id = LogLevel . Trace , Name = "(All)" } ,
79
- new SelectViewModel < LogLevel > { Id = LogLevel . Trace , Name = "Trace" } ,
80
- new SelectViewModel < LogLevel > { Id = LogLevel . Debug , Name = "Debug" } ,
81
- new SelectViewModel < LogLevel > { Id = LogLevel . Information , Name = "Information" } ,
82
- new SelectViewModel < LogLevel > { Id = LogLevel . Warning , Name = "Warning" } ,
83
- new SelectViewModel < LogLevel > { Id = LogLevel . Error , Name = "Error" } ,
84
- new SelectViewModel < LogLevel > { Id = LogLevel . Critical , Name = "Critical" } ,
84
+ new SelectViewModel < LogLevel ? > { Id = null , Name = "(All)" } ,
85
+ new SelectViewModel < LogLevel ? > { Id = LogLevel . Trace , Name = "Trace" } ,
86
+ new SelectViewModel < LogLevel ? > { Id = LogLevel . Debug , Name = "Debug" } ,
87
+ new SelectViewModel < LogLevel ? > { Id = LogLevel . Information , Name = "Information" } ,
88
+ new SelectViewModel < LogLevel ? > { Id = LogLevel . Warning , Name = "Warning" } ,
89
+ new SelectViewModel < LogLevel ? > { Id = LogLevel . Error , Name = "Error" } ,
90
+ new SelectViewModel < LogLevel ? > { Id = LogLevel . Critical , Name = "Critical" } ,
85
91
} ;
86
92
_selectedLogLevel = _logLevels [ 0 ] ;
87
93
@@ -99,6 +105,17 @@ protected override void OnParametersSet()
99
105
{
100
106
_selectedApplication = _applications . SingleOrDefault ( e => e . Id == ApplicationInstanceId ) ?? s_allApplication ;
101
107
ViewModel . ApplicationServiceId = _selectedApplication . Id ;
108
+
109
+ if ( LogLevelText != null && Enum . TryParse < LogLevel > ( LogLevelText , ignoreCase : true , out var logLevel ) )
110
+ {
111
+ _selectedLogLevel = _logLevels . SingleOrDefault ( e => e . Id == logLevel ) ?? _logLevels [ 0 ] ;
112
+ }
113
+ else
114
+ {
115
+ _selectedLogLevel = _logLevels [ 0 ] ;
116
+ }
117
+ ViewModel . LogLevel = _selectedLogLevel . Id ;
118
+
102
119
UpdateSubscription ( ) ;
103
120
}
104
121
@@ -110,15 +127,15 @@ private void UpdateApplications()
110
127
111
128
private Task HandleSelectedApplicationChangedAsync ( )
112
129
{
113
- NavigationManager . NavigateTo ( $ "/StructuredLogs/ { _selectedApplication . Id } " ) ;
130
+ NavigateTo ( _selectedApplication . Id , _selectedLogLevel . Id ) ;
114
131
_applicationChanged = true ;
115
132
116
133
return Task . CompletedTask ;
117
134
}
118
135
119
136
private Task HandleSelectedLogLevelChangedAsync ( )
120
137
{
121
- ViewModel . LogLevel = _selectedLogLevel . Id ;
138
+ NavigateTo ( _selectedApplication . Id , _selectedLogLevel . Id ) ;
122
139
_applicationChanged = true ;
123
140
124
141
return Task . CompletedTask ;
@@ -130,7 +147,7 @@ private void UpdateSubscription()
130
147
if ( _logsSubscription is null || _logsSubscription . ApplicationId != _selectedApplication . Id )
131
148
{
132
149
_logsSubscription ? . Dispose ( ) ;
133
- _logsSubscription = TelemetryRepository . OnNewLogs ( _selectedApplication . Id , async ( ) =>
150
+ _logsSubscription = TelemetryRepository . OnNewLogs ( _selectedApplication . Id , SubscriptionType . Read , async ( ) =>
134
151
{
135
152
ViewModel . ClearData ( ) ;
136
153
await InvokeAsync ( StateHasChanged ) ;
@@ -221,6 +238,26 @@ private void HandleClear(string value)
221
238
StateHasChanged ( ) ;
222
239
}
223
240
241
+ private void NavigateTo ( string ? applicationId , LogLevel ? level )
242
+ {
243
+ string url ;
244
+ if ( applicationId != null )
245
+ {
246
+ url = $ "/StructuredLogs/{ applicationId } ";
247
+ }
248
+ else
249
+ {
250
+ url = $ "/StructuredLogs";
251
+ }
252
+
253
+ if ( level != null )
254
+ {
255
+ url += $ "?level={ level . Value . ToString ( ) . ToLowerInvariant ( ) } ";
256
+ }
257
+
258
+ NavigationManager . NavigateTo ( url ) ;
259
+ }
260
+
224
261
private static string GetRowClass ( OtlpLogEntry entry )
225
262
{
226
263
return $ "log-row-{ entry . Severity . ToString ( ) . ToLowerInvariant ( ) } ";
0 commit comments