Example #1
0
def gen_measurements(day):
    """
    Generate measurements that are random but distribution changs based on the day
    """
    return {
        "fp": {"value": random_normal(1250 - 50 * day, 200, 500)},
        "fcp": {"value": random_normal(1250 - 50 * day, 200, 500)},
        "lcp": {"value": random_normal(2800 - 50 * day, 400, 2000)},
        "fid": {"value": random_normal(5 - 0.125 * day, 2, 1)},
    }
Example #2
0
def gen_measurements(full_duration):
    duration_ms = full_duration * 1000.0
    """
    Generate measurements that are random but based on the full duration
    """
    return {
        "fp": {
            "value": duration_ms - random_normal(400, 100, 100)
        },
        "fcp": {
            "value": duration_ms - random_normal(400, 100, 100)
        },
        "lcp": {
            "value": duration_ms + random_normal(400, 100, 100)
        },
        "fid": {
            "value": random_normal(5, 2, 1)
        },
    }
Example #3
0
def gen_frontend_duration(day, quick):
    """
    Generates the length of the front-end transaction based on our config,
    the day, and some randomness
    """
    config = get_config(quick)
    DAY_DURATION_IMPACT = config["DAY_DURATION_IMPACT"]
    MAX_DAYS = config["MAX_DAYS"]
    BASE_FRONTEND_DURATION = config["BASE_FRONTEND_DURATION"]
    MIN_FRONTEND_DURATION = config["MIN_FRONTEND_DURATION"]
    DURATION_SIGMA = config["DURATION_SIGMA"]
    day_weight = DAY_DURATION_IMPACT * day / MAX_DAYS
    return (random_normal(BASE_FRONTEND_DURATION - day_weight, DURATION_SIGMA,
                          MIN_FRONTEND_DURATION) / 1000.0)
Example #4
0
def gen_measurements(full_duration):
    duration_ms = full_duration * 1000.0
    """
    Generate measurements that are random but based on the full duration
    """
    return {
        "fp": {
            "value": duration_ms * random.uniform(0.8, 0.95)
        },
        "fcp": {
            "value": duration_ms * random.uniform(0.8, 0.95)
        },
        "lcp": {
            "value": duration_ms * random.uniform(1.05, 1.2)
        },
        "fid": {
            "value": random_normal(5, 2, 1)
        },
    }
Example #5
0
def populate_connected_event_scenario_2(react_project: Project,
                                        python_project: Project,
                                        quick=False):
    """
    This function populates a set of two related events with the same trace id:
    - Front-end transaction
    - Back-end transaction
    Occurrance times and durations are randomized
    """
    react_transaction = get_event_from_file("scen2/react_transaction.json")
    python_transaction = get_event_from_file("scen2/python_transaction.json")

    log_extra = {
        "organization_slug": react_project.organization.slug,
        "quick": quick,
    }
    logger.info("populate_connected_event_scenario_2.start", extra=log_extra)

    for (timestamp, day) in iter_timestamps(2, quick):
        transaction_user = generate_user(quick)
        trace_id = uuid4().hex
        release = get_release_from_time(react_project.organization_id,
                                        timestamp)
        release_sha = release.version

        old_span_id = react_transaction["contexts"]["trace"]["span_id"]
        frontend_root_span_id = uuid4().hex[:16]
        frontend_duration = gen_frontend_duration(day, quick)

        frontend_trace = {
            "trace_id": trace_id,
            "span_id": frontend_root_span_id,
        }

        # React transaction
        local_event = copy.deepcopy(react_transaction)
        local_event.update(
            project=react_project,
            platform=react_project.platform,
            event_id=uuid4().hex,
            user=transaction_user,
            release=release_sha,
            timestamp=timestamp,
            # start_timestamp decreases based on day so that there's a trend
            start_timestamp=timestamp - timedelta(seconds=frontend_duration),
            measurements=gen_measurements(frontend_duration),
        )
        update_context(local_event, frontend_trace)

        fix_transaction_event(local_event, old_span_id)
        safe_send_event(local_event, quick)

        # note picking the 0th span is arbitrary
        backend_parent_id = local_event["spans"][0]["span_id"]

        # python transaction
        old_span_id = python_transaction["contexts"]["trace"]["span_id"]
        backend_duration = frontend_duration - random_normal(0.3, 0.1, 0.1)

        backend_trace = {
            "trace_id": trace_id,
            "span_id": uuid4().hex[:16],
            "parent_span_id": backend_parent_id,
        }

        local_event = copy.deepcopy(python_transaction)
        local_event.update(
            project=python_project,
            platform=python_project.platform,
            timestamp=timestamp,
            start_timestamp=timestamp - timedelta(seconds=backend_duration),
            user=transaction_user,
            release=release_sha,
        )
        update_context(local_event, backend_trace)
        fix_transaction_event(local_event, old_span_id)
        safe_send_event(local_event, quick)

    logger.info("populate_connected_event_scenario_2.finished",
                extra=log_extra)
Example #6
0
def populate_connected_event_scenario_1(react_project: Project, python_project: Project):
    """
    This function populates a set of four related events with the same trace id:
    - Front-end transaction
    - Front-end error
    - Back-end transaction
    - Back-end error
    Occurrance times and durations are randomized
    """
    react_transaction = get_event_from_file("src/sentry/demo/data/react_transaction_1.json")
    react_error = get_event_from_file("src/sentry/demo/data/react_error_1.json")
    python_transaction = get_event_from_file("src/sentry/demo/data/python_transaction_1.json")
    python_error = get_event_from_file("src/sentry/demo/data/python_error_1.json")

    for day in range(MAX_DAYS):
        for hour in range(24):
            base = distribution_v1(hour)
            # determine the number of events we want in this hour
            num_events = int((BASE_OFFSET + SCALE_FACTOR * base) * random.uniform(0.6, 1.0))
            for i in range(num_events):
                # pick the minutes randomly (which means events will sent be out of order)
                minute = random.randint(0, 60)
                timestamp = timezone.now() - timedelta(days=day, hours=hour, minutes=minute)
                timestamp = timestamp.replace(tzinfo=pytz.utc)
                transaction_user = generate_user()
                trace_id = uuid4().hex

                old_span_id = react_transaction["contexts"]["trace"]["span_id"]
                frontend_root_span_id = uuid4().hex[:16]
                frontend_duration = random_normal(2000 - 50 * day, 250, 1000) / 1000.0

                frontend_context = {
                    "trace": {
                        "type": "trace",
                        "trace_id": trace_id,
                        "span_id": frontend_root_span_id,
                    }
                }

                # React transaction
                local_event = copy.deepcopy(react_transaction)
                local_event.update(
                    project=react_project,
                    platform=react_project.platform,
                    event_id=uuid4().hex,
                    user=transaction_user,
                    timestamp=timestamp,
                    # start_timestamp decreases based on day so that there's a trend
                    start_timestamp=timestamp - timedelta(seconds=frontend_duration),
                    measurements={
                        "fp": {"value": random_normal(1250 - 50 * day, 200, 500)},
                        "fcp": {"value": random_normal(1250 - 50 * day, 200, 500)},
                        "lcp": {"value": random_normal(2800 - 50 * day, 400, 2000)},
                        "fid": {"value": random_normal(5 - 0.125 * day, 2, 1)},
                    },
                    contexts=frontend_context,
                )

                fix_transaction_event(local_event, old_span_id)
                safe_send_event(local_event)

                # note picking the 0th span is arbitrary
                backend_parent_id = local_event["spans"][0]["span_id"]

                # React error
                local_event = copy.deepcopy(react_error)
                local_event.update(
                    project=react_project,
                    platform=react_project.platform,
                    timestamp=timestamp,
                    user=transaction_user,
                    contexts=frontend_context,
                )
                fix_error_event(local_event)
                safe_send_event(local_event)

                # python transaction
                old_span_id = python_transaction["contexts"]["trace"]["span_id"]
                backend_duration = random_normal(1500 + 50 * day, 250, 500)

                backend_context = {
                    "trace": {
                        "type": "trace",
                        "trace_id": trace_id,
                        "span_id": uuid4().hex[:16],
                        "parent_span_id": backend_parent_id,
                    }
                }

                local_event = copy.deepcopy(python_transaction)
                local_event.update(
                    project=python_project,
                    platform=python_project.platform,
                    timestamp=timestamp,
                    start_timestamp=timestamp - timedelta(milliseconds=backend_duration),
                    user=transaction_user,
                    contexts=backend_context,
                )
                fix_transaction_event(local_event, old_span_id)
                safe_send_event(local_event)

                # python error
                local_event = copy.deepcopy(python_error)
                local_event.update(
                    project=python_project,
                    platform=python_project.platform,
                    timestamp=timestamp,
                    user=transaction_user,
                    contexts=backend_context,
                )
                fix_error_event(local_event)
                safe_send_event(local_event)
Example #7
0
def populate_connected_event_scenario_1(
    react_project: Project, python_project: Project, quick=False
):
    """
    This function populates a set of four related events with the same trace id:
    - Front-end transaction
    - Front-end error
    - Back-end transaction
    - Back-end error
    Occurrance times and durations are randomized
    """
    react_transaction = get_event_from_file("scen1/react_transaction.json")
    react_error = get_event_from_file("scen1/react_error.json")
    python_transaction = get_event_from_file("scen1/python_transaction.json")
    python_error = get_event_from_file("scen1/python_error.json")

    log_extra = {
        "organization_slug": react_project.organization.slug,
        "quick": quick,
    }
    logger.info("populate_connected_event_scenario_1.start", extra=log_extra)

    for (timestamp, day) in iter_timestamps(1, quick):
        transaction_user = generate_user(quick)
        trace_id = uuid4().hex
        release = get_release_from_time(react_project.organization_id, timestamp)
        release_sha = release.version

        old_span_id = react_transaction["contexts"]["trace"]["span_id"]
        frontend_root_span_id = uuid4().hex[:16]
        frontend_duration = random_normal(2000 - 50 * day, 250, 1000) / 1000.0

        frontend_context = {
            "trace": {
                "type": "trace",
                "trace_id": trace_id,
                "span_id": frontend_root_span_id,
            }
        }

        # React transaction
        local_event = copy.deepcopy(react_transaction)
        local_event.update(
            project=react_project,
            platform=react_project.platform,
            event_id=uuid4().hex,
            user=transaction_user,
            release=release_sha,
            timestamp=timestamp,
            # start_timestamp decreases based on day so that there's a trend
            start_timestamp=timestamp - timedelta(seconds=frontend_duration),
            measurements=gen_measurements(day),
            contexts=frontend_context,
        )

        fix_transaction_event(local_event, old_span_id)
        safe_send_event(local_event, quick)

        # note picking the 0th span is arbitrary
        backend_parent_id = local_event["spans"][0]["span_id"]

        # React error
        local_event = copy.deepcopy(react_error)
        local_event.update(
            project=react_project,
            platform=react_project.platform,
            timestamp=timestamp,
            user=transaction_user,
            release=release_sha,
            contexts=frontend_context,
        )
        fix_error_event(local_event, quick)
        safe_send_event(local_event, quick)

        # python transaction
        old_span_id = python_transaction["contexts"]["trace"]["span_id"]
        backend_duration = random_normal(1500 + 50 * day, 250, 500)

        backend_context = {
            "trace": {
                "type": "trace",
                "trace_id": trace_id,
                "span_id": uuid4().hex[:16],
                "parent_span_id": backend_parent_id,
            }
        }

        local_event = copy.deepcopy(python_transaction)
        local_event.update(
            project=python_project,
            platform=python_project.platform,
            timestamp=timestamp,
            start_timestamp=timestamp - timedelta(milliseconds=backend_duration),
            user=transaction_user,
            release=release_sha,
            contexts=backend_context,
        )
        fix_transaction_event(local_event, old_span_id)
        safe_send_event(local_event, quick)

        # python error
        local_event = copy.deepcopy(python_error)
        local_event.update(
            project=python_project,
            platform=python_project.platform,
            timestamp=timestamp,
            user=transaction_user,
            release=release_sha,
            contexts=backend_context,
        )
        fix_error_event(local_event, quick)
        safe_send_event(local_event, quick)
    logger.info("populate_connected_event_scenario_1.finished", extra=log_extra)
Example #8
0
def populate_connected_event_scenario_1(react_project: Project,
                                        python_project: Project,
                                        quick=False):
    """
    This function populates a set of four related events with the same trace id:
    - Front-end transaction
    - Front-end error
    - Back-end transaction
    - Back-end error
    Occurrance times and durations are randomized
    """
    react_transaction = get_event_from_file("react_transaction_1.json")
    react_error = get_event_from_file("react_error_1.json")
    python_transaction = get_event_from_file("python_transaction_1.json")
    python_error = get_event_from_file("python_error_1.json")

    config = get_config(quick)
    MAX_DAYS = config["MAX_DAYS"]
    SCALE_FACTOR = config["SCALE_FACTOR"]
    BASE_OFFSET = config["BASE_OFFSET"]

    start_time = timezone.now() - timedelta(days=MAX_DAYS)
    log_extra = {
        "organization_slug": react_project.organization.slug,
        "MAX_DAYS": MAX_DAYS,
        "SCALE_FACTOR": SCALE_FACTOR,
    }
    logger.info("populate_connected_event_scenario_1.start", extra=log_extra)

    for day in range(MAX_DAYS):
        for hour in range(24):
            base = distribution_v1(hour)
            # determine the number of events we want in this hour
            num_events = int(
                (BASE_OFFSET + SCALE_FACTOR * base) * random.uniform(0.6, 1.0))
            timestamps = []
            for i in range(num_events):
                logger.info(
                    "populate_connected_event_scenario_1.send_event_series",
                    extra=log_extra)

                # pick the minutes randomly (which means events will sent be out of order)
                minute = random.randint(0, 60)
                timestamp = start_time + timedelta(
                    days=day, hours=hour, minutes=minute)
                timestamp = timestamp.replace(tzinfo=pytz.utc)
                timestamps.append(timestamp)

            # sort the timestamps
            timestamps.sort()

            for timestamp in timestamps:
                transaction_user = generate_user(quick)
                trace_id = uuid4().hex
                release = get_release_from_time(react_project.organization_id,
                                                timestamp)
                release_sha = release.version

                old_span_id = react_transaction["contexts"]["trace"]["span_id"]
                frontend_root_span_id = uuid4().hex[:16]
                frontend_duration = random_normal(2000 - 50 * day, 250,
                                                  1000) / 1000.0

                frontend_context = {
                    "trace": {
                        "type": "trace",
                        "trace_id": trace_id,
                        "span_id": frontend_root_span_id,
                    }
                }

                # React transaction
                local_event = copy.deepcopy(react_transaction)
                local_event.update(
                    project=react_project,
                    platform=react_project.platform,
                    event_id=uuid4().hex,
                    user=transaction_user,
                    release=release_sha,
                    timestamp=timestamp,
                    # start_timestamp decreases based on day so that there's a trend
                    start_timestamp=timestamp -
                    timedelta(seconds=frontend_duration),
                    measurements={
                        "fp": {
                            "value": random_normal(1250 - 50 * day, 200, 500)
                        },
                        "fcp": {
                            "value": random_normal(1250 - 50 * day, 200, 500)
                        },
                        "lcp": {
                            "value": random_normal(2800 - 50 * day, 400, 2000)
                        },
                        "fid": {
                            "value": random_normal(5 - 0.125 * day, 2, 1)
                        },
                    },
                    contexts=frontend_context,
                )

                fix_transaction_event(local_event, old_span_id)
                safe_send_event(local_event, quick)

                # note picking the 0th span is arbitrary
                backend_parent_id = local_event["spans"][0]["span_id"]

                # React error
                local_event = copy.deepcopy(react_error)
                local_event.update(
                    project=react_project,
                    platform=react_project.platform,
                    timestamp=timestamp,
                    user=transaction_user,
                    release=release_sha,
                    contexts=frontend_context,
                )
                fix_error_event(local_event, quick)
                safe_send_event(local_event, quick)

                # python transaction
                old_span_id = python_transaction["contexts"]["trace"][
                    "span_id"]
                backend_duration = random_normal(1500 + 50 * day, 250, 500)

                backend_context = {
                    "trace": {
                        "type": "trace",
                        "trace_id": trace_id,
                        "span_id": uuid4().hex[:16],
                        "parent_span_id": backend_parent_id,
                    }
                }

                local_event = copy.deepcopy(python_transaction)
                local_event.update(
                    project=python_project,
                    platform=python_project.platform,
                    timestamp=timestamp,
                    start_timestamp=timestamp -
                    timedelta(milliseconds=backend_duration),
                    user=transaction_user,
                    release=release_sha,
                    contexts=backend_context,
                )
                fix_transaction_event(local_event, old_span_id)
                safe_send_event(local_event, quick)

                # python error
                local_event = copy.deepcopy(python_error)
                local_event.update(
                    project=python_project,
                    platform=python_project.platform,
                    timestamp=timestamp,
                    user=transaction_user,
                    release=release_sha,
                    contexts=backend_context,
                )
                fix_error_event(local_event, quick)
                safe_send_event(local_event, quick)
    logger.info("populate_connected_event_scenario_1.finished",
                extra=log_extra)