Skip to content

Commit 45d7650

Browse files
eleanorjboydCopilot
andcommitted
Report Environments activation state
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 3a7c65d commit 45d7650

7 files changed

Lines changed: 26 additions & 6 deletions

File tree

‎src/client/envExt/api.internal.ts‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,13 @@ export function shouldEnvExtHandleActivation(): boolean {
5757

5858
function getEnvExtensionDecisionInputs(): Pick<
5959
EnvsIntegrationDecisionTelemetry,
60-
'envsAvailableToHostNow' | 'envsResolvedSettingNow'
60+
'envsAvailableToHostNow' | 'envsActiveNow' | 'envsResolvedSettingNow'
6161
> {
6262
const config = getConfiguration('python');
63+
const extension = getExtension(ENVS_EXTENSION_ID);
6364
return {
64-
envsAvailableToHostNow: !!getExtension(ENVS_EXTENSION_ID),
65+
envsAvailableToHostNow: !!extension,
66+
envsActiveNow: extension?.isActive ?? false,
6567
envsResolvedSettingNow: config?.get<boolean>('useEnvironmentsExtension', false) ?? false,
6668
};
6769
}

‎src/client/startupTelemetry.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ function getEnvExtensionStartupTelemetry() {
2424
return {
2525
envsDecisionReason: telemetry.envsDecisionReason,
2626
envsAvailableToHostNow: telemetry.envsAvailableToHostNow,
27+
envsActiveNow: telemetry.envsActiveNow,
2728
envsResolvedSettingNow: telemetry.envsResolvedSettingNow,
2829
};
2930
}

‎src/client/telemetry/index.ts‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ export interface IEventNamePropertyMapping {
363363
"envsexplicitfalsescope" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" },
364364
"envsdecisionreason" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" },
365365
"envsavailabletohostnow" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" },
366+
"envsactivenow" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" },
366367
"envsresolvedsettingnow" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" }
367368
}
368369
*/
@@ -427,6 +428,10 @@ export interface IEventNamePropertyMapping {
427428
* Whether Python Environments is currently available to this extension host.
428429
*/
429430
envsAvailableToHostNow?: boolean;
431+
/**
432+
* Whether Python Environments is currently active in this extension host.
433+
*/
434+
envsActiveNow?: boolean;
430435
/**
431436
* The current resolved value of python.useEnvironmentsExtension.
432437
*/
@@ -441,6 +446,7 @@ export interface IEventNamePropertyMapping {
441446
"envsexplicitfalsescope" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" },
442447
"envsdecisionreason" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" },
443448
"envsavailabletohostnow" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" },
449+
"envsactivenow" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" },
444450
"envsresolvedsettingnow" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" },
445451
"envscacheddecision" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" }
446452
}
@@ -449,6 +455,7 @@ export interface IEventNamePropertyMapping {
449455
envsExplicitFalseScope: EnvsExplicitFalseScope;
450456
envsDecisionReason?: EnvsIntegrationDecisionReason;
451457
envsAvailableToHostNow: boolean;
458+
envsActiveNow: boolean;
452459
envsResolvedSettingNow: boolean;
453460
envsCachedDecision?: boolean;
454461
};

‎src/client/telemetry/types.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export type EnvsIntegrationDecisionReason = 'enabled' | 'extensionUnavailable' |
1515
export type EnvsIntegrationDecisionTelemetry = {
1616
envsDecisionReason?: EnvsIntegrationDecisionReason;
1717
envsAvailableToHostNow: boolean;
18+
envsActiveNow: boolean;
1819
envsResolvedSettingNow: boolean;
1920
envsCachedDecision?: boolean;
2021
};

‎src/test/envExt/api.internal.unit.test.ts‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,35 +39,39 @@ suite('Python Environments integration decision telemetry', () => {
3939
{
4040
name: 'extension unavailable',
4141
available: false,
42+
active: false,
4243
resolvedSetting: true,
4344
decision: false,
4445
reason: 'extensionUnavailable',
4546
},
4647
{
4748
name: 'resolved setting false',
4849
available: true,
50+
active: true,
4951
resolvedSetting: false,
5052
decision: false,
5153
reason: 'resolvedSettingFalse',
5254
},
5355
{
5456
name: 'integration enabled',
5557
available: true,
58+
active: true,
5659
resolvedSetting: true,
5760
decision: true,
5861
reason: 'enabled',
5962
},
6063
] as const;
6164

62-
cases.forEach(({ name, available, resolvedSetting, decision, reason }) => {
65+
cases.forEach(({ name, available, active, resolvedSetting, decision, reason }) => {
6366
test(`captures ${name}`, () => {
6467
getConfiguration.returns(configuration(resolvedSetting));
65-
getExtension.returns(available ? ({} as Extension<unknown>) : undefined);
68+
getExtension.returns(available ? ({ isActive: active } as Extension<unknown>) : undefined);
6669

6770
assert.strictEqual(useEnvExtension(), decision);
6871
assert.deepEqual(getEnvExtensionDecisionTelemetry(), {
6972
envsDecisionReason: reason,
7073
envsAvailableToHostNow: available,
74+
envsActiveNow: active,
7175
envsResolvedSettingNow: resolvedSetting,
7276
envsCachedDecision: decision,
7377
});
@@ -78,11 +82,12 @@ suite('Python Environments integration decision telemetry', () => {
7882
test('reports live inputs without changing a stale cached decision', () => {
7983
assert.isFalse(useEnvExtension());
8084
getConfiguration.returns(configuration(true));
81-
getExtension.returns({} as Extension<unknown>);
85+
getExtension.returns({ isActive: true } as Extension<unknown>);
8286

8387
assert.deepEqual(getEnvExtensionDecisionTelemetry(), {
8488
envsDecisionReason: 'extensionUnavailable',
8589
envsAvailableToHostNow: true,
90+
envsActiveNow: true,
8691
envsResolvedSettingNow: true,
8792
envsCachedDecision: false,
8893
});
@@ -91,11 +96,12 @@ suite('Python Environments integration decision telemetry', () => {
9196

9297
test('does not initialize the cached decision when telemetry is requested', () => {
9398
getConfiguration.returns(configuration(true));
94-
getExtension.returns({} as Extension<unknown>);
99+
getExtension.returns({ isActive: false } as Extension<unknown>);
95100

96101
assert.deepEqual(getEnvExtensionDecisionTelemetry(), {
97102
envsDecisionReason: undefined,
98103
envsAvailableToHostNow: true,
104+
envsActiveNow: false,
99105
envsResolvedSettingNow: true,
100106
envsCachedDecision: undefined,
101107
});

‎src/test/envExt/telemetry.unit.test.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ suite('Environments extension telemetry', () => {
4848
const decisionTelemetry = {
4949
envsDecisionReason: 'resolvedSettingFalse' as const,
5050
envsAvailableToHostNow: true,
51+
envsActiveNow: true,
5152
envsResolvedSettingNow: false,
5253
envsCachedDecision: false,
5354
};

‎src/test/startupTelemetry.unit.test.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ suite('Startup Telemetry - hasUserDefinedPythonPath()', async () => {
7676
sinon.stub(envExt, 'getEnvExtensionDecisionTelemetry').returns({
7777
envsDecisionReason: 'resolvedSettingFalse',
7878
envsAvailableToHostNow: true,
79+
envsActiveNow: true,
7980
envsResolvedSettingNow: false,
8081
envsCachedDecision: false,
8182
});
@@ -111,6 +112,7 @@ suite('Startup Telemetry - hasUserDefinedPythonPath()', async () => {
111112
envsExplicitFalseScope: 'workspace',
112113
envsDecisionReason: 'resolvedSettingFalse',
113114
envsAvailableToHostNow: true,
115+
envsActiveNow: true,
114116
envsResolvedSettingNow: false,
115117
isFirstSession: false,
116118
}),

0 commit comments

Comments
 (0)