From a7b8f0ffd37d96b2e5fdfa1a798670a6e64f1190 Mon Sep 17 00:00:00 2001 From: zhiyuanliang Date: Thu, 18 Jan 2024 23:57:03 +0800 Subject: [PATCH] merge with preview branch --- .../TelemetryClientExtensions.cs | 57 +++++++++++++++++++ .../FeatureManagementBuilderExtensions.cs | 46 +++++++-------- 2 files changed, 80 insertions(+), 23 deletions(-) create mode 100644 src/Microsoft.FeatureManagement.Telemetry.ApplicationInsights/TelemetryClientExtensions.cs diff --git a/src/Microsoft.FeatureManagement.Telemetry.ApplicationInsights/TelemetryClientExtensions.cs b/src/Microsoft.FeatureManagement.Telemetry.ApplicationInsights/TelemetryClientExtensions.cs new file mode 100644 index 00000000..b397519b --- /dev/null +++ b/src/Microsoft.FeatureManagement.Telemetry.ApplicationInsights/TelemetryClientExtensions.cs @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. +// +using Microsoft.ApplicationInsights; +using Microsoft.ApplicationInsights.DataContracts; +using Microsoft.FeatureManagement.FeatureFilters; + +namespace Microsoft.FeatureManagement.Telemetry.ApplicationInsights +{ + /// + /// Provides extension methods for tracking events with . + /// + public static class TelemetryClientExtensions + { + /// + /// Extension method to track an event with . + /// + public static void TrackEvent(this TelemetryClient telemetryClient, string eventName, TargetingContext targetingContext, IDictionary properties = null, IDictionary metrics = null) + { + ValidateTargetingContext(targetingContext); + + if (properties == null) + { + properties = new Dictionary(); + } + + properties["TargetingId"] = targetingContext.UserId; + + telemetryClient.TrackEvent(eventName, properties, metrics); + } + + /// + /// Extension method to track an with . + /// + public static void TrackEvent(this TelemetryClient telemetryClient, EventTelemetry telemetry, TargetingContext targetingContext) + { + ValidateTargetingContext(targetingContext); + + if (telemetry == null) + { + telemetry = new EventTelemetry(); + } + + telemetry.Properties["TargetingId"] = targetingContext.UserId; + + telemetryClient.TrackEvent(telemetry); + } + + private static void ValidateTargetingContext(TargetingContext targetingContext) + { + if (targetingContext == null) + { + throw new ArgumentNullException(nameof(targetingContext)); + } + } + } +} diff --git a/src/Microsoft.FeatureManagement/FeatureManagementBuilderExtensions.cs b/src/Microsoft.FeatureManagement/FeatureManagementBuilderExtensions.cs index 3db6707b..8e746b40 100644 --- a/src/Microsoft.FeatureManagement/FeatureManagementBuilderExtensions.cs +++ b/src/Microsoft.FeatureManagement/FeatureManagementBuilderExtensions.cs @@ -17,6 +17,29 @@ namespace Microsoft.FeatureManagement /// public static class FeatureManagementBuilderExtensions { + /// + /// Adds an to be used for targeting and registers the targeting filter to the feature management system. + /// + /// The used to customize feature management functionality. + /// A that can be used to customize feature management functionality. + public static IFeatureManagementBuilder WithTargeting(this IFeatureManagementBuilder builder) where T : ITargetingContextAccessor + { + // + // Register the targeting context accessor with the same lifetime as the feature manager + if (builder.Services.Any(descriptor => descriptor.ServiceType == typeof(IFeatureManager) && descriptor.Lifetime == ServiceLifetime.Scoped)) + { + builder.Services.TryAddScoped(typeof(ITargetingContextAccessor), typeof(T)); + } + else + { + builder.Services.TryAddSingleton(typeof(ITargetingContextAccessor), typeof(T)); + } + + builder.AddFeatureFilter(); + + return builder; + } + /// /// Adds a to the feature management system. /// @@ -69,28 +92,5 @@ private static IFeatureManagementBuilder AddTelemetryPublisher(this IFeatureMana return builder; } - - /// - /// Adds an to be used for targeting and registers the targeting filter to the feature management system. - /// - /// The used to customize feature management functionality. - /// A that can be used to customize feature management functionality. - public static IFeatureManagementBuilder WithTargeting(this IFeatureManagementBuilder builder) where T : ITargetingContextAccessor - { - // - // Register the targeting context accessor with the same lifetime as the feature manager - if (builder.Services.Any(descriptor => descriptor.ServiceType == typeof(IFeatureManager) && descriptor.Lifetime == ServiceLifetime.Scoped)) - { - builder.Services.TryAddScoped(typeof(ITargetingContextAccessor), typeof(T)); - } - else - { - builder.Services.TryAddSingleton(typeof(ITargetingContextAccessor), typeof(T)); - } - - builder.AddFeatureFilter(); - - return builder; - } } }