def load_data( platform, default=None, sample_name=None, timestamp=None, start_timestamp=None, trace=None, span_id=None, spans=None, ): # NOTE: Before editing this data, make sure you understand the context # in which its being used. It is NOT only used for local development and # has production consequences. # * bin/load-mocks to generate fake data for local testing # * When a new project is created, a fake event is generated as a "starter" # event so it's not an empty project. # * When a user clicks Test Configuration from notification plugin settings page, # a fake event is generated to go through the pipeline. data = None language = None platform_data = INTEGRATION_ID_TO_PLATFORM_DATA.get(platform) if platform_data is not None and platform_data["type"] != "language": language = platform_data["language"] samples_root = os.path.join(DATA_ROOT, "samples") all_samples = {f for f in os.listdir(samples_root) if f.endswith(".json")} for platform in (platform, language, default): if not platform: continue # Verify by checking if the file is within our folder explicitly # avoids being able to have a name that invokes traversing directories. json_path = f"{platform}.json" if json_path not in all_samples: continue if not sample_name: try: sample_name = INTEGRATION_ID_TO_PLATFORM_DATA[platform]["name"] except KeyError: pass # XXX: At this point, it's assumed that `json_path` was safely found # within `samples_root` due to the check above and cannot traverse # into paths. with open(os.path.join(samples_root, json_path)) as fp: data = json.load(fp) break if data is None: return data = CanonicalKeyDict(data) if platform in ("csp", "hkpk", "expectct", "expectstaple"): return data # Generate a timestamp in the present. if timestamp is None: timestamp = timezone.now() else: timestamp = timestamp.replace(tzinfo=pytz.utc) data.setdefault("timestamp", to_timestamp(timestamp)) if data.get("type") == "transaction": if start_timestamp is None: start_timestamp = timestamp - timedelta(seconds=3) else: start_timestamp = start_timestamp.replace(tzinfo=pytz.utc) data["start_timestamp"] = to_timestamp(start_timestamp) if trace is None: trace = uuid4().hex if span_id is None: span_id = uuid4().hex[:16] for tag in data["tags"]: if tag[0] == "trace": tag[1] = trace elif tag[0] == "trace.span": tag[1] = span_id data["contexts"]["trace"]["trace_id"] = trace data["contexts"]["trace"]["span_id"] = span_id if spans: data["spans"] = spans for span in data.get("spans", []): # Use data to generate span timestamps consistently and based # on event timestamp duration = span.get("data", {}).get("duration", 10.0) offset = span.get("data", {}).get("offset", 0) # Span doesn't have a parent, make it the transaction if span.get("parent_span_id") is None: span["parent_span_id"] = span_id if span.get("span_id") is None: span["span_id"] = uuid4().hex[:16] span_start = data["start_timestamp"] + offset span["trace_id"] = trace span.setdefault("start_timestamp", span_start) span.setdefault("timestamp", span_start + duration) measurements = data.get("measurements") if measurements: measurement_markers = {} for key, entry in measurements.items(): if key in ["fp", "fcp", "lcp", "fid"]: measurement_markers[f"mark.{key}"] = { "value": round(data["start_timestamp"] + entry["value"] / 1000, 3) } measurements.update(measurement_markers) data["platform"] = platform # XXX: Message is a legacy alias for logentry. Do not overwrite if set. if "message" not in data: data[ "message"] = f"This is an example {sample_name or platform} exception" data.setdefault( "user", generate_user(ip_address="127.0.0.1", username="******", id=1, email="*****@*****.**"), ) data.setdefault( "extra", { "session": { "foo": "bar" }, "results": [1, 2, 3, 4, 5], "emptyList": [], "emptyMap": {}, "length": 10837790, "unauthorized": False, "url": "http://example.org/foo/bar/", }, ) data.setdefault("modules", {"my.package": "1.0.0"}) data.setdefault( "request", { "cookies": "foo=bar;biz=baz", "url": "http://example.com/foo", "headers": { "Referer": "http://example.com", "Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36", }, "env": { "ENV": "prod" }, "query_string": "foo=bar", "data": '{"hello": "world"}', "method": "GET", }, ) return data
def load_data(platform, default=None, timestamp=None, sample_name=None): # NOTE: Before editing this data, make sure you understand the context # in which its being used. It is NOT only used for local development and # has production consequences. # * bin/load-mocks to generate fake data for local testing # * When a new project is created, a fake event is generated as a "starter" # event so it's not an empty project. # * When a user clicks Test Configuration from notification plugin settings page, # a fake event is generated to go through the pipeline. data = None language = None platform_data = INTEGRATION_ID_TO_PLATFORM_DATA.get(platform) if platform_data is not None and platform_data['type'] != 'language': language = platform_data['language'] for platform in (platform, language, default): if not platform: continue try: sample_name = sample_name or INTEGRATION_ID_TO_PLATFORM_DATA[platform]['name'] except KeyError: continue json_path = os.path.join(DATA_ROOT, 'samples', '%s.json' % (platform.encode('utf-8'), )) if not os.path.exists(json_path): continue with open(json_path) as fp: data = json.loads(fp.read()) break if data is None: return if platform == 'csp': return data data['platform'] = platform data['message'] = 'This is an example %s exception' % (sample_name, ) data['sentry.interfaces.User'] = generate_user( ip_address='127.0.0.1', username='******', id=1, email='*****@*****.**', ) data['extra'] = { 'session': { 'foo': 'bar', }, 'results': [1, 2, 3, 4, 5], 'emptyList': [], 'emptyMap': {}, 'length': 10837790, 'unauthorized': False, 'url': 'http://example.org/foo/bar/', } data['modules'] = { 'my.package': '1.0.0', } data['sentry.interfaces.Http'] = { "cookies": 'foo=bar;biz=baz', "url": "http://example.com/foo", "headers": { "Referer": "http://example.com", "Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36" }, "env": { 'ENV': 'prod', }, "query_string": "foo=bar", "data": '{"hello": "world"}', "method": "GET" } start = datetime.utcnow() if timestamp: try: start = datetime.utcfromtimestamp(timestamp) except TypeError: pass # Make breadcrumb timestamps relative to right now so they make sense breadcrumbs = data.get('sentry.interfaces.Breadcrumbs') if breadcrumbs is not None: duration = 1000 values = breadcrumbs['values'] for value in reversed(values): value['timestamp'] = milliseconds_ago(start, duration) # Every breadcrumb is 1s apart duration += 1000 return data
def load_data(platform, default=None, sample_name=None): # NOTE: Before editing this data, make sure you understand the context # in which its being used. It is NOT only used for local development and # has production consequences. # * bin/load-mocks to generate fake data for local testing # * When a new project is created, a fake event is generated as a "starter" # event so it's not an empty project. # * When a user clicks Test Configuration from notification plugin settings page, # a fake event is generated to go through the pipeline. data = None language = None platform_data = INTEGRATION_ID_TO_PLATFORM_DATA.get(platform) if platform_data is not None and platform_data['type'] != 'language': language = platform_data['language'] for platform in (platform, language, default): if not platform: continue json_path = os.path.join(DATA_ROOT, 'samples', '%s.json' % (platform.encode('utf-8'), )) if not os.path.exists(json_path): continue if not sample_name: try: sample_name = INTEGRATION_ID_TO_PLATFORM_DATA[platform]['name'] except KeyError: pass with open(json_path) as fp: data = json.loads(fp.read()) break if data is None: return data = CanonicalKeyDict(data) if platform in ('csp', 'hkpk', 'expectct', 'expectstaple'): return data data['platform'] = platform # XXX: Message is a legacy alias for logentry. Do not overwrite if set. if 'message' not in data: data['message'] = 'This is an example %s exception' % (sample_name or platform, ) data.setdefault( 'user', generate_user( ip_address='127.0.0.1', username='******', id=1, email='*****@*****.**', )) data.setdefault( 'extra', { 'session': { 'foo': 'bar', }, 'results': [1, 2, 3, 4, 5], 'emptyList': [], 'emptyMap': {}, 'length': 10837790, 'unauthorized': False, 'url': 'http://example.org/foo/bar/', }) data.setdefault('modules', { 'my.package': '1.0.0', }) data.setdefault( 'request', { "cookies": 'foo=bar;biz=baz', "url": "http://example.com/foo", "headers": { "Referer": "http://example.com", "Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36" }, "env": { 'ENV': 'prod', }, "query_string": "foo=bar", "data": '{"hello": "world"}', "method": "GET" }) return data
def load_data(platform, default=None, sample_name=None): # NOTE: Before editing this data, make sure you understand the context # in which its being used. It is NOT only used for local development and # has production consequences. # * bin/load-mocks to generate fake data for local testing # * When a new project is created, a fake event is generated as a "starter" # event so it's not an empty project. # * When a user clicks Test Configuration from notification plugin settings page, # a fake event is generated to go through the pipeline. data = None language = None platform_data = INTEGRATION_ID_TO_PLATFORM_DATA.get(platform) if platform_data is not None and platform_data["type"] != "language": language = platform_data["language"] for platform in (platform, language, default): if not platform: continue json_path = os.path.join(DATA_ROOT, "samples", "%s.json" % (platform.encode("utf-8"),)) if not os.path.exists(json_path): continue if not sample_name: try: sample_name = INTEGRATION_ID_TO_PLATFORM_DATA[platform]["name"] except KeyError: pass with open(json_path) as fp: data = json.loads(fp.read()) break if data is None: return data = CanonicalKeyDict(data) if platform in ("csp", "hkpk", "expectct", "expectstaple"): return data # Transaction events need timestamp data set to something current. if platform == "transaction": now = timezone.now() now_time = to_timestamp(now) start_time = to_timestamp(now - timedelta(seconds=-2)) data.setdefault("timestamp", now_time) data.setdefault("start_timestamp", start_time) for span in data["spans"]: span.setdefault("timestamp", now_time) span.setdefault("start_timestamp", start_time) data["platform"] = platform # XXX: Message is a legacy alias for logentry. Do not overwrite if set. if "message" not in data: data["message"] = "This is an example %s exception" % (sample_name or platform,) data.setdefault( "user", generate_user(ip_address="127.0.0.1", username="******", id=1, email="*****@*****.**"), ) data.setdefault( "extra", { "session": {"foo": "bar"}, "results": [1, 2, 3, 4, 5], "emptyList": [], "emptyMap": {}, "length": 10837790, "unauthorized": False, "url": "http://example.org/foo/bar/", }, ) data.setdefault("modules", {"my.package": "1.0.0"}) data.setdefault( "request", { "cookies": "foo=bar;biz=baz", "url": "http://example.com/foo", "headers": { "Referer": "http://example.com", "Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36", }, "env": {"ENV": "prod"}, "query_string": "foo=bar", "data": '{"hello": "world"}', "method": "GET", }, ) return data
def load_data(platform, default=None, sample_name=None): # NOTE: Before editing this data, make sure you understand the context # in which its being used. It is NOT only used for local development and # has production consequences. # * bin/load-mocks to generate fake data for local testing # * When a new project is created, a fake event is generated as a "starter" # event so it's not an empty project. # * When a user clicks Test Configuration from notification plugin settings page, # a fake event is generated to go through the pipeline. data = None language = None platform_data = INTEGRATION_ID_TO_PLATFORM_DATA.get(platform) if platform_data is not None and platform_data['type'] != 'language': language = platform_data['language'] for platform in (platform, language, default): if not platform: continue json_path = os.path.join(DATA_ROOT, 'samples', '%s.json' % (platform.encode('utf-8'), )) if not os.path.exists(json_path): continue if not sample_name: try: sample_name = INTEGRATION_ID_TO_PLATFORM_DATA[platform]['name'] except KeyError: pass with open(json_path) as fp: data = json.loads(fp.read()) break if data is None: return data = CanonicalKeyDict(data) if platform in ('csp', 'hkpk', 'expectct', 'expectstaple'): return data data['platform'] = platform # XXX: Message is a legacy alias for logentry. Do not overwrite if set. if 'message' not in data: data['message'] = 'This is an example %s exception' % (sample_name or platform, ) data.setdefault('user', generate_user( ip_address='127.0.0.1', username='******', id=1, email='*****@*****.**', )) data.setdefault('extra', { 'session': { 'foo': 'bar', }, 'results': [1, 2, 3, 4, 5], 'emptyList': [], 'emptyMap': {}, 'length': 10837790, 'unauthorized': False, 'url': 'http://example.org/foo/bar/', }) data.setdefault('modules', { 'my.package': '1.0.0', }) data.setdefault('request', { "cookies": 'foo=bar;biz=baz', "url": "http://example.com/foo", "headers": { "Referer": "http://example.com", "Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36" }, "env": { 'ENV': 'prod', }, "query_string": "foo=bar", "data": '{"hello": "world"}', "method": "GET" }) return data