Browse Source

feat(metrics): Add transaction tolerated count derived metric (#33412)

Add a new metric to count the tolerated transactions, according to [apdex](https://docs.sentry.io/product/performance/metrics/#apdex). Intended for internal use.
Iker Barriocanal 2 years ago
parent
commit
cea8ce2d0c

+ 9 - 0
src/sentry/snuba/metrics/fields/base.py

@@ -49,6 +49,7 @@ from sentry.snuba.metrics.fields.snql import (
     session_duration_filters,
     sessions_errored_set,
     subtraction,
+    tolerated_count_transaction,
 )
 from sentry.snuba.metrics.naming_layer.mapping import get_public_name_from_mri
 from sentry.snuba.metrics.naming_layer.mri import SessionMRI, TransactionMRI
@@ -919,6 +920,14 @@ DERIVED_METRICS: Mapping[str, DerivedMetricExpression] = {
                 org_id=org_id, metric_ids=metric_ids, alias=alias
             ),
         ),
+        SingularEntityDerivedMetric(
+            metric_name=TransactionMRI.TOLERATED.value,
+            metrics=[TransactionMRI.DURATION.value],
+            unit="transactions",
+            snql=lambda *_, org_id, metric_ids, alias=None: tolerated_count_transaction(
+                org_id=org_id, metric_ids=metric_ids, alias=alias
+            ),
+        ),
     ]
 }
 

+ 6 - 0
src/sentry/snuba/metrics/fields/snql.py

@@ -227,6 +227,12 @@ def satisfaction_count_transaction(org_id, metric_ids, alias=None):
     )
 
 
+def tolerated_count_transaction(org_id, metric_ids, alias=None):
+    return _dist_count_aggregation_on_tx_satisfaction_factory(
+        org_id, TransactionSatisfactionTagValue.TOLERATED.value, metric_ids, alias
+    )
+
+
 def percentage(arg1_snql, arg2_snql, alias=None):
     return Function("minus", [1, Function("divide", [arg1_snql, arg2_snql])], alias)
 

+ 1 - 0
src/sentry/snuba/metrics/naming_layer/mri.py

@@ -80,3 +80,4 @@ class TransactionMRI(Enum):
     FAILURE_COUNT = "e:transactions/failure_count@none"
     FAILURE_RATE = "e:transaction/failure_rate@ratio"
     SATISFIED = "e:transactions/satisfied@none"
+    TOLERATED = "e:transactions/tolerated@none"

+ 34 - 0
tests/sentry/snuba/metrics/test_snql.py

@@ -23,6 +23,7 @@ from sentry.snuba.metrics.fields.snql import (
     division_float,
     failure_count_transaction,
     satisfaction_count_transaction,
+    tolerated_count_transaction,
 )
 from sentry.snuba.metrics.naming_layer.public import TransactionSatisfactionTagValue
 from sentry.testutils import TestCase
@@ -197,6 +198,39 @@ class DerivedMetricSnQLTestCase(TestCase):
             "transaction.satisfied",
         )
 
+        assert tolerated_count_transaction(
+            org_id, self.metric_ids, alias="transaction.tolerated"
+        ) == Function(
+            "countIf",
+            [
+                Column("value"),
+                Function(
+                    "and",
+                    [
+                        Function(
+                            "equals",
+                            [
+                                Column(
+                                    f"tags[{resolve_weak(org_id, TransactionTagsKey.TRANSACTION_SATISFACTION.value)}]"
+                                ),
+                                resolve_weak(
+                                    org_id, TransactionSatisfactionTagValue.TOLERATED.value
+                                ),
+                            ],
+                        ),
+                        Function(
+                            "in",
+                            [
+                                Column("metric_id"),
+                                list(self.metric_ids),
+                            ],
+                        ),
+                    ],
+                ),
+            ],
+            alias="transaction.tolerated",
+        )
+
     def test_percentage_in_snql(self):
         org_id = 666
         alias = "foo.percentage"