使用自定义域名上报数据

更新时间:
复制为 MD 格式

用户体验监控支持通过自定义域名上报数据,主要分为四个步骤:上传证书、本地验证数据上报、修改自定义域名DNS解析和使用自定义域名上报数据。

前提条件

  • 确保您已成功接入用户体验监控,同时对应的SLS Project已经成功创建。

    查询用户体验监控SLS Project的路径如下:应用名称-应用设置-基础信息-应用信息-日志信息。
  • SDK要求:当前仅支持使用Java SDK上传证书,版本需要≥ 0.6.78,Maven依赖配置参考:

    <dependency>
        <groupId>com.aliyun.openservices</groupId>
        <artifactId>aliyun-log</artifactId>
        <version>0.6.142</version>
    </dependency>

操作步骤

步骤一:上传证书

权限要求

推荐使用RAM用户的AK SK来进行相关操作,使用前需要对RAM用户授予相应的权限,授权方式可以参考:RAM用户授权

最小授权粒度:对您的用户体验监控的Project资源授予log:PutCname、log:DeleteCname、log:ListCname权限,可参考以下配置自定义权限策略:

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["log:PutCname", "log:DeleteCname", "log:ListCname"],
      "Resource": "acs:log:*:*:project/${your rum sls project name}/*"
    }
  ]
}

上传证书代码示例

import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.CertificateConfiguration;
import com.aliyun.openservices.log.request.SetProjectCnameRequest;
import com.aliyun.openservices.log.response.ListProjectCnameResponse;
import org.junit.Test;

import java.io.*;
import java.nio.file.Files;

public class CnameSample {


    public static String readStreamAsString(InputStream in, String charset) throws IOException {
        if (in == null) {
            return "";
        }

        Reader reader = null;
        Writer writer = new StringWriter();
        String result;

        char[] buffer = new char[1024];
        try {
            int n = -1;
            reader = new BufferedReader(new InputStreamReader(in, charset));
            while ((n = reader.read(buffer)) != -1) {
                writer.write(buffer, 0, n);
            }

            result = writer.toString();
        } finally {
            in.close();
            if (reader != null) {
                reader.close();
            }
            if (writer != null) {
                writer.close();
            }
        }

        return result;
    }

    private static String readFileAsString(String filename) throws Exception {
        File file = new File(filename);
        return readStreamAsString(Files.newInputStream(file.toPath()), "utf-8");
    }

    @Test
    public void testCname() throws Exception {
        // 自定义域名证书的公钥文件
        String pubKey = readFileAsString("public.pem");
        // 自定义域名证书的私钥文件
        String priKey = readFileAsString("private.key");
        // 用户体验监控对应的 project 
        String project = "${your rum sls project name}";
        // 自定义域名 xx.abc.com
        String cname = "your cname";
         // 日志服务的服务接入点。此处以北京为例,其它地域请根据实际情况填写
        String endpoint = "cn-beijing.log.aliyuncs.com";
        String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
        String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        SetProjectCnameRequest request1 = new SetProjectCnameRequest(project, cname);
        request1.setCertificateConfiguration(new CertificateConfiguration()
                .withPublicKey(pubKey)
                .withPrivateKey(priKey));
        Client client = new Client(endpoint,
                accessKeyId,
                accessKeySecret);
        client.setProjectCname(request1);
    }
}

client对象中参数说明:

参数名

描述

endpoint

SLS Endpoint可参考:服务接入点。需要使用 公网接入地址

accessKeyId

查看RAM用户AK可参考:查看RAM用户的AccessKey信息

accessKeySecret

查看RAM用户AK可参考:查看RAM用户的AccessKey信息

解除证书关联与查询证书

解除证书关联

解除证书关联有两种方式,一种是仅将证书从用户体验监控服务器上删除,另一种是彻底删除证书和Project和域名的CNAME关系。
// cname为自定义域名
String cname = "xx.abc.com";
// project
String project = "${your rum sls project name}";


// 只删除证书 
SetProjectCnameRequest request = new SetProjectCnameRequest(project, cname);
request.setCertificateConfiguration(new CertificateConfiguration()
    .withDeleteCertificate(true));
client.setProjectCname(request);

// 删除整个cname
client.deleteProjectCname(project, cname);

查询证书

// project为用户体验监控对应的SLS project 
ListProjectCnameResponse response = client1.listProjectCname(project);
        System.out.println(response.getCnameConfigurations().size());
        System.out.println(response.getCnameConfigurations().get(0).getCertificate().getCreationDate());     System.out.println(response.getCnameConfigurations().get(0).getCertificate().getValidStartDate());
System.out.println(response.getCnameConfigurations().get(0).getCertificate().getValidEndDate());

步骤二:本地验证数据上报

在正式切换自定义域名的DNS解析前,需要先在本地验证数据上报是否正常,以确认证书上传的有效性。

  1. 本地执行dig命令,获取到 ${用户体验监控SLS project}.${对应地域的SLS 公网接入地址} 域名的一个IP地址。SLS公网接入地址可参考步骤一:上传证书中参数说明。

  2. 通过本地hosts文件,将自定义域名绑定到通过上述操作获取到的一个IP地址。

  3. RUM接入配置中的Endpoint域名部分,替换成您的自定义域名,然后在本地测试数据上报。此部分可以参考步骤四:使用自定义域名上报

步骤三:修改自定义域名DNS解析

在本地验证数据成功上报后,可以将您自定义域名的DNS解析,CNAME${用户体验监控SLS project}.${对应地域的SLS 公网接入地址}

步骤四:使用自定义域名上报

  • Web、小程序、小游戏、Uniapp、Flutter、ReactNative类型的应用,将应用设置-基础信息-集成探针展示的Endpoint中的域名部分,替换成您的自定义域名。

    • Web应用为例,例如控制台展示的Endpoint为:https://proj-xtrace-xxxx-cn-hangzhou.cn-hangzhou.log.aliyuncs.com/rum/web/v2?workspace=default-cms-xxxx-cn-hangzhou&service_id=xxx@yyyy ,您需要将Endpoint域名部分 替换成您的自定义域名,替换后的Endpoint为:https://your.custom.domain/rum/web/v2?workspace=default-cms-xxxx-cn-hangzhou&service_id=xxx@yyyy

  • Android、iOSHarmonyOS,如果SDK版本号< 2.0.0,则将ConfigAddress中的域名部分替换成自定义域名;如果版本号≥ 2.0.0,则将Endpoint中的域名部分替换成自定义域名。

    • Android 应用为例,如果您的SDK版本号< 2.0.0,则将ConfigAddress改成https://your.custom.domain;如果您的SDK版本号≥2.0.0,则将Endpoint改成https://your.custom.domain