change(tracker/backend): change msg format for exceptions

This commit is contained in:
sylenien 2022-10-12 12:44:05 +02:00
parent 691dd9ca57
commit 117b1aca96
12 changed files with 60 additions and 57 deletions

View file

@ -56,7 +56,7 @@ const (
MsgPageRenderTiming = 24
MsgJSException = 25
MsgJSExceptionDeprecated = 25
MsgIntegrationEvent = 26
@ -158,7 +158,7 @@ const (
MsgSessionSearch = 127
MsgExceptionWithMeta = 78
MsgJSException = 78
MsgIOSBatchMeta = 107
@ -1144,14 +1144,14 @@ func (msg *PageRenderTiming) TypeID() int {
return 24
}
type JSException struct {
type JSExceptionDeprecated struct {
message
Name string
Message string
Payload string
}
func (msg *JSException) Encode() []byte {
func (msg *JSExceptionDeprecated) Encode() []byte {
buf := make([]byte, 31+len(msg.Name)+len(msg.Message)+len(msg.Payload))
buf[0] = 25
p := 1
@ -1161,7 +1161,7 @@ func (msg *JSException) Encode() []byte {
return buf[:p]
}
func (msg *JSException) EncodeWithIndex() []byte {
func (msg *JSExceptionDeprecated) EncodeWithIndex() []byte {
encoded := msg.Encode()
if IsIOSType(msg.TypeID()) {
return encoded
@ -1172,11 +1172,11 @@ func (msg *JSException) EncodeWithIndex() []byte {
return data
}
func (msg *JSException) Decode() Message {
func (msg *JSExceptionDeprecated) Decode() Message {
return msg
}
func (msg *JSException) TypeID() int {
func (msg *JSExceptionDeprecated) TypeID() int {
return 25
}
@ -3074,7 +3074,7 @@ func (msg *SessionSearch) TypeID() int {
return 127
}
type ExceptionWithMeta struct {
type JSException struct {
message
Name string
Message string
@ -3082,7 +3082,7 @@ type ExceptionWithMeta struct {
Metadata string
}
func (msg *ExceptionWithMeta) Encode() []byte {
func (msg *JSException) Encode() []byte {
buf := make([]byte, 41+len(msg.Name)+len(msg.Message)+len(msg.Payload)+len(msg.Metadata))
buf[0] = 78
p := 1
@ -3093,7 +3093,7 @@ func (msg *ExceptionWithMeta) Encode() []byte {
return buf[:p]
}
func (msg *ExceptionWithMeta) EncodeWithIndex() []byte {
func (msg *JSException) EncodeWithIndex() []byte {
encoded := msg.Encode()
if IsIOSType(msg.TypeID()) {
return encoded
@ -3104,11 +3104,11 @@ func (msg *ExceptionWithMeta) EncodeWithIndex() []byte {
return data
}
func (msg *ExceptionWithMeta) Decode() Message {
func (msg *JSException) Decode() Message {
return msg
}
func (msg *ExceptionWithMeta) TypeID() int {
func (msg *JSException) TypeID() int {
return 78
}

View file

@ -409,9 +409,9 @@ func DecodePageRenderTiming(reader io.Reader) (Message, error) {
return msg, err
}
func DecodeJSException(reader io.Reader) (Message, error) {
func DecodeJSExceptionDeprecated(reader io.Reader) (Message, error) {
var err error = nil
msg := &JSException{}
msg := &JSExceptionDeprecated{}
if msg.Name, err = ReadString(reader); err != nil {
return nil, err
}
@ -1315,9 +1315,9 @@ func DecodeSessionSearch(reader io.Reader) (Message, error) {
return msg, err
}
func DecodeExceptionWithMeta(reader io.Reader) (Message, error) {
func DecodeJSException(reader io.Reader) (Message, error) {
var err error = nil
msg := &ExceptionWithMeta{}
msg := &JSException{}
if msg.Name, err = ReadString(reader); err != nil {
return nil, err
}
@ -1817,7 +1817,7 @@ func ReadMessage(t uint64, reader io.Reader) (Message, error) {
return DecodePageRenderTiming(reader)
case 25:
return DecodeJSException(reader)
return DecodeJSExceptionDeprecated(reader)
case 26:
return DecodeIntegrationEvent(reader)
@ -1970,7 +1970,7 @@ func ReadMessage(t uint64, reader io.Reader) (Message, error) {
return DecodeSessionSearch(reader)
case 78:
return DecodeExceptionWithMeta(reader)
return DecodeJSException(reader)
case 107:
return DecodeIOSBatchMeta(reader)

View file

@ -245,7 +245,7 @@ class PageRenderTiming(Message):
self.time_to_interactive = time_to_interactive
class JSException(Message):
class JSExceptionDeprecated(Message):
__id__ = 25
def __init__(self, name, message, payload):
@ -751,7 +751,7 @@ class SessionSearch(Message):
self.partition = partition
class ExceptionWithMeta(Message):
class JSException(Message):
__id__ = 78
def __init__(self, name, message, payload, metadata):

View file

@ -264,7 +264,7 @@ class MessageCodec(Codec):
)
if message_id == 25:
return JSException(
return JSExceptionDeprecated(
name=self.read_string(reader),
message=self.read_string(reader),
payload=self.read_string(reader)
@ -668,7 +668,7 @@ class MessageCodec(Codec):
)
if message_id == 78:
return ExceptionWithMeta(
return JSException(
name=self.read_string(reader),
message=self.read_string(reader),
payload=self.read_string(reader),

View file

@ -26,7 +26,7 @@ export const TP_MAP = {
22: "console_log",
23: "page_load_timing",
24: "page_render_timing",
25: "js_exception",
25: "js_exception_deprecated",
27: "raw_custom_event",
28: "user_id",
29: "user_anonymous_id",
@ -62,7 +62,7 @@ export const TP_MAP = {
76: "adopted_ss_add_owner",
77: "adopted_ss_remove_owner",
79: "zustand",
78: "exception_with_meta",
78: "js_exception",
90: "ios_session_start",
93: "ios_custom_event",
96: "ios_screen_changes",

View file

@ -153,7 +153,7 @@ type TrPageRenderTiming = [
timeToInteractive: number,
]
type TrJSException = [
type TrJSExceptionDeprecated = [
type: 25,
name: string,
message: string,
@ -389,7 +389,7 @@ type TrZustand = [
state: string,
]
type TrExceptionWithMeta = [
type TrJSException = [
type: 78,
name: string,
message: string,
@ -398,7 +398,7 @@ type TrExceptionWithMeta = [
]
export type TrackerMessage = TrBatchMetadata | TrPartitionedMessage | TrTimestamp | TrSetPageLocation | TrSetViewportSize | TrSetViewportScroll | TrCreateDocument | TrCreateElementNode | TrCreateTextNode | TrMoveNode | TrRemoveNode | TrSetNodeAttribute | TrRemoveNodeAttribute | TrSetNodeData | TrSetNodeScroll | TrSetInputTarget | TrSetInputValue | TrSetInputChecked | TrMouseMove | TrConsoleLog | TrPageLoadTiming | TrPageRenderTiming | TrJSException | TrRawCustomEvent | TrUserID | TrUserAnonymousID | TrMetadata | TrCSSInsertRule | TrCSSDeleteRule | TrFetch | TrProfiler | TrOTable | TrStateAction | TrRedux | TrVuex | TrMobX | TrNgRx | TrGraphQL | TrPerformanceTrack | TrResourceTiming | TrConnectionInformation | TrSetPageVisibility | TrLongTask | TrSetNodeAttributeURLBased | TrSetCSSDataURLBased | TrTechnicalInfo | TrCustomIssue | TrCSSInsertRuleURLBased | TrMouseClick | TrCreateIFrameDocument | TrAdoptedSSReplaceURLBased | TrAdoptedSSInsertRuleURLBased | TrAdoptedSSDeleteRule | TrAdoptedSSAddOwner | TrAdoptedSSRemoveOwner | TrZustand | TrExceptionWithMeta
export type TrackerMessage = TrBatchMetadata | TrPartitionedMessage | TrTimestamp | TrSetPageLocation | TrSetViewportSize | TrSetViewportScroll | TrCreateDocument | TrCreateElementNode | TrCreateTextNode | TrMoveNode | TrRemoveNode | TrSetNodeAttribute | TrRemoveNodeAttribute | TrSetNodeData | TrSetNodeScroll | TrSetInputTarget | TrSetInputValue | TrSetInputChecked | TrMouseMove | TrConsoleLog | TrPageLoadTiming | TrPageRenderTiming | TrJSExceptionDeprecated | TrRawCustomEvent | TrUserID | TrUserAnonymousID | TrMetadata | TrCSSInsertRule | TrCSSDeleteRule | TrFetch | TrProfiler | TrOTable | TrStateAction | TrRedux | TrVuex | TrMobX | TrNgRx | TrGraphQL | TrPerformanceTrack | TrResourceTiming | TrConnectionInformation | TrSetPageVisibility | TrLongTask | TrSetNodeAttributeURLBased | TrSetCSSDataURLBased | TrTechnicalInfo | TrCustomIssue | TrCSSInsertRuleURLBased | TrMouseClick | TrCreateIFrameDocument | TrAdoptedSSReplaceURLBased | TrAdoptedSSInsertRuleURLBased | TrAdoptedSSDeleteRule | TrAdoptedSSAddOwner | TrAdoptedSSRemoveOwner | TrZustand | TrJSException
export default function translate(tMsg: TrackerMessage): RawMessage | null {
switch(tMsg[0]) {

View file

@ -146,7 +146,8 @@ message 24, 'PageRenderTiming', :replayer => false do
uint 'VisuallyComplete'
uint 'TimeToInteractive'
end
message 25, 'JSException', :replayer => false do
# depricated since 4.1.6 / 1.8.2
message 25, 'JSExceptionDeprecated', :replayer => false do
string 'Name'
string 'Message'
string 'Payload'
@ -472,7 +473,7 @@ message 127, 'SessionSearch', :tracker => false, :replayer => false do
uint 'Partition'
end
message 78, 'ExceptionWithMeta', :replayer => false do
message 78, 'JSException', :replayer => false do
string 'Name'
string 'Message'
string 'Payload'

View file

@ -24,7 +24,7 @@ export declare const enum Type {
ConsoleLog = 22,
PageLoadTiming = 23,
PageRenderTiming = 24,
JSException = 25,
JSExceptionDeprecated = 25,
RawCustomEvent = 27,
UserID = 28,
UserAnonymousID = 29,
@ -58,7 +58,7 @@ export declare const enum Type {
AdoptedSSAddOwner = 76,
AdoptedSSRemoveOwner = 77,
Zustand = 79,
ExceptionWithMeta = 78,
JSException = 78,
}
@ -211,8 +211,8 @@ export type PageRenderTiming = [
/*timeToInteractive:*/ number,
]
export type JSException = [
/*type:*/ Type.JSException,
export type JSExceptionDeprecated = [
/*type:*/ Type.JSExceptionDeprecated,
/*name:*/ string,
/*message:*/ string,
/*payload:*/ string,
@ -447,8 +447,8 @@ export type Zustand = [
/*state:*/ string,
]
export type ExceptionWithMeta = [
/*type:*/ Type.ExceptionWithMeta,
export type JSException = [
/*type:*/ Type.JSException,
/*name:*/ string,
/*message:*/ string,
/*payload:*/ string,
@ -456,5 +456,5 @@ export type ExceptionWithMeta = [
]
type Message = BatchMetadata | PartitionedMessage | Timestamp | SetPageLocation | SetViewportSize | SetViewportScroll | CreateDocument | CreateElementNode | CreateTextNode | MoveNode | RemoveNode | SetNodeAttribute | RemoveNodeAttribute | SetNodeData | SetNodeScroll | SetInputTarget | SetInputValue | SetInputChecked | MouseMove | ConsoleLog | PageLoadTiming | PageRenderTiming | JSException | RawCustomEvent | UserID | UserAnonymousID | Metadata | CSSInsertRule | CSSDeleteRule | Fetch | Profiler | OTable | StateAction | Redux | Vuex | MobX | NgRx | GraphQL | PerformanceTrack | ResourceTiming | ConnectionInformation | SetPageVisibility | LongTask | SetNodeAttributeURLBased | SetCSSDataURLBased | TechnicalInfo | CustomIssue | CSSInsertRuleURLBased | MouseClick | CreateIFrameDocument | AdoptedSSReplaceURLBased | AdoptedSSInsertRuleURLBased | AdoptedSSDeleteRule | AdoptedSSAddOwner | AdoptedSSRemoveOwner | Zustand | ExceptionWithMeta
type Message = BatchMetadata | PartitionedMessage | Timestamp | SetPageLocation | SetViewportSize | SetViewportScroll | CreateDocument | CreateElementNode | CreateTextNode | MoveNode | RemoveNode | SetNodeAttribute | RemoveNodeAttribute | SetNodeData | SetNodeScroll | SetInputTarget | SetInputValue | SetInputChecked | MouseMove | ConsoleLog | PageLoadTiming | PageRenderTiming | JSExceptionDeprecated | RawCustomEvent | UserID | UserAnonymousID | Metadata | CSSInsertRule | CSSDeleteRule | Fetch | Profiler | OTable | StateAction | Redux | Vuex | MobX | NgRx | GraphQL | PerformanceTrack | ResourceTiming | ConnectionInformation | SetPageVisibility | LongTask | SetNodeAttributeURLBased | SetCSSDataURLBased | TechnicalInfo | CustomIssue | CSSInsertRuleURLBased | MouseClick | CreateIFrameDocument | AdoptedSSReplaceURLBased | AdoptedSSInsertRuleURLBased | AdoptedSSDeleteRule | AdoptedSSAddOwner | AdoptedSSRemoveOwner | Zustand | JSException
export default Message

View file

@ -281,13 +281,13 @@ export function PageRenderTiming(
]
}
export function JSException(
export function JSExceptionDeprecated(
name: string,
message: string,
payload: string,
): Messages.JSException {
): Messages.JSExceptionDeprecated {
return [
Messages.Type.JSException,
Messages.Type.JSExceptionDeprecated,
name,
message,
payload,
@ -719,14 +719,14 @@ export function Zustand(
]
}
export function ExceptionWithMeta(
export function JSException(
name: string,
message: string,
payload: string,
metadata: string,
): Messages.ExceptionWithMeta {
): Messages.JSException {
return [
Messages.Type.ExceptionWithMeta,
Messages.Type.JSException,
name,
message,
payload,

View file

@ -271,7 +271,10 @@ export default class API {
}
}
handleError = (e: Error | ErrorEvent | PromiseRejectionEvent, metadata?: Record<string, any>) => {
handleError = (
e: Error | ErrorEvent | PromiseRejectionEvent,
metadata: Record<string, any> = {},
) => {
if (this.app === null) {
return
}

View file

@ -1,6 +1,6 @@
import type App from '../app/index.js'
import type Message from '../app/messages.gen.js'
import { JSException, ExceptionWithMeta } from '../app/messages.gen.js'
import { JSException } from '../app/messages.gen.js'
import ErrorStackParser from 'error-stack-parser'
export interface Options {
@ -30,21 +30,19 @@ function getDefaultStack(e: ErrorEvent): Array<StackFrame> {
export function getExceptionMessage(
error: Error,
fallbackStack: Array<StackFrame>,
metadata?: Record<string, any>,
metadata: Record<string, any> = {},
): Message {
let stack = fallbackStack
try {
stack = ErrorStackParser.parse(error)
} catch (e) {}
const metaPresent = !!metadata
const method = metaPresent ? ExceptionWithMeta : JSException
return method(error.name, error.message, JSON.stringify(stack), JSON.stringify(metadata))
return JSException(error.name, error.message, JSON.stringify(stack), JSON.stringify(metadata))
}
export function getExceptionMessageFromEvent(
e: ErrorEvent | PromiseRejectionEvent,
context: typeof globalThis = window,
metadata?: Record<string, any>,
metadata: Record<string, any> = {},
): Message | null {
if (e instanceof ErrorEvent) {
if (e.error instanceof Error) {
@ -55,9 +53,12 @@ export function getExceptionMessageFromEvent(
name = 'Error'
message = e.message
}
const metaPresent = !!metadata
const method = metaPresent ? ExceptionWithMeta : JSException
return method(name, message, JSON.stringify(getDefaultStack(e)), JSON.stringify(metadata))
return JSException(
name,
message,
JSON.stringify(getDefaultStack(e)),
JSON.stringify(metadata),
)
}
} else if ('PromiseRejectionEvent' in context && e instanceof context.PromiseRejectionEvent) {
if (e.reason instanceof Error) {
@ -69,9 +70,7 @@ export function getExceptionMessageFromEvent(
} catch (_) {
message = String(e.reason)
}
const metaPresent = !!metadata
const method = metaPresent ? ExceptionWithMeta : JSException
return method('Unhandled Promise Rejection', message, '[]', JSON.stringify(metadata))
return JSException('Unhandled Promise Rejection', message, '[]', JSON.stringify(metadata))
}
}
return null

View file

@ -98,7 +98,7 @@ export default class MessageEncoder extends PrimitiveEncoder {
return this.uint(msg[1]) && this.uint(msg[2]) && this.uint(msg[3])
break
case Messages.Type.JSException:
case Messages.Type.JSExceptionDeprecated:
return this.string(msg[1]) && this.string(msg[2]) && this.string(msg[3])
break
@ -234,7 +234,7 @@ export default class MessageEncoder extends PrimitiveEncoder {
return this.string(msg[1]) && this.string(msg[2])
break
case Messages.Type.ExceptionWithMeta:
case Messages.Type.JSException:
return this.string(msg[1]) && this.string(msg[2]) && this.string(msg[3]) && this.string(msg[4])
break