.NET SDK 和 .NET CLI 遥测

.NET SDK 包含一项遥测功能,该功能收集使用情况数据,并在使用 .NET CLI 命令时将其发送到Microsoft。 使用数据包括 .NET CLI 崩溃时的异常信息。 .NET CLI 附带 .NET SDK,是一组动词,可用于生成、测试和发布 .NET 应用。 遥测数据可帮助 .NET 团队了解工具的使用方式,以便改进这些工具。 有关失败的信息可帮助团队解决问题并修复错误。

收集的数据在 Creative Commons 归因许可证下聚合发布。 某些收集的数据在 .NET CLI 遥测数据中发布。

范围

dotnet 有两个函数:运行应用和执行 CLI 命令。 按以下格式使用 dotnet 来启动应用程序时,不会收集遥测数据

  • dotnet [path-to-app].dll

使用任何 .NET CLI 命令时,都会收集遥测数据,如

  • dotnet build
  • dotnet pack
  • dotnet run

如何选择退出

默认情况下,会为 Microsoft SDK 发行版启用 .NET SDK 遥测功能。 若要选择退出遥测功能,请将 DOTNET_CLI_TELEMETRY_OPTOUT 环境变量设置为 1true

如果安装成功,.NET SDK 安装程序也会发送一个遥测条目。 若要选择退出,请在安装 .NET SDK 之前设置 DOTNET_CLI_TELEMETRY_OPTOUT 环境变量。

重要

若要在启动安装程序后选择退出:关闭安装程序,设置环境变量,然后使用设置该值再次运行安装程序。

公开

首次运行 .NET CLI 命令之一(例如,dotnet build),.NET SDK 将显示类似于以下内容的文本。 文本可能会略有不同,具体取决于正在运行的 SDK 版本。 此“首次运行”体验是微软向你通知有关数据收集的方式。

Telemetry
---------
The .NET tools collect usage data in order to help us improve your experience. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.

Read more about .NET CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry

若要禁用此消息和 .NET 欢迎消息,请将 DOTNET_NOLOGO 环境变量设置为 true。 请注意,此变量对遥测选择退出没有影响。

数据点

遥测功能不会收集个人数据,例如用户名或电子邮件地址。 它不会扫描代码,也不会提取项目级数据,例如名称、存储库或作者。 它不会提取应用访问或创建的任何数据文件的内容、应用对象占用的任何内存转储或剪贴板的内容。 数据通过 Azure Monitor 技术安全地发送到 Microsoft 服务器,数据在受限访问下存储,并在安全 Azure 存储 系统的严格安全控制下发布。

保护隐私对我们很重要。 如果您怀疑遥测正在收集敏感数据,或数据被不安全或不当处理,请在 dotnet/sdk 存储库中提交问题,或发送电子邮件至 dotnet@microsoft.com,以便进行调查。

遥测功能收集以下数据:

SDK 版本 数据
全部 调用的时间戳。
全部 从 2.1 版本开始,调用命令(例如“build”)时会进行哈希处理。
全部 用于确定地理位置的三个八进制 IP 地址。
全部 操作系统和版本。
全部 运行 SDK 的运行时 ID (RID)。
全部 .NET SDK 版本。
全部 遥测配置文件:一个可选值,仅在用户显式选择加入时可用,并在 Microsoft 内部使用。
>=2.0 命令参数和选项:收集多个参数和选项(而不是任意字符串)。 请参阅收集的选项。 从 2.1.300 后进行哈希处理。
>=2.0 SDK 是否在容器中运行。
>=2.0 目标框架(来自 TargetFramework 事件),从 2.1 开始进行哈希处理。
>=2.0 哈希媒体访问控制(MAC)地址(SHA256)。
>=2.0 当前工作目录已进行哈希处理。
>=2.0 安装成功报告,其中包含安装程序 exe 文件名的哈希值。
>=2.1.300 内核版本。
>=2.1.300 Libc 发行/版本。
>=3.0.100 输出是否被重定向(true 还是 false)。
>=3.0.100 CLI/SDK 故障时的异常类型及其堆栈跟踪(发送的堆栈跟踪中仅包含 CLI/SDK 代码)。 有关详细信息,请参阅故障异常遥测
>=5.0.100 用于生成的经过哈希处理的 TargetFrameworkVersion(MSBuild 属性)
>=5.0.100 用于生成的经过哈希处理的 RuntimeIdentifier(MSBuild 属性)
>=5.0.100 用于生成的经过哈希处理的 SelfContained(MSBuild 属性)
>=5.0.100 用于生成的经过哈希处理的 UseApphost(MSBuild 属性)
>=5.0.100 用于构建的哈希输出类型(MSBuild 属性)
>=5.0.201 用于生成的经过哈希处理的 PublishReadyToRun(MSBuild 属性)
>=5.0.201 用于生成的经过哈希处理的 PublishTrimmed(MSBuild 属性)
>=5.0.201 用于生成的经过哈希处理的 PublishSingleFile(MSBuild 属性)
>=5.0.202 从进程开始到进入 CLI 程序的 main 方法为止的运行时间,可衡量主机和运行时的启动情况。
>=5.0.202 在首次运行时将 .NET 工具添加到路径这一步的运行时间。
>=5.0.202 首次运行时要显示首次使用时间通知的运行时间。
>=5.0.202 首次运行时生成 ASP.NET 证书所用的时间。
>=5.0.202 分析 CLI 输入的运行时间。
>=6.0.100 OS 体系结构
>=6.0.104 用于生成的经过哈希处理的 PublishReadyToRunUseCrossgen2(MSBuild 属性)
>=6.0.104 用于生成的经过哈希处理的 Crossgen2PackVersion(MSBuild 属性)
>=6.0.104 用于生成的经过哈希处理的 CompileListCount(MSBuild 属性)
>=6.0.104 用于生成的经过哈希处理的 _ReadyToRunCompilationFailures(MSBuild 属性)
>=6.0.300 如果从持续集成环境调用了 CLI。 有关详细信息,请参阅 持续集成检测
>=7.0.100 用于生成的经过哈希处理的 PublishAot(MSBuild 属性)
>=7.0.100 用于生成的经过哈希处理的 PublishProtocol(MSBuild 属性)
>=8.0.100 用于生成的经过哈希处理的 TargetPlatformIdentifier(MSBuild 属性)
>=8.0.100 用于生成的经过哈希处理的 HybridGlobalization(MSBuild 属性)
>=8.0.100 是否使用 .NET Blazor WebAssembly SDK。
>=8.0.100 是否使用 .NET WebAssembly SDK。
>=8.0.100 是否使用 .NET MAUI。
>=8.0.100 是否使用 .NET 移动 SDK。
>=8.0.100 是否使用其他移动 SDK(例如:Avalonia、Uno)。
>=8.0.100 是否使用 Mono AOT。
>=8.0.100 是否使用 Mono AOT strip IL 功能。
>=8.0.100 是否使用 Mono 解释器。
>=8.0.100 是否使用移动库模式。
>=8.0.100 是否使用 NativeAOT。
>=8.0.100 已使用 Mono 运行时包版本。

收集的选项

某些命令发送其他数据。 命令的子集发送第一个参数:

命令 发送的第一个参数数据
dotnet help <arg> 正在查询命令帮助。
dotnet new <arg> 模板名称(已哈希处理)。
dotnet add <arg> 单词 packagereference
dotnet remove <arg> 单词 packagereference
dotnet list <arg> 单词 packagereference
dotnet sln <arg> 单词 addlistremove
dotnet nuget <arg> 单词 deletelocalspush
dotnet workload <subcommand> <arg> 单词 installupdatelistsearchuninstallrepairrestore 和工作负荷名称(进行哈希处理)。
dotnet tool <subcommand> <arg> 单词 installupdatelistsearchuninstallrun 和 dotnet tool 名称(进行哈希处理)。

命令的子集将发送所选选项(如果使用)及其值:

选项 命令
--verbosity 所有命令
--language dotnet new
--configuration dotnet builddotnet cleandotnet publishdotnet rundotnet test
--framework dotnet builddotnet cleandotnet publishdotnet rundotnet testdotnet vstest
--runtime dotnet builddotnet publish
--platform dotnet vstest
--logger dotnet vstest
--sdk-package-version dotnet migrate

当 SDK 无法解析内置命令时,任何成功解析命令的命令解析程序都发送命令名称的哈希以及命令解析程序类型的名称。

--verbosity--sdk-package-version外,所有其他值都以 .NET Core 2.1.100 SDK 开头进行哈希处理。

模板引擎遥测

从 .NET Core 2.1.100 SDK 开始,dotnet new 模板实例化命令为Microsoft创作的模板收集其他数据:

  • --framework
  • --auth

故障异常遥测

如果 .NET CLI/SDK 崩溃,它将收集 CLI/SDK 代码的异常和堆栈跟踪的名称。 收集此信息以评估问题并提高 .NET SDK 和 CLI 的质量。 本文提供有关我们收集的数据的信息。 它还提供有关用户如何生成自己的 .NET SDK 版本的提示,以避免无意中泄露个人或敏感信息。

.NET CLI 仅收集 CLI/SDK 异常的信息,而不是应用程序中的异常。 收集的数据包含异常的名称和堆栈跟踪。 此堆栈跟踪为 CLI/SDK 代码。

以下示例显示了收集的数据类型:

System.IO.IOException
at System.ConsolePal.WindowsConsoleStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
at System.IO.StreamWriter.Write(Char[] buffer)
at System.IO.TextWriter.WriteLine()
at System.IO.TextWriter.SyncTextWriter.WriteLine()
at Microsoft.DotNet.Cli.Utils.Reporter.WriteLine()
at Microsoft.DotNet.Tools.Run.RunCommand.EnsureProjectIsBuilt()
at Microsoft.DotNet.Tools.Run.RunCommand.Execute()
at Microsoft.DotNet.Tools.Run.RunCommand.Run(String[] args)
at Microsoft.DotNet.Cli.Program.ProcessArgs(String[] args, ITelemetry telemetryClient)
at Microsoft.DotNet.Cli.Program.Main(String[] args)

持续集成检测

为了检测 .NET CLI 是否在持续集成环境中运行,.NET CLI 会探测常见 CI 提供程序设置的多个已知环境变量的存在和值。

下面显示了环境变量的完整列表及其值。 请注意,在每种情况下,永远不会收集环境变量的值,仅用于设置布尔标志。

变量 提供者 操作
TF_BUILD Azure Pipelines 解析布尔值
GITHUB_ACTIONS GitHub 操作 解析布尔值
APPVEYOR Appveyor 解析布尔值
CI 许多/大多数 解析布尔值
崔维斯 Travis CI 解析布尔值
CIRCLECI Circle CI 分析布尔值
CODEBUILD_BUILD_ID, AWS_REGION Amazon Web Services CodeBuild 检查是否所有变量均存在且非 null
BUILD_ID, BUILD_URL 詹金斯 检查是否所有变量均存在且非 null
BUILD_ID, PROJECT_ID Google Cloud Build 检查是否所有变量均存在且非 null
TEAMCITY_VERSION TeamCity 检查是否存在且非 null
JB_SPACE_API_URL JetBrains Space 检查是否存在且非 null

避免无意中泄露信息

.NET 参与者和运行自己构建的 .NET SDK 版本的其他人应考虑其 SDK 源代码的路径。 如果在使用一个经过自定义调试构建或者配置了自定义构建符号文件的 .NET SDK 时发生崩溃,则用于生成的机器上的 SDK 源文件路径将作为堆栈跟踪的一部分被收集,并且不会被哈希处理。

因此,.NET SDK 的自定义生成不应放在路径名称可能泄露个人或敏感信息的目录中。

另请参阅