跳转至

Unity 应用接入


前置条件

注意:若您开通了 RUM Headless 服务,前置条件已自动帮您配置完成,直接接入应用即可。

应用接入

当前 Unity 版本暂时支持 Android 和 iOS 平台。登录观测云控制台,进入「用户访问监测」页面,点击左上角「新建应用」,即可开始创建一个新的应用。

1.输入「应用名称」、「应用ID」,选择 「自定义」 应用类型

  • 应用名称:用于识别当前用户访问监测的应用名称。
  • 应用 ID :应用在当前工作空间的唯一标识,对应字段:app_id 。该字段仅支持英文、数字、下划线输入,最多 48 个字符。

安装

源码地址https://github.com/GuanceCloud/datakit-unity

Demo 地址https://github.com/GuanceCloud/datakit-unity/blob/dev/Assets/Scenes

Assets/Plugins
├── Android
│   ├── FTUnityBridge.java                  // Android bridge 
│   ├── ft-sdk-release.aar                  // Android SDK
│   ├── gson-2.8.5.jar                      // Android SDK 依赖第三方库
├── FTSDK.cs                                // FTSDK.prefab 绑定脚本
├── FTSDK.prefab                            // SDK 初始化预制件
├── FTUnityBridge.cs                        // Unity bridge 桥接 iOS Android 等平台方法
├── FTViewObserver.cs                       // FTViewObserver.prefab 绑定脚本
├── FTViewObserver.prefab                   // View 页面监听预制件
├── UnityMainThreadDispatcher.cs            // UnityMainThreadDispatcher.prefab 绑定脚本
├── UnityMainThreadDispatcher.prefab        // 主线程消费队列预制件
├── iOS
│   ├── FTMobileSDK.framework               // iOS SDK
│   ├── FTUnityBridge.mm                    // iOS bridge
  • Asserts -> Import Package -> Custom Package... 导入 ft-sdk-unity.unitypackage
  • 添加 json 解析第三方库 "com.unity.nuget.newtonsoft-json",可以在 Pakcage Manager -> Add Package by name ...
  • FTSDK.prefab 拖拽至第一个场景页面,并在 FTSDK.cs_InitSDK 方法中初始化 SDK,如果原生 Android 和 iOS 工程已集成了原生 SDK,需要注释 _InitSDK方法,避免重复设置
  • FTViewObserver.prefab拖拽至其他场景页面,来达到页面 View 生命周期监听的目的,包括应用休眠和唤醒
  • 通过 Application.logMessageReceived 监听转化 Unity 崩溃数据和普通日志数据,见 FTSDK.cs OnEnable OnDisable 方法

注意:如果已经集成原生 SDK Android gson-2.8.5.jar、ft-sdk-release.aar ,iOS FTMobileSDK.framework 可以在项目中移除。 另外,Android Okhttp 请求和启动耗时功能,需要配合 ft-plugin 使用,详细配置请见 Android SDK

初始化

FTUnityBridge.Install(new SDKConfig
            {
                serverUrl = "http://10.0.0.1:9529",
                env = "prod",
                debug = true,

            });
字段 类型 必须 说明
serverUrl string datakit 访问 URL 地址,例子:http://10.0.0.1:9529,端口默认 9529。注意:安装 SDK 设备需能访问这地址
env string 环境,默认prod.prod:线上环境;gray:灰度环境;pre:预发布环境;common:日常环境;local:本地环境,支持自定义
debug bool 是否开启调试模式
globalContext dictionary 添加 SDK 全局属性,添加规则请查阅此处
serviceName string 影响 Log 和 RUM 中 service 字段数据, 默认为 android 为df_rum_android,iOS 为 df_rum_ios

RUM 配置

FTUnityBridge.InitRUMConfig(new RUMConfig()
            {
                androidAppId = "androidAppId",
                iOSAppId = "iOSAppId",
                sampleRate = 0.8f,
            });
字段 类型 必须 说明
androidAppId string 对应设置 RUM appid,才会开启RUM的采集功能,获取 appid 方法
iOSAppId string 对应设置 RUM appid,才会开启RUM的采集功能,获取 appid 方法
sampleRate float 采样率,取值范围 [0,1],0 表示不采集,1 表示全采集,默认值为 1。作用域为同一 session_id 下所有 View,Action,LongTask,Error 数据
globalContext dictionary 添加标签数据,用于用户监测数据源区分,如果需要使用追踪功能,则参数 keytrack_id ,value 为任意数值。添加规则请查阅 此处
enableNativeUserAction bool 是否开启 Native Action 收集,默认 false
enableNativeUserView bool 是否开启 Native View 收集,默认 false
enableNativeUserResource bool 是否开启 Native Resource 收集,Android 支持 Okhttp,iOS 使用 NSURLSession,默认 false
extraMonitorTypeWithError enum 添加附加监控数据到 Rum 崩溃数据中,memory 为内存用量,cpu 为 CPU 占有率,all 为全部
deviceMonitorType enum 页面监控补充类型: allbattery(仅Android支持)、 memorycpufps
detectFrequency enum 页面监控频率: normal(默认)、 frequentrare

Log 配置

FTUnityBridge.InitLogConfig(new LogConfig
            {
                sampleRate = 0.9f,
                enableCustomLog = true,
                enableLinkRumData = true,
            });
字段 类型 必须 说明
sampleRate float 采样率,取值范围 [0,1],0 表示不采集,1 表示全采集,默认值为 1。
globalContext dictionary 添加标签数据,添加规则请查阅 此处
logLevelFilters array 设置等级日志过滤,okinfowarningerrorcritical,默认不过滤
enableCustomLog bool 是否上传自定义日志 ,默认为 false
discardStrategy enum discard为丢弃追加数据,discard_oldest 丢弃老数据,默认为 discard

Trace 配置

FTUnityBridge.InitTraceConfig(new TraceConfig
            {
                sampleRate = 0.9f,
                traceType = TraceType.DDTrace,
                enableAutoTrace = true,
                enableLinkRumData = true

            });
字段 类型 必须 说明
sampleRate float 采样率,取值范围 [0,1],0 表示不采集,1 表示全采集,默认值为 1。
traceType enum 默认为 ddtrace,目前支持 zipkin , jaeger, ddtraceskywalking (8.0+),traceParent (W3C),如果接入 OpenTelemetry 选择对应链路类型时,请注意查阅支持类型及 agent 相关配置
enableLinkRUMData bool 是否与 RUM 数据关联,默认为 false

RUM 用户数据追踪

目前只能通过手动方法调用来实现 RUM 数据传输

Action

使用方法

/// <summary>
///  添加 Action 
/// </summary>
/// <param name="actionName"> action 名称</param>
/// <param name="actionType"> action 类型</param>
public static void StartAction(string actionName, string actionType)

/// <summary>
/// 添加 Action
/// </summary>
/// <param name="actionName">action 名称</param>
/// <param name="actionType">action 类型</param>
/// <param name="property">附加属性参数</param>
public static void StartAction(string actionName, string actionType, Dictionary<string, object> property)

代码示例

 FTUnityBridge.StartAction("click", "test");

View

使用方法

/// <summary>
///  View 开始
/// </summary>
/// <param name="viewName">当前页面名称</param>
public static void StartView(string viewName)

/// <summary>
/// View 开始
/// </summary>
/// <param name="viewName">当前页面名称</param>
/// <param name="property">附加属性参数</param>
public static void StartView(string viewName, Dictionary<string, object> property)

/// <summary>
/// View 结束
/// </summary>
public static void StopView()

/// <summary>
/// View 结束
/// </summary>
/// <param name="property">附加属性参数</param>
public static void StopView(Dictionary<string, object> property)

代码示例

FTUnityBridge.StartView("TEST_VIEW_ONE");

FTUnityBridge.StopView();

Resource

使用方法

/// <summary>
///  resource 开始
/// </summary>
/// <param name="resourceId">资源 Id</param>
/// <returns></returns>
public static async Task StartResource(string resourceId)

/// <summary>
/// resource 开始
/// </summary>
/// <param name="resourceId">资源 Id</param>
/// <param name="property">附加属性参数</param>
/// <returns></returns>
public static async Task StartResource(string resourceId, Dictionary<string, object> property)

/// <summary>
/// resource 结束
/// </summary>
/// <param name="resourceId">资源 Id</param>
/// <returns></returns>
public static async Task StopResource(string resourceId)

/// <summary>
/// resource 结束
/// </summary>
/// <param name="resourceId">资源 Id</param>
/// <param name="property">附加属性参数</param>
public static async Task StopResource(string resourceId, Dictionary<string, object> property)


/// <summary>
/// 添加网络传输内容和指标
/// </summary>
/// <param name="resourceId">资源 Id</param>
/// <param name="resourceParams">数据传输内容</param>
/// <param name="netStatus">网络指标数据</param>
public static async Task AddResource(string resourceId, ResourceParams resourceParams, NetStatus netStatus)
NetStatus
方法名 类型 必须 说明
fetchStartTime long 请求开始时间,ns
tcpTime long tcp 连接耗时,ns
dnsTime long dns 解析时间,ns
responseTime long 响应内容传输耗时,ns
sslTime long ssl 链接耗时,ns
firstByteTime long ssl dns 解析到接收到第一个数据包的总时,ns
ttfb long 请求响应时间,开始发送请求到接收到响应首包的时长,ns
tcpStartTime long tcp 连接时间,ns
tcpEndTime long tcp 结束时间 ,ns
dnsStartTime long dns 开始时间 ,ns
dnsEndTime long dns 结束时间,ns
responseStartTime long 响应开始时间 ,ns
responseEndTime long 响应结束时间,ns
sslStartTime long ssl 开始时间,ns
sslEndTime long ssl 结束时间,ns
ResourceParams
方法名 类型 必须 说明
url string url 地址
requestHeader string 请求头参数,没有格式限制
responseHeader string 响应头参数,没有格式限制
responseConnection string 响应 connection
responseContentType string 响应 ContentType
responseContentEncoding string 响应 ContentEncoding
resourceMethod string 请求方法 GET,POST 等
responseBody string 返回 body 内容

代码示例

FTUnityBridge.StartResource(resourceId);

FTUnityBridge.StopResource(resourceId);

ResourceParams resourceParams = new ResourceParams();
resourceParams.url = url;
resourceParams.requestHeader = client.DefaultRequestHeaders.ToDictionary(header => header.Key, header => string.Join(",", header.Value));
resourceParams.responseHeader = response.Headers.ToDictionary(header => header.Key, header => string.Join(",", header.Value));
resourceParams.resourceStatus = (int)response.StatusCode;
resourceParams.responseBody = responseData;
resourceParams.resourceMethod = "GET";
NetStatus netStatus = new NetStatus();
netStatus.fetchStartTime = DateTimeOffset.Now.ToUnixTimeMilliseconds() * 1000000;

FTUnityBridge.AddResource(resourceId, resourceParams, netStatus);

Error

使用方法

/// <summary>
/// 添加错误信息
/// </summary>
/// <param name="log">日志</param>
/// <param name="message">消息</param>
/// <param name="errorType">错误类型</param>
/// <param name="state">程序运行状态</param>
/// <returns></returns>
public static async Task AddError(string log, string message)


/// <summary>
/// 添加错误信息
/// </summary>
/// <param name="log">日志</param>
/// <param name="message">消息</param>
/// <param name="errorType">错误类型</param>
/// <param name="state">程序运行状态</param>
/// <param name="property">附加属性参数</param>
/// <returns></returns>
public static async Task AddError(string log, string message,
    Dictionary<string, object> property)

代码示例

void OnEnable()
{
    Application.logMessageReceived += LogCallBack;

}

void OnDisable()
{
    Application.logMessageReceived -= LogCallBack;
}

void LogCallBack(string condition, string stackTrace, LogType type)
{
    if (type == LogType.Exception)
    {
        FTUnityBridge.AddError(stackTrace, condition);
    }

}

LongTask

使用方法

/// <summary>
/// 添加长耗时任务
/// </summary>
/// <param name="log">日志内容</param>
/// <param name="duration">持续时间,纳秒</param>
/// <returns></returns>
public static async Task AddLongTask(string log, long duration)

/// <summary>
/// 添加长耗时任务
/// </summary>
/// <param name="log">日志内容</param>
/// <param name="duration">持续时间,纳秒</param>
/// <param name="property">附加属性参数</param>
/// <returns></returns>
public static async Task AddLongTask(string log, long duration, Dictionary<string, object> property)

代码示例

FTUnityBridge.AddLongTask("long task test", 100002);

Log 日志打印

使用方法

/// <summary>
/// 添加日志
/// </summary>
/// <param name="log">日志内容</param>
/// <param name="level">日志等级 info,warning,error,critical,ok</param>
/// <returns></returns>
public static async Task AddLog(string log, LogLevel level)

 /// <summary>
/// 添加日志
/// </summary>
/// <param name="log">日志内容</param>
/// <param name="level">日志等级 info,warning,error,critical,ok</param>
/// <param name="property">附加属性参数</param>
/// <returns></returns>
public static async Task AddLog(string log, LogLevel level, Dictionary<string, object> property)

LogLevel

方法名 含义
info 提示
warning 警告
error 错误
critical 严重
ok 恢复

代码示例

FTUnityBridge.AddLog("test log", "test message");

Tracer 网络链路追踪

链路通过生成 Trace Header,然后通过将 Header 添加到 http 请求头上来实现链路功能

使用方法

/// <summary>
/// 获取链路 Id
/// </summary>
/// <param name="url">url 地址</param>
/// <returns>json 字符</returns>
public static async Task<string> GetTraceHeaderWithUrl(string url)


/// <summary>
/// 获取链路
/// </summary>
/// <param name="resourceId">资源 Id</param>
/// <param name="url">url 地址</param>
/// <returns>json 字符</returns>

public static async Task<string> GetTraceHeader(string resourceId, string url)

代码示例

string headData = FTUnityBridge.GetTraceHeader(resourceId, FAKE_URL);

string headData = FTUnityBridge.GetTraceHeader(FAKE_URL);

用户信息绑定与解绑

使用方法

/// <summary>
/// 绑定 RUM 用户信息
/// </summary>
/// <param name="userId">用户唯一id</param>
public static async Task BindUserData(string userId)

/// <summary>
/// 绑定 RUM 用户信息
/// </summary>
/// <param name="userData"></param>
public static async Task BindUserData(UserData userData)
方法名 类型 必须 说明
userId string 用户 id
userName string 用户名
userEmail string 用户邮箱
extra dictionary KV 方式赋值,添加规则请查阅 此处

代码示例

FTUnityBridge.BindUserData(new UserData
            {
                userId = "userid",
                userName = "userName",
                userEmail = "someone@email.com",
                extra = new Dictionary<string, string>{
                    {"custom_data","custom data"}
                }
            });

FTUnityBridge.UnBindUserdata()

关闭 SDK

/// <summary>
/// SDK 释放
/// </summary>
public static void DeInit()

代码示例

FTUnityBridge.DeInit()

Publish Package 相关配置

Android

iOS

常见问题

添加局变量避免冲突字段

为了避免自定义字段与 SDK 数据冲突,建议标签命名添加 项目缩写 的前缀,例如 df_tag_name,项目中使用 key 值可查询源码。SDK 全局变量中出现与 RUM、Log 相同变量时,RUM、Log 会覆盖 SDK 中的全局变量。

文档评价

文档内容是否对您有帮助? ×