From 01e976674df94105120b72c223f9f7e4868dddb6 Mon Sep 17 00:00:00 2001 From: Eran Turgeman Date: Mon, 1 Apr 2024 17:43:26 +0300 Subject: [PATCH] report error to coralogix initial push --- tests/utils_test.go | 2 +- tests/xsclogerrorevent_test.go | 58 ++++++++++++++++++++++++++++++++++ xsc/manager.go | 6 ++++ xsc/services/logerrorevent.go | 42 ++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 tests/xsclogerrorevent_test.go create mode 100644 xsc/services/logerrorevent.go diff --git a/tests/utils_test.go b/tests/utils_test.go index 85fb5389f..16fd2010b 100644 --- a/tests/utils_test.go +++ b/tests/utils_test.go @@ -156,7 +156,7 @@ func init() { RtUrl = flag.String("rt.url", "http://localhost:8081/artifactory", "Artifactory url") DistUrl = flag.String("ds.url", "", "Distribution url") XrayUrl = flag.String("xr.url", "", "Xray url") - XscUrl = flag.String("xsc.url", "", "Xray url") + XscUrl = flag.String("xsc.url", "", "Xsc url") PipelinesUrl = flag.String("pipe.url", "", "Pipelines url") AccessUrl = flag.String("access.url", "http://localhost:8081/access", "Access url") RtUser = flag.String("rt.user", "admin", "Artifactory username") diff --git a/tests/xsclogerrorevent_test.go b/tests/xsclogerrorevent_test.go new file mode 100644 index 000000000..ac7f8e13d --- /dev/null +++ b/tests/xsclogerrorevent_test.go @@ -0,0 +1,58 @@ +package tests + +import ( + "encoding/json" + "github.com/jfrog/jfrog-client-go/http/jfroghttpclient" + "github.com/jfrog/jfrog-client-go/xsc/services" + "github.com/stretchr/testify/assert" + "net/http" + "net/http/httptest" + "testing" +) + +const errorMessageContentForTest = "THIS IS NOT A REAL ERROR! This Error is posted as part of TestXscSendLogErrorEvent test" + +func TestXscSendLogErrorEvent(t *testing.T) { + initXscTest(t) + mockServer, logErrorService := createXscMockServer(t) + defer mockServer.Close() + + event := &services.ExternalErrorLog{ + Log_level: "error", + Source: "cli", + Message: errorMessageContentForTest, + } + + assert.NoError(t, logErrorService.SendLogErrorEvent(event)) +} + +func createXscMockServer(t *testing.T) (mockServer *httptest.Server, logErrorService *services.LogErrorEventService) { + mockServer = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.RequestURI == "/xsc/api/v1/event/logMessage" && r.Method == http.MethodPost { + var reqBody services.ExternalErrorLog + decoder := json.NewDecoder(r.Body) + err := decoder.Decode(&reqBody) + assert.NoError(t, err, "Invalid JSON request body") + if err != nil { + return + } + + assert.Equal(t, "error", reqBody.Log_level) + assert.Equal(t, "cli", reqBody.Source) + assert.Equal(t, errorMessageContentForTest, reqBody.Message) + w.WriteHeader(http.StatusCreated) + return + } + assert.Fail(t, "received an unexpected request") + })) + + xscDetails := GetXscDetails() + xscDetails.SetUrl(mockServer.URL + "/xsc") + + client, err := jfroghttpclient.JfrogClientBuilder().Build() + assert.NoError(t, err) + + logErrorService = services.NewLogErrorEventService(client) + logErrorService.XscDetails = xscDetails + return +} diff --git a/xsc/manager.go b/xsc/manager.go index ed307fa68..2e6197f97 100644 --- a/xsc/manager.go +++ b/xsc/manager.go @@ -55,6 +55,12 @@ func (sm *XscServicesManager) AddAnalyticsGeneralEvent(event services.XscAnalyti return eventService.AddGeneralEvent(event) } +func (sm *XscServicesManager) SendXscLogErrorRequest(errorLog *services.ExternalErrorLog) error { + logErrorService := services.NewLogErrorEventService(sm.client) + logErrorService.XscDetails = sm.config.GetServiceDetails() + return logErrorService.SendLogErrorEvent(errorLog) +} + // UpdateAnalyticsGeneralEvent Upon completion of the scan and we have all the results to report on, // we send a finalized analytics metrics event with information matching an existing event's msi. func (sm *XscServicesManager) UpdateAnalyticsGeneralEvent(event services.XscAnalyticsGeneralEventFinalize) error { diff --git a/xsc/services/logerrorevent.go b/xsc/services/logerrorevent.go new file mode 100644 index 000000000..b089b1eac --- /dev/null +++ b/xsc/services/logerrorevent.go @@ -0,0 +1,42 @@ +package services + +import ( + "encoding/json" + "fmt" + "github.com/jfrog/jfrog-client-go/auth" + "github.com/jfrog/jfrog-client-go/http/jfroghttpclient" + "github.com/jfrog/jfrog-client-go/utils" + "github.com/jfrog/jfrog-client-go/utils/errorutils" + "net/http" +) + +const postLogErrorAPI = "api/v1/event/logMessage" + +type LogErrorEventService struct { + client *jfroghttpclient.JfrogHttpClient + XscDetails auth.ServiceDetails +} + +type ExternalErrorLog struct { + Log_level string `json:"log_level"` + Source string `json:"source"` + Message string `json:"message"` +} + +func NewLogErrorEventService(client *jfroghttpclient.JfrogHttpClient) *LogErrorEventService { + return &LogErrorEventService{client: client} +} + +func (les *LogErrorEventService) SendLogErrorEvent(errorLog *ExternalErrorLog) error { + httpClientDetails := les.XscDetails.CreateHttpClientDetails() + requestContent, err := json.Marshal(errorLog) + if err != nil { + return fmt.Errorf("failed to convert POST request body's struct into JSON: %q", err) + } + url := utils.AddTrailingSlashIfNeeded(les.XscDetails.GetUrl()) + postLogErrorAPI + response, body, err := les.client.SendPost(url, requestContent, &httpClientDetails) + if err != nil { + return fmt.Errorf("failed to send POST query to '%s': %s", url, err.Error()) + } + return errorutils.CheckResponseStatusWithBody(response, body, http.StatusCreated) +}