Compartilhar via

为 Java 配置 Azure Monitor Application Insights

本文介绍如何为 Java 配置 Azure Monitor Application Insights。 有关详细信息,请参阅 OpenTelemetry 入门

配置Java代理

JSON 配置源

默认情况下,Application Insights Java 3 要求将配置文件命名为 applicationinsights.json,并位于与 applicationinsights-agent-3.7.5.jar 相同的目录中。

自定义维度

备注

从 Java 代理版本 3.0.2 开始,如果添加名为 service.version 的自定义维度,该值将存储在 Application Insights Logs 表中的 application_Version 列中,而不是自定义维度。

如果要向所有遥测数据添加自定义维度:

{
  "customDimensions": {
    "mytag": "my value",
    "anothertag": "${ANOTHER_VALUE}"
  }
}

在启动时可以使用 ${...} 从指定的环境变量中读取值。

继承的属性(预览版)

备注

此功能从 Java 代理版本 3.2.0 开始可用。

可以在请求遥测上以编程方式设置自定义维度。 它通过依赖项和日志遥测来确保继承。 所有内容都将在该请求的上下文中捕获。

{
  "preview": {
    "inheritedAttributes": [
      {
        "key": "mycustomer",
        "type": "string"
      }
    ]
  }
}

然后在每个请求开始时调用:

Span.current().setAttribute("mycustomer", "xyz");

另请参阅 向 Span 添加自定义属性

配置采样替代

备注

此功能从 Java 代理版本 3.5.0 开始正式发布。

采样超控允许覆盖默认采样百分比。 例如,你能够:

  • 将采样百分比设置为 0 或某个较小的值,以应对嘈杂的健康检查。
  • 将采样百分比设置为 0 或较小的值,以应对依赖项调用中的噪声问题。
  • 将重要请求类型的采样百分比设置为 100。 例如,即使已将默认采样配置为较低的值,也可以使用 /login

采样优先于术语

在了解采样替代之前,应了解术语“范围”。

跨度是一种用于表示以下内容的遥测类型:

  • 传入的请求。
  • 传出的依赖项(例如,对另一个服务的远程调用)。
  • 进程内依赖项(例如,由服务的子组件所做的工作)。

对于采样替代而言,这些范围组件非常重要:

  • 特性

范围属性表示给定请求或依赖项的标准属性和自定义属性。

采样重写入门

首先,创建一个名为“applicationinsights.json”的配置文件。 将其保存在与“applicationinsights-agent-*.jar”相同的目录中。 请使用以下模版。

{
  "connectionString": "...",
  "sampling": {
    "percentage": 10,
    "overrides": [
      {
        "telemetryType": "request",
        "attributes": [
          ...
        ],
        "percentage": 0
      },
      {
        "telemetryType": "request",
        "attributes": [
          ...
        ],
        "percentage": 100
      }
    ]
  }
}

采样替代的工作原理

telemetryType (Application Insights 3.4.0 中的 telemetryKind) 必须是 requestdependencytrace (日志) 或 exception

当开始一个范围时,会使用该范围的类型以及当时存在于其上的属性来检查是否有任何匹配的采样替代。 匹配项可为 strictregexp。 正则表达式匹配是针对整个属性值执行的,因此如果要匹配其中任何位置包含 abc 的值,则需要使用 .*abc.*

采样替代可以指定多个属性条件,在这种情况下,所有属性条件都必须匹配,才能使采样替代匹配。 如果有一个采样替代匹配,则使用其采样百分比来确定是否要对该范围采样。

只使用匹配的第一个采样替代。 如果没有采样替代匹配:

  • 如果是在跟踪中的第一个跨度,则使用顶层采样配置。
  • 如果不是跟踪中的第一个范围,则会使用父采样决策。

可用于采样的范围属性

OpenTelemetry 范围属性为自动收集,且基于 OpenTelemetry 语义约定

你还能以编程方式添加范围属性,并将其用于采样。

备注

采样覆盖用例

展开以下任何用例以查看示例配置。


抑制收集与运行状况检查有关的遥测数据

这一示例会取消收集所有对 /health-checks 的请求的遥测数据。

此示例也会抑制通常会在 /health-checks 下收集的任何下游范围(依赖项)的收集。

{
  "connectionString": "...",
  "sampling": {
    "overrides": [
        {
        "telemetryType": "request",
        "attributes": [
          {
            "key": "url.path",
            "value": "/health-check",
            "matchType": "strict"
          }
        ],
        "percentage": 0
      }
    ]
  }
}

禁止收集干扰依赖项调用的遥测数据

此示例会抑制为所有 GET my-noisy-key redis 调用收集遥测。

{
  "connectionString": "...",
  "sampling": {
    "overrides": [
      {
        "telemetryType": "dependency",
        "attributes": [
          {
            "key": "db.system",
            "value": "redis",
            "matchType": "strict"
          },
          {
            "key": "db.statement",
            "value": "GET my-noisy-key",
            "matchType": "strict"
          }
        ],
        "percentage": 0
      }
    ]
  }
}

收集重要请求类型的 100% 遥测数据

这一示例会收集 /login 的全部遥测数据。

由于下游范围(依赖项)遵循父级的采样决策(缺少该下游范围的任何采样替代),因此也会为所有“/login”请求收集这些范围。

{
  "connectionString": "...",
  "sampling": {
    "percentage": 10
  },
  "sampling": {
    "overrides": [
      {
        "telemetryType": "request",
        "attributes": [
          {
            "key": "url.path",
            "value": "/login",
            "matchType": "strict"
          }
        ],
        "percentage": 100
      }
    ]
  }
}

公开范围属性以抑制 SQL 依赖项调用

此示例演示如何标识可用属性来抑制干扰 SQL 调用。 以下查询描述了过去 30 天内的不同 SQL 调用和关联的记录计数:

dependencies
| where timestamp > ago(30d)
| where name == 'SQL: DB Query'
| summarize count() by name, operation_Name, data
| sort by count_ desc
SQL: DB Query    POST /Order             DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    36712549
SQL: DB Query    POST /Receipt           DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    2220248
SQL: DB Query    POST /CheckOutForm      DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    554074
SQL: DB Query    GET /ClientInfo         DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    37064

从结果中可以看到,所有操作在 data 字段中共享相同的值:DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;。 所有这些记录之间的通用性使得它适合采样替代。

通过将自我诊断设置为调试,输出中会显示以下日志条目:

2023-10-26 15:48:25.407-04:00 DEBUG c.m.a.a.i.exporter.AgentSpanExporter - exporting span: SpanData{spanContext=ImmutableSpanContext...

这些日志中感兴趣的区域是“属性”部分:

{
  "attributes": {
    "data": {
      "thread.name": "DefaultDatabaseBroadcastTransport: MessageReader thread",
      "thread.id": 96,
      "db.connection_string": "apache:",
      "db.statement": "DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;",
      "db.system": "other_sql",
      "applicationinsights.internal.item_count": 1
    }s
  }
}

使用该输出,您可以配置类似于以下示例的采样覆写,以筛选噪声 SQL 调用:

{
  "connectionString": "...",
  "preview": {
    "sampling": {
      "overrides": [
        {
          "telemetryType": "dependency",
          "attributes": [
            {
              "key": "db.statement",
              "value": "DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;",
              "matchType": "strict"
            }
          ],
          "percentage": 0
        }
      ]
    }
  }
}

应用更改后,以下查询允许我们确定这些依赖项上次引入 Application Insights 的时间:

dependencies
| where timestamp > ago(30d)
| where data contains 'DECLARE @MyVar'
| summarize max(timestamp) by data
| sort by max_timestamp desc
DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    11/13/2023 8:52:41 PM 

禁止收集日志的遥测数据

使用 SLF4J,可以添加日志属性:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

public class MdcClass {

  private static final Logger logger = LoggerFactory.getLogger(MdcClass.class);

  void method() {
    MDC.put("key", "value");
    try {
      logger.info(...); // Application log to remove
    } finally {
      MDC.remove("key"); // In a finally block in case an exception happens with logger.info
    }
  }
}

然后,可以删除包含所添加的属性的日志:

{
  "sampling": {
    "overrides": [
      {
        "telemetryType": "trace",
        "percentage": 0,
        "attributes": [
          {
            "key": "key",
            "value": "value",
            "matchType": "strict"
          }
        ]
      }
    ]
  }
}

抑制Java方法的遥测数据收集

以下示例向Java方法增加一个范围,并通过覆盖采样来删除该范围。

首先,添加 opentelemetry-instrumentation-annotations 依赖项:

<dependency>
  <groupId>io.opentelemetry.instrumentation</groupId>
  <artifactId>opentelemetry-instrumentation-annotations</artifactId>
</dependency>

然后,将 WithSpan 批注添加到执行 SQL 请求的Java方法:

package org.springframework.samples.petclinic.vet;

@Controller
class VetController {

  private final VetRepository vetRepository;

  public VetController(VetRepository vetRepository) {
    this.vetRepository = vetRepository;
  }

  @GetMapping("/vets.html")
  public String showVetList(@RequestParam(defaultValue = "1") int page, Model model) {
    Vets vets = new Vets();
    Page<Vet> paginated = findPaginated(page);
    vets.getVetList().addAll(paginated.toList());
    return addPaginationModel(page, paginated, model);
  }

  @WithSpan
  private Page<Vet> findPaginated(int page) {
    int pageSize = 5;
    Pageable pageable = PageRequest.of(page - 1, pageSize);
    return vetRepository.findAll(pageable); // Execution of SQL requests
  }
}

以下采样覆盖配置删除了注释添加的 WithSpan 范围:

"sampling": {
  "overrides": [
    {
      "telemetryType": "dependency",
      "attributes": [
        {
          "key": "code.function",
          "value": "findPaginated",
          "matchType": "strict"
        }
      ],
      "percentage": 0
    }
  ]
}

属性值是Java方法的名称。

此配置删除从 findPaginated 方法创建的所有遥测数据。 不会为来自 findPaginated 该方法的 SQL 执行创建 SQL 依赖项。

以下配置删除从具有VetController批注的WithSpan类方法发出的所有遥测数据:

"sampling": {
  "overrides": [
    {
      "telemetryType": "dependency",
      "attributes": [
        {
          "key": "code.namespace",
          "value": "org.springframework.samples.petclinic.vet.VetController",
          "matchType": "strict"
        }
      ],
      "percentage": 0
    }
  ]
}

采样替代故障排除

请参阅专用疑难解答文章

采样替代常见问题解答

若要查看常见问题解答,请参阅 采样替代FAQ

配置遥测数据的收集

本节内容:

配置 JMX 指标

如何收集额外的 JMX 指标

默认情况下,Application Insights Java 3.x 收集一些Java管理扩展(JMX)指标,但在许多情况下,它是不够的。 本部分详细介绍了 JMX 配置选项。

可以通过向 "jmxMetrics"applicationinsights.json 文件中添加一个 "jmxMetrics" 节来配置 JMX 指标收集。 输入要在 Azure 门户的 Application Insights 资源中显示的指标名称。 要收集的每个指标都需要对象名称和特性。 可以在 * 对象名称中使用 glob 样式通配符。

如何了解可用于配置的指标

各种库、框架和应用程序服务器的属性(如对象名称和属性)不同,通常记录不充分。

若要查看特定环境的可用 JMX 指标,请将自诊断级别设置为 DEBUG 配置文件中 applicationinsights.json ,例如:

{
  "selfDiagnostics": {
    "level": "DEBUG"
  }
}

具有对象名称和属性名称的可用 JMX 指标会显示在 Application Insights 日志文件中。

日志文件输出的外观类似于这些示例。 在某些情况下,它可能非常广泛。

日志文件中可用 JMX 指标的屏幕截图。

还可以使用 命令行工具检查可用的 JMX 指标。

JMX 配置示例

了解哪些指标可用后,可以配置代理以收集这些指标。

在以下Java 8 个配置示例中,第一个配置示例是嵌套指标 -LastGcInfo,其中包含多个属性,我们希望捕获 GcThreadCount

"jmxMetrics": [
  {
    "name": "Demo - GC Thread Count",
    "objectName": "java.lang:type=GarbageCollector,name=PS MarkSweep",
    "attribute": "LastGcInfo.GcThreadCount"
  },
  {
    "name": "Demo - GC Collection Count",
    "objectName": "java.lang:type=GarbageCollector,name=PS MarkSweep",
    "attribute": "CollectionCount"
  },
  {
    "name": "Demo - Thread Count",
    "objectName": "java.lang:type=Threading",
    "attribute": "ThreadCount"
  }
]

如果要收集其他一些Java管理扩展(JMX)指标:

{
  "jmxMetrics": [
    {
      "name": "JVM uptime (millis)",
      "objectName": "java.lang:type=Runtime",
      "attribute": "Uptime"
    },
    {
      "name": "MetaSpace Used",
      "objectName": "java.lang:type=MemoryPool,name=Metaspace",
      "attribute": "Usage.used"
    }
  ]
}

在前面的配置示例中:

  • name 是将分配给此 JMX 指标的指标名称(可以是任何名称)。
  • objectName 是您想要收集的 的对象名称JMX MBean 支持通配符星号 (*)。
  • attribute 内部要收集的属性名称是 JMX MBean

支持数字和布尔值的 JMX 度量值。 布尔 JMX 指标将 false 映射到 0,将 true 映射到 1

在 Application Insights 中查找 JMX 指标的位置

可以通过导航到 Azure 门户中的 Application Insights 资源,查看应用程序运行时收集的 JMX 指标。 在“ 指标 ”窗格中,选择下拉列表,如下所示以查看指标。

Azure 门户中“指标”窗格的屏幕截图。

自动收集日志记录

将自动检测 Log4j、Logback、JBoss Logging 和 java.util.logging。 这些日志框架执行的日志记录会被自动收集。

日志记录仅在以下条件下被捕获:

  • 满足日志框架的配置级别。
  • 同时符合 Application Insights 的配置级别。

例如,如果将记录框架配置为从包 WARN 记录 com.example(并按前面所述配置),并将 Application Insights 配置为捕获 INFO(并按照描述配置),则 Application Insights 仅从包 WARN 捕获 com.example(以及更严重的级别)。

为 Application Insights 配置的默认级别为 INFO。 若要更改此级别,请执行以下代码:

{
  "instrumentation": {
    "logging": {
      "level": "WARN"
    }
  }
}

还可以使用环境变量 APPLICATIONINSIGHTS_INSTRUMENTATION_LOGGING_LEVEL 设置级别。 它优先于 JSON 配置中指定的级别。

可以使用这些有效的 level 值在 applicationinsights.json 文件中指定。 该表显示了它们如何对应于不同日志记录框架中的日志级别。

级别 Log4j Logback JBoss 七月
关闭 关闭 关闭 关闭 关闭
致命 致命 错误 致命 严重
错误(或严重) 错误 错误 错误 严重
警告(WARN 或 WARNING) 警告 警告 警告 警告
信息 信息 信息 信息 信息
配置 调试 调试 调试 配置
DEBUG(或 FINE) 调试 调试 调试
更精细 调试 调试 调试 更精细
TRACE(或 FINEST) 追踪 追踪 追踪 最好
全部 全部 全部 全部 全部

备注

如果将异常对象传递给记录器,日志消息(和异常对象详细信息)将显示在 exceptions 表下的 Azure 门户中,而不是 traces 表。 如果想要查看 tracesexceptions 表中的日志消息,可以编写一个 Logs (Kusto) 查询来在这两个表之间进行联合。 例如:

union traces, (exceptions | extend message = outerMessage)
| project timestamp, message, itemType

日志标记(预览版)

从 3.4.2 开始,可以捕获 Logback 和 Log4j 2 的日志标记:

{
  "preview": {
    "captureLogbackMarker": true,
    "captureLog4jMarker": true
  }
}

Logback 的其他日志属性(预览版)

从版本 3.4.3 开始,可以为 Logback 捕获 FileNameClassNameMethodNameLineNumber

{
  "preview": {
    "captureLogbackCodeAttributes": true
  }
}

警告

捕获代码属性可能会增加性能开销。

作为自定义维度的日志记录级别

从 Java 代理版本 3.3.0 开始,默认情况下不会捕获 LoggingLevel作为跟踪自定义维度的一部分,因为该数据已在 SeverityLevel 字段中捕获。

如果需要,可以暂时重新启用以前的行为:

{
  "preview": {
    "captureLoggingLevelAsCustomDimension": true
  }
}

自动收集的 Micrometer 指标(包括 Spring Boot Actuator 指标)

如果应用程序使用 Micrometer,则系统会自动收集发送到 Micrometer 全局注册表的指标。

如果应用程序使用 Spring Boot 执行器,则 Spring Boot 执行器配置的指标也会自动收集。

使用 Micrometer 发送自定义指标

  1. 将 Micrometer 添加到应用程序,如以下示例所示。

    <dependency>
      <groupId>io.micrometer</groupId>
      <artifactId>micrometer-core</artifactId>
      <version>1.6.1</version>
    </dependency>
    
  2. 使用 Micrometer 全局注册表来创建计量,如以下示例所示。

    static final Counter counter = Metrics.counter("test.counter");
    
  3. 使用计数器通过以下命令记录指标。

    counter.increment();
    
  4. 指标被导入到 customMetrics 表中,标记被捕获在 customDimensions 列中。 您还可以在 下的 Log-based metrics 中查看指标。

    备注

    Application Insights Java将 Micrometer 指标名称中的所有非字母数字字符(短划线除外)替换为下划线。 因此,前面的 test.counter 指标将显示为 test_counter

禁用指标自动收集

若要禁用自动收集 Micrometer 指标和 Spring Boot Actuator 指标,请运行以下命令:

{
  "instrumentation": {
    "micrometer": {
      "enabled": false
    }
  }
}

备注

自定义指标单独计费,可能会产生额外的费用。 请务必查看定价信息。 若要禁用 Micrometer 和 Spring Boot Actuator 指标,请将以下配置添加到配置文件中。

Autocollect InProc 依赖项(预览版)

备注

此功能从 Java 代理版本 3.2.0 开始可用。

如果要捕获控制器“InProc”依赖项,请使用以下配置:

{
  "preview": {
    "captureControllerSpans": true
  }
}

浏览器 SDK 加载程序(预览版)

此功能会将浏览器 SDK 加载程序自动注入应用程序的 HTML 页面,包括配置相应的连接字符串。

例如,当Java应用程序返回响应时,如下所示:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Title</title>
  </head>
  <body>
  </body>
</html>

响应已修改如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <script type="text/javascript">
    !function(v,y,T){var S=v.location,k="script"
    <!-- Removed for brevity -->
    connectionString: "YOUR_CONNECTION_STRING"
    <!-- Removed for brevity --> }});
    </script>
    <title>Title</title>
  </head>
  <body>
  </body>
</html>

该脚本可帮助收集客户端 Web 遥测,并将其与服务器端遥测一起发送到用户的Azure门户。 有关详细信息,请参阅 ApplicationInsights-JS

如果要启用此功能,请添加以下配置选项:

{
  "preview": {
    "browserSdkLoader": {
      "enabled": true
    }
  }
}

配置遥测处理器(预览版)

可以使用遥测处理器配置应用于请求、依赖项和跟踪遥测的规则。 Application Insights Java 3.x 可以在导出数据之前处理遥测数据。

用例:

  • 屏蔽敏感数据。
  • 有条件地添加自定义维度。
  • 更新范围名称,该名称用于在Azure门户中聚合类似的遥测数据。
  • 删除特定的跨度属性以控制数据处理成本。
  • 筛选出一些指标来控制引入成本。

如果您希望丢弃特定的完整范围以控制摄取成本,请参阅配置采样替代

备注

遥测处理器功能被指定为预览版,因为由于属性 语义约定的实验状态,无法保证从发布到发布的向后兼容性。 但是,该功能已经过测试,并在生产环境中受支持。

遥测处理器术语

在了解遥测处理器之前,应了解术语 范围日志

跨度是一种用于表示以下内容的遥测类型:

  • 传入的请求。
  • 传出的依赖项(例如,对另一个服务的远程调用)。
  • 进程内依赖项(例如,由服务的子组件所做的工作)。

日志是表示的遥测类型:

  • 从 Log4j、Logback 和 java.util.logging 捕获的日志数据

对于遥测处理器,以下跨度/日志组件非常重要:

组件 说明
名称 Azure门户中的请求和依赖项的主要显示。
特性 Span 属性表示给定请求或依赖项的标准属性和自定义属性。

日志属性表示给定日志的标准属性和自定义属性。
Body 跟踪消息或正文是 Azure 门户中日志的主要显示内容。

遥测处理器的类型

目前,四种类型的遥测处理器包括:

处理器 说明
属性处理器 属性处理器可以插入、更新、删除或哈希遥测项(spanlog) 的哈希属性。 它还可以使用正则表达式从现有属性中提取一个或多个新属性。
跨度处理器 跨度处理器可以更新请求和依赖项的遥测名称。 它还可以使用正则表达式从范围名称中提取一个或多个新属性。
日志处理器 日志处理器可以更新日志的遥测名称。 它还可以使用正则表达式从日志名称中提取一个或多个新属性。
指标筛选器 指标筛选器可以筛选出指标,以帮助控制引入成本。

备注

目前,遥测处理器仅处理字符串类型的属性。 它们不处理布尔类型或数字类型的属性。

遥测处理器入门

首先,创建一个名为“applicationinsights.json”的配置文件。 将其保存在与“applicationinsights-agent-*.jar”相同的目录中。 请使用以下模版。

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        ...
      },
      {
        "type": "span",
        ...
      },
      {
        "type": "log",
        ...
      },
      {
        "type": "metric-filter",
        ...
      }
    ]
  }
}

属性处理器修改某个 span 或 a log. 的属性。 它可以支持将 spanlog 包括或排除在外的功能。 它获取一个操作列表,这些操作按配置文件指定的顺序执行。 处理器支持以下操作:

小窍门

展开以下每个操作以查看更多信息。


insert

如果 insert 尚不存在,该操作将在 key 遥测项中插入一个新属性。

"processors": [
  {
    "type": "attribute",
    "actions": [
      {
        "key": "attribute1",
        "value": "value1",
        "action": "insert"
      }
    ]
  }
]

insert 操作需要以下设置:

  • key
  • valuefromAttribute
  • action: insert
update

update 操作更新已存在的遥测项 key 中的属性。

"processors": [
  {
    "type": "attribute",
    "actions": [
      {
        "key": "attribute1",
        "value": "newValue",
        "action": "update"
      }
    ]
  }
]

update 操作需要以下设置:

  • key
  • valuefromAttribute
  • action: update
delete

delete 操作从遥测项中删除属性。

"processors": [
  {
    "type": "attribute",
    "actions": [
      {
        "key": "attribute1",
        "action": "delete"
      }
    ]
  }
]

delete 操作需要以下设置:

  • key
  • action: delete
hash

hash 操作对现有属性值进行 SHA1 哈希。

"processors": [
  {
    "type": "attribute",
    "actions": [
      {
        "key": "attribute1",
        "action": "hash"
      }
    ]
  }
]

hash 操作需要以下设置:

  • key
  • action: hash
extract

备注

extract 功能从 Java 代理版本 3.0.2 开始可用。

extract 操作使用正则表达式规则从输入键提取值,以提取规则指定的目标键。 如果目标键已存在,该 extract 操作将替代目标键。 此操作的功能类似于 span processortoAttributes 设置,且使用现有属性作为来源。

"processors": [
  {
    "type": "attribute",
    "actions": [
      {
        "key": "attribute1",
        "pattern": "<regular pattern with named matchers>",
        "action": "extract"
      }
    ]
  }
]

extract 操作需要以下设置:

  • key
  • pattern
  • action: extract
mask

备注

从 Java 代理版本 3.2.5 开始,mask 功能可用。

mask操作通过使用patternreplace中指定的正则表达式规则来屏蔽属性值。

"processors": [
  {
    "type": "attribute",
    "actions": [
      {
        "key": "attributeName",
        "pattern": "<regular expression pattern>",
        "replace": "<replacement value>",
        "action": "mask"
      }
    ]
  }
]

mask 操作需要以下设置:

  • key
  • pattern
  • replace
  • action: mask

pattern 可以包含一个命名组,这个组被放置在 ?<>: 之间。 示例: (?<userGroupName>[a-zA-Z.:\/]+)\d+? 该组是 (?<userGroupName>[a-zA-Z.:\/]+),而 userGroupName 是该组的名称。 pattern 然后,可以包含放置在 ${} 之间并后跟掩码的同一命名组。 掩码为 **: ${userGroupName}**的示例。

包括条件和排除条件

属性处理器支持可选 includeexclude 条件。 属性处理器仅适用于符合其 include 条件(如果可用) 不符合其 exclude 条件的遥测(如果可用)。

若要配置此选项,请在includeexclude(或同时在两者)中指定至少一个matchType,以及spanNamesattributes之一。 includeexclude配置允许多个指定条件。 所有指定条件的计算结果必须为 true,才能生成匹配项。

领域 说明 要求
matchType 控制如何解读spanNames数组和attributes数组中的各项。 可能的值为 regexpstrict

正则表达式匹配是针对整个属性值执行的,因此如果要匹配其中任何位置包含 abc 的值,则需要使用 .*abc.*
必需
spanNames 必须至少与其中一项匹配。 可选
* attributes 指定要匹配的属性列表。 所有这些属性必须完全匹配才能生成匹配项。 可选

备注

  • 如果同时指定了 includeexclude,则会先检查 include 属性,然后再检查 exclude 属性。

  • 如果includeexclude配置中未指定spanNames,则匹配条件将同时应用在spanslogs上。

遥测处理器示例

"processors": [
  {
    "type": "attribute",
    "include": {
      "matchType": "strict",
      "spanNames": [
        "spanA",
        "spanB"
      ]
    },
    "exclude": {
      "matchType": "strict",
      "attributes": [
        {
          "key": "redact_trace",
          "value": "false"
        }
      ]
    },
    "actions": [
      {
        "key": "credit_card",
        "action": "delete"
      },
      {
        "key": "duplicate_key",
        "action": "delete"
      }
    ]
  }
]

展开以下部分以查看各种属性处理器示例。


插入

以下示例将新属性 {"attribute1": "attributeValue1"} 插入到不存在密钥 attribute1 的跨度和日志中。

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
    "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "attribute1",
            "value": "attributeValue1",
            "action": "insert"
          }
        ]
      }
    ]
  }
}

从另一个键插入

下面的示例使用特性 anotherkey 中的值将新属性 {"newKey": "<value from attribute anotherkey>"} 插入到不存在键 newKey 的跨度和日志中。 如果该属性 anotherkey 不存在,则不会将新属性插入范围和日志中。

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "newKey",
            "fromAttribute": "anotherKey",
            "action": "insert"
          }
        ]
      }
    ]
  }
}

更新

以下示例将属性更新为 {"db.secret": "redacted"}. 它通过使用属性boo中的值来更新属性foo。 没有属性 boo 的跨度和日志不会更改。

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "db.secret",
            "value": "redacted",
            "action": "update"
          },
          {
            "key": "boo",
            "fromAttribute": "foo",
            "action": "update" 
          }
        ]
      }
    ]
  }
}

删除

下面的示例演示如何删除具有键 credit_card的属性。

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "credit_card",
            "action": "delete"
          }
        ]
      }
    ]
  }
}

散列

下面的示例演示如何对现有属性值进行哈希处理。

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "user.email",
            "action": "hash"
          }
        ]
      }
    ]
  }
}

提取

下面的示例演示如何使用正则表达式(正则表达式)基于另一个属性的值创建新属性。

例如,给定 url.path = /path?queryParam1=value1,queryParam2=value2的情况下,插入以下属性:

  • httpProtocol: http
  • httpDomain: example.com
  • httpPath: path
  • httpQueryParams: queryParam1=value1,queryParam2=value2
  • url.path: 更改
{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "url.path",
            "pattern": "^(?<httpProtocol>.*):\\/\\/(?<httpDomain>.*)\\/(?<httpPath>.*)(\\?|\\&)(?<httpQueryParams>.*)",
            "action": "extract"
          }
        ]
      }
    ]
  }
}

面具

例如,使用以下任一配置,将 url.path = https://example.com/user/12345622 更新至 url.path = https://example.com/user/****

第一个配置示例:

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "url.path",
            "pattern": "user\\/\\d+",
            "replace": "user\\/****",
            "action": "mask"
          }
        ]
      }
    ]
  }
}

具有正则表达式组名称的第二个配置示例:

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "url.path",
            "pattern": "^(?<userGroupName>[a-zA-Z.:\/]+)\d+",
            "replace": "${userGroupName}**",
            "action": "mask"
          }
        ]
      }
    ]
  }
}

非字符串类型化属性示例

从 3.4.19 GA 开始,遥测处理器支持非字符串类型化属性: boolean、、 doublelongboolean-arraydouble-arraylong-arraystring-array

如果在 json 中未提供 attributes.type,默认值是 string

以下示例将新属性 {"newAttributeKeyStrict": "newAttributeValueStrict"} 插入范围和日志中,其中属性与以下示例匹配:

  • {"longAttributeKey": 1234}
  • {"booleanAttributeKey": true}
  • {"doubleArrayAttributeKey": [1.0, 2.0, 3.0, 4.0]}
{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "include": {
          "matchType": "strict",
          "attributes": [
            {
              "key": "longAttributeKey",
              "value": 1234,
              "type": "long"
            },
            {
              "key": "booleanAttributeKey",
              "value": true,
              "type": "boolean"
            },
            {
              "key": "doubleArrayAttributeKey",
              "value": [1.0, 2.0, 3.0, 4.0],
              "type": "double-array"
            }
          ]
        },
        "actions": [
          {
            "key": "newAttributeKeyStrict",
            "value": "newAttributeValueStrict",
            "action": "insert"
          }
        ],
        "id": "attributes/insertNewAttributeKeyStrict"
      }
    ]
  }
}

此外,非字符串类型化属性支持 regexp

以下示例将新属性 {"newAttributeKeyRegexp": "newAttributeValueRegexp"} 插入跨度和日志中,其中属性 longRegexpAttributeKey 的值与从 400499 的值匹配。

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "include": {
          "matchType": "regexp",
          "attributes": [
            {
              "key": "longRegexpAttributeKey",
              "value": "4[0-9][0-9]",
              "type": "long"
            }
          ]
        },
        "actions": [
          {
            "key": "newAttributeKeyRegexp",
            "value": "newAttributeValueRegexp",
            "action": "insert"
          }
        ],
        "id": "attributes/insertNewAttributeKeyRegexp"
      }
    ]
  }
}

包括和排除范围示例

展开以下部分以查看各种包含和排除范围示例。


包括跨度

本部分介绍如何包括属性处理器的跨度。 处理器不处理与属性不匹配的跨度。

匹配要求范围名称等于 spanAspanB

这些范围与include特性匹配,并应用处理器动作:

  • Span1 名称: “spanA” 属性: {env: dev, test_request: 123, credit_card: 1234}
  • Span2 名称:“spanB”属性: {env: dev, test_request: false}
  • Span3 名称: “spanA” 属性: {env: 1, test_request: dev, credit_card: 1234}

此范围与 include 属性不匹配,处理器操作未被应用。

  • Span4 名称: 'spanC' 属性: {env: dev, test_request: false}
{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "include": {
          "matchType": "strict",
          "spanNames": [
            "spanA",
            "spanB"
          ]
        },
        "actions": [
          {
            "key": "credit_card",
            "action": "delete"
          }
        ]
      }
    ]
  }
}

排除跨度

本部分演示如何排除属性处理器的跨度。 此处理器不处理与属性匹配的跨度。

匹配要求范围名称等于 spanAspanB

以下部分与exclude属性匹配,且未应用处理器操作:

  • Span1 名称: “spanA” 属性: {env: dev, test_request: 123, credit_card: 1234}
  • Span2 名称:“spanB”属性: {env: dev, test_request: false}
  • Span3 名称: “spanA” 属性: {env: 1, test_request: dev, credit_card: 1234}

此范围与 exclude 属性不匹配,因此应用了处理器操作。

  • Span4 名称: 'spanC' 属性: {env: dev, test_request: false}
{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "exclude": {
          "matchType": "strict",
          "spanNames": [
            "spanA",
            "spanB"
          ]
        },
        "actions": [
          {
            "key": "credit_card",
            "action": "delete"
          }
        ]
      }
    ]
  }
}

使用多个条件排除范围

本部分演示如何排除属性处理器的跨度。 此处理器不处理与属性匹配的跨度。

匹配需要满足以下条件:

  • 特性(例如, envdev)必须存在于范围中。
  • 范围必须具有键为 test_request 的属性。

以下部分与exclude属性匹配,且未应用处理器操作:

  • Span1 名称: “spanB” 属性: {env: dev, test_request: 123, credit_card: 1234}
  • Span2 名称:“spanA”属性: {env: dev, test_request: false}

以下范围与 exclude 属性不匹配,处理器正在应用操作:

  • Span3 名称:“spanB”属性: {env: 1, test_request: dev, credit_card: 1234}
  • Span4 名称: 'spanC' 属性: {env: dev, dev_request: false}
{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "exclude": {
          "matchType": "strict",
          "spanNames": [
            "spanA",
            "spanB"
          ],
          "attributes": [
            {
              "key": "env",
              "value": "dev"
            },
            {
              "key": "test_request"
            }
          ]
        },
        "actions": [
          {
            "key": "credit_card",
            "action": "delete"
          }
        ]
      }
    ]
  }
}

选择性处理

本节演示如何指定一组跨度属性,以指定应应用此处理器的跨度。 这些 include 属性指示应处理哪些范围。 属性 exclude 筛选出不应处理的跨度。

在以下配置中,这些范围与属性匹配,并应用处理器操作:

  • Span1 名称: 'spanB' 属性: {env: production, test_request: 123, credit_card: 1234, redact_trace: “false”}
  • Span2 名称: 'spanA' 属性: {env: staging, test_request: false, redact_trace: true}

这些范围与include属性不匹配,并且未应用处理器操作。

  • Span3 名称:“spanB”属性: {env: production, test_request: true, credit_card: 1234, redact_trace: false}
  • Span4 名称: 'spanC' 属性: {env: dev, test_request: false}
{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "include": {
          "matchType": "strict",
          "spanNames": [
            "spanA",
            "spanB"
          ]
        },
        "exclude": {
          "matchType": "strict",
          "attributes": [
            {
              "key": "redact_trace",
              "value": "false"
            }
          ]
        },
        "actions": [
          {
            "key": "credit_card",
            "action": "delete"
          },
          {
            "key": "duplicate_key",
            "action": "delete"
          }
        ]
      }
    ]
  }
}

遥测处理器常见问题解答

若要查看常见问题解答(常见问题解答),请参阅 遥测处理器常见问题解答

替代或禁止默认行为

本节内容:

连接字符串替代(预览版)

此功能为预览版,从 3.4.0 开始提供。

连接字符串重写允许您重写默认的连接字符串。 例如,你能够:

  • 为一个 HTTP 路径前缀/myapp1设置一个连接字符串。
  • 为另外一个 HTTP 路径前缀 /myapp2/ 设置另一个连接字符串。
{
  "preview": {
    "connectionStringOverrides": [
      {
        "httpPathPrefix": "/myapp1",
        "connectionString": "..."
      },
      {
        "httpPathPrefix": "/myapp2",
        "connectionString": "..."
      }
    ]
  }
}

云角色名称替代(预览版)

此功能为预览版,从 3.3.0 开始提供。

云角色名称覆盖允许您覆盖默认云角色名称。 例如,你能够:

  • 为一个 HTTP 路径前缀 /myapp1 设置一个云角色名称。
  • 为另一个 HTTP 路径前缀 /myapp2/ 设置另一个云角色名称。
{
  "preview": {
    "roleNameOverrides": [
      {
        "httpPathPrefix": "/myapp1",
        "roleName": "Role A"
      },
      {
        "httpPathPrefix": "/myapp2",
        "roleName": "Role B"
      }
    ]
  }
}

在运行时配置连接字符串

备注

此功能从 Java 代理版本 3.4.8 开始提供。

如果需要在运行时配置连接字符串,请将此属性添加到 JSON 配置中:

{
  "connectionStringConfiguredAtRuntime": true
}

向应用程序添加 applicationinsights-core

<dependency>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>applicationinsights-core</artifactId>
  <version>3.7.5</version>
</dependency>

configure(String) 类中使用静态 com.microsoft.applicationinsights.connectionstring.ConnectionString 方法。

备注

配置“连接字符串”之前捕获的任何遥测数据都将被丢弃,因此最好在应用程序启动时尽早配置。

本地禁用摄取采样(预览版)

默认情况下,如果 Java 代理中的有效采样百分比为 100%,并且已在 Application Insights 资源上配置了 数据引入采样,则将会应用数据引入采样百分比。

请注意,此行为适用于 100% 的固定速率采样,在请求速率不超过速率限制情况下,还适用于速率限制采样(在持续滑动的时间窗口内,有效捕获率为 100%)。

从 3.5.3 开始,您可以禁用此行为:这样,在这些情况下,即使在您的 Application Insights 资源上配置了数据采集抽样,依然可以保持 100% 的遥测。

{
  "preview": {
    "sampling": {
      "ingestionSamplingEnabled": false
    }
  }
}

保护遥测数据

查询掩码

默认情况下,Java数据库连接(JDBC)和 Mongo 查询中的文本值将被屏蔽,以避免意外捕获敏感数据。

从 3.4.0 开始,可以禁用此行为。 例如:

{
  "instrumentation": {
    "jdbc": {
      "masking": {
        "enabled": false
      }
    }
  }
}

HTTP 标头

备注

此功能从 Java 代理版本 3.3.0 开始提供。

可以在服务器(请求)和客户端(依赖项)遥测上捕获请求和响应标头:

{
  "preview": {
    "captureHttpServerHeaders": {
      "requestHeaders": [
        "My-Header-A"
      ],
      "responseHeaders": [
        "My-Header-B"
      ]
    }
  }
}

标头名称不区分大小写。 以上示例是在属性名称 http.request.header.my_header_ahttp.response.header.my_header_b 下捕获的。

配置运行时和环境配置

本节内容:

身份验证

备注

身份验证功能从 Java 代理版本 3.4.17 开始正式发布。

可以使用身份验证将代理配置为生成Microsoft Entra身份验证所需的 token 凭据

HTTP 代理

如果应用程序位于防火墙后面且无法直接连接到 Application Insights,请参阅 Azure Monitor 终结点访问和防火墙配置

若要解决此问题,可以将 Application Insights Java 3.x 配置为使用 HTTP 代理。

{
  "proxy": {
    "host": "myproxy",
    "port": 8080
  }
}

还可以使用环境变量 APPLICATIONINSIGHTS_PROXY 来设置 http 代理,该变量采用 https://<host>:<port> 格式。 它优先于 JSON 配置中指定的代理。

可以使用 APPLICATIONINSIGHTS_PROXY 环境变量 https://<user>:<password>@<host>:<port> 为代理提供用户和密码。

Application Insights Java 3.x 还会遵循全局 https.proxyHosthttps.proxyPort 系统属性(如果已设置),以及根据需要遵循 http.nonProxyHosts

度量间隔

备注

此功能从 Java 代理版本 3.0.3 开始提供。

默认情况下,每 60 秒捕获一次指标。 可以更改此间隔:

{
  "metricIntervalSeconds": 300
}

从 Java 代理版本 3.4.9(GA)开始,还可以使用环境变量 metricIntervalSeconds设置 APPLICATIONINSIGHTS_METRIC_INTERVAL_SECONDS。 它优先于 JSON 配置中指定的 metricIntervalSeconds

该设置适用于以下指标:

心跳信号

默认情况下,Application Insights Java 3.x 每隔 15 分钟发送一次心跳指标。 如果您使用心跳指标来触发警报,可以增加心跳的频率:

{
  "heartbeat": {
    "intervalSeconds": 60
  }
}

备注

不能将间隔设置得超过 15 分钟,因为心跳数据也用于跟踪 Application Insights 的使用情况。

从引入失败中恢复

备注

此功能从 Java 代理版本 3.3.0 开始提供。

将遥测发送到 Application Insights 服务失败时,Application Insights Java 3.x 会将遥测存储到磁盘,并继续从磁盘重试。

磁盘暂留的默认限制为 50 Mb。 如果遥测数据量较高,或者需要能够从较长时间的网络或数据接收服务中断中恢复,那么可以提高此限制。

{
  "preview": {
    "diskPersistenceMaxSizeMb": 50
  }
}

自我诊断

“自我诊断”是指 Application Insights Java 3.x 中的内部日志记录。 此功能可用于发现和诊断 Application Insights 本身的问题。

默认情况下,Application Insights Java 3.x 将日志记录在级别INFO,同时输出到文件applicationinsights.log和控制台,这对应于以下配置:

{
  "selfDiagnostics": {
    "destination": "file+console",
    "level": "INFO",
    "file": {
      "path": "applicationinsights.log",
      "maxSizeMb": 5,
      "maxHistory": 1
    }
  }
}

在前面的配置示例中:

  • level 可以为 OFFERRORWARNINFODEBUGTRACE 中的一个。
  • path 可以是绝对或相对路径。 相对路径根据 applicationinsights-agent-3.7.5.jar 所在的目录进行解析。

从 Java 代理版本 3.0.2 开始,还可以使用环境变量 level 设置自我诊断APPLICATIONINSIGHTS_SELF_DIAGNOSTICS_LEVEL。 它优先于 JSON 配置中指定的自我诊断级别。

从 Java 代理版本 3.0.3 开始,还可以使用环境变量 APPLICATIONINSIGHTS_SELF_DIAGNOSTICS_FILE_PATH 设置自我诊断文件位置。 它优先于 JSON 配置中指定的自我诊断文件路径。

遥测关联

默认情况下启用遥测关联,但你可以在配置中禁用它:

{
  "preview": {
    "disablePropagation": true
  }
}

高级和预览功能

自定义检测(预览版)

备注

此功能从 Java 代理版本 3.3.1 开始提供。

可以在应用程序中捕获方法的跨度:

{
  "preview": {
    "customInstrumentation": [
      {
        "className": "my.package.MyClass",
        "methodName": "myMethod"
      }
    ]
  }
}

预览仪器

备注

此功能从 Java 代理版本 3.2.0 开始可用。

可以启用以下预览工具:

{
  "preview": {
    "instrumentation": {
      "akka": {
        "enabled": true
      },
      "apacheCamel": {
        "enabled": true
      },
      "grizzly": {
        "enabled": true
      },
      "ktor": {
        "enabled": true
      },
      "play": {
        "enabled": true
      },
      "r2dbc": {
        "enabled": true
      },
      "springIntegration": {
        "enabled": true
      },
      "vertx": {
        "enabled": true
      }
    }
  }
}

备注

  • Akka 仪器从 Java 代理版本 3.2.2 开始可获得。

  • 从 Java 代理版本 3.3.0 开始,可以使用 Vertx HTTP 库检测。

配置文件示例

此示例显示了包含多个组件的配置文件的外观。 请根据需要配置特定选项。

{
  "connectionString": "...",
  "role": {
    "name": "my cloud role name"
  },
  "sampling": {
    "percentage": 100
  },
  "jmxMetrics": [
  ],
  "customDimensions": {
  },
  "instrumentation": {
    "logging": {
      "level": "INFO"
    },
    "micrometer": {
      "enabled": true
    }
  },
  "proxy": {
  },
  "preview": {
    "processors": [
    ]
  },
  "selfDiagnostics": {
    "destination": "file+console",
    "level": "INFO",
    "file": {
      "path": "applicationinsights.log",
      "maxSizeMb": 5,
      "maxHistory": 1
    }
  }
}