index.ts 47 KB

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