* fix: changed sessions bucket * fix: text changes in login and signup forms * change: version number * change: config changes * fix: alerts image name * fix: alerts image name * Update README.md * chore(actions): pushing internalized to script. Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * feat(nginx): No redirection to HTTPS by default. Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * chore(deploy): optional nginx https redirect Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * fix: review fixes and other changes * fix: events modal openreplay logo * fix: stack event icon * Changes: - debugging - smtp status - session's issues - session's issue_types as array - changed Slack error message * Changes: - set chalice pull policy to always * fix(openreplay-cli): path issues. Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * fix(openreplay-cli): fix path Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * change: onboarding explore text changes * change: timeline issue pointers and static issue types * change: removed issues_types api call * connectors * Update README.md * Update README.md * Update README.md * Updating services * Update README.md * Updated alert-notification-string to chalice * Delete issues.md * Changes: - fixed connexion pool exhausted using Semaphores - fixed session-replay-url signing * Changes: - fixed connexion pool exhausted using Semaphores - fixed session-replay-url signing * Change pullPolicy to IfNotPresent * Fixed typo * Fixed typo * Fixed typos * Fixed typo * Fixed typo * Fixed typos * Fixed typos * Fixed typo * Fixed typo * Removed /ws * Update README.md * feat(nginx): increase minio upload size to 50M Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * fix(deploy): nginx custom changes are overriden in install Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * fix(nginx): deployment indentation issue Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * fix: revid filter crash * fix: onboarding links * fix: update password store new token * fix: report issue icon jira/github * fix: onboarding redirect on signup * Changes: - hardcoded S3_HOST * Changes: - changed "sourcemaps" env var to "sourcemaps_reader" - set "sourcemaps_reader" env var value * chore(script): remove logo Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * Making domain_name mandatory Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * Changes: - un-ignore *.js * feat(install): auto create jwt_secret for chalice. * docs(script): Adding Banner Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * chore(script): Remove verbose logging Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * Change: - use boto3-resource instead of boto3-client to check if file exists - changed .gitignore to allow *.js files - changed sourcemaps_reader env-var & env-var-value * fix (baxkend-ender): skip inputs with no label (technical) * Change: - changed DB structure * change: removed /flows api call * fix: skipping errorOnFetch check * Change: - changed sourcemaps_reader-nodejs script * Change: - changed sourcemaps_reader-nodejs script * fix (backend-postgres): correct autocomplete type-value * fix: slack webhooks PUT call * change: added external icon for integration doc links * fix: updated the sourcemap upload doc link * fix: link color of no sessions message * fix (frontend-player): show original domContentLoaded text values, while adjusted on timeline * fix (frontend-player): syntax * Changes: - changed requirements - changed slack add integration - added slack edit integration - removed sourcemaps_reader extra payload * Changes: - fixed sentry-issue-reporter - fixed telemetry reporter - fixed DB schema * fix(cli): fix logs flag Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * ci(deploy): Injecting domain_name Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * feat(nginx): Get real client ip Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * chore(nginx): restart on helm installation. Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * fix(deployment): respect image tags. * Changes: - changed sentry tags - changed asayer_session_id to openReplaySessionToken - EE full merge * fix: close the issue modal after creating * fix: show description in issue details modal * fix: integrate slack button redirect, and doc link * fix: code snippet conflict set back * fix: slack share channel selection * Changes: - fixed DB structure * Changes: - return full integration body on add slack * fix (integrations): ignore token expired + some logs * feat (sourcemaps-uploader): v.3.0.2 filename fix + logging arg * fix (tracker): 3.0.3 version: start before auth * fix: funnel calendar position * fix: fetch issue types * fix: missing icon blocking the session to play * change: sessions per browser widget bar height reduced * fix: github colored circles * Changes: - changed session-assignment-jira response * chore(nginx): pass x-forward-for Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * feat(chalice): included sourcemaps_reader It's not advised to run multiple processes in a single docker container. In Kubernetes we can run this as sidecar, but other platforms such as Heroku, and vanilla docker doesn't support such feature. So till we figure out better solution, this is the workaround. * chore(install): Remove sqs * feat(deployment): restart pods on installations. Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com> * Changes: - changed DB-oauth-unique constraint Co-authored-by: Shekar Siri <sshekarsiri@gmail.com> Co-authored-by: Mehdi Osman <estradino@users.noreply.github.com> Co-authored-by: KRAIEM Taha Yassine <tahayk2@gmail.com> Co-authored-by: ourvakan <hi-psi@yandex.com> Co-authored-by: ShiKhu <alex.kaminsky.11@gmail.com>
752 lines
18 KiB
Python
752 lines
18 KiB
Python
"""
|
|
Representations of Kafka messages
|
|
"""
|
|
from abc import ABC
|
|
|
|
|
|
class Message(ABC):
|
|
pass
|
|
|
|
|
|
class Timestamp(Message):
|
|
__id__ = 0
|
|
|
|
def __init__(self, timestamp):
|
|
self.timestamp = timestamp
|
|
|
|
|
|
class SessionStart(Message):
|
|
__id__ = 1
|
|
|
|
def __init__(self, timestamp, project_id, tracker_version, rev_id, user_uuid,
|
|
user_agent, user_os, user_os_version, user_browser, user_browser_version,
|
|
user_device, user_device_type, user_device_memory_size, user_device_heap_size,
|
|
user_country):
|
|
self.timestamp = timestamp
|
|
self.project_id = project_id
|
|
self.tracker_version = tracker_version
|
|
self.rev_id = rev_id
|
|
self.user_uuid = user_uuid
|
|
self.user_agent = user_agent
|
|
self.user_os = user_os
|
|
self.user_os_version = user_os_version
|
|
self.user_browser = user_browser
|
|
self.user_browser_version = user_browser_version
|
|
self.user_device = user_device
|
|
self.user_device_type = user_device_type
|
|
self.user_device_memory_size = user_device_memory_size
|
|
self.user_device_heap_size = user_device_heap_size
|
|
self.user_country = user_country
|
|
|
|
|
|
class SessionDisconnect(Message):
|
|
__id__ = 2
|
|
|
|
def __init__(self, timestamp):
|
|
self.timestamp = timestamp
|
|
|
|
|
|
class SessionEnd(Message):
|
|
__id__ = 3
|
|
__name__ = 'SessionEnd'
|
|
|
|
def __init__(self, timestamp):
|
|
self.timestamp = timestamp
|
|
|
|
|
|
class SetPageLocation(Message):
|
|
__id__ = 4
|
|
|
|
def __init__(self, url, referrer, navigation_start):
|
|
self.url = url
|
|
self.referrer = referrer
|
|
self.navigation_start = navigation_start
|
|
|
|
|
|
class SetViewportSize(Message):
|
|
__id__ = 5
|
|
|
|
def __init__(self, width, height):
|
|
self.width = width
|
|
self.height = height
|
|
|
|
|
|
class SetViewportScroll(Message):
|
|
__id__ = 6
|
|
|
|
def __init__(self, x, y):
|
|
self.x = x
|
|
self.y = y
|
|
|
|
|
|
class CreateDocument(Message):
|
|
__id__ = 7
|
|
|
|
|
|
class CreateElementNode(Message):
|
|
__id__ = 8
|
|
|
|
def __init__(self, id, parent_id, index, tag, svg):
|
|
self.id = id
|
|
self.parent_id = parent_id,
|
|
self.index = index
|
|
self.tag = tag
|
|
self.svg = svg
|
|
|
|
|
|
class CreateTextNode(Message):
|
|
__id__ = 9
|
|
|
|
def __init__(self, id, parent_id, index):
|
|
self.id = id
|
|
self.parent_id = parent_id
|
|
self.index = index
|
|
|
|
|
|
class MoveNode(Message):
|
|
__id__ = 10
|
|
|
|
def __init__(self, id, parent_id, index):
|
|
self.id = id
|
|
self.parent_id = parent_id
|
|
self.index = index
|
|
|
|
|
|
class RemoveNode(Message):
|
|
__id__ = 11
|
|
|
|
def __init__(self, id):
|
|
self.id = id
|
|
|
|
|
|
class SetNodeAttribute(Message):
|
|
__id__ = 12
|
|
|
|
def __init__(self, id, name: str, value: str):
|
|
self.id = id
|
|
self.name = name
|
|
self.value = value
|
|
|
|
|
|
class RemoveNodeAttribute(Message):
|
|
__id__ = 13
|
|
|
|
def __init__(self, id, name: str):
|
|
self.id = id
|
|
self.name = name
|
|
|
|
|
|
class SetNodeData(Message):
|
|
__id__ = 14
|
|
|
|
def __init__(self, id, data: str):
|
|
self.id = id
|
|
self.data = data
|
|
|
|
|
|
class SetCSSData(Message):
|
|
__id__ = 15
|
|
|
|
def __init__(self, id, data: str):
|
|
self.id = id
|
|
self.data = data
|
|
|
|
|
|
class SetNodeScroll(Message):
|
|
__id__ = 16
|
|
|
|
def __init__(self, id, x: int, y: int):
|
|
self.id = id
|
|
self.x = x
|
|
self.y = y
|
|
|
|
|
|
class SetInputTarget(Message):
|
|
__id__ = 17
|
|
|
|
def __init__(self, id, label: str):
|
|
self.id = id
|
|
self.label = label
|
|
|
|
|
|
class SetInputValue(Message):
|
|
__id__ = 18
|
|
|
|
def __init__(self, id, value: str, mask: int):
|
|
self.id = id
|
|
self.value = value
|
|
self.mask = mask
|
|
|
|
|
|
class SetInputChecked(Message):
|
|
__id__ = 19
|
|
|
|
def __init__(self, id, checked: bool):
|
|
self.id = id
|
|
self.checked = checked
|
|
|
|
|
|
class MouseMove(Message):
|
|
__id__ = 20
|
|
|
|
def __init__(self, x, y):
|
|
self.x = x
|
|
self.y = y
|
|
|
|
|
|
class MouseClick(Message):
|
|
__id__ = 21
|
|
|
|
def __init__(self, id, hesitation_time, label: str):
|
|
self.id = id
|
|
self.hesitation_time = hesitation_time
|
|
self.label = label
|
|
|
|
|
|
class ConsoleLog(Message):
|
|
__id__ = 22
|
|
|
|
def __init__(self, level: str, value: str):
|
|
self.level = level
|
|
self.value = value
|
|
|
|
|
|
class PageLoadTiming(Message):
|
|
__id__ = 23
|
|
|
|
def __init__(self, request_start, response_start, response_end, dom_content_loaded_event_start,
|
|
dom_content_loaded_event_end, load_event_start, load_event_end,
|
|
first_paint, first_contentful_paint):
|
|
self.request_start = request_start
|
|
self.response_start = response_start
|
|
self.response_end = response_end
|
|
self.dom_content_loaded_event_start = dom_content_loaded_event_start
|
|
self.dom_content_loaded_event_end = dom_content_loaded_event_end
|
|
self.load_event_start = load_event_start
|
|
self.load_event_end = load_event_end
|
|
self.first_paint = first_paint
|
|
self.first_contentful_paint = first_contentful_paint
|
|
|
|
|
|
class PageRenderTiming(Message):
|
|
__id__ = 24
|
|
|
|
def __init__(self, speed_index, visually_complete, time_to_interactive):
|
|
self.speed_index = speed_index
|
|
self.visually_complete = visually_complete
|
|
self.time_to_interactive = time_to_interactive
|
|
|
|
class JSException(Message):
|
|
__id__ = 25
|
|
|
|
def __init__(self, name: str, message: str, payload: str):
|
|
self.name = name
|
|
self.message = message
|
|
self.payload = payload
|
|
|
|
|
|
class RawErrorEvent(Message):
|
|
__id__ = 26
|
|
|
|
def __init__(self, timestamp, source: str, name: str, message: str,
|
|
payload: str):
|
|
self.timestamp = timestamp
|
|
self.source = source
|
|
self.name = name
|
|
self.message = message
|
|
self.payload = payload
|
|
|
|
|
|
class RawCustomEvent(Message):
|
|
__id__ = 27
|
|
|
|
def __init__(self, name: str, payload: str):
|
|
self.name = name
|
|
self.payload = payload
|
|
|
|
|
|
class UserID(Message):
|
|
__id__ = 28
|
|
|
|
def __init__(self, id: str):
|
|
self.id = id
|
|
|
|
|
|
class UserAnonymousID(Message):
|
|
__id__ = 29
|
|
|
|
def __init__(self, id: str):
|
|
self.id = id
|
|
|
|
|
|
class Metadata(Message):
|
|
__id__ = 30
|
|
|
|
def __init__(self, key: str, value: str):
|
|
self.key = key
|
|
self.value = value
|
|
|
|
|
|
class PerformanceTrack(Message):
|
|
__id__ = 49
|
|
|
|
def __init__(self, frames: int, ticks: int, total_js_heap_size,
|
|
used_js_heap_size):
|
|
self.frames = frames
|
|
self.ticks = ticks
|
|
self.total_js_heap_size = total_js_heap_size
|
|
self.used_js_heap_size = used_js_heap_size
|
|
|
|
|
|
class PageEvent(Message):
|
|
__id__ = 31
|
|
|
|
def __init__(self, message_id, timestamp, url: str, referrer: str,
|
|
loaded: bool, request_start, response_start, response_end,
|
|
dom_content_loaded_event_start, dom_content_loaded_event_end,
|
|
load_event_start, load_event_end, first_paint, first_contentful_paint,
|
|
speed_index, visually_complete, time_to_interactive):
|
|
self.message_id = message_id
|
|
self.timestamp = timestamp
|
|
self.url = url
|
|
self.referrer = referrer
|
|
self.loaded = loaded
|
|
self.request_start = request_start
|
|
self.response_start = response_start
|
|
self.response_end = response_end
|
|
self.dom_content_loaded_event_start = dom_content_loaded_event_start
|
|
self.dom_content_loaded_event_end = dom_content_loaded_event_end
|
|
self.load_event_start = load_event_start
|
|
self.load_event_end = load_event_end
|
|
self.first_paint = first_paint
|
|
self.first_contentful_paint = first_contentful_paint
|
|
self.speed_index = speed_index
|
|
self.visually_complete = visually_complete
|
|
self.time_to_interactive = time_to_interactive
|
|
|
|
|
|
class InputEvent(Message):
|
|
__id__ = 32
|
|
|
|
def __init__(self, message_id, timestamp, value: str, value_masked: bool, label: str):
|
|
self.message_id = message_id
|
|
self.timestamp = timestamp
|
|
self.value = value
|
|
self.value_masked = value_masked
|
|
self.label = label
|
|
|
|
|
|
class ClickEvent(Message):
|
|
__id__ = 33
|
|
|
|
def __init__(self, message_id, timestamp, hesitation_time, label: str):
|
|
self.message_id = message_id
|
|
self.timestamp = timestamp
|
|
self.hesitation_time = hesitation_time
|
|
self.label = label
|
|
|
|
|
|
class ErrorEvent(Message):
|
|
__id__ = 34
|
|
|
|
def __init__(self, message_id, timestamp, source: str, name: str, message: str,
|
|
payload: str):
|
|
self.message_id = message_id
|
|
self.timestamp = timestamp
|
|
self.source = source
|
|
self.name = name
|
|
self.message = message
|
|
self.payload = payload
|
|
|
|
|
|
class ResourceEvent(Message):
|
|
__id__ = 35
|
|
|
|
def __init__(self, message_id, timestamp, duration, ttfb, header_size, encoded_body_size,
|
|
decoded_body_size, url: str, type: str, success: bool, method: str, status):
|
|
self.message_id = message_id
|
|
self.timestamp = timestamp
|
|
self.duration = duration
|
|
self.ttfb = ttfb
|
|
self.header_size = header_size
|
|
self.encoded_body_size = encoded_body_size
|
|
self.decoded_body_size = decoded_body_size
|
|
self.url = url
|
|
self.type = type
|
|
self.success = success
|
|
self.method = method
|
|
self.status = status
|
|
|
|
|
|
class CustomEvent(Message):
|
|
__id__ = 36
|
|
|
|
def __init__(self, message_id, timestamp, name: str, payload: str):
|
|
self.message_id = message_id
|
|
self.timestamp = timestamp
|
|
self.name = name
|
|
self.payload = payload
|
|
|
|
|
|
class CSSInsertRule(Message):
|
|
__id__ = 37
|
|
|
|
def __init__(self, id, rule: str, index):
|
|
self.id = id
|
|
self.rule = rule
|
|
self.index = index
|
|
|
|
|
|
class CSSDeleteRule(Message):
|
|
__id__ = 38
|
|
|
|
def __init__(self, id, index):
|
|
self.id = id
|
|
self.index = index
|
|
|
|
|
|
class Fetch(Message):
|
|
__id__ = 39
|
|
|
|
def __init__(self, method: str, url: str, request: str, response: str, status,
|
|
timestamp, duration):
|
|
self.method = method
|
|
self.url = url
|
|
self.request = request
|
|
self.response = response
|
|
self.status = status
|
|
self.timestamp = timestamp
|
|
self.duration = duration
|
|
|
|
|
|
class Profiler(Message):
|
|
__id__ = 40
|
|
|
|
def __init__(self, name: str, duration, args: str, result: str):
|
|
self.name = name
|
|
self.duration = duration
|
|
self.args = args
|
|
self.result = result
|
|
|
|
|
|
class OTable(Message):
|
|
__id__ = 41
|
|
|
|
def __init__(self, key: str, value: str):
|
|
self.key = key
|
|
self.value = value
|
|
|
|
|
|
class StateAction(Message):
|
|
__id__ = 42
|
|
|
|
def __init__(self, type: str):
|
|
self.type = type
|
|
|
|
|
|
class StateActionEvent(Message):
|
|
__id__ = 43
|
|
|
|
def __init__(self, message_id, timestamp, type: str):
|
|
self.message_id = message_id
|
|
self.timestamp = timestamp
|
|
self.type = type
|
|
|
|
|
|
class Redux(Message):
|
|
__id__ = 44
|
|
|
|
def __init__(self, action: str, state: str, duration):
|
|
self.action = action
|
|
self.state = state
|
|
self.duration = duration
|
|
|
|
|
|
class Vuex(Message):
|
|
__id__ = 45
|
|
|
|
def __init__(self, mutation: str, state: str):
|
|
self.mutation = mutation
|
|
self.state = state
|
|
|
|
|
|
class MobX(Message):
|
|
__id__ = 46
|
|
|
|
def __init__(self, type: str, payload: str):
|
|
self.type = type
|
|
self.payload = payload
|
|
|
|
|
|
class NgRx(Message):
|
|
__id__ = 47
|
|
|
|
def __init__(self, action: str, state: str, duration):
|
|
self.action = action
|
|
self.state = state
|
|
self.duration = duration
|
|
|
|
|
|
class GraphQL(Message):
|
|
__id__ = 48
|
|
|
|
def __init__(self, operation_kind: str, operation_name: str,
|
|
variables: str, response: str):
|
|
self.operation_kind = operation_kind
|
|
self.operation_name = operation_name
|
|
self.variables = variables
|
|
self.response = response
|
|
|
|
|
|
class PerformanceTrack(Message):
|
|
__id__ = 49
|
|
|
|
def __init__(self, frames: int, ticks: int,
|
|
total_js_heap_size, used_js_heap_size):
|
|
self.frames = frames
|
|
self.ticks = ticks
|
|
self.total_js_heap_size = total_js_heap_size
|
|
self.used_js_heap_size = used_js_heap_size
|
|
|
|
|
|
class GraphQLEvent(Message):
|
|
__id__ = 50
|
|
|
|
def __init__(self, message_id, timestamp, name: str):
|
|
self.message_id = message_id
|
|
self.timestamp = timestamp
|
|
self.name = name
|
|
|
|
|
|
class DomDrop(Message):
|
|
__id__ = 52
|
|
|
|
def __init__(self, timestamp):
|
|
self.timestamp = timestamp
|
|
|
|
|
|
class ResourceTiming(Message):
|
|
__id__ = 53
|
|
|
|
def __init__(self, timestamp, duration, ttfb, header_size, encoded_body_size,
|
|
decoded_body_size, url, initiator):
|
|
self.timestamp = timestamp
|
|
self.duration = duration
|
|
self.ttfb = ttfb
|
|
self.header_size = header_size
|
|
self.encoded_body_size = encoded_body_size
|
|
self.decoded_body_size = decoded_body_size
|
|
self.url = url
|
|
self.initiator = initiator
|
|
|
|
|
|
class ConnectionInformation(Message):
|
|
__id__ = 54
|
|
|
|
def __init__(self, downlink, type: str):
|
|
self.downlink = downlink
|
|
self.type = type
|
|
|
|
|
|
class SetPageVisibility(Message):
|
|
__id__ = 55
|
|
|
|
def __init__(self, hidden: bool):
|
|
self.hidden = hidden
|
|
|
|
|
|
class PerformanceTrackAggr(Message):
|
|
__id__ = 56
|
|
|
|
def __init__(self, timestamp_start, timestamp_end, min_fps, avg_fps,
|
|
max_fps, min_cpu, avg_cpu, max_cpu,
|
|
min_total_js_heap_size, avg_total_js_heap_size,
|
|
max_total_js_heap_size, min_used_js_heap_size,
|
|
avg_used_js_heap_size, max_used_js_heap_size
|
|
):
|
|
self.timestamp_start = timestamp_start
|
|
self.timestamp_end = timestamp_end
|
|
self.min_fps = min_fps
|
|
self.avg_fps = avg_fps
|
|
self.max_fps = max_fps
|
|
self.min_cpu = min_cpu
|
|
self.avg_cpu = avg_cpu
|
|
self.max_cpu = max_cpu
|
|
self.min_total_js_heap_size = min_total_js_heap_size
|
|
self.avg_total_js_heap_size = avg_total_js_heap_size
|
|
self.max_total_js_heap_size = max_total_js_heap_size
|
|
self.min_used_js_heap_size = min_used_js_heap_size
|
|
self.avg_used_js_heap_size = avg_used_js_heap_size
|
|
self.max_used_js_heap_size = max_used_js_heap_size
|
|
|
|
|
|
class LongTask(Message):
|
|
__id__ = 59
|
|
|
|
def __init__(self, timestamp, duration, context, container_type, container_src: str,
|
|
container_id: str, container_name: str):
|
|
self.timestamp = timestamp
|
|
self.duration = duration
|
|
self.context = context
|
|
self.container_type = container_type
|
|
self.container_src = container_src
|
|
self.container_id = container_id
|
|
self.container_name = container_name
|
|
|
|
|
|
class SetNodeURLBasedAttribute(Message):
|
|
__id__ = 60
|
|
|
|
def __init__(self, id, name: str, value: str, base_url: str):
|
|
self.id = id
|
|
self.name = name
|
|
self.value = value
|
|
self.base_url = base_url
|
|
|
|
|
|
class SetStyleData(Message):
|
|
__id__ = 61
|
|
|
|
def __init__(self, id, data: str, base_url: str):
|
|
self.id = id
|
|
self.data = data
|
|
self.base_url = base_url
|
|
|
|
|
|
class IssueEvent(Message):
|
|
__id__ = 62
|
|
|
|
def __init__(self, message_id, timestamp, type: str, context_string: str,
|
|
context: str, payload: str):
|
|
self.message_id = message_id
|
|
self.timestamp = timestamp
|
|
self.type = type
|
|
self.context_string = context_string
|
|
self.context = context
|
|
self.payload = payload
|
|
|
|
|
|
class TechnicalInfo(Message):
|
|
__id__ = 63
|
|
|
|
def __init__(self, type: str, value: str):
|
|
self.type = type
|
|
self.value = value
|
|
|
|
|
|
class CustomIssue(Message):
|
|
__id__ = 64
|
|
|
|
def __init__(self, name: str, payload: str):
|
|
self.name = name
|
|
self.payload = payload
|
|
|
|
|
|
class PageClose(Message):
|
|
__id__ = 65
|
|
|
|
|
|
class IOSSessionStart(Message):
|
|
__id__ = 90
|
|
|
|
def __init__(self, timestamp, project_id, tracker_version: str,
|
|
rev_id: str, user_uuid: str, user_os: str, user_os_version: str,
|
|
user_device: str, user_device_type: str, user_country: str):
|
|
self.timestamp = timestamp
|
|
self.project_id = project_id
|
|
self.tracker_version = tracker_version
|
|
self.rev_id = rev_id
|
|
self.user_uuid = user_uuid
|
|
self.user_os = user_os
|
|
self.user_os_version = user_os_version
|
|
self.user_device = user_device
|
|
self.user_device_type = user_device_type
|
|
self.user_country = user_country
|
|
|
|
|
|
class IOSSessionEnd(Message):
|
|
__id__ = 91
|
|
|
|
def __init__(self, timestamp):
|
|
self.timestamp = timestamp
|
|
|
|
|
|
class IOSMetadata(Message):
|
|
__id__ = 92
|
|
|
|
def __init__(self, timestamp, length, key: str, value: str):
|
|
self.timestamp = timestamp
|
|
self.length = length
|
|
self.key = key
|
|
self.value = value
|
|
|
|
|
|
class IOSUserID(Message):
|
|
__id__ = 94
|
|
|
|
def __init__(self, timestamp, length, value: str):
|
|
self.timestamp = timestamp
|
|
self.length = length
|
|
self.value = value
|
|
|
|
|
|
class IOSUserAnonymousID(Message):
|
|
__id__ = 95
|
|
|
|
def __init__(self, timestamp, length, value: str):
|
|
self.timestamp = timestamp
|
|
self.length = length
|
|
self.value = value
|
|
|
|
|
|
class IOSScreenLeave(Message):
|
|
__id__ = 99
|
|
|
|
def __init__(self, timestamp, length, title: str, view_name: str):
|
|
self.timestamp = timestamp
|
|
self.length = length
|
|
self.title = title
|
|
self.view_name = view_name
|
|
|
|
|
|
class IOSLog(Message):
|
|
__id__ = 103
|
|
|
|
def __init__(self, timestamp, length, severity: str, content: str):
|
|
self.timestamp = timestamp
|
|
self.length = length
|
|
self.severity = severity
|
|
self.content = content
|
|
|
|
|
|
class IOSInternalError(Message):
|
|
__id__ = 104
|
|
|
|
def __init__(self, timestamp, length, content: str):
|
|
self.timestamp = timestamp
|
|
self.length = length
|
|
self.content = content
|
|
|
|
|
|
class IOSPerformanceAggregated(Message):
|
|
__id__ = 110
|
|
|
|
def __init__(self, timestamp_start, timestamp_end, min_fps, avg_fps,
|
|
max_fps, min_cpu, avg_cpu, max_cpu,
|
|
min_memory, avg_memory, max_memory,
|
|
min_battery, avg_battery, max_battery
|
|
):
|
|
self.timestamp_start = timestamp_start
|
|
self.timestamp_end = timestamp_end
|
|
self.min_fps = min_fps
|
|
self.avg_fps = avg_fps
|
|
self.max_fps = max_fps
|
|
self.min_cpu = min_cpu
|
|
self.avg_cpu = avg_cpu
|
|
self.max_cpu = max_cpu
|
|
self.min_memory = min_memory
|
|
self.avg_memory = avg_memory
|
|
self.max_memory = max_memory
|
|
self.min_battery = min_battery
|
|
self.avg_battery = avg_battery
|
|
self.max_battery = max_battery
|