openreplay/backend/internal/db/datasaver/web.go
Alexander 9b75e4502f
ClickHouse support (#2830)
* feat(db): added CH support to db service

* feat(db): removed license check for CH client

* feat(db): removed fts integration

* feat(clickhouse): added config instead of direct env parsing

* feat(clickhouse): removed prev extraHandlers

* feat(clickhouse): an unified approach for data insertion to dbs

* feat(clickhouse): removed unused imports
2024-12-10 12:41:52 +01:00

146 lines
4.5 KiB
Go

package datasaver
import (
"context"
"openreplay/backend/pkg/db/postgres"
"openreplay/backend/pkg/db/types"
"openreplay/backend/pkg/messages"
"openreplay/backend/pkg/sessions"
)
func (s *saverImpl) handleWebMessage(sessCtx context.Context, session *sessions.Session, msg messages.Message) error {
switch m := msg.(type) {
case *messages.SessionStart:
return s.pg.HandleStartEvent(m)
case *messages.SessionEnd:
if err := s.pg.HandleEndEvent(m.SessionID()); err != nil {
return err
}
session, err := s.sessions.GetUpdated(m.SessionID(), true)
if err != nil {
return err
}
return s.ch.InsertWebSession(session)
case *messages.Metadata:
return s.sessions.UpdateMetadata(m.SessionID(), m.Key, m.Value)
case *messages.IssueEvent:
if m.Type == "dead_click" || m.Type == "click_rage" {
if s.tags.ShouldIgnoreTag(session.ProjectID, m.Context) {
return nil
}
}
if err := s.pg.InsertIssueEvent(session, m); err != nil {
return err
}
if err := s.sessions.UpdateIssuesStats(session.SessionID, 0, postgres.GetIssueScore(m.Type)); err != nil {
return err
}
return s.ch.InsertIssue(session, m)
case *messages.CustomIssue:
ie := &messages.IssueEvent{
Type: "custom",
Timestamp: m.Timestamp,
MessageID: m.Index,
ContextString: m.Name,
Payload: m.Payload,
}
ie.SetMeta(m.Meta())
if err := s.pg.InsertIssueEvent(session, ie); err != nil {
return err
}
return s.sessions.UpdateIssuesStats(session.SessionID, 0, postgres.GetIssueScore(ie.Type))
case *messages.UserID:
if err := s.sessions.UpdateUserID(session.SessionID, m.ID); err != nil {
return err
}
s.pg.InsertAutocompleteValue(session.SessionID, session.ProjectID, "USERID", m.ID)
return nil
case *messages.UserAnonymousID:
if err := s.sessions.UpdateAnonymousID(session.SessionID, m.ID); err != nil {
return err
}
s.pg.InsertAutocompleteValue(session.SessionID, session.ProjectID, "USERANONYMOUSID", m.ID)
return nil
case *messages.CustomEvent:
if err := s.pg.InsertWebCustomEvent(session, m); err != nil {
return err
}
return s.ch.InsertCustom(session, m)
case *messages.MouseClick:
if err := s.pg.InsertWebClickEvent(session, m); err != nil {
return err
}
if err := s.sessions.UpdateEventsStats(session.SessionID, 1, 0); err != nil {
return err
}
return s.ch.InsertWebClickEvent(session, m)
case *messages.PageEvent:
if err := s.pg.InsertWebPageEvent(session, m); err != nil {
return err
}
s.sessions.UpdateReferrer(session.SessionID, m.Referrer)
s.sessions.UpdateUTM(session.SessionID, m.URL)
if err := s.sessions.UpdateEventsStats(session.SessionID, 1, 1); err != nil {
return err
}
return s.ch.InsertWebPageEvent(session, m)
case *messages.NetworkRequest:
if err := s.pg.InsertWebNetworkRequest(session, m); err != nil {
return err
}
return s.ch.InsertRequest(session, m, session.SaveRequestPayload)
case *messages.GraphQL:
if err := s.pg.InsertWebGraphQL(session, m); err != nil {
return err
}
return s.ch.InsertGraphQL(session, m)
case *messages.JSException:
wrapper, err := types.WrapJSException(m)
if err != nil {
s.log.Warn(sessCtx, "error on wrapping JSException: %v", err)
}
if err = s.pg.InsertWebErrorEvent(session, wrapper); err != nil {
return err
}
if err := s.sessions.UpdateIssuesStats(session.SessionID, 1, 1000); err != nil {
return err
}
return s.ch.InsertWebErrorEvent(session, wrapper)
case *messages.IntegrationEvent:
if err := s.pg.InsertWebErrorEvent(session, types.WrapIntegrationEvent(m)); err != nil {
return err
}
return s.ch.InsertWebErrorEvent(session, types.WrapIntegrationEvent(m))
case *messages.InputChange:
if err := s.pg.InsertInputChangeEvent(session, m); err != nil {
return err
}
if err := s.sessions.UpdateEventsStats(session.SessionID, 1, 0); err != nil {
return err
}
return s.ch.InsertWebInputDuration(session, m)
case *messages.MouseThrashing:
if err := s.pg.InsertMouseThrashing(session, m); err != nil {
return err
}
if err := s.sessions.UpdateIssuesStats(session.SessionID, 0, 50); err != nil {
return err
}
return s.ch.InsertMouseThrashing(session, m)
case *messages.CanvasNode:
if err := s.pg.InsertCanvasNode(session, m); err != nil {
return err
}
case *messages.TagTrigger:
if err := s.pg.InsertTagTrigger(session, m); err != nil {
return err
}
case *messages.PerformanceTrackAggr:
if err := s.pg.InsertWebStatsPerformance(m); err != nil {
return err
}
return s.ch.InsertWebPerformanceTrackAggr(session, m)
}
return nil
}