* feat(backend): small refactoring in integrations * feat(backend): ignore context timeout error
110 lines
2.2 KiB
Go
110 lines
2.2 KiB
Go
package clients
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"openreplay/backend/pkg/integrations/model"
|
|
"openreplay/backend/pkg/messages"
|
|
"sync"
|
|
)
|
|
|
|
type requester interface {
|
|
Request(*client) error
|
|
}
|
|
|
|
type client struct {
|
|
requester
|
|
requestData *model.RequestInfo
|
|
integration *model.Integration
|
|
mux sync.Mutex
|
|
updateChan chan<- model.Integration
|
|
evChan chan<- *SessionErrorEvent
|
|
errChan chan<- error
|
|
}
|
|
|
|
type SessionErrorEvent struct {
|
|
SessionID uint64
|
|
Token string
|
|
*messages.IntegrationEvent
|
|
}
|
|
|
|
type ClientMap map[string]*client
|
|
|
|
func NewClient(i *model.Integration, updateChan chan<- model.Integration, evChan chan<- *SessionErrorEvent, errChan chan<- error) (*client, error) {
|
|
ri, err := i.GetRequestInfo()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
c := &client{
|
|
evChan: evChan,
|
|
errChan: errChan,
|
|
updateChan: updateChan,
|
|
requestData: ri,
|
|
}
|
|
return c, nil
|
|
}
|
|
|
|
func (c *client) Update(i *model.Integration) error {
|
|
var r requester
|
|
switch i.Provider {
|
|
case "bugsnag":
|
|
r = new(bugsnag)
|
|
case "cloudwatch":
|
|
r = new(cloudwatch)
|
|
case "datadog":
|
|
r = new(datadog)
|
|
case "elasticsearch":
|
|
r = new(elasticsearch)
|
|
case "newrelic":
|
|
r = new(newrelic)
|
|
case "rollbar":
|
|
r = new(rollbar)
|
|
case "sentry":
|
|
r = new(sentry)
|
|
case "stackdriver":
|
|
r = new(stackdriver)
|
|
case "sumologic":
|
|
r = new(sumologic)
|
|
}
|
|
if err := json.Unmarshal(i.Options, r); err != nil {
|
|
return err
|
|
}
|
|
|
|
c.mux.Lock()
|
|
defer c.mux.Unlock()
|
|
|
|
c.integration = i
|
|
c.requester = r
|
|
return nil
|
|
}
|
|
|
|
func (c *client) handleError(err error) {
|
|
c.errChan <- fmt.Errorf("%v | Integration: %v", err, *c.integration)
|
|
}
|
|
|
|
func (c *client) Request() {
|
|
c.mux.Lock()
|
|
defer c.mux.Unlock()
|
|
|
|
if !c.requestData.CanAttempt() {
|
|
return
|
|
}
|
|
c.requestData.UpdateLastAttempt()
|
|
|
|
err := c.requester.Request(c)
|
|
if err != nil {
|
|
c.requestData.Inc()
|
|
c.handleError(fmt.Errorf("ERRROR L139, err: %s", err))
|
|
} else {
|
|
c.requestData.Reset()
|
|
}
|
|
|
|
rd, err := c.requestData.Encode()
|
|
if err != nil {
|
|
c.handleError(err)
|
|
}
|
|
// RequestData is a byte array (pointer-like type), but it's replacement
|
|
// won't affect the previous value sent by channel
|
|
c.integration.RequestData = rd
|
|
c.updateChan <- *c.integration
|
|
}
|