From b0adddfc12357259987214f3f4ed79eefab310ff Mon Sep 17 00:00:00 2001 From: Katie Byers Date: Mon, 30 Mar 2026 15:42:17 -0700 Subject: [PATCH 1/5] make kitchen time regex easier to read --- src/sentry/grouping/parameterization.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/sentry/grouping/parameterization.py b/src/sentry/grouping/parameterization.py index b508747d5eb408..c927f25df2f6bc 100644 --- a/src/sentry/grouping/parameterization.py +++ b/src/sentry/grouping/parameterization.py @@ -143,7 +143,12 @@ def _get_pattern(self, raw_pattern: str) -> str: ) | # Kitchen - ([1-9]\d?:\d{2}(:\d{2})?(?:\s?[aApP][Mm])?) + ( + [1-9]\d? # Hour + :\d{2} # Minute + (:\d{2})? # Optional second + (?:\s?[aApP][Mm])? # Optional, optionally-space-separated AM/PM + ) | # Date (\d{4}-[01]\d-[0-3]\d) From 72a5cb0431a92412754245fc70bc682b7524364f Mon Sep 17 00:00:00 2001 From: Katie Byers Date: Mon, 30 Mar 2026 15:42:17 -0700 Subject: [PATCH 2/5] split kitchen time into 12-hr and 24-hr versions --- src/sentry/grouping/parameterization.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/sentry/grouping/parameterization.py b/src/sentry/grouping/parameterization.py index c927f25df2f6bc..63b0d51713acb6 100644 --- a/src/sentry/grouping/parameterization.py +++ b/src/sentry/grouping/parameterization.py @@ -142,14 +142,21 @@ def _get_pattern(self, raw_pattern: str) -> str: (\d{4}-?[01]\d-?[0-3]\d[\sT][0-2]\d:?[0-5]\d) # no seconds ) | - # Kitchen + # Kitchen, 12-hr ( - [1-9]\d? # Hour + ([1-9]|1[0-2]) # Hour, no leading zero, 1-12 hours :\d{2} # Minute (:\d{2})? # Optional second (?:\s?[aApP][Mm])? # Optional, optionally-space-separated AM/PM ) | + # Kitchen, 24-hr + ( + (0?\d|1\d|2[0-3]) # Hour, optional leading zero, 0-23 hours + :\d{2} # Minute + (:\d{2})? # Optional second + ) + | # Date (\d{4}-[01]\d-[0-3]\d) | From f077f36d65925a40ff7f77eeee45b2ddf1efc11e Mon Sep 17 00:00:00 2001 From: Katie Byers Date: Mon, 30 Mar 2026 15:42:17 -0700 Subject: [PATCH 3/5] add negative lookbehind and lookaheads --- src/sentry/grouping/parameterization.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/sentry/grouping/parameterization.py b/src/sentry/grouping/parameterization.py index 63b0d51713acb6..e9d45cf1ca20fa 100644 --- a/src/sentry/grouping/parameterization.py +++ b/src/sentry/grouping/parameterization.py @@ -144,17 +144,24 @@ def _get_pattern(self, raw_pattern: str) -> str: | # Kitchen, 12-hr ( + (? Date: Mon, 30 Mar 2026 15:42:17 -0700 Subject: [PATCH 4/5] restrict minute and second values --- src/sentry/grouping/parameterization.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sentry/grouping/parameterization.py b/src/sentry/grouping/parameterization.py index e9d45cf1ca20fa..e0a1031b0adfb9 100644 --- a/src/sentry/grouping/parameterization.py +++ b/src/sentry/grouping/parameterization.py @@ -146,8 +146,8 @@ def _get_pattern(self, raw_pattern: str) -> str: ( (? str: ( (? Date: Mon, 30 Mar 2026 15:42:17 -0700 Subject: [PATCH 5/5] fix tests --- .../sentry/grouping/test_parameterization.py | 63 +++---------------- 1 file changed, 9 insertions(+), 54 deletions(-) diff --git a/tests/sentry/grouping/test_parameterization.py b/tests/sentry/grouping/test_parameterization.py index 6793eda8d8b5a1..4133dbea7ae465 100644 --- a/tests/sentry/grouping/test_parameterization.py +++ b/tests/sentry/grouping/test_parameterization.py @@ -43,6 +43,8 @@ "traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01", "traceparent: ", ), + ("ip - too many initial characters", "12345:6:789", "::"), + ("ip - too many final characters", "123:4:56789", "::"), ("traceparent - aws", "1-67891233-abcdef012345678912345678", ""), ( "traceparent - aws, but not word boundary", @@ -98,8 +100,15 @@ ("date - kitchen lowercase with space", "12:31 pm", ""), ("date - kitchen 24-hour", "23:21", ""), ("date - kitchen 24-hour with seconds", "23:21:12", ""), + ("date - kitchen 24-hour with leading zero", "09:08", ""), ("date - kitchen 24-hour no leading zero", "9:08", ""), + ("date - kitchen 24-hour midnight with leading zero", "00:31", ""), + ("date - kitchen 24-hour midnight no leading zero", "0:12", ""), ("date - kitchen too many initial digits", "908:31", ":"), + ("date - kitchen too many final digits", "11:2112", ":"), + ("date - kitchen hour too big", "31:21", ":"), + ("date - kitchen minute too big", "12:99", ":"), + ("date - kitchen second too big", "12:31:99", "::"), ("date - time", "15:04:05", ""), ("date - basic", "Mon Jan 02, 1999", ""), ("date - datetime compressed date", "20240220 11:55:33.546593", ""), @@ -232,48 +241,6 @@ def test_experimental_parameterization(name: str, input: str, expected: str) -> # parameterization. (Remember to remove the last item in each tuple for the cases you fix.) incorrect_cases = [ # ("name", "input", "desired", "actual") - ( - "date - kitchen 24-hour with leading zero", - "09:08", - "", - ":", - ), - ( - "date - kitchen 24-hour midnight with leading zero", - "00:31", - "", - ":", - ), - ( - "date - kitchen 24-hour midnight no leading zero", - "0:12", - "", - ":", - ), - ( - "date - kitchen hour too big", - "31:21", - ":", - "", - ), - ( - "date - kitchen minute too big", - "12:99", - ":", - "", - ), - ( - "date - kitchen second too big", - "12:31:99", - "::", - "", - ), - ( - "date - kitchen too many final digits", - "11:2112", - ":", - "12", - ), ( "hex without prefix - no letters, 8+ digits, negative", "-12345678", @@ -310,18 +277,6 @@ def test_experimental_parameterization(name: str, input: str, expected: str) -> "Fee::add() called too early", "() called too early", ), - ( - "ip - too many initial characters", - "12345:6:789", - "::", - ":9", - ), - ( - "ip - too many final characters", - "123:4:56789", - "::", - ":789", - ), ( "ip - v4 mapped to v6", "::ffff:192.168.1.1",