index.ts 36 KB

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