private void OnTraceEventInternal(object sender, xlAmo.TraceEventArgs e) { // we are using CommandBegin as a "heartbeat" to check if the trace // has started capturing events if (!_traceStarted) { Log.Debug("{class} {mothod} Pending TraceEvent: {eventClass}", "QueryTraceEngineExcel", "OnTraceEventInternal", e.EventClass.ToString()); StopTimer(); _traceStarted = true; _connection.Close(false); _connection.Dispose(); _connection = null; Status = QueryTraceStatus.Started; TraceStarted?.Invoke(this, null); var f = new System.IO.FileInfo(_trace.Parent.Name); _friendlyServerName = f.Name; } else { Log.Debug("{class} {method} TraceEvent: {eventClass}", "QueryTraceEngineExcel", "OnTraceEventInternal", e.EventClass.ToString()); //OnTraceEvent(e); _capturedEvents.Add(CreateTraceEventArg(e, _friendlyServerName)); if (e.EventClass == xlAmo.TraceEventClass.QueryEnd) { // Raise an event with the captured events TraceCompleted?.Invoke(this, _capturedEvents); // reset the captured events collection _capturedEvents = new List <DaxStudioTraceEventArgs>(); } } }
public void OnTraceComplete(JArray myArray) { // HACK: not sure why we have to explicitly cast the argument from a JArray, I thought Signalr should do this for us var e = myArray.ToObject <DaxStudioTraceEventArgs[]>(); TraceCompleted?.Invoke(this, e); }
// private variables private void OnTraceEventInternal(object sender, TraceEventArgs e) { try { if (_globalOptions.TraceDirectQuery && _filterForCurrentSession) { if ((e.SessionID != null) && (e.SessionID != _sessionId)) { System.Diagnostics.Debug.Print("Skipped event by session {0} - {1}", e.EventClass.ToString(), e.SessionID); Log.Verbose("Skipped event by session {EventClass} - {sessionId}", e.EventClass.ToString(), e.SessionID); return; } // Check ActivityId only for DirectQueryEnd event (others should be already filtered by SessionID) if (e.EventClass == TraceEventClass.DirectQueryEnd) { bool bSkipByActivity = string.IsNullOrEmpty(_activityId); if (!bSkipByActivity) { bSkipByActivity = e[TraceColumn.ActivityID] != _activityId; } if (bSkipByActivity) { System.Diagnostics.Debug.Print("Skipped event by activity {0} - {1}", e.EventClass.ToString(), e[TraceColumn.ActivityID]); Log.Verbose("Skipped event by activity {EventClass} - {sessionId}", e.EventClass.ToString(), e[TraceColumn.ActivityID]); return; } } } // we are using CommandBegin as a "heartbeat" to check if the trace // has started capturing events if (!_traceStarted) { System.Diagnostics.Debug.Print("Pending TraceEvent: {0}", e.EventClass.ToString()); Log.Verbose("Pending TraceEvent: {EventClass} - {EventSubClass}", e.EventClass.ToString(), e.EventSubclass.ToString()); Log.Verbose("Saving ActivityID: {ActivityID}", e[TraceColumn.ActivityID]); StopTimer(); _traceStarted = true; _connection.Close(false); Status = QueryTraceStatus.Started; if (TraceStarted != null) { Log.Debug("{class} {method} {message}", "QueryTraceEngine", "OnTraceEventInternal", "Notifying subscribers that Trace has started"); TraceStarted(this, null); } else { Log.Debug("{class} {method} {message}", "QueryTraceEngine", "OnTraceEventInternal", "No Trace started subscribers found"); } } else { System.Diagnostics.Debug.Print("TraceEvent: {0}", e.EventClass.ToString()); Log.Verbose("TraceEvent: {EventClass} - {EventSubClass} - {ActivityId}", e.EventClass.ToString(), e.EventSubclass.ToString(), e[TraceColumn.ActivityID]); if (e.EventClass == TraceEventClass.QueryBegin) { // Save activityId and skip event handling _activityId = e[TraceColumn.ActivityID]; Log.Verbose("Started ActivityId: {EventClass} - {ActivityId}", e.EventClass.ToString(), e[TraceColumn.ActivityID]); //return; } OnTraceEvent(e); _capturedEvents.Add(new DaxStudioTraceEventArgs(e, _powerBIFileName)); if (e.EventClass == TraceEventClass.QueryEnd) { // Raise an event with the captured events TraceCompleted?.Invoke(this, _capturedEvents); // reset the captured events collection _capturedEvents = new List <DaxStudioTraceEventArgs>(); // Reset activity ID _activityId = null; } } } catch (Exception ex) { Execute.OnUIThreadAsync(() => RaiseError(ex)); } }
private void OnTraceEventInternal(object sender, TraceEventArgs e) { try { if (_globalOptions.TraceDirectQuery && _filterForCurrentSession) { if ((e.SessionID != null) && (e.SessionID != _sessionId)) { System.Diagnostics.Debug.Print("Skipped event by session {0} - {1}", e.EventClass.ToString(), e.SessionID); Log.Verbose("Skipped event by session {EventClass} - {sessionId}", e.EventClass.ToString(), e.SessionID); return; } // Check ActivityId only for DirectQueryEnd event (others should be already filtered by SessionID) if (e.EventClass == TraceEventClass.DirectQueryEnd) { bool bSkipByActivity = string.IsNullOrEmpty(_activityId); if (!bSkipByActivity) { bSkipByActivity = e[TraceColumn.ActivityID] != _activityId; } if (bSkipByActivity) { System.Diagnostics.Debug.Print("Skipped event by activity {0} - {1}", e.EventClass.ToString(), e[TraceColumn.ActivityID]); Log.Verbose("Skipped event by activity {EventClass} - {sessionId}", e.EventClass.ToString(), e[TraceColumn.ActivityID]); return; } } } // we are using CommandBegin as a "heartbeat" to check if the trace // has started capturing events if (!_traceStarted) { System.Diagnostics.Debug.Print("Pending TraceEvent: {0}", e.EventClass.ToString()); Log.Verbose("Pending TraceEvent: {EventClass} - {EventSubClass}", e.EventClass.ToString(), e.EventSubclass.ToString()); Log.Verbose("Saving ActivityID: {ActivityID}", e[TraceColumn.ActivityID]); StopTimer(); _traceStarted = true; Status = QueryTraceStatus.Started; if (TraceStarted != null) { Log.Debug("{class} {method} {message}", "QueryTraceEngine", "OnTraceEventInternal", "Notifying subscribers that Trace has started"); TraceStarted(this, null); } else { Log.Debug("{class} {method} {message}", "QueryTraceEngine", "OnTraceEventInternal", "No Trace started subscribers found"); } } else { // exit early if there is no text in the query if ((e.EventClass == TraceEventClass.QueryBegin || e.EventClass == TraceEventClass.QueryEnd) && e.TextData.StartsWith("/* PING */")) { Debug.WriteLine("Skipping Empty <Statement>"); return; } System.Diagnostics.Debug.Print("TraceEvent: {0}", e.EventClass.ToString()); Log.Verbose("TraceEvent: {EventClass} - {EventSubClass} - {ActivityId}", e.EventClass.ToString(), e.EventSubclass.ToString(), e[TraceColumn.ActivityID]); if (e.EventClass == TraceEventClass.QueryBegin) { // Save activityId and skip event handling _activityId = e[TraceColumn.ActivityID]; Log.Verbose("Started ActivityId: {EventClass} - {ActivityId}", e.EventClass.ToString(), e[TraceColumn.ActivityID]); //return; } OnTraceEvent(e); _capturedEvents.Add(new DaxStudioTraceEventArgs(e, _powerBiFileName)); if (e.EventClass == TraceEventClass.QueryEnd || e.EventClass == TraceEventClass.Error || e.EventClass == TraceEventClass.CommandEnd) { // if this is not an internal DAX Studio query // like the one we issue after a ClearCache to re-establish the session // then call TraceCompleted, otherwise we clear out the captured events // and keep waiting if (!e.TextData.Contains(Constants.InternalQueryHeader)) { // Raise an event with the captured events TraceCompleted?.Invoke(this, _capturedEvents); } // reset the captured events collection _capturedEvents = new List <DaxStudioTraceEventArgs>(); // Reset activity ID _activityId = null; } } } catch (Exception ex) { Execute.OnUIThreadAsync(() => RaiseError(ex)); } }