Skip to content

Commit

Permalink
Merge pull request #400 from Microsoft/develop
Browse files Browse the repository at this point in the history
Merge develop to master
  • Loading branch information
cijothomas committed Dec 13, 2016
2 parents 309ff76 + 059cfd2 commit 22c9295
Show file tree
Hide file tree
Showing 25 changed files with 1,650 additions and 98 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

This changelog will be used to generate documentation on [release notes page](http://azure.microsoft.com/en-us/documentation/articles/app-insights-release-notes-dotnet/).

## Version 2.3.0-beta1
- Added metric aggregation functionality via MetricManager and Metric classes.
- Exposed a source field on RequestTelemetry. This can be used to store a representation of the component that issued the incoming http request.

## Version 2.2.0
- Includes all changes since 2.1.0 stable release.

Expand Down
6 changes: 3 additions & 3 deletions GlobalStaticVersion.props
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
Update for every public release.
-->
<SemanticVersionMajor>2</SemanticVersionMajor>
<SemanticVersionMinor>2</SemanticVersionMinor>
<SemanticVersionMinor>3</SemanticVersionMinor>
<SemanticVersionPatch>0</SemanticVersionPatch>
<PreReleaseMilestone></PreReleaseMilestone>
<PreReleaseMilestone>beta1</PreReleaseMilestone>
<!--
Date when Semantic Version was changed.
Update for every public release.
-->
<SemanticVersionDate>2016-06-02</SemanticVersionDate>
<SemanticVersionDate>2016-11-11</SemanticVersionDate>

<PreReleaseVersionFileName>.PreReleaseVersion</PreReleaseVersionFileName>
<PreReleaseVersionFilePath>$(MSBuildThisFileDirectory)$(PreReleaseVersionFileName)</PreReleaseVersionFilePath>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,11 @@ public void RichPayloadEventSourceMetricSentTest()
{
this.DoTracking(
RichPayloadEventSource.Keywords.Metrics,
#pragma warning disable CS0618
new MetricTelemetry("TestMetric", 1),
typeof(External.MetricData),
(client, item) => { client.TrackMetric((MetricTelemetry)item); });
#pragma warning restore CS0618
}

/// <summary>
Expand Down
5 changes: 5 additions & 0 deletions Test/CoreSDK.Test/Shared/Core.Shared.Tests.projitems
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,14 @@
<Compile Include="$(MSBuildThisFileDirectory)DataContracts\TelemetryContextTest.cs" />
<Compile Include="$(MSBuildThisFileDirectory)DataContracts\TelemetryItemTestHelper.cs" />
<Compile Include="$(MSBuildThisFileDirectory)DataContracts\TraceTelemetryTest.cs" />
<Compile Include="$(MSBuildThisFileDirectory)EnumerableExtensions.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\JsonSerializerTest.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\TelemetryProcessorChainBuilderTest.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\Tracing\CoreEventSourceTest.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\Tracing\ExtensionsTest.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\MetricManagerTest.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\MetricTest.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\MetricSample.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\SequencePropertyInitializerTest.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\ComponentContextTest.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\DeviceContextTest.cs" />
Expand Down Expand Up @@ -65,6 +69,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\Tracing\ThreadResourceLockTest.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\UserContextTest.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\WeakConcurrentRandomTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\StubMetricProcessor.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\TelemetryConfigurationFactoryTest.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\TelemetryConfigurationTest.cs" />
<Compile Include="$(MSBuildThisFileDirectory)OperationTelemetryExtensionsTests.cs" />
Expand Down
130 changes: 99 additions & 31 deletions Test/CoreSDK.Test/Shared/DataContracts/MetricTelemetryTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
using Microsoft.ApplicationInsights.Extensibility.Implementation;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Assert = Xunit.Assert;


[TestClass]
public class MetricTelemetryTest
Expand All @@ -32,18 +31,24 @@ public void EventTelemetryReturnsNonNullContext()
Assert.NotNull(item.Context);
}

#pragma warning disable CS0618
[TestMethod]
public void MetricTelemetrySuppliesConstructorThatTakesNameAndValueToSimplifyAdvancedScenarios()
{
var instance = new MetricTelemetry("Test Metric", 4.2);

Assert.Equal("Test Metric", instance.Name);
Assert.Equal(4.2, instance.Value);
}
#pragma warning restore CS0618

[TestMethod]
public void MetricTelemetrySuppliesPropertiesForCustomerToSendAggregatedMetric()
{
#pragma warning disable CS0618
var instance = new MetricTelemetry("Test Metric", 4.2);
#pragma warning restore CS0618

instance.Count = 5;
instance.Min = 1.2;
instance.Max = 6.4;
Expand All @@ -54,38 +59,15 @@ public void MetricTelemetrySuppliesPropertiesForCustomerToSendAggregatedMetric()
Assert.Equal(0.5, instance.StandardDeviation);
}

[TestMethod]
public void MeasurementMetricTelemetrySerializesToJsonCorrectly()
{
var expected = new MetricTelemetry();
expected.Name = "My Page";
expected.Value = 42;
expected.Properties.Add("Property1", "Value1");

var item = TelemetryItemTestHelper.SerializeDeserializeTelemetryItem<MetricTelemetry, AI.MetricData>(expected);

// NOTE: It's correct that we use the v1 name here, and therefore we test against it.
Assert.Equal(item.name, AI.ItemType.Metric);

Assert.Equal(typeof(AI.MetricData).Name, item.data.baseType);
Assert.Equal(2, item.data.baseData.ver);
Assert.Equal(1, item.data.baseData.metrics.Count);
Assert.Equal(expected.Name, item.data.baseData.metrics[0].name);
Assert.Equal(AI.DataPointType.Measurement, item.data.baseData.metrics[0].kind);
Assert.Equal(expected.Value, item.data.baseData.metrics[0].value);
Assert.False(item.data.baseData.metrics[0].count.HasValue);
Assert.False(item.data.baseData.metrics[0].min.HasValue);
Assert.False(item.data.baseData.metrics[0].max.HasValue);
Assert.False(item.data.baseData.metrics[0].stdDev.HasValue);
Assert.Equal(expected.Properties.ToArray(), item.data.baseData.properties.ToArray());
}

[TestMethod]
public void AggregateMetricTelemetrySerializesToJsonCorrectly()
{
var expected = new MetricTelemetry();

expected.Name = "My Page";
#pragma warning disable CS0618
expected.Value = 42;
#pragma warning restore CS0618
expected.Count = 5;
expected.Min = 1.2;
expected.Max = 6.4;
Expand All @@ -100,7 +82,9 @@ public void AggregateMetricTelemetrySerializesToJsonCorrectly()
Assert.Equal(1, item.data.baseData.metrics.Count);
Assert.Equal(expected.Name, item.data.baseData.metrics[0].name);
Assert.Equal(AI.DataPointType.Aggregation, item.data.baseData.metrics[0].kind);
#pragma warning disable CS0618
Assert.Equal(expected.Value, item.data.baseData.metrics[0].value);
#pragma warning restore CS0618
Assert.Equal(expected.Count.Value, item.data.baseData.metrics[0].count.Value);
Assert.Equal(expected.Min.Value, item.data.baseData.metrics[0].min.Value);
Assert.Equal(expected.Max.Value, item.data.baseData.metrics[0].max.Value);
Expand All @@ -109,6 +93,45 @@ public void AggregateMetricTelemetrySerializesToJsonCorrectly()
Assert.Equal(expected.Properties.ToArray(), item.data.baseData.properties.ToArray());
}

[TestMethod]
public void MetricTelemetrySuppliesConstructorThatAllowsToFullyPopulateAggregationData()
{
var instance = new MetricTelemetry(
name: "Test Metric",
count: 4,
sum: 40,
min: 5,
max: 15,
standardDeviation: 4.2);

Assert.Equal("Test Metric", instance.Name);
Assert.Equal(4, instance.Count);
Assert.Equal(40, instance.Sum);
Assert.Equal(5, instance.Min);
Assert.Equal(15, instance.Max);
Assert.Equal(4.2, instance.StandardDeviation);
}

[TestMethod]
public void MetricTelemetrySuppliesPropertiesForCustomerToSendAggregionData()
{
var instance = new MetricTelemetry();

instance.Name = "Test Metric";
instance.Count = 4;
instance.Sum = 40;
instance.Min = 5.0;
instance.Max = 15.0;
instance.StandardDeviation = 4.2;

Assert.Equal("Test Metric", instance.Name);
Assert.Equal(4, instance.Count);
Assert.Equal(40, instance.Sum);
Assert.Equal(5, instance.Min);
Assert.Equal(15, instance.Max);
Assert.Equal(4.2, instance.StandardDeviation);
}

[TestMethod]
public void MetricTelemetrySerializesStructuredIKeyCorrectlyPreservingCaseOfPrefix()
{
Expand Down Expand Up @@ -165,17 +188,19 @@ public void SerializeWritesNullValuesAsExpectedByEndpoint()
Assert.Equal(2, item.data.baseData.ver);
}

#pragma warning disable CS0618
[TestMethod]
public void SerializeReplacesNaNValueOn0()
public void SanitizeReplacesNaNValueOn0()
{
MetricTelemetry original = new MetricTelemetry("test", double.NaN);
((ITelemetry)original).Sanitize();

Assert.Equal(0, original.Value);
}
#pragma warning restore CS0618

[TestMethod]
public void SerializeReplacesNaNMinOn0()
public void SanitizeReplacesNaNMinOn0()
{
MetricTelemetry original = new MetricTelemetry { Min = double.NaN };
((ITelemetry)original).Sanitize();
Expand All @@ -184,7 +209,7 @@ public void SerializeReplacesNaNMinOn0()
}

[TestMethod]
public void SerializeReplacesNaNMaxOn0()
public void SanitizeReplacesNaNMaxOn0()
{
MetricTelemetry original = new MetricTelemetry { Max = double.NaN };
((ITelemetry)original).Sanitize();
Expand All @@ -193,12 +218,55 @@ public void SerializeReplacesNaNMaxOn0()
}

[TestMethod]
public void SerializeReplacesNaNStandardDeviationOn0()
public void SanitizeReplacesNaNStandardDeviationOn0()
{
MetricTelemetry original = new MetricTelemetry { StandardDeviation = double.NaN };
((ITelemetry)original).Sanitize();

Assert.Equal(0, original.StandardDeviation.Value);
}

[TestMethod]
public void SanitizeReplacesNaNSumOn0()
{
MetricTelemetry original = new MetricTelemetry();
original.Name = "Test";
original.Sum = double.NaN;

((ITelemetry)original).Sanitize();

Assert.Equal(0, original.Sum);
}

[TestMethod]
public void SanitizeReplacesNegativeCountOn1()
{
MetricTelemetry original = new MetricTelemetry();
original.Name = "Test";
original.Count = -5; ;

((ITelemetry)original).Sanitize();

Assert.Equal(1, original.Count);
}

[TestMethod]
public void SanitizeReplacesZeroCountOn1()
{
MetricTelemetry original = new MetricTelemetry();
original.Name = "Test";

((ITelemetry)original).Sanitize();

Assert.Equal(1, original.Count);
}

[TestMethod]
public void CountPropertyGetterReturnsOneIfNoValueIsSet()
{
MetricTelemetry telemetry = new MetricTelemetry();

Assert.Equal(1, telemetry.Count);
}
}
}
28 changes: 28 additions & 0 deletions Test/CoreSDK.Test/Shared/EnumerableExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@

namespace Microsoft.ApplicationInsights
{
using System;
using System.Collections.Generic;
using System.Linq;

internal static class EnumerableExtensions
{
public static double StdDev(this IEnumerable<double> sequence)
{
return StdDev(sequence, (e) => e);
}

public static double StdDev<T>(this IEnumerable<T> sequence, Func<T, double> selector)
{
if (sequence.Count() <= 0)
{
return 0;
}

double avg = sequence.Average(selector);
double sum = sequence.Sum(e => Math.Pow(selector(e) - avg, 2));

return Math.Sqrt(sum / sequence.Count());
}
}
}

0 comments on commit 22c9295

Please sign in to comment.