public wait_stats Subtract(wait_stats instance) { double ticksDelta = ticks - instance.ticks; var ticksDeltaFactor = Stopwatch.Frequency / ticksDelta; var result = new wait_stats { max_wait_time_ms = max_wait_time_ms, wait_per_task_ms = wait_per_task_ms, signal_wait_time_s_raw = signal_wait_time_s - instance.signal_wait_time_s, waiting_tasks_count_raw = waiting_tasks_count - instance.waiting_tasks_count, wait_time_s_raw = wait_time_s - instance.wait_time_s, ticks = (long)ticksDelta }; result.signal_wait_time_s = result.signal_wait_time_s_raw * ticksDeltaFactor; result.waiting_tasks_count = result.waiting_tasks_count_raw * ticksDeltaFactor; result.wait_time_s = result.wait_time_s_raw * ticksDeltaFactor; return(result); }
static async Task <MetricTelemetry[]> GetPageLatchStats() { var query = @"select waiting_tasks_count, wait_time_s, max_wait_time_ms, signal_wait_time_s, wait_per_task_ms from qpi.wait_stats where wait_type = 'PAGELATCH_EX'"; using var connection = new SqlConnection(Configuration.ConnectionString); var result = await connection.QueryFirstOrDefaultAsync <wait_stats>(query); result.ticks = Stopwatch.GetTimestamp(); var delta = result.Subtract(previous); Console.WriteLine(delta); var metrics = new[] { // From DELTA new MetricTelemetry { Name = "PAGELATCH_EX - waiting_tasks_count (delta)", Sum = delta.waiting_tasks_count, Count = 1 // Maybe this could just the time period like the ticks? }, new MetricTelemetry { Name = "PAGELATCH_EX - wait_time_s (delta)", Sum = delta.wait_time_s, Count = 1, }, new MetricTelemetry { Name = "PAGELATCH_EX - signal_wait_time_s (delta)", Sum = delta.signal_wait_time_s, Count = 1 }, // From DELTA RAW new MetricTelemetry { Name = "PAGELATCH_EX - waiting_tasks_count_raw (delta)", Sum = delta.waiting_tasks_count_raw, Count = 1 }, new MetricTelemetry { Name = "PAGELATCH_EX - wait_time_s_raw (delta)", Sum = delta.wait_time_s_raw, Count = 1 }, new MetricTelemetry { Name = "PAGELATCH_EX - signal_wait_time_s_raw (delta)", Sum = delta.signal_wait_time_s_raw, Count = 1 }, new MetricTelemetry { Name = "PAGELATCH_EX - delta_s (delta)", Sum = delta.ticks / (double)Stopwatch.Frequency, Count = 1 }, // From RESULT new MetricTelemetry { Name = "PAGELATCH_EX - waiting_tasks_count", Sum = result.waiting_tasks_count, Count = 1 }, new MetricTelemetry { Name = "PAGELATCH_EX - wait_time_s", Sum = result.wait_time_s, Count = 1 }, new MetricTelemetry() { Name = "PAGELATCH_EX - max_wait_time_ms", Sum = result.max_wait_time_ms, Count = 1 }, new MetricTelemetry { Name = "PAGELATCH_EX - signal_wait_time_s", Sum = result.signal_wait_time_s, Count = 1 }, new MetricTelemetry() { Name = "PAGELATCH_EX - signal_wait_time_s", Sum = result.signal_wait_time_s, Count = 1 }, new MetricTelemetry() { Name = "PAGELATCH_EX - wait_per_task_ms", Sum = result.wait_per_task_ms, Count = 1 } }; previous = result; return(metrics); }