openreplay/backend/internal/db/datasaver/fts.go
Alexander b9c30e256d
FTS support (quickwit) (#703)
* feat(backend): sending fetch, page and graphQL events to quickwit topic
2022-08-30 14:13:55 +02:00

123 lines
3.8 KiB
Go

package datasaver
import (
"encoding/json"
"log"
"openreplay/backend/pkg/messages"
)
type FetchEventFTS struct {
Method string `json:"method"`
URL string `json:"url"`
Request string `json:"request"`
Response string `json:"response"`
Status uint64 `json:"status"`
Timestamp uint64 `json:"timestamp"`
Duration uint64 `json:"duration"`
}
type PageEventFTS struct {
MessageID uint64 `json:"message_id"`
Timestamp uint64 `json:"timestamp"`
URL string `json:"url"`
Referrer string `json:"referrer"`
Loaded bool `json:"loaded"`
RequestStart uint64 `json:"request_start"`
ResponseStart uint64 `json:"response_start"`
ResponseEnd uint64 `json:"response_end"`
DomContentLoadedEventStart uint64 `json:"dom_content_loaded_event_start"`
DomContentLoadedEventEnd uint64 `json:"dom_content_loaded_event_end"`
LoadEventStart uint64 `json:"load_event_start"`
LoadEventEnd uint64 `json:"load_event_end"`
FirstPaint uint64 `json:"first_paint"`
FirstContentfulPaint uint64 `json:"first_contentful_paint"`
SpeedIndex uint64 `json:"speed_index"`
VisuallyComplete uint64 `json:"visually_complete"`
TimeToInteractive uint64 `json:"time_to_interactive"`
}
type GraphQLEventFTS struct {
OperationKind string `json:"operation_kind"`
OperationName string `json:"operation_name"`
Variables string `json:"variables"`
Response string `json:"response"`
}
func (s *Saver) sendToFTS(msg messages.Message, sessionID uint64) {
// Skip, if FTS is disabled
if s.producer == nil {
return
}
var (
event []byte
err error
)
switch m := msg.(type) {
// Common
case *messages.Fetch:
event, err = json.Marshal(FetchEventFTS{
Method: m.Method,
URL: m.URL,
Request: m.Request,
Response: m.Response,
Status: m.Status,
Timestamp: m.Timestamp,
Duration: m.Duration,
})
case *messages.FetchEvent:
event, err = json.Marshal(FetchEventFTS{
Method: m.Method,
URL: m.URL,
Request: m.Request,
Response: m.Response,
Status: m.Status,
Timestamp: m.Timestamp,
Duration: m.Duration,
})
case *messages.PageEvent:
event, err = json.Marshal(PageEventFTS{
MessageID: m.MessageID,
Timestamp: m.Timestamp,
URL: m.URL,
Referrer: m.Referrer,
Loaded: m.Loaded,
RequestStart: m.RequestStart,
ResponseStart: m.ResponseStart,
ResponseEnd: m.ResponseEnd,
DomContentLoadedEventStart: m.DomContentLoadedEventStart,
DomContentLoadedEventEnd: m.DomContentLoadedEventEnd,
LoadEventStart: m.LoadEventStart,
LoadEventEnd: m.LoadEventEnd,
FirstPaint: m.FirstPaint,
FirstContentfulPaint: m.FirstContentfulPaint,
SpeedIndex: m.SpeedIndex,
VisuallyComplete: m.VisuallyComplete,
TimeToInteractive: m.TimeToInteractive,
})
case *messages.GraphQL:
event, err = json.Marshal(GraphQLEventFTS{
OperationKind: m.OperationKind,
OperationName: m.OperationName,
Variables: m.Variables,
Response: m.Response,
})
case *messages.GraphQLEvent:
event, err = json.Marshal(GraphQLEventFTS{
OperationKind: m.OperationKind,
OperationName: m.OperationName,
Variables: m.Variables,
Response: m.Response,
})
}
if err != nil {
log.Printf("can't marshal json for quickwit: %s", err)
} else {
if len(event) > 0 {
if err := s.producer.Produce("quickwit", sessionID, event); err != nil {
log.Printf("can't send event to quickwit: %s", err)
}
}
}
}