|
@@ -2,12 +2,12 @@ import itertools
|
|
|
import logging
|
|
|
import math
|
|
|
from datetime import datetime, timedelta
|
|
|
-from enum import Enum
|
|
|
from typing import Any, Dict, List, Optional, Tuple
|
|
|
|
|
|
import pytz
|
|
|
|
|
|
from sentry.api.utils import get_date_range_from_params
|
|
|
+from sentry.release_health.base import AllowedResolution, SessionsQueryConfig
|
|
|
from sentry.search.events.filter import get_filter
|
|
|
from sentry.utils.dates import parse_stats_period, to_datetime, to_timestamp
|
|
|
from sentry.utils.snuba import Dataset, raw_query, resolve_condition
|
|
@@ -241,12 +241,6 @@ class InvalidField(Exception):
|
|
|
pass
|
|
|
|
|
|
|
|
|
-class AllowedResolution(Enum):
|
|
|
- one_hour = (3600, "one hour")
|
|
|
- one_minute = (60, "one minute")
|
|
|
- ten_seconds = (10, "ten seconds")
|
|
|
-
|
|
|
-
|
|
|
class QueryDefinition:
|
|
|
"""
|
|
|
This is the definition of the query the user wants to execute.
|
|
@@ -254,13 +248,7 @@ class QueryDefinition:
|
|
|
`fields` and `groupby` definitions as [`ColumnDefinition`] objects.
|
|
|
"""
|
|
|
|
|
|
- def __init__(
|
|
|
- self,
|
|
|
- query,
|
|
|
- params,
|
|
|
- allowed_resolution: AllowedResolution,
|
|
|
- allow_session_status_query: bool = False,
|
|
|
- ):
|
|
|
+ def __init__(self, query, params, query_config: SessionsQueryConfig):
|
|
|
self.query = query.get("query", "")
|
|
|
self.raw_fields = raw_fields = query.getlist("field", [])
|
|
|
self.raw_groupby = raw_groupby = query.getlist("groupBy", [])
|
|
@@ -281,7 +269,11 @@ class QueryDefinition:
|
|
|
raise InvalidField(f'Invalid groupBy: "{key}"')
|
|
|
self.groupby.append(GROUPBY_MAP[key])
|
|
|
|
|
|
- start, end, rollup = get_constrained_date_range(query, allowed_resolution)
|
|
|
+ start, end, rollup = get_constrained_date_range(
|
|
|
+ query,
|
|
|
+ allowed_resolution=query_config.allowed_resolution,
|
|
|
+ restrict_date_range=query_config.restrict_date_range,
|
|
|
+ )
|
|
|
self.rollup = rollup
|
|
|
self.start = start
|
|
|
self.end = end
|
|
@@ -310,7 +302,7 @@ class QueryDefinition:
|
|
|
|
|
|
# this makes sure that literals in complex queries are properly quoted,
|
|
|
# and unknown fields are raised as errors
|
|
|
- if allow_session_status_query:
|
|
|
+ if query_config.allow_session_status_query:
|
|
|
# NOTE: "''" is added because we use the event search parser, which
|
|
|
# resolves "session.status" to ifNull(..., "''")
|
|
|
column_resolver = lambda col: resolve_column(col, ["session.status", "''"])
|
|
@@ -358,6 +350,7 @@ def get_constrained_date_range(
|
|
|
params,
|
|
|
allowed_resolution: AllowedResolution = AllowedResolution.one_hour,
|
|
|
max_points=MAX_POINTS,
|
|
|
+ restrict_date_range=True,
|
|
|
) -> Tuple[datetime, datetime, int]:
|
|
|
interval = parse_stats_period(params.get("interval", "1h"))
|
|
|
interval = int(3600 if interval is None else interval.total_seconds())
|
|
@@ -402,7 +395,7 @@ def get_constrained_date_range(
|
|
|
seconds=int(rounding_interval * math.ceil(date_range.total_seconds() / rounding_interval))
|
|
|
)
|
|
|
|
|
|
- if using_minute_resolution:
|
|
|
+ if using_minute_resolution and restrict_date_range:
|
|
|
if date_range.total_seconds() > 6 * ONE_HOUR:
|
|
|
raise InvalidParams(
|
|
|
"The time-range when using one-minute resolution intervals is restricted to 6 hours."
|