Skip to content

Commit 22c9295

Browse files
authored
Merge pull request #400 from Microsoft/develop
Merge develop to master
2 parents 309ff76 + 059cfd2 commit 22c9295

File tree

25 files changed

+1650
-98
lines changed

25 files changed

+1650
-98
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
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/).
44

5+
## Version 2.3.0-beta1
6+
- Added metric aggregation functionality via MetricManager and Metric classes.
7+
- Exposed a source field on RequestTelemetry. This can be used to store a representation of the component that issued the incoming http request.
8+
59
## Version 2.2.0
610
- Includes all changes since 2.1.0 stable release.
711

GlobalStaticVersion.props

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
Update for every public release.
77
-->
88
<SemanticVersionMajor>2</SemanticVersionMajor>
9-
<SemanticVersionMinor>2</SemanticVersionMinor>
9+
<SemanticVersionMinor>3</SemanticVersionMinor>
1010
<SemanticVersionPatch>0</SemanticVersionPatch>
11-
<PreReleaseMilestone></PreReleaseMilestone>
11+
<PreReleaseMilestone>beta1</PreReleaseMilestone>
1212
<!--
1313
Date when Semantic Version was changed.
1414
Update for every public release.
1515
-->
16-
<SemanticVersionDate>2016-06-02</SemanticVersionDate>
16+
<SemanticVersionDate>2016-11-11</SemanticVersionDate>
1717

1818
<PreReleaseVersionFileName>.PreReleaseVersion</PreReleaseVersionFileName>
1919
<PreReleaseVersionFilePath>$(MSBuildThisFileDirectory)$(PreReleaseVersionFileName)</PreReleaseVersionFilePath>

Test/CoreSDK.Test/Net46/Extensibility/Implementation/RichPayloadEventSourceTest.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,11 @@ public void RichPayloadEventSourceMetricSentTest()
8484
{
8585
this.DoTracking(
8686
RichPayloadEventSource.Keywords.Metrics,
87+
#pragma warning disable CS0618
8788
new MetricTelemetry("TestMetric", 1),
8889
typeof(External.MetricData),
8990
(client, item) => { client.TrackMetric((MetricTelemetry)item); });
91+
#pragma warning restore CS0618
9092
}
9193

9294
/// <summary>

Test/CoreSDK.Test/Shared/Core.Shared.Tests.projitems

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,14 @@
2727
<Compile Include="$(MSBuildThisFileDirectory)DataContracts\TelemetryContextTest.cs" />
2828
<Compile Include="$(MSBuildThisFileDirectory)DataContracts\TelemetryItemTestHelper.cs" />
2929
<Compile Include="$(MSBuildThisFileDirectory)DataContracts\TraceTelemetryTest.cs" />
30+
<Compile Include="$(MSBuildThisFileDirectory)EnumerableExtensions.cs" />
3031
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\JsonSerializerTest.cs" />
3132
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\TelemetryProcessorChainBuilderTest.cs" />
3233
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\Tracing\CoreEventSourceTest.cs" />
3334
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\Tracing\ExtensionsTest.cs" />
35+
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\MetricManagerTest.cs" />
36+
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\MetricTest.cs" />
37+
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\MetricSample.cs" />
3438
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\SequencePropertyInitializerTest.cs" />
3539
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\ComponentContextTest.cs" />
3640
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\DeviceContextTest.cs" />
@@ -65,6 +69,7 @@
6569
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\Tracing\ThreadResourceLockTest.cs" />
6670
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\UserContextTest.cs" />
6771
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\Implementation\WeakConcurrentRandomTests.cs" />
72+
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\StubMetricProcessor.cs" />
6873
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\TelemetryConfigurationFactoryTest.cs" />
6974
<Compile Include="$(MSBuildThisFileDirectory)Extensibility\TelemetryConfigurationTest.cs" />
7075
<Compile Include="$(MSBuildThisFileDirectory)OperationTelemetryExtensionsTests.cs" />

Test/CoreSDK.Test/Shared/DataContracts/MetricTelemetryTest.cs

Lines changed: 99 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using Microsoft.ApplicationInsights.Extensibility.Implementation;
88
using Microsoft.VisualStudio.TestTools.UnitTesting;
99
using Assert = Xunit.Assert;
10-
1110

1211
[TestClass]
1312
public class MetricTelemetryTest
@@ -32,18 +31,24 @@ public void EventTelemetryReturnsNonNullContext()
3231
Assert.NotNull(item.Context);
3332
}
3433

34+
#pragma warning disable CS0618
3535
[TestMethod]
3636
public void MetricTelemetrySuppliesConstructorThatTakesNameAndValueToSimplifyAdvancedScenarios()
3737
{
3838
var instance = new MetricTelemetry("Test Metric", 4.2);
39+
3940
Assert.Equal("Test Metric", instance.Name);
4041
Assert.Equal(4.2, instance.Value);
4142
}
43+
#pragma warning restore CS0618
4244

4345
[TestMethod]
4446
public void MetricTelemetrySuppliesPropertiesForCustomerToSendAggregatedMetric()
4547
{
48+
#pragma warning disable CS0618
4649
var instance = new MetricTelemetry("Test Metric", 4.2);
50+
#pragma warning restore CS0618
51+
4752
instance.Count = 5;
4853
instance.Min = 1.2;
4954
instance.Max = 6.4;
@@ -54,38 +59,15 @@ public void MetricTelemetrySuppliesPropertiesForCustomerToSendAggregatedMetric()
5459
Assert.Equal(0.5, instance.StandardDeviation);
5560
}
5661

57-
[TestMethod]
58-
public void MeasurementMetricTelemetrySerializesToJsonCorrectly()
59-
{
60-
var expected = new MetricTelemetry();
61-
expected.Name = "My Page";
62-
expected.Value = 42;
63-
expected.Properties.Add("Property1", "Value1");
64-
65-
var item = TelemetryItemTestHelper.SerializeDeserializeTelemetryItem<MetricTelemetry, AI.MetricData>(expected);
66-
67-
// NOTE: It's correct that we use the v1 name here, and therefore we test against it.
68-
Assert.Equal(item.name, AI.ItemType.Metric);
69-
70-
Assert.Equal(typeof(AI.MetricData).Name, item.data.baseType);
71-
Assert.Equal(2, item.data.baseData.ver);
72-
Assert.Equal(1, item.data.baseData.metrics.Count);
73-
Assert.Equal(expected.Name, item.data.baseData.metrics[0].name);
74-
Assert.Equal(AI.DataPointType.Measurement, item.data.baseData.metrics[0].kind);
75-
Assert.Equal(expected.Value, item.data.baseData.metrics[0].value);
76-
Assert.False(item.data.baseData.metrics[0].count.HasValue);
77-
Assert.False(item.data.baseData.metrics[0].min.HasValue);
78-
Assert.False(item.data.baseData.metrics[0].max.HasValue);
79-
Assert.False(item.data.baseData.metrics[0].stdDev.HasValue);
80-
Assert.Equal(expected.Properties.ToArray(), item.data.baseData.properties.ToArray());
81-
}
82-
8362
[TestMethod]
8463
public void AggregateMetricTelemetrySerializesToJsonCorrectly()
8564
{
8665
var expected = new MetricTelemetry();
66+
8767
expected.Name = "My Page";
68+
#pragma warning disable CS0618
8869
expected.Value = 42;
70+
#pragma warning restore CS0618
8971
expected.Count = 5;
9072
expected.Min = 1.2;
9173
expected.Max = 6.4;
@@ -100,7 +82,9 @@ public void AggregateMetricTelemetrySerializesToJsonCorrectly()
10082
Assert.Equal(1, item.data.baseData.metrics.Count);
10183
Assert.Equal(expected.Name, item.data.baseData.metrics[0].name);
10284
Assert.Equal(AI.DataPointType.Aggregation, item.data.baseData.metrics[0].kind);
85+
#pragma warning disable CS0618
10386
Assert.Equal(expected.Value, item.data.baseData.metrics[0].value);
87+
#pragma warning restore CS0618
10488
Assert.Equal(expected.Count.Value, item.data.baseData.metrics[0].count.Value);
10589
Assert.Equal(expected.Min.Value, item.data.baseData.metrics[0].min.Value);
10690
Assert.Equal(expected.Max.Value, item.data.baseData.metrics[0].max.Value);
@@ -109,6 +93,45 @@ public void AggregateMetricTelemetrySerializesToJsonCorrectly()
10993
Assert.Equal(expected.Properties.ToArray(), item.data.baseData.properties.ToArray());
11094
}
11195

96+
[TestMethod]
97+
public void MetricTelemetrySuppliesConstructorThatAllowsToFullyPopulateAggregationData()
98+
{
99+
var instance = new MetricTelemetry(
100+
name: "Test Metric",
101+
count: 4,
102+
sum: 40,
103+
min: 5,
104+
max: 15,
105+
standardDeviation: 4.2);
106+
107+
Assert.Equal("Test Metric", instance.Name);
108+
Assert.Equal(4, instance.Count);
109+
Assert.Equal(40, instance.Sum);
110+
Assert.Equal(5, instance.Min);
111+
Assert.Equal(15, instance.Max);
112+
Assert.Equal(4.2, instance.StandardDeviation);
113+
}
114+
115+
[TestMethod]
116+
public void MetricTelemetrySuppliesPropertiesForCustomerToSendAggregionData()
117+
{
118+
var instance = new MetricTelemetry();
119+
120+
instance.Name = "Test Metric";
121+
instance.Count = 4;
122+
instance.Sum = 40;
123+
instance.Min = 5.0;
124+
instance.Max = 15.0;
125+
instance.StandardDeviation = 4.2;
126+
127+
Assert.Equal("Test Metric", instance.Name);
128+
Assert.Equal(4, instance.Count);
129+
Assert.Equal(40, instance.Sum);
130+
Assert.Equal(5, instance.Min);
131+
Assert.Equal(15, instance.Max);
132+
Assert.Equal(4.2, instance.StandardDeviation);
133+
}
134+
112135
[TestMethod]
113136
public void MetricTelemetrySerializesStructuredIKeyCorrectlyPreservingCaseOfPrefix()
114137
{
@@ -165,17 +188,19 @@ public void SerializeWritesNullValuesAsExpectedByEndpoint()
165188
Assert.Equal(2, item.data.baseData.ver);
166189
}
167190

191+
#pragma warning disable CS0618
168192
[TestMethod]
169-
public void SerializeReplacesNaNValueOn0()
193+
public void SanitizeReplacesNaNValueOn0()
170194
{
171195
MetricTelemetry original = new MetricTelemetry("test", double.NaN);
172196
((ITelemetry)original).Sanitize();
173197

174198
Assert.Equal(0, original.Value);
175199
}
200+
#pragma warning restore CS0618
176201

177202
[TestMethod]
178-
public void SerializeReplacesNaNMinOn0()
203+
public void SanitizeReplacesNaNMinOn0()
179204
{
180205
MetricTelemetry original = new MetricTelemetry { Min = double.NaN };
181206
((ITelemetry)original).Sanitize();
@@ -184,7 +209,7 @@ public void SerializeReplacesNaNMinOn0()
184209
}
185210

186211
[TestMethod]
187-
public void SerializeReplacesNaNMaxOn0()
212+
public void SanitizeReplacesNaNMaxOn0()
188213
{
189214
MetricTelemetry original = new MetricTelemetry { Max = double.NaN };
190215
((ITelemetry)original).Sanitize();
@@ -193,12 +218,55 @@ public void SerializeReplacesNaNMaxOn0()
193218
}
194219

195220
[TestMethod]
196-
public void SerializeReplacesNaNStandardDeviationOn0()
221+
public void SanitizeReplacesNaNStandardDeviationOn0()
197222
{
198223
MetricTelemetry original = new MetricTelemetry { StandardDeviation = double.NaN };
199224
((ITelemetry)original).Sanitize();
200225

201226
Assert.Equal(0, original.StandardDeviation.Value);
202227
}
228+
229+
[TestMethod]
230+
public void SanitizeReplacesNaNSumOn0()
231+
{
232+
MetricTelemetry original = new MetricTelemetry();
233+
original.Name = "Test";
234+
original.Sum = double.NaN;
235+
236+
((ITelemetry)original).Sanitize();
237+
238+
Assert.Equal(0, original.Sum);
239+
}
240+
241+
[TestMethod]
242+
public void SanitizeReplacesNegativeCountOn1()
243+
{
244+
MetricTelemetry original = new MetricTelemetry();
245+
original.Name = "Test";
246+
original.Count = -5; ;
247+
248+
((ITelemetry)original).Sanitize();
249+
250+
Assert.Equal(1, original.Count);
251+
}
252+
253+
[TestMethod]
254+
public void SanitizeReplacesZeroCountOn1()
255+
{
256+
MetricTelemetry original = new MetricTelemetry();
257+
original.Name = "Test";
258+
259+
((ITelemetry)original).Sanitize();
260+
261+
Assert.Equal(1, original.Count);
262+
}
263+
264+
[TestMethod]
265+
public void CountPropertyGetterReturnsOneIfNoValueIsSet()
266+
{
267+
MetricTelemetry telemetry = new MetricTelemetry();
268+
269+
Assert.Equal(1, telemetry.Count);
270+
}
203271
}
204272
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+

2+
namespace Microsoft.ApplicationInsights
3+
{
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Linq;
7+
8+
internal static class EnumerableExtensions
9+
{
10+
public static double StdDev(this IEnumerable<double> sequence)
11+
{
12+
return StdDev(sequence, (e) => e);
13+
}
14+
15+
public static double StdDev<T>(this IEnumerable<T> sequence, Func<T, double> selector)
16+
{
17+
if (sequence.Count() <= 0)
18+
{
19+
return 0;
20+
}
21+
22+
double avg = sequence.Average(selector);
23+
double sum = sequence.Sum(e => Math.Pow(selector(e) - avg, 2));
24+
25+
return Math.Sqrt(sum / sequence.Count());
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)