无法让AppInsights在Spring Boot下运行

Tom*_*asz 3 azure spring-boot azure-application-insights

我关注了https://docs.microsoft.com/en-us/azure/application-insights/app-insights-java-get-started,但仍然没有成功.

  • 我通过maven有applicationinsights-web依赖
  • ApplicationInsights.xml使用硬编码的仪器键添加到main/resources,甚至<SDKLogger />内部
  • 我添加了扫描路径: @ComponentScan({...., "com.microsoft.applicationinsights.web.spring"})

结果:

  • 我看到没有关于查找配置文件的日志,即使我输入语法错误或完全删除它
  • 在调试中,我看到它RequestNameHandlerInterceptorAdapter是通过实例化的com.microsoft.applicationinsights.web.spring.internal.InterceptorRegistry,并且在调用期间调用该preHandle方法,但是对ThreadContext.getRequestTelemetryContext()返回的调用始终为null,并且不再发生任何事情

它看起来很明显,但不知道是什么.哪些部分/类负责加载配置文件?

Tom*_*asz 5

我对文档有点困惑.正如yonisha所说,过滤器完成了整个魔术.以下配置类负责在Spring Boot应用程序中创建和添加过滤器.

import com.microsoft.applicationinsights.web.internal.WebRequestTrackingFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;

@Configuration
@ComponentScan("com.microsoft.applicationinsights.web.spring")
public class ApplicationInsightsConfiguration {

@Bean
public FilterRegistrationBean someFilterRegistration() {

    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(appInsightsWebRequestTrackingFilter());
    registration.addUrlPatterns("/*");
    registration.setName("webRequestTrackingFilter");
    registration.setOrder(1);
    return registration;
}


@Bean(name = "appInsightsWebRequestTrackingFilter")
public Filter appInsightsWebRequestTrackingFilter() {
    return new WebRequestTrackingFilter();
}
Run Code Online (Sandbox Code Playgroud)

重要提示:如果将server.context-path属性设置为某个值,它将很好地工作.如果没有,AI初始化将失败并出错

AI: ERROR 03-04-2017 14:11, 20: WebApp name is not found, unable to register WebApp
Run Code Online (Sandbox Code Playgroud)

为了保持servlet-context为空,我不得不为过滤器和其他两个类实现包装器来覆盖它,但它是一个非常脏的修复...如果名称可以作为参数传递给过滤器,但这还不可能(https://github.com/Microsoft/ApplicationInsights-Java/issues/359)