public void Dependency_CanSetMaxDependencyTypesToDiscoverBeforeInitialization() { var extractor = new AutocollectedMetricsExtractor(null); Assert.AreEqual(DependencyMetricsExtractor.MaxDependenctTypesToDiscoverDefault, extractor.MaxDependencyTypesToDiscover); extractor.MaxDependencyTypesToDiscover = 1000; Assert.AreEqual(1000, extractor.MaxDependencyTypesToDiscover); extractor.MaxDependencyTypesToDiscover = 5; Assert.AreEqual(5, extractor.MaxDependencyTypesToDiscover); extractor.MaxDependencyTypesToDiscover = 1; Assert.AreEqual(1, extractor.MaxDependencyTypesToDiscover); extractor.MaxDependencyTypesToDiscover = 0; Assert.AreEqual(0, extractor.MaxDependencyTypesToDiscover); try { extractor.MaxDependencyTypesToDiscover = -1; Assert.IsTrue(false, "An ArgumentOutOfRangeException was expected"); } catch (ArgumentOutOfRangeException) { } }
public void Dependency_CanSetMaxDependencyTypesToDiscoverAfterInitialization() { AutocollectedMetricsExtractor extractor = null; List <ITelemetry> telemetrySentToChannel = new List <ITelemetry>(); Func <ITelemetryProcessor, AutocollectedMetricsExtractor> extractorFactory = (nextProc) => { extractor = new AutocollectedMetricsExtractor(nextProc) { MaxDependencyTypesToDiscover = 0 }; return(extractor); }; TelemetryConfiguration telemetryConfig = CreateTelemetryConfigWithExtractor(telemetrySentToChannel, extractorFactory); using (telemetryConfig) { Assert.AreEqual(0, extractor.MaxDependencyTypesToDiscover); extractor.MaxDependencyTypesToDiscover = 1000; Assert.AreEqual(1000, extractor.MaxDependencyTypesToDiscover); extractor.MaxDependencyTypesToDiscover = 5; Assert.AreEqual(5, extractor.MaxDependencyTypesToDiscover); extractor.MaxDependencyTypesToDiscover = 1; Assert.AreEqual(1, extractor.MaxDependencyTypesToDiscover); extractor.MaxDependencyTypesToDiscover = 0; Assert.AreEqual(0, extractor.MaxDependencyTypesToDiscover); try { extractor.MaxDependencyTypesToDiscover = -1; Assert.IsTrue(false, "An ArgumentOutOfRangeException was expected"); } catch (ArgumentOutOfRangeException) { } } }
public void DisposeIsIdempotent() { AutocollectedMetricsExtractor extractor = null; List <ITelemetry> telemetrySentToChannel = new List <ITelemetry>(); Func <ITelemetryProcessor, AutocollectedMetricsExtractor> extractorFactory = (nextProc) => { extractor = new AutocollectedMetricsExtractor(nextProc); return(extractor); }; TelemetryConfiguration telemetryConfig = CreateTelemetryConfigWithExtractor(telemetrySentToChannel, extractorFactory); using (telemetryConfig) { ; } extractor.Dispose(); extractor.Dispose(); }
public void CanConstruct() { var extractor = new AutocollectedMetricsExtractor(null); }
public void Request_TelemetryRespectsDimLimitResponseCode() { List <ITelemetry> telemetrySentToChannel = new List <ITelemetry>(); Func <ITelemetryProcessor, AutocollectedMetricsExtractor> extractorFactory = (nextProc) => { var metricExtractor = new AutocollectedMetricsExtractor(nextProc); metricExtractor.MaxRequestResponseCodeValuesToDiscover = 0; return(metricExtractor); }; TelemetryConfiguration telemetryConfig = CreateTelemetryConfigWithExtractor(telemetrySentToChannel, extractorFactory); using (telemetryConfig) { TelemetryClient client = new TelemetryClient(telemetryConfig); // Track 3 requests with 3 different values for Result code - 200,201,202. // As MaxRequestResponseCodeValuesToDiscover = 0, we expect all responde code to be rolled into Other client.TrackRequest("Test Request 1", DateTimeOffset.Now, TimeSpan.FromMilliseconds(10), "200", success: true); client.TrackRequest("Test Request 2", DateTimeOffset.Now, TimeSpan.FromMilliseconds(11), "201", success: true); client.TrackRequest("Test Request 3", DateTimeOffset.Now, TimeSpan.FromMilliseconds(11), "202", success: true); } Assert.AreEqual(4, telemetrySentToChannel.Count); AssertEx.IsType <RequestTelemetry>(telemetrySentToChannel[0]); Assert.AreEqual("Test Request 1", ((RequestTelemetry)telemetrySentToChannel[0]).Name); Assert.AreEqual(true, ((RequestTelemetry)telemetrySentToChannel[0]).Properties.ContainsKey("_MS.ProcessedByMetricExtractors")); Assert.AreEqual("(Name:'Requests', Ver:'1.1')", ((RequestTelemetry)telemetrySentToChannel[0]).Properties["_MS.ProcessedByMetricExtractors"]); AssertEx.IsType <RequestTelemetry>(telemetrySentToChannel[1]); Assert.AreEqual("Test Request 2", ((RequestTelemetry)telemetrySentToChannel[1]).Name); Assert.AreEqual(true, ((RequestTelemetry)telemetrySentToChannel[1]).Properties.ContainsKey("_MS.ProcessedByMetricExtractors")); Assert.AreEqual("(Name:'Requests', Ver:'1.1')", ((RequestTelemetry)telemetrySentToChannel[1]).Properties["_MS.ProcessedByMetricExtractors"]); AssertEx.IsType <RequestTelemetry>(telemetrySentToChannel[2]); Assert.AreEqual("Test Request 3", ((RequestTelemetry)telemetrySentToChannel[2]).Name); Assert.AreEqual(true, ((RequestTelemetry)telemetrySentToChannel[2]).Properties.ContainsKey("_MS.ProcessedByMetricExtractors")); Assert.AreEqual("(Name:'Requests', Ver:'1.1')", ((RequestTelemetry)telemetrySentToChannel[2]).Properties["_MS.ProcessedByMetricExtractors"]); AssertEx.IsType <MetricTelemetry>(telemetrySentToChannel[3]); var metricTel = telemetrySentToChannel[3] as MetricTelemetry; // validate standard fields Assert.IsTrue(metricTel.Properties.ContainsKey("_MS.AggregationIntervalMs")); Assert.IsTrue(metricTel.Context.GlobalProperties.ContainsKey("_MS.IsAutocollected")); Assert.AreEqual("True", metricTel.Context.GlobalProperties["_MS.IsAutocollected"]); Assert.IsTrue(metricTel.Context.GlobalProperties.ContainsKey("_MS.MetricId")); Assert.AreEqual("requests/duration", metricTel.Context.GlobalProperties["_MS.MetricId"]); // validate dimensions exist Assert.AreEqual(true, metricTel.Properties.ContainsKey("Request.Success")); Assert.AreEqual(true, metricTel.Properties.ContainsKey("cloud/roleInstance")); Assert.AreEqual(true, metricTel.Properties.ContainsKey("cloud/roleName")); Assert.AreEqual(true, metricTel.Properties.ContainsKey("request/resultCode")); Assert.AreEqual(true, metricTel.Properties.ContainsKey("request/performanceBucket")); Assert.AreEqual(true, metricTel.Properties.ContainsKey("operation/synthetic")); var resultCodeDimension = metricTel.Properties["request/resultCode"]; // As MaxRequestResponseCodeValuesToDiscover = 0, we expect all responde code to be rolled into Other Assert.AreEqual("Other", resultCodeDimension); }
public void Request_TelemetryRespectsDimLimitCloudRoleInstance() { List <ITelemetry> telemetrySentToChannel = new List <ITelemetry>(); Func <ITelemetryProcessor, AutocollectedMetricsExtractor> extractorFactory = (nextProc) => { var metricExtractor = new AutocollectedMetricsExtractor(nextProc); metricExtractor.MaxRequestCloudRoleInstanceValuesToDiscover = 2; return(metricExtractor); }; TelemetryConfiguration telemetryConfig = CreateTelemetryConfigWithExtractor(telemetrySentToChannel, extractorFactory); using (telemetryConfig) { TelemetryClient client = new TelemetryClient(telemetryConfig); // Track 4 requests with 3 different values for RoleInstance - A B C D. // As MaxRequestCloudRoleInstanceValuesToDiscover = 2, the first 2 values encountered (A,B) // will be used as such at which the DimensionCap is hit. // Newly incoming values (C,D) will be rolled into "DIMENSION-CAPPED" client.TrackRequest(CreateRequestTelemetry( TimeSpan.FromMilliseconds(100), "200", true, false, "RoleNameA", "RoleInstanceA")); client.TrackRequest(CreateRequestTelemetry( TimeSpan.FromMilliseconds(100), "200", true, false, "RoleNameA", "RoleInstanceB")); client.TrackRequest(CreateRequestTelemetry( TimeSpan.FromMilliseconds(100), "200", true, false, "RoleNameA", "RoleInstanceC")); client.TrackRequest(CreateRequestTelemetry( TimeSpan.FromMilliseconds(100), "200", true, false, "RoleNameA", "RoleInstanceD")); } // 4 requests + 3 metric Assert.AreEqual(7, telemetrySentToChannel.Count); AssertEx.IsType <RequestTelemetry>(telemetrySentToChannel[0]); Assert.AreEqual("Req1", ((RequestTelemetry)telemetrySentToChannel[0]).Name); Assert.AreEqual(true, ((RequestTelemetry)telemetrySentToChannel[0]).Properties.ContainsKey("_MS.ProcessedByMetricExtractors")); Assert.AreEqual("(Name:'Requests', Ver:'1.1')", ((RequestTelemetry)telemetrySentToChannel[0]).Properties["_MS.ProcessedByMetricExtractors"]); AssertEx.IsType <RequestTelemetry>(telemetrySentToChannel[1]); Assert.AreEqual("Req1", ((RequestTelemetry)telemetrySentToChannel[1]).Name); Assert.AreEqual(true, ((RequestTelemetry)telemetrySentToChannel[1]).Properties.ContainsKey("_MS.ProcessedByMetricExtractors")); Assert.AreEqual("(Name:'Requests', Ver:'1.1')", ((RequestTelemetry)telemetrySentToChannel[1]).Properties["_MS.ProcessedByMetricExtractors"]); AssertEx.IsType <RequestTelemetry>(telemetrySentToChannel[2]); Assert.AreEqual("Req1", ((RequestTelemetry)telemetrySentToChannel[2]).Name); Assert.AreEqual(true, ((RequestTelemetry)telemetrySentToChannel[2]).Properties.ContainsKey("_MS.ProcessedByMetricExtractors")); Assert.AreEqual("(Name:'Requests', Ver:'1.1')", ((RequestTelemetry)telemetrySentToChannel[2]).Properties["_MS.ProcessedByMetricExtractors"]); AssertEx.IsType <RequestTelemetry>(telemetrySentToChannel[3]); Assert.AreEqual("Req1", ((RequestTelemetry)telemetrySentToChannel[3]).Name); Assert.AreEqual(true, ((RequestTelemetry)telemetrySentToChannel[3]).Properties.ContainsKey("_MS.ProcessedByMetricExtractors")); Assert.AreEqual("(Name:'Requests', Ver:'1.1')", ((RequestTelemetry)telemetrySentToChannel[3]).Properties["_MS.ProcessedByMetricExtractors"]); for (int i = 4; i < 7; i++) { AssertEx.IsType <MetricTelemetry>(telemetrySentToChannel[i]); var metricTel = telemetrySentToChannel[i] as MetricTelemetry; // validate standard fields Assert.IsTrue(metricTel.Properties.ContainsKey("_MS.AggregationIntervalMs")); Assert.IsTrue(metricTel.Context.GlobalProperties.ContainsKey("_MS.IsAutocollected")); Assert.AreEqual("True", metricTel.Context.GlobalProperties["_MS.IsAutocollected"]); Assert.IsTrue(metricTel.Context.GlobalProperties.ContainsKey("_MS.MetricId")); Assert.AreEqual("requests/duration", metricTel.Context.GlobalProperties["_MS.MetricId"]); // validate dimensions exist Assert.AreEqual(true, metricTel.Properties.ContainsKey("Request.Success")); Assert.AreEqual(true, metricTel.Properties.ContainsKey("cloud/roleInstance")); Assert.AreEqual(true, metricTel.Properties.ContainsKey("cloud/roleName")); Assert.AreEqual(true, metricTel.Properties.ContainsKey("request/resultCode")); Assert.AreEqual(true, metricTel.Properties.ContainsKey("request/performanceBucket")); Assert.AreEqual(true, metricTel.Properties.ContainsKey("operation/synthetic")); } // We expect RoleInstanceA to be tracked correctly var cloudRoleInstanceA = telemetrySentToChannel.Where( (tel) => "Server response time".Equals((tel as MetricTelemetry)?.Name) && (tel as MetricTelemetry).Properties.Contains(new KeyValuePair <string, string>("cloud/roleInstance", "RoleInstanceA"))); Assert.IsTrue(cloudRoleInstanceA.Count() == 1); // We expect RoleInstanceB to be tracked correctly var cloudRoleInstanceB = telemetrySentToChannel.Where( (tel) => "Server response time".Equals((tel as MetricTelemetry)?.Name) && (tel as MetricTelemetry).Properties.Contains(new KeyValuePair <string, string>("cloud/roleInstance", "RoleInstanceB"))); Assert.IsTrue(cloudRoleInstanceB.Count() == 1); // We expect RoleInstanceC to be not present as a dimension, as dimension cap of 2 is already hit. var cloudRoleInstanceC = telemetrySentToChannel.Where( (tel) => "Server response time".Equals((tel as MetricTelemetry)?.Name) && (tel as MetricTelemetry).Properties.Contains(new KeyValuePair <string, string>("cloud/roleInstance", "RoleInstanceC"))); Assert.IsTrue(cloudRoleInstanceC.Count() == 0); // We expect RoleInstanceD to be not present as a dimension, as dimension cap of 2 is already hit. var cloudRoleInstanceD = telemetrySentToChannel.Where( (tel) => "Server response time".Equals((tel as MetricTelemetry)?.Name) && (tel as MetricTelemetry).Properties.Contains(new KeyValuePair <string, string>("cloud/roleInstance", "RoleInstanceD"))); Assert.IsTrue(cloudRoleInstanceD.Count() == 0); // We expect a DIMENSION-CAPPED series, which represents RoleInstanceC and RoleInstanceD var dimCappedSeries = telemetrySentToChannel.Where( (tel) => "Server response time".Equals((tel as MetricTelemetry)?.Name) && (tel as MetricTelemetry).Properties.Contains(new KeyValuePair <string, string>("cloud/roleInstance", "DIMENSION-CAPPED"))); Assert.IsTrue(dimCappedSeries.Count() == 1); }