@@ -4,25 +4,34 @@ import (
44 "bytes"
55 "encoding/json"
66 "errors"
7+ "fmt"
78 "github.com/sensorsdata/abtesting-sdk-go/beans"
89 "io/ioutil"
910 "net/http"
11+ "strconv"
1012 "strings"
1113 "time"
1214)
1315
14- func RequestExperiment (url string , requestPrams map [string ]interface {}, to time.Duration ) (Response , error ) {
16+ func RequestExperiment (url string , requestPrams map [string ]interface {}, to time.Duration , enableRecordRequestCostTime bool ) (Response , error ) {
1517 var resp * http.Response
1618
1719 data , _ := json .Marshal (requestPrams )
1820
1921 req , _ := http .NewRequest ("POST" , url , bytes .NewReader (data ))
2022
23+ abRequestStartTime := time .Now ().UnixNano () / int64 (time .Millisecond )
24+ req .Header .Add ("X-AB-Request-Start-Time" , fmt .Sprintf ("%v" , abRequestStartTime ))
2125 req .Header .Add ("Content-Type" , "application/json" )
2226
2327 client := & http.Client {Timeout : to }
2428 resp , err := client .Do (req )
2529
30+ if enableRecordRequestCostTime {
31+ abRequestEndTime := time .Now ().UnixNano () / int64 (time .Millisecond )
32+ recordAbRequestCostTime (resp , abRequestStartTime , abRequestEndTime )
33+ }
34+
2635 if err != nil {
2736 return Response {}, err
2837 }
@@ -49,6 +58,36 @@ func RequestExperiment(url string, requestPrams map[string]interface{}, to time.
4958 }
5059}
5160
61+ func recordAbRequestCostTime (response * http.Response , abRequestStartTime int64 , abRequestEndTime int64 ) {
62+ abRequestId := getAbRequestIdFromResponse (response )
63+ abRequestProcessTime := getAbRequestProcessTimeFromResponse (response )
64+ abRequestTotalTime := strconv .FormatInt (abRequestEndTime - abRequestStartTime , 10 )
65+ fmt .Println ("record ab request time consumption. requestId: " , abRequestId , ", requestTotalTime:" , abRequestTotalTime , "ms, abRequestProcessTime:" , abRequestProcessTime , "ms" )
66+ }
67+
68+ func getAbRequestIdFromResponse (response * http.Response ) (abRequestId string ) {
69+ if response != nil && response .Header != nil {
70+ abRequestId = response .Header .Get ("X-AB-Request-Id" )
71+ if abRequestId == "" {
72+ abRequestId = response .Header .Get ("X-Request-Id" )
73+ }
74+ if abRequestId != "" {
75+ return abRequestId
76+ }
77+ }
78+ return "unknown (not found)"
79+ }
80+
81+ func getAbRequestProcessTimeFromResponse (response * http.Response ) (abRequestProcessTime string ) {
82+ if response != nil && response .Header != nil {
83+ abRequestProcessTime = response .Header .Get ("X-AB-Request-Process-Time" )
84+ if abRequestProcessTime != "" {
85+ return abRequestProcessTime
86+ }
87+ }
88+ return "unknown (not found)"
89+ }
90+
5291func defaultTrackConfig (response * Response , resMaps map [string ]interface {}) {
5392 if ! response .TrackConfig .TriggerSwitch {
5493 return
0 commit comments