Esempio n. 1
0
 public LetPortalMonitorHealthCheck(
     IOptionsMonitor <MonitorOptions> monitorOptions,
     IOptionsMonitor <DatabaseOptions> databaseOptions,
     IOptionsMonitor <LoggerOptions> loggerOptions,
     IOptionsMonitor <ServiceOptions> serviceOptions,
     IMonitorHealthCheck monitorHealthCheck)
 {
     _monitorOptions     = monitorOptions;
     _databaseOptions    = databaseOptions;
     _loggerOptions      = loggerOptions;
     _serviceOptions     = serviceOptions;
     _monitorHealthCheck = monitorHealthCheck;
 }
        public async Task Invoke(
            HttpContext httpContext,
            IOptionsMonitor <MonitorOptions> monitorOption,
            IMonitorHealthCheck monitorHealthCheck,
            IServiceLogger <AddRequestMonitorMiddleware> serviceLogger)
        {
            if (monitorOption.CurrentValue.Enable)
            {
                var requestMonitor = new RequestMonitor
                {
                    BeginDateTime = DateTime.UtcNow
                };
                var startTime     = DateTime.UtcNow;
                var startCpuUsage = Process.GetCurrentProcess().TotalProcessorTime;
                var stopWatch     = new Stopwatch();
                stopWatch.Start();
                await _next.Invoke(httpContext);

                stopWatch.Stop();
                var endTime     = DateTime.UtcNow;
                var endCpuUsage = Process.GetCurrentProcess().TotalProcessorTime;
                requestMonitor.ElapsedTime = stopWatch.ElapsedMilliseconds;
                requestMonitor.EndDateTime = DateTime.UtcNow;
                var cpuUsedMs     = (endCpuUsage - startCpuUsage).TotalMilliseconds;
                var totalMsPassed = (endTime - startTime).TotalMilliseconds;
                var cpuUsageTotal = cpuUsedMs / (Environment.ProcessorCount * totalMsPassed);
                requestMonitor.CpuUsage = cpuUsageTotal * 100;
                if (requestMonitor.CpuUsage > 100)
                {
                    requestMonitor.CpuUsage = 100;
                }
                requestMonitor.StatusCode = httpContext.Response.StatusCode;
                requestMonitor.MemoryUsed = Process.GetCurrentProcess().WorkingSet64 / 1024;
                monitorHealthCheck.AddRequestMonitor(requestMonitor);
                httpContext.Items[Constants.RequestMonitor] = requestMonitor;
                serviceLogger.Info("Request complete with these usages {$Monitor}", requestMonitor.ToJson());
            }
            else
            {
                await _next.Invoke(httpContext);
            }
        }