You need to enable JavaScript to run this app.
导航
Golang SDK
最近更新时间:2024.09.25 10:07:09首次发布时间:2023.05.04 18:04:29

1. 集成SDK

Golang SDK 已经开源,开源地址为: datarangers-sdk-go。建议使用最新版本。${version} 表示 SDK 的版本号。
下载 SDK:

go get github.com/volcengine/datarangers-sdk-go

或者更新本地的 SDK:

go get -u github.com/volcengine/datarangers-sdk-go

或者在go.mod里面添加sdk 依赖:

require (
   github.com/volcengine/datarangers-sdk-go ${version}
)

如果 ${version} 没有传,表示最新的版本。
go 版本要求 >=1.17

2. SDK 上报模式介绍

增长分析的 SDK 支持多种上报模式,需要先选择使用模式。

  • HTTP 模式,使用范围广,部署简单,QPS 高。SDK 直接通过http接口进行上报。
  • FILE 模式 (只支持私有化),部署复杂,需要在服务器上多部署logagent进程服务。由 SDK 先将文件写到本地磁盘,然后通过logagent监听磁盘文件,由logagent使用http接口进行上报。

模式

使用场景

部署复杂性

可靠性

上报性能

备注

HTTP

绝大多数场景都可以使用,如果跨网络时延比较高,可以使用批量方式。

简单

高,支持批量上报

可以参考 “最佳实践”-->"查看上报时延"章节内容来查看上报的时延。

FILE

不推荐

复杂

很高

低,写文件之后还需要使用logagent来进行上报

KAFKA

同一个网络,建议使用该模式。

简单

很高

SDK版本>=1.1.4,私有化4.1版本(含)开始支持。

推荐使用 HTTP 的方式,同时使用 logagent 来补报因为网络抖动等原因导致失败的数据。

3. SDK 初始化

SDK 使用前需要先初始化,然后使用其提供的接口进行上报。

3.1 使用配置文件进行初始化

推荐使用配置的方式进行初始化

package main

import (
   // 引入 sdk
   sdk "github.com/volcengine/datarangers-sdk-go"
)

func main() {
   // 初始化, YAML_PATH 替换成真实的配置文件
   sdk.InitByFile("{YAML_PATH}")
   
   //... 接口调用 
   
   // 避免程序立刻退出
   time.Sleep(60 * time.Second)
}

3.1.1 HTTP 模式

需要配置sdk.mode=http

私有化配置

sdk:
  mode: http
#  logLevel: debug
http:
  addr: ${SDK_DOMAIN} #上报的IP 或 域名,注意加上 http://,或者https://
#  timeout: 30 # secenods
#asyn:
#  routine: 20   #建议小于1024,并发数目
#  queueSize: 10240

如果跨网络时延比较大、或者追求更高的QPS,可以开启批量上报的方式。

batch:
  enable: true
#  size: 20
#  waitTimeMs: 100

3.1.2 FILE 模式

该模式只在私有化支持
设置sdk.mode=file

sdk:
  mode: file
#  logLevel: debug
file:
  path: logs1/datarangers.log
  errPath: logs1/error-datarangers.log
#  maxSize: 100     #Mb
#  maxBackups: 0 #日志最多保存数目
#  maxAge: 0  #days
#asyn:
#  routine: 20   #建议小于1024,并发数目
#  queueSize: 10240

使用该模式,埋点事件只是记录到磁盘中,还需要配合logagent一起使用,数据才能上报到 DataFinder,关于logagent的使用,请联系客户经理获取。

3.1.3 KAFKA 模式

该模式只在私有化支持
设置sdk.mode=kafka

sdk:
  mode: kafka
kafka:
#  kafka brokers,如果有多个,则配置多个
  kafka_brokers:
    - 127.0.0.1:9192

3.2 直接在程序中进行初始化

自定义sdk.SysConf,然后进行初始化

package main

import (
   sdk "github.com/volcengine/datarangers-sdk-go"
)

func main() {
   // 初始化,设置相关参数
   sysconf := &sdk.SysConf{
      ... 
   }
   sdk.InitBySysConf(sysconf)

   // 避免程序立刻退出
   time.Sleep(60 * time.Second)
}

3.2.1 HTTP 模式

私有化初始化

import (
   sdk "github.com/volcengine/datarangers-sdk-go"
)

sysconf := &sdk.SysConf{
   // 设置模式
   SdkConfig: sdk.SdkConfig{
      Mode: sdk.MODE_HTTP,
   },
   // 设置sdk domain,这里注意替换成真实的参数
   HttpConfig: sdk.HttpConfig{
      HttpAddr: os.Getenv("SDK_DOMAIN"),
   },
}
sdk.InitBySysConf(sysconf)

3.2.2 FILE 模式

该模式只在私有化支持
设置sdk.mode=file

import (
   sdk "github.com/volcengine/datarangers-sdk-go"
)

sysconf := &sdk.SysConf{
   // 设置模式
   SdkConfig: sdk.SdkConfig{
      Mode: sdk.MODE_FILE,
   },
   // 配置保存的路径
   FileConfig: sdk.FileConfig{
      Path:    "logs/datarangers.log",
      ErrPath: "logs/error-datarangers.log",
   },
}
sdk.InitBySysConf(sysconf)

3.2.2 KAFKA 模式

该模式只在私有化支持
设置sdk.mode=kafka

import (
    sdk "github.com/volcengine/datarangers-sdk-go"
)

func main() {
    // 初始化
    sdk.InitBySysConf(&sdk.SysConf{
       // 设置模式
       SdkConfig: sdk.SdkConfig{
          Mode: sdk.MODE_KAFKA,
       },
       // 设置sdk kafka broker 地址,这里注意替换成真实的参数。broker 格式一般为ip:port,比如 127.0.0.1:9192
       KafkaConfig: &sdk.KafkaConfig{
          KafkaBrokers: []string{os.Getenv("SDK_KAFKA_BROKER_1"), os.Getenv("SDK_KAFKA_BROKER_2")},
       },
    })
}

3.3 SDK 配置参考

配置模块

配置项

含义

备注

sdk

mode

上报模式(不区分大小写):http、file。

env

枚举类型,需配置为pri,表示私有化环境,非必须,sdk可以根据配置自动判定。

logLevel

日志级别,默认是trace。支持配置:
trace, debug, info, warn, error, fatal

asyn

routine

异步协程池核心协程数,默认是20。

queueSize

异步队列大小,默认是10240。

http

addr

DataFinder 的域名或者ip,支持http和https,例如为 https://{具体域名地址}

timeout

http 超时时间。

batch

enable

boolean类型,表示是否开启批量上报。默认是false,不使用批量。

只支持http模式。

size

批量上报的数量。

waitTimeMs

批量上报,不足batchSize的时候,最大等待时间。

file

path

保存日志的文件目录,需要保证文件的写权限,默认是
logs/datarangers.log。

file 模式下的配置;http 模式下,上报失败的报文记录在 errPath 下。

maxSize

单个文件最大数量,默认是100m。

maxBackup

最大备份文件数量,默认是0,表示会保留所有文件。

maxAge

最大保存的天数,默认是0,表示会保留所有文件。

errPath

上报失败保存日志的文件目录,需要保证文件的写权限,默认是
logs/error-datarangers.log。

kafka

kafka_brokers

数组格式,kafka的 brokers地址

topic

topic,默认是 sdk_origin_event

sync_kafka_producer_conf.required_acks

同步模式,-1:等待所有副本 0:等待本地

sync_kafka_producer_conf.retry_config.max

消息发送最大重试次数

sync_kafka_producer_conf.flush_config.bytes

消息发送,超过字节数强制flush

sync_kafka_producer_conf.flush_config.messages

消息发送,超过消息数强制flush

sync_kafka_producer_conf.flush_config.frequency_ms

消息发送,超过一段时间强制flush

sync_kafka_producer_conf.flush_config.max_messages

消息发送,缓冲区最大消息数

openapi

addr

openapi的域名,私有化无需配置

ak

openapi的ak,私有化无需配置。

sk

openapi的sk,私有化无需配置。

不涉及

appKeys

上报设置的appkeys,可以设置多个。多个可以的方式为:

appKeys:
  ${APP_ID_1}: ${APP_KEY_1}
  ${APP_ID_2}: ${APP_KEY_2}

3.4 验证配置

3.4.1 查看启动日志

启动会打印如下日志,可以通过监测启动日志来确定配置是否符合预期。主要关注下SdkConfig.Mode``,``HttpConfig 等配置。

[DEBUG:]2023/02/27 15:54:20 user config :{"SdkConfig":{"Mode":"file","Env":"pri","LogLevel":""},"BatchConfig":{"Enable":false,"Size":0,"WaitTimeMs":0},"FileConfig":{"EventSendEnable":false,"Path":"logs/datarangers.log","MaxSize":100,"MaxBackup":0,"MaxAge":0,"ErrPath":"logs/error-datarangers.log"},"HttpConfig":{"HttpAddr":"","SocketTimeOut":0,"Headers":null},"AsynConfig":{"Routine":20,"QueueSize":10240},"OpenapiConfig":{"HttpAddr":"","Ak":"","Sk":""},"VerifyConfig":{"Url":""},"AppKeys":null}

3.4.2 HTTP 模式

参考 “JAVA SDK” 文档中,“验证配置”中的 HTTP 模式方式。

3.4.3 FILE 模式 (只支持私有化)

查看配置 file.path 的文件目录下是否有文件,是否有文件内容。校验文件内容是否正确,可以直接拷贝一行数据,使用http的方式进行上报。

3.4.4 KAFKA 模式 (只支持私有化)

查看kafka topic: sdk_origin_event 是否有数据上来,kafka 的使用方式参考文档:Kafka订阅埋点数据(私有化)

4 使用SDK

使用前,需要先初始化sdk,初始化参考“SDK 初始化”,初始化之后就可以使用接口进行上报了。

4.1 接口

// SendEvent
// eventParam : 事件属性
// custom     : 用户自定义事件公共属性
// Deprecated: instead of SendEventInfo
func SendEvent(appType AppType, appid int64, uuid string, eventname string, eventParam map[string]interface{}, custom map[string]interface{}, did ...int64) error

// SendEventInfo 上报事件信息
// event: 事件信息
// custom: 事件公共属性
func SendEventInfo(appType AppType, appId int64, uuid string, event *EventV3, custom map[string]interface{}) error

// SendEventInfoWithItem 上报携带item的事件
// event: 事件信息
// custom: 事件公共属性
// itemList: item 信息
func SendEventInfoWithItem(appType AppType, appId int64, uuid string, event *EventV3, custom map[string]interface{}, itemList []*Item) error

// SendEventInfos 上报多个事件
// events: 事件信息
// custom: 事件公共属性
func SendEventInfos(appType AppType, appId int64, uuid string, events []*EventV3, custom map[string]interface{}) error

// SendEventWithHeader 使用header上报事件
// header: 事件的header
// event: 事件信息
func SendEventWithHeader(appType AppType, appId int64, hd *Header, event *EventV3) error

// SendProfile
// profileAction :用户公共属性操作类型
// profileParam :  用户公共属性
func SendProfile(apptype AppType, appid int64, uuid string, profileAction ProfileActionType, profileParam map[string]interface{}, did ...int64) error 

// ItemSet 设置item 属性
// itemName: item 名称
// itemParamList: item 属性信息
func ItemSet(appid int64, itemName string, itemParamList []map[string]interface{}) error

4.2 SDK DEMO

SDK DEMO可前往开源example文件夹中查看:demo链接

4.3 发送普通事件

// 应用id
appId := {APP_ID}
// 用户id
uuid := {uuid}
// 事件公共属性,如果不需要的话,可以传nil
commonParams := map[string]interface{}{
   "common_string1": "common_value1",
   "common_int1":    13,
}
eventName := "app_send_event_info"
eventV3 := &sdk.EventV3{
   Event:       eventName,
   Params: map[string]interface{}{
      "app_send_event_param1": "value1",
      "app_send_event_param2": "value2",
   },
}
sdk.SendEventInfo(sdk.APP, appId, uuid, eventV3, commonParams)

4.4 设置用户属性

// 应用id
appId := example.AppId
// 用户id
uuid := example.Uuid
// 用户属性
properties := map[string]interface{}{
   "list":      []string{"a"},
   "profile_a": "param_11",
}

sdk.ProfileSet(sdk.APP, appId, uuid, properties)

4.5 设置item属性

// 应用id
appId := example.AppId

// item属性
itemParamList := []map[string]interface{}{
   {"id": 121, "category": "economics"},
   {"id": 122, "category": "literature"},
   {"id": 123, "category": "fiction"},
   {"id": 124, "category": "fiction"},
   {"id": 125, "category": "fiction"},
}

err := sdk.ItemSet(appId, "book", itemParamList)

4.6 发送携带item的时间

// 应用id
appId := {APP_ID}
// 用户id
uuid := {uuid}
// 事件公共属性,如果不需要的话,可以传nil
commonParams := map[string]interface{}{
   "common_string1": "common_value1",
   "common_int1":    13,
}
eventName := "app_send_event_info"
// 事件发生时间
localTimeMs := time.Now().UnixMilli()
eventV3 := &sdk.EventV3{
   Event:       eventName,
   LocalTimeMs: &localTimeMs,
   Params: map[string]interface{}{
      "app_send_event_param1": "value1",
      "app_send_event_param2": "value2",
   },
}
sdk.SendEventInfo(sdk.APP, appId, uuid, eventV3, commonParams)

5 注意事项
  1. 如果服务端能够获取到client_ip,device_model等用户的设备信息,可以使用入参为Header的接口上报。否则默认情况下,对于事件的公共属性均为null或unknown。
  2. 如果使用 v1.1.0v1.1.1v1.1.2 这3个版本上报过用户属性,需要处理;如果只是上报事件,那么不需要处理:
    a. 不影响事件上报,只影响用户属性
    b. 如果 SDK 不升级到最新的版本,且没有通过其他方式来上报用户属性,可以不用处理;
    c. 如果 SDK 需要升级到最新的版本 >=v1.1.3,或者使用其他方式上报数据,在升级前需要联系客户经理处理下数据,否则会导致新的用户属性上报不生效。