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)); }; }
public ProcessOptions(MonitorOptions monitorOptions, bool useProjectPath) { MonitorOptions = monitorOptions; UseProjectPath = useProjectPath; }
private static extern IntPtr MonitorFromPoint(POINT pt, MonitorOptions options);
static extern IntPtr MonitorFromPoint(POINT pt, MonitorOptions dwFlags);
public static extern IntPtr MonitorFromRect(ref RECT lprc, MonitorOptions dwFlags);
public static extern IntPtr MonitorFromWindow(IntPtr windowHandle, MonitorOptions monitorOptions);
public static extern IntPtr MonitorFromPoint(System.Drawing.Point pt, MonitorOptions dwFlags);
private static extern IntPtr MonitorFromPoint(Point pt, MonitorOptions dwFlags);
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; }
static extern IntPtr MonitorFromPoint(PointCoordinate pt, MonitorOptions dwFlags);
public ProcessOptions(bool useProjectPath) { MonitorOptions = default; UseProjectPath = useProjectPath; }
public ProcessOptions(MonitorOptions monitorOptions) { MonitorOptions = monitorOptions; UseProjectPath = false; }
public static extern IntPtr MonitorFromRect([In] ref RECT lprc, [In] MonitorOptions dwFlags);
static extern IntPtr MonitorFromRect(ref RECT lprc, MonitorOptions dwFlags);
public static extern IntPtr MonitorFromWindow(IntPtr hwnd, MonitorOptions dwFlags);
private static async Task <Configuration> GenerateConfiguration(MonitorOptions options) { Initialize(options.LogLevel); return(await GetConfiguration(GetBobApiClient(options.Port))); }
public static extern IntPtr MonitorFromPoint(POINT pt, MonitorOptions dwFlags);
internal static extern IntPtr MonitorFromWindow([In] IntPtr handle, [In] MonitorOptions flags);
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); } }