如何跟踪 Java 函数应用程序的依赖项

How to track dependencies of Java Function Apps

我为使用 Java 实现的 Azure Function App 设置了一些依赖项跟踪。因此我添加了 applicationinsights-core 作为依赖项,参见 Add the Application Insights SDK for Java to your project.

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

要创建 dependencies 条目,我使用 TelemetryClient.

的实例
// call an external service, e.g. ADLS file upload..
long start = System.currentTimeMillis();
uploadFile();
long elapsed = System.currentTimeMillis() - start;

// void trackDependency(String dependencyName, String commandName, Duration duration, boolean success)
new TelemetryClient().trackDependency(
  "ADLS", "upload file", new Duration(elapsed), true);

生成的 dependencies 条目看起来很奇怪。它遗漏了 cloud_RoleName,它通常标识条目的创建者。此外,commandName 作为 data 属性 传递,似乎无法设置条目的 type 属性。

虽然我没有找到用于依赖项跟踪的专用 Java Function App 文档,但一般 Java 文档建议另外使用 applicationinsights-agent(请参阅 Java codeless application monitoring Azure Monitor Application Insights). The agent handles the telemetry of applicationinsights-core (see Supported custom telemetry)。但对我来说,如何为 Azure Function App 设置代理并不明显。

如何设置 cloud_RoleName? 有没有办法设置dependenciestype属性?

我找到了仅使用 applicationinsights-core 的解决方案。

  • cloud_RoleName可以取自环境变量WEBSITE_SITE_NAME
  • type 可以通过 RemoteDependencyTelemetry 的 setter 配置。
// create depedencies entry
createTelemetryClient().trackDependency(
  buildTelemetry("ADSL", "upload file", "custom context", successful, elapsed));
// ..

private TelemetryClient createTelemetryClient() {
  TelemetryConfiguration configuration = TelemetryConfiguration.getActive();
  configuration.setRoleName(System.getenv("WEBSITE_SITE_NAME"));
  return new TelemetryClient(configuration);
}

private RemoteDependencyTelemetry buildTelemetry(String type,
                                                 String name,
                                                 String data,
                                                 boolean successful,
                                                 long elapsed) {
    RemoteDependencyTelemetry telemetry = new RemoteDependencyTelemetry(
        name,
        data,
        new Duration(elapsed),
        successful);
    telemetry.setType(type);
    return telemetry;
}