Skip to content

feat(log-alerts): Add chart unfurl support for log alerts #94881

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion src/sentry/incidents/charts.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from sentry.models.organization import Organization
from sentry.snuba.dataset import Dataset
from sentry.snuba.entity_subscription import apply_dataset_query_conditions
from sentry.snuba.models import QuerySubscription, SnubaQuery
from sentry.snuba.models import QuerySubscription, SnubaQuery, SnubaQueryEventType
from sentry.snuba.referrer import Referrer
from sentry.snuba.utils import build_query_strings
from sentry.users.models.user import User
Expand Down Expand Up @@ -252,6 +252,12 @@ def build_metric_alert_chart(
else:
if query_type == SnubaQuery.Type.PERFORMANCE and dataset == Dataset.PerformanceMetrics:
query_params["dataset"] = "metrics"
elif (
query_type == SnubaQuery.Type.PERFORMANCE
and dataset == Dataset.EventsAnalyticsPlatform
and snuba_query.event_types == [SnubaQueryEventType.EventType.TRACE_ITEM_LOG]
):
query_params["dataset"] = "ourlogs"
elif (
query_type == SnubaQuery.Type.PERFORMANCE and dataset == Dataset.EventsAnalyticsPlatform
):
Expand Down
55 changes: 51 additions & 4 deletions tests/sentry/integrations/slack/test_unfurl.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@
from sentry.integrations.slack.message_builder.metric_alerts import SlackMetricAlertMessageBuilder
from sentry.integrations.slack.unfurl.handlers import link_handlers, match_link
from sentry.integrations.slack.unfurl.types import LinkType, UnfurlableUrl
from sentry.snuba import discover, errors, spans_rpc, transactions
from sentry.snuba import discover, errors, ourlogs, spans_rpc, transactions
from sentry.snuba.dataset import Dataset
from sentry.snuba.models import SnubaQueryEventType
from sentry.testutils.cases import TestCase
from sentry.testutils.helpers import install_slack
from sentry.testutils.helpers.datetime import before_now, freeze_time
Expand Down Expand Up @@ -422,7 +423,6 @@ def test_unfurl_metric_alerts_chart_transaction(self, mock_generate_chart):
assert chart_data["incidents"][0]["id"] == str(incident.id)

@patch("sentry.charts.backend.generate_chart", return_value="chart-url")
@pytest.mark.xfail
def test_unfurl_metric_alerts_chart_eap_spans(self, mock_generate_chart):
# Using the EventsAnalyticsPlatform dataset
alert_rule = self.create_alert_rule(
Expand Down Expand Up @@ -485,7 +485,6 @@ def test_unfurl_metric_alerts_chart_eap_spans(self, mock_generate_chart):
"sentry.api.bases.organization_events.OrganizationEventsV2EndpointBase.get_event_stats_data",
)
@patch("sentry.charts.backend.generate_chart", return_value="chart-url")
@pytest.mark.xfail
def test_unfurl_metric_alerts_chart_eap_spans_events_stats_call(
self, mock_generate_chart, mock_get_event_stats_data
):
Expand Down Expand Up @@ -529,6 +528,55 @@ def test_unfurl_metric_alerts_chart_eap_spans_events_stats_call(
dataset = mock_get_event_stats_data.mock_calls[0][2]["dataset"]
assert dataset == spans_rpc

@patch(
"sentry.api.bases.organization_events.OrganizationEventsV2EndpointBase.get_event_stats_data",
)
@patch("sentry.charts.backend.generate_chart", return_value="chart-url")
def test_unfurl_metric_alerts_chart_eap_ourlogs_events_stats_call(
self, mock_generate_chart, mock_get_event_stats_data
):
# Using the EventsAnalyticsPlatform dataset with TRACE_ITEM_LOG event type
alert_rule = self.create_alert_rule(
query="log.level:error",
dataset=Dataset.EventsAnalyticsPlatform,
event_types=[SnubaQueryEventType.EventType.TRACE_ITEM_LOG],
)
incident = self.create_incident(
status=2,
organization=self.organization,
projects=[self.project],
alert_rule=alert_rule,
date_started=timezone.now() - timedelta(minutes=2),
)

url = f"https://sentry.io/organizations/{self.organization.slug}/alerts/rules/details/{alert_rule.id}/?alert={incident.identifier}"
links = [
UnfurlableUrl(
url=url,
args={
"org_slug": self.organization.slug,
"alert_rule_id": alert_rule.id,
"incident_id": incident.identifier,
"period": None,
"start": None,
"end": None,
},
),
]

with self.feature(
[
"organizations:incidents",
"organizations:discover",
"organizations:performance-view",
"organizations:metric-alert-chartcuterie",
]
):
link_handlers[LinkType.METRIC_ALERT].fn(self.request, self.integration, links)

dataset = mock_get_event_stats_data.mock_calls[0][2]["dataset"]
assert dataset == ourlogs

@patch("sentry.charts.backend.generate_chart", return_value="chart-url")
def test_unfurl_metric_alerts_chart_crash_free(self, mock_generate_chart):
alert_rule = self.create_alert_rule(
Expand Down Expand Up @@ -701,7 +749,6 @@ def test_unfurl_discover_multi_y_axis(self, mock_generate_chart, _):
"data": [(i * INTERVAL_COUNT, [{"count": 0}]) for i in range(INTERVALS_PER_DAY)],
"end": 1652903400,
"isMetricsData": False,
"order": 1,
"start": 1652817000,
},
)
Expand Down
Loading