static void Main(string[] args) { workspaceName = configuration.GetSection("PushDataset:workspaceName").Value; pushDatasetName = configuration.GetSection("PushDataset:datasetName").Value; clearDataSetOnStart = bool.Parse(configuration.GetSection("PushDataset:clearDataSetOnStart").Value); pbiHttpHelper = new PBIHTTPHelper(interactiveLogin: true); EnsurePBIPushDataSet().Wait(); Server server = new Server(); Console.CursorVisible = false; int rowsProcessed = 0; /************************************************************************** * Connect to Azure Analysis Services or Power BI Premium * PBI Premium requires XMLA-Read * PBI Premium also requires to connect to Server AND DB (using inital Catalog property) * This should enable MFA popup **************************************************************************/ server.Connect(configuration.GetConnectionString("databaseToTrace")); _sessionId = server.SessionID; /************************************************************************** * Remove any previous version of trace created using this app **************************************************************************/ TraceCollection traceCollection = server.Traces; for (int d = 0; d < traceCollection.Count; d++) { Trace p = traceCollection[d]; if (p.Name.StartsWith("TracePost")) { if (p.IsStarted) { p.Stop(); } p.Drop(); } } /************************************************************************** * Create the trace **************************************************************************/ Trace trace = server.Traces.Add("TracePost"); trace.AutoRestart = true; /************************************************************************** * Create the event 1 of 2 to trace [ProgressReportCurrent] **************************************************************************/ TraceEvent traceEvent = trace.Events.Add(Microsoft.AnalysisServices.TraceEventClass.ProgressReportCurrent); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.IntegerData); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.CurrentTime); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ObjectID); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ObjectReference); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.SessionID); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ObjectName); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.DatabaseName); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.StartTime); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.EventSubclass); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.TextData); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ActivityID); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.RequestID); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ProgressTotal); /************************************************************************** * Create the event 2 of 2 to trace [ProgressReportCurrent] **************************************************************************/ TraceEvent traceEvent2 = trace.Events.Add(Microsoft.AnalysisServices.TraceEventClass.ProgressReportEnd); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.IntegerData); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.CurrentTime); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ObjectID); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ObjectReference); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.SessionID); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ObjectName); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.DatabaseName); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.StartTime); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.EndTime); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.EventSubclass); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.TextData); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.Duration); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ActivityID); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.RequestID); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ProgressTotal); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.Success); // traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ApplicationName); /************************************************************************** * Determine the function to handle trace events as the happen **************************************************************************/ trace.OnEvent += new TraceEventHandler(Trace_OnEvent); /************************************************************************** * Save the trace **************************************************************************/ trace.Update(Microsoft.AnalysisServices.UpdateOptions.Default, Microsoft.AnalysisServices.UpdateMode.CreateOrReplace); /************************************************************************** * Start the trace **************************************************************************/ trace.Start(); /************************************************************************** * Create an infinite loop that runs every 5 second to check for items * store in the myQ queue. Post results in batches to the Power BI streaming * API endpoint **************************************************************************/ Boolean b = true; do { /************************************************************************** * Pause for 5 seconds **************************************************************************/ Thread.Sleep(BatchSleepTime); /************************************************************************** * Create a batch of rows from the myQ queue **************************************************************************/ var rowsToSend = new List <myTraceEvent>(); for (int i = 0; i < rowsPerPost && myQ.Count > 0; i++) { rowsToSend.Add((myTraceEvent)myQ.Dequeue()); rowsProcessed++; } /************************************************************************** * If there were items in the queue send them to Power BI now **************************************************************************/ if (rowsToSend.Count != 0) { SendToPBIDataset(rowsToSend).Wait(); } /************************************************************************** * Update screen to show progress **************************************************************************/ Console.SetCursorPosition(10, 10); Console.Write($"Queue Count : {myQ.Count} "); Console.SetCursorPosition(10, 12); Console.Write($"Rows Processed : {rowsProcessed} "); Console.SetCursorPosition(10, 14); Console.Write($"Current Time : {DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")} "); } while (b); trace.Stop(); }
static void Main(string[] args) { Server server = new Server(); Console.CursorVisible = false; Boolean activityFound = false; string jsonString; string row; int rowsProcessed = 0; /************************************************************************** * Connect to Azure Analysis Services or Power BI Premium * PBI Premium requires XMLA-Read * PBI Premium also requires to connect to Server AND DB (using inital Catalog property) * This should enable MFA popup **************************************************************************/ server.Connect(databaseToTrace); _sessionId = server.SessionID; /************************************************************************** * Remove any previous version of trace created using this app **************************************************************************/ TraceCollection traceCollection = server.Traces; for (int d = 0; d < traceCollection.Count; d++) { Trace p = traceCollection[d]; if (p.Name.StartsWith("TracePost")) { if (p.IsStarted) { p.Stop(); } p.Drop(); } } /************************************************************************** * Create the trace **************************************************************************/ Trace trace = server.Traces.Add("TracePost"); trace.AutoRestart = true; /************************************************************************** * Create the event 1 of 2 to trace [ProgressReportCurrent] **************************************************************************/ TraceEvent traceEvent = trace.Events.Add(Microsoft.AnalysisServices.TraceEventClass.ProgressReportCurrent); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.IntegerData); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.CurrentTime); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ObjectID); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ObjectReference); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.SessionID); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ObjectName); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.DatabaseName); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.StartTime); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.EventSubclass); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.TextData); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ActivityID); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.RequestID); traceEvent.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ProgressTotal); /************************************************************************** * Create the event 2 of 2 to trace [ProgressReportCurrent] **************************************************************************/ TraceEvent traceEvent2 = trace.Events.Add(Microsoft.AnalysisServices.TraceEventClass.ProgressReportEnd); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.IntegerData); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.CurrentTime); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ObjectID); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ObjectReference); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.SessionID); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ObjectName); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.DatabaseName); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.StartTime); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.EndTime); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.EventSubclass); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.TextData); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.Duration); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ActivityID); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.RequestID); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ProgressTotal); traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.Success); // traceEvent2.Columns.Add(Microsoft.AnalysisServices.TraceColumn.ApplicationName); /************************************************************************** * Determine the function to handle trace events as the happen **************************************************************************/ trace.OnEvent += new TraceEventHandler(Trace_OnEvent); /************************************************************************** * Save the trace **************************************************************************/ trace.Update(Microsoft.AnalysisServices.UpdateOptions.Default, Microsoft.AnalysisServices.UpdateMode.CreateOrReplace); /************************************************************************** * Start the trace **************************************************************************/ trace.Start(); /************************************************************************** * Create an infinite loop that runs every 5 second to check for items * store in the myQ queue. Post results in batches to the Power BI streaming * API endpoint **************************************************************************/ Boolean b = true; do { /************************************************************************** * Pause for 5 seconds **************************************************************************/ Thread.Sleep(BatchSleepTime); activityFound = false; /************************************************************************** * Start building JSON string to post data to Power BI **************************************************************************/ jsonString = "{\"rows\": ["; /************************************************************************** * Create a batch of rows from the myQ queue **************************************************************************/ for (int i = 0; i < rowsPerPost && myQ.Count > 0; i++) { activityFound = true; row = myQ.Dequeue().ToString(); jsonString += $"{row},"; rowsProcessed++; } jsonString += "]}"; /************************************************************************** * If there were items in the queue send them to Power BI now **************************************************************************/ if (activityFound) { Task <HttpResponseMessage> postToPowerBI = HttpPostAsync(PowerBIAPI, jsonString); } /************************************************************************** * Update screen to show progress **************************************************************************/ Console.SetCursorPosition(10, 10); Console.Write($"Queue Count : {myQ.Count} "); Console.SetCursorPosition(10, 12); Console.Write($"Rows Processed : {rowsProcessed} "); Console.SetCursorPosition(10, 14); Console.Write($"Current Time : {DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")} "); } while (b); trace.Stop(); }