本文介绍通过日志服务SDK接入Android Trace数据的操作步骤。

前提条件

已创建Trace实例。更多信息,请参见创建Trace实例

步骤一:引入库文件

您需要在Android Studio工程对应模块下的build.gradle文件中增加以下依赖。
implementation 'com.aliyun.openservices:aliyun-log-android-sdk:bricks_1.0.7'
implementation 'com.aliyun.openservices:alysls-android-trace:1.0.0'
接入Android Trace数据所涉及的依赖包说明如下表所示。
库文件 说明
aliyun-log-android-sdk 核心SDK,用于采集Android数据到日志服务。
alysls-android-trace 接入Trace数据的插件。

步骤二:配置接入服务

  1. 添加Application类,即在$PROJECT/app/src/main/AndroidManifest.xml文件中增加Application类。

    例如添加MyApplication类,配置示例如下:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.aliyun.sls.android.demo">
        ...
    
        <application
            android:icon="@mipmap/ic_launcher"
            ...
            android:name="com.aliyun.sls.android.demo.SLSDemoApplication"
            ...
            android:theme="@style/AppTheme">
                ...
        </application>
    </manifest>
    Android Studio将根据您所添加的MyApplication类,自动创建一个名为MyApplication的类并添加到当前项目。
  2. 在MyApplication.onCreate方法中,增加如下初始化代码。
    public class MyApplication extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
            SLSAdapter adapter = SLSAdapter.getInstance();
            // 添加Trace插件。
            adapter.addPlugin(SLSTracePlugin.getInstance());
    
            SLSConfig config = new SLSConfig(this);
            config.pluginTraceEndpoint = "endpoint";
            config.pluginTraceLogProject = "project";
            config.pluginTraceLogStore = "store";
            // 根据集成情况,自主开启日志开关。
            config.debuggable = true;
    
            adapter.init(config);
        }
    }
    • SLSConfig
      SLSConfig类定义了关键的配置字段。
      类型 字段 示例值 说明
      调试参数 debuggable true 是否调试日志信息。
      说明 发布时,建议关闭,即配置为config.debuggable = false。
      配置参数 appVersion App版本号。建议保持默认配置。
      appName App名称。建议保持默认配置。
      配置参数 traceEndpoint cn-hangzhou.log.aliyuncs.com 您在创建Trace实例时所绑定的Project的Endpoint。如何获取,请参见公网服务入口
      注意 只支持公网服务入口。
      traceLogProject sls-ayasls-demo 您在创建Trace实例时所绑定的Project。更多信息,请参见创建Trace实例
      traceLogStore sls-d60f-traces Trace服务中用于存储原始Trace数据的Logstore。Logstore名称为{instance}-traces,其中instance为您所创建的Trace实例的ID。更多信息,请参见创建Trace实例
      accessKeyId LTAI****eYDw 具备日志服务Project资源访问权限的RAM用户的AccessKey ID。如何获取,请参见访问密钥。如何为RAM用户授权,请参见配置权限助手
      accessKeySecret lrRq****GOVM 具备日志服务Project资源访问权限的RAM用户的AccessKey Secret。如何获取,请参见访问密钥。如何为RAM用户授权,请参见配置权限助手
      securityToken 124f****a369 具备日志服务Project资源访问权限的RAM用户的访问密钥Token。使用STS方式接入时,需要配置。如何获取,请参见AssumeRole
      自定义参数 channel Google 自定义参数,App渠道号。
      channelName Google 自定义参数,App渠道名称。
      userNick Tom 自定义参数,用户昵称。
      longLoginNick Tom 自定义参数,用户昵称,最后一次登录的用户昵称。
      userId 423423 自定义参数,用户ID。
      longLoginUserId 423423 自定义参数,用户ID,最后一次登录的用户ID。
      loginType pswd 自定义参数,用户登录类型。
      业务参数 slsConfig.addCustom("customKey", "customValue"); slsConfig.addCustom("action_name", "click");slsConfig.addCustom("action_args", "detail_id:243434"); 用于添加业务参数,键值对形式。
      • customKey:参数名。
      • customValue:参数值。
    • SLSAdapter
      SLSAdapter类是插件的管理类。
      方法 说明
      getInstance() 返回SLSAdapter单例。
      addPlugin(plugin) 增加一个插件。
      init(slsConfig) 初始化所有插件。
      注意 init()方法会初始化所有的插件,请勿单独调用插件的init()方法。调用init()方法前,需先调用addPlugin()方法。
      resetSecurityToken(accessKeyId, accessKeySecret, securityToken) 更新STS Token。
      注意 resetSecurityToken()需要在调用initWithSLSConfig方法后再调用。
      updateConfig(slsConfig) 更新SLSConfig配置信息,适用于自定义参数、traceEndpointtraceLogProjecttraceLogStore
      注意 updateConfig()需要在调用initWithSLSConfig方法后再调用。
  3. 通过STS方式配置accessKeyIdaccessKeySecretsecurityToken
    public class MyApplication extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
            SLSAdapter adapter = SLSAdapter.getInstance();
            // 添加Trace插件。
            adapter.addPlugin(SLSTracePlugin.getInstance());
    
            SLSConfig config = new SLSConfig(this);
            // 初始化时,传入STS AccessKey信息。
            config.accessKeyId = accesskeyid;
            config.accessKeySecret = accesskeysecret;
            config.securityToken = securityToken;
    
            config.pluginTraceEndpoint = "endpoint";      
            config.pluginTraceLogProject = "project";
            config.pluginTraceLogStore = "logstore";
            // 根据集成情况,自主开启日志开关。
            config.debuggable = true;
    
            adapter.init(config);
        }
    }
  4. 构造一个Span。
    // 1. 获取Tracer实例。
    Tracer tracer = SLSTelemetry.getInstance().getTracer("your_tracer_name");
    // 2. 构造SpanBuilder。
    SpanBuilder spanBuilder = tracer.spanBuilder("your_span_name");
    spanBuilder.setAttribute("属性key", "属性 value");
    // 3. 构造Span。
    Span span = spanBuilder.startSpan();
    // 根据业务需求添加属性。
    span.setAttribute("属性key", "属性value");
    // 根据业务需求添加event事件。
    span.addEvent("your event");
    // 4. 设置Span状态。默认为UNSET,成功为OK,失败为ERROR。
    span.setStatus(StatusCode.OK);
    // 5. 结束一个Span。
    span.end();
  5. 构造一条Trace数据。
    // 1. 获取Tracer实例。
    Tracer tracer = SLSTelemetry.getInstance().getTracer("your_tracer_name");
    
    // 2. 构造第一个Span。
    SpanBuilder spanBuilder = tracer.spanBuilder("your_span_name_1");
    spanBuilder.setAttribute("属性key1", "属性value1");
    Span span = spanBuilder.startSpan();
    span.setAttribute("属性key2", "属性value2");
    span.addEvent("your event");
    span.setStatus(StatusCode.OK);
    
    // 3. 构造第二个Span。
    SpanBuilder spanBuilder = tracer
                                .spanBuilder("your_span_name_2")
                                // 此处需要设置第一个span的Context。
                                .setParent(Context.current().with(span));
    spanBuilder.setAttribute("属性key1", "属性value1");
    Span span2 = spanBuilder.startSpan();
    span2.setAttribute("属性key2", "属性value2");
    span2.addEvent("your event");
    span2.setStatus(StatusCode.OK);
    // 4. 结束第二个span。
    span2.end();
    
    // 5. 最后结束第一个span。
    span.end();
  6. 通过TextMapPropagator连接前后端。
    // 1.获取Tracer实例。
    Tracer tracer = SLSTelemetry.getInstance().getTracer("your_tracer_name");
    
    // 2.构造第一个Span。
    SpanBuilder spanBuilder = tracer.spanBuilder("/"); // 自定义指定span name。
    spanBuilder.setAttribute("属性key1", "属性value1");
    Span span = spanBuilder.startSpan();
    span.setAttribute("属性key2", "属性value2");
    span.addEvent("your event");
    span.setStatus(StatusCode.OK);
    span.end();
    
    // 以HttpURLConnection为例进行说明。
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    // 3.构造TextMapSetter。
    TextMapSetter<HttpURLConnection> setter = new TextMapSetter<HttpURLConnection>() {
        @Override
        public void set(HttpURLConnection carrier, String key, String value) {
            carrier.setRequestProperty(key, value);
        }
    };
    // 4.在http request header中注入traceparent和tracestate。
    SLSTelemetry slsTelemetry = SLSTelemetry.getInstance();
    TextMapPropagator textMapPropagator = slsTelemetry.getPropagators().getTextMapPropagator();
    textMapPropagator.inject(context, connection, setter);

后续步骤