Path: blob/main/extensions/copilot/src/platform/otel/common/workspaceOTelMetadata.ts
13401 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { URI } from '../../../util/vs/base/common/uri';6import { isEqualOrParent, relativePath } from '../../../util/vs/base/common/resources';7import { getOrderedRepoInfosFromContext, type IGitService, normalizeFetchUrl, type RepoContext } from '../../git/common/gitService';8import { CopilotChatAttr } from './genAiAttributes';910export interface WorkspaceOTelMetadata {11readonly headBranchName?: string;12readonly headCommitHash?: string;13readonly remoteUrl?: string;14readonly fileRelativePath?: string;15}1617/**18* Synchronously resolve workspace metadata from the active repository.19* Uses `activeRepository.get()` which is non-blocking.20*/21export function resolveWorkspaceOTelMetadata(22gitService: IGitService,23fileUri?: URI,24): WorkspaceOTelMetadata {25const repoContext = gitService.activeRepository?.get();26if (!repoContext) {27return {};28}29return buildWorkspaceMetadata(repoContext, fileUri);30}3132function buildWorkspaceMetadata(repoContext: RepoContext, fileUri?: URI): WorkspaceOTelMetadata {33let remoteUrl: string | undefined;34const repoInfo = Array.from(getOrderedRepoInfosFromContext(repoContext))[0];35if (repoInfo?.fetchUrl) {36remoteUrl = normalizeFetchUrl(repoInfo.fetchUrl);37}3839let fileRelativePath: string | undefined;40if (fileUri && isEqualOrParent(fileUri, repoContext.rootUri)) {41fileRelativePath = relativePath(repoContext.rootUri, fileUri);42}4344return {45headBranchName: repoContext.headBranchName,46headCommitHash: repoContext.headCommitHash,47remoteUrl,48fileRelativePath,49};50}5152/**53* Convert workspace metadata to OTel attributes, omitting undefined values.54*/55export function workspaceMetadataToOTelAttributes(56metadata?: WorkspaceOTelMetadata,57): Record<string, string> {58if (!metadata) {59return {};60}61const attrs: Record<string, string> = {};62if (metadata.headBranchName) {63attrs[CopilotChatAttr.REPO_HEAD_BRANCH_NAME] = metadata.headBranchName;64}65if (metadata.headCommitHash) {66attrs[CopilotChatAttr.REPO_HEAD_COMMIT_HASH] = metadata.headCommitHash;67}68if (metadata.remoteUrl) {69attrs[CopilotChatAttr.REPO_REMOTE_URL] = metadata.remoteUrl;70}71if (metadata.fileRelativePath) {72attrs[CopilotChatAttr.FILE_RELATIVE_PATH] = metadata.fileRelativePath;73}74return attrs;75}767778