Start sending ClientAuthError telemetry for microsoft auth (#278643)

To better bucketize MSAL broker errors.
This commit is contained in:
Tyler James Leonhardt
2025-11-20 12:27:10 -08:00
committed by GitHub
parent 3dcee1b440
commit 134826b979
4 changed files with 59 additions and 21 deletions
+17 -17
View File
@@ -10,8 +10,8 @@
"license": "MIT",
"dependencies": {
"@azure/ms-rest-azure-env": "^2.0.0",
"@azure/msal-node": "^3.8.0",
"@azure/msal-node-extensions": "^1.5.23",
"@azure/msal-node": "^3.8.3",
"@azure/msal-node-extensions": "^1.5.25",
"@vscode/extension-telemetry": "^0.9.8",
"keytar": "file:./packageMocks/keytar",
"vscode-tas-client": "^0.1.84"
@@ -33,21 +33,21 @@
"integrity": "sha512-dG76W7ElfLi+fbTjnZVGj+M9e0BIEJmRxU6fHaUQ12bZBe8EJKYb2GV50YWNaP2uJiVQ5+7nXEVj1VN1UQtaEw=="
},
"node_modules/@azure/msal-common": {
"version": "15.13.0",
"resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.13.0.tgz",
"integrity": "sha512-8oF6nj02qX7eE/6+wFT5NluXRHc05AgdCC3fJnkjiJooq8u7BcLmxaYYSwc2AfEkWRMRi6Eyvvbeqk4U4412Ag==",
"version": "15.13.2",
"resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.13.2.tgz",
"integrity": "sha512-cNwUoCk3FF8VQ7Ln/MdcJVIv3sF73/OT86cRH81ECsydh7F4CNfIo2OAx6Cegtg8Yv75x4506wN4q+Emo6erOA==",
"license": "MIT",
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/@azure/msal-node": {
"version": "3.8.0",
"resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.0.tgz",
"integrity": "sha512-23BXm82Mp5XnRhrcd4mrHa0xuUNRp96ivu3nRatrfdAqjoeWAGyD0eEAafxAOHAEWWmdlyFK4ELFcdziXyw2sA==",
"version": "3.8.3",
"resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.3.tgz",
"integrity": "sha512-Ul7A4gwmaHzYWj2Z5xBDly/W8JSC1vnKgJ898zPMZr0oSf1ah0tiL15sytjycU/PMhDZAlkWtEL1+MzNMU6uww==",
"license": "MIT",
"dependencies": {
"@azure/msal-common": "15.13.0",
"@azure/msal-common": "15.13.2",
"jsonwebtoken": "^9.0.0",
"uuid": "^8.3.0"
},
@@ -56,14 +56,14 @@
}
},
"node_modules/@azure/msal-node-extensions": {
"version": "1.5.23",
"resolved": "https://registry.npmjs.org/@azure/msal-node-extensions/-/msal-node-extensions-1.5.23.tgz",
"integrity": "sha512-9i9GibDBxEUiYon/3Ecisde4SDFJD89nW+VCnvlzbFnVyo2TSaV047anLA/lk2ena52GSJvBGGdZLpAQqxwo3w==",
"version": "1.5.25",
"resolved": "https://registry.npmjs.org/@azure/msal-node-extensions/-/msal-node-extensions-1.5.25.tgz",
"integrity": "sha512-8UtOy6McoHQUbvi75Cx+ftpbTuOB471j4V4yZJmRM3KJ30bMO7forXrVV+/xArvWdgZ9VkBvq26OclFstJUo8Q==",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"@azure/msal-common": "15.13.0",
"@azure/msal-node-runtime": "^0.19.0",
"@azure/msal-common": "15.13.2",
"@azure/msal-node-runtime": "^0.20.0",
"keytar": "^7.8.0"
},
"engines": {
@@ -71,9 +71,9 @@
}
},
"node_modules/@azure/msal-node-runtime": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@azure/msal-node-runtime/-/msal-node-runtime-0.19.5.tgz",
"integrity": "sha512-0oBQgCcgOb+VwQ5k8OXShbuXCBU8FKKhpwnqWSBzzYWSFoYAtyad2zggl26ME4IKzN9telaOJPEEcsQOf/+3Ug==",
"version": "0.20.1",
"resolved": "https://registry.npmjs.org/@azure/msal-node-runtime/-/msal-node-runtime-0.20.1.tgz",
"integrity": "sha512-WVbMedbJHjt9M+qeZMH/6U1UmjXsKaMB6fN8OZUtGY7UVNYofrowZNx4nVvWN/ajPKBQCEW4Rr/MwcRuA8HGcQ==",
"hasInstallScript": true,
"license": "MIT"
},
@@ -141,8 +141,8 @@
},
"dependencies": {
"@azure/ms-rest-azure-env": "^2.0.0",
"@azure/msal-node": "^3.8.0",
"@azure/msal-node-extensions": "^1.5.23",
"@azure/msal-node": "^3.8.3",
"@azure/msal-node-extensions": "^1.5.25",
"@vscode/extension-telemetry": "^0.9.8",
"keytar": "file:./packageMocks/keytar",
"vscode-tas-client": "^0.1.84"
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { AuthError } from '@azure/msal-node';
import { AuthError, ClientAuthError } from '@azure/msal-node';
import TelemetryReporter, { TelemetryEventProperties } from '@vscode/extension-telemetry';
import { IExperimentationTelemetry } from 'vscode-tas-client';
@@ -108,6 +108,40 @@ export class MicrosoftAuthenticationTelemetryReporter implements IExperimentatio
});
}
sendTelemetryClientAuthErrorEvent(error: ClientAuthError): void {
const errorCode = error.errorCode;
const correlationId = error.correlationId;
let brokerErrorCode: string | undefined;
let brokerStatusCode: string | undefined;
let brokerTag: string | undefined;
// Extract platform broker error information if available
if (error.platformBrokerError) {
brokerErrorCode = error.platformBrokerError.errorCode;
brokerStatusCode = `${error.platformBrokerError.statusCode}`;
brokerTag = error.platformBrokerError.tag;
}
/* __GDPR__
"msalClientAuthError" : {
"owner": "TylerLeonhardt",
"comment": "Used to determine how often users run into client auth errors during the login flow.",
"errorCode": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "The client auth error code." },
"correlationId": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "The client auth error correlation id." },
"brokerErrorCode": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "The broker error code." },
"brokerStatusCode": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "The broker error status code." },
"brokerTag": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "The broker error tag." }
}
*/
this._telemetryReporter.sendTelemetryErrorEvent('msalClientAuthError', {
errorCode,
correlationId,
brokerErrorCode,
brokerStatusCode,
brokerTag
});
}
/**
* Sends an event for an account type available at startup.
* @param scopes The scopes for the session
@@ -522,7 +522,11 @@ export class MsalAuthProvider implements AuthenticationProvider {
} catch (e) {
// If we can't get a token silently, the account is probably in a bad state so we should skip it
// MSAL will log this already, so we don't need to log it again
this._telemetryReporter.sendTelemetryErrorEvent(e);
if (e instanceof ClientAuthError) {
this._telemetryReporter.sendTelemetryClientAuthErrorEvent(e);
} else {
this._telemetryReporter.sendTelemetryErrorEvent(e);
}
this._logger.info(`[getAllSessionsForPca] [${scopeData.scopeStr}] [${account.username}] failed to acquire token silently, skipping account`, JSON.stringify(e));
continue;
}