static extern IntPtr MonitorFromWindow(IntPtr handle, MonitorOptions dwFlags);
        public DiskIoPerformanceMonitor(MonitorOptions options)
        {
            var process = Process.GetProcessById(options.ProcessId);

            RavenDocumentStore.Init(options.ServerUrl);
            store = RavenDocumentStore.DocumentStore;
            var resourcesToMonitor = GetResourcesToMonitor();

            run.StartTime         = SystemTime.UtcNow;
            run.ProcessId         = options.ProcessId;
            run.ProcessName       = process.ProcessName;
            run.DurationInMinutes = options.IoOptions.DurationInMinutes;
            run.DisplayName       = GenerateDisplayName(run);
            if (options.IoOptions.DurationInMinutes > 0)
            {
                timer = new Timer(_ => Stop(), null, TimeSpan.FromMinutes(options.IoOptions.DurationInMinutes), TimeSpan.FromMilliseconds(-1));
            }

            session = new TraceEventSession(KernelTraceEventParser.KernelSessionName);
            session.EnableKernelProvider(KernelTraceEventParser.Keywords.FileIOInit | KernelTraceEventParser.Keywords.FileIO);

            session.Source.Kernel.FileIORead += data =>
            {
                if (data.ProcessID != options.ProcessId)
                {
                    return;
                }

                var fileName = data.FileName;
                if (string.IsNullOrEmpty(fileName))
                {
                    return;
                }

                if (resourcesToMonitor.Any(x => x.IsMatch(fileName)) == false)
                {
                    return;
                }

                operations.AddOrUpdate(data.IrpPtr, new FileIoData(fileName, OperationType.Read, data.TimeStampRelativeMSec, data.IoSize), (_, d) =>
                {
                    d.IoSizeInBytes += data.IoSize;
                    return(d);
                });
            };

            session.Source.Kernel.FileIOWrite += data =>
            {
                if (data.ProcessID != options.ProcessId)
                {
                    return;
                }

                var fileName = data.FileName;
                if (string.IsNullOrEmpty(fileName))
                {
                    return;
                }

                if (resourcesToMonitor.Any(x => x.IsMatch(fileName)) == false)
                {
                    return;
                }

                operations.AddOrUpdate(data.IrpPtr, new FileIoData(fileName, OperationType.Write, data.TimeStampRelativeMSec, data.IoSize), (_, d) =>
                {
                    d.IoSizeInBytes += data.IoSize;
                    return(d);
                });
            };

            session.Source.Kernel.FileIOOperationEnd += data =>
            {
                //NOTE: we can't compare data.ProcessID with options.ProcessId, because data.ProcessID is always -1 on Windows 7 (however it works on Win 8).

                FileIoData value;
                if (operations.TryRemove(data.IrpPtr, out value) == false)
                {
                    return;
                }

                var fileName = value.FileName;
                var ioSize   = value.IoSizeInBytes;
                var durationInMilliseconds = data.TimeStampRelativeMSec - value.TimeStampRelativeInMilliseconds;
                var resourceInformation    = GetResourceInformation(fileName, resourcesToMonitor);
                var operationType          = value.OperationType;
                var utcTimeStamp           = data.TimeStamp.ToUniversalTime();

                var endTimeStamp = new DateTime(utcTimeStamp.Year, utcTimeStamp.Month, utcTimeStamp.Day, utcTimeStamp.Hour, utcTimeStamp.Minute, utcTimeStamp.Second);

                fileOperations.Add(new FileOperation(fileName, operationType, ioSize, durationInMilliseconds, endTimeStamp, resourceInformation));
            };
        }
示例#3
0
 static extern IntPtr MonitorFromWindow(IntPtr handle, MonitorOptions dwFlags);
示例#4
0
 public ProcessOptions(MonitorOptions monitorOptions, bool useProjectPath)
 {
     MonitorOptions = monitorOptions;
     UseProjectPath = useProjectPath;
 }
 private static extern IntPtr MonitorFromPoint(POINT pt, MonitorOptions options);
示例#6
0
 static extern IntPtr MonitorFromPoint(POINT pt, MonitorOptions dwFlags);
示例#7
0
文件: User32.cs 项目: AArnott/pinvoke
 public static extern IntPtr MonitorFromRect(ref RECT lprc, MonitorOptions dwFlags);
示例#8
0
 public static extern IntPtr MonitorFromWindow(IntPtr windowHandle, MonitorOptions monitorOptions);
 public static extern IntPtr MonitorFromPoint(System.Drawing.Point pt, MonitorOptions dwFlags);
示例#10
0
 private static extern IntPtr MonitorFromPoint(Point pt, MonitorOptions dwFlags);
示例#11
0
        private static async Task Log(ILogger <Program> logger, MonitorOptions options)
        {
            logger.LogInformation("开始批量处理Log文件");

            var files = ListFiles(Path.Combine(options.FindResponseLogPath, "extract"));

            foreach (var file in files)
            {
                logger.LogInformation("正在处理Log文件:" + file.Name);

                var path = CommonHelper.MapPath(file.FullName);
                var data = MessagePackHelper.ToObject <List <MonitorEvent> >(path);

                var resultResponse = new List <ResponseSnap>();
                var resultSql      = new List <SqlSnap>();
                var resultError    = new List <ExceptionSnap>();
                var resultTrace    = new List <TrackSnap>();
                foreach (var item in data)
                {
                    var traceId = GetValue <string>(item.Data, MonitorKeys.trace_id);

                    if (item.EventType == RequestTypeEnum.Http.ToString().ToLowerInvariant())
                    {
                        var snap = PreResponse(item, traceId);
                        resultResponse.Add(snap);
                    }
                    else if (item.EventType == RequestTypeEnum.Signalr.ToString().ToLowerInvariant())
                    {
                        var snap = PreResponse(item, traceId);
                        resultResponse.Add(snap);
                    }
                    else if (item.EventType == RequestTypeEnum.Sql.ToString().ToLowerInvariant())
                    {
                        var snap = PreSql(item, traceId);
                        resultSql.Add(snap);
                    }
                    else
                    {
                        var snap = PreTrace(item, traceId);
                        if (snap != null)
                        {
                            resultTrace.Add(snap);
                        }
                        else
                        {
                            logger.LogWarning("事件{0},得EventType为{1},不正确", traceId, item.EventType);
                            continue;
                        }
                    }


                    if (item.Data.ContainsKey(MonitorKeys.request_error))
                    {
                        var source       = GetValue <string>(item.Data, MonitorKeys.request_error);
                        var errormessage = GetValue <string>(item.Data, MonitorKeys.request_errordetail);

                        var snap = new ExceptionSnap
                        {
                            TraceId     = traceId,
                            ErrorSource = source,
                            ErrorDetail = errormessage,
                            CreateTime  = DateTime.Now
                        };

                        resultError.Add(snap);
                    }
                }

                var dbContext = IoC.Resolve <IDbContext>("monitor_dbcontext");
                if (resultResponse.Any())
                {
                    await IoC.Resolve <IGenericRepository <ResponseSnap> >().CreateRange(resultResponse);
                }
                if (resultSql.Any())
                {
                    await IoC.Resolve <IGenericRepository <SqlSnap> >().CreateRange(resultSql);
                }
                if (resultError.Any())
                {
                    await IoC.Resolve <IGenericRepository <ExceptionSnap> >().CreateRange(resultError);
                }
                if (resultTrace.Any())
                {
                    await IoC.Resolve <IGenericRepository <TrackSnap> >().CreateRange(resultTrace);
                }

                File.Delete(file.FullName);
            }

            logger.LogInformation("结束这批处理Log文件,共:" + files.Count());

            await Task.CompletedTask;
        }
示例#12
0
 static extern IntPtr MonitorFromPoint(PointCoordinate pt, MonitorOptions dwFlags);
示例#13
0
 public ProcessOptions(bool useProjectPath)
 {
     MonitorOptions = default;
     UseProjectPath = useProjectPath;
 }
示例#14
0
 public ProcessOptions(MonitorOptions monitorOptions)
 {
     MonitorOptions = monitorOptions;
     UseProjectPath = false;
 }
示例#15
0
 public static extern IntPtr MonitorFromRect([In] ref RECT lprc, [In] MonitorOptions dwFlags);
示例#16
0
 static extern IntPtr MonitorFromRect(ref RECT lprc, MonitorOptions dwFlags);
示例#17
0
 public static extern IntPtr MonitorFromWindow(IntPtr hwnd, MonitorOptions dwFlags);
示例#18
0
 private static async Task <Configuration> GenerateConfiguration(MonitorOptions options)
 {
     Initialize(options.LogLevel);
     return(await GetConfiguration(GetBobApiClient(options.Port)));
 }
示例#19
0
文件: User32.cs 项目: AArnott/pinvoke
 public static extern IntPtr MonitorFromPoint(POINT pt, MonitorOptions dwFlags);
示例#20
0
 internal static extern IntPtr MonitorFromWindow([In] IntPtr handle, [In] MonitorOptions flags);
示例#21
0
文件: User32.cs 项目: AArnott/pinvoke
 public static extern IntPtr MonitorFromWindow(IntPtr hwnd, MonitorOptions dwFlags);
示例#22
0
        private static async Task TimeStore(ILogger <Program> logger, MonitorOptions options)
        {
            try {
                logger.LogInformation("开始处理 TimeStore 数据");

                var now  = DateTimeHelper.GetTimeGroup(DateTime.Now);
                var keys = timeStore.GetKeys().Where(w => w != now).ToList();
                foreach (var key in keys)
                {
                    var logs = timeStore.GetByKey(key);
                    if (logs == null || !logs.Any())
                    {
                        timeStore.Remove(key);
                        continue;
                    }
                    var trafficStatistService = IoC.Resolve <ITrafficStatistService>();

                    if (dateStore.ContainsKey(key))
                    {
                        var item = await trafficStatistService.GetTrafficStatistByDateTime(Convert.ToInt64(key));

                        if (item != null)
                        {
                            item.TotalHttpReq              += logs.Count(w => w.Key == MonitorContextKeys.http);
                            item.TotalSignalrReq           += logs.Count(w => w.Key == MonitorContextKeys.signalr);
                            item.TotalReq                   = item.TotalHttpReq + item.TotalSignalrReq;
                            item.ExceptionReq              += logs.Count(w => w.Key == MonitorContextKeys.fault);
                            item.TotalSignalrConnectReq    += logs.Count(w => w.Key == MonitorContextKeys.signalr_connect);
                            item.TotalSignalrDisconnectReq += logs.Count(w => w.Key == MonitorContextKeys.signalr_disconnect);

                            await trafficStatistService.UpdateTrafficStatist(item);

                            continue;
                        }
                        else
                        {
                            logger.LogWarning("Syinpo.Monitor.Processor TimeStore key 与实际入库不一致:" + key);
                        }
                    }


                    TrafficStatist trafficStatist = new TrafficStatist();

                    // request
                    trafficStatist.DateTime        = Convert.ToInt64(key);
                    trafficStatist.TotalHttpReq    = logs.Count(w => w.Key == MonitorContextKeys.http);
                    trafficStatist.TotalSignalrReq = logs.Count(w => w.Key == MonitorContextKeys.signalr);
                    trafficStatist.TotalReq        = trafficStatist.TotalHttpReq + trafficStatist.TotalSignalrReq;
                    trafficStatist.ExceptionReq    = logs.Count(w => w.Key == MonitorContextKeys.fault);

                    // signalr
                    trafficStatist.TotalSignalrConnectReq    = logs.Count(w => w.Key == MonitorContextKeys.signalr_connect);
                    trafficStatist.TotalSignalrDisconnectReq = logs.Count(w => w.Key == MonitorContextKeys.signalr_disconnect);
                    var onlines = logs.Where(w => w.Key == MonitorContextKeys.online_device).ToList();
                    if (onlines.Any())
                    {
                        trafficStatist.TotalOnlineDevice = (long)onlines.Average(a => Convert.ToInt64(a.Val));
                    }

                    // server
                    var cpu_server = logs.Where(w => w.Key == MonitorContextKeys.cpu_server).ToList();
                    if (cpu_server.Any())
                    {
                        trafficStatist.ServerCpuAvgRate = cpu_server.Average(a => Convert.ToDecimal(a.Val));
                        trafficStatist.ServerCpuTopRate = cpu_server.Max(a => Convert.ToDecimal(a.Val));
                    }
                    var ram_server = logs.Where(w => w.Key == MonitorContextKeys.ram_server).ToList();
                    if (ram_server.Any())
                    {
                        trafficStatist.ServerRamAvgRate = ram_server.Average(a => Convert.ToDecimal(a.Val));
                        trafficStatist.ServerRamTopRate = ram_server.Max(a => Convert.ToDecimal(a.Val));
                    }

                    // app
                    var cpu_app = logs.Where(w => w.Key == MonitorContextKeys.cpu_app).ToList();
                    if (cpu_app.Any())
                    {
                        trafficStatist.AppliationCpuAvgRate = cpu_app.Average(a => Convert.ToDecimal(a.Val));
                        trafficStatist.AppliationCpuTopRate = cpu_app.Max(a => Convert.ToDecimal(a.Val));
                    }
                    var ram_app_size = logs.Where(w => w.Key == MonitorContextKeys.ram_app_size).ToList();
                    if (ram_app_size.Any())
                    {
                        trafficStatist.AppliationRamAvgSize = ram_app_size.Average(a => Convert.ToDecimal(a.Val));
                    }

                    //trafficStatist.AppliationRamAvgRate = logs
                    //    .Where( w => w.Item1 == MonitorContextKeys.ram_app )
                    //    .Average( a => (decimal)a.Item2 );
                    //trafficStatist.AppliationRamTopRate = logs
                    //    .Where( w => w.Item1 == MonitorContextKeys.ram_app )
                    //    .Max( a => (decimal)a.Item2 );


                    trafficStatist.CreateTime = DateTime.Now;

                    await trafficStatistService.InsertTrafficStatist(trafficStatist);

                    trafficStatistService = null;

                    timeStore.Remove(key);
                    if (!dateStore.ContainsKey(key))
                    {
                        dateStore.TryAdd(key, key);
                    }

                    if (dateStore.Keys.Count > 100)
                    {
                        dateStore.TryRemove(dateStore.Keys.First(), out string val);
                    }
                }

                logger.LogInformation("结束处理 TimeStore.");
            }
            catch (Exception ex) {
                logger.LogError("Syinpo.Monitor.Processor TimeStore 错误:" + ex.Message);
            }
        }