public void RichPayloadEventSourceSanitizeTest() { if (IsRunningOnEnvironmentSupportingRichPayloadEventSource()) { var request = new RequestTelemetry() { Name = new String('n', 5000), Url = new Uri("https://www.bing.com/" + new String('u', 5000)), ResponseCode = "200" }; string propKeyNameToBeTrimmed = new String('a', Property.MaxDictionaryNameLength) + 1; string propValueToBeTrimmed = new String('b', Property.MaxValueLength) + 1; string globalPropKeyNameToBeTrimmed = new String('c', Property.MaxDictionaryNameLength) + 1; string globalPropValueToBeTrimmed = new String('d', Property.MaxValueLength) + 1; string propKeyNameAfterTrimmed = new String('a', Property.MaxDictionaryNameLength); string propValueAfterTrimmed = new String('b', Property.MaxValueLength); string globalPropKeyNameAfterTrimmed = new String('c', Property.MaxDictionaryNameLength); string globalPropValueAfterTrimmed = new String('d', Property.MaxValueLength); request.Properties.Add(propKeyNameToBeTrimmed, propValueToBeTrimmed); request.Properties.Add(globalPropKeyNameToBeTrimmed, globalPropValueToBeTrimmed); var client = CreateTelemetryClient(); using (var listener = new Microsoft.ApplicationInsights.TestFramework.TestEventListener()) { listener.EnableEvents(RichPayloadEventSource.Log.EventSourceInternal, EventLevel.Verbose, RichPayloadEventSource.Keywords.Requests); client.Track(request); IDictionary <string, object> richPayload = (IDictionary <string, object>)listener.Messages.FirstOrDefault().Payload[2]; Assert.AreEqual(Property.MaxNameLength, richPayload["name"].ToString().Length); Assert.AreEqual(Property.MaxUrlLength, richPayload["url"].ToString().Length); Assert.AreEqual(true, richPayload["success"]); // Validates sanitize is done on Properties and GlobalProperties. var prop = ((object[])richPayload["properties"])[0]; var gblProp = ((object[])richPayload["properties"])[1]; ValidatePropertyDictionary((IDictionary <string, object>)prop, propKeyNameAfterTrimmed.Length, propValueAfterTrimmed.Length); ValidatePropertyDictionary((IDictionary <string, object>)gblProp, propKeyNameAfterTrimmed.Length, propValueAfterTrimmed.Length); }; } }
/// <summary> /// Helper method to setup shared context and call the desired tracking for testing. /// </summary> /// <param name="keywords">The event keywords to enable.</param> /// <param name="item">The telemetry item to track.</param> /// <param name="track">The tracking callback to execute.</param> private void DoTracking(EventKeywords keywords, ITelemetry item, Type dataType, Action <TelemetryClient, ITelemetry> track) { if (IsRunningOnEnvironmentSupportingRichPayloadEventSource()) { var client = CreateTelemetryClient(); using (var listener = new Microsoft.ApplicationInsights.TestFramework.TestEventListener()) { listener.EnableEvents(RichPayloadEventSource.Log.EventSourceInternal, EventLevel.Verbose, keywords); #pragma warning disable CS0618 // Type or member is obsolete item.Context.Properties.Add("property1", "value1"); #pragma warning restore CS0618 // Type or member is obsolete (item as ISupportProperties)?.Properties.Add("itemprop1", "itemvalue1"); item.Context.GlobalProperties.Add("globalproperty1", "globalvalue1"); item.Context.User.Id = "testUserId"; item.Context.Operation.Id = Guid.NewGuid().ToString(); item.Extension = new MyTestExtension { myIntField = 42, myStringField = "value" }; track(client, item); var actualEvent = listener.Messages.FirstOrDefault(); #pragma warning disable CS0618 // Type or member is obsolete if (!(item is UnknownTelemetry)) // Global properties are copied directly into output properties for unknown telemetry { Assert.IsTrue(item.Context.Properties.ContainsKey("globalproperty1"), "Item Properties should contain the globalproperties as its copied before serialization"); } #pragma warning restore CS0618 // Type or member is obsolete Assert.IsNotNull(actualEvent); Assert.AreEqual(client.InstrumentationKey, actualEvent.Payload[0]); int keysFound = 0; object[] tags = actualEvent.Payload[1] as object[]; foreach (object tagObject in tags) { Dictionary <string, object> tag = (Dictionary <string, object>)tagObject; Assert.IsNotNull(tag); string key = (string)tag["Key"]; object value = tag["Value"]; if (!string.IsNullOrWhiteSpace(key)) { if (string.Equals(key, "ai.user.id", StringComparison.Ordinal)) { Assert.AreEqual("testUserId", value); ++keysFound; } else if (string.Equals(key, "ai.operation.id", StringComparison.Ordinal)) { Assert.AreEqual(item.Context.Operation.Id, value); ++keysFound; } } } Assert.AreEqual(2, keysFound); Assert.IsNotNull(actualEvent.Payload[2]); if (item is ISupportProperties) { object[] properties = (object[])((IDictionary <string, object>)actualEvent.Payload[2])["properties"]; #pragma warning disable CS0618 // Type or member is obsolete if (item is PerformanceCounterTelemetry) #pragma warning restore CS0618 // Type or member is obsolete { // There should be 6 entries in properties // 1. from item's ISupportProperties.Properties // 2. from item context.GlobalProperties // 3. from item context.Properties // 4. from myInfField in item's Extension // 5. from myStringField in item's Extension // 6. PerfCounter name is a custom property. Assert.AreEqual(6, properties.Length); } else if (item is UnknownTelemetry) { // There should be 11 entries in properties, all fields are flattened into properties // 1. from item's ISupportProperties.Properties // 2. from item context.GlobalProperties // 3. from item context.Properties // 4. from myInfField in item's Extension // 5. from myStringField in item's Extension // 6. Unknown Telemetry name. // 7. Unknown Telemetry id // 8. Unknown Telemetry responseCode // 9. Unknown Telemetry source // 10. Unknown Telemetry duration // 11. Unknown Telemetry success Assert.AreEqual(11, properties.Length); } else { // There should be 5 entries in properties // 1. from item's ISupportProperties.Properties // 2. from item context.GlobalProperties // 3. from item context.Properties // 4. from myInfField in item's Extension // 5. from myStringField in item's Extension Assert.AreEqual(5, properties.Length); } } var expectedProperties = dataType.GetProperties().AsEnumerable(); var actualPropertiesPayload = (IDictionary <string, object>)actualEvent.Payload[2]; VerifyEventPayload(expectedProperties, actualPropertiesPayload); } } else { // 4.5 doesn't have RichPayload events Assert.IsNull(RichPayloadEventSource.Log.EventSourceInternal); } }