You need to enable JavaScript to run this app.
导航
使用高阶功能
最近更新时间:2024.07.23 14:24:40首次发布时间:2023.11.29 16:36:24

除了崩溃分析、启动分析、卡顿分析等常用的功能外,SDK还支持一些增强功能。您可以根据业务需求选择是否接入这些功能。

自定义日志和APMPlus日志

自定义日志的三个使用场景:崩溃日志上报、日志回捞以及主动上报。

注意

自定义日志的字符串最大限制为4*1024个字符。

主动上报

  1. 初始化SDK时,打开自定义日志。

    //打开自定义日志回捞能力
    builder.enableLogRecovery(true);
    //打开APMPlus日志 打点,可以通过回捞获取
    builder.enableAPMPlusLocalLog(true);
    ApmInsight.getInstance().init(this, builder.build());
    //初始化自定日志,配置自定义日志最大占用磁盘,内部一般配置20,代表最大20M磁盘占用。1.4.1版本开始存在这个能力
    VLog.init(this,20);
    
  2. 主动上报Vlog日志文件。

    //示例:上传当前时间前10分钟的vlog日志。
    ApmInsightAgent.uploadVlog(System.currentTimeMillis() - 1000 * 60 * 10, System.currentTimeMillis());
    
    /**
     * Vlog日志 主动上报
     *
     * @param start 起始时间 毫秒
     * @param end  结束时间 毫秒
     */
    public static void uploadVlog(long start, long end) {
    }
    
  3. 主动上报APMPlus日志。

    //示例:上传当前时间前10分钟的APMPlus日志。
    ApmInsightAgent.uploadAPMPlusLog(System.currentTimeMillis() - 1000 * 60 * 10, System.currentTimeMillis(),null);
    
    /**
     * APMPlus日志 主动上报
     *
     * @param start    起始时间 毫秒
     * @param end      结束时间 毫秒
     * @param callback 成功失败的回调
     */
    public static void uploadAPMPlusLog(long start, long end, IALogActiveUploadCallback callback) {
    }
    
    /**
     * APMPlus日志和业务Vlog日志 主动上报
     *
     * @param start    毫秒
     * @param end      毫秒
     * @param callback 成功失败的回调
     */
    public static void uploadAPMPlusAndVlog(long start, long end, IALogActiveUploadCallback callback) {
    }
    

    日志文件比较大,一次上报大约会消耗200事件量。日志文件按照大小生成新文件,单个文件最大不超过2M。

  4. 自定义文件页面,根据DID或User ID查询日志文件。

崩溃时主动上报

  1. 初始化SDK时,打开自定义日志。

    //打开自定义日志回捞能力
    builder.enableLogRecovery(true);
    //APMPlus日志 采集打开
    builder.enableAPMPlusLocalLog(true);
    ApmInsight.getInstance().init(this, builder.build());
    //初始化自定日志,配置自定义日志最大占用磁盘,内部一般配置20,代表最大20M磁盘占用。1.4.1版本开始存在这个能力
    VLog.init(this,20);
    
  2. SDK上报配置页面崩溃分析里,配置是否上传自定义日志。

  3. 崩溃详情页面的自定义日志下,查看通过Vlog类打印的日志。

日志回捞

用户出现问题需要日志排查时,通过回捞端上通过自定义日志Vlog打印的日志来排查问题。

  1. 初始化SDK时,打开自定义日志。

    //打开自定义日志回捞能力
    builder.enableLogRecovery(true);
    //APMPlus日志 采集打开
    builder.enableAPMPlusLocalLog(true);
    ApmInsight.getInstance().init(this, builder.build());
    //初始化自定日志,配置自定义日志最大占用磁盘,内部一般配置20,代表最大20M磁盘占用。1.4.1版本开始存在这个能力
    VLog.init(this,20);
    
  2. 通过API打点自定义日志。

    // com.apm.insight.VLog;
    VLog.v(String tag, String msg);
    VLog.d(String tag, String msg);
    VLog.i(String tag, String msg);
    VLog.w(String tag, String msg);
    VLog.e(String tag, String msg);
    // 也可以通过接口来设置生效的日志级别
    VLog.changeLevel(com.apm.insight.LogLevel.WARN);
    
  3. 通过日志回捞页面新建任务,输入DID或UID回捞指定用户的自定义日志排查问题。

    • UID初始化时配置

      @Override
          public String getUserId() {
               //可选。用户的唯一标识,支持用户自定义user_id把平台数据和自己用户关联起来。getUserId是回调类的参数可以初始化后再设置。
               return "userid";
          }
      
    • DID初始化时配置

      @Override
          public String getDid() {
              //1.4.0版本及以上,可选,其他版本必填,设备的唯一标识。如果依赖AppLog可以通过 AppLog.getDid() 获取。也可以自己生成。
              return null;
          }
      

      如果DID返回的是null,可以通过UID的配置进行日志回捞。

自定义回捞

回捞支持自定义回捞,用户输入自定义回捞参数,这里可以根据参数返回想要回捞的结果。

//可选,自定义回捞设置
ApmInsightAgent.setRecoveryTemplate(new ITemplateConsumer() {
    @Override
    public CustomResult handleTemplateMessage(JSONObject template) {
        //template 是平台配置的 【自定义回捞参数】
        if (template != null) {
            String type = template.optString("type");
            if (!TextUtils.isEmpty(type)) {
                if (type.equals("type_one")) {
                    //返回type_one 回捞的结果
                    HashMap<String, String> result = new HashMap<>();
                    result.put("result", "获取文件成功");
                    //result平台会直接展示,file平台支持下载
                    CustomResult customResult = new CustomResult(result, application.getFilesDir());
                    //返回的回捞结果
                    return customResult;
                } else if (type.equals("type_two")) {
                   //返回type_two 回捞的结果
                    return null;
                }
            }
        }
        return null;
    }
});

崩溃自定义数据

崩溃的时候会上报很多数据,如果用户想上报一些自定义的数据,在崩溃的时候一起上报,可以参见下文的示例代码。

其他崩溃字段

配置其他崩溃字段,包括渠道、版本号等所有自定义字段。

public Config config()

自定义维度

崩溃组件的自定义维度:

public MonitorCrash addTags(String key, String value)

性能组件的自定义维度:上报的tag可以在日志查询或者原始日志文件里查询。

//示例
ApmInsightAgent.addPerfTag("tag_test","tag_1");
/**
 * 性能数据增加tag
 * @param key
 * @param value
 */
public static void addPerfTag(@NonNull String key, @NonNull String value) {
}
/**
 * 性能数据移除tag
 * @param key
 * @param value
 */
public static void removePerfTag(@NonNull String key, @Nullable String value) {
}

自定义错误

参数message、type可以为任意字符串(不可过长),可用于筛选。

public void reportCustomErr(String message, String type, Throwable throwable)

例如:

MonitorCrash crash = 初始化返回的MonitorCrash实例
crash.reportCustomErr("test err", "type1", new RuntimeException());

启动自定义打点

设置最大启动时间阈值

builder.setMaxLaunchTime();
//设置最大的启动时长上报阀值,单位毫秒。内部默认值15秒:APP_LAUNCH_MAX_LIMIT_MS = 15 * 1000L

自定义启动节点

启动监控支持自定义打点,方法需要配对出现。
在Application的onCreate和首个Activity的onResume之间,添加以下代码,配置自定义打点。

LaunchTrace.startSpan("initData");
LaunchTrace.endSpan("initData");

添加上述代码后,可以在启动分析启动节点耗时中查看自定义打点的耗时。
图片

自定义启动结束点

默认启动监控通过插桩代码来实现,结束点为第一个页面的onResume,如下方法支持自定义结束点。

//初始化设置启动监控自定义上报,表示使用reportLaunchEnd()方法定义启动结束点
LaunchTrace.customLaunchEnd(true);
//启动自定义监控结束时间点,代表启动的结束点
LaunchTrace.reportLaunchEnd();

全链路监控

业务接入APMPlus服务端监控后,客户端进行如下配置,开启全链路监控。更多信息,请参见全链路监控

ApmInsightInitConfig.Builder builder = ApmInsightInitConfig.builder();
//打开全链路监控的能力,会在请求里注入trace_id,并在网络监控上报到服务器,通过trace_id可以和接入了APMPlus服务端监控的后端数据打通,达到全链路监控的目标
builder.enableNetTrace(true);
ApmInsight.getInstance().start(builder.build());

注册崩溃后回调

注册崩溃后回调,可以在异常发生时进行回调,记录异常发生时的关键信息。

MonitorCrash 实例使用
 /**
 * 发生异常时进行的回调,支持Java,Launch, Native和ANR异常的回调
 * 便于业务扩展功能。
 *
 * @param crashCallback 回调
 * @param type 崩溃类型,不支持{@link CrashType#CUSTOM_JAVA}
 */
 public void registerCrashCallback(ICrashCallback var1, CrashType var2)

 /**
 * 移除Crash的回调
 *
 * @param crashCallback 回调
 * @param type 崩溃类型,不支持{@link CrashType#CUSTOM_JAVA}
 */
 public void unregisterCrashCallback(ICrashCallback var1, CrashType var2)