feat(backend): save payloads

This commit is contained in:
ShiKhu 2022-03-06 19:09:02 +01:00
parent 777648dedd
commit 15f67c8595
8 changed files with 2397 additions and 1481 deletions

View file

@ -53,3 +53,27 @@ func (c *PGCache) InsertWebErrorEvent(sessionID uint64, e *ErrorEvent) error {
session.ErrorsCount += 1
return nil
}
func (c *PGCache) InsertWebFetchEvent(sessionID uint64, e *FetchEvent) error {
session, err := c.GetSession(sessionID)
if err != nil {
return err
}
project, err := c.GetProject(session.ProjectID)
if err != nil {
return err
}
return c.Conn.InsertWebFetchEvent(sessionID, project.SaveRequestPayloads, e)
}
func (c *PGCache) InsertWebGraphQLEvent(sessionID uint64, e *GraphQLEvent) error {
session, err := c.GetSession(sessionID)
if err != nil {
return err
}
project, err := c.GetProject(session.ProjectID)
if err != nil {
return err
}
return c.Conn.InsertWebGraphQLEvent(sessionID, project.SaveRequestPayloads, e)
}

View file

@ -39,19 +39,19 @@ func (conn *Conn) InsertWebUserAnonymousID(sessionID uint64, userAnonymousID *Us
return err
}
func (conn *Conn) InsertWebResourceEvent(sessionID uint64, e *ResourceEvent) error {
if e.Type != "fetch" {
return nil
}
err := conn.InsertRequest(sessionID, e.Timestamp,
e.MessageID,
e.URL, e.Duration, e.Success,
)
if err == nil {
conn.insertAutocompleteValue(sessionID, "REQUEST", url.DiscardURLQuery(e.URL))
}
return err
}
// func (conn *Conn) InsertWebResourceEvent(sessionID uint64, e *ResourceEvent) error {
// if e.Type != "fetch" {
// return nil
// }
// err := conn.InsertRequest(sessionID, e.Timestamp,
// e.MessageID,
// e.URL, e.Duration, e.Success,
// )
// if err == nil {
// conn.insertAutocompleteValue(sessionID, "REQUEST", url.DiscardURLQuery(e.URL))
// }
// return err
// }
// TODO: fix column "dom_content_loaded_event_end" of relation "pages"
func (conn *Conn) InsertWebPageEvent(sessionID uint64, e *PageEvent) error {
@ -203,3 +203,50 @@ func (conn *Conn) InsertWebErrorEvent(sessionID uint64, projectID uint32, e *Err
}
return tx.commit()
}
func (conn *Conn) InsertWebFetchEvent(sessionID uint64, savePayload bool, e *FetchEvent) error {
var request, response *string
if savePayload {
request = &e.Request
response = &e.Response
}
conn.insertAutocompleteValue(sessionID, "REQUEST", url.DiscardURLQuery(e.URL))
return conn.batchQueue(sessionID, `
INSERT INTO events_common.requests (
session_id, timestamp,
seq_index, url, duration, success,
request_body, response_body, status_code, method
) VALUES (
$1, $2,
$3, $4, $5, $6,
$7, $8, $9, NULLIF($10, '')
)`,
sessionID, e.Timestamp,
getSqIdx(e.MessageID), e.URL, e.Duration, e.Status < 400,
request, response, e.Status, url.EnsureMethod(e.Method),
)
}
func (conn *Conn) InsertWebGraphQLEvent(sessionID uint64, savePayload bool, e *GraphQLEvent) error {
var request, response *string
if savePayload {
request = &e.Variables
response = &e.Response
}
conn.insertAutocompleteValue(sessionID, "GRAPHQL", e.OperationName)
return conn.batchQueue(sessionID, `
INSERT INTO events_common.requests (
session_id, timestamp, message_id,
name,
request_body, response_body
) VALUES (
$1, $2, $3,
$4,
$5, $6
)`,
sessionID, e.Timestamp, e.MessageID,
e.OperationName,
request, response,
)
}

View file

@ -7,12 +7,12 @@ import (
func (conn *Conn) GetProjectByKey(projectKey string) (*Project, error) {
p := &Project{ProjectKey: projectKey}
if err := conn.queryRow(`
SELECT max_session_duration, sample_rate, project_id
SELECT max_session_duration, sample_rate, project_id, save_request_payloads
FROM projects
WHERE project_key=$1 AND active = true
`,
projectKey,
).Scan(&p.MaxSessionDuration, &p.SampleRate, &p.ProjectID); err != nil {
).Scan(&p.MaxSessionDuration, &p.SampleRate, &p.ProjectID, &p.SaveRequestPayloads); err != nil {
return nil, err
}
return p, nil

View file

@ -3,20 +3,21 @@ package types
import "log"
type Project struct {
ProjectID uint32
ProjectKey string
MaxSessionDuration int64
SampleRate byte
Metadata1 *string
Metadata2 *string
Metadata3 *string
Metadata4 *string
Metadata5 *string
Metadata6 *string
Metadata7 *string
Metadata8 *string
Metadata9 *string
Metadata10 *string
ProjectID uint32
ProjectKey string
MaxSessionDuration int64
SampleRate byte
SaveRequestPayloads bool
Metadata1 *string
Metadata2 *string
Metadata3 *string
Metadata4 *string
Metadata5 *string
Metadata6 *string
Metadata7 *string
Metadata8 *string
Metadata9 *string
Metadata10 *string
}
func (p *Project) GetMetadataNo(key string) uint {

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -30,12 +30,16 @@ func insertMessage(sessionID uint64, msg Message) error {
case *InputEvent:
return pg.InsertWebInputEvent(sessionID, m)
// Unique Web messages
case *ResourceEvent:
return pg.InsertWebResourceEvent(sessionID, m)
// case *ResourceEvent:
// return pg.InsertWebResourceEvent(sessionID, m)
case *PageEvent:
return pg.InsertWebPageEvent(sessionID, m)
case *ErrorEvent:
return pg.InsertWebErrorEvent(sessionID, m)
case *FetchEvent:
return pg.InsertWebFetchEvent(sessionID, m)
case *GraphQLEvent:
return pg.InsertWebGraphQLEvent(sessionID, m)
// IOS
case *IOSSessionStart:

View file

@ -244,15 +244,24 @@ func (b *builder) handleMessage(message Message, messageID uint64) {
Payload: msg.Payload,
})
case *Fetch:
b.appendReadyMessage(&ResourceEvent{
b.appendReadyMessage(&FetchEvent{
MessageID: messageID,
Timestamp: msg.Timestamp,
Duration: msg.Duration,
URL: msg.URL,
Type: "fetch",
Success: msg.Status < 300,
Method: msg.Method,
URL: msg.URL,
Request: msg.Request,
Response: msg.Response,
Status: msg.Status,
Duration: msg.Duration,
})
case *GraphQL:
b.appendReadyMessage(&GraphQLEvent{
MessageID: messageID,
Timestamp: b.timestamp,
OperationKind: msg.OperationKind,
OperationName: msg.OperationName,
Variables: msg.Variables,
Response: msg.Response,
})
case *StateAction:
b.appendReadyMessage(&StateActionEvent{
@ -260,12 +269,6 @@ func (b *builder) handleMessage(message Message, messageID uint64) {
Timestamp: b.timestamp,
Type: msg.Type,
})
case *GraphQL:
b.appendReadyMessage(&GraphQLEvent{
MessageID: messageID,
Timestamp: b.timestamp,
Name: msg.OperationName,
})
case *CreateElementNode,
*CreateTextNode:
b.ddDetector.HandleNodeCreation()