11// Copyright (c) Microsoft Corporation.
22// Licensed under the MIT license.
33
4- import { EvaluationResult } from "@microsoft/feature-management" ;
4+ import { EvaluationResult , VariantAssignmentReason } from "@microsoft/feature-management" ;
55import { TelemetryClient , Contracts } from "applicationinsights" ;
6+ import { EVALUATION_EVENT_VERSION } from "./version.js" ;
7+
8+ const VERSION = "Version" ;
9+ const FEATURE_NAME = "FeatureName" ;
10+ const ENABLED = "Enabled" ;
11+ const TARGETING_ID = "TargetingId" ;
12+ const VARIANT = "Variant" ;
13+ const VARIANT_ASSIGNMENT_REASON = "VariantAssignmentReason" ;
14+ const DEFAULT_WHEN_ENABLED = "DefaultWhenEnabled" ;
15+ const VARIANT_ASSIGNMENT_PERCENTAGE = "VariantAssignmentPercentage" ;
16+ const FEATURE_EVALUATION_EVENT_NAME = "FeatureEvaluation" ;
617
718/**
819 * Creates a telemetry publisher that sends feature evaluation events to Application Insights.
@@ -11,16 +22,46 @@ import { TelemetryClient, Contracts } from "applicationinsights";
1122 */
1223export function createTelemetryPublisher ( client : TelemetryClient ) : ( event : EvaluationResult ) => void {
1324 return ( event : EvaluationResult ) => {
25+ if ( event . feature === undefined ) {
26+ return ;
27+ }
28+
1429 const eventProperties = {
15- "FeatureName" : event . feature ? event . feature . id : "" ,
16- "Enabled" : event . enabled . toString ( ) ,
30+ [ VERSION ] : EVALUATION_EVENT_VERSION ,
31+ [ FEATURE_NAME ] : event . feature ? event . feature . id : "" ,
32+ [ ENABLED ] : event . enabled . toString ( ) ,
1733 // Ensure targetingId is string so that it will be placed in customDimensions
18- "TargetingId" : event . targetingId ? event . targetingId . toString ( ) : "" ,
19- "Variant" : event . variant ? event . variant . name : "" ,
20- "VariantAssignmentReason" : event . variantAssignmentReason ,
34+ [ TARGETING_ID ] : event . targetingId ? event . targetingId . toString ( ) : "" ,
35+ [ VARIANT ] : event . variant ? event . variant . name : "" ,
36+ [ VARIANT_ASSIGNMENT_REASON ] : event . variantAssignmentReason ,
2137 } ;
2238
23- const metadata = event . feature ?. telemetry ?. metadata ;
39+ if ( event . feature . allocation ?. default_when_enabled ) {
40+ eventProperties [ DEFAULT_WHEN_ENABLED ] = event . feature . allocation . default_when_enabled ;
41+ }
42+
43+ if ( event . variantAssignmentReason === VariantAssignmentReason . DefaultWhenEnabled ) {
44+ let percentileAllocationPercentage = 0 ;
45+ if ( event . variant !== undefined && event . feature . allocation !== undefined && event . feature . allocation . percentile !== undefined ) {
46+ for ( const percentile of event . feature . allocation . percentile ) {
47+ percentileAllocationPercentage += percentile . to - percentile . from ;
48+ }
49+ }
50+ eventProperties [ VARIANT_ASSIGNMENT_PERCENTAGE ] = ( 100 - percentileAllocationPercentage ) . toString ( ) ;
51+ }
52+ else if ( event . variantAssignmentReason === VariantAssignmentReason . Percentile ) {
53+ let percentileAllocationPercentage = 0 ;
54+ if ( event . variant !== undefined && event . feature . allocation !== undefined && event . feature . allocation . percentile !== undefined ) {
55+ for ( const percentile of event . feature . allocation . percentile ) {
56+ if ( percentile . variant === event . variant . name ) {
57+ percentileAllocationPercentage += percentile . to - percentile . from ;
58+ }
59+ }
60+ }
61+ eventProperties [ VARIANT_ASSIGNMENT_PERCENTAGE ] = percentileAllocationPercentage . toString ( ) ;
62+ }
63+
64+ const metadata = event . feature . telemetry ?. metadata ;
2465 if ( metadata ) {
2566 for ( const key in metadata ) {
2667 if ( ! ( key in eventProperties ) ) {
@@ -29,7 +70,7 @@ export function createTelemetryPublisher(client: TelemetryClient): (event: Evalu
2970 }
3071 }
3172
32- client . trackEvent ( { name : "FeatureEvaluation" , properties : eventProperties } ) ;
73+ client . trackEvent ( { name : FEATURE_EVALUATION_EVENT_NAME , properties : eventProperties } ) ;
3374 } ;
3475}
3576
@@ -45,7 +86,7 @@ export function createTelemetryPublisher(client: TelemetryClient): (event: Evalu
4586export function trackEvent ( client : TelemetryClient , targetingId : string , event : Contracts . EventTelemetry ) : void {
4687 event . properties = {
4788 ...event . properties ,
48- TargetingId : targetingId ? targetingId . toString ( ) : ""
89+ [ TARGETING_ID ] : targetingId ? targetingId . toString ( ) : ""
4990 } ;
5091 client . trackEvent ( event ) ;
5192}
0 commit comments