private void ProcessStats(object state) { if (dispatcher.CanDispatch()) { var currentTrace = Interlocked.Exchange(ref grainTrace, new ConcurrentDictionary <string, SiloGrainTraceEntry>()); var items = currentTrace.Values.ToArray(); foreach (var item in items) { item.Grain = TypeFormatter.Parse(item.Grain); } try { dispatcher.DispatchAsync(() => { this.dashboardGrain = this.dashboardGrain ?? grainFactory.GetGrain <IDashboardGrain>(0); return(dashboardGrain.SubmitTracing(siloAddress, items.AsImmutable())); }).Ignore(); } catch (Exception ex) { logger.LogWarning(100001, ex, "Exception thrown sending tracing to dashboard grain"); } } }
private void ProcessStats(object state) { if (dispatcher.CanDispatch()) { var currentTrace = Interlocked.Exchange(ref grainTrace, new ConcurrentDictionary <string, GrainTraceEntry>()); var items = currentTrace.Values.ToArray(); foreach (var item in items) { item.Grain = TypeFormatter.Parse(item.Grain); } try { dispatcher.DispatchAsync(async() => { var dashboardGrain = grainFactory.GetGrain <IDashboardGrain>(0); await dashboardGrain.SubmitTracing(siloAddress, items).ConfigureAwait(false); }).Wait(30000); } catch (Exception ex) { logger.LogWarning(100001, "Exception thrown sending tracing to dashboard grain", ex); } } }
public Task ReportStats(List <ICounter> statsCounters) { if (dispatcher.CanDispatch()) { var grain = runtime.GrainFactory.GetGrain <ISiloGrain>(runtime.ToSiloAddress()); var values = statsCounters.Select(x => new StatCounter { Name = x.Name, Value = x.GetValueString(), Delta = x.IsValueDelta ? x.GetDeltaString() : null }).OrderBy(x => x.Name).ToArray(); dispatcher.DispatchAsync(() => grain.ReportCounters(values)); } return(Task.CompletedTask); }
public void Flush() { if (dispatcher.CanDispatch()) { var grain = grainFactory.GetGrain <ISiloGrain>(localSiloDetails.SiloAddress.ToParsableString()); var counters = new List <StatCounter>(); foreach (var metric in metrics.ToArray()) { var v = metric.Value.Current; var d = metric.Value.Current - metric.Value.Last; counters.Add(new StatCounter { Name = metric.Key, Value = v.ToString(CultureInfo.InvariantCulture), Delta = d.ToString(CultureInfo.InvariantCulture) }); } foreach (var metric in timespanMetrics.ToArray()) { var v = metric.Value.Current; var d = metric.Value.Current - metric.Value.Last; counters.Add(new StatCounter { Name = metric.Key, Value = v.ToString("c", CultureInfo.InvariantCulture), Delta = d.ToString("c", CultureInfo.InvariantCulture) }); } if (counters.Count > 0) { var countersArray = counters.ToArray(); dispatcher.DispatchAsync(() => grain.ReportCounters(countersArray)); } } }
public async Task Invoke(HttpContext context) { var request = context.Request; if (request.Path == "/" || string.IsNullOrEmpty(request.Path)) { await WriteIndexFile(context); return; } if (request.Path == "/favicon.ico") { await WriteFileAsync(context, "favicon.ico", "image/x-icon"); return; } if (request.Path == "/index.min.js") { await WriteFileAsync(context, "index.min.js", "application/javascript"); return; } if (request.Path == "/version") { await WriteJson(context, new { version = typeof(DashboardMiddleware).Assembly.GetName().Version.ToString() }); return; } if (request.Path == "/DashboardCounters") { var grain = grainFactory.GetGrain <IDashboardGrain>(0); var result = await dispatcher.DispatchAsync(grain.GetCounters).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path == "/ClusterStats") { var grain = grainFactory.GetGrain <IDashboardGrain>(0); var result = await dispatcher.DispatchAsync(grain.GetClusterTracing).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path == "/Reminders") { try { var grain = grainFactory.GetGrain <IDashboardRemindersGrain>(0); var result = await dispatcher.DispatchAsync(() => grain.GetReminders(1, REMINDER_PAGE_SIZE)).ConfigureAwait(false); await WriteJson(context, result); } catch { // if reminders are not configured, the call to the grain will fail await WriteJson(context, new ReminderResponse { Reminders = new ReminderInfo[0], Count = 0 }); } return; } if (request.Path.StartsWithSegments("/Reminders", out var pageString1) && int.TryParse(pageString1.ToValue(), out var page)) { try { var grain = grainFactory.GetGrain <IDashboardRemindersGrain>(0); var result = await dispatcher.DispatchAsync(() => grain.GetReminders(page, REMINDER_PAGE_SIZE)).ConfigureAwait(false); await WriteJson(context, result); } catch { // if reminders are not configured, the call to the grain will fail await WriteJson(context, new ReminderResponse { Reminders = new ReminderInfo[0], Count = 0 }); } return; } if (request.Path.StartsWithSegments("/HistoricalStats", out var remaining)) { var grain = grainFactory.GetGrain <ISiloGrain>(remaining.ToValue()); var result = await dispatcher.DispatchAsync(grain.GetRuntimeStatistics).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path.StartsWithSegments("/SiloProperties", out var address1)) { var grain = grainFactory.GetGrain <ISiloGrain>(address1.ToValue()); var result = await dispatcher.DispatchAsync(grain.GetExtendedProperties).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path.StartsWithSegments("/SiloStats", out var address2)) { var grain = grainFactory.GetGrain <IDashboardGrain>(0); var result = await dispatcher.DispatchAsync(() => grain.GetSiloTracing(address2.ToValue())).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path.StartsWithSegments("/SiloCounters", out var address3)) { var grain = grainFactory.GetGrain <ISiloGrain>(address3.ToValue()); var result = await dispatcher.DispatchAsync(grain.GetCounters).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path.StartsWithSegments("/GrainStats", out var grainName1)) { var grain = grainFactory.GetGrain <IDashboardGrain>(0); var result = await dispatcher.DispatchAsync(() => grain.GetGrainTracing(grainName1.ToValue())).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path == "/Trace") { await TraceAsync(context); return; } await next(context); }
public async Task Invoke(HttpContext context) { var request = context.Request; if (request.Path == "/") { await WriteIndexFile(context); return; } if (request.Path == "/favicon.ico") { await WriteFileAsync(context, "favicon.ico", "image/x-icon"); return; } if (request.Path == "/index.min.js") { await WriteFileAsync(context, "index.min.js", "application/javascript"); return; } if (request.Path == "/DashboardCounters") { var grain = grainFactory.GetGrain <IDashboardGrain>(0); var result = await dispatcher.DispatchAsync(grain.GetCounters).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path == "/ClusterStats") { var grain = grainFactory.GetGrain <IDashboardGrain>(0); var result = await dispatcher.DispatchAsync(grain.GetClusterTracing).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path == "/Reminders") { var grain = grainFactory.GetGrain <IDashboardRemindersGrain>(0); var result = await dispatcher.DispatchAsync(() => grain.GetReminders(1, 25)).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path.StartsWithSegments("/Reminders", out var pageString1) && int.TryParse(pageString1.ToValue(), out var page)) { var grain = grainFactory.GetGrain <IDashboardRemindersGrain>(0); var result = await dispatcher.DispatchAsync(() => grain.GetReminders(page, 25)).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path.StartsWithSegments("/HistoricalStats", out var remaining)) { var grain = grainFactory.GetGrain <ISiloGrain>(remaining.ToValue()); var result = await dispatcher.DispatchAsync(grain.GetRuntimeStatistics).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path.StartsWithSegments("/SiloProperties", out var address1)) { var grain = grainFactory.GetGrain <ISiloGrain>(address1.ToValue()); var result = await dispatcher.DispatchAsync(grain.GetExtendedProperties).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path.StartsWithSegments("/SiloStats", out var address2)) { var grain = grainFactory.GetGrain <IDashboardGrain>(0); var result = await dispatcher.DispatchAsync(() => grain.GetSiloTracing(address2.ToValue())).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path.StartsWithSegments("/SiloCounters", out var address3)) { var grain = grainFactory.GetGrain <ISiloGrain>(address3.ToValue()); var result = await dispatcher.DispatchAsync(grain.GetCounters).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path.StartsWithSegments("/GrainStats", out var grainName1)) { var grain = grainFactory.GetGrain <IDashboardGrain>(0); var result = await dispatcher.DispatchAsync(() => grain.GetGrainTracing(grainName1.ToValue())).ConfigureAwait(false); await WriteJson(context, result); return; } if (request.Path == "/Trace") { await TraceAsync(context); return; } await next(context); }