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  }