constants.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import re
  2. from sentry.snuba.dataset import Dataset
  3. from sentry.utils.snuba import DATASETS
  4. KEY_TRANSACTION_ALIAS = "key_transaction"
  5. PROJECT_THRESHOLD_CONFIG_INDEX_ALIAS = "project_threshold_config_index"
  6. PROJECT_THRESHOLD_OVERRIDE_CONFIG_INDEX_ALIAS = "project_threshold_override_config_index"
  7. PROJECT_THRESHOLD_CONFIG_ALIAS = "project_threshold_config"
  8. TEAM_KEY_TRANSACTION_ALIAS = "team_key_transaction"
  9. ERROR_UNHANDLED_ALIAS = "error.unhandled"
  10. ERROR_HANDLED_ALIAS = "error.handled"
  11. USER_DISPLAY_ALIAS = "user.display"
  12. PROJECT_ALIAS = "project"
  13. PROJECT_NAME_ALIAS = "project.name"
  14. ISSUE_ALIAS = "issue"
  15. ISSUE_ID_ALIAS = "issue.id"
  16. RELEASE_ALIAS = "release"
  17. RELEASE_STAGE_ALIAS = "release.stage"
  18. SEMVER_ALIAS = "release.version"
  19. SEMVER_PACKAGE_ALIAS = "release.package"
  20. SEMVER_BUILD_ALIAS = "release.build"
  21. TIMESTAMP_TO_HOUR_ALIAS = "timestamp.to_hour"
  22. TIMESTAMP_TO_DAY_ALIAS = "timestamp.to_day"
  23. TRANSACTION_STATUS_ALIAS = "transaction.status"
  24. TAG_KEY_RE = re.compile(r"^tags\[(?P<tag>.*)\]$")
  25. # Based on general/src/protocol/tags.rs in relay
  26. VALID_FIELD_PATTERN = re.compile(r"^[a-zA-Z0-9_.:-]*$")
  27. # The regex for alias here is to match any word, but exclude anything that is only digits
  28. # eg. 123 doesn't match, but test_123 will match
  29. ALIAS_REGEX = r"(\w+)?(?!\d+)\w+"
  30. ALIAS_PATTERN = re.compile(fr"{ALIAS_REGEX}$")
  31. FUNCTION_PATTERN = re.compile(
  32. fr"^(?P<function>[^\(]+)\((?P<columns>.*)\)( (as|AS) (?P<alias>{ALIAS_REGEX}))?$"
  33. )
  34. DURATION_PATTERN = re.compile(r"(\d+\.?\d?)(\D{1,3})")
  35. RESULT_TYPES = {"duration", "string", "number", "integer", "percentage", "date"}
  36. NO_CONVERSION_FIELDS = {"start", "end"}
  37. EQUALITY_OPERATORS = frozenset(["=", "IN"])
  38. INEQUALITY_OPERATORS = frozenset(["!=", "NOT IN"])
  39. ARRAY_FIELDS = {
  40. "error.mechanism",
  41. "error.type",
  42. "error.value",
  43. "stack.abs_path",
  44. "stack.colno",
  45. "stack.filename",
  46. "stack.function",
  47. "stack.in_app",
  48. "stack.lineno",
  49. "stack.module",
  50. "stack.package",
  51. "stack.stack_level",
  52. }
  53. CONFIGURABLE_AGGREGATES = {
  54. "apdex()": "apdex({threshold}) as apdex",
  55. "user_misery()": "user_misery({threshold}) as user_misery",
  56. "count_miserable(user)": "count_miserable(user,{threshold}) as count_miserable_user",
  57. }
  58. # Create the known set of fields from the issue properties
  59. # and the transactions and events dataset mapping definitions.
  60. SEARCH_MAP = {
  61. "start": "start",
  62. "end": "end",
  63. "project_id": "project_id",
  64. "first_seen": "first_seen",
  65. "last_seen": "last_seen",
  66. "times_seen": "times_seen",
  67. SEMVER_ALIAS: SEMVER_ALIAS,
  68. RELEASE_STAGE_ALIAS: RELEASE_STAGE_ALIAS,
  69. }
  70. SEARCH_MAP.update(**DATASETS[Dataset.Events])
  71. SEARCH_MAP.update(**DATASETS[Dataset.Discover])
  72. DEFAULT_PROJECT_THRESHOLD_METRIC = "duration"
  73. DEFAULT_PROJECT_THRESHOLD = 300
  74. MAX_QUERYABLE_TRANSACTION_THRESHOLDS = 500
  75. # Allow list of fields that are compatible with the Snql Query Builder.
  76. # Once we reach a certain threshold of fields handled should turn this into a denylist
  77. # use public facing field/function names for this list
  78. SNQL_FIELD_ALLOWLIST = {
  79. "environment",
  80. "message",
  81. "project",
  82. "transaction",
  83. "project.id",
  84. "release",
  85. USER_DISPLAY_ALIAS,
  86. "user.email",
  87. ISSUE_ALIAS,
  88. ISSUE_ID_ALIAS,
  89. TIMESTAMP_TO_HOUR_ALIAS,
  90. TIMESTAMP_TO_DAY_ALIAS,
  91. TRANSACTION_STATUS_ALIAS,
  92. ERROR_UNHANDLED_ALIAS,
  93. }
  94. OPERATOR_NEGATION_MAP = {
  95. "=": "!=",
  96. "<": ">=",
  97. "<=": ">",
  98. ">": "<=",
  99. ">=": "<",
  100. "IN": "NOT IN",
  101. }
  102. OPERATOR_TO_DJANGO = {">=": "gte", "<=": "lte", ">": "gt", "<": "lt", "=": "exact"}
  103. MAX_SEARCH_RELEASES = 1000
  104. SEMVER_EMPTY_RELEASE = "____SENTRY_EMPTY_RELEASE____"
  105. SEMVER_WILDCARDS = frozenset(["X", "*"])