openreplay/backend/pkg/integrations/clients/datadog.go
Alexander 30a69893bb
New backend logs integrations (#2717)
* feat(integrations): new version of backend integrations

* feat(integrations): added ingress rule

* feat(integrations): fixed a port number

* feat(integrations): enabled ingress in values.yaml

* feat(integrations): added startup log

* feat(integrations): added extra logger for 3 of 4 backend logs integrations.

* feat(integrations): removed a logs loop call

* feat(integrations): fixed a table name

* feat(integrations): disabled extra logger

* feat(integrations): made extra logger as an option

* feat(integrations): changed contentType for logs file

* feat(integrations): bug fix

* feat(integrations): struct/string config support for datadog provider

* feat(integrations): map config support for datadog provider

* feat(integrations): removed unnecessary transformation

* feat(integrations): fixed datadog and sentry response format

* feat(integrations): added correct creds parser for sentry provider

* feat(integrations): removed unnecessary return statement

* feat(integrations): added correct creds parser for elastic search

* feat(integrations): changed elastic to elasticsearch

* feat(integrations): added correct creds parser for dynatrace

* feat(integrations): fixed an issue in query request for elasticsearch provider

* feat(integrations): made extra logger configurable by env var

* feat(integrations): removed debug logs
2024-10-31 15:28:38 +01:00

79 lines
2.2 KiB
Go

package clients
import (
"context"
"encoding/json"
"fmt"
"github.com/DataDog/datadog-api-client-go/v2/api/datadog"
"github.com/DataDog/datadog-api-client-go/v2/api/datadogV2"
)
type dataDogClient struct{}
func NewDataDogClient() Client {
return &dataDogClient{}
}
type datadogConfig struct {
Site string `json:"site"`
ApiKey string `json:"api_key"`
AppKey string `json:"app_key"`
}
func (d *dataDogClient) FetchSessionData(credentials interface{}, sessionID uint64) (interface{}, error) {
cfg, ok := credentials.(datadogConfig)
if !ok {
// Not a struct, will try to parse as JSON string
strCfg, ok := credentials.(map[string]interface{})
if !ok {
return nil, fmt.Errorf("invalid credentials, got: %+v", credentials)
}
cfg = datadogConfig{}
if site, ok := strCfg["site"].(string); ok {
cfg.Site = site
}
if apiKey, ok := strCfg["api_key"].(string); ok {
cfg.ApiKey = apiKey
}
if appKey, ok := strCfg["app_key"].(string); ok {
cfg.AppKey = appKey
}
}
body := datadogV2.LogsListRequest{
Filter: &datadogV2.LogsQueryFilter{
Indexes: []string{
"main",
},
},
Sort: datadogV2.LOGSSORT_TIMESTAMP_ASCENDING.Ptr(),
Page: &datadogV2.LogsListRequestPage{
Limit: datadog.PtrInt32(1),
},
}
if sessionID != 0 {
body.Filter.Query = datadog.PtrString(fmt.Sprintf("openReplaySession.id=%d", sessionID))
body.Page.Limit = datadog.PtrInt32(1000)
}
ctx := context.WithValue(context.Background(), datadog.ContextServerVariables, map[string]string{"site": cfg.Site})
ctx = context.WithValue(ctx, datadog.ContextAPIKeys, map[string]datadog.APIKey{
"apiKeyAuth": {Key: cfg.ApiKey},
"appKeyAuth": {Key: cfg.AppKey},
})
configuration := datadog.NewConfiguration()
apiClient := datadog.NewAPIClient(configuration)
api := datadogV2.NewLogsApi(apiClient)
resp, r, err := api.ListLogs(ctx, *datadogV2.NewListLogsOptionalParameters().WithBody(body))
if err != nil {
fmt.Printf("error when calling `LogsApi.ListLogs`: %v", err)
fmt.Printf("full HTTP response: %v\n", r)
}
logs := resp.Data
if logs == nil || len(logs) == 0 {
return nil, fmt.Errorf("no logs found")
}
responseContent, _ := json.Marshal(logs)
return responseContent, nil
}