121 lines
2.8 KiB
Go
121 lines
2.8 KiB
Go
package thinkingdata
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
// TDDebugConsumer The data is reported one by one, and when an error occurs, the log will be printed on the console.
|
|
type TDDebugConsumer struct {
|
|
serverUrl string // serverUrl
|
|
appId string // appId
|
|
writeData bool // is archive to TE
|
|
deviceId string // be used to debug in TE
|
|
}
|
|
|
|
// NewDebugConsumer init TDDebugConsumer
|
|
func NewDebugConsumer(serverUrl string, appId string) (TDConsumer, error) {
|
|
return NewDebugConsumerWithWriter(serverUrl, appId, true)
|
|
}
|
|
|
|
func NewDebugConsumerWithWriter(serverUrl string, appId string, writeData bool) (TDConsumer, error) {
|
|
return NewDebugConsumerWithDeviceId(serverUrl, appId, writeData, "")
|
|
}
|
|
|
|
func NewDebugConsumerWithDeviceId(serverUrl string, appId string, writeData bool, deviceId string) (TDConsumer, error) {
|
|
// enable console log
|
|
SetLogLevel(TDLogLevelDebug)
|
|
|
|
if len(serverUrl) <= 0 {
|
|
msg := fmt.Sprint("ServerUrl not be empty")
|
|
tdLogError(msg)
|
|
return nil, errors.New(msg)
|
|
}
|
|
|
|
u, err := url.Parse(serverUrl)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
u.Path = "/data_debug"
|
|
|
|
c := &TDDebugConsumer{serverUrl: u.String(), appId: appId, writeData: writeData, deviceId: deviceId}
|
|
|
|
tdLogInfo("Mode: debug consumer, appId: %s, serverUrl: %s", c.appId, c.serverUrl)
|
|
|
|
return c, nil
|
|
}
|
|
|
|
func (c *TDDebugConsumer) Add(d Data) error {
|
|
jsonBytes, err := json.Marshal(d)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var jsonStr string
|
|
// if properties has includes complex data, SDK need parse time with regular expression
|
|
if d.IsComplex {
|
|
jsonStr = parseTime(jsonBytes)
|
|
} else {
|
|
jsonStr = string(jsonBytes)
|
|
}
|
|
|
|
tdLogInfo("%v", jsonStr)
|
|
|
|
return c.send(jsonStr)
|
|
}
|
|
|
|
func (c *TDDebugConsumer) Flush() error {
|
|
tdLogInfo("flush data")
|
|
return nil
|
|
}
|
|
|
|
func (c *TDDebugConsumer) Close() error {
|
|
tdLogInfo("debug consumer close")
|
|
return nil
|
|
}
|
|
|
|
func (c *TDDebugConsumer) IsStringent() bool {
|
|
return true
|
|
}
|
|
|
|
func (c *TDDebugConsumer) send(data string) error {
|
|
var dryRun = "0"
|
|
if !c.writeData {
|
|
dryRun = "1"
|
|
}
|
|
postData := url.Values{"data": {data}, "appid": {c.appId}, "source": {"server"}, "dryRun": {dryRun}}
|
|
if len(c.deviceId) > 0 {
|
|
postData.Add("deviceId", c.deviceId)
|
|
}
|
|
resp, err := http.PostForm(c.serverUrl, postData)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
defer resp.Body.Close()
|
|
|
|
if resp.StatusCode == http.StatusOK {
|
|
body, _ := ioutil.ReadAll(resp.Body)
|
|
result := map[string]interface{}{}
|
|
err = json.Unmarshal(body, &result)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if uint64(result["errorLevel"].(float64)) != 0 {
|
|
msg := fmt.Sprintf("send to receiver failed with return content: %s", string(body))
|
|
tdLogError(msg)
|
|
return errors.New(msg)
|
|
} else {
|
|
tdLogInfo("send success: %v", result)
|
|
}
|
|
} else {
|
|
return errors.New(fmt.Sprintf("Unexpected Status Code: %d", resp.StatusCode))
|
|
}
|
|
return nil
|
|
}
|