首页 > 其他分享 >业务日志关联调用链的TraceId信息Arms

业务日志关联调用链的TraceId信息Arms

时间:2023-03-07 19:36:31浏览次数:52  
标签:异步 TraceId 示例 ARMS Arms org 日志 透传

 

您可以在应用的业务日志中关联调用链的TraceId信息,从而在应用出现问题时,能够通过调用链的TraceId快速关联到业务日志,及时定位分析、解决问题。

 

背景信息

ARMS在业务日志中关联调用链TraceId的功能基于MDC(Mapped Diagnostic Context)机制实现,支持主流的Log4j、Log4j2和Logback日志框架。

开启关联业务日志与TraceId开关

  1. 登录ARMS控制台,在左侧导航栏选择应用监控 > 应用列表。
  2. 在应用列表页面顶部选择目标地域,然后单击目标应用名称。
  3. 在左侧导航栏中单击应用设置,并在右侧单击自定义配置页签。
  4. 在自定义配置页签的应用日志关联配置区域,选择日志源为日志服务,打开关联业务日志与TraceId开关,选择日志服务所在地域,然后绑定Project和Logstore。

 

 

 说明

  • 开启此开关后,业务日志中将会自动生成调用链的TraceId。

在您业务日志的Layout的Pattern属性中添加%X{EagleEye-TraceID}配置。

  说明 如何在业务代码中获取{EagleEye-TraceID},请参见ARMS SDK使用说明

下面分别展示Log4j、Log4j2和Logback组件的示例配置文件:

Log4j配置文件log4j.properties的修改示例:
log4j.appender.warn.layout=org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}-[%p]-(%C:%L) - traceId:%X{EagleEye-TraceID} - %m%n

Log4j2配置文件log4j2.xml的修改示例:

<console name="Console" target="SYSTEM_OUT">
    <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
    <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - traceId:%X{EagleEye-TraceID} - %m%n"/>
</console>

Logback配置文件logback.xml的修改示例:

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - traceId:%X{EagleEye-TraceID} - %msg%n</pattern>
</encoder>

重启应用。

在应用的业务日志中成功打印出TraceId信息,则说明业务日志关联调用链的TraceId关联成功,如下图所示。

 

 用户自己的异步线程,这个是没有埋点的,需要按照这个文档配置一下包名

对于通过Spring @Async标签实现的异步任务,ARMS默认支持对其进行监控。此外,ARMS还支持通过添加异步透传扫描包和使用ARMS SDK进行手动透传对自定义异步任务实现监控。若您的异步任务出现接口超时等异常,可以通过调用链路查看异步任务上下游以便及时处理潜在问题。

前提条件

该功能要求ARMS探针版本为公测版本v2.7.1.3及以上。请联系ARMS钉钉服务账号arms160804,为您进行探针新版本升级。

方式一:默认支持Spring @Async标签

ARMS默认支持监控使用Spring @Async标签实现的异步任务。对于下列Spring框架中默认的Executor和Task,ARMS会自动完成增强:
  • Executor:
    • org.springframework.scheduling.concurrent.ConcurrentTaskExecutor
    • org.springframework.core.task.SimpleAsyncTaskExecutor
    • org.springframework.scheduling.quartz.SimpleThreadPoolTaskExecutor
    • org.springframework.core.task.support.TaskExecutorAdapter
    • org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
    • org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler
    • org.springframework.jca.work.WorkManagerTaskExecutor
    • org.springframework.scheduling.commonj.WorkManagerTaskExecutor
  • Task:
    • org.springframework.aop.interceptor.AsyncExecutionInterceptor$1
    • org.springframework.aop.interceptor.AsyncExecutionInterceptor$$Lambda$

方式二:添加异步透传扫描包

您可以选择在应用设置中添加异步透传扫描包实现异步任务监控。异步透传扫描包中的Runnable、Callable和Supplier接口在创建新对象时会自动捕获当前线程调用链的上下文,并在异步线程中执行时使用该调用链上下文,完成串联。

  1. 登录ARMS控制台
  2. 在左侧导航栏,选择应用监控 > 应用列表。
  3. 在顶部菜单栏,选择地域。
  4. 在应用列表页面,单击应用名称。
  5. 在左侧导航栏,单击应用设置,然后单击自定义配置页签。
  6. 在高级设置区域的异步透传扫描包名对话框中,添加异步透传扫描包。

 

 

 

 

7、在页面底部,单击保存。

注意 配置后需重启应用才能使功能生效。如需添加多个异步透传扫描包,可以使用半角逗号(,)分隔。 例如,对于通过以下示例代码创建的异步任务,您可以使用添加异步透传扫描包的方式对此异步任务进行监控。此示例代码中,异步透传包名为com.alibaba.arms.brightroar.console.service。   注意 在配置时,您可以按需调整异步透传包名的范围。若需监控的异步任务过多,您可以缩小异步透传包名的范围。在本示例中,除了输入完整的异步透传包名com.alibaba.arms.brightroar.console.service以外,您还可以输入更短的前缀包名com.alibaba.arms来自动扫描此目录下的所有子透传包。但需注意的是,若前缀包名范围过大,会对性能产生影响,请谨慎操作。
package com.alibaba.arms.brightroar.console.service; //arms

@Service
public class NameService {

    private ExecutorService es = Executors.newFixedThreadPool(5);

    public void name() {
        es.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println(System.currentTimeMillis()+ ": my name is john, " + Thread.currentThread().getId());
            }
        });
    }
}

方式三:使用ARMS SDK手动透传

当您的使用方式比较复杂,上述场景无法满足需求时,您还可以选择使用ARMS SDK进行手动透传。通过手动增强Runnable接口、Callable接口和Executor,在异步线程中完成调用链串联,实现异步任务监控。

  1. 在Maven项目的pom.xml中添加以下依赖。
    <dependency>
     <groupId>com.alibaba.arms.apm</groupId>
     <version>1.7.5</version>
     <artifactId>arms-sdk</artifactId>
    </dependency>
增强Runnable接口、Callable接口和Executor。您可以按需选择以下任意一种增强方式。
  • 方式一:增强Runnable接口和Callable接口

    使用TraceRunnable.asyncEntry()增强Runnable接口,使用TraceCallable.asyncEntry()增强Callable接口。示例代码如下:
    public class AsyncEntryExample {
    
        private final ExecutorService executor = Executors.newSingleThreadExecutor();
    
        @GetMapping(value = "/sdk-async-plugin/asyncEntry-propagation")
        public String asyncEntryAndExecute() throws Exception {
            CompletableFuture<String> future = new CompletableFuture<>();
            Runnable command = TraceRunnable.asyncEntry(() -> future.complete("asyncEntry-execute"));
            executor.execute(command);
            Thread.sleep(1000);
            return future.get();
        }
    }

    方式二:增强Executor

    使用TraceExecutors.wrapExecutorService(executr, true)增强Executor。示例代码如下:
    public class AutoExample {
    
        private final ExecutorService contextPropagationExecutor
                = TraceExecutors.wrapExecutorService(Executors.newSingleThreadExecutor(), true);
    
        @GetMapping(value = "/sdk-async-plugin/auto-context-propagation")
        public String autoWrapAndExecute() throws Exception {
            CompletableFuture<String> future = new CompletableFuture<>();
            contextPropagationExecutor.execute(() -> future.complete("auto-execute"));
            Thread.sleep(1000);
            return future.get();
        }
    }

    方式三:同时增强Runnable接口、Callable接口和Executor

    示例代码如下:
    public class ManualExample {
        private final ExecutorService traceExecutor
                = TraceExecutors.wrapExecutorService(Executors.newSingleThreadExecutor());
    
        @GetMapping(value = "/sdk-async-plugin/manual-context-propagation")
        public String manualWrapAndExecute() throws Exception {
            CompletableFuture<String> future = new CompletableFuture<>();
            traceExecutor.execute(TraceRunnable.wrap(() -> future.complete("manual-execute")));
            traceExecutor.execute(() -> "Not captured");
            Thread.sleep(1000);
            return future.get();
        }
    }

    执行结果

    配置完成后,您可以在调用链路详情页查看异步任务的调用链详情。具体详情,请参见调用链路查询

 

 

https://help.aliyun.com/document_detail/158582.html

标签:异步,TraceId,示例,ARMS,Arms,org,日志,透传
From: https://www.cnblogs.com/softidea/p/17189307.html

相关文章

  • .Net6 使用log4net将日志写入SqlServer
    第一步:引用Nuget包System.Data.SqlClient第二步:修改log4net.config配置文件增加appender节点注意,要将日志写入数据库需先创建数据库与日志表用于存放日志,不然日志有了......
  • 统一日志输出打印POST请求参数
    众所周知,request.getInputStream()只能调一次。如果希望在请求进入Controller之前统一打印请求参数(拦截器或过滤器),又不影响业务,我们只能将获取到的输入流缓存起来,后续都从......
  • 安卓NDK本地开发中使用logcat打印日志
    配置在需要打印日志的文件中添加以下头文件和宏定义#include<android/log.h>#defineLOGD(...)__android_log_print(ANDROID_LOG_INFO,"LOG_TAG",__VA_ARGS__)#de......
  • Dynamics CRM是否记录有某个用户大量下载记录的日志?
    DynamicsCRM是否记录有某个用户大量下载记录的日志?比如查看某个用户在客户实体或联系人实体上通过"导出至Excel"导出了大量数据。这个功能由Office365的审核提供,但是......
  • SQL Server20 数据库 减少日志
      解决方案1-直接删除本地ldf日志文件:(比较靠谱方案!)  1.在SQL管理器分离数据库。 2.对数据库日志文件进行压缩备份(rar,zip) 3.直接删除ldf文件。 4.......
  • 【java】log日志体系学习
    logback配置详解(一)——logger、root:https://www.cnblogs.com/cb0327/p/5759441.htmlSLF4J(二)-SLF4J绑定了多个实现类的错误是怎么一回事儿?源码解析https://blog.c......
  • 好文章!收藏了!————JS学习日志18 -- JS基础--对象引用和复制
                  参考:https://blog.csdn.net/Android_boom/article/details/125099640......
  • smartctl查看错误日志失败
    1.问题ErrorCounterloggingnotsupportedDevicedoesnotsupportSelfTestlogging#smartctl-lerror-lselftest/dev/sdbsmartctl7.32022-02-28r5338......
  • LightDB 日志审计功能介绍
    日志审计(ltaudit)ltaudit的目标是为LightDB用户提供生成审计日志的能力,这些日志通常需要符合政府、金融或ISO认证。其可通过标准的LightDB日志记录工具提供详细的会......
  • 21_Spring_日志框架和测试支持
    ​ spring5框架自带了通用的日志封装,也可以整合自己的日志 1)spring移除了LOG4jConfigListener,官方建议使用log4j2 2)spring5整合log4j2导入log4j2依赖<!--l......