github.com/kubeshop/testkube@v1.17.23/pkg/telemetry/sender_ga4.go (about) 1 package telemetry 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "io" 8 "net/http" 9 10 "github.com/kubeshop/testkube/pkg/log" 11 ) 12 13 const ( 14 gaUrl = "https://www.google-analytics.com/mp/collect?measurement_id=%s&api_secret=%s" 15 gaValidationUrl = "https://www.google-analytics.com/debug/mp/collect?measurement_id=%s&api_secret=%s" 16 ) 17 18 var ( 19 TestkubeMeasurementID = "" //this is default but it can be set using ldflag -X github.com/kubeshop/testkube/pkg/telemetry.TestkubeMeasurementID=G-B6KY2SF30K 20 TestkubeMeasurementSecret = "" 21 ) 22 23 func GoogleAnalyticsSender(client *http.Client, payload Payload) (out string, err error) { 24 out, err = sendValidationRequest(payload) 25 26 jsonData, err := json.Marshal(payload) 27 if err != nil { 28 return out, err 29 } 30 31 request, err := http.NewRequest("POST", fmt.Sprintf(gaUrl, TestkubeMeasurementID, TestkubeMeasurementSecret), bytes.NewBuffer(jsonData)) 32 if err != nil { 33 return out, err 34 } 35 36 request.Header.Set("Content-Type", "application/json") 37 38 resp, err := client.Do(request) 39 if err != nil { 40 return out, err 41 } 42 defer resp.Body.Close() 43 b, err := io.ReadAll(resp.Body) 44 45 if resp.StatusCode > 300 { 46 return out, fmt.Errorf("could not POST, statusCode: %d", resp.StatusCode) 47 } 48 return fmt.Sprintf("status: %d - %s", resp.StatusCode, b), err 49 } 50 51 func sendValidationRequest(payload Payload) (out string, err error) { 52 log.DefaultLogger.Debugw("sending ga payload to validate", "payload", payload) 53 54 jsonData, err := json.Marshal(payload) 55 if err != nil { 56 return out, err 57 } 58 59 uri := fmt.Sprintf(gaValidationUrl, TestkubeMeasurementID, TestkubeMeasurementSecret) 60 61 request, err := http.NewRequest("POST", uri, bytes.NewBuffer(jsonData)) 62 if err != nil { 63 return out, err 64 } 65 66 request.Header.Set("Content-Type", "application/json") 67 68 resp, err := client.Do(request) 69 if err != nil { 70 return out, err 71 } 72 defer resp.Body.Close() 73 b, err := io.ReadAll(resp.Body) 74 75 if resp.StatusCode > 300 { 76 return out, fmt.Errorf("could not POST, statusCode: %d", resp.StatusCode) 77 } 78 return fmt.Sprintf("status: %d - %s", resp.StatusCode, b), err 79 }