private static IEnumerable <MetricPoint> CreateDefaultMetrics(QuickPulseDataSample sample) { return(new[] { new MetricPoint { Name = @"\ApplicationInsights\Requests/Sec", Value = Round(sample.AIRequestsPerSecond), Weight = 1 }, new MetricPoint { Name = @"\ApplicationInsights\Request Duration", Value = Round(sample.AIRequestDurationAveInMs), Weight = sample.AIRequests, }, new MetricPoint { Name = @"\ApplicationInsights\Requests Failed/Sec", Value = Round(sample.AIRequestsFailedPerSecond), Weight = 1 }, new MetricPoint { Name = @"\ApplicationInsights\Requests Succeeded/Sec", Value = Round(sample.AIRequestsSucceededPerSecond), Weight = 1, }, new MetricPoint { Name = @"\ApplicationInsights\Dependency Calls/Sec", Value = Round(sample.AIDependencyCallsPerSecond), Weight = 1 }, new MetricPoint { Name = @"\ApplicationInsights\Dependency Call Duration", Value = Round(sample.AIDependencyCallDurationAveInMs), Weight = sample.AIDependencyCalls, }, new MetricPoint { Name = @"\ApplicationInsights\Dependency Calls Failed/Sec", Value = Round(sample.AIDependencyCallsFailedPerSecond), Weight = 1, }, new MetricPoint { Name = @"\ApplicationInsights\Dependency Calls Succeeded/Sec", Value = Round(sample.AIDependencyCallsSucceededPerSecond), Weight = 1, }, new MetricPoint { Name = @"\ApplicationInsights\Exceptions/Sec", Value = Round(sample.AIExceptionsPerSecond), Weight = 1, }, }); }
private static IEnumerable <MetricPoint> CreateCalculatedMetrics(QuickPulseDataSample sample) { var metrics = new List <MetricPoint>(); foreach (AccumulatedValues metricAccumulatedValues in sample.CollectionConfigurationAccumulator.MetricAccumulators.Values) { try { MetricPoint metricPoint = new MetricPoint { Name = metricAccumulatedValues.MetricId, Value = metricAccumulatedValues.CalculateAggregation(out long count), Weight = (int)count }; metrics.Add(metricPoint); } catch (Exception e) { // skip this metric QuickPulseEventSource.Log.UnknownErrorEvent(e.ToString()); } } return(metrics); }
public void QuickPulseDataSampleCalculatesAIDependencyCallsFailedPerSecondCorrectly() { // ARRANGE var accumulator = new QuickPulseDataAccumulator { StartTimestamp = DateTimeOffset.UtcNow, EndTimestamp = DateTimeOffset.UtcNow.AddSeconds(2), AIDependencyCallFailureCount = 10 }; // ACT var dataSample = new QuickPulseDataSample(accumulator, this.dummyDictionary); // ASSERT Assert.AreEqual(10.0 / 2, dataSample.AIDependencyCallsFailedPerSecond); }
public void QuickPulseDataSampleCalculatesAIDependencyCallDurationAveWhenDependencyCallCountIsZeroCorrectly() { // ARRANGE var accumulator = new QuickPulseDataAccumulator { StartTimestamp = DateTimeOffset.UtcNow, EndTimestamp = DateTimeOffset.UtcNow.AddSeconds(2), AIDependencyCallCountAndDurationInTicks = QuickPulseDataAccumulator.EncodeCountAndDuration(0, TimeSpan.FromSeconds(5).Ticks) }; // ACT var dataSample = new QuickPulseDataSample(accumulator, this.dummyDictionary); // ASSERT Assert.AreEqual(0.0, dataSample.AIDependencyCallDurationAveInMs); }
public void QuickPulseServiceClientSubmitsSamplesToService() { // ARRANGE var now = DateTimeOffset.UtcNow; var serviceClient = new QuickPulseServiceClient(this.serviceEndpoint, string.Empty, string.Empty, new Clock()); var sample1 = new QuickPulseDataSample( new QuickPulseDataAccumulator { AIRequestSuccessCount = 5, StartTimestamp = now, EndTimestamp = now.AddSeconds(1) }, new Dictionary<string, Tuple<PerformanceCounterData, float>>()); var sample2 = new QuickPulseDataSample( new QuickPulseDataAccumulator { AIDependencyCallSuccessCount = 10, StartTimestamp = now, EndTimestamp = now.AddSeconds(1) }, new Dictionary<string, Tuple<PerformanceCounterData, float>>()); var sample3 = new QuickPulseDataSample( new QuickPulseDataAccumulator { AIExceptionCount = 15, StartTimestamp = now, EndTimestamp = now.AddSeconds(1) }, new Dictionary<string, Tuple<PerformanceCounterData, float>>()); // ACT bool? sendMore = serviceClient.SubmitSamples(new[] { sample1, sample2, sample3 }, string.Empty); // ASSERT this.listener.Stop(); Assert.AreEqual(true, sendMore); Assert.AreEqual(3, this.samples.Count); Assert.AreEqual(5, this.samples[0].Item2.Metrics.Single(m => m.Name == @"\ApplicationInsights\Requests Succeeded/Sec").Value); Assert.AreEqual(10, this.samples[1].Item2.Metrics.Single(m => m.Name == @"\ApplicationInsights\Dependency Calls Succeeded/Sec").Value); Assert.AreEqual(15, this.samples[2].Item2.Metrics.Single(m => m.Name == @"\ApplicationInsights\Exceptions/Sec").Value); }
public void QuickPulseServiceClientSubmitsInstrumentationKeyToService() { // ARRANGE var now = DateTimeOffset.UtcNow; var ikey = "some ikey"; var serviceClient = new QuickPulseServiceClient(this.serviceEndpoint, string.Empty, string.Empty, new Clock()); var sample = new QuickPulseDataSample( new QuickPulseDataAccumulator { StartTimestamp = now, EndTimestamp = now.AddSeconds(1) }, new Dictionary<string, Tuple<PerformanceCounterData, float>>()); // ACT serviceClient.SubmitSamples(new[] { sample }, ikey); // ASSERT this.listener.Stop(); Assert.AreEqual(1, this.samples.Count); Assert.AreEqual(ikey, this.samples[0].Item2.InstrumentationKey); }
public void QuickPulseServiceClientSetsTransmissionTimeCorrectly() { // ARRANGE var dummy = new Dictionary<string, Tuple<PerformanceCounterData, float>>(); var timeProvider = new ClockMock(); var serviceClient = new QuickPulseServiceClient(this.serviceEndpoint, string.Empty, string.Empty, timeProvider); var sample1 = new QuickPulseDataSample( new QuickPulseDataAccumulator { StartTimestamp = timeProvider.UtcNow.AddSeconds(-1), EndTimestamp = timeProvider.UtcNow }, dummy); timeProvider.FastForward(TimeSpan.FromSeconds(1)); var sample2 = new QuickPulseDataSample( new QuickPulseDataAccumulator { StartTimestamp = timeProvider.UtcNow.AddSeconds(-1), EndTimestamp = timeProvider.UtcNow }, dummy); timeProvider.FastForward(TimeSpan.FromSeconds(1)); var sample3 = new QuickPulseDataSample( new QuickPulseDataAccumulator { StartTimestamp = timeProvider.UtcNow.AddSeconds(-1), EndTimestamp = timeProvider.UtcNow }, dummy); // ACT timeProvider.FastForward(TimeSpan.FromSeconds(5)); serviceClient.SubmitSamples(new[] { sample1, sample2, sample3 }, string.Empty); // ASSERT this.listener.Stop(); Assert.AreEqual(3, this.samples.Count); Assert.IsTrue((timeProvider.UtcNow - this.samples[0].Item1).Duration() < TimeSpan.FromMilliseconds(1)); Assert.IsTrue((timeProvider.UtcNow - this.samples[1].Item1).Duration() < TimeSpan.FromMilliseconds(1)); Assert.IsTrue((timeProvider.UtcNow - this.samples[2].Item1).Duration() < TimeSpan.FromMilliseconds(1)); Assert.IsTrue(this.samples.All(s => (s.Item2.Timestamp - timeProvider.UtcNow).Duration() > TimeSpan.FromSeconds(1))); }
public void QuickPulseServiceClientRoundsSampleValuesWhenSubmittingToService() { // ARRANGE var now = DateTimeOffset.UtcNow; var serviceClient = new QuickPulseServiceClient(this.serviceEndpoint, string.Empty, string.Empty, new Clock()); var sample1 = new QuickPulseDataSample( new QuickPulseDataAccumulator { AIRequestSuccessCount = 1, StartTimestamp = now, EndTimestamp = now.AddSeconds(3) }, new Dictionary<string, Tuple<PerformanceCounterData, float>>()); // ACT serviceClient.SubmitSamples(new[] { sample1 }, string.Empty); // ASSERT this.listener.Stop(); Assert.AreEqual(0.3333, this.samples[0].Item2.Metrics.Single(m => m.Name == @"\ApplicationInsights\Requests Succeeded/Sec").Value); }
public void QuickPulseServiceClientFillsInTelemetryDocumentsWhenSubmittingToService() { // ARRANGE var now = DateTimeOffset.UtcNow; var serviceClient = new QuickPulseServiceClient(this.serviceEndpoint, string.Empty, string.Empty, string.Empty, string.Empty, new Clock(), false); var properties = new Dictionary<string, string>() { { "Prop1", "Val1" } }; var sample = new QuickPulseDataSample( new QuickPulseDataAccumulator { StartTimestamp = now, EndTimestamp = now.AddSeconds(1), TelemetryDocuments = new ConcurrentStack<ITelemetryDocument>( new ITelemetryDocument[] { new RequestTelemetryDocument() { Name = "Request1", Properties = properties.ToArray() }, new DependencyTelemetryDocument() { Name = "Dependency1", Properties = properties.ToArray() }, new ExceptionTelemetryDocument() { Exception = "Exception1", Properties = properties.ToArray() } }) }, new Dictionary<string, Tuple<PerformanceCounterData, double>>()); // ACT serviceClient.SubmitSamples(new[] { sample }, string.Empty); // ASSERT this.listener.Stop(); Assert.AreEqual("Request1", ((RequestTelemetryDocument)this.samples[0].Item2.Documents[0]).Name); Assert.AreEqual("Prop1", ((RequestTelemetryDocument)this.samples[0].Item2.Documents[0]).Properties.First().Key); Assert.AreEqual("Val1", ((RequestTelemetryDocument)this.samples[0].Item2.Documents[0]).Properties.First().Value); Assert.AreEqual("Dependency1", ((DependencyTelemetryDocument)this.samples[0].Item2.Documents[1]).Name); Assert.AreEqual("Prop1", ((DependencyTelemetryDocument)this.samples[0].Item2.Documents[1]).Properties.First().Key); Assert.AreEqual("Val1", ((DependencyTelemetryDocument)this.samples[0].Item2.Documents[1]).Properties.First().Value); Assert.AreEqual("Exception1", ((ExceptionTelemetryDocument)this.samples[0].Item2.Documents[2]).Exception); Assert.AreEqual("Prop1", ((ExceptionTelemetryDocument)this.samples[0].Item2.Documents[2]).Properties.First().Key); Assert.AreEqual("Val1", ((ExceptionTelemetryDocument)this.samples[0].Item2.Documents[2]).Properties.First().Value); }
public void QuickPulseDataSampleTimestampsItselfCorrectly() { // ARRANGE var timestampStart = DateTimeOffset.UtcNow; var timestampEnd = DateTimeOffset.UtcNow.AddSeconds(3); var accumulator = new QuickPulseDataAccumulator { StartTimestamp = timestampStart, EndTimestamp = timestampEnd }; // ACT var dataSample = new QuickPulseDataSample(accumulator, this.dummyDictionary); // ASSERT Assert.AreEqual(timestampStart, dataSample.StartTimestamp); Assert.AreEqual(timestampEnd, dataSample.EndTimestamp); }
public void QuickPulseDataSampleHandlesAbsentCounterInPerfData() { // ARRANGE var accumulator = new QuickPulseDataAccumulator { StartTimestamp = DateTimeOffset.UtcNow, EndTimestamp = DateTimeOffset.UtcNow.AddSeconds(2) }; // ACT var dataSample = new QuickPulseDataSample(accumulator, this.dummyDictionary); // ASSERT Assert.IsFalse(dataSample.PerfCountersLookup.Any()); }
public void QuickPulseDataSampleCalculatesAIRpsCorrectly() { // ARRANGE var accumulator = new QuickPulseDataAccumulator { StartTimestamp = DateTimeOffset.UtcNow, EndTimestamp = DateTimeOffset.UtcNow.AddSeconds(2), AIRequestCountAndDurationInTicks = QuickPulseDataAccumulator.EncodeCountAndDuration(10, 0) }; // ACT var dataSample = new QuickPulseDataSample(accumulator, this.dummyDictionary); // ASSERT Assert.AreEqual(10.0 / 2, dataSample.AIRequestsPerSecond); }
public void QuickPulseDataSampleCalculatesAIRequestDurationAveCorrectly() { // ARRANGE var accumulator = new QuickPulseDataAccumulator { StartTimestamp = DateTimeOffset.UtcNow, EndTimestamp = DateTimeOffset.UtcNow.AddSeconds(2), AIRequestCountAndDurationInTicks = QuickPulseDataAccumulator.EncodeCountAndDuration(10, TimeSpan.FromSeconds(5).Ticks) }; // ACT var dataSample = new QuickPulseDataSample(accumulator, this.dummyDictionary); // ASSERT Assert.AreEqual(TimeSpan.FromSeconds(5).TotalMilliseconds / 10.0, dataSample.AIRequestDurationAveInMs); }
public void QuickPulseDataSampleCalculatesAIExceptionsPerSecondCorrectly() { // ARRANGE var accumulator = new QuickPulseDataAccumulator { StartTimestamp = DateTimeOffset.UtcNow, EndTimestamp = DateTimeOffset.UtcNow.AddSeconds(2), AIExceptionCount = 3 }; // ACT var dataSample = new QuickPulseDataSample(accumulator, this.dummyDictionary); // ASSERT Assert.AreEqual(3.0 / 2, dataSample.AIExceptionsPerSecond); }
public void QuickPulseServiceClientSubmitsVersionToServiceWithSubmitSamples() { // ARRANGE var now = DateTimeOffset.UtcNow; var version = "this version"; var serviceClient = new QuickPulseServiceClient(this.serviceEndpoint, string.Empty, version, new Clock()); var sample = new QuickPulseDataSample( new QuickPulseDataAccumulator { StartTimestamp = now, EndTimestamp = now.AddSeconds(1) }, new Dictionary<string, Tuple<PerformanceCounterData, float>>()); // ACT serviceClient.SubmitSamples(new[] { sample }, string.Empty); // ASSERT this.listener.Stop(); Assert.AreEqual(1, this.samples.Count); Assert.AreEqual(version, this.samples[0].Item2.Version); }
public void QuickPulseServiceClientFillsInSampleWeightWhenSubmittingToService() { // ARRANGE var now = DateTimeOffset.UtcNow; var serviceClient = new QuickPulseServiceClient(this.serviceEndpoint, string.Empty, string.Empty, new Clock()); var sample1 = new QuickPulseDataSample( new QuickPulseDataAccumulator { AIRequestCountAndDurationInTicks = QuickPulseDataAccumulator.EncodeCountAndDuration(3, 10000), StartTimestamp = now, EndTimestamp = now.AddSeconds(1) }, new Dictionary<string, Tuple<PerformanceCounterData, float>>()); var sample2 = new QuickPulseDataSample( new QuickPulseDataAccumulator { AIDependencyCallCountAndDurationInTicks = QuickPulseDataAccumulator.EncodeCountAndDuration(4, 10000), StartTimestamp = now, EndTimestamp = now.AddSeconds(1) }, new Dictionary<string, Tuple<PerformanceCounterData, float>>()); // ACT serviceClient.SubmitSamples(new[] { sample1, sample2 }, string.Empty); // ASSERT this.listener.Stop(); Assert.AreEqual(3, this.samples[0].Item2.Metrics.Single(m => m.Name == @"\ApplicationInsights\Request Duration").Weight); Assert.AreEqual(4, this.samples[1].Item2.Metrics.Single(m => m.Name == @"\ApplicationInsights\Dependency Call Duration").Weight); }
private void StoreSample(QuickPulseDataSample sample) { lock (this.collectedSamplesLock) { QuickPulseEventSource.Log.SampleStoredEvent(this.collectedSamples.Count + 1); this.collectedSamples.AddLast(sample); while (this.collectedSamples.Count > MaxSampleStorageSize) { this.collectedSamples.RemoveFirst(); } } }