feat(backend): save payloads
This commit is contained in:
parent
777648dedd
commit
15f67c8595
8 changed files with 2397 additions and 1481 deletions
24
backend/pkg/db/cache/messages_web.go
vendored
24
backend/pkg/db/cache/messages_web.go
vendored
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue