Пример #1
0
def record_query(request: Request, timer: Timer,
                 query_metadata: SnubaQueryMetadata) -> None:
    """
    Records a request after it has been parsed and validated, whether
    we actually ran a query or not.
    """
    if settings.RECORD_QUERIES:
        # Send to redis
        # We convert this to a dict before passing it to state in order to avoid a
        # circular dependency, where state would depend on the higher level
        # QueryMetadata class
        state.record_query(query_metadata.to_dict())

        final = str(request.query.get_final())
        referrer = request.referrer or "none"
        timer.send_metrics_to(
            metrics,
            tags={
                "status": query_metadata.status.value,
                "referrer": referrer,
                "final": final,
            },
            mark_tags={
                "final": final,
                "referrer": referrer
            },
        )

        _add_tags(timer, request)
Пример #2
0
def test_timer_send_metrics() -> None:
    backend = TestingMetricsBackend()

    time = TestingClock()
    set_tags = {"foo": "bar", "blue": "car"}
    t = Timer("timer", clock=time, tags=set_tags)
    time.sleep(10)
    t.mark("thing1")
    time.sleep(10)
    t.mark("thing2")
    t.send_metrics_to(
        backend,
        tags={"key": "value"},
        mark_tags={"mark-key": "mark-value", "blue": "dog"},
    )

    overridden_tags = {"foo": "bar", "blue": "dog"}
    assert backend.calls == [
        Timing("timer", (10.0 + 10.0) * 1000, {"key": "value", **set_tags}),
        Timing(
            "timer.thing1", 10.0 * 1000, {"mark-key": "mark-value", **overridden_tags}
        ),
        Timing(
            "timer.thing2", 10.0 * 1000, {"mark-key": "mark-value", **overridden_tags}
        ),
    ]
Пример #3
0
def _record_failure_building_request(
    status: QueryStatus, timer: Timer, referrer: Optional[str]
) -> None:
    # TODO: Revisit if recording some data for these queries in the querylog
    # table would be useful.
    if settings.RECORD_QUERIES:
        timer.send_metrics_to(
            metrics,
            tags={"status": status.value, "referrer": referrer or "none"},
        )
        _add_tags(timer)
Пример #4
0
def test_timer_send_metrics() -> None:
    backend = TestingMetricsBackend()

    time = TestingClock()

    t = Timer("timer", clock=time)
    time.sleep(10)
    t.mark("thing1")
    time.sleep(10)
    t.mark("thing2")
    t.send_metrics_to(backend,
                      tags={"key": "value"},
                      mark_tags={"mark-key": "mark-value"})

    assert backend.calls == [
        Timing("timer", (10.0 + 10.0) * 1000, {"key": "value"}),
        Timing("timer.thing1", 10.0 * 1000, {"mark-key": "mark-value"}),
        Timing("timer.thing2", 10.0 * 1000, {"mark-key": "mark-value"}),
    ]
Пример #5
0
def record_query(request: Request, timer: Timer,
                 query_metadata: SnubaQueryMetadata) -> None:
    if settings.RECORD_QUERIES:
        # Send to redis
        # We convert this to a dict before passing it to state in order to avoid a
        # circular dependency, where state would depend on the higher level
        # QueryMetadata class
        state.record_query(query_metadata.to_dict())

        final = str(request.query.get_final())
        referrer = request.referrer or "none"
        timer.send_metrics_to(
            metrics,
            tags={
                "status": query_metadata.status,
                "referrer": referrer,
                "final": final,
            },
            mark_tags={"final": final},
        )
Пример #6
0
def _record_timer_metrics(
    request: Request,
    timer: Timer,
    query_metadata: SnubaQueryMetadata,
) -> None:
    final = str(request.query.get_final())
    referrer = request.referrer or "none"
    timer.send_metrics_to(
        metrics,
        tags={
            "status": query_metadata.status.value,
            "referrer": referrer,
            "final": final,
            "dataset": query_metadata.dataset,
        },
        mark_tags={
            "final": final,
            "referrer": referrer,
            "dataset": query_metadata.dataset,
        },
    )
Пример #7
0
def log_query_and_update_stats(
    request: Request,
    sql: str,
    timer: Timer,
    stats: MutableMapping[str, Any],
    status: str,
    query_settings: Mapping[str, Any],
) -> MutableMapping:
    """
    If query logging is enabled then logs details about the query and its status, as
    well as timing information.
    Also updates stats with any relevant information and returns the updated dict.
    """

    stats.update(query_settings)
    if settings.RECORD_QUERIES:
        # send to redis
        state.record_query(
            {
                "request": request.body,
                "sql": sql,
                "timing": timer,
                "stats": stats,
                "status": status,
            }
        )

        timer.send_metrics_to(
            metrics,
            tags={
                "status": str(status),
                "referrer": stats.get("referrer", "none"),
                "final": str(stats.get("final", False)),
            },
            mark_tags={"final": str(stats.get("final", False))},
        )
    return stats