Example #1
0
        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();
        }
Example #2
0
        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();
        }