我正在尝试将 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
我错过了什么?有没有更好的方法来实现我的目标?
要在启动时注入自定义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;
}