【Azure 应用程序见解】Application Insights Java Agent 3.1.0的使用实验,通过修改单个URL的采样率来减少请求及依赖项的数据采集

简介: 【Azure 应用程序见解】Application Insights Java Agent 3.1.0的使用实验,通过修改单个URL的采样率来减少请求及依赖项的数据采集

问题描述

近日好消息,如果是一个Java Spring Cloud的项目,想使用Azure Applicaiton Insights来收集日志及一些应用程序见解。但是有不愿意集成SDK来修改代码或者配置,有没有一种更好的办法呢? 答案是有。

在2020年,微软推出了“Java 无代码应用程序监视 Azure Monitor Application Insights” 代理工具 Application Insights Agent 3.x 无需更改代码,只需更改几个配置即可启用 Java 代理。官方的宣传语为:

Java 代理可在任何环境中正常工作,并允许你监视所有 Java 应用程序。 换句话说,无论你是在 VM 上、本地、AKS 中还是在 Windows、Linux 上运行 Java 应用,不管什么位置,Java 3.0 代理都可以监视你的应用。

不再需要将 Application Insights Java SDK 添加到你的应用程序,因为 3.0 代理会自动收集请求、依赖项并自行记录所有内容。

你仍可以从应用程序发送自定义遥测。 3.0 代理会跟踪它并将它与所有自动收集的遥测数据相关联。

3.0 代理支持 Java 8 及更高版本。

 

使用方法也非常的简单,三个步骤:下载代理到本地项目配置Application Insights连接字符串在java启动命令中添加代理参数( -javaagent:agent/applicationinsights-agent-3.1.0.jar )

 

快速启用Java Agent:

1.下载代理 applicationinsights-agent-3.1.0.jar

2.将 JVM 指向该代理,-javaagent:path/to/applicationinsights-agent-3.1.0.jar 添加到应用程序的 JVM 参数。如

java  -javaagent:agent/applicationinsights-agent-3.1.0.jar -jar target/spring-boot-0.0.1-snapshot.jar

3.将代理指向 Application Insights 资源

通过设置环境变量,将代理指向 Application Insights 资源:APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=...

另一种方法是创建一个名为 applicationinsights.json 的配置文件,并将其置于 applicationinsights-agent-3.1.0.jar 所在的目录中,该文件包含以下内容:

{

 "connectionString": "InstrumentationKey=..."

}

可以在 Application Insights 资源中找到连接字符串:

4.就这么简单!

现在启动应用程序,并访问 Azure 门户中的 Application Insights 资源以查看监视数据。

备注:监视数据可能需要几分钟时间才能在门户中显示。

 

效果展示:

 

以上展示成功的采集到Java应用的所有请求及请求所产生的两个外部依赖,一个访问azure blob文件,一个是请求博客园文章地址。

但是,当站点的请求量巨大时候,Agent也将发送大量的请求,日志,依赖等等监控数据。 那是不是有什么方便的办法来解决数据量问题呢?是的。同样可以通过采样率(sampling)设置来实现这个目的。

Sampling有两种方式:一种是应用的所有请求采样率都下降,不要100%采集。 修改方式为在 applicationinsights.json 文件中设置sampling的值。如下修改采样率为50%.

{
   "connectionString": "InstrumentationKey=xxxxxxxxxxxxxx;EndpointSuffix=applicationinsights.azure.cn;IngestionEndpoint=https://xxxxxxxx.in.applicationinsights.azure.cn/",
   "role": {
      "name": "my test 3"
   },
  "sampling": {
      "percentage": 50
    }
}

第二种方式,就是本文中将介绍的。采用指定特定的URL来修改次采样率。

 

问题解决

使用Agent 3.0.3版本之后才支持的采样代替(sampling overrides)功能。采样替代允许替代默认采样百分比,例如:

  • 将采样百分比设置为 0(或某个小的值)以进行干扰状况检查。
  • 将采样百分比设置为 0(或某个小的值)以进行干扰依赖项调用。
  • 针对重要请求类型(例如,/login),将采样百分比设置为 100,即使将默认采样配置为低于此值也是如此。

采样代替的作用范围为:

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

对于采样替代而言,属性是一个非常重要的概念,它表示给定请求或依赖项的标准属性和自定义属性。对于一个URL请求而言,可以用以下的属性值来作为配置条件:

HTTP 范围

属性 类型 说明
http.method string HTTP 请求方法。
http.url string 完整的 HTTP 请求 URL(采用 scheme://host[:port]/path?query[#fragment] 格式)。 例如:http://localhost:8080/out
http.status_code 数值 HTTP 响应状态代码
http.flavor string HTTP 协议类型。
http.user_agent string 客户端发送的 HTTP User-Agent 标头的值。

 

在本示例中,本Java应用有三个请求。http://localhost:8080, http://localhost:8080/blob 和http://localhost:8080/out。 三个请求的依赖项如下图:

 

为了把blob的请求以及它的依赖的所有请求都排除在请求之外。使用采样代替功能,可以参考如下设置:

{
   "connectionString":"InstrumentationKey=xxxxxxxxxxxxxx;EndpointSuffix=applicationinsights.azure.cn;IngestionEndpoint=https://xxxxxxxx.in.applicationinsights.azure.cn/",
   "role": {
      "name": "my test 3"
   },
   "preview": {
      "sampling": {
         "overrides": [
            {
               "attributes": [
                  {
                     "key": "http.url",
                     "value": "https?://[^/]+/blob",
                     "matchType": "regexp"
                  }
               ],
               "percentage": 0
            }
         ]
      }
   }
}

修改完 applicationinsights.json 文件后,重启应用。验证结果:

 

 

附件一:如果需要对多个请求URL进行采样率修改。在节点overrides中的数组中不停加入attributes内容即可。如:

{
   "connectionString":"InstrumentationKey=xxxxxxxxxxxxxx;EndpointSuffix=applicationinsights.azure.cn;IngestionEndpoint=https://xxxxxxxx.in.applicationinsights.azure.cn/",
   "role": {
      "name": "my test 3"
   },
   "preview": {
      "sampling": {
         "overrides": [
            {
               "attributes": [
                  {
                     "key": "http.url",
                     "value": "https?://[^/]+/blob",
                     "matchType": "regexp"
                  }
               ],
               "percentage": 0
            },
            {
               "attributes": [
                  {
                     "key": "http.url",
                     "value": "https?://[^/]+/lulight/",
                     "matchType": "regexp"
                  }
               ],
               "percentage": 0
            }
         ]
      }
   }
}

 

附件二:对整体采样率设置为非常小,如1,但是对一些重点的URL则设置为100.

{
   "connectionString": "InstrumentationKey=xxxxxxxxxxxxxx;EndpointSuffix=applicationinsights.azure.cn;IngestionEndpoint=https://xxxxxxxx.in.applicationinsights.azure.cn/",
   "role": {
      "name": "Java App Test 16"
   },
   "sampling": {
      "percentage": 1
   },
   "preview": {
      "sampling": {
         "overrides": [
            {
               "attributes": [
                  {
                     "key": "http.url",
                     "value": "http?://[^/]+/v1/member+(/[\\w-./?%&=]*)?$",
                     "matchType": "regexp"
                  }
               ],
               "percentage": 100
            },
            {
               "attributes": [
                  {
                     "key": "http.url",
                     "value": "http?://[^/]+/blob",
                     "matchType": "regexp"
                  }
               ],
               "percentage": 0
            },
            {
               "attributes": [
                  {
                     "key": "http.url",
                     "value": "http?://[^/]+/out",
                     "matchType": "regexp"
                  }
               ],
               "percentage": 100
            },
            {
               "attributes": [
                  {
                     "key": "http.url",
                     "value": "https?://[^/]+/lulight/p/14978216.html",
                     "matchType": "regexp"
                  }
               ],
               "percentage": 0
            }
         ]
      }
   }
}

 

附件三:如何验证正则表达式的正确性及在JAVA中的正确字符串(需要注意转义)

验证站点:https://c.runoob.com/front-end/854

 

然后点击生成代码,发现Java部分中所使用的字符串,COPY出来放入applicationinsights.json文件中。

 

 

附件四:如果在启动AI Java Agent 出现 “java.util.regex.PatternSyntaxException: Unclosed character class near index 28”, 则一定要根据#3中的方式来检查 applicationinsights.json 中正则表达式是否正确

2021-07-27 15:47:46.936+08 ERROR c.m.applicationinsights.agent - ApplicationInsights Java Agent 3.1.0 failed to start
java.util.regex.PatternSyntaxException: Unclosed character class near index 28
http?://[^/]+/v1/member?/[^]+
                            ^
    at java.util.regex.Pattern.error(Pattern.java:1969)
    at java.util.regex.Pattern.clazz(Pattern.java:2562)
    at java.util.regex.Pattern.sequence(Pattern.java:2077)
    at java.util.regex.Pattern.expr(Pattern.java:2010)
    at java.util.regex.Pattern.compile(Pattern.java:1702)
    at java.util.regex.Pattern.<init>(Pattern.java:1352)
    at java.util.regex.Pattern.compile(Pattern.java:1028)
    at com.microsoft.applicationinsights.agent.internal.sampling.SamplingOverrides$RegexpMatcher.<init>(SamplingOverrides.java:179)
    at com.microsoft.applicationinsights.agent.internal.sampling.SamplingOverrides$RegexpMatcher.<init>(SamplingOverrides.java:173)
    at com.microsoft.applicationinsights.agent.internal.sampling.SamplingOverrides$MatcherGroup.toPredicate(SamplingOverrides.java:150)
    at com.microsoft.applicationinsights.agent.internal.sampling.SamplingOverrides$MatcherGroup.<init>(SamplingOverrides.java:123)
    at com.microsoft.applicationinsights.agent.internal.sampling.SamplingOverrides$MatcherGroup.<init>(SamplingOverrides.java:115)
    at com.microsoft.applicationinsights.agent.internal.sampling.SamplingOverrides.<init>(SamplingOverrides.java:28)
    at com.microsoft.applicationinsights.agent.internal.sampling.Samplers.getSampler(Samplers.java:9)
    at com.microsoft.applicationinsights.agent.internal.wasbootstrap.OpenTelemetryConfigurer.configure(OpenTelemetryConfigurer.java:39)
    at io.opentelemetry.sdk.autoconfigure.TracerProviderConfiguration.configureTracerProvider(TracerProviderConfiguration.java:40)
    at io.opentelemetry.sdk.autoconfigure.OpenTelemetrySdkAutoConfiguration.initialize(OpenTelemetrySdkAutoConfiguration.java:45)
    at io.opentelemetry.javaagent.tooling.OpenTelemetryInstaller.installAgentTracer(OpenTelemetryInstaller.java:36)
    at io.opentelemetry.javaagent.tooling.OpenTelemetryInstaller.beforeByteBuddyAgent(OpenTelemetryInstaller.java:27)
    at io.opentelemetry.javaagent.tooling.AgentInstaller.installComponentsBeforeByteBuddy(AgentInstaller.java:180)
    at io.opentelemetry.javaagent.tooling.AgentInstaller.installBytebuddyAgent(AgentInstaller.java:114)
    at io.opentelemetry.javaagent.tooling.AgentInstaller.installBytebuddyAgent(AgentInstaller.java:98)
    at com.microsoft.applicationinsights.agent.internal.wasbootstrap.MainEntryPoint.start(MainEntryPoint.java:89)
    at io.opentelemetry.javaagent.tooling.AgentInstallerOverride.installBytebuddyAgent(AgentInstallerOverride.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at io.opentelemetry.javaagent.bootstrap.AgentInitializer.startAgent(AgentInitializer.java:50)
    at io.opentelemetry.javaagent.bootstrap.AgentInitializer.initialize(AgentInitializer.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at io.opentelemetry.javaagent.OpenTelemetryAgent.premain(OpenTelemetryAgent.java:66)
    at com.microsoft.applicationinsights.agent.Agent.premain(Agent.java:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)

 

参考资料

Java 无代码应用程序监视 Azure Monitor Application Insights:https://docs.azure.cn/zh-cn/azure-monitor/app/java-in-process-agent

采样替代(预览版)- 适用于 Java 的 Azure Monitor Application Insights:https://docs.azure.cn/zh-cn/azure-monitor/app/java-standalone-sampling-overrides

 

【完】

相关文章
|
1月前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
63 9
|
1月前
|
人工智能 Java 物联网
JAVA网络编程的未来:URL与URLConnection的无限可能,你准备好了吗?
随着技术的发展和互联网的普及,JAVA网络编程迎来新的机遇。本文通过案例分析,探讨URL与URLConnection在智能API调用和实时数据流处理中的关键作用,展望其未来趋势和潜力。
46 7
|
16天前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
67 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
1月前
|
Arthas 监控 Java
拥抱 OpenTelemetry:阿里云 Java Agent 演进实践
本文介绍了阿里云 Java Agent 4.x 版本在基于 OTel Java Agent 二次开发过程中的实践与思考,并重点从功能、性能、稳定性、兼容性四个方面介绍了所做的工作。同时也介绍了阿里云可观测团队积极参与开源建设取得的丰厚成果。
192 5
拥抱 OpenTelemetry:阿里云 Java Agent 演进实践
|
6天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
37 6
|
19天前
|
搜索推荐 算法 数据挖掘
淘口令真实URL API接口的应用与收益
淘口令作为电商推广利器,通过简短文本引导用户直达商品页,提升购物体验与销售效率。本文探讨淘口令真实URL API接口的应用,包括商品推广、数据分析、跨境电商及社交媒体营销等方面,揭示其在电商领域的巨大潜力与收益。
30 1
|
1月前
|
Java 开发者
JAVA高手必备:URL与URLConnection,解锁网络资源的终极秘籍!
在Java网络编程中,URL和URLConnection是两大关键技术,能够帮助开发者轻松处理网络资源。本文通过两个案例,深入解析了如何使用URL和URLConnection从网站抓取数据和发送POST请求上传数据,助力你成为真正的JAVA高手。
64 11
|
1月前
|
JSON 安全 算法
JAVA网络编程中的URL与URLConnection:那些你不知道的秘密!
在Java网络编程中,URL与URLConnection是连接网络资源的两大基石。本文通过问题解答形式,揭示了它们的深层秘密,包括特殊字符处理、请求头设置、响应体读取、支持的HTTP方法及性能优化技巧,帮助你掌握高效、安全的网络编程技能。
66 9
|
1月前
|
JSON Java API
JAVA网络编程新纪元:URL与URLConnection的神级运用,你真的会了吗?
本文深入探讨了Java网络编程中URL和URLConnection的高级应用,通过示例代码展示了如何解析URL、发送GET请求并读取响应内容。文章挑战了传统认知,帮助读者更好地理解和运用这两个基础组件,提升网络编程能力。
55 5
|
1月前
|
Java Spring
JAVA获取重定向地址URL的两种方法
【10月更文挑战第17天】本文介绍了两种在Java中获取HTTP响应头中的Location字段的方法:一种是使用HttpURLConnection,另一种是使用Spring的RestTemplate。通过设置连接超时和禁用自动重定向,确保请求按预期执行。此外,还提供了一个自定义的`NoRedirectSimpleClientHttpRequestFactory`类,用于禁用RestTemplate的自动重定向功能。
下一篇
DataWorks