def user_interface_generator(max_users=None): if not max_users: return schema_generator(ip_address=version_generator(4, 255)) return schema_generator( ip_address=version_generator(4, 255), username=f"Hobgoblin {random.random()}", id=lambda: str(random.randrange(max_users)), )
def device_context_generator(): return schema_generator( type="device", screen_resolution=[ None, lambda: f"{int(random.random() * 1000)}x{int(random.random() * 1000)}", ], orientation=["portrait", "landscape", "garbage data", None], name=[None, lambda: f"Android SDK built for x{random.random()}"], family=[None, lambda: f"Device family {random.random()}"], battery_level=range(101), screen_dpi=range(1000), memory_size=range(10**6), timezone=["America/Los_Angeles", "Europe/Vienna"], external_storage_size=range(10**6), external_free_storage=range(10**6), screen_width_pixels=range(1000), low_memory=[True, False], simulator=[True, False], screen_height_pixels=range(1000), free_memory=range(10**5), online=[True, False], screen_density=range(5), charging=[True, False], locale=["DE", "US", "NL", "ES", "CZ"], model_id="NYC", brand=["google", "zoogle", "moodle", "doodle", "tamagotchi"], storage_size=range(10**6), boot_time=lambda: str(time.time()), arch=lambda: f"x{random.random()}", manufacturer=["Google", "Hasbro"], )
def app_context_generator(): return schema_generator( type="app", app_version=version_generator(3), app_identifier="io.sentry.sample", app_build=range(100), )
def breadcrumb_generator(min=None, max=None, categories=None, levels=None, types=None, messages=None): min = min if min is not None else 0 max = max if max is not None else 50 categories = (categories if categories is not None and len(categories) > 0 else ["auth", "web-request", "query"]) levels = (levels if levels is not None else ["fatal", "error", "warning", "info", "debug"]) types = types if types is not None else ["default", "http", "error"] messages = messages if messages is not None else _breadcrumb_messages get_num_crumbs = lambda: random.randrange(min, max + 1) generator = schema_generator( category=categories, timestamp=lambda: time.time(), level=levels, type=types, message=lambda: random.choice(messages), ) def inner(): num_crumbs = get_num_crumbs() result = [None] * num_crumbs for idx in range(num_crumbs): result[idx] = generator() return result return inner
def os_context_generator(): return schema_generator( type="os", rooted=[True, False], kernel_version="Linux version 3.10.0+ ([email protected]) (gcc version 4.9.x 20150123 (prerelease) (GCC) ) #256 SMP PREEMPT Fri May 19 11:58:12 PDT 2017", version=version_generator(3), build="sdk_google_phone_x86-userdebug 7.1.1 NYC 5464897 test-keys", name=["Android", "NookPhone"], )
def trace_context_generator(operations=Sequence[str]): def parent_span_id_generator(): random.choice([None, span_id_generator()()]) return schema_generator( trace_id=lambda: uuid.uuid4().hex, span_id=span_id_generator(), parent_span_id=parent_span_id_generator, op=span_op_generator(operations=operations), status=span_status_generator(), type="trace", )
def transaction_generator( num_releases: Optional[int], max_users: Optional[int], min_spans: int, max_spans: int, transaction_duration_max: timedelta, transaction_duration_min: timedelta, transaction_timestamp_spread: timedelta, min_breadcrumbs: int, max_breadcrumbs: int, breadcrumb_categories, breadcrumb_levels, breadcrumb_types, breadcrumb_messages, measurements: Sequence[str], operations: Sequence[str], **kwargs, # additional ignored params ): basic_generator = schema_generator( event_id=lambda: uuid.uuid4().hex, release=(lambda: f"release{random.randrange(num_releases)}" if num_releases is not None else None), transaction=[None, lambda: f"mytransaction{random.randrange(100)}"], logger=["foo.bar.baz", "bam.baz.bad", None], environment=["production", "development", "staging"], user=user_interface_generator(max_users=max_users), contexts={ "os": [None, os_context_generator()], "device": [None, device_context_generator()], "app": [None, app_context_generator()], "trace": trace_context_generator(operations=operations), }, breadcrumbs=breadcrumb_generator( min=min_breadcrumbs, max=max_breadcrumbs, categories=breadcrumb_categories, levels=breadcrumb_levels, types=breadcrumb_types, messages=breadcrumb_messages, ), measurements=measurements_generator(measurements=measurements), ) def inner(): # get the basic structure (before adding the spans) transaction_data = basic_generator() # extract trace_id and root span to use in child spans trace_ctx = transaction_data["contexts"]["trace"] trace_id = trace_ctx["trace_id"] transaction_id = trace_ctx["span_id"] now = time.time() duration_min_sec = transaction_duration_min.total_seconds() duration_max_sec = transaction_duration_max.total_seconds() range_seconds = duration_max_sec - duration_min_sec transaction_duration = timedelta( seconds=range_seconds * random.random() + duration_min_sec) transaction_delta = timedelta( seconds=transaction_timestamp_spread.total_seconds() * random.random()) timestamp = now - transaction_delta.total_seconds() transaction_start = timestamp - transaction_duration.total_seconds() spans = create_spans( min_spans=min_spans, max_spans=max_spans, transaction_id=transaction_id, trace_id=trace_id, transaction_start=transaction_start, timestamp=timestamp, operations_generator=span_op_generator(operations), ) transaction_data["spans"] = spans transaction_data["timestamp"] = timestamp transaction_data["start_timestamp"] = transaction_start return transaction_data return inner
def base_event_generator( with_event_id=True, with_level=True, num_event_groups=1, max_users=None, min_breadcrumbs=None, max_breadcrumbs=None, breadcrumb_categories=None, breadcrumb_levels=None, breadcrumb_types=None, breadcrumb_messages=None, with_native_stacktrace=False, with_javascript_stacktrace=False, num_stacktraces=5, num_frames=100, num_releases=10, release=None, min_frames=5, max_frames=30, **kwargs, ): event_generator = schema_generator( event_id=(lambda: uuid.uuid4().hex) if with_event_id else None, level=["error", "debug"] if with_level else None, fingerprint=lambda: [f"fingerprint{random.randrange(num_event_groups)}"], release=(lambda: f"release{random.randrange(num_releases)}" if release is None else release), transaction=[None, lambda: f"mytransaction{random.randrange(100)}"], logentry={"formatted": sentence_generator()}, logger=["foo.bar.baz", "bam.baz.bad", None], timestamp=time.time, environment=["production", "development", "staging"], user=user_interface_generator(max_users=max_users), contexts={ "os": [None, os_context_generator()], "device": [None, device_context_generator()], "app": [None, app_context_generator()], }, breadcrumbs=breadcrumb_generator( min=min_breadcrumbs, max=max_breadcrumbs, categories=breadcrumb_categories, levels=breadcrumb_levels, types=breadcrumb_types, messages=breadcrumb_messages, ), ) if with_native_stacktrace: native_gen = native_data_generator( num_frames=random.randrange(min_frames, max_frames)) exc_gen = schema_generator(value=sentence_generator()) def event_generator(base_gen=event_generator): event = base_gen() event["platform"] = "cocoa" frames, images = native_gen() exc = exc_gen() exc["stacktrace"] = {"frames": exc_frames} event["exception"] = {"values": [exc]} event["debug_meta"] = {"images": images} return event elif with_javascript_stacktrace: js_gen = javascript_exception_generator(min_frames=min_frames, max_frames=max_frames) def event_generator(base_gen=event_generator): event = base_gen() event["platform"] = "javascript" event["exception"] = js_gen() return event return event_generator