从 Application Insights 导出遥测数据

想要将遥测数据保留超过标准保持期? 或者要以某种专业的方式处理它? 连续导出适用于此目的。 可以使用 JSON 格式将 Application Insights 门户中显示的事件导出到 Azure 中的存储。 可以从该存储中下载这些数据,并编写所需的代码来处理这些数据。

重要

在设置连续导出之前,请考虑一些备选方法:

连续导出将数据复制到存储空间后(数据可在其中保存任意长的时间),在正常保持期内,这些数据仍可在 Application Insights 中使用。

支持的区域

以下区域支持连续导出:

  • Southeast Asia
  • 加拿大中部
  • 印度中部
  • 北欧
  • 英国南部
  • 澳大利亚东部
  • Japan East
  • 韩国中部
  • 法国中部
  • 东亚
  • 美国西部
  • 美国中部
  • 美国东部 2
  • 美国中南部
  • 美国西部 2
  • 南非北部
  • 美国中北部
  • Brazil South
  • 瑞士北部
  • Australia Southeast
  • 英国西部
  • 德国中西部
  • 瑞士西部
  • 澳大利亚中部 2
  • 阿联酋中部
  • 巴西东南部
  • 澳大利亚中部
  • 阿拉伯联合酋长国北部
  • 挪威东部
  • 日本西部

注意

如果导出是在 2021 年 2 月 23 日之前配置的,连续导出将继续适用于美国东部和欧洲西部的应用程序。 无论应用程序何时创建,都不能在美国东部或欧洲西部的任何应用程序上配置新的连续导出规则。

连续导出高级存储配置

连续导出不支持以下 Azure 存储功能/配置:

创建连续导出

注意

应用程序每天导出的数据不能超过 3 TB。 如果每天导出的数据超过 3 TB,则导出将被禁用。 若要无限制地导出,请使用基于诊断设置的导出

  1. 在应用左侧“配置”下的 Application Insights 资源中,打开“连续导出”,并选择“添加”。

  2. 选择要导出的遥测数据类型。

  3. 创建或选择要用于存储数据的 Azure 存储帐户。 有关存储定价选项的详细信息,请参阅定价页

    选择“添加”>“导出目标”>“存储帐户”。 然后创建新存储或选择现有存储。

    警告

    默认情况下,存储位置将设置为与 Application Insights 资源相同的地理区域。 如果存储在不同的区域中,则可能会产生传输费用。

  4. 在存储中创建或选择一个容器。

注意

创建导出后,新引入的数据将开始流向 Azure Blob 存储。 连续导出只传输在启用连续导出后创建/引入的新遥测数据。 在启用连续导出之前存在的任何数据都不会导出。 不支持使用连续导出以追溯方式导出以前创建的数据。

数据出现在存储中之前可能有大约一小时的延迟。

完成第一次导出后,会在 Blob 存储容器中找到以下结构。 (此结构因所收集的数据而异。)

名称 说明
可用性 报告可用性 Web 测试
事件 TrackEvent() 生成的自定义事件。
异常 报告服务器和浏览器中发生的异常
消息 TrackTrace日志记录适配器发送。
指标 由指标 API 调用生成。
PerformanceCounters Application Insights 收集到的性能计数器。
请求 TrackRequest 发送。 标准模块使用请求来报告在服务器上测量的服务器响应时间。

编辑连续导出

选择“连续导出”,然后选择要编辑的存储帐户。

停止连续导出

若要停止导出,请选择“禁用”。 再次选择“启用”时,将使用新数据重启导出。 无法获取在禁用导出时传入门户的数据。

要永久停止导出,请将其删除。 这样做不会将数据从存储中删除。

无法添加或更改导出?

若要添加或更改导出,你需要具有“所有者”、“参与者”或“Application Insights 参与者”访问权限。 了解角色

获取哪些事件?

导出的数据是我们从你的应用程序接收的原始遥测数据,其中添加了来自客户端 IP 地址的位置数据。

采样丢弃的数据不会包含在导出的数据中。

不包含其他计算的指标。 例如,不会导出平均 CPU 使用率,但会导出用来计算平均值的原始遥测数据。

该数据还包含已设置的任何可用性 Web 测试的结果。

注意

如果应用程序发送大量数据,采样功能可能会运行,并只发送一小部分生成的遥测数据。 了解有关采样的详细信息。

检查数据

可以直接在门户中检查存储。 在最左侧的菜单中选择“主页”。 在顶部显示“Azure 服务”的位置,选择“存储帐户”。 选择存储帐户名称,然后在“概述”页上选择“服务”>“Blob”。 最后,选择容器名称。

若要在 Visual Studio 中检查 Azure 存储,请选择“视图”>“Cloud Explorer”。 如果没有此菜单命令,则需要安装 Azure SDK。 打开“新建项目”对话框,展开 Visual C#/云并选择“获取用于 .NET 的 Microsoft Azure SDK”。

打开 Blob 存储后,会看到包含一组 Blob 文件的容器。 你将看到每个文件的 URI 派生自 Application Insights 的资源名称、其检测密钥和遥测类型、日期、时间。 资源名称为全小写形式,检测密钥不包含连字符。

显示使用合适的工具检查 Blob 存储的屏幕截图。

注意

对检测密钥引入的支持将于 2025 年 3 月 31 日结束。 检测密钥引入功能将会继续工作,但我们将不再为该功能提供更新或支持。 转换为连接字符串,以利用新功能

日期和时间采用 UTC,表示在存储中存放遥测数据的时间,而不是生成遥测数据的时间。 因此,如果编写代码来下载数据,数据的日期和时间可能会线性移动。

路径格式如下:

$"{applicationName}_{instrumentationKey}/{type}/{blobDeliveryTimeUtc:yyyy-MM-dd}/{ blobDeliveryTimeUtc:HH}/{blobId}_{blobCreationTimeUtc:yyyyMMdd_HHmmss}.blob"

其中:

  • blobCreationTimeUtc 是在内部暂存存储中创建 Blob 的时间。
  • blobDeliveryTimeUtc 是将 Blob 复制到导出目标存储的时间。

数据格式

设置数据的格式以便:

  • 每个 Blob 是一个文本文件,其中包含多个以 \n 分隔的行。 它包含大约半分钟时间内处理的遥测数据。

  • 每行代表遥测数据点,例如请求或页面视图。

  • 每行是未设置格式的 JSON 文档。 如果要查看行,请在 Visual Studio 中打开 Blob,然后选择“编辑”>“高级”>“设置文件格式”。

    显示使用合适的工具查看遥测数据的屏幕截图

持续时间以刻度为单位,10000 刻度 = 1 毫秒。 例如,这些值显示从浏览器发送请求用了 1 毫秒时间,接收它用了 3 毫秒,在浏览器中处理页面用了 1.8 秒:

"sendRequest": {"value": 10000.0},
"receiveRequest": {"value": 30000.0},
"clientProcess": {"value": 17970000.0}

有关属性类型和值的详细数据模型参考,请参阅 Application Insights 导出数据模型

处理数据

如果数据规模不大,可以编写一些代码来提取数据,并在电子表格中阅读这些数据。 例如:

private IEnumerable<T> DeserializeMany<T>(string folderName)
{
   var files = Directory.EnumerateFiles(folderName, "*.blob", SearchOption.AllDirectories);
   foreach (var file in files)
   {
      using (var fileReader = File.OpenText(file))
      {
         string fileContent = fileReader.ReadToEnd();
         IEnumerable<string> entities = fileContent.Split('\n').Where(s => !string.IsNullOrWhiteSpace(s));
         foreach (var entity in entities)
         {
            yield return JsonConvert.DeserializeObject<T>(entity);
         }
      }
   }
}

如需更详细的代码示例,请参阅使用辅助角色

删除旧数据

你需要负责管理存储容量,以及在必要时删除旧数据。

重新生成存储密钥

如果更改存储密钥,连续导出将停止运行。 Azure 帐户中会显示通知。

选择“连续导出”选项卡并编辑导出。 编辑“导出目标”值,只保留选定的同一存储。 选择“确定”以确认。

连续导出将重启。

导出示例

有关导出示例,请参阅:

如果数据规模较大,可以考虑云中的 HDInsight Hadoop 群集。 HDInsight 提供各种用于管理和分析大数据的技术。 可以使用它来处理从 Application Insights 导出的数据。

常见问题

本部分提供常见问题的解答。

是否可以一次性下载图表?

可以。 在选项卡的顶部,选择“导出数据”。

我设置了导出,但为什么存储中没有数据?

自设置导出之后,Application Insights 是否从应用程序收到了任何遥测数据? 只会收到新数据。

尝试设置导出时为什么出现拒绝访问错误?

如果帐户由组织拥有,则你必须是所有者或参与者组的成员。

是否可以直接导出到我自己的本地存储?

否。 我们的导出引擎目前仅适用于 Azure 存储。

放置在存储中的数据量是否有任何限制?

不是。 我们将持续推送数据,直到删除了导出。 如果达到 Blob 存储的外在限制,我们将停止推送,但那个限制极大。 可以自行控制使用的存储量。

存储中应会出现多少个 Blob?

  • 对于选择要导出的每种数据类型,将每分钟创建一个新 Blob(如果有可用的数据)。
  • 对于高流量的应用程序,将分配额外的分区单元。 在此情况下,每个单元会每分钟创建一个 Blob。

我为存储重新生成了密钥或更改了容器的名称,但为什么现在导出不能正常进行?

请编辑导出并选择“导出目标”选项卡。像以前一样保留选择相同的存储,并选择“确定”以确认。 导出将重新开始。 如果更改是在最近几天内做出的,则不会丢失数据。

是否可以暂停导出?

是的。 选择“禁用”。

代码示例

基于诊断设置的导出

首选诊断设置导出,因为它提供额外的功能:

  • 具有虚拟网络、防火墙和专用链接的 Azure 存储帐户。
  • 导出到 Azure 事件中心。

诊断设置导出在以下方面与连续导出存在更多的不同:

  • 更新的架构。
  • 遥测数据在到达时发送,而不是以批量上传的方式发送。

重要

由于对目标(例如存储帐户)的调用增加,可能会产生额外的费用。

若要迁移到诊断设置导出,请执行以下操作:

  1. 在经典 Application Insights 上启用诊断设置。
  2. 配置数据导出:从 Application Insights 资源中选择“ 诊断设置>”“添加诊断设置 ”。
  3. 验证新数据导出的配置是否与连续导出相同

注意

如果要在 Log Analytics 工作区中存储诊断日志,需要考虑两点以免 Application Insights 中出现重复数据:

  • 该目标不能与 Application Insights 资源所基于的 Log Analytics 工作区相同。
  • Application Insights 用户不能同时访问两个工作区。 将 Log Analytics 访问控制模式设置为“需要工作区权限”。 通过 Azure 基于角色的访问控制,确保用户只能访问 Application Insights 资源所基于的 Log Analytics 工作区。

这些步骤是必要的,因为 Application Insights 跨 Application Insight 资源(包括 Log Analytics 工作区)来访问遥测数据,以提供完整的端到端事务操作和准确的应用程序映射。 由于诊断日志使用相同的表名,因此如果用户有权访问包含相同数据的多个资源,则可能会显示重复的遥测数据。

Application Insights 导出数据模型

此表列出了从 Application Insights SDK 发送到门户的遥测属性。 连续导出的数据输出中会显示这些属性。 这些属性还显示在指标资源管理器诊断搜索的属性筛选器中。

需要注意的要点:

  • 这些表中的 [0] 表示必须在其中插入索引的路径中的一个点,但它不一定总为 0。
  • 持续时间的单位为微秒,因此 10000000 == 1 秒。
  • 日期和时间采用 UTC,以 ISO 格式 yyyy-MM-DDThh:mm:ss.sssZ 表示

示例

// A server report about an HTTP request
{
  "request": [
    {
      "urlData": { // derived from 'url'
        "host": "contoso.org",
        "base": "/",
        "hashTag": ""
      },
      "responseCode": 200, // Sent to client
      "success": true, // Default == responseCode<400
      // Request id becomes the operation id of child events
      "id": "fCOhCdCnZ9I=",  
      "name": "GET Home/Index",
      "count": 1, // 100% / sampling rate
      "durationMetric": {
        "value": 1046804.0, // 10000000 == 1 second
        // Currently the following fields are redundant:
        "count": 1.0,
        "min": 1046804.0,
        "max": 1046804.0,
        "stdDev": 0.0,
        "sampledValue": 1046804.0
      },
      "url": "/"
    }
  ],
  "internal": {
    "data": {
      "id": "7f156650-ef4c-11e5-8453-3f984b167d05",
      "documentVersion": "1.61"
    }
  },
  "context": {
    "device": { // client browser
      "type": "PC",
      "screenResolution": { },
      "roleInstance": "WFWEB14B.fabrikam.net"
    },
    "application": { },
    "location": { // derived from client ip
      "continent": "North America",
      "country": "United States",
      // last octagon is anonymized to 0 at portal:
      "clientip": "168.62.177.0",
      "province": "",
      "city": ""
    },
    "data": {
      "isSynthetic": true, // we identified source as a bot
      // percentage of generated data sent to portal:
      "samplingRate": 100.0,
      "eventTime": "2016-03-21T10:05:45.7334717Z" // UTC
    },
    "user": {
      "isAuthenticated": false,
      "anonId": "us-tx-sn1-azr", // bot agent id
      "anonAcquisitionDate": "0001-01-01T00:00:00Z",
      "authAcquisitionDate": "0001-01-01T00:00:00Z",
      "accountAcquisitionDate": "0001-01-01T00:00:00Z"
    },
    "operation": {
      "id": "fCOhCdCnZ9I=",
      "parentId": "fCOhCdCnZ9I=",
      "name": "GET Home/Index"
    },
    "cloud": { },
    "serverDevice": { },
    "custom": { // set by custom fields of track calls
      "dimensions": [ ],
      "metrics": [ ]
    },
    "session": {
      "id": "65504c10-44a6-489e-b9dc-94184eb00d86",
      "isFirst": true
    }
  }
}

上下文

所有类型的遥测随附上下文部分。 并非所有字段都连同每个数据点传输。

`Path` 类型 注释
context.custom.dimensions [0] object [ ] 自定义属性参数设置的键-值字符串对。 键的最大长度为 100,值的最大长度为 1024。 如果唯一值超过 100 个,属性可搜索,但不可用于分段。 每个 ikey 最多有 200 个键。
context.custom.metrics [0] object [ ] 自定义测量参数和 TrackMetrics 设置的键-值对。 键的最大长度为 100,值可以是数字。
context.data.eventTime string UTC
context.data.isSynthetic boolean 请求似乎来自 Bot 或 Web 测试。
context.data.samplingRate number SDK 生成的、发送到门户的遥测百分比。 范围为 0.0-100.0。
context.device object 客户端设备
context.device.browser string IE、Chrome...
context.device.browserVersion string Chrome 48.0...
context.device.deviceModel string
context.device.deviceName string
context.device.id string
context.device.locale string en-GB、de-DE...
context.device.network string
context.device.oemName string
context.device.os string
context.device.osVersion string 主机 OS
context.device.roleInstance string 服务器主机的 ID
context.device.roleName string
context.device.screenResolution string
context.device.type string 电脑、浏览器...
context.location object 派生自 clientip
context.location.city string 派生自 clientip(如果已知)
context.location.clientip string 最后一个八边形匿名化为 0。
context.location.continent string
context.location.country string
context.location.province string 州或省
context.operation.id string 具有相同 operation id 的项在门户中显示为“相关项”。 通常是 request id
context.operation.name string URL 或请求名称
context.operation.parentId string 允许嵌套的相关项。
context.session.id string 一组来自相同源的操作的 Id。 如果在 30 分钟期限内没有操作,则表示会话结束。
context.session.isFirst boolean
context.user.accountAcquisitionDate string
context.user.accountId string
context.user.anonAcquisitionDate string
context.user.anonId string
context.user.authAcquisitionDate string 经过身份验证的用户
context.user.authId string
context.user.isAuthenticated boolean
context.user.storeRegion string
internal.data.documentVersion string
internal.data.id string 将项引入到 Application Insights 时分配的 Unique id

事件

TrackEvent() 生成的自定义事件。

`Path` 类型 注释
event [0] count integer 100/(采样率)。 例如 4 => 25%。
event [0] name string 事件名称。 最大长度为 250。
event [0] url string
event [0] urlData.base string
event [0] urlData.host string

异常

报告服务器和浏览器中发生的异常

`Path` 类型 注释
basicException [0] assembly string
basicException [0] count integer 100/(采样率)。 例如 4 => 25%。
basicException [0] exceptionGroup string
basicException [0] exceptionType string
basicException [0] failedUserCodeMethod string
basicException [0] failedUserCodeAssembly string
basicException [0] handledAt string
basicException [0] hasFullStack boolean
basicException [0] id string
basicException [0] method string
basicException [0] message string 异常消息。 最大长度为 10k。
basicException [0] outerExceptionMessage string
basicException [0] outerExceptionThrownAtAssembly string
basicException [0] outerExceptionThrownAtMethod string
basicException [0] outerExceptionType string
basicException [0] outerId string
basicException [0] parsedStack [0] assembly string
basicException [0] parsedStack [0] fileName string
basicException [0] parsedStack [0] level integer
basicException [0] parsedStack [0] line integer
basicException [0] parsedStack [0] method string
basicException [0] stack string 最大长度为 10k
basicException [0] typeName string

跟踪消息

TrackTrace日志记录适配器发送。

`Path` 类型 注释
message [0] loggerName string
message [0] parameters string
message [0] raw string 日志消息,最大长度为 10k。
message [0] severityLevel string

远程依赖项

由 TrackDependency 发送。 用于报告服务器中依赖项调用以及浏览器中 AJAX 调用的性能和用法。

`Path` 类型 注释
remoteDependency [0] async boolean
remoteDependency [0] baseName string
remoteDependency [0] commandName string 例如“home/index”
remoteDependency [0] count integer 100/(采样率)。 例如 4 => 25%。
remoteDependency [0] dependencyTypeName string HTTP、SQL...
remoteDependency [0] durationMetric.value number 从依赖项调用到完成响应花费的时间
remoteDependency [0] id string
remoteDependency [0] name string URL。 最大长度为 250。
remoteDependency [0] resultCode string 源 HTTP 依赖项
remoteDependency [0] success boolean
remoteDependency [0] type string Http、Sql...
remoteDependency [0] url string 最大长度为 2000
remoteDependency [0] urlData.base string 最大长度为 2000
remoteDependency [0] urlData.hashTag string
remoteDependency [0] urlData.host string 最大长度为 200

请求

TrackRequest 发送。 标准模块使用此属性报告在服务器上测量的服务器响应时间。

`Path` 类型 注释
request [0] count integer 100/(采样率)。 例如:4 => 25%.
request [0] durationMetric.value number 从请求到响应花费的时间。 1e7 == 1s
请求 {0} id string Operation id
request [0] name string GET/POST + URL 基。 最大长度为 250
request [0] responseCode integer 发送到客户端的 HTTP 响应
request [0] success boolean 默认值 == (responseCode < 400)
request [0] url string 不包括主机
request [0] urlData.base string
request [0] urlData.hashTag string
request [0] urlData.host string

页面视图性能

由浏览器发送。 测量处理页面花费的时间,从用户发起请求算起,到显示完成(不包括异步 AJAX 调用)为止。

上下文值显示客户端 OS 和浏览器版本。

`Path` 类型 注释
clientPerformance [0] clientProcess.value integer 从接收 HTML 完成到显示页面花费的时间。
clientPerformance [0] name string
clientPerformance [0] networkConnection.value integer 建立网络连接花费的时间。
clientPerformance [0] receiveRequest.value integer 从发送请求结束到在回复中接收 HTML 所花费的时间。
clientPerformance [0] sendRequest.value integer 发送 HTTP 请求花费的时间。
clientPerformance [0] total.value integer 从开始发送请求到显示页面花费的时间。
clientPerformance [0] url string 此请求的 URL
clientPerformance [0] urlData.base string
clientPerformance [0] urlData.hashTag string
clientPerformance [0] urlData.host string
clientPerformance [0] urlData.protocol string

页面视图

由 trackPageView() 或 stopTrackPage 发送

`Path` 类型 注释
view [0] count integer 100/(采样率)。 例如 4 => 25%。
view [0] durationMetric.value integer 在 trackPageView() 中设置的,或者由 startTrackPage() - stopTrackPage() 设置的可选值。 与 clientPerformance 值不同。
view [0] name string 页面标题。 最大长度为 250
view [0] url string
view [0] urlData.base string
view [0] urlData.hashTag string
view [0] urlData.host string

可用性

报告可用性 Web 测试

`Path` 类型 注释
availability [0] availabilityMetric.name string availability
availability [0] availabilityMetric.value number 1.0 或 0.0
availability [0] count integer 100/(采样率)。 例如 4 => 25%。
availability [0] dataSizeMetric.name string
availability [0] dataSizeMetric.value integer
availability [0] durationMetric.name string
availability [0] durationMetric.value number 测试持续时间。 1e7==1s
availability [0] message string 故障诊断
availability [0] result string 通过/失败
availability [0] runLocation string http 请求的地域源
availability [0] testName string
availability [0] testRunId string
availability [0] testTimestamp string

指标

由 TrackMetric() 生成。

指标值出现在 context.custom.metrics[0] 中

例如:

{
  "metric": [ ],
  "context": {
  ...
    "custom": {
      "dimensions": [
        { "ProcessId": "4068" }
      ],
      "metrics": [
        {
          "dispatchRate": {
            "value": 0.001295,
            "count": 1.0,
            "min": 0.001295,
            "max": 0.001295,
            "stdDev": 0.0,
            "sampledValue": 0.001295,
            "sum": 0.001295
          }
        }
      ]  
    }
  }
}

关于指标值

指标报告和其他位置中的指标值是使用标准对象结构报告的。 例如:

"durationMetric": {
  "name": "contoso.org",
  "type": "Aggregation",
  "value": 468.71603053650279,
  "count": 1.0,
  "min": 468.71603053650279,
  "max": 468.71603053650279,
  "stdDev": 0.0,
  "sampledValue": 468.71603053650279
}

目前(将来可能会变化)在所有通过标准 SDK 模块报告的值中,只有 count==1 以及 namevalue 字段有用。 这些元素存在差异的唯一情况是你编写自己的 TrackMetric 调用,并在其中设置其他参数。

其他字段的用途是便于在 SDK 中聚合指标,减少门户接收的流量。 例如,在发送每份指标报告之前,可求多个连续读数的平均值。 然后计算最小值、最大值、标准偏差和聚合值(总和或平均值),并将计数设置为报告呈现的读数数目。

上表中省略了一些极少用到的字段:count、min、max、stdDev 和 sampledValue。

如果需要减少遥测量,可以改用采样,而不要使用预先聚合的指标。

持续时间

除非另有规定,否则持续时间以十分之一微秒表示,因此 10000000.0 表示 1 秒。

另请参阅