index.ts 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361
  1. import {t} from 'sentry/locale';
  2. import {TagCollection} from 'sentry/types';
  3. // Don't forget to update https://docs.sentry.io/product/sentry-basics/search/searchable-properties/ for any changes made here
  4. export enum FieldKind {
  5. TAG = 'tag',
  6. MEASUREMENT = 'measurement',
  7. BREAKDOWN = 'breakdown',
  8. FIELD = 'field',
  9. FUNCTION = 'function',
  10. EQUATION = 'equation',
  11. METRICS = 'metric',
  12. NUMERIC_METRICS = 'numeric_metric',
  13. }
  14. export enum FieldKey {
  15. AGE = 'age',
  16. ASSIGNED = 'assigned',
  17. ASSIGNED_OR_SUGGESTED = 'assigned_or_suggested',
  18. BOOKMARKS = 'bookmarks',
  19. CULPRIT = 'culprit',
  20. DEVICE_ARCH = 'device.arch',
  21. DEVICE_BATTERY_LEVEL = 'device.battery_level',
  22. DEVICE_BRAND = 'device.brand',
  23. DEVICE_CHARGING = 'device.charging',
  24. DEVICE_CLASS = 'device.class',
  25. DEVICE_FAMILY = 'device.family',
  26. DEVICE_LOCALE = 'device.locale',
  27. DEVICE_MODEL_ID = 'device.model_id',
  28. DEVICE_NAME = 'device.name',
  29. DEVICE_ONLINE = 'device.online',
  30. DEVICE_ORIENTATION = 'device.orientation',
  31. DEVICE_SCREEN_DENSITY = 'device.screen_density',
  32. DEVICE_SCREEN_DPI = 'device.screen_dpi',
  33. DEVICE_SCREEN_HEIGHT_PIXELS = 'device.screen_height_pixels',
  34. DEVICE_SCREEN_WIDTH_PIXELS = 'device.screen_width_pixels',
  35. DEVICE_SIMULATOR = 'device.simulator',
  36. DEVICE_UUID = 'device.uuid',
  37. DIST = 'dist',
  38. ENVIRONMENT = 'environment',
  39. ERROR_HANDLED = 'error.handled',
  40. ERROR_MECHANISM = 'error.mechanism',
  41. ERROR_TYPE = 'error.type',
  42. ERROR_UNHANDLED = 'error.unhandled',
  43. ERROR_VALUE = 'error.value',
  44. ERROR_RECEIVED = 'error.received',
  45. EVENT_TIMESTAMP = 'event.timestamp',
  46. EVENT_TYPE = 'event.type',
  47. FIRST_RELEASE = 'firstRelease',
  48. FIRST_SEEN = 'firstSeen',
  49. GEO_CITY = 'geo.city',
  50. GEO_COUNTRY_CODE = 'geo.country_code',
  51. GEO_REGION = 'geo.region',
  52. HAS = 'has',
  53. HTTP_METHOD = 'http.method',
  54. HTTP_REFERER = 'http.referer',
  55. HTTP_STATUS_CODE = 'http.status_code',
  56. HTTP_URL = 'http.url',
  57. ID = 'id',
  58. IS = 'is',
  59. ISSUE = 'issue',
  60. ISSUE_CATEGORY = 'issue.category',
  61. ISSUE_TYPE = 'issue.type',
  62. LAST_SEEN = 'lastSeen',
  63. LEVEL = 'level',
  64. LOCATION = 'location',
  65. MESSAGE = 'message',
  66. OS = 'os',
  67. OS_BUILD = 'os.build',
  68. OS_KERNEL_VERSION = 'os.kernel_version',
  69. PLATFORM = 'platform',
  70. PLATFORM_NAME = 'platform.name',
  71. PROFILE_ID = 'profile.id',
  72. PROJECT = 'project',
  73. RELEASE = 'release',
  74. RELEASE_BUILD = 'release.build',
  75. RELEASE_PACKAGE = 'release.package',
  76. RELEASE_STAGE = 'release.stage',
  77. RELEASE_VERSION = 'release.version',
  78. REPLAY_ID = 'replayId',
  79. SDK_NAME = 'sdk.name',
  80. SDK_VERSION = 'sdk.version',
  81. STACK_ABS_PATH = 'stack.abs_path',
  82. STACK_COLNO = 'stack.colno',
  83. STACK_FILENAME = 'stack.filename',
  84. STACK_FUNCTION = 'stack.function',
  85. STACK_IN_APP = 'stack.in_app',
  86. STACK_LINENO = 'stack.lineno',
  87. STACK_MODULE = 'stack.module',
  88. STACK_PACKAGE = 'stack.package',
  89. STACK_RESOURCE = 'stack.resource',
  90. STACK_STACK_LEVEL = 'stack.stack_level',
  91. TIMESTAMP = 'timestamp',
  92. TIMESTAMP_TO_DAY = 'timestamp.to_day',
  93. TIMESTAMP_TO_HOUR = 'timestamp.to_hour',
  94. TIMES_SEEN = 'timesSeen',
  95. TITLE = 'title',
  96. TOTAL_COUNT = 'total.count',
  97. TRACE = 'trace',
  98. TRACE_PARENT_SPAN = 'trace.parent_span',
  99. TRACE_SPAN = 'trace.span',
  100. TRANSACTION = 'transaction',
  101. TRANSACTION_DURATION = 'transaction.duration',
  102. TRANSACTION_OP = 'transaction.op',
  103. TRANSACTION_STATUS = 'transaction.status',
  104. UNREAL_CRASH_TYPE = 'unreal.crash_type',
  105. USER = 'user',
  106. USER_DISPLAY = 'user.display',
  107. USER_EMAIL = 'user.email',
  108. USER_ID = 'user.id',
  109. USER_IP = 'user.ip',
  110. USER_USERNAME = 'user.username',
  111. APP_IN_FOREGROUND = 'app.in_foreground',
  112. }
  113. export enum FieldValueType {
  114. BOOLEAN = 'boolean',
  115. DATE = 'date',
  116. DURATION = 'duration',
  117. INTEGER = 'integer',
  118. NUMBER = 'number',
  119. PERCENTAGE = 'percentage',
  120. STRING = 'string',
  121. NEVER = 'never',
  122. SIZE = 'size',
  123. }
  124. export enum WebVital {
  125. FP = 'measurements.fp',
  126. FCP = 'measurements.fcp',
  127. LCP = 'measurements.lcp',
  128. FID = 'measurements.fid',
  129. CLS = 'measurements.cls',
  130. TTFB = 'measurements.ttfb',
  131. RequestTime = 'measurements.ttfb.requesttime',
  132. }
  133. export enum MobileVital {
  134. AppStartCold = 'measurements.app_start_cold',
  135. AppStartWarm = 'measurements.app_start_warm',
  136. FramesTotal = 'measurements.frames_total',
  137. FramesSlow = 'measurements.frames_slow',
  138. FramesFrozen = 'measurements.frames_frozen',
  139. FramesSlowRate = 'measurements.frames_slow_rate',
  140. FramesFrozenRate = 'measurements.frames_frozen_rate',
  141. StallCount = 'measurements.stall_count',
  142. StallTotalTime = 'measurements.stall_total_time',
  143. StallLongestTime = 'measurements.stall_longest_time',
  144. StallPercentage = 'measurements.stall_percentage',
  145. TimeToFullDisplay = 'measurements.time_to_full_display',
  146. TimeToInitialDisplay = 'measurements.time_to_initial_display',
  147. }
  148. export enum SpanOpBreakdown {
  149. SpansBrowser = 'spans.browser',
  150. SpansDb = 'spans.db',
  151. SpansHttp = 'spans.http',
  152. SpansResource = 'spans.resource',
  153. SpansUi = 'spans.ui',
  154. }
  155. export enum AggregationKey {
  156. Count = 'count',
  157. CountUnique = 'count_unique',
  158. CountMiserable = 'count_miserable',
  159. CountIf = 'count_if',
  160. CountWebVitals = 'count_web_vitals',
  161. Eps = 'eps',
  162. Epm = 'epm',
  163. FailureCount = 'failure_count',
  164. Min = 'min',
  165. Max = 'max',
  166. Sum = 'sum',
  167. Any = 'any',
  168. P50 = 'p50',
  169. P75 = 'p75',
  170. P95 = 'p95',
  171. P99 = 'p99',
  172. P100 = 'p100',
  173. Percentile = 'percentile',
  174. Avg = 'avg',
  175. Apdex = 'apdex',
  176. UserMisery = 'user_misery',
  177. FailureRate = 'failure_rate',
  178. LastSeen = 'last_seen',
  179. }
  180. export interface FieldDefinition {
  181. kind: FieldKind;
  182. valueType: FieldValueType | null;
  183. /**
  184. * Is this field being deprecated
  185. */
  186. deprecated?: boolean;
  187. /**
  188. * Description of the field
  189. */
  190. desc?: string;
  191. /**
  192. * Feature flag that indicates gating of the field from use
  193. */
  194. featureFlag?: string;
  195. /**
  196. * Additional keywords used when filtering via autocomplete
  197. */
  198. keywords?: string[];
  199. }
  200. export const AGGREGATION_FIELDS: Record<AggregationKey, FieldDefinition> = {
  201. [AggregationKey.Count]: {
  202. desc: t('count of events'),
  203. kind: FieldKind.FUNCTION,
  204. valueType: FieldValueType.NUMBER,
  205. },
  206. [AggregationKey.CountUnique]: {
  207. desc: t('Unique count of the field values'),
  208. kind: FieldKind.FUNCTION,
  209. valueType: FieldValueType.INTEGER,
  210. },
  211. [AggregationKey.CountMiserable]: {
  212. desc: t('Count of unique miserable users'),
  213. kind: FieldKind.FUNCTION,
  214. valueType: FieldValueType.NUMBER,
  215. },
  216. [AggregationKey.CountIf]: {
  217. desc: t('Count of events matching the parameter conditions'),
  218. kind: FieldKind.FUNCTION,
  219. valueType: FieldValueType.NUMBER,
  220. },
  221. [AggregationKey.CountWebVitals]: {
  222. desc: t('Count of web vitals with a specific status'),
  223. kind: FieldKind.FUNCTION,
  224. valueType: FieldValueType.NUMBER,
  225. },
  226. [AggregationKey.Eps]: {
  227. desc: t('Events per second'),
  228. kind: FieldKind.FUNCTION,
  229. valueType: FieldValueType.NUMBER,
  230. },
  231. [AggregationKey.Epm]: {
  232. desc: t('Events per minute'),
  233. kind: FieldKind.FUNCTION,
  234. valueType: FieldValueType.NUMBER,
  235. },
  236. [AggregationKey.FailureRate]: {
  237. desc: t('Failed event percentage based on transaction.status'),
  238. kind: FieldKind.FUNCTION,
  239. valueType: FieldValueType.PERCENTAGE,
  240. },
  241. [AggregationKey.FailureCount]: {
  242. desc: t('Failed event count based on transaction.status'),
  243. kind: FieldKind.FUNCTION,
  244. valueType: FieldValueType.NUMBER,
  245. },
  246. [AggregationKey.Min]: {
  247. desc: t('Returns the minimum value of the selected field'),
  248. kind: FieldKind.FUNCTION,
  249. valueType: null,
  250. },
  251. [AggregationKey.Max]: {
  252. desc: t('Returns maximum value of the selected field'),
  253. kind: FieldKind.FUNCTION,
  254. valueType: null,
  255. },
  256. [AggregationKey.Sum]: {
  257. desc: t('Returns the total value for the selected field'),
  258. kind: FieldKind.FUNCTION,
  259. valueType: null,
  260. },
  261. [AggregationKey.Any]: {
  262. desc: t('Not Recommended, a random field value'),
  263. kind: FieldKind.FUNCTION,
  264. valueType: null,
  265. },
  266. [AggregationKey.P50]: {
  267. desc: t('Returns the 50th percentile of the selected field'),
  268. kind: FieldKind.FUNCTION,
  269. valueType: null,
  270. },
  271. [AggregationKey.P75]: {
  272. desc: t('Returns the 75th percentile of the selected field'),
  273. kind: FieldKind.FUNCTION,
  274. valueType: null,
  275. },
  276. [AggregationKey.P95]: {
  277. desc: t('Returns the 95th percentile of the selected field'),
  278. kind: FieldKind.FUNCTION,
  279. valueType: null,
  280. },
  281. [AggregationKey.P99]: {
  282. desc: t('Returns the 99th percentile of the selected field'),
  283. kind: FieldKind.FUNCTION,
  284. valueType: null,
  285. },
  286. [AggregationKey.P100]: {
  287. desc: t('Returns the 100th percentile of the selected field'),
  288. kind: FieldKind.FUNCTION,
  289. valueType: null,
  290. },
  291. [AggregationKey.Percentile]: {
  292. desc: t('Returns the percentile of the selected field'),
  293. kind: FieldKind.FUNCTION,
  294. valueType: null,
  295. },
  296. [AggregationKey.Avg]: {
  297. desc: t('Returns averages for a selected field'),
  298. kind: FieldKind.FUNCTION,
  299. valueType: null,
  300. },
  301. [AggregationKey.Apdex]: {
  302. desc: t('Performance score based on a duration threshold'),
  303. kind: FieldKind.FUNCTION,
  304. valueType: FieldValueType.NUMBER,
  305. },
  306. [AggregationKey.UserMisery]: {
  307. desc: t(
  308. 'User-weighted performance metric that counts the number of unique users who were frustrated'
  309. ),
  310. kind: FieldKind.FUNCTION,
  311. valueType: null,
  312. },
  313. [AggregationKey.LastSeen]: {
  314. desc: t('Issues last seen at a date and time'),
  315. kind: FieldKind.FUNCTION,
  316. valueType: FieldValueType.DATE,
  317. },
  318. };
  319. export const MEASUREMENT_FIELDS: Record<WebVital | MobileVital, FieldDefinition> = {
  320. [WebVital.FP]: {
  321. desc: t('Web Vital First Paint'),
  322. kind: FieldKind.METRICS,
  323. valueType: FieldValueType.DURATION,
  324. },
  325. [WebVital.FCP]: {
  326. desc: t('Web Vital First Contentful Paint'),
  327. kind: FieldKind.METRICS,
  328. valueType: FieldValueType.DURATION,
  329. },
  330. [WebVital.LCP]: {
  331. desc: t('Web Vital Largest Contentful Paint'),
  332. kind: FieldKind.METRICS,
  333. valueType: FieldValueType.DURATION,
  334. },
  335. [WebVital.FID]: {
  336. desc: t('Web Vital First Input Delay'),
  337. kind: FieldKind.METRICS,
  338. valueType: FieldValueType.DURATION,
  339. },
  340. [WebVital.CLS]: {
  341. desc: t('Web Vital Cumulative Layout Shift'),
  342. kind: FieldKind.METRICS,
  343. valueType: FieldValueType.NUMBER,
  344. },
  345. [WebVital.TTFB]: {
  346. desc: t('Web Vital Time To First Byte'),
  347. kind: FieldKind.METRICS,
  348. valueType: FieldValueType.DURATION,
  349. },
  350. [WebVital.RequestTime]: {
  351. desc: t('Time between start of request to start of response'),
  352. kind: FieldKind.METRICS,
  353. valueType: FieldValueType.DURATION,
  354. },
  355. [MobileVital.AppStartCold]: {
  356. desc: t('First launch (not in memory and no process exists)'),
  357. kind: FieldKind.METRICS,
  358. valueType: FieldValueType.DURATION,
  359. },
  360. [MobileVital.AppStartWarm]: {
  361. desc: t('Already launched (partial memory and process may exist)'),
  362. kind: FieldKind.METRICS,
  363. valueType: FieldValueType.DURATION,
  364. },
  365. [MobileVital.FramesTotal]: {
  366. desc: t('Total number of frames'),
  367. kind: FieldKind.METRICS,
  368. valueType: FieldValueType.INTEGER,
  369. },
  370. [MobileVital.FramesSlow]: {
  371. desc: t('Number of slow frames'),
  372. kind: FieldKind.METRICS,
  373. valueType: FieldValueType.INTEGER,
  374. },
  375. [MobileVital.FramesFrozen]: {
  376. desc: t('Number of frozen frames'),
  377. kind: FieldKind.METRICS,
  378. valueType: FieldValueType.INTEGER,
  379. },
  380. [MobileVital.FramesSlowRate]: {
  381. desc: t('Number of slow frames out of the total'),
  382. kind: FieldKind.METRICS,
  383. valueType: FieldValueType.PERCENTAGE,
  384. },
  385. [MobileVital.FramesFrozenRate]: {
  386. desc: t('Number of frozen frames out of the total'),
  387. kind: FieldKind.METRICS,
  388. valueType: FieldValueType.PERCENTAGE,
  389. },
  390. [MobileVital.StallCount]: {
  391. desc: t('Count of slow Javascript event loops (React Native)'),
  392. kind: FieldKind.METRICS,
  393. valueType: FieldValueType.INTEGER,
  394. },
  395. [MobileVital.StallTotalTime]: {
  396. desc: t('Total stall duration (React Native)'),
  397. kind: FieldKind.METRICS,
  398. valueType: FieldValueType.PERCENTAGE,
  399. },
  400. [MobileVital.StallLongestTime]: {
  401. desc: t('Duration of slowest Javascript event loop (React Native)'),
  402. kind: FieldKind.METRICS,
  403. valueType: FieldValueType.INTEGER,
  404. },
  405. [MobileVital.StallPercentage]: {
  406. desc: t('Total stall duration out of the total transaction duration (React Native)'),
  407. kind: FieldKind.METRICS,
  408. valueType: FieldValueType.PERCENTAGE,
  409. },
  410. [MobileVital.TimeToFullDisplay]: {
  411. desc: t(
  412. 'The time between application launch and complete display of all resources and views'
  413. ),
  414. kind: FieldKind.METRICS,
  415. valueType: FieldValueType.DURATION,
  416. },
  417. [MobileVital.TimeToInitialDisplay]: {
  418. desc: t('The time it takes for an application to produce its first frame'),
  419. kind: FieldKind.METRICS,
  420. valueType: FieldValueType.DURATION,
  421. },
  422. };
  423. export const SPAN_OP_FIELDS: Record<SpanOpBreakdown, FieldDefinition> = {
  424. [SpanOpBreakdown.SpansBrowser]: {
  425. desc: t('Cumulative time based on the browser operation'),
  426. kind: FieldKind.METRICS,
  427. valueType: FieldValueType.DURATION,
  428. },
  429. [SpanOpBreakdown.SpansDb]: {
  430. desc: t('Cumulative time based on the database operation'),
  431. kind: FieldKind.METRICS,
  432. valueType: FieldValueType.DURATION,
  433. },
  434. [SpanOpBreakdown.SpansHttp]: {
  435. desc: t('Cumulative time based on the http operation'),
  436. kind: FieldKind.METRICS,
  437. valueType: FieldValueType.DURATION,
  438. },
  439. [SpanOpBreakdown.SpansResource]: {
  440. desc: t('Cumulative time based on the resource operation'),
  441. kind: FieldKind.METRICS,
  442. valueType: FieldValueType.DURATION,
  443. },
  444. [SpanOpBreakdown.SpansUi]: {
  445. desc: t('Cumulative time based on the ui operation'),
  446. kind: FieldKind.METRICS,
  447. valueType: FieldValueType.DURATION,
  448. },
  449. };
  450. type AllEventFieldKeys =
  451. | keyof typeof AGGREGATION_FIELDS
  452. | keyof typeof MEASUREMENT_FIELDS
  453. | keyof typeof SPAN_OP_FIELDS
  454. | FieldKey;
  455. const EVENT_FIELD_DEFINITIONS: Record<AllEventFieldKeys, FieldDefinition> = {
  456. ...AGGREGATION_FIELDS,
  457. ...MEASUREMENT_FIELDS,
  458. ...SPAN_OP_FIELDS,
  459. [FieldKey.AGE]: {
  460. desc: t('The age of the issue in relative time'),
  461. kind: FieldKind.FIELD,
  462. valueType: FieldValueType.DURATION,
  463. },
  464. [FieldKey.ASSIGNED]: {
  465. desc: t('Assignee of the issue as a user ID'),
  466. kind: FieldKind.FIELD,
  467. valueType: FieldValueType.STRING,
  468. },
  469. [FieldKey.ASSIGNED_OR_SUGGESTED]: {
  470. desc: t('Assignee or suggestee of the issue as a user ID'),
  471. kind: FieldKind.FIELD,
  472. valueType: FieldValueType.STRING,
  473. },
  474. [FieldKey.CULPRIT]: {
  475. deprecated: true,
  476. kind: FieldKind.FIELD,
  477. valueType: FieldValueType.STRING,
  478. },
  479. [FieldKey.BOOKMARKS]: {
  480. desc: t('The issues bookmarked by a user ID'),
  481. kind: FieldKind.FIELD,
  482. valueType: FieldValueType.STRING,
  483. },
  484. [FieldKey.DEVICE_ARCH]: {
  485. desc: t('CPU architecture'),
  486. kind: FieldKind.FIELD,
  487. valueType: FieldValueType.STRING,
  488. },
  489. [FieldKey.DEVICE_BATTERY_LEVEL]: {
  490. desc: t('Indicates remaining battery life'),
  491. kind: FieldKind.FIELD,
  492. valueType: FieldValueType.STRING,
  493. },
  494. [FieldKey.DEVICE_BRAND]: {
  495. desc: t('Brand of device'),
  496. kind: FieldKind.FIELD,
  497. valueType: FieldValueType.STRING,
  498. },
  499. [FieldKey.DEVICE_CHARGING]: {
  500. desc: t('Charging at the time of the event'),
  501. kind: FieldKind.FIELD,
  502. valueType: FieldValueType.BOOLEAN,
  503. },
  504. [FieldKey.DEVICE_CLASS]: {
  505. desc: t('The estimated performance level of the device, graded low, medium, or high'),
  506. kind: FieldKind.FIELD,
  507. valueType: FieldValueType.STRING,
  508. },
  509. [FieldKey.DEVICE_FAMILY]: {
  510. desc: t('Model name across generations'),
  511. kind: FieldKind.FIELD,
  512. valueType: FieldValueType.STRING,
  513. },
  514. [FieldKey.DEVICE_LOCALE]: {
  515. desc: t("The locale of the user's device"),
  516. kind: FieldKind.FIELD,
  517. valueType: FieldValueType.STRING,
  518. },
  519. [FieldKey.DEVICE_MODEL_ID]: {
  520. desc: t('Internal hardware revision'),
  521. kind: FieldKind.FIELD,
  522. valueType: FieldValueType.STRING,
  523. },
  524. [FieldKey.DEVICE_NAME]: {
  525. desc: t('Descriptor details'),
  526. kind: FieldKind.FIELD,
  527. valueType: FieldValueType.STRING,
  528. },
  529. [FieldKey.DEVICE_ONLINE]: {
  530. desc: t('Online at the time of the event'),
  531. kind: FieldKind.FIELD,
  532. valueType: FieldValueType.BOOLEAN,
  533. },
  534. [FieldKey.DEVICE_ORIENTATION]: {
  535. desc: t('Portrait or landscape view '),
  536. kind: FieldKind.FIELD,
  537. valueType: FieldValueType.STRING,
  538. },
  539. [FieldKey.DEVICE_SCREEN_DENSITY]: {
  540. desc: t('Pixel density of the device screen'),
  541. kind: FieldKind.FIELD,
  542. valueType: FieldValueType.STRING,
  543. },
  544. [FieldKey.DEVICE_SCREEN_DPI]: {
  545. desc: t('Dots per inch of the device screen'),
  546. kind: FieldKind.FIELD,
  547. valueType: FieldValueType.STRING,
  548. },
  549. [FieldKey.DEVICE_SCREEN_HEIGHT_PIXELS]: {
  550. desc: t('Height of the device screen in pixels'),
  551. kind: FieldKind.FIELD,
  552. valueType: FieldValueType.STRING,
  553. },
  554. [FieldKey.DEVICE_SCREEN_WIDTH_PIXELS]: {
  555. desc: t('Width of the device screen in pixels'),
  556. kind: FieldKind.FIELD,
  557. valueType: FieldValueType.STRING,
  558. },
  559. [FieldKey.DEVICE_SIMULATOR]: {
  560. desc: t('Indicates if it occured on a simulator'),
  561. kind: FieldKind.FIELD,
  562. valueType: FieldValueType.BOOLEAN,
  563. },
  564. [FieldKey.DEVICE_UUID]: {
  565. desc: t('Unique device identifier'),
  566. kind: FieldKind.FIELD,
  567. valueType: FieldValueType.STRING,
  568. },
  569. [FieldKey.DIST]: {
  570. desc: t(
  571. 'Distinguishes between build or deployment variants of the same release of an application.'
  572. ),
  573. kind: FieldKind.FIELD,
  574. valueType: FieldValueType.STRING,
  575. },
  576. [FieldKey.ENVIRONMENT]: {
  577. desc: t('The environment the event was seen in'),
  578. kind: FieldKind.FIELD,
  579. valueType: FieldValueType.STRING,
  580. },
  581. [FieldKey.ERROR_HANDLED]: {
  582. desc: t('Determines handling status of the error'),
  583. kind: FieldKind.FIELD,
  584. valueType: FieldValueType.BOOLEAN,
  585. },
  586. [FieldKey.ERROR_MECHANISM]: {
  587. desc: t('The mechanism that created the error'),
  588. kind: FieldKind.FIELD,
  589. valueType: FieldValueType.STRING,
  590. },
  591. [FieldKey.ERROR_TYPE]: {
  592. desc: t('The type of exception'),
  593. kind: FieldKind.FIELD,
  594. valueType: FieldValueType.STRING,
  595. },
  596. [FieldKey.ERROR_UNHANDLED]: {
  597. desc: t('Determines unhandling status of the error'),
  598. kind: FieldKind.FIELD,
  599. valueType: FieldValueType.BOOLEAN,
  600. },
  601. [FieldKey.ERROR_VALUE]: {
  602. desc: t('Original value that exhibits error'),
  603. kind: FieldKind.FIELD,
  604. valueType: FieldValueType.STRING,
  605. },
  606. [FieldKey.ERROR_RECEIVED]: {
  607. desc: t('The datetime that the error was received'),
  608. kind: FieldKind.FIELD,
  609. valueType: FieldValueType.DATE,
  610. },
  611. [FieldKey.EVENT_TIMESTAMP]: {
  612. desc: t('Date and time of the event'),
  613. kind: FieldKind.FIELD,
  614. valueType: FieldValueType.DATE,
  615. },
  616. [FieldKey.EVENT_TYPE]: {
  617. desc: t('Type of event (Errors, transactions, csp and default)'),
  618. kind: FieldKind.FIELD,
  619. valueType: FieldValueType.STRING,
  620. },
  621. [FieldKey.GEO_CITY]: {
  622. desc: t('Full name of the city'),
  623. kind: FieldKind.FIELD,
  624. valueType: FieldValueType.STRING,
  625. },
  626. [FieldKey.GEO_COUNTRY_CODE]: {
  627. desc: t('Country code based on ISO 3166-1'),
  628. kind: FieldKind.FIELD,
  629. valueType: FieldValueType.STRING,
  630. },
  631. [FieldKey.GEO_REGION]: {
  632. desc: t('Full name of the country'),
  633. kind: FieldKind.FIELD,
  634. valueType: FieldValueType.STRING,
  635. },
  636. [FieldKey.HTTP_METHOD]: {
  637. desc: t('Method of the request that created the event'),
  638. kind: FieldKind.FIELD,
  639. valueType: FieldValueType.STRING,
  640. },
  641. [FieldKey.HTTP_REFERER]: {
  642. desc: t('The web page the resource was requested from'),
  643. kind: FieldKind.FIELD,
  644. valueType: FieldValueType.STRING,
  645. },
  646. [FieldKey.HTTP_STATUS_CODE]: {
  647. desc: t('Type of response (i.e., 200, 404)'),
  648. kind: FieldKind.FIELD,
  649. valueType: FieldValueType.STRING,
  650. },
  651. [FieldKey.HTTP_URL]: {
  652. desc: t('Full URL of the request without parameters'),
  653. kind: FieldKind.FIELD,
  654. valueType: FieldValueType.STRING,
  655. },
  656. [FieldKey.ID]: {
  657. desc: t('The event identification number'),
  658. kind: FieldKind.FIELD,
  659. valueType: FieldValueType.STRING,
  660. },
  661. [FieldKey.IS]: {
  662. desc: t('The properties of an issue (i.e. Resolved, unresolved)'),
  663. kind: FieldKind.FIELD,
  664. valueType: FieldValueType.STRING,
  665. keywords: ['ignored', 'assigned', 'for_review', 'unassigned', 'linked', 'unlinked'],
  666. },
  667. [FieldKey.ISSUE]: {
  668. desc: t('The issue identification short code'),
  669. kind: FieldKind.FIELD,
  670. valueType: FieldValueType.STRING,
  671. },
  672. [FieldKey.ISSUE_CATEGORY]: {
  673. desc: t('Category of issue (error or performance)'),
  674. kind: FieldKind.FIELD,
  675. valueType: FieldValueType.STRING,
  676. keywords: ['error', 'performance'],
  677. },
  678. [FieldKey.ISSUE_TYPE]: {
  679. desc: t('Type of problem the issue represents (i.e. N+1 Query)'),
  680. kind: FieldKind.FIELD,
  681. valueType: FieldValueType.STRING,
  682. },
  683. [FieldKey.LAST_SEEN]: {
  684. desc: t('Issues last seen at a given time'),
  685. kind: FieldKind.FIELD,
  686. valueType: FieldValueType.DATE,
  687. },
  688. [FieldKey.LEVEL]: {
  689. kind: FieldKind.FIELD,
  690. desc: t('Severity of the event (i.e., fatal, error, warning)'),
  691. valueType: FieldValueType.STRING,
  692. },
  693. [FieldKey.LOCATION]: {
  694. desc: t('Location of error'),
  695. kind: FieldKind.FIELD,
  696. valueType: FieldValueType.STRING,
  697. },
  698. [FieldKey.MESSAGE]: {
  699. desc: t('Error message or transaction name'),
  700. kind: FieldKind.FIELD,
  701. valueType: FieldValueType.STRING,
  702. },
  703. [FieldKey.OS]: {
  704. desc: t('Build and kernel version'),
  705. kind: FieldKind.FIELD,
  706. valueType: FieldValueType.STRING,
  707. },
  708. [FieldKey.OS_BUILD]: {
  709. desc: t('Name of the build'),
  710. kind: FieldKind.FIELD,
  711. valueType: FieldValueType.STRING,
  712. },
  713. [FieldKey.OS_KERNEL_VERSION]: {
  714. desc: t('Version number'),
  715. kind: FieldKind.FIELD,
  716. valueType: FieldValueType.STRING,
  717. },
  718. [FieldKey.PLATFORM]: {
  719. desc: t('Name of the platform'),
  720. kind: FieldKind.FIELD,
  721. valueType: FieldValueType.STRING,
  722. },
  723. [FieldKey.PLATFORM_NAME]: {
  724. desc: t('Name of the platform'),
  725. kind: FieldKind.FIELD,
  726. valueType: FieldValueType.STRING,
  727. },
  728. [FieldKey.PROFILE_ID]: {
  729. desc: t('The ID of an associated profile'),
  730. kind: FieldKind.FIELD,
  731. valueType: FieldValueType.STRING,
  732. },
  733. [FieldKey.PROJECT]: {
  734. kind: FieldKind.FIELD,
  735. valueType: FieldValueType.STRING,
  736. },
  737. [FieldKey.FIRST_RELEASE]: {
  738. desc: t('Issues first seen in a given release'),
  739. kind: FieldKind.FIELD,
  740. valueType: FieldValueType.STRING,
  741. },
  742. [FieldKey.FIRST_SEEN]: {
  743. desc: t('Issues first seen at a given time'),
  744. kind: FieldKind.FIELD,
  745. valueType: FieldValueType.DATE,
  746. },
  747. [FieldKey.HAS]: {
  748. desc: t('Determines if a tag or field exists in an event'),
  749. kind: FieldKind.FIELD,
  750. valueType: FieldValueType.STRING,
  751. },
  752. [FieldKey.RELEASE]: {
  753. desc: t('The version of your code deployed to an environment'),
  754. kind: FieldKind.FIELD,
  755. valueType: FieldValueType.STRING,
  756. },
  757. [FieldKey.RELEASE_BUILD]: {
  758. desc: t('The full version number that identifies the iteration'),
  759. kind: FieldKind.FIELD,
  760. valueType: FieldValueType.STRING,
  761. },
  762. [FieldKey.RELEASE_PACKAGE]: {
  763. desc: t('The identifier unique to the project or application'),
  764. kind: FieldKind.FIELD,
  765. valueType: FieldValueType.STRING,
  766. },
  767. [FieldKey.RELEASE_STAGE]: {
  768. desc: t('Stage of usage (i.e., adopted, replaced, low)'),
  769. kind: FieldKind.FIELD,
  770. valueType: FieldValueType.STRING,
  771. },
  772. [FieldKey.RELEASE_VERSION]: {
  773. desc: t('An abbreviated version number of the build'),
  774. kind: FieldKind.FIELD,
  775. valueType: FieldValueType.STRING,
  776. },
  777. [FieldKey.REPLAY_ID]: {
  778. desc: t('The ID of an associated Session Replay'),
  779. kind: FieldKind.TAG,
  780. valueType: FieldValueType.STRING,
  781. },
  782. [FieldKey.SDK_NAME]: {
  783. desc: t('Name of the platform that sent the event'),
  784. kind: FieldKind.FIELD,
  785. valueType: FieldValueType.STRING,
  786. },
  787. [FieldKey.SDK_VERSION]: {
  788. desc: t('Version of the platform that sent the event'),
  789. kind: FieldKind.FIELD,
  790. valueType: FieldValueType.STRING,
  791. },
  792. [FieldKey.STACK_ABS_PATH]: {
  793. desc: t('Absolute path to the source file'),
  794. kind: FieldKind.FIELD,
  795. valueType: FieldValueType.STRING,
  796. },
  797. [FieldKey.STACK_COLNO]: {
  798. desc: t('Column number of the call starting at 1'),
  799. kind: FieldKind.FIELD,
  800. valueType: FieldValueType.NUMBER,
  801. },
  802. [FieldKey.STACK_FILENAME]: {
  803. desc: t('Relative path to the source file from the root directory'),
  804. kind: FieldKind.FIELD,
  805. valueType: FieldValueType.STRING,
  806. },
  807. [FieldKey.STACK_FUNCTION]: {
  808. desc: t('Name of function being called'),
  809. kind: FieldKind.FIELD,
  810. valueType: FieldValueType.STRING,
  811. },
  812. [FieldKey.STACK_IN_APP]: {
  813. desc: t('Indicates if frame is related to relevant code in stack trace'),
  814. kind: FieldKind.FIELD,
  815. valueType: FieldValueType.BOOLEAN,
  816. },
  817. [FieldKey.STACK_LINENO]: {
  818. desc: t('Line number of the call starting at 1'),
  819. kind: FieldKind.FIELD,
  820. valueType: FieldValueType.NUMBER,
  821. },
  822. [FieldKey.STACK_MODULE]: {
  823. desc: t('Platform specific module path'),
  824. kind: FieldKind.FIELD,
  825. valueType: FieldValueType.STRING,
  826. },
  827. [FieldKey.STACK_PACKAGE]: {
  828. desc: t('The package the frame is from'),
  829. kind: FieldKind.FIELD,
  830. valueType: FieldValueType.STRING,
  831. },
  832. [FieldKey.STACK_RESOURCE]: {
  833. desc: t('The package the frame is from'),
  834. kind: FieldKind.FIELD,
  835. valueType: FieldValueType.STRING,
  836. },
  837. [FieldKey.STACK_STACK_LEVEL]: {
  838. desc: t('Number of frames per stacktrace'),
  839. kind: FieldKind.FIELD,
  840. valueType: FieldValueType.NUMBER,
  841. },
  842. [FieldKey.TIMES_SEEN]: {
  843. desc: t('Total number of events'),
  844. kind: FieldKind.FIELD,
  845. valueType: FieldValueType.NUMBER,
  846. keywords: ['count'],
  847. },
  848. [FieldKey.TIMESTAMP]: {
  849. desc: t('The time an event finishes'),
  850. kind: FieldKind.FIELD,
  851. valueType: FieldValueType.DATE,
  852. },
  853. [FieldKey.TIMESTAMP_TO_HOUR]: {
  854. desc: t('Rounded down to the nearest hour'),
  855. kind: FieldKind.FIELD,
  856. valueType: FieldValueType.DATE,
  857. },
  858. [FieldKey.TIMESTAMP_TO_DAY]: {
  859. desc: t('Rounded down to the nearest day'),
  860. kind: FieldKind.FIELD,
  861. valueType: FieldValueType.DATE,
  862. },
  863. [FieldKey.TITLE]: {
  864. desc: t('Error or transaction name identifier'),
  865. kind: FieldKind.FIELD,
  866. valueType: FieldValueType.STRING,
  867. },
  868. [FieldKey.TRACE]: {
  869. desc: t('The trace identification number'),
  870. kind: FieldKind.FIELD,
  871. valueType: FieldValueType.STRING,
  872. },
  873. [FieldKey.TOTAL_COUNT]: {
  874. desc: t('The total number of events for the current query'),
  875. kind: FieldKind.FIELD,
  876. valueType: FieldValueType.NUMBER,
  877. },
  878. [FieldKey.TRACE_PARENT_SPAN]: {
  879. desc: t('Span identification number of the parent to the event'),
  880. kind: FieldKind.FIELD,
  881. valueType: FieldValueType.STRING,
  882. },
  883. [FieldKey.TRACE_SPAN]: {
  884. desc: t('Span identification number of the root span'),
  885. kind: FieldKind.FIELD,
  886. valueType: FieldValueType.STRING,
  887. },
  888. [FieldKey.TRANSACTION]: {
  889. desc: t('Error or transaction name identifier'),
  890. kind: FieldKind.FIELD,
  891. valueType: FieldValueType.STRING,
  892. },
  893. [FieldKey.TRANSACTION_OP]: {
  894. desc: t('Short code identifying the type of operation the span is measuring'),
  895. kind: FieldKind.FIELD,
  896. valueType: FieldValueType.STRING,
  897. },
  898. [FieldKey.TRANSACTION_DURATION]: {
  899. desc: t('Duration, in milliseconds, of the transaction'),
  900. kind: FieldKind.FIELD,
  901. valueType: FieldValueType.DURATION,
  902. },
  903. [FieldKey.TRANSACTION_STATUS]: {
  904. desc: t('Describes the status of the span/transaction'),
  905. kind: FieldKind.FIELD,
  906. valueType: FieldValueType.STRING,
  907. },
  908. [FieldKey.UNREAL_CRASH_TYPE]: {
  909. desc: t('Crash type of an Unreal event'),
  910. kind: FieldKind.FIELD,
  911. valueType: FieldValueType.STRING,
  912. },
  913. [FieldKey.USER]: {
  914. desc: t('User identification value'),
  915. kind: FieldKind.FIELD,
  916. valueType: FieldValueType.STRING,
  917. },
  918. [FieldKey.USER_DISPLAY]: {
  919. desc: t('The first user field available of email, username, ID, and IP'),
  920. kind: FieldKind.FIELD,
  921. valueType: FieldValueType.STRING,
  922. },
  923. [FieldKey.USER_EMAIL]: {
  924. desc: t('Email address of the user'),
  925. kind: FieldKind.FIELD,
  926. valueType: FieldValueType.STRING,
  927. },
  928. [FieldKey.USER_ID]: {
  929. desc: t('Application specific internal identifier of the user'),
  930. kind: FieldKind.FIELD,
  931. valueType: FieldValueType.STRING,
  932. },
  933. [FieldKey.USER_IP]: {
  934. desc: t('IP Address of the user'),
  935. kind: FieldKind.FIELD,
  936. valueType: FieldValueType.STRING,
  937. },
  938. [FieldKey.USER_USERNAME]: {
  939. desc: t('Username of the user'),
  940. kind: FieldKind.FIELD,
  941. valueType: FieldValueType.STRING,
  942. },
  943. [FieldKey.APP_IN_FOREGROUND]: {
  944. desc: t('Indicates if the app is in the foreground or background'),
  945. kind: FieldKind.FIELD,
  946. valueType: FieldValueType.BOOLEAN,
  947. },
  948. };
  949. export const ISSUE_FIELDS = [
  950. FieldKey.AGE,
  951. FieldKey.ASSIGNED,
  952. FieldKey.ASSIGNED_OR_SUGGESTED,
  953. FieldKey.BOOKMARKS,
  954. FieldKey.DEVICE_ARCH,
  955. FieldKey.DEVICE_BRAND,
  956. FieldKey.DEVICE_CLASS,
  957. FieldKey.DEVICE_FAMILY,
  958. FieldKey.DEVICE_LOCALE,
  959. FieldKey.DEVICE_LOCALE,
  960. FieldKey.DEVICE_MODEL_ID,
  961. FieldKey.DEVICE_ORIENTATION,
  962. FieldKey.DEVICE_UUID,
  963. FieldKey.DIST,
  964. FieldKey.ERROR_HANDLED,
  965. FieldKey.ERROR_MECHANISM,
  966. FieldKey.ERROR_TYPE,
  967. FieldKey.ERROR_UNHANDLED,
  968. FieldKey.ERROR_VALUE,
  969. FieldKey.EVENT_TIMESTAMP,
  970. FieldKey.EVENT_TYPE,
  971. FieldKey.FIRST_RELEASE,
  972. FieldKey.FIRST_SEEN,
  973. FieldKey.GEO_CITY,
  974. FieldKey.GEO_COUNTRY_CODE,
  975. FieldKey.GEO_REGION,
  976. FieldKey.HAS,
  977. FieldKey.HTTP_METHOD,
  978. FieldKey.HTTP_REFERER,
  979. FieldKey.HTTP_STATUS_CODE,
  980. FieldKey.HTTP_URL,
  981. FieldKey.ID,
  982. FieldKey.IS,
  983. FieldKey.ISSUE,
  984. FieldKey.ISSUE_CATEGORY,
  985. FieldKey.ISSUE_TYPE,
  986. FieldKey.LAST_SEEN,
  987. FieldKey.LOCATION,
  988. FieldKey.MESSAGE,
  989. FieldKey.OS_BUILD,
  990. FieldKey.OS_KERNEL_VERSION,
  991. FieldKey.PLATFORM,
  992. FieldKey.RELEASE,
  993. FieldKey.RELEASE_BUILD,
  994. FieldKey.RELEASE_PACKAGE,
  995. FieldKey.RELEASE_STAGE,
  996. FieldKey.RELEASE_VERSION,
  997. FieldKey.SDK_NAME,
  998. FieldKey.SDK_VERSION,
  999. FieldKey.STACK_ABS_PATH,
  1000. FieldKey.STACK_FILENAME,
  1001. FieldKey.STACK_FUNCTION,
  1002. FieldKey.STACK_MODULE,
  1003. FieldKey.STACK_PACKAGE,
  1004. FieldKey.STACK_STACK_LEVEL,
  1005. FieldKey.TIMESTAMP,
  1006. FieldKey.TIMES_SEEN,
  1007. FieldKey.TITLE,
  1008. FieldKey.TRACE,
  1009. FieldKey.TRANSACTION,
  1010. FieldKey.UNREAL_CRASH_TYPE,
  1011. FieldKey.USER_EMAIL,
  1012. FieldKey.USER_ID,
  1013. FieldKey.USER_IP,
  1014. FieldKey.USER_USERNAME,
  1015. FieldKey.APP_IN_FOREGROUND,
  1016. ];
  1017. /**
  1018. * Refer to src/sentry/snuba/events.py, search for Columns
  1019. */
  1020. export const DISCOVER_FIELDS = [
  1021. FieldKey.ID,
  1022. // issue.id and project.id are omitted on purpose.
  1023. // Customers should use `issue` and `project` instead.
  1024. FieldKey.TIMESTAMP,
  1025. // time is omitted on purpose.
  1026. // Customers should use `timestamp` or `timestamp.to_hour`.
  1027. FieldKey.TIMESTAMP_TO_HOUR,
  1028. FieldKey.TIMESTAMP_TO_DAY,
  1029. FieldKey.CULPRIT,
  1030. FieldKey.LOCATION,
  1031. FieldKey.MESSAGE,
  1032. FieldKey.PLATFORM_NAME,
  1033. FieldKey.ENVIRONMENT,
  1034. FieldKey.RELEASE,
  1035. FieldKey.DIST,
  1036. FieldKey.TITLE,
  1037. FieldKey.EVENT_TYPE,
  1038. // tags.key and tags.value are omitted on purpose as well.
  1039. FieldKey.TRANSACTION,
  1040. FieldKey.UNREAL_CRASH_TYPE,
  1041. FieldKey.USER,
  1042. FieldKey.USER_ID,
  1043. FieldKey.USER_EMAIL,
  1044. FieldKey.USER_USERNAME,
  1045. FieldKey.USER_IP,
  1046. FieldKey.SDK_NAME,
  1047. FieldKey.SDK_VERSION,
  1048. FieldKey.HTTP_METHOD,
  1049. FieldKey.HTTP_REFERER,
  1050. FieldKey.HTTP_STATUS_CODE,
  1051. FieldKey.HTTP_URL,
  1052. FieldKey.OS_BUILD,
  1053. FieldKey.OS_KERNEL_VERSION,
  1054. FieldKey.DEVICE_NAME,
  1055. FieldKey.DEVICE_BRAND,
  1056. FieldKey.DEVICE_LOCALE,
  1057. FieldKey.DEVICE_UUID,
  1058. FieldKey.DEVICE_ARCH,
  1059. FieldKey.DEVICE_FAMILY,
  1060. FieldKey.DEVICE_BATTERY_LEVEL,
  1061. FieldKey.DEVICE_ORIENTATION,
  1062. FieldKey.DEVICE_SCREEN_DENSITY,
  1063. FieldKey.DEVICE_SCREEN_DPI,
  1064. FieldKey.DEVICE_SCREEN_HEIGHT_PIXELS,
  1065. FieldKey.DEVICE_SCREEN_WIDTH_PIXELS,
  1066. FieldKey.DEVICE_SIMULATOR,
  1067. FieldKey.DEVICE_ONLINE,
  1068. FieldKey.DEVICE_CHARGING,
  1069. FieldKey.DEVICE_CLASS,
  1070. FieldKey.GEO_COUNTRY_CODE,
  1071. FieldKey.GEO_REGION,
  1072. FieldKey.GEO_CITY,
  1073. FieldKey.ERROR_TYPE,
  1074. FieldKey.ERROR_VALUE,
  1075. FieldKey.ERROR_MECHANISM,
  1076. FieldKey.ERROR_HANDLED,
  1077. FieldKey.ERROR_UNHANDLED,
  1078. FieldKey.ERROR_RECEIVED,
  1079. FieldKey.LEVEL,
  1080. FieldKey.STACK_ABS_PATH,
  1081. FieldKey.STACK_FILENAME,
  1082. FieldKey.STACK_PACKAGE,
  1083. FieldKey.STACK_MODULE,
  1084. FieldKey.STACK_FUNCTION,
  1085. FieldKey.STACK_IN_APP,
  1086. FieldKey.STACK_COLNO,
  1087. FieldKey.STACK_LINENO,
  1088. FieldKey.STACK_STACK_LEVEL,
  1089. // contexts.key and contexts.value omitted on purpose.
  1090. // App context fields
  1091. FieldKey.APP_IN_FOREGROUND,
  1092. // Transaction event fields.
  1093. FieldKey.TRANSACTION_DURATION,
  1094. FieldKey.TRANSACTION_OP,
  1095. FieldKey.TRANSACTION_STATUS,
  1096. FieldKey.TRACE,
  1097. FieldKey.TRACE_SPAN,
  1098. FieldKey.TRACE_PARENT_SPAN,
  1099. FieldKey.PROFILE_ID,
  1100. // Meta field that returns total count, usually for equations
  1101. FieldKey.TOTAL_COUNT,
  1102. // Field alises defined in src/sentry/api/event_search.py
  1103. FieldKey.PROJECT,
  1104. FieldKey.ISSUE,
  1105. FieldKey.USER_DISPLAY,
  1106. // Span Op fields
  1107. SpanOpBreakdown.SpansBrowser,
  1108. SpanOpBreakdown.SpansDb,
  1109. SpanOpBreakdown.SpansHttp,
  1110. SpanOpBreakdown.SpansResource,
  1111. SpanOpBreakdown.SpansUi,
  1112. ];
  1113. enum ReplayFieldKey {
  1114. ACTIVITY = 'activity',
  1115. BROWSER_NAME = 'browser.name',
  1116. BROWSER_VERSION = 'browser.version',
  1117. COUNT_ERRORS = 'count_errors',
  1118. COUNT_SEGMENTS = 'count_segments',
  1119. COUNT_URLS = 'count_urls',
  1120. DURATION = 'duration',
  1121. ERROR_IDS = 'error_ids',
  1122. OS_NAME = 'os.name',
  1123. OS_VERSION = 'os.version',
  1124. URLS = 'urls',
  1125. }
  1126. enum ReplayClickFieldKey {
  1127. CLICK_ALT = 'replay_click.alt',
  1128. CLICK_CLASS = 'replay_click.class',
  1129. CLICK_ID = 'replay_click.id',
  1130. CLICK_LABEL = 'replay_click.label',
  1131. CLICK_ROLE = 'replay_click.role',
  1132. CLICK_TAG = 'replay_click.tag',
  1133. CLICK_TESTID = 'replay_click.testid',
  1134. CLICK_TEXT_CONTENT = 'replay_click.textContent',
  1135. CLICK_TITLE = 'replay_click.title',
  1136. }
  1137. /**
  1138. * Some fields inside the ReplayRecord type are intentionally omitted:
  1139. * `environment` -> Not backend support, omitted because we have a dropdown for it
  1140. * `finishedAt` -> No backend support, omitted because we StartDate dropdown and duration field support
  1141. * `startedAt` -> No backend support, Omitted because we have StartDate dropdown
  1142. * `longestTransaction` -> value is always zero
  1143. * `title` -> value is always the empty string
  1144. */
  1145. export const REPLAY_FIELDS = [
  1146. ReplayFieldKey.ACTIVITY,
  1147. ReplayFieldKey.BROWSER_NAME,
  1148. ReplayFieldKey.BROWSER_VERSION,
  1149. ReplayFieldKey.COUNT_ERRORS,
  1150. ReplayFieldKey.COUNT_SEGMENTS,
  1151. ReplayFieldKey.COUNT_URLS,
  1152. FieldKey.DEVICE_BRAND,
  1153. FieldKey.DEVICE_FAMILY,
  1154. FieldKey.DEVICE_MODEL_ID,
  1155. FieldKey.DEVICE_NAME,
  1156. FieldKey.DIST,
  1157. ReplayFieldKey.DURATION,
  1158. ReplayFieldKey.ERROR_IDS,
  1159. FieldKey.ID,
  1160. ReplayFieldKey.OS_NAME,
  1161. ReplayFieldKey.OS_VERSION,
  1162. FieldKey.PLATFORM,
  1163. FieldKey.RELEASE,
  1164. FieldKey.SDK_NAME,
  1165. FieldKey.SDK_VERSION,
  1166. FieldKey.TRACE,
  1167. ReplayFieldKey.URLS,
  1168. FieldKey.USER_EMAIL,
  1169. FieldKey.USER_ID,
  1170. FieldKey.USER_IP,
  1171. FieldKey.USER_USERNAME,
  1172. ];
  1173. const REPLAY_FIELD_DEFINITIONS: Record<ReplayFieldKey, FieldDefinition> = {
  1174. [ReplayFieldKey.ACTIVITY]: {
  1175. desc: t('Amount of activity in the replay from 0 to 10'),
  1176. kind: FieldKind.FIELD,
  1177. valueType: FieldValueType.INTEGER,
  1178. },
  1179. [ReplayFieldKey.BROWSER_NAME]: {
  1180. desc: t('Name of the browser'),
  1181. kind: FieldKind.FIELD,
  1182. valueType: FieldValueType.STRING,
  1183. },
  1184. [ReplayFieldKey.BROWSER_VERSION]: {
  1185. desc: t('Version number of the browser'),
  1186. kind: FieldKind.FIELD,
  1187. valueType: FieldValueType.STRING,
  1188. },
  1189. [ReplayFieldKey.COUNT_ERRORS]: {
  1190. desc: t('Number of errors in the replay'),
  1191. kind: FieldKind.FIELD,
  1192. valueType: FieldValueType.INTEGER,
  1193. },
  1194. [ReplayFieldKey.COUNT_SEGMENTS]: {
  1195. desc: t('Number of segments in the replay'),
  1196. kind: FieldKind.FIELD,
  1197. valueType: FieldValueType.INTEGER,
  1198. },
  1199. [ReplayFieldKey.COUNT_URLS]: {
  1200. desc: t('Number of urls visited within the replay'),
  1201. kind: FieldKind.FIELD,
  1202. valueType: FieldValueType.INTEGER,
  1203. },
  1204. [ReplayFieldKey.DURATION]: {
  1205. desc: t('Duration of the replay, in seconds'),
  1206. kind: FieldKind.FIELD,
  1207. valueType: FieldValueType.DURATION,
  1208. },
  1209. [ReplayFieldKey.ERROR_IDS]: {
  1210. desc: t('Error instance'),
  1211. kind: FieldKind.FIELD,
  1212. valueType: FieldValueType.STRING,
  1213. },
  1214. [ReplayFieldKey.OS_NAME]: {
  1215. desc: t('Name of the Operating System'),
  1216. kind: FieldKind.FIELD,
  1217. valueType: FieldValueType.STRING,
  1218. },
  1219. [ReplayFieldKey.OS_VERSION]: {
  1220. desc: t('Version number of the Operating System'),
  1221. kind: FieldKind.FIELD,
  1222. valueType: FieldValueType.STRING,
  1223. },
  1224. [ReplayFieldKey.URLS]: {
  1225. desc: t('List of urls that were visited within the Replay'),
  1226. kind: FieldKind.FIELD,
  1227. valueType: FieldValueType.STRING,
  1228. },
  1229. };
  1230. export const REPLAY_CLICK_FIELDS = [
  1231. ReplayClickFieldKey.CLICK_ALT,
  1232. ReplayClickFieldKey.CLICK_CLASS,
  1233. ReplayClickFieldKey.CLICK_ID,
  1234. ReplayClickFieldKey.CLICK_LABEL,
  1235. ReplayClickFieldKey.CLICK_ROLE,
  1236. ReplayClickFieldKey.CLICK_TAG,
  1237. ReplayClickFieldKey.CLICK_TEXT_CONTENT,
  1238. ReplayClickFieldKey.CLICK_TITLE,
  1239. ReplayClickFieldKey.CLICK_TESTID,
  1240. ];
  1241. // This is separated out from REPLAY_FIELD_DEFINITIONS so that it is feature-flaggable
  1242. const REPLAY_CLICK_FIELD_DEFINITIONS: Record<ReplayClickFieldKey, FieldDefinition> = {
  1243. [ReplayClickFieldKey.CLICK_ALT]: {
  1244. desc: t('`alt` of an element that was clicked'),
  1245. kind: FieldKind.FIELD,
  1246. valueType: FieldValueType.STRING,
  1247. },
  1248. [ReplayClickFieldKey.CLICK_CLASS]: {
  1249. desc: t('`class` of an element that was clicked'),
  1250. kind: FieldKind.FIELD,
  1251. valueType: FieldValueType.STRING,
  1252. },
  1253. [ReplayClickFieldKey.CLICK_ID]: {
  1254. desc: t('`id` of an element that was clicked'),
  1255. kind: FieldKind.FIELD,
  1256. valueType: FieldValueType.STRING,
  1257. },
  1258. [ReplayClickFieldKey.CLICK_LABEL]: {
  1259. desc: t('`aria-label` of an element that was clicked'),
  1260. kind: FieldKind.FIELD,
  1261. valueType: FieldValueType.STRING,
  1262. },
  1263. [ReplayClickFieldKey.CLICK_ROLE]: {
  1264. desc: t('`role` of an element that was clicked'),
  1265. kind: FieldKind.FIELD,
  1266. valueType: FieldValueType.STRING,
  1267. },
  1268. [ReplayClickFieldKey.CLICK_TAG]: {
  1269. desc: t('`tag` of an element that was clicked'),
  1270. kind: FieldKind.FIELD,
  1271. valueType: FieldValueType.STRING,
  1272. },
  1273. [ReplayClickFieldKey.CLICK_TESTID]: {
  1274. desc: t('`data-testid` or `data-test-id` of an element that was clicked'),
  1275. kind: FieldKind.FIELD,
  1276. valueType: FieldValueType.STRING,
  1277. },
  1278. [ReplayClickFieldKey.CLICK_TEXT_CONTENT]: {
  1279. desc: t('textContent of an element that was clicked'),
  1280. kind: FieldKind.FIELD,
  1281. valueType: FieldValueType.STRING,
  1282. },
  1283. [ReplayClickFieldKey.CLICK_TITLE]: {
  1284. desc: t('`title` of an element that was clicked'),
  1285. kind: FieldKind.FIELD,
  1286. valueType: FieldValueType.STRING,
  1287. },
  1288. };
  1289. export const getFieldDefinition = (
  1290. key: string,
  1291. type: 'event' | 'replay' | 'replay_click' = 'event'
  1292. ): FieldDefinition | null => {
  1293. switch (type) {
  1294. case 'replay':
  1295. if (key in REPLAY_FIELD_DEFINITIONS) {
  1296. return REPLAY_FIELD_DEFINITIONS[key];
  1297. }
  1298. if (key in REPLAY_CLICK_FIELD_DEFINITIONS) {
  1299. return REPLAY_CLICK_FIELD_DEFINITIONS[key];
  1300. }
  1301. if (REPLAY_FIELDS.includes(key as FieldKey)) {
  1302. return EVENT_FIELD_DEFINITIONS[key];
  1303. }
  1304. return null;
  1305. case 'event':
  1306. default:
  1307. return EVENT_FIELD_DEFINITIONS[key] ?? null;
  1308. }
  1309. };
  1310. export function makeTagCollection(fieldKeys: FieldKey[]): TagCollection {
  1311. return Object.fromEntries(
  1312. fieldKeys.map(fieldKey => [
  1313. fieldKey,
  1314. {
  1315. key: fieldKey,
  1316. name: fieldKey,
  1317. kind: getFieldDefinition(fieldKey)?.kind,
  1318. },
  1319. ])
  1320. );
  1321. }
  1322. export function isDeviceClass(key): boolean {
  1323. return key === FieldKey.DEVICE_CLASS;
  1324. }
  1325. export const DEVICE_CLASS_TAG_VALUES = ['high', 'medium', 'low'];