private void SessionCreated(DiagSession session) { var sessionContainer = new TabPage(session.SessionId) { BorderStyle = BorderStyle.None, Name = session.SessionId, }; var manager = new SessionControl(session, sessionContainer, _stateManager); _sessionTabManagers.Add(session.SessionId, manager); _sessionTabs.TabPages.Add(sessionContainer); _sessionTabs.SelectedTab = sessionContainer; }
public SessionControl(DiagSession session, Control container, DiagnosticsStateManager diagnosticsStateManager) { Session = session; Container = container; DiagnosticsStateManager = diagnosticsStateManager; Container.SuspendLayout(); try { _tabs = new TabControl() { Parent = container, Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom, Appearance = TabAppearance.FlatButtons, }; var logContainer = new TabPage("LOG") { BorderStyle = BorderStyle.None, }; _tabs.TabPages.Add(logContainer); var logManager = new LogListControl(logContainer, diagnosticsStateManager, Session); var ioCommandContainer = new TabPage("I/O") { BorderStyle = BorderStyle.None, }; _tabs.TabPages.Add(ioCommandContainer); var ioCommandManager = new SessionIoCommandListControl(ioCommandContainer, diagnosticsStateManager, Session); logManager.OnLogDoubleClicked += OnLogDoubleClicked; ioCommandManager.OnIoCommandDoubleClicked += OnIoCommandDoubleClicked; diagnosticsStateManager.OnDiagContextCreated += OnDiagContextCreated; container.Resize += Container_Resize; Container_Resize(null, EventArgs.Empty); } finally { Container.ResumeLayout(); } }
public LogListControl(Control container, DiagnosticsStateManager diagnosticsStateManager, DiagSession session) { Container = container; Session = session; _updater = new ControlUpdater <LogModel>(null, Container) { ItemFilter = ItemFilter, }; _updater.CreateSearchBox(10, 10); ShowDebugLevel = new CheckBox() { Parent = container, Bounds = new Rectangle(_updater.SearchBox.Right + 20, _updater.SearchBox.Top, 200, _updater.SearchBox.Height), Text = "Show debug level", CheckAlign = ContentAlignment.MiddleLeft, }; ShowDebugLevel.CheckedChanged += (s, a) => _updater.RefreshItems(true); _updater.ListView.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom; _updater.ListView.Bounds = new Rectangle(Container.ClientRectangle.Left, Container.ClientRectangle.Top + 40, Container.ClientRectangle.Width, Container.ClientRectangle.Height - 40); _updater.ListView.ItemActivate += ListView_ItemActivate; _updater.ListView.Columns.Add(new OLVColumn() { Text = "Timestamp", AspectGetter = x => (x as LogModel)?.Timestamp, AspectToStringConverter = x => ((DateTime)x).ToString("HH:mm:ss.fff", CultureInfo.InvariantCulture), }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Severity", AspectGetter = x => (x as LogModel)?.Event.Severity.ToShortString(), }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Context", AspectGetter = x => (x as LogModel)?.Playbook.DiagContext.Name, }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Process", AspectGetter = x => (x as LogModel)?.Process?.Name, }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Kind", AspectGetter = x => (x as LogModel)?.Process?.KindToString(), }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Type", AspectGetter = x => (x as LogModel)?.Process?.Type, }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Topic", AspectGetter = x => (x as LogModel)?.Process?.Topic, }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Message", AspectGetter = x => (x as LogModel)?.Text, }); _updater.Start(); diagnosticsStateManager.OnDiagContextCreated += ec => { if (ec.Session == session) { ec.WholePlaybook.OnEventsAdded += OnEventsAdded; } }; }
public SessionIoCommandListControl(Control container, DiagnosticsStateManager diagnosticsStateManager, DiagSession session) { Container = container; Session = session; _updater = new ControlUpdater <IoCommandModel>(null, container) { ItemFilter = ItemFilter, }; _updater.CreateSearchBox(10, 10); ShowDbTransactionKind = new CheckBox() { Parent = container, Bounds = new Rectangle(_updater.SearchBox.Right + 20, _updater.SearchBox.Top, 130, _updater.SearchBox.Height), Text = "DB transactions", CheckAlign = ContentAlignment.MiddleLeft, }; ShowDbTransactionKind.CheckedChanged += (s, a) => _updater.RefreshItems(true); ShowDbConnectionKind = new CheckBox() { Parent = container, Bounds = new Rectangle(ShowDbTransactionKind.Right + 20, ShowDbTransactionKind.Top, 130, ShowDbTransactionKind.Height), Text = "DB connections", CheckAlign = ContentAlignment.MiddleLeft, }; ShowDbConnectionKind.CheckedChanged += (s, a) => _updater.RefreshItems(true); HideVeryFast = new CheckBox() { Parent = container, Bounds = new Rectangle(ShowDbConnectionKind.Right + 20, ShowDbTransactionKind.Top, 130, ShowDbTransactionKind.Height), Text = "Hide very fast", CheckAlign = ContentAlignment.MiddleLeft, Checked = true, }; HideVeryFast.CheckedChanged += (s, a) => _updater.RefreshItems(true); _updater.ListView.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom; _updater.ListView.Bounds = new Rectangle(Container.ClientRectangle.Left, Container.ClientRectangle.Top + 40, Container.ClientRectangle.Width, Container.ClientRectangle.Height - 40); _updater.ListView.ItemActivate += ListView_ItemActivate; _updater.ListView.Columns.Add(new OLVColumn() { Text = "ID", AspectGetter = x => (x as IoCommandModel)?.StartEvent.Uid, }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Timestamp", AspectGetter = x => (x as IoCommandModel)?.Timestamp, AspectToStringConverter = x => ((DateTime)x).ToString("HH:mm:ss.fff", CultureInfo.InvariantCulture), }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Context", AspectGetter = x => (x as IoCommandModel)?.Playbook.DiagContext.Name, }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Process", AspectGetter = x => (x as IoCommandModel)?.Process.Name, }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Kind", AspectGetter = x => (x as IoCommandModel)?.Process.KindToString(), }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Type", AspectGetter = x => (x as IoCommandModel)?.Process.Type, }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Topic", AspectGetter = x => (x as IoCommandModel)?.Process.Topic, }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Transaction", AspectGetter = x => (x as IoCommandModel)?.StartEvent.TransactionId, }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Command kind", AspectGetter = x => (x as IoCommandModel)?.StartEvent.Kind.ToString(), }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Location", AspectGetter = x => (x as IoCommandModel)?.StartEvent.Location, }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Path", AspectGetter = x => (x as IoCommandModel)?.StartEvent.Path, }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Timeout", AspectGetter = x => (x as IoCommandModel)?.StartEvent.TimeoutSeconds, TextAlign = HorizontalAlignment.Right, HeaderTextAlign = HorizontalAlignment.Right, }); _updater.ListView.Columns.Add(new OLVColumn() { Text = "Elapsed", AspectGetter = x => (x as IoCommandModel)?.Elapsed, AspectToStringConverter = x => x is TimeSpan ts ? FormattingHelpers.RightAlignedTimeSpanToString(ts) : null, TextAlign = HorizontalAlignment.Right, HeaderTextAlign = HorizontalAlignment.Right, });
private void ListenerCallBack(IAsyncResult result) { if (_listener == null) { return; } try { var listenerContext = _listener.EndGetContext(result); var request = listenerContext.Request; var response = listenerContext.Response; var query = HttpUtility.ParseQueryString(request.Url.Query); var sessionId = query?["sid"]; var contextName = query?["ctx"] ?? "session"; if (string.IsNullOrEmpty(sessionId) || string.IsNullOrEmpty(contextName) || listenerContext.Request.Url.AbsolutePath != "/diag" || request.HttpMethod != "POST") { var droppedResponse = Encoding.UTF8.GetBytes("DROPPED"); listenerContext.Response.StatusCode = 200; listenerContext.Response.KeepAlive = false; listenerContext.Response.ContentLength64 = droppedResponse.Length; listenerContext.Response.OutputStream.Write(droppedResponse, 0, droppedResponse.Length); listenerContext.Response.Close(); return; } var now = DateTime.Now; if (!_sessionList.TryGetValue(sessionId, out var session)) { var folder = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "incoming-sessions", now.ToString("yyyy-MM-dd - HH-mm-ss", CultureInfo.InvariantCulture) + " - " + sessionId); if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } File.WriteAllLines(Path.Combine(folder, "session-info.txt"), new[] { "id\t" + sessionId, "started-on\t" + now.ToString("yyyy.MM.dd HH:mm:ss.fff", CultureInfo.InvariantCulture), }); session = new DiagSession(sessionId, folder, now); lock (_sessionList) { _sessionList.Add(sessionId, session); _newSessions.Add(session); } } if (!session.ContextListByName.TryGetValue(contextName, out var context)) { var folder = Path.Combine(session.DataFolder, contextName.Replace("/", "-", StringComparison.InvariantCultureIgnoreCase)); if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } File.WriteAllLines(Path.Combine(folder, "context-info.txt"), new[] { "name\t" + contextName, "started-on\t" + now.ToString("yyyy.MM.dd HH:mm:ss.fff", CultureInfo.InvariantCulture), }); context = new DiagContext(session, contextName, now, folder); lock (_sessionList) { session.ContextList.Add(context); session.ContextListByName.Add(contextName, context); _newDiagContexts.Add(context); } } using (var tempMemoryStream = new MemoryStream()) { listenerContext.Request.InputStream.CopyTo(tempMemoryStream); tempMemoryStream.Position = 0; context.Stage(tempMemoryStream); } var acceptedResponse = Encoding.UTF8.GetBytes("ACK"); listenerContext.Response.StatusCode = 200; listenerContext.Response.KeepAlive = false; listenerContext.Response.ContentLength64 = acceptedResponse.Length; listenerContext.Response.OutputStream.Write(acceptedResponse, 0, acceptedResponse.Length); listenerContext.Response.Close(); } catch (Exception) { } finally { _listener.BeginGetContext(ListenerCallBack, null); } }