Ejemplo n.º 1
0
        private static async Task HandleSqlEvent(SpyMonitor.SpyOptions options, ShowplanEvent sqlEvent)
        {
            Log.Logger.Verbose("Publishing query plan {hash}", sqlEvent.QueryPlanHashString);

            var found = ShowplanFixer.TryFixByHandle(options, sqlEvent);

            if (found)
            {
                Log.Logger.Verbose("Found better plan in sys tables");
            }
            else
            {
                sqlEvent.Showplan = sqlEvent.ShowplanXml.RawString;
            }

            var message = new ShowplanMessage()
            {
                Duration            = sqlEvent.Duration,
                EstimatedCost       = sqlEvent.EstimatedCost,
                EstimatedRows       = sqlEvent.EstimatedRows,
                QueryPlanHashString = sqlEvent.QueryPlanHashString,
                QueryPlanHandle     = BitConverter.ToString(sqlEvent.PlanHandle).Replace("-", ""),
                Showplan            = sqlEvent.Showplan,
                OccuredAt           = DateTimeOffset.Now,
                SqlStatement        = sqlEvent.SqlStatement,
                GoodPlan            = found
            };

            await Host.ShowplanHub.Clients.All.ReceivePlan(message);
        }
Ejemplo n.º 2
0
        private static void RunOptionsAndReturnExitCode(Options opts)
        {
            var cancellationTokenSource = new CancellationTokenSource();

            var spyOptions = new SpyMonitor.SpyOptions()
            {
                Password     = opts.Password,
                AppName      = opts.AppName,
                Database     = opts.Database,
                Server       = opts.Server,
                UserName     = opts.UserName,
                CleanOnStart = opts.CleanUp
            };

            var spyTask = SpyMonitor.Spy(async evt => await HandleSqlEvent(spyOptions, evt),
                                         spyOptions, cancellationTokenSource.Token);

            var hostTask = Host.Run(opts.Port, cancellationTokenSource.Token);

            Console.CancelKeyPress += (sender, eventArgs) =>
            {
                Log.Logger.Verbose("CTRL-C pressed, shutting down tasks");
                cancellationTokenSource.Cancel();
                eventArgs.Cancel = true;
            };

            try
            {
                Task.WaitAll(spyTask, hostTask);
                Log.Logger.Verbose("Done");
            }
            catch (AggregateException e) when(e.InnerException is TaskCanceledException)
            {
                // expected with ctrl-c behavior
            }
        }