index.ts 47 KB

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