Skip to content

Commit cdbb872

Browse files
add exp telemetry fields
1 parent 0c6a3b3 commit cdbb872

File tree

2 files changed

+51
-9
lines changed

2 files changed

+51
-9
lines changed

sdk/feature-management-applicationinsights-node/src/telemetry.ts

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
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";
55
import { 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
*/
1223
export 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
4586
export 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
}

sdk/feature-management-applicationinsights-node/src/version.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
// Licensed under the MIT license.
33

44
export const VERSION = "2.0.0-preview.2";
5+
export const EVALUATION_EVENT_VERSION = "1.0.0";

0 commit comments

Comments
 (0)