使用 Spring Boot 的 Azure Application Insight |自定义遥测初始化器

问题描述 投票:0回答:1

我正在尝试将 azure 应用程序见解与 Spring Boot 应用程序一起使用。下面是我的代码

我正在使用

<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>applicationinsights-spring-boot-starter</artifactId>
    <version>2.6.4</version>
</dependency>

我需要一个 CustomTelemetryInitializer,我可以在其中使用我的值更改操作 id。

package com.example.demo;

import com.microsoft.applicationinsights.extensibility.TelemetryInitializer;
import com.microsoft.applicationinsights.telemetry.Telemetry;

public class MyCustomTelemetryInitializer implements TelemetryInitializer {

    @Override
    public void initialize(Telemetry telemetry) {
        // Add custom properties to telemetry
        telemetry.getContext().getOperation().setId("my-correlation-id");
    }
}

我正在尝试像这样注册这个 CustomTelemetryInitializer

package com.example.demo;

import com.microsoft.applicationinsights.TelemetryClient;
import com.microsoft.applicationinsights.TelemetryConfiguration;
import com.microsoft.applicationinsights.extensibility.TelemetryInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppInsightsConfig {
    @Bean
    public TelemetryInitializer myCustomTelemetryInitializer() {
        return new MyCustomTelemetryInitializer();
    }

    @Bean
    public TelemetryConfiguration telemetryConfiguration(TelemetryInitializer myCustomTelemetryInitializer, CustomTelemetryProcessor customTelemetryProcessor) {
        TelemetryConfiguration configuration = TelemetryConfiguration.createDefault();
        
        configuration.getTelemetryInitializers().add(myCustomTelemetryInitializer);
        
        return configuration;
    }

    @Bean
    public TelemetryClient telemetryClient(TelemetryConfiguration telemetryConfiguration) {
        return new TelemetryClient(telemetryConfiguration);
    }
}


这是我的休息终点

package com.example.demo;

import com.microsoft.applicationinsights.TelemetryClient;
import com.microsoft.applicationinsights.telemetry.RequestTelemetry;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class MyController {

    private final TelemetryClient telemetryClient;

    @GetMapping("/hello")
    public String sayHello() {
        RequestTelemetry requestTelemetry = new RequestTelemetry();
        telemetryClient.trackRequest(requestTelemetry); // this calls MyCustomTelemetryInitializer.initialize()
        return "Hello, World!";
    }
}

问题是,当我到达这个端点时,

MyCustomTelemetryInitializer.initialize()
不会自动调用,这是我所期望的。 手动执行
telemetryClient.trackRequest(requestTelemetry)
时会被调用。

我希望为所有遥测应用程序发送调用

MyCustomTelemetryInitializer.initialize()
,以便我可以为它们设置我的操作 ID。

对于 ASP.NET,我看到文档中建议采用这种方法。没有提到Java。 https://learn.microsoft.com/en-us/azure/azure-monitor/app/api-filtering-sampling?tabs=dotnet%2Cjavascriptwebsdkloaderscript#addmodify-properties-itelemetryinitializer

我错过了什么?有没有更好的方法来实现我的目标?

spring-boot azure-application-insights telemetry
1个回答
0
投票

要在启动时注入自定义bean,您应该使用

@Bean
public TelemetryInitializer myCustomTelemetryInitializer() {
    return new MyCustomTelemetryInitializer();
}

其中仅执行 MyCustomTelemetryInitializer 的构造函数。要调用特定方法,您可以“手动”执行

@Bean
public TelemetryInitializer myCustomTelemetryInitializer() {
    MyCustomTelemetryInitializer foo = new MyCustomTelemetryInitializer();
    foo.initialize(...);
    return foo;
}

要自动执行此操作,请使用此注释

公共类 MyCustomTelemetryInitializer 实现 TelemetryInitializer {

@PostConstruct
public void initialize(Telemetry telemetry) {
    // Add custom properties to telemetry
    telemetry.getContext().getOperation().setId("my-correlation-id");
}

}

那么,你可以用更简单的方式注入bean

@Bean
public TelemetryInitializer myCustomTelemetryInitializer() {
    return new MyCustomTelemetryInitializer();
}

自定义参数

如果要调用的方法启动需要另一个实例,只需配置它们

@Bean
public TelemetryInitializer myCustomTelemetryInitializer() {

    Telemetry telemetry = new ...
    MyCustomTelemetryInitializer foo = new MyCustomTelemetryInitializer();
    foo.initialize(telemetry);
    return foo;
}
© www.soinside.com 2019 - 2024. All rights reserved.