@oneuptime/common 14.0.10 → 14.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (837) hide show
  1. package/Models/DatabaseModels/AIConversation.ts +127 -1
  2. package/Models/DatabaseModels/CephCluster.ts +12 -0
  3. package/Models/DatabaseModels/CloudResource.ts +12 -0
  4. package/Models/DatabaseModels/DatabaseServer.ts +12 -0
  5. package/Models/DatabaseModels/DockerHost.ts +12 -0
  6. package/Models/DatabaseModels/DockerSwarmCluster.ts +12 -0
  7. package/Models/DatabaseModels/GlobalOidc.ts +0 -4
  8. package/Models/DatabaseModels/GlobalOidcProject.ts +0 -4
  9. package/Models/DatabaseModels/GlobalSso.ts +0 -4
  10. package/Models/DatabaseModels/GlobalSsoProject.ts +0 -4
  11. package/Models/DatabaseModels/Host.ts +12 -0
  12. package/Models/DatabaseModels/IncidentForm.ts +594 -0
  13. package/Models/DatabaseModels/IncidentFormSubmission.ts +283 -0
  14. package/Models/DatabaseModels/IncidentTemplate.ts +59 -0
  15. package/Models/DatabaseModels/Index.ts +14 -0
  16. package/Models/DatabaseModels/IoTFleet.ts +12 -0
  17. package/Models/DatabaseModels/KubernetesCluster.ts +12 -0
  18. package/Models/DatabaseModels/MessageQueue.ts +1102 -0
  19. package/Models/DatabaseModels/MessageQueueLabelRule.ts +553 -0
  20. package/Models/DatabaseModels/MessageQueueOwnerRule.ts +633 -0
  21. package/Models/DatabaseModels/MessageQueueOwnerTeam.ts +491 -0
  22. package/Models/DatabaseModels/MessageQueueOwnerUser.ts +490 -0
  23. package/Models/DatabaseModels/PodmanHost.ts +12 -0
  24. package/Models/DatabaseModels/Project.ts +59 -0
  25. package/Models/DatabaseModels/ProjectOidc.ts +0 -4
  26. package/Models/DatabaseModels/ProjectSso.ts +0 -4
  27. package/Models/DatabaseModels/ProxmoxCluster.ts +12 -0
  28. package/Models/DatabaseModels/RumApplication.ts +12 -0
  29. package/Models/DatabaseModels/ServerlessFunction.ts +12 -0
  30. package/Models/DatabaseModels/Service.ts +12 -0
  31. package/Models/DatabaseModels/StatusPageOidc.ts +0 -4
  32. package/Models/DatabaseModels/StatusPageSso.ts +0 -4
  33. package/Models/DatabaseModels/TeamComplianceSetting.ts +47 -2
  34. package/Models/DatabaseModels/VMwareVCenter.ts +12 -0
  35. package/Server/API/AIChatAPI.ts +13 -114
  36. package/Server/API/AIInvestigationAPI.ts +3 -3
  37. package/Server/API/AIInvestigationConversationAPI.ts +266 -0
  38. package/Server/API/IncidentFormAPI.ts +376 -0
  39. package/Server/API/ProjectOIDC.ts +16 -25
  40. package/Server/API/ProjectSSO.ts +16 -24
  41. package/Server/API/StatusPageAPI.ts +42 -77
  42. package/Server/Enterprise/EnterpriseEdition.ts +93 -28
  43. package/Server/Enterprise/EnterpriseFeature.ts +25 -3
  44. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +1 -1
  45. package/Server/Enterprise/EnterpriseServerModule.ts +4 -1
  46. package/Server/EnvironmentConfig.ts +1 -1
  47. package/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.ts +129 -0
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.ts +52 -0
  49. package/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.ts +75 -0
  50. package/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.ts +477 -0
  51. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  52. package/Server/Middleware/IncidentFormRateLimit.ts +847 -0
  53. package/Server/Middleware/UserAuthorization.ts +16 -38
  54. package/Server/Services/AIService.ts +10 -13
  55. package/Server/Services/IncidentCustomFieldService.ts +112 -2
  56. package/Server/Services/IncidentEpisodeMemberService.ts +24 -4
  57. package/Server/Services/IncidentEpisodeService.ts +10 -1
  58. package/Server/Services/IncidentFormService.ts +1566 -0
  59. package/Server/Services/IncidentFormSubmissionService.ts +97 -0
  60. package/Server/Services/IncidentGroupingEngineService.ts +45 -8
  61. package/Server/Services/IncidentService.ts +123 -5
  62. package/Server/Services/IncidentTemplateService.ts +22 -0
  63. package/Server/Services/Index.ts +14 -0
  64. package/Server/Services/MessageQueueLabelRuleEngineService.ts +321 -0
  65. package/Server/Services/MessageQueueLabelRuleService.ts +14 -0
  66. package/Server/Services/MessageQueueOwnerRuleEngineService.ts +412 -0
  67. package/Server/Services/MessageQueueOwnerRuleService.ts +14 -0
  68. package/Server/Services/MessageQueueOwnerTeamService.ts +62 -0
  69. package/Server/Services/MessageQueueOwnerUserService.ts +62 -0
  70. package/Server/Services/MessageQueueService.ts +1463 -0
  71. package/Server/Services/OpenTelemetryIngestService.ts +37 -4
  72. package/Server/Services/ProjectService.ts +0 -59
  73. package/Server/Services/StatusPagePrivateUserService.ts +1 -4
  74. package/Server/Services/StatusPageService.ts +1 -51
  75. package/Server/Services/TeamComplianceSettingService.ts +163 -42
  76. package/Server/Services/UserNotificationRuleService.ts +8 -1
  77. package/Server/Services/WorkspaceNotificationSummaryService.ts +12 -3
  78. package/Server/Types/Database/Permissions/CreatePermission.ts +17 -3
  79. package/Server/Types/Database/Permissions/EditionPermission.ts +140 -38
  80. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +16 -0
  81. package/Server/Types/Database/Permissions/TablePermission.ts +3 -3
  82. package/Server/Types/Database/Permissions/UpdatePermission.ts +20 -6
  83. package/Server/Utils/AI/Chat/AgentContextCompactor.ts +200 -0
  84. package/Server/Utils/AI/Chat/ChatAgentRunner.ts +307 -48
  85. package/Server/Utils/AI/Chat/ChatRunCancellation.ts +156 -0
  86. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +78 -18
  87. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
  88. package/Server/Utils/AI/Chat/ToolOutputPager.ts +322 -0
  89. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +88 -30
  90. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +13 -1
  91. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +0 -32
  92. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +27 -25
  93. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +7 -1
  94. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +34 -14
  95. package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +69 -24
  96. package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +9 -0
  97. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +53 -10
  98. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +27 -10
  99. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +27 -10
  100. package/Server/Utils/AI/SRE/InvestigationQueue.ts +16 -19
  101. package/Server/Utils/AI/SRE/InvestigationThread.ts +646 -0
  102. package/Server/Utils/AI/SRE/InvestigationThreadService.ts +715 -0
  103. package/Server/Utils/AI/Toolbox/Serializer.ts +10 -3
  104. package/Server/Utils/EditionEnforcement.ts +19 -202
  105. package/Server/Utils/LLM/LLMService.ts +259 -63
  106. package/Server/Utils/RelaxedScimTeamLocksReport.ts +245 -0
  107. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
  108. package/Server/Utils/SameOriginRequest.ts +203 -0
  109. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
  110. package/Server/Utils/Telemetry/EntityRegistry.ts +4 -1
  111. package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +1402 -0
  112. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +4 -1
  113. package/Server/Utils/VendorAssets.ts +3 -3
  114. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +3 -1
  115. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +3 -1
  116. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +10 -1
  117. package/Tests/App/Accounts/IncidentFormPage.test.tsx +2036 -0
  118. package/Tests/App/Accounts/IncidentFormServerMessages.test.ts +119 -0
  119. package/Tests/App/Accounts/IncidentFormUtils.test.ts +1157 -0
  120. package/Tests/App/Accounts/LoginPasskey.test.tsx +6 -4
  121. package/Tests/App/Accounts/LoginSso.test.tsx +724 -0
  122. package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +338 -0
  123. package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +331 -0
  124. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +47 -33
  125. package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +1021 -0
  126. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +876 -78
  127. package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +20 -3
  128. package/Tests/App/Dashboard/CephProxmoxVMwareDocumentationCards.test.tsx +359 -0
  129. package/Tests/App/Dashboard/CephSetupGuide.test.ts +961 -0
  130. package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +381 -95
  131. package/Tests/App/Dashboard/CloudSetupGuide.test.ts +1463 -0
  132. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +174 -12
  133. package/Tests/App/Dashboard/ContainerSetupGuideCards.test.tsx +345 -0
  134. package/Tests/App/Dashboard/CoreListEmptyStates.test.tsx +501 -0
  135. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +0 -1
  136. package/Tests/App/Dashboard/DatabaseDocumentationCard.test.tsx +400 -0
  137. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +5 -0
  138. package/Tests/App/Dashboard/DatabaseSetupGuide.test.ts +1869 -0
  139. package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +44 -0
  140. package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +50 -9
  141. package/Tests/App/Dashboard/DockerSetupGuide.test.ts +899 -0
  142. package/Tests/App/Dashboard/DockerSwarmSetupGuide.test.ts +964 -0
  143. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +141 -7
  144. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +52 -39
  145. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +7 -1
  146. package/Tests/App/Dashboard/GettingStartedTaskRoutes.test.tsx +331 -0
  147. package/Tests/App/Dashboard/HomeOverviewStatsFirstRun.test.tsx +925 -0
  148. package/Tests/App/Dashboard/HostDocumentationCard.test.tsx +225 -0
  149. package/Tests/App/Dashboard/HostSetupGuide.test.ts +1183 -0
  150. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +69 -45
  151. package/Tests/App/Dashboard/IncidentCreateTemplateCustomFieldSettings.test.tsx +745 -0
  152. package/Tests/App/Dashboard/IncidentCreateTemplateOwners.test.tsx +414 -0
  153. package/Tests/App/Dashboard/IncidentCustomFieldCreateSettingsForm.test.ts +1042 -0
  154. package/Tests/App/Dashboard/IncidentCustomFieldSettingsCard.test.tsx +1816 -0
  155. package/Tests/App/Dashboard/IncidentFormPlan.test.ts +89 -0
  156. package/Tests/App/Dashboard/IncidentFormShareLinkCard.test.tsx +846 -0
  157. package/Tests/App/Dashboard/IncidentFormsPages.test.tsx +1324 -0
  158. package/Tests/App/Dashboard/IncidentTemplateCustomFieldSettings.test.tsx +630 -0
  159. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +13 -0
  160. package/Tests/App/Dashboard/IncomingEmailMonitorLinkVerifyHint.test.tsx +104 -0
  161. package/Tests/App/Dashboard/InvestigationConversation.test.tsx +1107 -0
  162. package/Tests/App/Dashboard/InvestigationConversationData.test.ts +546 -0
  163. package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +170 -5
  164. package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +207 -2
  165. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +729 -34
  166. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +9 -21
  167. package/Tests/App/Dashboard/InvestigationReportView.test.tsx +274 -37
  168. package/Tests/App/Dashboard/InvestigationStatusBadge.test.tsx +130 -0
  169. package/Tests/App/Dashboard/IoTDocumentationCard.test.tsx +218 -0
  170. package/Tests/App/Dashboard/IoTSetupGuide.test.ts +1124 -0
  171. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +20 -6
  172. package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +107 -83
  173. package/Tests/App/Dashboard/KubernetesSetupGuide.test.ts +787 -0
  174. package/Tests/App/Dashboard/MessageQueueBreadcrumbs.test.tsx +228 -0
  175. package/Tests/App/Dashboard/MessageQueueBrokerHealth.test.tsx +1538 -0
  176. package/Tests/App/Dashboard/MessageQueueBrokerHealthMetricChart.test.tsx +969 -0
  177. package/Tests/App/Dashboard/MessageQueueBrokerHealthReads.test.ts +889 -0
  178. package/Tests/App/Dashboard/MessageQueueBrokerMetricsReach.test.ts +236 -0
  179. package/Tests/App/Dashboard/MessageQueueDocumentationCard.test.tsx +479 -0
  180. package/Tests/App/Dashboard/MessageQueueListPages.test.tsx +1232 -0
  181. package/Tests/App/Dashboard/MessageQueueMetricDescriptions.test.ts +244 -0
  182. package/Tests/App/Dashboard/MessageQueueMonitorLink.test.ts +952 -0
  183. package/Tests/App/Dashboard/MessageQueueMonitorLinkMonitorCreate.test.tsx +859 -0
  184. package/Tests/App/Dashboard/MessageQueueOverview.test.tsx +1773 -0
  185. package/Tests/App/Dashboard/MessageQueueOverviewPresentation.test.ts +196 -0
  186. package/Tests/App/Dashboard/MessageQueuePresentation.test.ts +799 -0
  187. package/Tests/App/Dashboard/MessageQueueProducersConsumers.test.tsx +680 -0
  188. package/Tests/App/Dashboard/MessageQueueRoutes.test.tsx +383 -0
  189. package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +278 -0
  190. package/Tests/App/Dashboard/MessageQueueSetupGuide.test.ts +2778 -0
  191. package/Tests/App/Dashboard/MessageQueueSideMenus.test.tsx +273 -0
  192. package/Tests/App/Dashboard/MessageQueueSpanPopulations.test.ts +930 -0
  193. package/Tests/App/Dashboard/MessageQueueSpanStore.ts +351 -0
  194. package/Tests/App/Dashboard/MessageQueueTelemetryScope.test.ts +375 -0
  195. package/Tests/App/Dashboard/MessageQueueTelemetryScopeTabs.test.tsx +668 -0
  196. package/Tests/App/Dashboard/MessageQueueViewPages.test.tsx +685 -0
  197. package/Tests/App/Dashboard/MonitorAndHomeNotOperationalMenus.test.tsx +342 -0
  198. package/Tests/App/Dashboard/MonitorCreateFirstRunDefaults.test.tsx +623 -0
  199. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +442 -0
  200. package/Tests/App/Dashboard/MonitorLogsPageViewSummary.test.tsx +814 -0
  201. package/Tests/App/Dashboard/MonitorSetupCardBodies.test.tsx +246 -0
  202. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +8 -0
  203. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +27 -12
  204. package/Tests/App/Dashboard/PlanGatedPage.test.tsx +292 -0
  205. package/Tests/App/Dashboard/PodmanSetupGuide.test.ts +948 -0
  206. package/Tests/App/Dashboard/ProductOrientation.test.tsx +5 -4
  207. package/Tests/App/Dashboard/ProductSettingsSectionCollapsed.test.tsx +266 -0
  208. package/Tests/App/Dashboard/ProxmoxSetupGuide.test.ts +1318 -0
  209. package/Tests/App/Dashboard/ResourceAiAgentAttentionServerParity.test.ts +555 -0
  210. package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +298 -9
  211. package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +453 -0
  212. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +16 -0
  213. package/Tests/App/Dashboard/ResourceConnectionGuideCard.test.tsx +444 -0
  214. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsInfra.test.tsx +798 -0
  215. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsPlatforms.test.tsx +717 -0
  216. package/Tests/App/Dashboard/ResourceConnectionGuides.test.ts +981 -0
  217. package/Tests/App/Dashboard/ResourceConnectionState.test.ts +132 -0
  218. package/Tests/App/Dashboard/RumDocumentationCard.test.tsx +293 -0
  219. package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +467 -0
  220. package/Tests/App/Dashboard/RumSetupGuide.test.ts +758 -0
  221. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +25 -0
  222. package/Tests/App/Dashboard/ServerlessDocumentationCard.test.tsx +254 -0
  223. package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1074 -0
  224. package/Tests/App/Dashboard/SetupGuide.test.ts +246 -0
  225. package/Tests/App/Dashboard/SetupGuideCard.test.tsx +756 -0
  226. package/Tests/App/Dashboard/SloListSideMenu.test.tsx +120 -0
  227. package/Tests/App/Dashboard/SsoPages.test.tsx +833 -0
  228. package/Tests/App/Dashboard/TelemetryDocumentation.test.tsx +253 -0
  229. package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +730 -0
  230. package/Tests/App/Dashboard/VMwareSetupGuide.test.ts +1033 -0
  231. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +87 -7
  232. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +28 -9
  233. package/Tests/Models/DatabaseModels/IncidentFormModel.test.ts +1250 -0
  234. package/Tests/Models/DatabaseModels/MessageQueueModels.test.ts +1983 -0
  235. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  236. package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +190 -14
  237. package/Tests/Models/IncidentTemplateCustomFieldSettingsColumn.test.ts +291 -0
  238. package/Tests/Server/API/AIInvestigationConversationAPI.test.ts +412 -0
  239. package/Tests/Server/API/GlobalConfigLicense.test.ts +38 -9
  240. package/Tests/Server/API/IncidentFormAPI.test.ts +942 -0
  241. package/Tests/Server/API/IncidentFormPublicRoutes.test.ts +1653 -0
  242. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -1
  243. package/Tests/Server/API/{SsoProviderListingsEdition.test.ts → SsoProviderListings.test.ts} +164 -110
  244. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +76 -54
  245. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +125 -42
  246. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +36 -10
  247. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +51 -9
  248. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +13 -8
  249. package/Tests/Server/Enterprise/SsoInCommunityEdition.test.ts +540 -0
  250. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  251. package/Tests/Server/Infrastructure/Postgres/AddIncidentFormsMigration.test.ts +438 -0
  252. package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleNotificationChannelsMigration.test.ts +255 -0
  253. package/Tests/Server/Infrastructure/Postgres/MessageQueueTablesMigration.test.ts +637 -0
  254. package/Tests/Server/Middleware/IncidentFormRateLimit.test.ts +1630 -0
  255. package/Tests/Server/Middleware/UserAuthorization.test.ts +16 -17
  256. package/Tests/Server/Middleware/UserAuthorizationSsoEnforcement.test.ts +544 -0
  257. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +37 -8
  258. package/Tests/Server/Services/IncidentCreatedFeedTitle.test.ts +212 -0
  259. package/Tests/Server/Services/IncidentCustomFieldDeleteFormQuestions.test.ts +297 -0
  260. package/Tests/Server/Services/IncidentFormOwnersCreatedNotification.test.ts +497 -0
  261. package/Tests/Server/Services/IncidentFormPostgres.test.ts +958 -0
  262. package/Tests/Server/Services/IncidentFormPublicForm.test.ts +1260 -0
  263. package/Tests/Server/Services/IncidentFormPublicSubmission.test.ts +2520 -0
  264. package/Tests/Server/Services/IncidentFormRegistration.test.ts +159 -0
  265. package/Tests/Server/Services/IncidentFormService.test.ts +663 -0
  266. package/Tests/Server/Services/IncidentFormSubmissionService.test.ts +430 -0
  267. package/Tests/Server/Services/IncidentFormSubmissionTemplateBranch.test.ts +473 -0
  268. package/Tests/Server/Services/IncidentGroupingTemplateSubstitution.test.ts +81 -0
  269. package/Tests/Server/Services/IncidentTemplateCustomFieldSettings.test.ts +262 -0
  270. package/Tests/Server/Services/IncidentTemplateOwnersOnDeclare.test.ts +566 -0
  271. package/Tests/Server/Services/IncidentTitleMarkdownSinks.test.ts +640 -0
  272. package/Tests/Server/Services/LlmLogServiceTokenAggregateParams.test.ts +3 -3
  273. package/Tests/Server/Services/MessageQueueOwnerServices.test.ts +440 -0
  274. package/Tests/Server/Services/MessageQueueRegistries.test.ts +577 -0
  275. package/Tests/Server/Services/MessageQueueRuleEngines.test.ts +900 -0
  276. package/Tests/Server/Services/MessageQueueService.test.ts +2210 -0
  277. package/Tests/Server/Services/MessageQueueSqlPostgres.test.ts +1271 -0
  278. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
  279. package/Tests/Server/Services/OpenTelemetryRetentionOverrideEdition.test.ts +474 -0
  280. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +21 -0
  281. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +3 -0
  282. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +0 -1
  283. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +56 -6
  284. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -1
  285. package/Tests/Server/Services/SsoRequirementReads.test.ts +454 -0
  286. package/Tests/Server/Services/SsoRequirementWrites.test.ts +529 -0
  287. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
  288. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +107 -89
  289. package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +1068 -176
  290. package/Tests/Server/Services/TeamComplianceSettingService.test.ts +1962 -200
  291. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +654 -297
  292. package/Tests/Server/Types/Database/Permissions/RetentionOverrideColumns.test.ts +784 -0
  293. package/Tests/Server/Types/Database/Permissions/SsoScalePlanGate.test.ts +418 -0
  294. package/Tests/Server/Utils/AI/AIAlertGating.test.ts +0 -1
  295. package/Tests/Server/Utils/AI/AIInvestigationEngineRunLimits.test.ts +136 -0
  296. package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +15 -14
  297. package/Tests/Server/Utils/AI/AgentContextCompactor.test.ts +351 -0
  298. package/Tests/Server/Utils/AI/ChatAgentRunnerSharedThread.test.ts +842 -0
  299. package/Tests/Server/Utils/AI/ChatRunCancellation.test.ts +195 -0
  300. package/Tests/Server/Utils/AI/CodeFixReadiness.test.ts +10 -57
  301. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +20 -24
  302. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +7 -30
  303. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +225 -29
  304. package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +266 -25
  305. package/Tests/Server/Utils/AI/InvestigationThread.test.ts +580 -0
  306. package/Tests/Server/Utils/AI/InvestigationThreadService.test.ts +801 -0
  307. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +525 -43
  308. package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +4 -2
  309. package/Tests/Server/Utils/AI/LLMServiceUnreachableProvider.test.ts +435 -0
  310. package/Tests/Server/Utils/AI/ObservabilityAssistantLimits.test.ts +462 -0
  311. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +14 -25
  312. package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +2 -0
  313. package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +297 -15
  314. package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +10 -6
  315. package/Tests/Server/Utils/AI/ToolOutputPager.test.ts +382 -0
  316. package/Tests/Server/Utils/AI/ToolResultSerializer.test.ts +23 -4
  317. package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +25 -6
  318. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +14 -3
  319. package/Tests/Server/Utils/EditionEnforcement.test.ts +107 -147
  320. package/Tests/Server/Utils/{CommunityEditionSsoReport.test.ts → RelaxedScimTeamLocksReport.test.ts} +212 -208
  321. package/Tests/Server/Utils/SameOriginRequest.test.ts +372 -0
  322. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +20 -0
  323. package/Tests/Server/Utils/Telemetry/MessageQueueDiscovery.test.ts +2590 -0
  324. package/Tests/Server/Utils/Telemetry/MessageQueueSpanQueryTwin.ts +246 -0
  325. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +23 -0
  326. package/Tests/Types/AI/AIAgentRunLimits.test.ts +255 -0
  327. package/Tests/Types/Code/JsonSyntax.test.ts +1300 -0
  328. package/Tests/Types/CustomField/CustomFieldCreateSettings.test.ts +1113 -0
  329. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +91 -0
  330. package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +30 -0
  331. package/Tests/Types/Incident/IncidentFormIpAllowlist.test.ts +227 -0
  332. package/Tests/Types/Incident/IncidentFormPublic.test.ts +1916 -0
  333. package/Tests/Types/MessageQueue/MessageQueueEntityKey.test.ts +916 -0
  334. package/Tests/Types/MessageQueue/MessageQueueIdentity.test.ts +567 -0
  335. package/Tests/Types/MessageQueue/MessageQueueManualIdentity.test.ts +686 -0
  336. package/Tests/Types/MessageQueue/MessageQueueMetricCatalog.test.ts +1726 -0
  337. package/Tests/Types/MessageQueue/MessageQueueMetricResolution.test.ts +1758 -0
  338. package/Tests/Types/MessageQueue/MessagingInstrumentationFixtures.test.ts +4686 -0
  339. package/Tests/Types/MessageQueue/MessagingSystem.test.ts +840 -0
  340. package/Tests/Types/MessageQueue/MessagingTelemetryFixtures.ts +3287 -0
  341. package/Tests/Types/MessageQueue/MessagingTelemetryResolver.test.ts +2966 -0
  342. package/Tests/Types/Monitor/MessageQueueAlertTemplates.test.ts +5401 -0
  343. package/Tests/Types/Monitor/MetricEngineFold.ts +154 -0
  344. package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +5 -3
  345. package/Tests/Types/Team/ComplianceRule.test.ts +588 -37
  346. package/Tests/Types/Team/TeamComplianceStatus.test.ts +64 -11
  347. package/Tests/Types/XML.test.ts +51 -0
  348. package/Tests/UI/Components/CodeEditor/CodeEditor.test.tsx +2362 -0
  349. package/Tests/UI/Components/CodeEditor/CodeEditorCommands.test.ts +810 -0
  350. package/Tests/UI/Components/CodeEditor/CodeEditorHighlight.test.ts +338 -0
  351. package/Tests/UI/Components/CodeEditor/CodeEditorLanguages.test.ts +222 -0
  352. package/Tests/UI/Components/CodeEditor/CodeEditorStyles.test.ts +807 -0
  353. package/Tests/UI/Components/CodeEditor/NoMonaco.test.ts +245 -0
  354. package/Tests/UI/Components/CodeEditor/YamlEditor.test.tsx +729 -0
  355. package/Tests/UI/Components/CopyTextButton.test.tsx +76 -0
  356. package/Tests/UI/Components/EditionLabelLapseCopy.ts +51 -14
  357. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +131 -23
  358. package/Tests/UI/Components/ErrorMessageAction.test.tsx +142 -0
  359. package/Tests/UI/Components/FacetSidebarInScope.test.tsx +459 -0
  360. package/Tests/UI/Components/FacetValuesInScope.test.ts +270 -0
  361. package/Tests/UI/Components/Forms/FormFieldCodeEditors.test.tsx +294 -0
  362. package/Tests/UI/Components/Forms/FormFieldMarkdown.test.tsx +126 -0
  363. package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +22 -75
  364. package/Tests/UI/Components/Forms/ModelFormOnBeforeCreateMiscData.test.tsx +254 -0
  365. package/Tests/UI/Components/Icon.test.tsx +32 -0
  366. package/Tests/UI/Components/Input.test.tsx +31 -0
  367. package/Tests/UI/Components/LockedFilterChipScope.test.tsx +501 -0
  368. package/Tests/UI/Components/MarkdownConverters.test.ts +253 -1
  369. package/Tests/UI/Components/MarkdownEditor.test.tsx +2785 -2
  370. package/Tests/UI/Components/MarkdownEditorHistory.test.ts +243 -0
  371. package/Tests/UI/Components/MarkdownListEditing.test.ts +1118 -0
  372. package/Tests/UI/Components/MarkdownPaste.test.ts +1180 -0
  373. package/Tests/UI/Components/MarkdownViewerCopy.test.tsx +466 -0
  374. package/Tests/UI/Components/MarkdownVisualEditing.test.ts +1089 -0
  375. package/Tests/UI/Components/ModelTable/BaseModelTableEmptyStateAction.test.tsx +623 -0
  376. package/Tests/UI/Components/ResetObjectID.test.tsx +282 -0
  377. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  378. package/Tests/UI/Components/Table/EmptyTableMessage.test.ts +439 -0
  379. package/Tests/UI/Components/Table/TableEmptyState.test.tsx +352 -0
  380. package/Tests/UI/Components/TableRowMobileTitles.test.tsx +78 -0
  381. package/Tests/UI/Components/TextArea.test.tsx +19 -0
  382. package/Tests/UI/Components/Workflow/ModelColumnEditor.render.test.tsx +12 -29
  383. package/Tests/UI/Components/fixtures/MarkdownPasteFixtures.ts +460 -0
  384. package/Tests/UI/EsbuildConfig.test.ts +115 -39
  385. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +4 -4
  386. package/Tests/UI/Monitor/MonitorLogSummaryRender.test.tsx +377 -0
  387. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +81 -1
  388. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +17 -0
  389. package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
  390. package/Tests/Utils/Markdown/DashboardMarkdownRenderer.ts +81 -0
  391. package/Tests/Utils/Markdown/UntrustedMarkdown.test.ts +1339 -0
  392. package/Tests/Utils/Monitor/MonitorLogSummaryUtil.test.ts +862 -0
  393. package/Types/AI/AIAgentRunLimits.ts +146 -0
  394. package/Types/Code/CodeType.ts +2 -0
  395. package/Types/Code/JsonSyntax.ts +923 -0
  396. package/Types/CustomField/CustomFieldCreateSettings.ts +549 -0
  397. package/Types/CustomField/CustomFieldMappingCatalog.ts +77 -0
  398. package/Types/CustomField/CustomFieldValueValidator.ts +10 -7
  399. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +1 -1
  400. package/Types/Icon/IconProp.ts +2 -0
  401. package/Types/Incident/IncidentFormIpAllowlist.ts +206 -0
  402. package/Types/Incident/IncidentFormPublic.ts +1145 -0
  403. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +10 -3
  404. package/Types/MessageQueue/MessageQueueIdentity.ts +256 -0
  405. package/Types/MessageQueue/MessageQueueManualIdentity.ts +325 -0
  406. package/Types/MessageQueue/MessageQueueMetricCatalog.ts +1357 -0
  407. package/Types/MessageQueue/MessagingSystem.ts +518 -0
  408. package/Types/MessageQueue/MessagingTelemetryResolver.ts +2311 -0
  409. package/Types/Monitor/MessageQueueAlertTemplates.ts +2128 -0
  410. package/Types/Permission.ts +310 -0
  411. package/Types/ResourceAiAgent/ResourceAiAccess.ts +10 -4
  412. package/Types/Rules/RuleCriteriaFieldRegistry.ts +12 -0
  413. package/Types/Rules/RuleRun.ts +4 -0
  414. package/Types/Team/ComplianceNotificationChannel.ts +4 -3
  415. package/Types/Team/ComplianceRule.ts +71 -18
  416. package/Types/Team/ComplianceRuleType.ts +2 -2
  417. package/Types/Team/TeamComplianceStatus.ts +6 -2
  418. package/Types/Telemetry/EntityType.ts +16 -0
  419. package/Types/Telemetry/LockedFilterDetail.ts +22 -0
  420. package/Types/XML.ts +26 -0
  421. package/UI/Components/CodeEditor/CodeEditor.css +379 -0
  422. package/UI/Components/CodeEditor/CodeEditor.tsx +1128 -294
  423. package/UI/Components/CodeEditor/CodeEditorCommands.ts +774 -0
  424. package/UI/Components/CodeEditor/CodeEditorHighlight.ts +106 -0
  425. package/UI/Components/CodeEditor/CodeEditorLanguages.ts +164 -0
  426. package/UI/Components/CodeEditor/YamlEditor.tsx +28 -326
  427. package/UI/Components/CopyTextButton/CopyTextButton.tsx +5 -1
  428. package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +6 -25
  429. package/UI/Components/EditionLabel/EditionLabel.tsx +14 -13
  430. package/UI/Components/ErrorMessage/ErrorMessage.tsx +11 -1
  431. package/UI/Components/Forms/Fields/FormField.tsx +8 -0
  432. package/UI/Components/Forms/Types/Field.ts +8 -0
  433. package/UI/Components/Icon/Icon.tsx +18 -0
  434. package/UI/Components/Input/Input.tsx +11 -4
  435. package/UI/Components/LogsViewer/LogsViewer.tsx +4 -0
  436. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +21 -3
  437. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  438. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +877 -79
  439. package/UI/Components/Markdown.tsx/MarkdownEditorHistory.ts +284 -0
  440. package/UI/Components/Markdown.tsx/MarkdownListEditing.ts +1362 -0
  441. package/UI/Components/Markdown.tsx/MarkdownPaste.ts +1326 -0
  442. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +106 -10
  443. package/UI/Components/Markdown.tsx/MarkdownVisualEditing.ts +1032 -0
  444. package/UI/Components/ModelTable/BaseModelTable.tsx +85 -7
  445. package/UI/Components/ResetObjectID/ResetObjectID.tsx +35 -9
  446. package/UI/Components/Table/EmptyTableMessage.ts +81 -0
  447. package/UI/Components/Table/Table.tsx +50 -21
  448. package/UI/Components/Table/TableRow.tsx +9 -1
  449. package/UI/Components/TelemetryViewer/FacetVisibility.ts +97 -2
  450. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +13 -0
  451. package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +214 -7
  452. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +21 -3
  453. package/UI/Components/TextArea/TextArea.tsx +9 -2
  454. package/UI/Components/Workflow/ModelFieldPicker.tsx +10 -12
  455. package/UI/Styles/Theme.css +8 -0
  456. package/UI/esbuild-config.js +2 -32
  457. package/Utils/LabelRuleImportExport.ts +2 -0
  458. package/Utils/Markdown/UntrustedMarkdown.ts +1513 -0
  459. package/Utils/Monitor/IncomingEmailMonitorRequestUtil.ts +41 -0
  460. package/Utils/Monitor/MonitorLogSummaryUtil.ts +212 -0
  461. package/Utils/Telemetry/EntityKey.ts +48 -0
  462. package/build/dist/Models/DatabaseModels/AIConversation.js +125 -1
  463. package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
  464. package/build/dist/Models/DatabaseModels/CephCluster.js +12 -0
  465. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  466. package/build/dist/Models/DatabaseModels/CloudResource.js +12 -0
  467. package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
  468. package/build/dist/Models/DatabaseModels/DatabaseServer.js +12 -0
  469. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
  470. package/build/dist/Models/DatabaseModels/DockerHost.js +12 -0
  471. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  472. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +12 -0
  473. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
  474. package/build/dist/Models/DatabaseModels/GlobalOidc.js +0 -4
  475. package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
  476. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +0 -4
  477. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
  478. package/build/dist/Models/DatabaseModels/GlobalSso.js +0 -4
  479. package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
  480. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +0 -4
  481. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
  482. package/build/dist/Models/DatabaseModels/Host.js +12 -0
  483. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  484. package/build/dist/Models/DatabaseModels/IncidentForm.js +605 -0
  485. package/build/dist/Models/DatabaseModels/IncidentForm.js.map +1 -0
  486. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js +299 -0
  487. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js.map +1 -0
  488. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +60 -0
  489. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  490. package/build/dist/Models/DatabaseModels/Index.js +14 -0
  491. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  492. package/build/dist/Models/DatabaseModels/IoTFleet.js +12 -0
  493. package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
  494. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +12 -0
  495. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  496. package/build/dist/Models/DatabaseModels/MessageQueue.js +1106 -0
  497. package/build/dist/Models/DatabaseModels/MessageQueue.js.map +1 -0
  498. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js +562 -0
  499. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js.map +1 -0
  500. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js +643 -0
  501. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js.map +1 -0
  502. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js +506 -0
  503. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js.map +1 -0
  504. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js +505 -0
  505. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js.map +1 -0
  506. package/build/dist/Models/DatabaseModels/PodmanHost.js +12 -0
  507. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
  508. package/build/dist/Models/DatabaseModels/Project.js +61 -0
  509. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  510. package/build/dist/Models/DatabaseModels/ProjectOidc.js +0 -4
  511. package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
  512. package/build/dist/Models/DatabaseModels/ProjectSso.js +0 -4
  513. package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
  514. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +12 -0
  515. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  516. package/build/dist/Models/DatabaseModels/RumApplication.js +12 -0
  517. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  518. package/build/dist/Models/DatabaseModels/ServerlessFunction.js +12 -0
  519. package/build/dist/Models/DatabaseModels/ServerlessFunction.js.map +1 -1
  520. package/build/dist/Models/DatabaseModels/Service.js +12 -0
  521. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  522. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +0 -4
  523. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  524. package/build/dist/Models/DatabaseModels/StatusPageSso.js +0 -4
  525. package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
  526. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +49 -3
  527. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
  528. package/build/dist/Models/DatabaseModels/VMwareVCenter.js +12 -0
  529. package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
  530. package/build/dist/Server/API/AIChatAPI.js +9 -103
  531. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  532. package/build/dist/Server/API/AIInvestigationAPI.js +3 -3
  533. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  534. package/build/dist/Server/API/AIInvestigationConversationAPI.js +162 -0
  535. package/build/dist/Server/API/AIInvestigationConversationAPI.js.map +1 -0
  536. package/build/dist/Server/API/IncidentFormAPI.js +245 -0
  537. package/build/dist/Server/API/IncidentFormAPI.js.map +1 -0
  538. package/build/dist/Server/API/ProjectOIDC.js +16 -24
  539. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  540. package/build/dist/Server/API/ProjectSSO.js +16 -24
  541. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  542. package/build/dist/Server/API/StatusPageAPI.js +42 -75
  543. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  544. package/build/dist/Server/Enterprise/EnterpriseEdition.js +79 -25
  545. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -1
  546. package/build/dist/Server/Enterprise/EnterpriseFeature.js +24 -3
  547. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -1
  548. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +1 -1
  549. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -1
  550. package/build/dist/Server/EnvironmentConfig.js +1 -1
  551. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js +63 -0
  552. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js.map +1 -0
  553. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js +41 -0
  554. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js.map +1 -0
  555. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js +40 -0
  556. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js.map +1 -0
  557. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js +183 -0
  558. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js.map +1 -0
  559. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  560. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  561. package/build/dist/Server/Middleware/IncidentFormRateLimit.js +559 -0
  562. package/build/dist/Server/Middleware/IncidentFormRateLimit.js.map +1 -0
  563. package/build/dist/Server/Middleware/UserAuthorization.js +11 -30
  564. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  565. package/build/dist/Server/Services/AIService.js +10 -13
  566. package/build/dist/Server/Services/AIService.js.map +1 -1
  567. package/build/dist/Server/Services/IncidentCustomFieldService.js +83 -0
  568. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  569. package/build/dist/Server/Services/IncidentEpisodeMemberService.js +8 -4
  570. package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
  571. package/build/dist/Server/Services/IncidentEpisodeService.js +10 -1
  572. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  573. package/build/dist/Server/Services/IncidentFormService.js +1202 -0
  574. package/build/dist/Server/Services/IncidentFormService.js.map +1 -0
  575. package/build/dist/Server/Services/IncidentFormSubmissionService.js +91 -0
  576. package/build/dist/Server/Services/IncidentFormSubmissionService.js.map +1 -0
  577. package/build/dist/Server/Services/IncidentGroupingEngineService.js +20 -8
  578. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  579. package/build/dist/Server/Services/IncidentService.js +106 -4
  580. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  581. package/build/dist/Server/Services/IncidentTemplateService.js +18 -0
  582. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  583. package/build/dist/Server/Services/Index.js +14 -0
  584. package/build/dist/Server/Services/Index.js.map +1 -1
  585. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js +262 -0
  586. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js.map +1 -0
  587. package/build/dist/Server/Services/MessageQueueLabelRuleService.js +13 -0
  588. package/build/dist/Server/Services/MessageQueueLabelRuleService.js.map +1 -0
  589. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js +334 -0
  590. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js.map +1 -0
  591. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js +13 -0
  592. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js.map +1 -0
  593. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js +62 -0
  594. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js.map +1 -0
  595. package/build/dist/Server/Services/MessageQueueOwnerUserService.js +62 -0
  596. package/build/dist/Server/Services/MessageQueueOwnerUserService.js.map +1 -0
  597. package/build/dist/Server/Services/MessageQueueService.js +1140 -0
  598. package/build/dist/Server/Services/MessageQueueService.js.map +1 -0
  599. package/build/dist/Server/Services/OpenTelemetryIngestService.js +25 -4
  600. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  601. package/build/dist/Server/Services/ProjectService.js +0 -54
  602. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  603. package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -4
  604. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  605. package/build/dist/Server/Services/StatusPageService.js +0 -46
  606. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  607. package/build/dist/Server/Services/TeamComplianceSettingService.js +120 -31
  608. package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
  609. package/build/dist/Server/Services/UserNotificationRuleService.js +8 -1
  610. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  611. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +12 -3
  612. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
  613. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +6 -3
  614. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  615. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +109 -37
  616. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  617. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +16 -0
  618. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  619. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +3 -3
  620. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +9 -6
  621. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  622. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js +128 -0
  623. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js.map +1 -0
  624. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +192 -50
  625. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
  626. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js +133 -0
  627. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js.map +1 -0
  628. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +53 -13
  629. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  630. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
  631. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js +206 -0
  632. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js.map +1 -0
  633. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +53 -26
  634. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
  635. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +4 -2
  636. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
  637. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +1 -29
  638. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  639. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +24 -24
  640. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  641. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +7 -2
  642. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  643. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +29 -14
  644. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  645. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +38 -14
  646. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -1
  647. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +2 -0
  648. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -1
  649. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +40 -10
  650. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  651. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +19 -7
  652. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  653. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +19 -7
  654. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  655. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +15 -18
  656. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  657. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js +412 -0
  658. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js.map +1 -0
  659. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js +495 -0
  660. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js.map +1 -0
  661. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js +10 -3
  662. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js.map +1 -1
  663. package/build/dist/Server/Utils/EditionEnforcement.js +20 -158
  664. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -1
  665. package/build/dist/Server/Utils/LLM/LLMService.js +193 -54
  666. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  667. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js +160 -0
  668. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js.map +1 -0
  669. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
  670. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  671. package/build/dist/Server/Utils/SameOriginRequest.js +151 -0
  672. package/build/dist/Server/Utils/SameOriginRequest.js.map +1 -0
  673. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
  674. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
  675. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +4 -1
  676. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  677. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +1015 -0
  678. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -0
  679. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +4 -1
  680. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  681. package/build/dist/Server/Utils/VendorAssets.js +3 -3
  682. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +3 -1
  683. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  684. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +3 -1
  685. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  686. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +10 -1
  687. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  688. package/build/dist/Types/AI/AIAgentRunLimits.js +91 -0
  689. package/build/dist/Types/AI/AIAgentRunLimits.js.map +1 -0
  690. package/build/dist/Types/Code/CodeType.js +2 -0
  691. package/build/dist/Types/Code/CodeType.js.map +1 -1
  692. package/build/dist/Types/Code/JsonSyntax.js +604 -0
  693. package/build/dist/Types/Code/JsonSyntax.js.map +1 -0
  694. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js +310 -0
  695. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js.map +1 -0
  696. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +38 -0
  697. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -1
  698. package/build/dist/Types/CustomField/CustomFieldValueValidator.js +10 -7
  699. package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -1
  700. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +1 -1
  701. package/build/dist/Types/Icon/IconProp.js +2 -0
  702. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  703. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js +119 -0
  704. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js.map +1 -0
  705. package/build/dist/Types/Incident/IncidentFormPublic.js +678 -0
  706. package/build/dist/Types/Incident/IncidentFormPublic.js.map +1 -0
  707. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +10 -3
  708. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
  709. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js +184 -0
  710. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js.map +1 -0
  711. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js +190 -0
  712. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js.map +1 -0
  713. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js +1057 -0
  714. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js.map +1 -0
  715. package/build/dist/Types/MessageQueue/MessagingSystem.js +394 -0
  716. package/build/dist/Types/MessageQueue/MessagingSystem.js.map +1 -0
  717. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js +1768 -0
  718. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js.map +1 -0
  719. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js +1207 -0
  720. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js.map +1 -0
  721. package/build/dist/Types/Permission.js +274 -0
  722. package/build/dist/Types/Permission.js.map +1 -1
  723. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +10 -4
  724. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -1
  725. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +12 -0
  726. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  727. package/build/dist/Types/Rules/RuleRun.js +4 -0
  728. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  729. package/build/dist/Types/Team/ComplianceNotificationChannel.js +4 -3
  730. package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -1
  731. package/build/dist/Types/Team/ComplianceRule.js +48 -14
  732. package/build/dist/Types/Team/ComplianceRule.js.map +1 -1
  733. package/build/dist/Types/Team/ComplianceRuleType.js +2 -2
  734. package/build/dist/Types/Telemetry/EntityType.js +16 -0
  735. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  736. package/build/dist/Types/XML.js +23 -0
  737. package/build/dist/Types/XML.js.map +1 -1
  738. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +641 -266
  739. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  740. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js +464 -0
  741. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js.map +1 -0
  742. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js +69 -0
  743. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js.map +1 -0
  744. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js +108 -0
  745. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js.map +1 -0
  746. package/build/dist/UI/Components/CodeEditor/YamlEditor.js +14 -186
  747. package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -1
  748. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
  749. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
  750. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +5 -14
  751. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -1
  752. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +14 -13
  753. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  754. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +1 -1
  755. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  756. package/build/dist/UI/Components/Forms/Fields/FormField.js +8 -3
  757. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  758. package/build/dist/UI/Components/Icon/Icon.js +8 -0
  759. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  760. package/build/dist/UI/Components/Input/Input.js +11 -3
  761. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  762. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +2 -1
  763. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  764. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +14 -4
  765. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  766. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  767. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  768. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +710 -65
  769. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
  770. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js +238 -0
  771. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js.map +1 -0
  772. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js +1028 -0
  773. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js.map +1 -0
  774. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js +1088 -0
  775. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js.map +1 -0
  776. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +70 -10
  777. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  778. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js +887 -0
  779. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js.map +1 -0
  780. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +57 -6
  781. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  782. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +7 -5
  783. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
  784. package/build/dist/UI/Components/Table/EmptyTableMessage.js +51 -0
  785. package/build/dist/UI/Components/Table/EmptyTableMessage.js.map +1 -0
  786. package/build/dist/UI/Components/Table/Table.js +30 -11
  787. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  788. package/build/dist/UI/Components/Table/TableRow.js +9 -2
  789. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  790. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +63 -1
  791. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -1
  792. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +4 -2
  793. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  794. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +91 -10
  795. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
  796. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +14 -4
  797. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  798. package/build/dist/UI/Components/TextArea/TextArea.js +9 -3
  799. package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
  800. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js +1 -2
  801. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js.map +1 -1
  802. package/build/dist/Utils/LabelRuleImportExport.js +2 -0
  803. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  804. package/build/dist/Utils/Markdown/UntrustedMarkdown.js +988 -0
  805. package/build/dist/Utils/Markdown/UntrustedMarkdown.js.map +1 -0
  806. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js +34 -0
  807. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js.map +1 -0
  808. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js +148 -0
  809. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js.map +1 -0
  810. package/build/dist/Utils/Telemetry/EntityKey.js +36 -0
  811. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  812. package/package.json +1 -3
  813. package/Server/Utils/CommunityEditionSsoReport.ts +0 -361
  814. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +0 -616
  815. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +0 -217
  816. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +0 -271
  817. package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +0 -215
  818. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +0 -784
  819. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +0 -518
  820. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +0 -419
  821. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +0 -769
  822. package/Tests/UI/Components/CodeEditor.test.tsx +0 -638
  823. package/Tests/UI/Components/MonacoLoader.test.ts +0 -67
  824. package/Tests/UI/Components/MonacoRuntime.test.ts +0 -121
  825. package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +0 -329
  826. package/Tests/UI/Components/YamlEditor.test.tsx +0 -847
  827. package/UI/Components/CodeEditor/MonacoLoader.ts +0 -36
  828. package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +0 -319
  829. package/UI/Components/Telemetry/TelemetryRetentionConfigSummary.tsx +0 -223
  830. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +0 -223
  831. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +0 -1
  832. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js +0 -34
  833. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js.map +0 -1
  834. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +0 -171
  835. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +0 -1
  836. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js +0 -119
  837. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js.map +0 -1
@@ -0,0 +1,3287 @@
1
+ import { ResolvedMessagingDestination } from "../../../Types/MessageQueue/MessagingTelemetryResolver";
2
+
3
+ /*
4
+ * Real-world messaging telemetry, as each instrumentation emits it, with the
5
+ * destination OneUptime must resolve from it. Spans are shaped after the
6
+ * instrumentations' source (research: messaging-semconv.md) across the five
7
+ * semconv generations; datapoints after the collector receivers' source and
8
+ * live captures against real brokers (broker-metrics-*.md), in the STORED
9
+ * flattened shape: datapoint attributes bare, resource attributes with the
10
+ * `resource.` prefix. Shared by the resolver, metric-catalog and entity-key
11
+ * suites, and by the input-attribute completeness and storage round-trip
12
+ * checks, which run over every fixture here.
13
+ */
14
+
15
+ export type FixtureAttributes = Record<string, unknown>;
16
+
17
+ export const PRODUCER: string = "SPAN_KIND_PRODUCER";
18
+ export const CONSUMER: string = "SPAN_KIND_CONSUMER";
19
+ export const CLIENT: string = "SPAN_KIND_CLIENT";
20
+ export const INTERNAL: string = "SPAN_KIND_INTERNAL";
21
+ export const SERVER: string = "SPAN_KIND_SERVER";
22
+
23
+ /*
24
+ * Span kinds as a trace pipeline's Span Kind Remapper can store them. The
25
+ * ingest service stores the SpanKind string, but the remapper writes its
26
+ * mapping's kind as it is, and a configuration saved through the API is any
27
+ * JSON — a NUMBER included. The stamper sees that value; ClickHouse keeps
28
+ * its JSON text in the kind column (toStoredKind: 2 → "2"), which is what
29
+ * the discovery cron reads back. OTLP numbers the kinds 1 INTERNAL,
30
+ * 2 SERVER, 3 CLIENT, 4 PRODUCER and 5 CONSUMER. `reads` is the SpanKind
31
+ * the value must read as — the value itself at ingest, and its stored text
32
+ * in discovery, alike — or null for no kind at all.
33
+ */
34
+ export interface NumericSpanKindCase {
35
+ kind: number | string;
36
+ reads: string | null;
37
+ }
38
+
39
+ export const NUMERIC_SPAN_KIND_CASES: ReadonlyArray<NumericSpanKindCase> = [
40
+ // OTLP's numbers, as a number and as its text.
41
+ { kind: 1, reads: INTERNAL },
42
+ { kind: "1", reads: INTERNAL },
43
+ { kind: 2, reads: SERVER },
44
+ { kind: "2", reads: SERVER },
45
+ { kind: 3, reads: CLIENT },
46
+ { kind: "3", reads: CLIENT },
47
+ { kind: 4, reads: PRODUCER },
48
+ { kind: "4", reads: PRODUCER },
49
+ { kind: 5, reads: CONSUMER },
50
+ { kind: "5", reads: CONSUMER },
51
+ /*
52
+ * Digits read as Number() reads them: leading zeros and surrounding
53
+ * whitespace count for nothing, so "02" is SERVER.
54
+ */
55
+ { kind: "02", reads: SERVER },
56
+ { kind: " 2 ", reads: SERVER },
57
+ { kind: "0005", reads: CONSUMER },
58
+ // Numbers OTLP gives no kind (0 is SPAN_KIND_UNSPECIFIED).
59
+ { kind: 0, reads: null },
60
+ { kind: "0", reads: null },
61
+ { kind: "00", reads: null },
62
+ { kind: 6, reads: null },
63
+ { kind: 9, reads: null },
64
+ { kind: "9", reads: null },
65
+ { kind: "12", reads: null },
66
+ // Numeric, but not a plain run of digits: a name, and no kind's.
67
+ { kind: -2, reads: null },
68
+ { kind: "-2", reads: null },
69
+ { kind: "+2", reads: null },
70
+ { kind: 2.5, reads: null },
71
+ { kind: "2.0", reads: null },
72
+ { kind: "2e0", reads: null },
73
+ { kind: 1e21, reads: null },
74
+ ];
75
+
76
+ export interface SpanFixture {
77
+ name: string;
78
+ kind: string | null;
79
+ attributes: FixtureAttributes;
80
+ expected: ResolvedMessagingDestination | null;
81
+ }
82
+
83
+ export interface MetricFixture {
84
+ name: string;
85
+ metricName: string;
86
+ attributes: FixtureAttributes;
87
+ expected: ResolvedMessagingDestination | null;
88
+ }
89
+
90
+ // A resolution, with the fields a fixture does not state at their defaults.
91
+ export function destinationOf(
92
+ partial: Partial<ResolvedMessagingDestination> & {
93
+ system: string;
94
+ destination: string;
95
+ },
96
+ ): ResolvedMessagingDestination {
97
+ return {
98
+ brokerScope: "",
99
+ brokerAddress: null,
100
+ direction: "unknown",
101
+ consumerGroup: null,
102
+ isDeadLetter: false,
103
+ ...partial,
104
+ };
105
+ }
106
+
107
+ const SQS_QUEUE_URL: string =
108
+ "https://sqs.us-east-1.amazonaws.com/123456789012/orders";
109
+ const SNS_TOPIC_ARN: string = "arn:aws:sns:us-east-1:123456789012:order-events";
110
+ const SERVICE_BUS_HOST: string = "orders-prod.servicebus.windows.net";
111
+ const EVENT_HUBS_HOST: string = "ingest-prod.servicebus.windows.net";
112
+
113
+ export const SPAN_FIXTURES: ReadonlyArray<SpanFixture> = [
114
+ // ---- Apache Kafka ----------------------------------------------------------
115
+ {
116
+ name: "Java agent Kafka send (default mode, legacy semconv)",
117
+ kind: PRODUCER,
118
+ attributes: {
119
+ "messaging.system": "kafka",
120
+ "messaging.destination.name": "orders",
121
+ "messaging.operation": "publish",
122
+ "messaging.destination.partition.id": "3",
123
+ "messaging.client_id": "producer-1",
124
+ "messaging.kafka.message.offset": 1042,
125
+ "messaging.kafka.bootstrap.servers": ["kafka-1:9092", "kafka-2:9092"],
126
+ },
127
+ expected: destinationOf({
128
+ system: "kafka",
129
+ destination: "orders",
130
+ direction: "publish",
131
+ }),
132
+ },
133
+ {
134
+ name: "Java agent Kafka process (default mode)",
135
+ kind: CONSUMER,
136
+ attributes: {
137
+ "messaging.system": "kafka",
138
+ "messaging.destination.name": "orders",
139
+ "messaging.operation": "process",
140
+ "messaging.kafka.consumer.group": "billing",
141
+ "messaging.kafka.message.offset": 1042,
142
+ "messaging.destination.partition.id": "0",
143
+ "messaging.client_id": "consumer-billing-1",
144
+ "messaging.message.body.size": 128,
145
+ },
146
+ expected: destinationOf({
147
+ system: "kafka",
148
+ destination: "orders",
149
+ direction: "consume",
150
+ consumerGroup: "billing",
151
+ }),
152
+ },
153
+ {
154
+ name: "Java agent Kafka receive of a batch spanning several topics (no destination)",
155
+ kind: CONSUMER,
156
+ attributes: {
157
+ "messaging.system": "kafka",
158
+ "messaging.operation": "receive",
159
+ "messaging.batch.message_count": 12,
160
+ "messaging.kafka.consumer.group": "billing",
161
+ },
162
+ expected: null,
163
+ },
164
+ {
165
+ name: "Java agent Kafka poll (messaging semconv opt-in)",
166
+ kind: CLIENT,
167
+ attributes: {
168
+ "messaging.system": "kafka",
169
+ "messaging.destination.name": "orders",
170
+ "messaging.operation.type": "receive",
171
+ "messaging.operation.name": "poll",
172
+ "messaging.consumer.group.name": "billing",
173
+ "messaging.client.id": "consumer-billing-1",
174
+ "messaging.batch.message_count": 5,
175
+ },
176
+ expected: destinationOf({
177
+ system: "kafka",
178
+ destination: "orders",
179
+ direction: "consume",
180
+ consumerGroup: "billing",
181
+ }),
182
+ },
183
+ {
184
+ name: "Java agent Kafka process (messaging semconv opt-in)",
185
+ kind: CONSUMER,
186
+ attributes: {
187
+ "messaging.system": "kafka",
188
+ "messaging.destination.name": "orders",
189
+ "messaging.operation.type": "process",
190
+ "messaging.operation.name": "process",
191
+ "messaging.consumer.group.name": "billing",
192
+ "messaging.kafka.offset": 17,
193
+ },
194
+ expected: destinationOf({
195
+ system: "kafka",
196
+ destination: "orders",
197
+ direction: "consume",
198
+ consumerGroup: "billing",
199
+ }),
200
+ },
201
+ {
202
+ name: "Confluent.Kafka .NET send (semconv 1.44)",
203
+ kind: PRODUCER,
204
+ attributes: {
205
+ "messaging.system": "kafka",
206
+ "messaging.destination.name": "orders",
207
+ "messaging.operation.type": "send",
208
+ "messaging.operation.name": "send",
209
+ "messaging.kafka.cluster.id": "lkc-7yq8z",
210
+ "messaging.destination.partition.id": "1",
211
+ "messaging.client.id": "rdkafka#producer-1",
212
+ },
213
+ expected: destinationOf({
214
+ system: "kafka",
215
+ destination: "orders",
216
+ direction: "publish",
217
+ }),
218
+ },
219
+ {
220
+ name: "kafkajs 0.9+ process",
221
+ kind: CONSUMER,
222
+ attributes: {
223
+ "messaging.system": "kafka",
224
+ "messaging.destination.name": "orders",
225
+ "messaging.operation.type": "process",
226
+ "messaging.operation.name": "process",
227
+ "messaging.kafka.cluster.id": "5L6g3nShT-eMCtK--X86sw",
228
+ },
229
+ expected: destinationOf({
230
+ system: "kafka",
231
+ destination: "orders",
232
+ direction: "consume",
233
+ }),
234
+ },
235
+ {
236
+ name: "kafkajs before 0.9 send (pre-1.17 key, no operation on producers)",
237
+ kind: PRODUCER,
238
+ attributes: {
239
+ "messaging.system": "kafka",
240
+ "messaging.destination": "orders",
241
+ },
242
+ expected: destinationOf({
243
+ system: "kafka",
244
+ destination: "orders",
245
+ direction: "publish",
246
+ }),
247
+ },
248
+ {
249
+ name: "kafka-python send (bootstrap servers as a JSON list in messaging.url)",
250
+ kind: PRODUCER,
251
+ attributes: {
252
+ "messaging.system": "kafka",
253
+ "messaging.destination": "orders",
254
+ "messaging.kafka.partition": 0,
255
+ "messaging.url": '["kafka-1:9092", "kafka-2:9092"]',
256
+ },
257
+ expected: destinationOf({
258
+ system: "kafka",
259
+ destination: "orders",
260
+ direction: "publish",
261
+ brokerAddress: "kafka-1:9092",
262
+ }),
263
+ },
264
+ {
265
+ name: "confluent-kafka (Python) produce up to v0.62b1: operation 'receive' on a PRODUCER span",
266
+ kind: PRODUCER,
267
+ attributes: {
268
+ "messaging.system": "kafka",
269
+ "messaging.destination": "orders",
270
+ "messaging.destination_kind": "queue",
271
+ "messaging.operation": "receive",
272
+ "messaging.kafka.partition": 2,
273
+ "server.address": "kafka-1",
274
+ "server.port": 9092,
275
+ },
276
+ expected: destinationOf({
277
+ system: "kafka",
278
+ destination: "orders",
279
+ direction: "publish",
280
+ brokerAddress: "kafka-1:9092",
281
+ }),
282
+ },
283
+ {
284
+ name: "confluent-kafka (Python) process",
285
+ kind: CONSUMER,
286
+ attributes: {
287
+ "messaging.system": "kafka",
288
+ "messaging.destination": "orders",
289
+ "messaging.operation": "process",
290
+ "messaging.message.id": "orders.2.1042",
291
+ "server.address": "kafka-1",
292
+ "server.port": "9092",
293
+ },
294
+ expected: destinationOf({
295
+ system: "kafka",
296
+ destination: "orders",
297
+ direction: "consume",
298
+ brokerAddress: "kafka-1:9092",
299
+ }),
300
+ },
301
+ {
302
+ name: "aiokafka send (bootstrap servers as a JSON list in server.address)",
303
+ kind: PRODUCER,
304
+ attributes: {
305
+ "messaging.system": "kafka",
306
+ "messaging.destination.name": "orders",
307
+ "messaging.operation.name": "send",
308
+ "messaging.operation.type": "publish",
309
+ "server.address": '["broker-1:9092", "broker-2:9092"]',
310
+ "messaging.client.id": "aiokafka-1",
311
+ },
312
+ expected: destinationOf({
313
+ system: "kafka",
314
+ destination: "orders",
315
+ direction: "publish",
316
+ brokerAddress: "broker-1:9092",
317
+ }),
318
+ },
319
+ {
320
+ name: "otelsarama (Go, semconv 1.17) publish",
321
+ kind: PRODUCER,
322
+ attributes: {
323
+ "messaging.system": "kafka",
324
+ "messaging.destination.name": "orders",
325
+ "messaging.destination.kind": "topic",
326
+ "messaging.operation": "publish",
327
+ },
328
+ expected: destinationOf({
329
+ system: "kafka",
330
+ destination: "orders",
331
+ direction: "publish",
332
+ }),
333
+ },
334
+
335
+ // ---- RabbitMQ --------------------------------------------------------------
336
+ {
337
+ name: "Java agent RabbitMQ publish to a named exchange (default mode names the exchange)",
338
+ kind: PRODUCER,
339
+ attributes: {
340
+ "messaging.system": "rabbitmq",
341
+ "messaging.destination.name": "orders-exchange",
342
+ "messaging.rabbitmq.destination.routing_key": "order.created",
343
+ "messaging.operation": "publish",
344
+ "network.peer.address": "10.0.0.7",
345
+ "network.peer.port": 5672,
346
+ },
347
+ expected: destinationOf({
348
+ system: "rabbitmq",
349
+ destination: "orders-exchange",
350
+ direction: "publish",
351
+ brokerAddress: "10.0.0.7:5672",
352
+ }),
353
+ },
354
+ {
355
+ name: "Java agent RabbitMQ publish to the default exchange (<default> + routing key)",
356
+ kind: PRODUCER,
357
+ attributes: {
358
+ "messaging.system": "rabbitmq",
359
+ "messaging.destination.name": "<default>",
360
+ "messaging.rabbitmq.destination.routing_key": "work-queue",
361
+ "messaging.operation": "publish",
362
+ "network.peer.address": "10.0.0.7",
363
+ "network.peer.port": 5672,
364
+ },
365
+ expected: destinationOf({
366
+ system: "rabbitmq",
367
+ destination: "work-queue",
368
+ direction: "publish",
369
+ brokerAddress: "10.0.0.7:5672",
370
+ }),
371
+ },
372
+ {
373
+ name: "Java agent RabbitMQ process from a default-exchange queue",
374
+ kind: CONSUMER,
375
+ attributes: {
376
+ "messaging.system": "rabbitmq",
377
+ "messaging.destination.name": "<default>",
378
+ "messaging.rabbitmq.destination.routing_key": "work-queue",
379
+ "messaging.operation": "process",
380
+ },
381
+ expected: destinationOf({
382
+ system: "rabbitmq",
383
+ destination: "work-queue",
384
+ direction: "consume",
385
+ }),
386
+ },
387
+ {
388
+ name: "Java agent RabbitMQ receive from a server-named queue (amq.gen-)",
389
+ kind: CONSUMER,
390
+ attributes: {
391
+ "messaging.system": "rabbitmq",
392
+ "messaging.destination.name": "<default>",
393
+ "messaging.rabbitmq.destination.routing_key":
394
+ "amq.gen-JzTY20BRgKO-HjmUJj0wLg",
395
+ "messaging.operation": "receive",
396
+ },
397
+ expected: null,
398
+ },
399
+ {
400
+ name: "Java agent RabbitMQ queue.declare (a method span carrying only the system)",
401
+ kind: CLIENT,
402
+ attributes: {
403
+ "messaging.system": "rabbitmq",
404
+ "network.peer.address": "10.0.0.7",
405
+ "network.peer.port": 5672,
406
+ },
407
+ expected: null,
408
+ },
409
+ {
410
+ name: "Java agent RabbitMQ publish (opt-in): {exchange}:{routing key}",
411
+ kind: PRODUCER,
412
+ attributes: {
413
+ "messaging.system": "rabbitmq",
414
+ "messaging.destination.name": "direct_logs:warning",
415
+ "messaging.rabbitmq.destination.routing_key": "warning",
416
+ "messaging.operation.type": "send",
417
+ "messaging.operation.name": "publish",
418
+ "server.address": "rabbit.prod",
419
+ "server.port": 5672,
420
+ },
421
+ expected: destinationOf({
422
+ system: "rabbitmq",
423
+ destination: "direct_logs",
424
+ direction: "publish",
425
+ brokerAddress: "rabbit.prod:5672",
426
+ }),
427
+ },
428
+ {
429
+ name: "Java agent RabbitMQ process (opt-in): {exchange}:{routing key}:{queue}",
430
+ kind: CONSUMER,
431
+ attributes: {
432
+ "messaging.system": "rabbitmq",
433
+ "messaging.destination.name": "direct_logs:warning:warning_queue",
434
+ "messaging.rabbitmq.destination.routing_key": "warning",
435
+ "messaging.operation.type": "process",
436
+ },
437
+ expected: destinationOf({
438
+ system: "rabbitmq",
439
+ destination: "warning_queue",
440
+ direction: "consume",
441
+ }),
442
+ },
443
+ {
444
+ name: "RabbitMQ publish to the default exchange with no routing key (amq.default alone)",
445
+ kind: PRODUCER,
446
+ attributes: {
447
+ "messaging.system": "rabbitmq",
448
+ "messaging.destination.name": "amq.default",
449
+ "messaging.operation.type": "send",
450
+ },
451
+ expected: null,
452
+ },
453
+ {
454
+ name: "Java agent RabbitMQ anonymous queue (opt-in flag)",
455
+ kind: CONSUMER,
456
+ attributes: {
457
+ "messaging.system": "rabbitmq",
458
+ "messaging.destination.name": "logs:info:amq.gen-8c2dWmkGJZ4-vS3a5oSaGQ",
459
+ "messaging.rabbitmq.destination.routing_key": "info",
460
+ "messaging.destination.anonymous": true,
461
+ },
462
+ expected: null,
463
+ },
464
+ {
465
+ name: "JS amqplib publish to the default exchange ('' exchange, routing key is the queue)",
466
+ kind: PRODUCER,
467
+ attributes: {
468
+ "messaging.system": "rabbitmq",
469
+ "messaging.destination": "",
470
+ "messaging.destination_kind": "topic",
471
+ "messaging.rabbitmq.routing_key": "task_queue",
472
+ "messaging.protocol": "AMQP",
473
+ "messaging.protocol_version": "0.9.1",
474
+ "messaging.url": "amqp://guest:***@localhost:5672",
475
+ "server.address": "localhost",
476
+ "server.port": 5672,
477
+ "messaging.message_id": "b7e6f1c2",
478
+ },
479
+ expected: destinationOf({
480
+ system: "rabbitmq",
481
+ destination: "task_queue",
482
+ direction: "publish",
483
+ brokerAddress: "localhost:5672",
484
+ }),
485
+ },
486
+ {
487
+ name: "JS amqplib consume from a named exchange (address from the censored URL)",
488
+ kind: CONSUMER,
489
+ attributes: {
490
+ "messaging.system": "rabbitmq",
491
+ "messaging.destination": "logs",
492
+ "messaging.rabbitmq.routing_key": "info",
493
+ "messaging.operation": "process",
494
+ "messaging.url": "amqp://user:***@rabbit.internal:5672/prod",
495
+ },
496
+ expected: destinationOf({
497
+ system: "rabbitmq",
498
+ destination: "logs",
499
+ direction: "consume",
500
+ brokerAddress: "rabbit.internal:5672",
501
+ }),
502
+ },
503
+ {
504
+ name: "JS amqplib up to 0.55 (net.peer.* keys)",
505
+ kind: PRODUCER,
506
+ attributes: {
507
+ "messaging.system": "rabbitmq",
508
+ "messaging.destination": "events",
509
+ "messaging.rabbitmq.routing_key": "user.signup",
510
+ "net.peer.name": "rabbit.internal",
511
+ "net.peer.port": 5672,
512
+ },
513
+ expected: destinationOf({
514
+ system: "rabbitmq",
515
+ destination: "events",
516
+ direction: "publish",
517
+ brokerAddress: "rabbit.internal:5672",
518
+ }),
519
+ },
520
+ {
521
+ name: "Python pika publish (messaging.temp_destination is set on EVERY publish: not trusted)",
522
+ kind: PRODUCER,
523
+ attributes: {
524
+ "messaging.system": "rabbitmq",
525
+ "messaging.temp_destination": true,
526
+ "messaging.destination": "orders",
527
+ "net.peer.name": "rabbit.prod",
528
+ "net.peer.port": 5672,
529
+ },
530
+ expected: destinationOf({
531
+ system: "rabbitmq",
532
+ destination: "orders",
533
+ direction: "publish",
534
+ brokerAddress: "rabbit.prod:5672",
535
+ }),
536
+ },
537
+ {
538
+ name: "Python pika consume",
539
+ kind: CONSUMER,
540
+ attributes: {
541
+ "messaging.system": "rabbitmq",
542
+ "messaging.destination": "orders",
543
+ "messaging.operation": "receive",
544
+ "messaging.message_id": "7f3c",
545
+ },
546
+ expected: destinationOf({
547
+ system: "rabbitmq",
548
+ destination: "orders",
549
+ direction: "consume",
550
+ }),
551
+ },
552
+ {
553
+ name: "aio-pika publish ({exchange},{routing key}, comma-joined)",
554
+ kind: PRODUCER,
555
+ attributes: {
556
+ "messaging.system": "rabbitmq",
557
+ "messaging.destination": "orders,order.created",
558
+ "messaging.temp_destination": true,
559
+ "net.peer.name": "rabbit.prod",
560
+ "net.peer.port": 5672,
561
+ },
562
+ expected: destinationOf({
563
+ system: "rabbitmq",
564
+ destination: "orders",
565
+ direction: "publish",
566
+ brokerAddress: "rabbit.prod:5672",
567
+ }),
568
+ },
569
+ {
570
+ name: "aio-pika publish to the default exchange (',{routing key}')",
571
+ kind: PRODUCER,
572
+ attributes: {
573
+ "messaging.system": "rabbitmq",
574
+ "messaging.destination": ",task_queue",
575
+ "messaging.temp_destination": true,
576
+ },
577
+ expected: destinationOf({
578
+ system: "rabbitmq",
579
+ destination: "task_queue",
580
+ direction: "publish",
581
+ }),
582
+ },
583
+ {
584
+ name: ".NET RabbitMQ.Client v7 publish through the default exchange (amq.default)",
585
+ kind: PRODUCER,
586
+ attributes: {
587
+ "messaging.system": "rabbitmq",
588
+ "messaging.destination.name": "amq.default",
589
+ "messaging.rabbitmq.destination.routing_key": "orders",
590
+ "messaging.operation.type": "send",
591
+ "server.address": "rabbit.prod",
592
+ "server.port": 5672,
593
+ "network.protocol.name": "amqp",
594
+ },
595
+ expected: destinationOf({
596
+ system: "rabbitmq",
597
+ destination: "orders",
598
+ direction: "publish",
599
+ brokerAddress: "rabbit.prod:5672",
600
+ }),
601
+ },
602
+ {
603
+ name: ".NET RabbitMQ.Client direct reply-to",
604
+ kind: PRODUCER,
605
+ attributes: {
606
+ "messaging.system": "rabbitmq",
607
+ "messaging.destination.name": "amq.default",
608
+ "messaging.rabbitmq.destination.routing_key":
609
+ "amq.rabbitmq.reply-to.g1h2AA5yZXBseS10bw==",
610
+ "messaging.operation.type": "send",
611
+ },
612
+ expected: null,
613
+ },
614
+ {
615
+ name: "Spring Cloud Stream anonymous group queue (opt-in)",
616
+ kind: CONSUMER,
617
+ attributes: {
618
+ "messaging.system": "rabbitmq",
619
+ "messaging.destination.name":
620
+ "orders:#:orders.anonymous.X8o1yfRBQXSp5Bdd09ls7w",
621
+ "messaging.rabbitmq.destination.routing_key": "#",
622
+ "messaging.operation.type": "process",
623
+ },
624
+ expected: null,
625
+ },
626
+ {
627
+ name: "Spring AMQP UUID-named queue on the default exchange",
628
+ kind: CONSUMER,
629
+ attributes: {
630
+ "messaging.system": "rabbitmq",
631
+ "messaging.destination.name": "<default>",
632
+ "messaging.rabbitmq.destination.routing_key":
633
+ "3f6a5b2c-1d4e-4f5a-8b6c-7d8e9f0a1b2c",
634
+ },
635
+ expected: null,
636
+ },
637
+ {
638
+ name: "Spring Rabbit (default mode) names the routing key",
639
+ kind: CONSUMER,
640
+ attributes: {
641
+ "messaging.system": "rabbitmq",
642
+ "messaging.destination.name": "order.created",
643
+ "messaging.operation": "process",
644
+ },
645
+ expected: destinationOf({
646
+ system: "rabbitmq",
647
+ destination: "order.created",
648
+ direction: "consume",
649
+ }),
650
+ },
651
+ {
652
+ name: "An exchange named with a colon (MassTransit style), which the routing key contradicts",
653
+ kind: PRODUCER,
654
+ attributes: {
655
+ "messaging.system": "rabbitmq",
656
+ "messaging.destination.name": "Contracts:OrderSubmitted",
657
+ "messaging.rabbitmq.destination.routing_key": "order.submitted",
658
+ },
659
+ expected: destinationOf({
660
+ system: "rabbitmq",
661
+ destination: "Contracts:OrderSubmitted",
662
+ direction: "publish",
663
+ }),
664
+ },
665
+ {
666
+ /*
667
+ * Semconv 1.30 consumer name: the queue equals the routing key, so it
668
+ * is left out (RabbitInstrumenterHelper.consumerDestinationName).
669
+ */
670
+ name: "Java agent RabbitMQ process (opt-in): {exchange}:{routing key} when the routing key is the queue",
671
+ kind: CONSUMER,
672
+ attributes: {
673
+ "messaging.system": "rabbitmq",
674
+ "messaging.destination.name": "direct_logs:warning",
675
+ "messaging.rabbitmq.destination.routing_key": "warning",
676
+ "messaging.operation.type": "process",
677
+ "messaging.operation.name": "process",
678
+ "messaging.rabbitmq.message.delivery_tag": 7,
679
+ },
680
+ expected: destinationOf({
681
+ system: "rabbitmq",
682
+ destination: "warning",
683
+ direction: "consume",
684
+ }),
685
+ },
686
+ {
687
+ /*
688
+ * A fanout exchange's routing key is empty: left out of the name, and
689
+ * no routing-key attribute (RabbitDeliveryExtraAttributesExtractor sets
690
+ * it only when non-empty).
691
+ */
692
+ name: "Java agent RabbitMQ process (opt-in) from a fanout exchange: {exchange}:{queue}",
693
+ kind: CONSUMER,
694
+ attributes: {
695
+ "messaging.system": "rabbitmq",
696
+ "messaging.destination.name": "logs:logs-audit",
697
+ "messaging.operation.type": "process",
698
+ "messaging.operation.name": "process",
699
+ },
700
+ expected: destinationOf({
701
+ system: "rabbitmq",
702
+ destination: "logs-audit",
703
+ direction: "consume",
704
+ }),
705
+ },
706
+ {
707
+ name: "Java agent RabbitMQ basic.ack (opt-in): the consumer's {exchange}:{routing key}",
708
+ kind: CLIENT,
709
+ attributes: {
710
+ "messaging.system": "rabbitmq",
711
+ "messaging.destination.name": "direct_logs:warning",
712
+ "messaging.rabbitmq.destination.routing_key": "warning",
713
+ "messaging.operation.type": "settle",
714
+ "messaging.operation.name": "ack",
715
+ },
716
+ expected: destinationOf({
717
+ system: "rabbitmq",
718
+ destination: "warning",
719
+ direction: "settle",
720
+ }),
721
+ },
722
+ {
723
+ /*
724
+ * MassTransit's own send span (LogContextActivityExtensions
725
+ * .StartSendActivity): the exchange of the message type
726
+ * (`Namespace:Type`, RabbitMqMessageNameFormatter) and the legacy
727
+ * operation key; a publish's routing key is empty, so it is not tagged.
728
+ */
729
+ name: "MassTransit publish to a message-type exchange (Namespace:Type, no routing key)",
730
+ kind: PRODUCER,
731
+ attributes: {
732
+ "messaging.system": "rabbitmq",
733
+ "messaging.operation": "send",
734
+ "messaging.destination.name": "MyApp.Contracts:OrderSubmitted",
735
+ "messaging.message.id": "0b3a0000-5d3e-0015-5c5b-08dd4f1e6b1c",
736
+ "messaging.masstransit.message_types":
737
+ "urn:message:MyApp.Contracts:OrderSubmitted",
738
+ },
739
+ expected: destinationOf({
740
+ system: "rabbitmq",
741
+ destination: "MyApp.Contracts:OrderSubmitted",
742
+ direction: "publish",
743
+ }),
744
+ },
745
+ {
746
+ name: "MassTransit publish of another message type from the same namespace (its own exchange)",
747
+ kind: PRODUCER,
748
+ attributes: {
749
+ "messaging.system": "rabbitmq",
750
+ "messaging.operation": "send",
751
+ "messaging.destination.name": "MyApp.Contracts:OrderCancelled",
752
+ },
753
+ expected: destinationOf({
754
+ system: "rabbitmq",
755
+ destination: "MyApp.Contracts:OrderCancelled",
756
+ direction: "publish",
757
+ }),
758
+ },
759
+ {
760
+ /*
761
+ * MassTransit's receive span (StartReceiveActivity) names its endpoint's
762
+ * queue but no messaging.system: nothing says which broker it is.
763
+ */
764
+ name: "MassTransit receive span (the endpoint queue, but no messaging.system)",
765
+ kind: CONSUMER,
766
+ attributes: {
767
+ "messaging.operation": "receive",
768
+ "messaging.destination.name": "submit-order",
769
+ "messaging.masstransit.input_address":
770
+ "rabbitmq://rabbit.prod/submit-order",
771
+ },
772
+ expected: null,
773
+ },
774
+ {
775
+ /*
776
+ * RabbitMQ.Client for .NET v7 (PopulateMessagingTags) names the exchange
777
+ * alone and always tags the routing key, here empty.
778
+ */
779
+ name: ".NET RabbitMQ.Client v7 publish to a MassTransit exchange (the exchange alone, empty routing key)",
780
+ kind: PRODUCER,
781
+ attributes: {
782
+ "messaging.system": "rabbitmq",
783
+ "network.protocol.name": "amqp",
784
+ "network.protocol.version": "0.9.1",
785
+ "messaging.operation.type": "send",
786
+ "messaging.operation.name": "publish",
787
+ "messaging.destination.name": "MyApp.Contracts:OrderSubmitted",
788
+ "messaging.rabbitmq.destination.routing_key": "",
789
+ },
790
+ expected: destinationOf({
791
+ system: "rabbitmq",
792
+ destination: "MyApp.Contracts:OrderSubmitted",
793
+ direction: "publish",
794
+ }),
795
+ },
796
+ {
797
+ name: ".NET RabbitMQ.Client v7 deliver from a MassTransit exchange (the exchange alone, not {exchange}:{queue})",
798
+ kind: CONSUMER,
799
+ attributes: {
800
+ "messaging.system": "rabbitmq",
801
+ "network.protocol.name": "amqp",
802
+ "network.protocol.version": "0.9.1",
803
+ "messaging.operation.type": "process",
804
+ "messaging.operation.name": "deliver",
805
+ "messaging.destination.name": "MyApp.Contracts:OrderSubmitted",
806
+ "messaging.rabbitmq.destination.routing_key": "",
807
+ "messaging.rabbitmq.delivery_tag": 5,
808
+ },
809
+ expected: destinationOf({
810
+ system: "rabbitmq",
811
+ destination: "MyApp.Contracts:OrderSubmitted",
812
+ direction: "consume",
813
+ }),
814
+ },
815
+ {
816
+ // The Java agent's default mode names the exchange alone, colon and all.
817
+ name: "Java agent RabbitMQ process (default mode) from a MassTransit exchange (no routing key)",
818
+ kind: CONSUMER,
819
+ attributes: {
820
+ "messaging.system": "rabbitmq",
821
+ "messaging.operation": "process",
822
+ "messaging.destination.name": "MyApp.Contracts:OrderSubmitted",
823
+ "network.peer.address": "10.0.0.7",
824
+ "network.peer.port": 5672,
825
+ },
826
+ expected: destinationOf({
827
+ system: "rabbitmq",
828
+ destination: "MyApp.Contracts:OrderSubmitted",
829
+ direction: "consume",
830
+ brokerAddress: "10.0.0.7:5672",
831
+ }),
832
+ },
833
+ {
834
+ /*
835
+ * RabbitMqMessageNameFormatter writes a generic type's argument after
836
+ * "--" in its own `Namespace:Type`: the Fault<T> MassTransit publishes on
837
+ * a consumer fault goes to an exchange with two colons, still one name.
838
+ */
839
+ name: "MassTransit publish of a Fault<T> (a generic type's exchange: two colons, no routing key)",
840
+ kind: PRODUCER,
841
+ attributes: {
842
+ "messaging.system": "rabbitmq",
843
+ "messaging.operation": "send",
844
+ "messaging.destination.name":
845
+ "MassTransit:Fault--MyApp.Contracts:OrderSubmitted--",
846
+ },
847
+ expected: destinationOf({
848
+ system: "rabbitmq",
849
+ destination: "MassTransit:Fault--MyApp.Contracts:OrderSubmitted--",
850
+ direction: "publish",
851
+ }),
852
+ },
853
+ {
854
+ name: ".NET RabbitMQ.Client v7 deliver from a MassTransit Fault<T> exchange (the exchange alone)",
855
+ kind: CONSUMER,
856
+ attributes: {
857
+ "messaging.system": "rabbitmq",
858
+ "network.protocol.name": "amqp",
859
+ "network.protocol.version": "0.9.1",
860
+ "messaging.operation.type": "process",
861
+ "messaging.operation.name": "deliver",
862
+ "messaging.destination.name":
863
+ "MassTransit:Fault--MyApp.Contracts:OrderSubmitted--",
864
+ "messaging.rabbitmq.destination.routing_key": "",
865
+ "messaging.rabbitmq.delivery_tag": 11,
866
+ },
867
+ expected: destinationOf({
868
+ system: "rabbitmq",
869
+ destination: "MassTransit:Fault--MyApp.Contracts:OrderSubmitted--",
870
+ direction: "consume",
871
+ }),
872
+ },
873
+ {
874
+ /*
875
+ * Semconv 1.30 on a consumer of an exchange named with a colon: the
876
+ * empty routing key is left out, and no routing-key attribute is set.
877
+ */
878
+ name: "Java agent RabbitMQ process (opt-in) from a MassTransit exchange: Namespace:Type:{queue}",
879
+ kind: CONSUMER,
880
+ attributes: {
881
+ "messaging.system": "rabbitmq",
882
+ "messaging.destination.name":
883
+ "MyApp.Contracts:OrderSubmitted:billing-order-submitted",
884
+ "messaging.operation.type": "process",
885
+ "messaging.operation.name": "process",
886
+ },
887
+ expected: destinationOf({
888
+ system: "rabbitmq",
889
+ destination: "billing-order-submitted",
890
+ direction: "consume",
891
+ }),
892
+ },
893
+ {
894
+ /*
895
+ * A responder answering a MassTransit request client: the response goes
896
+ * to the requester's bus endpoint, one per process
897
+ * (`{machine}_{process}_bus_{NewId}`).
898
+ */
899
+ name: ".NET RabbitMQ.Client v7 publish of a response to a MassTransit bus endpoint (one per process)",
900
+ kind: PRODUCER,
901
+ attributes: {
902
+ "messaging.system": "rabbitmq",
903
+ "network.protocol.name": "amqp",
904
+ "network.protocol.version": "0.9.1",
905
+ "messaging.operation.type": "send",
906
+ "messaging.operation.name": "publish",
907
+ "messaging.destination.name":
908
+ "ordersapi7d9f8c6b5xk2lq_OrdersApi_bus_kd4oyqbeynuojexybdxt7414fx",
909
+ "messaging.rabbitmq.destination.routing_key": "",
910
+ },
911
+ expected: null,
912
+ },
913
+
914
+ // ---- JMS / Apache ActiveMQ -------------------------------------------------
915
+ {
916
+ name: "Java agent JMS send to a queue",
917
+ kind: PRODUCER,
918
+ attributes: {
919
+ "messaging.system": "jms",
920
+ "messaging.destination.name": "orders.queue",
921
+ "messaging.operation": "publish",
922
+ "messaging.message.id": "ID:app-1-38221-1727698123456-1:1:1:1:1",
923
+ "messaging.message.conversation_id": "c-17",
924
+ },
925
+ expected: destinationOf({
926
+ system: "jms",
927
+ destination: "orders.queue",
928
+ direction: "publish",
929
+ }),
930
+ },
931
+ {
932
+ name: "Java agent JMS temporary queue ((temporary) + flag)",
933
+ kind: CONSUMER,
934
+ attributes: {
935
+ "messaging.system": "jms",
936
+ "messaging.destination.name": "(temporary)",
937
+ "messaging.destination.temporary": true,
938
+ "messaging.operation": "receive",
939
+ },
940
+ expected: null,
941
+ },
942
+ {
943
+ name: "TIBCO temporary destination ($TMP$ prefix)",
944
+ kind: PRODUCER,
945
+ attributes: {
946
+ "messaging.system": "jms",
947
+ "messaging.destination.name": "$TMP$.EMS-SERVER.1F2C5E7A.1",
948
+ },
949
+ expected: null,
950
+ },
951
+ {
952
+ name: "ActiveMQ advisory topic",
953
+ kind: CONSUMER,
954
+ attributes: {
955
+ "messaging.system": "jms",
956
+ "messaging.destination.name": "ActiveMQ.Advisory.Connection",
957
+ },
958
+ expected: null,
959
+ },
960
+ {
961
+ name: "ActiveMQ destination printed with its queue:// prefix",
962
+ kind: PRODUCER,
963
+ attributes: {
964
+ "messaging.system": "activemq",
965
+ "messaging.destination.name": "queue://orders",
966
+ },
967
+ expected: destinationOf({
968
+ system: "activemq",
969
+ destination: "orders",
970
+ direction: "publish",
971
+ }),
972
+ },
973
+ {
974
+ name: "ActiveMQ destination printed with its topic:// prefix",
975
+ kind: CONSUMER,
976
+ attributes: {
977
+ "messaging.system": "activemq",
978
+ "messaging.destination.name": "TOPIC://prices",
979
+ },
980
+ expected: destinationOf({
981
+ system: "activemq",
982
+ destination: "prices",
983
+ direction: "consume",
984
+ }),
985
+ },
986
+ {
987
+ name: "ActiveMQ shared dead-letter queue",
988
+ kind: CONSUMER,
989
+ attributes: {
990
+ "messaging.system": "activemq",
991
+ "messaging.destination.name": "ActiveMQ.DLQ",
992
+ "messaging.operation": "receive",
993
+ },
994
+ expected: destinationOf({
995
+ system: "activemq",
996
+ destination: "ActiveMQ.DLQ",
997
+ direction: "consume",
998
+ isDeadLetter: true,
999
+ }),
1000
+ },
1001
+ {
1002
+ name: "ActiveMQ individual dead-letter queue (DLQ. prefix) over JMS",
1003
+ kind: CONSUMER,
1004
+ attributes: {
1005
+ "messaging.system": "jms",
1006
+ "messaging.destination.name": "DLQ.orders",
1007
+ },
1008
+ expected: destinationOf({
1009
+ system: "jms",
1010
+ destination: "DLQ.orders",
1011
+ direction: "consume",
1012
+ isDeadLetter: true,
1013
+ }),
1014
+ },
1015
+ {
1016
+ name: "JMS temporary queue as ActiveMQ prints it (temp-queue://)",
1017
+ kind: CONSUMER,
1018
+ attributes: {
1019
+ "messaging.system": "jms",
1020
+ "messaging.destination.name":
1021
+ "temp-queue://ID:app-1-38221-1727698123456-1:1:1",
1022
+ },
1023
+ expected: null,
1024
+ },
1025
+ {
1026
+ name: "ActiveMQ Artemis spelling",
1027
+ kind: PRODUCER,
1028
+ attributes: {
1029
+ "messaging.system": "artemis",
1030
+ "messaging.destination.name": "orders",
1031
+ },
1032
+ expected: destinationOf({
1033
+ system: "activemq",
1034
+ destination: "orders",
1035
+ direction: "publish",
1036
+ }),
1037
+ },
1038
+
1039
+ // ---- Amazon SQS ------------------------------------------------------------
1040
+ {
1041
+ name: "Java agent SQS send up to 2.3.0 (AmazonSQS)",
1042
+ kind: PRODUCER,
1043
+ attributes: {
1044
+ "messaging.system": "AmazonSQS",
1045
+ "messaging.destination.name": "orders",
1046
+ "aws.sqs.queue.url": SQS_QUEUE_URL,
1047
+ "messaging.operation": "publish",
1048
+ "rpc.system": "aws-api",
1049
+ "rpc.service": "Sqs",
1050
+ "rpc.method": "SendMessage",
1051
+ "server.address": "sqs.us-east-1.amazonaws.com",
1052
+ "server.port": 443,
1053
+ "messaging.message.id": "5fea7756-0ea4-451a-a703-a558b933e274",
1054
+ },
1055
+ expected: destinationOf({
1056
+ system: "aws_sqs",
1057
+ destination: "orders",
1058
+ direction: "publish",
1059
+ brokerAddress: "sqs.us-east-1.amazonaws.com:443",
1060
+ }),
1061
+ },
1062
+ {
1063
+ name: "Java agent SQS receive from 2.4.0 (aws_sqs)",
1064
+ kind: CONSUMER,
1065
+ attributes: {
1066
+ "messaging.system": "aws_sqs",
1067
+ "messaging.destination.name": "orders",
1068
+ "aws.sqs.queue.url": SQS_QUEUE_URL,
1069
+ "messaging.operation": "receive",
1070
+ "rpc.system": "aws-api",
1071
+ "rpc.service": "Sqs",
1072
+ "rpc.method": "ReceiveMessage",
1073
+ },
1074
+ expected: destinationOf({
1075
+ system: "aws_sqs",
1076
+ destination: "orders",
1077
+ direction: "consume",
1078
+ }),
1079
+ },
1080
+ {
1081
+ name: "Java agent Lambda SQS event, legacy mode (destination aws:sqs)",
1082
+ kind: CONSUMER,
1083
+ attributes: {
1084
+ "messaging.system": "aws_sqs",
1085
+ "messaging.destination.name": "aws:sqs",
1086
+ "messaging.operation": "process",
1087
+ },
1088
+ expected: null,
1089
+ },
1090
+ {
1091
+ name: "JS aws-sdk SQS send up to 0.57.0 (aws.sqs)",
1092
+ kind: PRODUCER,
1093
+ attributes: {
1094
+ "messaging.system": "aws.sqs",
1095
+ "messaging.destination.name": "orders",
1096
+ "url.full": SQS_QUEUE_URL,
1097
+ "rpc.system": "aws-api",
1098
+ "rpc.service": "SQS",
1099
+ "rpc.method": "SendMessage",
1100
+ },
1101
+ expected: destinationOf({
1102
+ system: "aws_sqs",
1103
+ destination: "orders",
1104
+ direction: "publish",
1105
+ }),
1106
+ },
1107
+ {
1108
+ name: "Python boto3sqs receive (queue URL in messaging.url)",
1109
+ kind: CONSUMER,
1110
+ attributes: {
1111
+ "messaging.system": "aws.sqs",
1112
+ "messaging.destination": "orders",
1113
+ "messaging.destination_kind": "queue",
1114
+ "messaging.url":
1115
+ "https://sqs.eu-west-1.amazonaws.com/123456789012/orders",
1116
+ "messaging.operation": "receive",
1117
+ },
1118
+ expected: destinationOf({
1119
+ system: "aws_sqs",
1120
+ destination: "orders",
1121
+ direction: "consume",
1122
+ brokerAddress: "sqs.eu-west-1.amazonaws.com",
1123
+ }),
1124
+ },
1125
+ {
1126
+ name: "Python botocore SQS SendMessage (a CLIENT span: direction from rpc.method)",
1127
+ kind: CLIENT,
1128
+ attributes: {
1129
+ "messaging.system": "aws.sqs",
1130
+ "messaging.url": SQS_QUEUE_URL,
1131
+ "messaging.destination": "orders",
1132
+ "aws.queue_url": SQS_QUEUE_URL,
1133
+ "rpc.system": "aws-api",
1134
+ "rpc.service": "SQS",
1135
+ "rpc.method": "SendMessage",
1136
+ },
1137
+ expected: destinationOf({
1138
+ system: "aws_sqs",
1139
+ destination: "orders",
1140
+ direction: "publish",
1141
+ brokerAddress: "sqs.us-east-1.amazonaws.com",
1142
+ }),
1143
+ },
1144
+ {
1145
+ name: "Go otelaws v0.62+ SendMessage (queue URL in server.address, no destination key)",
1146
+ kind: CLIENT,
1147
+ attributes: {
1148
+ "messaging.system": "aws_sqs",
1149
+ "server.address":
1150
+ "https://sqs.us-west-2.amazonaws.com/123456789012/payments",
1151
+ "rpc.system": "aws-api",
1152
+ "rpc.service": "SQS",
1153
+ "rpc.method": "SQS/SendMessage",
1154
+ },
1155
+ expected: destinationOf({
1156
+ system: "aws_sqs",
1157
+ destination: "payments",
1158
+ direction: "publish",
1159
+ brokerAddress: "sqs.us-west-2.amazonaws.com",
1160
+ }),
1161
+ },
1162
+ {
1163
+ name: "Go otelaws up to v0.61 ReceiveMessage (AmazonSQS, queue URL in net.peer.name)",
1164
+ kind: CLIENT,
1165
+ attributes: {
1166
+ "messaging.system": "AmazonSQS",
1167
+ "net.peer.name":
1168
+ "https://sqs.us-west-2.amazonaws.com/123456789012/payments",
1169
+ "rpc.system": "aws-api",
1170
+ "rpc.service": "SQS",
1171
+ "rpc.method": "SQS/ReceiveMessage",
1172
+ },
1173
+ expected: destinationOf({
1174
+ system: "aws_sqs",
1175
+ destination: "payments",
1176
+ direction: "consume",
1177
+ brokerAddress: "sqs.us-west-2.amazonaws.com",
1178
+ }),
1179
+ },
1180
+ {
1181
+ name: "Go otelaws DeleteMessage settles",
1182
+ kind: CLIENT,
1183
+ attributes: {
1184
+ "messaging.system": "aws_sqs",
1185
+ "server.address":
1186
+ "https://sqs.us-west-2.amazonaws.com/123456789012/payments",
1187
+ "rpc.system": "aws-api",
1188
+ "rpc.service": "SQS",
1189
+ "rpc.method": "SQS/DeleteMessage",
1190
+ },
1191
+ expected: destinationOf({
1192
+ system: "aws_sqs",
1193
+ destination: "payments",
1194
+ direction: "settle",
1195
+ brokerAddress: "sqs.us-west-2.amazonaws.com",
1196
+ }),
1197
+ },
1198
+ {
1199
+ name: "Go otelaws ListQueues (a URL without a queue)",
1200
+ kind: CLIENT,
1201
+ attributes: {
1202
+ "messaging.system": "aws_sqs",
1203
+ "server.address": "https://sqs.us-west-2.amazonaws.com",
1204
+ "rpc.system": "aws-api",
1205
+ "rpc.service": "SQS",
1206
+ "rpc.method": "SQS/ListQueues",
1207
+ },
1208
+ expected: null,
1209
+ },
1210
+ {
1211
+ name: ".NET AWS instrumentation, legacy mode (no messaging.system, aws.queue_url)",
1212
+ kind: CLIENT,
1213
+ attributes: {
1214
+ "aws.queue_url": SQS_QUEUE_URL,
1215
+ "rpc.system": "aws-api",
1216
+ "rpc.service": "SQS",
1217
+ "rpc.method": "ReceiveMessage",
1218
+ },
1219
+ expected: destinationOf({
1220
+ system: "aws_sqs",
1221
+ destination: "orders",
1222
+ direction: "consume",
1223
+ }),
1224
+ },
1225
+ {
1226
+ name: ".NET AWS instrumentation, semconv 1.40 mode",
1227
+ kind: PRODUCER,
1228
+ attributes: {
1229
+ "messaging.system": "aws_sqs",
1230
+ "messaging.destination.name": "orders",
1231
+ "messaging.operation.type": "send",
1232
+ },
1233
+ expected: destinationOf({
1234
+ system: "aws_sqs",
1235
+ destination: "orders",
1236
+ direction: "publish",
1237
+ }),
1238
+ },
1239
+ {
1240
+ name: "SQS FIFO queue",
1241
+ kind: PRODUCER,
1242
+ attributes: {
1243
+ "messaging.system": "aws_sqs",
1244
+ "messaging.destination.name": "orders.fifo",
1245
+ },
1246
+ expected: destinationOf({
1247
+ system: "aws_sqs",
1248
+ destination: "orders.fifo",
1249
+ direction: "publish",
1250
+ }),
1251
+ },
1252
+ {
1253
+ name: "SQS queue ARN as the destination",
1254
+ kind: CONSUMER,
1255
+ attributes: {
1256
+ "messaging.system": "aws_sqs",
1257
+ "messaging.destination.name":
1258
+ "arn:aws:sqs:us-east-2:123456789012:my-queue",
1259
+ },
1260
+ expected: destinationOf({
1261
+ system: "aws_sqs",
1262
+ destination: "my-queue",
1263
+ direction: "consume",
1264
+ }),
1265
+ },
1266
+
1267
+ // ---- Amazon SNS ------------------------------------------------------------
1268
+ {
1269
+ name: "Java agent SNS Publish (an RPC span with no messaging.system)",
1270
+ kind: CLIENT,
1271
+ attributes: {
1272
+ "rpc.system": "aws-api",
1273
+ "rpc.service": "Sns",
1274
+ "rpc.method": "Publish",
1275
+ "messaging.destination.name": SNS_TOPIC_ARN,
1276
+ "aws.sns.topic.arn": SNS_TOPIC_ARN,
1277
+ },
1278
+ expected: destinationOf({
1279
+ system: "aws.sns",
1280
+ destination: "order-events",
1281
+ direction: "publish",
1282
+ }),
1283
+ },
1284
+ {
1285
+ name: "Java agent SNS with only the topic ARN key",
1286
+ kind: CLIENT,
1287
+ attributes: {
1288
+ "rpc.system": "aws-api",
1289
+ "rpc.service": "Sns",
1290
+ "rpc.method": "Publish",
1291
+ "aws.sns.topic.arn": "arn:aws:sns:eu-west-1:123456789012:alerts",
1292
+ },
1293
+ expected: destinationOf({
1294
+ system: "aws.sns",
1295
+ destination: "alerts",
1296
+ direction: "publish",
1297
+ }),
1298
+ },
1299
+ {
1300
+ name: "JS aws-sdk SNS Publish (full ARN in messaging.destination.name)",
1301
+ kind: PRODUCER,
1302
+ attributes: {
1303
+ "messaging.system": "aws.sns",
1304
+ "messaging.destination": "order-events",
1305
+ "messaging.destination.name": SNS_TOPIC_ARN,
1306
+ "aws.sns.topic.arn": SNS_TOPIC_ARN,
1307
+ },
1308
+ expected: destinationOf({
1309
+ system: "aws.sns",
1310
+ destination: "order-events",
1311
+ direction: "publish",
1312
+ }),
1313
+ },
1314
+ {
1315
+ name: "JS aws-sdk SNS Publish without a topic ARN ('unknown')",
1316
+ kind: PRODUCER,
1317
+ attributes: {
1318
+ "messaging.system": "aws.sns",
1319
+ "messaging.destination": "unknown",
1320
+ "messaging.destination.name": "unknown",
1321
+ },
1322
+ expected: null,
1323
+ },
1324
+ {
1325
+ name: "SNS SMS publish to a phone number",
1326
+ kind: PRODUCER,
1327
+ attributes: {
1328
+ "messaging.system": "aws.sns",
1329
+ "messaging.destination.name": "+15555550100",
1330
+ },
1331
+ expected: null,
1332
+ },
1333
+ {
1334
+ name: "Python botocore SNS SMS publish (phone_number:**)",
1335
+ kind: PRODUCER,
1336
+ attributes: {
1337
+ "messaging.system": "aws.sns",
1338
+ "messaging.destination": "phone_number:**",
1339
+ "messaging.destination.name": "phone_number:**",
1340
+ },
1341
+ expected: null,
1342
+ },
1343
+ {
1344
+ name: "Go otelaws SNS Publish (aws_sns, short topic name)",
1345
+ kind: CLIENT,
1346
+ attributes: {
1347
+ "messaging.system": "aws_sns",
1348
+ "messaging.destination.name": "order-events",
1349
+ "messaging.operation.type": "send",
1350
+ "messaging.operation.name": "publish_input",
1351
+ "rpc.method": "SNS/Publish",
1352
+ },
1353
+ expected: destinationOf({
1354
+ system: "aws.sns",
1355
+ destination: "order-events",
1356
+ direction: "publish",
1357
+ }),
1358
+ },
1359
+ {
1360
+ name: "SNS mobile push to a platform endpoint (one per device, not a topic)",
1361
+ kind: PRODUCER,
1362
+ attributes: {
1363
+ "messaging.system": "aws.sns",
1364
+ "messaging.destination.name":
1365
+ "arn:aws:sns:us-east-1:123456789012:endpoint/APNS/my-app/5f2b7c1e-8d3a-4b6f-9c0d-1e2f3a4b5c6d",
1366
+ },
1367
+ expected: null,
1368
+ },
1369
+
1370
+ // ---- Google Cloud Pub/Sub ----------------------------------------------------
1371
+ {
1372
+ name: "Pub/Sub Node publisher create span",
1373
+ kind: PRODUCER,
1374
+ attributes: {
1375
+ "messaging.system": "gcp_pubsub",
1376
+ "messaging.destination.name": "orders",
1377
+ "gcp.project_id": "acme-prod",
1378
+ "messaging.operation": "create",
1379
+ },
1380
+ expected: destinationOf({
1381
+ system: "gcp_pubsub",
1382
+ destination: "orders",
1383
+ direction: "publish",
1384
+ }),
1385
+ },
1386
+ {
1387
+ name: "Pub/Sub Java publish (a CLIENT span)",
1388
+ kind: CLIENT,
1389
+ attributes: {
1390
+ "messaging.system": "gcp_pubsub",
1391
+ "messaging.destination.name": "orders",
1392
+ "messaging.operation": "publish",
1393
+ },
1394
+ expected: destinationOf({
1395
+ system: "gcp_pubsub",
1396
+ destination: "orders",
1397
+ direction: "publish",
1398
+ }),
1399
+ },
1400
+ {
1401
+ name: "Pub/Sub Node subscriber: the destination is the subscription",
1402
+ kind: CONSUMER,
1403
+ attributes: {
1404
+ "messaging.system": "gcp_pubsub",
1405
+ "messaging.destination.name": "billing-sub",
1406
+ "messaging.operation": "subscribe",
1407
+ "gcp.project_id": "acme-prod",
1408
+ },
1409
+ expected: destinationOf({
1410
+ system: "gcp_pubsub",
1411
+ destination: "billing-sub",
1412
+ direction: "consume",
1413
+ consumerGroup: "billing-sub",
1414
+ }),
1415
+ },
1416
+ {
1417
+ name: "Pub/Sub ack (a CLIENT settle span on the subscription)",
1418
+ kind: CLIENT,
1419
+ attributes: {
1420
+ "messaging.system": "gcp_pubsub",
1421
+ "messaging.destination.name": "billing-sub",
1422
+ "messaging.operation.name": "ack",
1423
+ },
1424
+ expected: destinationOf({
1425
+ system: "gcp_pubsub",
1426
+ destination: "billing-sub",
1427
+ direction: "settle",
1428
+ consumerGroup: "billing-sub",
1429
+ }),
1430
+ },
1431
+ {
1432
+ name: "Pub/Sub Go subscribe (an INTERNAL span)",
1433
+ kind: INTERNAL,
1434
+ attributes: {
1435
+ "messaging.system": "gcp_pubsub",
1436
+ "messaging.destination.name": "billing-sub",
1437
+ "messaging.operation.name": "subscribe",
1438
+ "gcp.resource.name":
1439
+ "//pubsub.googleapis.com/projects/acme-prod/subscriptions/billing-sub",
1440
+ },
1441
+ expected: destinationOf({
1442
+ system: "gcp_pubsub",
1443
+ destination: "billing-sub",
1444
+ direction: "consume",
1445
+ consumerGroup: "billing-sub",
1446
+ }),
1447
+ },
1448
+ {
1449
+ name: "Pub/Sub full resource name as the destination",
1450
+ kind: PRODUCER,
1451
+ attributes: {
1452
+ "messaging.system": "gcp_pubsub",
1453
+ "messaging.destination.name": "projects/acme-prod/topics/orders",
1454
+ },
1455
+ expected: destinationOf({
1456
+ system: "gcp_pubsub",
1457
+ destination: "orders",
1458
+ direction: "publish",
1459
+ }),
1460
+ },
1461
+
1462
+ // ---- Azure Service Bus -------------------------------------------------------
1463
+ {
1464
+ name: ".NET Service Bus send (ActivitySource mode)",
1465
+ kind: CLIENT,
1466
+ attributes: {
1467
+ "messaging.system": "servicebus",
1468
+ "messaging.operation": "publish",
1469
+ "server.address": SERVICE_BUS_HOST,
1470
+ "messaging.destination.name": "orders",
1471
+ "az.namespace": "Microsoft.ServiceBus",
1472
+ "messaging.batch.message_count": 3,
1473
+ },
1474
+ expected: destinationOf({
1475
+ system: "servicebus",
1476
+ destination: "orders",
1477
+ brokerScope: "orders-prod",
1478
+ brokerAddress: SERVICE_BUS_HOST,
1479
+ direction: "publish",
1480
+ }),
1481
+ },
1482
+ {
1483
+ name: ".NET Service Bus per-message PRODUCER span",
1484
+ kind: PRODUCER,
1485
+ attributes: {
1486
+ "messaging.system": "servicebus",
1487
+ "server.address": SERVICE_BUS_HOST,
1488
+ "messaging.destination.name": "orders",
1489
+ "az.namespace": "Microsoft.ServiceBus",
1490
+ },
1491
+ expected: destinationOf({
1492
+ system: "servicebus",
1493
+ destination: "orders",
1494
+ brokerScope: "orders-prod",
1495
+ brokerAddress: SERVICE_BUS_HOST,
1496
+ direction: "publish",
1497
+ }),
1498
+ },
1499
+ {
1500
+ name: ".NET Service Bus receive from a topic subscription (entity path)",
1501
+ kind: CLIENT,
1502
+ attributes: {
1503
+ "messaging.system": "servicebus",
1504
+ "messaging.operation": "receive",
1505
+ "server.address": SERVICE_BUS_HOST,
1506
+ "messaging.destination.name": "order-events/Subscriptions/billing",
1507
+ "az.namespace": "Microsoft.ServiceBus",
1508
+ },
1509
+ expected: destinationOf({
1510
+ system: "servicebus",
1511
+ destination: "order-events",
1512
+ brokerScope: "orders-prod",
1513
+ brokerAddress: SERVICE_BUS_HOST,
1514
+ direction: "consume",
1515
+ consumerGroup: "billing",
1516
+ }),
1517
+ },
1518
+ {
1519
+ name: ".NET Service Bus dead-letter receive (/$DeadLetterQueue)",
1520
+ kind: CLIENT,
1521
+ attributes: {
1522
+ "messaging.system": "servicebus",
1523
+ "messaging.operation": "receive",
1524
+ "server.address": SERVICE_BUS_HOST,
1525
+ "messaging.destination.name": "orders/$DeadLetterQueue",
1526
+ "az.namespace": "Microsoft.ServiceBus",
1527
+ },
1528
+ expected: destinationOf({
1529
+ system: "servicebus",
1530
+ destination: "orders",
1531
+ brokerScope: "orders-prod",
1532
+ brokerAddress: SERVICE_BUS_HOST,
1533
+ direction: "consume",
1534
+ isDeadLetter: true,
1535
+ }),
1536
+ },
1537
+ {
1538
+ name: ".NET Service Bus subscription dead-letter queue",
1539
+ kind: CLIENT,
1540
+ attributes: {
1541
+ "messaging.system": "servicebus",
1542
+ "messaging.operation": "receive",
1543
+ "server.address": SERVICE_BUS_HOST,
1544
+ "messaging.destination.name":
1545
+ "order-events/Subscriptions/billing/$DeadLetterQueue",
1546
+ "az.namespace": "Microsoft.ServiceBus",
1547
+ },
1548
+ expected: destinationOf({
1549
+ system: "servicebus",
1550
+ destination: "order-events",
1551
+ brokerScope: "orders-prod",
1552
+ brokerAddress: SERVICE_BUS_HOST,
1553
+ direction: "consume",
1554
+ consumerGroup: "billing",
1555
+ isDeadLetter: true,
1556
+ }),
1557
+ },
1558
+ {
1559
+ name: ".NET Service Bus transfer dead-letter queue",
1560
+ kind: CLIENT,
1561
+ attributes: {
1562
+ "messaging.system": "servicebus",
1563
+ "messaging.operation": "receive",
1564
+ "server.address": SERVICE_BUS_HOST,
1565
+ "messaging.destination.name": "orders/$Transfer/$DeadLetterQueue",
1566
+ "az.namespace": "Microsoft.ServiceBus",
1567
+ },
1568
+ expected: destinationOf({
1569
+ system: "servicebus",
1570
+ destination: "orders",
1571
+ brokerScope: "orders-prod",
1572
+ brokerAddress: SERVICE_BUS_HOST,
1573
+ direction: "consume",
1574
+ isDeadLetter: true,
1575
+ }),
1576
+ },
1577
+ {
1578
+ name: ".NET ServiceBusProcessor.ProcessMessage",
1579
+ kind: CONSUMER,
1580
+ attributes: {
1581
+ "messaging.system": "servicebus",
1582
+ "messaging.operation": "process",
1583
+ "server.address": SERVICE_BUS_HOST,
1584
+ "messaging.destination.name": "orders",
1585
+ "az.namespace": "Microsoft.ServiceBus",
1586
+ },
1587
+ expected: destinationOf({
1588
+ system: "servicebus",
1589
+ destination: "orders",
1590
+ brokerScope: "orders-prod",
1591
+ brokerAddress: SERVICE_BUS_HOST,
1592
+ direction: "consume",
1593
+ }),
1594
+ },
1595
+ {
1596
+ name: ".NET ServiceBusReceiver.Complete (settle)",
1597
+ kind: CLIENT,
1598
+ attributes: {
1599
+ "messaging.system": "servicebus",
1600
+ "messaging.operation": "settle",
1601
+ "server.address": SERVICE_BUS_HOST,
1602
+ "messaging.destination.name": "orders",
1603
+ "az.namespace": "Microsoft.ServiceBus",
1604
+ },
1605
+ expected: destinationOf({
1606
+ system: "servicebus",
1607
+ destination: "orders",
1608
+ brokerScope: "orders-prod",
1609
+ brokerAddress: SERVICE_BUS_HOST,
1610
+ direction: "settle",
1611
+ }),
1612
+ },
1613
+ {
1614
+ name: ".NET Service Bus, legacy DiagnosticSource mode (component, peer.address, message_bus.destination)",
1615
+ kind: CLIENT,
1616
+ attributes: {
1617
+ component: "servicebus",
1618
+ "peer.address": `sb://${SERVICE_BUS_HOST}/`,
1619
+ "message_bus.destination": "orders",
1620
+ "az.namespace": "Microsoft.ServiceBus",
1621
+ },
1622
+ expected: destinationOf({
1623
+ system: "servicebus",
1624
+ destination: "orders",
1625
+ brokerScope: "orders-prod",
1626
+ brokerAddress: SERVICE_BUS_HOST,
1627
+ }),
1628
+ },
1629
+ {
1630
+ name: "Azure legacy mode with only the component as the system",
1631
+ kind: PRODUCER,
1632
+ attributes: {
1633
+ component: "eventhubs",
1634
+ "message_bus.destination": "telemetry",
1635
+ "peer.address": `sb://${EVENT_HUBS_HOST}/`,
1636
+ },
1637
+ expected: destinationOf({
1638
+ system: "eventhubs",
1639
+ destination: "telemetry",
1640
+ brokerScope: "ingest-prod",
1641
+ brokerAddress: EVENT_HUBS_HOST,
1642
+ direction: "publish",
1643
+ }),
1644
+ },
1645
+ {
1646
+ name: "Azure component without its legacy companions is no evidence",
1647
+ kind: CLIENT,
1648
+ attributes: {
1649
+ component: "servicebus",
1650
+ "messaging.destination.name": "orders",
1651
+ },
1652
+ expected: null,
1653
+ },
1654
+ {
1655
+ name: "Java Service Bus receive (lowercase subscriptions, both namespace keys)",
1656
+ kind: CLIENT,
1657
+ attributes: {
1658
+ "messaging.system": "servicebus",
1659
+ "messaging.operation": "receive",
1660
+ "messaging.destination.name": "order-events/subscriptions/billing",
1661
+ "server.address": SERVICE_BUS_HOST,
1662
+ "az.namespace": "Microsoft.ServiceBus",
1663
+ "azure.resource_provider.namespace": "Microsoft.ServiceBus",
1664
+ },
1665
+ expected: destinationOf({
1666
+ system: "servicebus",
1667
+ destination: "order-events",
1668
+ brokerScope: "orders-prod",
1669
+ brokerAddress: SERVICE_BUS_HOST,
1670
+ direction: "consume",
1671
+ consumerGroup: "billing",
1672
+ }),
1673
+ },
1674
+ {
1675
+ name: "Java Service Bus dead-letter queue (/$deadletterqueue)",
1676
+ kind: CLIENT,
1677
+ attributes: {
1678
+ "messaging.system": "servicebus",
1679
+ "messaging.operation": "receive",
1680
+ "messaging.destination.name": "orders/$deadletterqueue",
1681
+ "server.address": SERVICE_BUS_HOST,
1682
+ },
1683
+ expected: destinationOf({
1684
+ system: "servicebus",
1685
+ destination: "orders",
1686
+ brokerScope: "orders-prod",
1687
+ brokerAddress: SERVICE_BUS_HOST,
1688
+ direction: "consume",
1689
+ isDeadLetter: true,
1690
+ }),
1691
+ },
1692
+ {
1693
+ name: "JS Service Bus receive (messaging.source.name, net.peer.name)",
1694
+ kind: CLIENT,
1695
+ attributes: {
1696
+ "messaging.system": "servicebus",
1697
+ "messaging.operation": "receive",
1698
+ "messaging.source.name": "order-events/Subscriptions/billing",
1699
+ "net.peer.name": SERVICE_BUS_HOST,
1700
+ "az.namespace": "Microsoft.ServiceBus",
1701
+ },
1702
+ expected: destinationOf({
1703
+ system: "servicebus",
1704
+ destination: "order-events",
1705
+ brokerScope: "orders-prod",
1706
+ brokerAddress: SERVICE_BUS_HOST,
1707
+ direction: "consume",
1708
+ consumerGroup: "billing",
1709
+ }),
1710
+ },
1711
+ {
1712
+ name: "Python Service Bus publish (legacy keys only)",
1713
+ kind: CLIENT,
1714
+ attributes: {
1715
+ "messaging.system": "servicebus",
1716
+ "az.namespace": "Microsoft.ServiceBus",
1717
+ "messaging.operation": "publish",
1718
+ "message_bus.destination": "orders",
1719
+ "peer.address": SERVICE_BUS_HOST,
1720
+ },
1721
+ expected: destinationOf({
1722
+ system: "servicebus",
1723
+ destination: "orders",
1724
+ brokerScope: "orders-prod",
1725
+ brokerAddress: SERVICE_BUS_HOST,
1726
+ direction: "publish",
1727
+ }),
1728
+ },
1729
+ {
1730
+ name: "Service Bus in the US Government cloud",
1731
+ kind: PRODUCER,
1732
+ attributes: {
1733
+ "messaging.system": "servicebus",
1734
+ "messaging.destination.name": "orders",
1735
+ "server.address": "orders-gov.servicebus.usgovcloudapi.net",
1736
+ },
1737
+ expected: destinationOf({
1738
+ system: "servicebus",
1739
+ destination: "orders",
1740
+ brokerScope: "orders-gov",
1741
+ brokerAddress: "orders-gov.servicebus.usgovcloudapi.net",
1742
+ direction: "publish",
1743
+ }),
1744
+ },
1745
+ {
1746
+ name: "Service Bus in the China cloud",
1747
+ kind: PRODUCER,
1748
+ attributes: {
1749
+ "messaging.system": "servicebus",
1750
+ "messaging.destination.name": "orders",
1751
+ "server.address": "orders-cn.servicebus.chinacloudapi.cn",
1752
+ },
1753
+ expected: destinationOf({
1754
+ system: "servicebus",
1755
+ destination: "orders",
1756
+ brokerScope: "orders-cn",
1757
+ brokerAddress: "orders-cn.servicebus.chinacloudapi.cn",
1758
+ direction: "publish",
1759
+ }),
1760
+ },
1761
+ {
1762
+ name: "Service Bus emulator (no namespace host)",
1763
+ kind: PRODUCER,
1764
+ attributes: {
1765
+ "messaging.system": "servicebus",
1766
+ "messaging.destination.name": "orders",
1767
+ "server.address": "localhost",
1768
+ "server.port": 5672,
1769
+ },
1770
+ expected: destinationOf({
1771
+ system: "servicebus",
1772
+ destination: "orders",
1773
+ brokerAddress: "localhost:5672",
1774
+ direction: "publish",
1775
+ }),
1776
+ },
1777
+ {
1778
+ name: "Semconv 1.24 azure_servicebus spelling",
1779
+ kind: PRODUCER,
1780
+ attributes: {
1781
+ "messaging.system": "azure_servicebus",
1782
+ "messaging.destination.name": "orders",
1783
+ "server.address": SERVICE_BUS_HOST,
1784
+ },
1785
+ expected: destinationOf({
1786
+ system: "servicebus",
1787
+ destination: "orders",
1788
+ brokerScope: "orders-prod",
1789
+ brokerAddress: SERVICE_BUS_HOST,
1790
+ direction: "publish",
1791
+ }),
1792
+ },
1793
+ {
1794
+ name: "A malformed messaging.system falls through to the Azure namespace",
1795
+ kind: PRODUCER,
1796
+ attributes: {
1797
+ "messaging.system": "Azure Service Bus",
1798
+ "az.namespace": "Microsoft.ServiceBus",
1799
+ "messaging.destination.name": "orders",
1800
+ "server.address": SERVICE_BUS_HOST,
1801
+ },
1802
+ expected: destinationOf({
1803
+ system: "servicebus",
1804
+ destination: "orders",
1805
+ brokerScope: "orders-prod",
1806
+ brokerAddress: SERVICE_BUS_HOST,
1807
+ direction: "publish",
1808
+ }),
1809
+ },
1810
+ {
1811
+ name: "Azure Storage SDK span (az.namespace, but not messaging)",
1812
+ kind: CLIENT,
1813
+ attributes: {
1814
+ "az.namespace": "Microsoft.Storage",
1815
+ "http.request.method": "PUT",
1816
+ "url.full": "https://acct.blob.core.windows.net/c/b?sig=abc",
1817
+ "server.address": "acct.blob.core.windows.net",
1818
+ },
1819
+ expected: null,
1820
+ },
1821
+
1822
+ // ---- Azure Event Hubs / Event Grid -------------------------------------------
1823
+ {
1824
+ name: ".NET Event Hubs send",
1825
+ kind: CLIENT,
1826
+ attributes: {
1827
+ "messaging.system": "eventhubs",
1828
+ "messaging.operation": "publish",
1829
+ "messaging.destination.name": "telemetry",
1830
+ "server.address": EVENT_HUBS_HOST,
1831
+ "az.namespace": "Microsoft.EventHub",
1832
+ },
1833
+ expected: destinationOf({
1834
+ system: "eventhubs",
1835
+ destination: "telemetry",
1836
+ brokerScope: "ingest-prod",
1837
+ brokerAddress: EVENT_HUBS_HOST,
1838
+ direction: "publish",
1839
+ }),
1840
+ },
1841
+ {
1842
+ name: "Java Event Hubs process with a consumer group",
1843
+ kind: CONSUMER,
1844
+ attributes: {
1845
+ "messaging.system": "eventhubs",
1846
+ "messaging.operation.type": "process",
1847
+ "messaging.operation.name": "process",
1848
+ "messaging.destination.name": "telemetry",
1849
+ "messaging.consumer.group.name": "$Default",
1850
+ "messaging.destination.partition.id": "3",
1851
+ "server.address": EVENT_HUBS_HOST,
1852
+ },
1853
+ expected: destinationOf({
1854
+ system: "eventhubs",
1855
+ destination: "telemetry",
1856
+ brokerScope: "ingest-prod",
1857
+ brokerAddress: EVENT_HUBS_HOST,
1858
+ direction: "consume",
1859
+ consumerGroup: "$Default",
1860
+ }),
1861
+ },
1862
+ {
1863
+ name: "Java Event Hubs send with the deprecated 'publish' operation type",
1864
+ kind: CLIENT,
1865
+ attributes: {
1866
+ "messaging.system": "eventhubs",
1867
+ "messaging.operation.type": "publish",
1868
+ "messaging.operation.name": "send",
1869
+ "messaging.destination.name": "telemetry",
1870
+ "server.address": EVENT_HUBS_HOST,
1871
+ },
1872
+ expected: destinationOf({
1873
+ system: "eventhubs",
1874
+ destination: "telemetry",
1875
+ brokerScope: "ingest-prod",
1876
+ brokerAddress: EVENT_HUBS_HOST,
1877
+ direction: "publish",
1878
+ }),
1879
+ },
1880
+ {
1881
+ name: "Java Event Hubs checkpoint (settle)",
1882
+ kind: CLIENT,
1883
+ attributes: {
1884
+ "messaging.system": "eventhubs",
1885
+ "messaging.operation.type": "settle",
1886
+ "messaging.operation.name": "checkpoint",
1887
+ "messaging.destination.name": "telemetry",
1888
+ "messaging.consumer.group.name": "$Default",
1889
+ "server.address": EVENT_HUBS_HOST,
1890
+ },
1891
+ expected: destinationOf({
1892
+ system: "eventhubs",
1893
+ destination: "telemetry",
1894
+ brokerScope: "ingest-prod",
1895
+ brokerAddress: EVENT_HUBS_HOST,
1896
+ direction: "settle",
1897
+ consumerGroup: "$Default",
1898
+ }),
1899
+ },
1900
+ {
1901
+ name: "Event Hubs receiver entity path with a consumer group and partition",
1902
+ kind: CLIENT,
1903
+ attributes: {
1904
+ "messaging.system": "eventhubs",
1905
+ "messaging.operation": "receive",
1906
+ "messaging.destination.name":
1907
+ "telemetry/ConsumerGroups/$Default/Partitions/0",
1908
+ "server.address": EVENT_HUBS_HOST,
1909
+ },
1910
+ expected: destinationOf({
1911
+ system: "eventhubs",
1912
+ destination: "telemetry",
1913
+ brokerScope: "ingest-prod",
1914
+ brokerAddress: EVENT_HUBS_HOST,
1915
+ direction: "consume",
1916
+ consumerGroup: "$Default",
1917
+ }),
1918
+ },
1919
+ {
1920
+ name: "Kafka clients talking to Event Hubs report kafka (no namespace scope)",
1921
+ kind: PRODUCER,
1922
+ attributes: {
1923
+ "messaging.system": "kafka",
1924
+ "messaging.destination.name": "telemetry",
1925
+ "server.address": EVENT_HUBS_HOST,
1926
+ "server.port": 9093,
1927
+ },
1928
+ expected: destinationOf({
1929
+ system: "kafka",
1930
+ destination: "telemetry",
1931
+ brokerAddress: `${EVENT_HUBS_HOST}:9093`,
1932
+ direction: "publish",
1933
+ }),
1934
+ },
1935
+ {
1936
+ name: "Event Grid publish (no namespace in its identity)",
1937
+ kind: PRODUCER,
1938
+ attributes: {
1939
+ "messaging.system": "eventgrid",
1940
+ "messaging.destination.name": "orders-topic",
1941
+ "server.address": "orders-topic.westeurope-1.eventgrid.azure.net",
1942
+ },
1943
+ expected: destinationOf({
1944
+ system: "eventgrid",
1945
+ destination: "orders-topic",
1946
+ brokerAddress: "orders-topic.westeurope-1.eventgrid.azure.net",
1947
+ direction: "publish",
1948
+ }),
1949
+ },
1950
+
1951
+ // ---- Apache Pulsar -----------------------------------------------------------
1952
+ {
1953
+ name: "Java agent Pulsar send to a partition (default mode)",
1954
+ kind: PRODUCER,
1955
+ attributes: {
1956
+ "messaging.system": "pulsar",
1957
+ "messaging.destination.name":
1958
+ "persistent://public/default/payments-partition-1",
1959
+ "messaging.operation": "publish",
1960
+ "server.address": "pulsar-broker-0",
1961
+ "server.port": 6650,
1962
+ },
1963
+ expected: destinationOf({
1964
+ system: "pulsar",
1965
+ destination: "persistent://public/default/payments",
1966
+ direction: "publish",
1967
+ brokerAddress: "pulsar-broker-0:6650",
1968
+ }),
1969
+ },
1970
+ {
1971
+ name: "Pulsar short topic name (the default tenant and namespace)",
1972
+ kind: CONSUMER,
1973
+ attributes: {
1974
+ "messaging.system": "pulsar",
1975
+ "messaging.destination.name": "orders",
1976
+ "messaging.operation": "process",
1977
+ },
1978
+ expected: destinationOf({
1979
+ system: "pulsar",
1980
+ destination: "persistent://public/default/orders",
1981
+ direction: "consume",
1982
+ }),
1983
+ },
1984
+ {
1985
+ name: "Pulsar tenant/namespace/topic without a domain",
1986
+ kind: PRODUCER,
1987
+ attributes: {
1988
+ "messaging.system": "pulsar",
1989
+ "messaging.destination.name": "acme/billing/invoices",
1990
+ },
1991
+ expected: destinationOf({
1992
+ system: "pulsar",
1993
+ destination: "persistent://acme/billing/invoices",
1994
+ direction: "publish",
1995
+ }),
1996
+ },
1997
+ {
1998
+ name: "Java agent Pulsar receive (opt-in) with a subscription",
1999
+ kind: CONSUMER,
2000
+ attributes: {
2001
+ "messaging.system": "pulsar",
2002
+ "messaging.destination.name": "persistent://acme/billing/invoices",
2003
+ "messaging.destination.subscription.name": "ledger",
2004
+ "messaging.destination.partition.id": "2",
2005
+ "messaging.operation.type": "process",
2006
+ },
2007
+ expected: destinationOf({
2008
+ system: "pulsar",
2009
+ destination: "persistent://acme/billing/invoices",
2010
+ direction: "consume",
2011
+ consumerGroup: "ledger",
2012
+ }),
2013
+ },
2014
+ {
2015
+ name: "Pulsar non-persistent partition",
2016
+ kind: PRODUCER,
2017
+ attributes: {
2018
+ "messaging.system": "pulsar",
2019
+ "messaging.destination.name":
2020
+ "non-persistent://public/default/ticks-partition-0",
2021
+ },
2022
+ expected: destinationOf({
2023
+ system: "pulsar",
2024
+ destination: "non-persistent://public/default/ticks",
2025
+ direction: "publish",
2026
+ }),
2027
+ },
2028
+ {
2029
+ name: "Pulsar system topic (__change_events)",
2030
+ kind: CONSUMER,
2031
+ attributes: {
2032
+ "messaging.system": "pulsar",
2033
+ "messaging.destination.name":
2034
+ "persistent://public/default/__change_events",
2035
+ },
2036
+ expected: null,
2037
+ },
2038
+ {
2039
+ name: "Pulsar transaction system topic (short name)",
2040
+ kind: PRODUCER,
2041
+ attributes: {
2042
+ "messaging.system": "pulsar",
2043
+ "messaging.destination.name": "__transaction_buffer_snapshot",
2044
+ },
2045
+ expected: null,
2046
+ },
2047
+
2048
+ // ---- Apache RocketMQ ---------------------------------------------------------
2049
+ {
2050
+ name: "Java agent RocketMQ process (legacy consumer group key)",
2051
+ kind: CONSUMER,
2052
+ attributes: {
2053
+ "messaging.system": "rocketmq",
2054
+ "messaging.destination.name": "orders",
2055
+ "messaging.rocketmq.client_group": "billing-group",
2056
+ "messaging.operation": "process",
2057
+ "messaging.rocketmq.broker_address": "10.0.0.9:10911",
2058
+ "messaging.rocketmq.queue_id": 3,
2059
+ "messaging.rocketmq.queue_offset": 77,
2060
+ },
2061
+ expected: destinationOf({
2062
+ system: "rocketmq",
2063
+ destination: "orders",
2064
+ direction: "consume",
2065
+ consumerGroup: "billing-group",
2066
+ }),
2067
+ },
2068
+ {
2069
+ name: "RocketMQ opt-in consumer group",
2070
+ kind: CONSUMER,
2071
+ attributes: {
2072
+ "messaging.system": "rocketmq",
2073
+ "messaging.destination.name": "orders",
2074
+ "messaging.consumer.group.name": "billing-group",
2075
+ "messaging.operation.type": "process",
2076
+ },
2077
+ expected: destinationOf({
2078
+ system: "rocketmq",
2079
+ destination: "orders",
2080
+ direction: "consume",
2081
+ consumerGroup: "billing-group",
2082
+ }),
2083
+ },
2084
+ {
2085
+ name: "RocketMQ dead-letter topic (%DLQ%<group>)",
2086
+ kind: CONSUMER,
2087
+ attributes: {
2088
+ "messaging.system": "rocketmq",
2089
+ "messaging.destination.name": "%DLQ%billing-group",
2090
+ },
2091
+ expected: destinationOf({
2092
+ system: "rocketmq",
2093
+ destination: "%DLQ%billing-group",
2094
+ direction: "consume",
2095
+ isDeadLetter: true,
2096
+ }),
2097
+ },
2098
+
2099
+ // ---- NATS --------------------------------------------------------------------
2100
+ {
2101
+ name: "Java agent NATS publish",
2102
+ kind: PRODUCER,
2103
+ attributes: {
2104
+ "messaging.system": "nats",
2105
+ "messaging.destination.name": "orders.created",
2106
+ "messaging.operation": "publish",
2107
+ },
2108
+ expected: destinationOf({
2109
+ system: "nats",
2110
+ destination: "orders.created",
2111
+ direction: "publish",
2112
+ }),
2113
+ },
2114
+ {
2115
+ name: "NATS request inbox (template, name and temporary flag)",
2116
+ kind: CONSUMER,
2117
+ attributes: {
2118
+ "messaging.system": "nats",
2119
+ "messaging.destination.template": "_INBOX.",
2120
+ "messaging.destination.name": "_INBOX.k3qTbUQ4AkVZe9L1u8A1rd",
2121
+ "messaging.destination.temporary": true,
2122
+ },
2123
+ expected: null,
2124
+ },
2125
+ {
2126
+ name: "NATS inbox template without the flag",
2127
+ kind: CONSUMER,
2128
+ attributes: {
2129
+ "messaging.system": "nats",
2130
+ "messaging.destination.template": "_INBOX.",
2131
+ },
2132
+ expected: null,
2133
+ },
2134
+ {
2135
+ name: "JetStream acknowledgement subject",
2136
+ kind: CLIENT,
2137
+ attributes: {
2138
+ "messaging.system": "nats",
2139
+ "messaging.destination.template": "$JS.ACK",
2140
+ "messaging.destination.name":
2141
+ "$JS.ACK.ORDERS.billing.1.42.42.1727698123456789012.0",
2142
+ },
2143
+ expected: null,
2144
+ },
2145
+ {
2146
+ name: "NATS subject template wins over the concrete subject",
2147
+ kind: PRODUCER,
2148
+ attributes: {
2149
+ "messaging.system": "nats",
2150
+ "messaging.destination.template": "orders.{id}",
2151
+ "messaging.destination.name": "orders.42",
2152
+ },
2153
+ expected: destinationOf({
2154
+ system: "nats",
2155
+ destination: "orders.{id}",
2156
+ direction: "publish",
2157
+ }),
2158
+ },
2159
+ {
2160
+ name: "JetStream spelling",
2161
+ kind: PRODUCER,
2162
+ attributes: {
2163
+ "messaging.system": "jetstream",
2164
+ "messaging.destination.name": "ORDERS.new",
2165
+ },
2166
+ expected: destinationOf({
2167
+ system: "nats",
2168
+ destination: "ORDERS.new",
2169
+ direction: "publish",
2170
+ }),
2171
+ },
2172
+
2173
+ // ---- BullMQ and the long tail ------------------------------------------------
2174
+ {
2175
+ name: "OneUptime's own BullMQ worker job span",
2176
+ kind: INTERNAL,
2177
+ attributes: {
2178
+ "messaging.system": "bullmq",
2179
+ "messaging.destination.name": "Workers",
2180
+ "messaging.operation.name": "ProcessMonitorEvaluation",
2181
+ },
2182
+ expected: destinationOf({
2183
+ system: "bullmq",
2184
+ destination: "Workers",
2185
+ }),
2186
+ },
2187
+ {
2188
+ name: "A long-tail broker the catalog does not know (IBM MQ)",
2189
+ kind: PRODUCER,
2190
+ attributes: {
2191
+ "messaging.system": "ibmmq",
2192
+ "messaging.destination.name": "DEV.QUEUE.1",
2193
+ "server.address": "mq.prod",
2194
+ "server.port": 1414,
2195
+ },
2196
+ expected: destinationOf({
2197
+ system: "ibmmq",
2198
+ destination: "DEV.QUEUE.1",
2199
+ direction: "publish",
2200
+ brokerAddress: "mq.prod:1414",
2201
+ }),
2202
+ },
2203
+
2204
+ // ---- never a queue -------------------------------------------------------------
2205
+ {
2206
+ name: "Celery sets no messaging.system (its broker is unknown)",
2207
+ kind: PRODUCER,
2208
+ attributes: {
2209
+ "messaging.destination": "celery",
2210
+ "celery.action": "apply_async",
2211
+ "celery.task_name": "tasks.add",
2212
+ "messaging.message.id": "e3b0c442-98fc-4c14-9afb-f4c8996fb924",
2213
+ },
2214
+ expected: null,
2215
+ },
2216
+ {
2217
+ name: "Spring Integration channel (in-process, opt-in)",
2218
+ kind: PRODUCER,
2219
+ attributes: {
2220
+ "messaging.system": "spring_integration",
2221
+ "messaging.destination.name": "inputChannel",
2222
+ },
2223
+ expected: null,
2224
+ },
2225
+ {
2226
+ name: "An HTTP client span",
2227
+ kind: CLIENT,
2228
+ attributes: {
2229
+ "http.request.method": "GET",
2230
+ "server.address": "api.example.com",
2231
+ "server.port": 443,
2232
+ },
2233
+ expected: null,
2234
+ },
2235
+ ];
2236
+
2237
+ // ---- datapoints --------------------------------------------------------------------
2238
+
2239
+ const KAFKA_RESOURCE: FixtureAttributes = {
2240
+ "resource.kafka.cluster.alias": "prod-kafka",
2241
+ "resource.kafka.cluster.id": "5L6g3nShT-eMCtK--X86sw",
2242
+ };
2243
+
2244
+ const RABBITMQ_RESOURCE: FixtureAttributes = {
2245
+ "resource.rabbitmq.node.name": "rabbit@16c76f2d8aa2",
2246
+ "resource.rabbitmq.queue.name": "orders",
2247
+ "resource.rabbitmq.vhost.name": "/",
2248
+ };
2249
+
2250
+ const JMX_SCRAPER_RESOURCE: FixtureAttributes = {
2251
+ "resource.service.name": "activemq-prod",
2252
+ "resource.service.instance.id": "174b52e6-c976-3dfd-8e52-bfb13115009a",
2253
+ "resource.telemetry.sdk.language": "java",
2254
+ };
2255
+
2256
+ const ACTIVEMQ_DESTINATION: FixtureAttributes = {
2257
+ ...JMX_SCRAPER_RESOURCE,
2258
+ "activemq.broker.name": "localhost",
2259
+ "activemq.destination.type": "queue",
2260
+ "messaging.destination.name": "orders",
2261
+ };
2262
+
2263
+ const ACTIVEMQ_LEGACY_DESTINATION: FixtureAttributes = {
2264
+ ...JMX_SCRAPER_RESOURCE,
2265
+ broker: "localhost",
2266
+ destination: "orders",
2267
+ };
2268
+
2269
+ const AZURE_SUBSCRIPTION_RESOURCE: FixtureAttributes = {
2270
+ "resource.azuremonitor.subscription_id":
2271
+ "7c4a1f2e-9d3b-4e5f-8a6b-1c2d3e4f5a6b",
2272
+ "resource.azuremonitor.tenant_id": "0f1e2d3c-4b5a-6978-8a9b-0c1d2e3f4a5b",
2273
+ };
2274
+
2275
+ const SERVICE_BUS_ENTITY: FixtureAttributes = {
2276
+ ...AZURE_SUBSCRIPTION_RESOURCE,
2277
+ "azuremonitor.resource_id":
2278
+ "/subscriptions/7c4a1f2e-9d3b-4e5f-8a6b-1c2d3e4f5a6b/resourceGroups/rg-prod/providers/Microsoft.ServiceBus/namespaces/orders-prod",
2279
+ name: "orders-prod",
2280
+ type: "Microsoft.ServiceBus/Namespaces",
2281
+ resource_group: "rg-prod",
2282
+ location: "westeurope",
2283
+ metadata_entityname: "orders",
2284
+ };
2285
+
2286
+ const EVENT_HUBS_ENTITY: FixtureAttributes = {
2287
+ ...AZURE_SUBSCRIPTION_RESOURCE,
2288
+ "azuremonitor.resource_id":
2289
+ "/subscriptions/7c4a1f2e-9d3b-4e5f-8a6b-1c2d3e4f5a6b/resourceGroups/rg-prod/providers/Microsoft.EventHub/namespaces/ingest-prod",
2290
+ name: "ingest-prod",
2291
+ type: "Microsoft.EventHub/namespaces",
2292
+ resource_group: "rg-prod",
2293
+ location: "westeurope",
2294
+ metadata_entityname: "telemetry",
2295
+ };
2296
+
2297
+ const CLOUDWATCH_OTEL_RESOURCE: FixtureAttributes = {
2298
+ "resource.cloud.provider": "aws",
2299
+ "resource.cloud.account.id": "123456789012",
2300
+ "resource.cloud.region": "us-east-1",
2301
+ "resource.aws.exporter.arn":
2302
+ "arn:aws:cloudwatch:us-east-1:123456789012:metric-stream/oneuptime",
2303
+ };
2304
+
2305
+ function cloudWatchJsonResource(service: string): FixtureAttributes {
2306
+ return {
2307
+ "resource.cloud.provider": "aws",
2308
+ "resource.cloud.account.id": "123456789012",
2309
+ "resource.cloud.region": "us-east-1",
2310
+ "resource.service.namespace": "AWS",
2311
+ "resource.service.name": service,
2312
+ "resource.aws.cloudwatch.metric_stream_name": "oneuptime",
2313
+ };
2314
+ }
2315
+
2316
+ const PUBSUB_SUBSCRIPTION_RESOURCE: FixtureAttributes = {
2317
+ "resource.gcp.resource_type": "pubsub_subscription",
2318
+ "resource.project_id": "acme-prod",
2319
+ "resource.subscription_id": "billing-sub",
2320
+ };
2321
+
2322
+ const PUBSUB_TOPIC_RESOURCE: FixtureAttributes = {
2323
+ "resource.gcp.resource_type": "pubsub_topic",
2324
+ "resource.project_id": "acme-prod",
2325
+ "resource.topic_id": "orders",
2326
+ };
2327
+
2328
+ const PULSAR_SCRAPE: FixtureAttributes = {
2329
+ "resource.server.address": "pulsar-broker-0",
2330
+ "resource.server.port": "8080",
2331
+ "resource.service.instance.id": "pulsar-broker-0:8080",
2332
+ "resource.service.name": "pulsar-broker",
2333
+ "resource.url.scheme": "http",
2334
+ cluster: "standalone",
2335
+ namespace: "public/default",
2336
+ topic: "persistent://public/default/payments-partition-1",
2337
+ };
2338
+
2339
+ const ROCKETMQ_SCRAPE: FixtureAttributes = {
2340
+ "resource.server.address": "rocketmq-broker-a",
2341
+ "resource.server.port": "5557",
2342
+ "resource.service.instance.id": "rocketmq-broker-a:5557",
2343
+ "resource.service.name": "rocketmq-broker",
2344
+ cluster: "DefaultCluster",
2345
+ node_type: "broker",
2346
+ node_id: "broker-a",
2347
+ topic: "orders",
2348
+ is_system: "false",
2349
+ };
2350
+
2351
+ const KAFKA_PAYMENTS: ResolvedMessagingDestination = destinationOf({
2352
+ system: "kafka",
2353
+ destination: "payments",
2354
+ });
2355
+
2356
+ const RABBITMQ_ORDERS: ResolvedMessagingDestination = destinationOf({
2357
+ system: "rabbitmq",
2358
+ destination: "orders",
2359
+ });
2360
+
2361
+ const ACTIVEMQ_ORDERS: ResolvedMessagingDestination = destinationOf({
2362
+ system: "activemq",
2363
+ destination: "orders",
2364
+ });
2365
+
2366
+ const SERVICE_BUS_ORDERS: ResolvedMessagingDestination = destinationOf({
2367
+ system: "servicebus",
2368
+ destination: "orders",
2369
+ brokerScope: "orders-prod",
2370
+ });
2371
+
2372
+ const EVENT_HUBS_TELEMETRY: ResolvedMessagingDestination = destinationOf({
2373
+ system: "eventhubs",
2374
+ destination: "telemetry",
2375
+ brokerScope: "ingest-prod",
2376
+ });
2377
+
2378
+ const SQS_ORDERS: ResolvedMessagingDestination = destinationOf({
2379
+ system: "aws_sqs",
2380
+ destination: "orders",
2381
+ });
2382
+
2383
+ const SNS_ORDER_EVENTS: ResolvedMessagingDestination = destinationOf({
2384
+ system: "aws.sns",
2385
+ destination: "order-events",
2386
+ });
2387
+
2388
+ const PUBSUB_BILLING_SUB: ResolvedMessagingDestination = destinationOf({
2389
+ system: "gcp_pubsub",
2390
+ destination: "billing-sub",
2391
+ });
2392
+
2393
+ const PULSAR_PAYMENTS: ResolvedMessagingDestination = destinationOf({
2394
+ system: "pulsar",
2395
+ destination: "persistent://public/default/payments",
2396
+ brokerAddress: "pulsar-broker-0:8080",
2397
+ });
2398
+
2399
+ const ROCKETMQ_ORDERS: ResolvedMessagingDestination = destinationOf({
2400
+ system: "rocketmq",
2401
+ destination: "orders",
2402
+ brokerAddress: "rocketmq-broker-a:5557",
2403
+ });
2404
+
2405
+ function withDirection(
2406
+ resolved: ResolvedMessagingDestination,
2407
+ direction: ResolvedMessagingDestination["direction"],
2408
+ ): ResolvedMessagingDestination {
2409
+ return { ...resolved, direction };
2410
+ }
2411
+
2412
+ function sqsFixtures(data: {
2413
+ cloudWatchName: string;
2414
+ direction: ResolvedMessagingDestination["direction"];
2415
+ }): Array<MetricFixture> {
2416
+ const lower: string = data.cloudWatchName.toLowerCase();
2417
+ return [
2418
+ {
2419
+ name: `CloudWatch ${data.cloudWatchName} (aws_cloudwatch / Metric Stream OpenTelemetry 1.0)`,
2420
+ metricName: `amazonaws.com/aws/sqs/${lower}`,
2421
+ attributes: {
2422
+ ...CLOUDWATCH_OTEL_RESOURCE,
2423
+ Namespace: "AWS/SQS",
2424
+ MetricName: data.cloudWatchName,
2425
+ "Dimensions.QueueName": "orders",
2426
+ },
2427
+ expected: withDirection(SQS_ORDERS, data.direction),
2428
+ },
2429
+ {
2430
+ name: `CloudWatch ${data.cloudWatchName} (Metric Stream JSON)`,
2431
+ metricName: lower,
2432
+ attributes: {
2433
+ ...cloudWatchJsonResource("SQS"),
2434
+ QueueName: "orders",
2435
+ },
2436
+ expected: withDirection(SQS_ORDERS, data.direction),
2437
+ },
2438
+ ];
2439
+ }
2440
+
2441
+ function snsFixtures(data: {
2442
+ cloudWatchName: string;
2443
+ direction: ResolvedMessagingDestination["direction"];
2444
+ }): Array<MetricFixture> {
2445
+ const lower: string = data.cloudWatchName.toLowerCase();
2446
+ return [
2447
+ {
2448
+ name: `CloudWatch ${data.cloudWatchName} (aws_cloudwatch / Metric Stream OpenTelemetry 1.0)`,
2449
+ metricName: `amazonaws.com/aws/sns/${lower}`,
2450
+ attributes: {
2451
+ ...CLOUDWATCH_OTEL_RESOURCE,
2452
+ Namespace: "AWS/SNS",
2453
+ MetricName: data.cloudWatchName,
2454
+ "Dimensions.TopicName": "order-events",
2455
+ },
2456
+ expected: withDirection(SNS_ORDER_EVENTS, data.direction),
2457
+ },
2458
+ {
2459
+ name: `CloudWatch ${data.cloudWatchName} (Metric Stream JSON)`,
2460
+ metricName: lower,
2461
+ attributes: {
2462
+ ...cloudWatchJsonResource("SNS"),
2463
+ TopicName: "order-events",
2464
+ },
2465
+ expected: withDirection(SNS_ORDER_EVENTS, data.direction),
2466
+ },
2467
+ ];
2468
+ }
2469
+
2470
+ /*
2471
+ * One realistic stored datapoint for every curated broker metric (the
2472
+ * catalog suite checks none is missing), plus the variants each source
2473
+ * really produces.
2474
+ */
2475
+ export const METRIC_FIXTURES: ReadonlyArray<MetricFixture> = [
2476
+ // Apache Kafka — kafka_metrics (live capture against Kafka 4.1.0).
2477
+ {
2478
+ name: "kafka_metrics consumer-group lag, summed over partitions",
2479
+ metricName: "kafka.consumer_group.lag_sum",
2480
+ attributes: { ...KAFKA_RESOURCE, group: "billing", topic: "payments" },
2481
+ expected: KAFKA_PAYMENTS,
2482
+ },
2483
+ {
2484
+ name: "kafka_metrics per-partition lag (partition is an int)",
2485
+ metricName: "kafka.consumer_group.lag",
2486
+ attributes: { group: "billing", topic: "payments", partition: 0 },
2487
+ expected: KAFKA_PAYMENTS,
2488
+ },
2489
+ {
2490
+ name: "kafka_metrics committed offsets, summed over partitions",
2491
+ metricName: "kafka.consumer_group.offset_sum",
2492
+ attributes: { ...KAFKA_RESOURCE, group: "billing", topic: "payments" },
2493
+ expected: withDirection(KAFKA_PAYMENTS, "consume"),
2494
+ },
2495
+ {
2496
+ name: "kafka_metrics log-end offset",
2497
+ metricName: "kafka.partition.current_offset",
2498
+ attributes: { ...KAFKA_RESOURCE, topic: "payments", partition: 2 },
2499
+ expected: withDirection(KAFKA_PAYMENTS, "publish"),
2500
+ },
2501
+
2502
+ // RabbitMQ — rabbitmq receiver (live capture against RabbitMQ 4.3.6).
2503
+ {
2504
+ name: "rabbitmq queue depth, ready series",
2505
+ metricName: "rabbitmq.message.current",
2506
+ attributes: { ...RABBITMQ_RESOURCE, state: "ready" },
2507
+ expected: RABBITMQ_ORDERS,
2508
+ },
2509
+ {
2510
+ name: "rabbitmq queue depth, unacknowledged series",
2511
+ metricName: "rabbitmq.message.current",
2512
+ attributes: { ...RABBITMQ_RESOURCE, state: "unacknowledged" },
2513
+ expected: RABBITMQ_ORDERS,
2514
+ },
2515
+ {
2516
+ name: "rabbitmq published",
2517
+ metricName: "rabbitmq.message.published",
2518
+ attributes: { ...RABBITMQ_RESOURCE },
2519
+ expected: withDirection(RABBITMQ_ORDERS, "publish"),
2520
+ },
2521
+ {
2522
+ name: "rabbitmq delivered",
2523
+ metricName: "rabbitmq.message.delivered",
2524
+ attributes: { ...RABBITMQ_RESOURCE },
2525
+ expected: withDirection(RABBITMQ_ORDERS, "consume"),
2526
+ },
2527
+ {
2528
+ name: "rabbitmq acknowledged",
2529
+ metricName: "rabbitmq.message.acknowledged",
2530
+ attributes: { ...RABBITMQ_RESOURCE },
2531
+ expected: withDirection(RABBITMQ_ORDERS, "consume"),
2532
+ },
2533
+ {
2534
+ name: "rabbitmq dropped",
2535
+ metricName: "rabbitmq.message.dropped",
2536
+ attributes: { ...RABBITMQ_RESOURCE },
2537
+ expected: RABBITMQ_ORDERS,
2538
+ },
2539
+ {
2540
+ name: "rabbitmq consumers",
2541
+ metricName: "rabbitmq.consumer.count",
2542
+ attributes: { ...RABBITMQ_RESOURCE },
2543
+ expected: RABBITMQ_ORDERS,
2544
+ },
2545
+ {
2546
+ // The receiver lists every queue: a bus endpoint per MassTransit process.
2547
+ name: "rabbitmq queue depth of a MassTransit bus endpoint (one per process)",
2548
+ metricName: "rabbitmq.message.current",
2549
+ attributes: {
2550
+ ...RABBITMQ_RESOURCE,
2551
+ "resource.rabbitmq.queue.name":
2552
+ "ordersapi7d9f8c6b5xk2lq_OrdersApi_bus_kd4oyqbeynuojexybdxt7414fx",
2553
+ state: "ready",
2554
+ },
2555
+ expected: null,
2556
+ },
2557
+
2558
+ // Apache ActiveMQ — JMX Scraper (live capture against ActiveMQ Classic 6.2.0).
2559
+ {
2560
+ name: "JMX Scraper queue size (1.53+ names)",
2561
+ metricName: "activemq.message.queue.size",
2562
+ attributes: { ...ACTIVEMQ_DESTINATION },
2563
+ expected: ACTIVEMQ_ORDERS,
2564
+ },
2565
+ {
2566
+ name: "JMX Scraper queue size (legacy names)",
2567
+ metricName: "activemq.message.current",
2568
+ attributes: { ...ACTIVEMQ_LEGACY_DESTINATION },
2569
+ expected: ACTIVEMQ_ORDERS,
2570
+ },
2571
+ {
2572
+ name: "JMX Scraper enqueued (1.53+ names)",
2573
+ metricName: "activemq.message.enqueued",
2574
+ attributes: { ...ACTIVEMQ_DESTINATION },
2575
+ expected: withDirection(ACTIVEMQ_ORDERS, "publish"),
2576
+ },
2577
+ {
2578
+ name: "JMX Scraper enqueued (legacy names)",
2579
+ metricName: "activemq.message.enqueued",
2580
+ attributes: { ...ACTIVEMQ_LEGACY_DESTINATION },
2581
+ expected: withDirection(ACTIVEMQ_ORDERS, "publish"),
2582
+ },
2583
+ {
2584
+ name: "JMX Scraper dequeued (1.53+ names)",
2585
+ metricName: "activemq.message.dequeued",
2586
+ attributes: { ...ACTIVEMQ_DESTINATION },
2587
+ expected: withDirection(ACTIVEMQ_ORDERS, "consume"),
2588
+ },
2589
+ {
2590
+ name: "JMX Scraper dequeued (legacy names)",
2591
+ metricName: "activemq.message.dequeued",
2592
+ attributes: { ...ACTIVEMQ_LEGACY_DESTINATION },
2593
+ expected: withDirection(ACTIVEMQ_ORDERS, "consume"),
2594
+ },
2595
+ {
2596
+ name: "JMX Scraper expired (1.53+ names)",
2597
+ metricName: "activemq.message.expired",
2598
+ attributes: { ...ACTIVEMQ_DESTINATION },
2599
+ expected: ACTIVEMQ_ORDERS,
2600
+ },
2601
+ {
2602
+ name: "JMX Scraper expired (legacy names)",
2603
+ metricName: "activemq.message.expired",
2604
+ attributes: { ...ACTIVEMQ_LEGACY_DESTINATION },
2605
+ expected: ACTIVEMQ_ORDERS,
2606
+ },
2607
+ {
2608
+ name: "JMX Scraper consumers (1.53+ names)",
2609
+ metricName: "activemq.consumer.count",
2610
+ attributes: { ...ACTIVEMQ_DESTINATION },
2611
+ expected: ACTIVEMQ_ORDERS,
2612
+ },
2613
+ {
2614
+ name: "JMX Scraper consumers (legacy names)",
2615
+ metricName: "activemq.consumer.count",
2616
+ attributes: { ...ACTIVEMQ_LEGACY_DESTINATION },
2617
+ expected: ACTIVEMQ_ORDERS,
2618
+ },
2619
+ {
2620
+ name: "JMX Scraper average time in queue (1.53+ names, seconds)",
2621
+ metricName: "activemq.message.enqueue.average_duration",
2622
+ attributes: { ...ACTIVEMQ_DESTINATION },
2623
+ expected: ACTIVEMQ_ORDERS,
2624
+ },
2625
+ {
2626
+ name: "JMX Scraper average time in queue (legacy names, ms)",
2627
+ metricName: "activemq.message.wait_time.avg",
2628
+ attributes: { ...ACTIVEMQ_LEGACY_DESTINATION },
2629
+ expected: ACTIVEMQ_ORDERS,
2630
+ },
2631
+
2632
+ // Azure Service Bus — azure_monitor.
2633
+ {
2634
+ name: "Azure Monitor ActiveMessages",
2635
+ metricName: "azure_activemessages_average",
2636
+ attributes: { ...SERVICE_BUS_ENTITY },
2637
+ expected: SERVICE_BUS_ORDERS,
2638
+ },
2639
+ {
2640
+ name: "Azure Monitor DeadletteredMessages",
2641
+ metricName: "azure_deadletteredmessages_average",
2642
+ attributes: { ...SERVICE_BUS_ENTITY },
2643
+ expected: SERVICE_BUS_ORDERS,
2644
+ },
2645
+ {
2646
+ name: "Azure Monitor IncomingMessages (Service Bus)",
2647
+ metricName: "azure_incomingmessages_total",
2648
+ attributes: { ...SERVICE_BUS_ENTITY },
2649
+ expected: withDirection(SERVICE_BUS_ORDERS, "publish"),
2650
+ },
2651
+ {
2652
+ name: "Azure Monitor OutgoingMessages (Service Bus)",
2653
+ metricName: "azure_outgoingmessages_total",
2654
+ attributes: { ...SERVICE_BUS_ENTITY },
2655
+ expected: withDirection(SERVICE_BUS_ORDERS, "consume"),
2656
+ },
2657
+ {
2658
+ name: "Azure Monitor CompleteMessage",
2659
+ metricName: "azure_completemessage_total",
2660
+ attributes: { ...SERVICE_BUS_ENTITY },
2661
+ expected: withDirection(SERVICE_BUS_ORDERS, "consume"),
2662
+ },
2663
+ {
2664
+ name: "Azure Monitor AbandonMessage",
2665
+ metricName: "azure_abandonmessage_total",
2666
+ attributes: { ...SERVICE_BUS_ENTITY },
2667
+ expected: SERVICE_BUS_ORDERS,
2668
+ },
2669
+ {
2670
+ name: "Azure Monitor ServerErrors (Service Bus)",
2671
+ metricName: "azure_servererrors_total",
2672
+ attributes: {
2673
+ ...SERVICE_BUS_ENTITY,
2674
+ metadata_operationresult: "serverbusy",
2675
+ },
2676
+ expected: SERVICE_BUS_ORDERS,
2677
+ },
2678
+ {
2679
+ name: "Azure Monitor UserErrors (Service Bus)",
2680
+ metricName: "azure_usererrors_total",
2681
+ attributes: {
2682
+ ...SERVICE_BUS_ENTITY,
2683
+ metadata_operationresult: "clienterror",
2684
+ },
2685
+ expected: SERVICE_BUS_ORDERS,
2686
+ },
2687
+ {
2688
+ name: "Azure Monitor ThrottledRequests (Service Bus)",
2689
+ metricName: "azure_throttledrequests_total",
2690
+ attributes: {
2691
+ ...SERVICE_BUS_ENTITY,
2692
+ metadata_operationresult: "serverbusy",
2693
+ metadata_messagingerrorsubcode: "CPU",
2694
+ },
2695
+ expected: SERVICE_BUS_ORDERS,
2696
+ },
2697
+ {
2698
+ name: "Azure Monitor ActiveMessages of a MassTransit bus endpoint (one per process)",
2699
+ metricName: "azure_activemessages_average",
2700
+ attributes: {
2701
+ ...SERVICE_BUS_ENTITY,
2702
+ metadata_entityname:
2703
+ "billingworker02_BillingWorker_bus_7d4yysgeydaos4hybdxt76a6rx",
2704
+ },
2705
+ expected: null,
2706
+ },
2707
+
2708
+ // Azure Event Hubs — azure_monitor.
2709
+ {
2710
+ name: "Azure Monitor IncomingMessages (Event Hubs)",
2711
+ metricName: "azure_incomingmessages_total",
2712
+ attributes: { ...EVENT_HUBS_ENTITY },
2713
+ expected: withDirection(EVENT_HUBS_TELEMETRY, "publish"),
2714
+ },
2715
+ {
2716
+ name: "Azure Monitor OutgoingMessages (Event Hubs)",
2717
+ metricName: "azure_outgoingmessages_total",
2718
+ attributes: { ...EVENT_HUBS_ENTITY },
2719
+ expected: withDirection(EVENT_HUBS_TELEMETRY, "consume"),
2720
+ },
2721
+ {
2722
+ name: "Azure Monitor ServerErrors (Event Hubs)",
2723
+ metricName: "azure_servererrors_total",
2724
+ attributes: {
2725
+ ...EVENT_HUBS_ENTITY,
2726
+ metadata_operationresult: "serverbusy",
2727
+ },
2728
+ expected: EVENT_HUBS_TELEMETRY,
2729
+ },
2730
+ {
2731
+ name: "Azure Monitor UserErrors (Event Hubs)",
2732
+ metricName: "azure_usererrors_total",
2733
+ attributes: {
2734
+ ...EVENT_HUBS_ENTITY,
2735
+ metadata_operationresult: "clienterror",
2736
+ },
2737
+ expected: EVENT_HUBS_TELEMETRY,
2738
+ },
2739
+ {
2740
+ name: "Azure Monitor QuotaExceededErrors (Event Hubs)",
2741
+ metricName: "azure_quotaexceedederrors_total",
2742
+ attributes: {
2743
+ ...EVENT_HUBS_ENTITY,
2744
+ metadata_operationresult: "quotaexceeded",
2745
+ },
2746
+ expected: EVENT_HUBS_TELEMETRY,
2747
+ },
2748
+ {
2749
+ name: "Azure Monitor ThrottledRequests (Event Hubs)",
2750
+ metricName: "azure_throttledrequests_total",
2751
+ attributes: {
2752
+ ...EVENT_HUBS_ENTITY,
2753
+ metadata_operationresult: "serverbusy",
2754
+ },
2755
+ expected: EVENT_HUBS_TELEMETRY,
2756
+ },
2757
+
2758
+ // Amazon SQS — both CloudWatch shapes.
2759
+ ...sqsFixtures({
2760
+ cloudWatchName: "ApproximateNumberOfMessagesVisible",
2761
+ direction: "unknown",
2762
+ }),
2763
+ ...sqsFixtures({
2764
+ cloudWatchName: "ApproximateAgeOfOldestMessage",
2765
+ direction: "unknown",
2766
+ }),
2767
+ ...sqsFixtures({
2768
+ cloudWatchName: "ApproximateNumberOfMessagesNotVisible",
2769
+ direction: "unknown",
2770
+ }),
2771
+ ...sqsFixtures({
2772
+ cloudWatchName: "NumberOfMessagesSent",
2773
+ direction: "publish",
2774
+ }),
2775
+ ...sqsFixtures({
2776
+ cloudWatchName: "NumberOfMessagesReceived",
2777
+ direction: "consume",
2778
+ }),
2779
+ ...sqsFixtures({
2780
+ cloudWatchName: "NumberOfMessagesDeleted",
2781
+ direction: "consume",
2782
+ }),
2783
+ {
2784
+ name: "CloudWatch ApproximateNumberOfMessagesVisible of a MassTransit bus endpoint (one per process)",
2785
+ metricName: "amazonaws.com/aws/sqs/approximatenumberofmessagesvisible",
2786
+ attributes: {
2787
+ ...CLOUDWATCH_OTEL_RESOURCE,
2788
+ Namespace: "AWS/SQS",
2789
+ MetricName: "ApproximateNumberOfMessagesVisible",
2790
+ "Dimensions.QueueName":
2791
+ "ip10012034euwe_ContosoBillingWorker_bus_68pobtdryda85beybdxt68ffbx",
2792
+ },
2793
+ expected: null,
2794
+ },
2795
+
2796
+ // Amazon SNS — both CloudWatch shapes.
2797
+ ...snsFixtures({
2798
+ cloudWatchName: "NumberOfMessagesPublished",
2799
+ direction: "publish",
2800
+ }),
2801
+ ...snsFixtures({
2802
+ cloudWatchName: "NumberOfNotificationsDelivered",
2803
+ direction: "consume",
2804
+ }),
2805
+ ...snsFixtures({
2806
+ cloudWatchName: "NumberOfNotificationsFailed",
2807
+ direction: "unknown",
2808
+ }),
2809
+ ...snsFixtures({
2810
+ cloudWatchName: "NumberOfNotificationsRedrivenToDlq",
2811
+ direction: "unknown",
2812
+ }),
2813
+
2814
+ // Google Cloud Pub/Sub — googlecloudmonitoring.
2815
+ {
2816
+ name: "Pub/Sub undelivered messages",
2817
+ metricName: "pubsub.googleapis.com/subscription/num_undelivered_messages",
2818
+ attributes: { ...PUBSUB_SUBSCRIPTION_RESOURCE },
2819
+ expected: PUBSUB_BILLING_SUB,
2820
+ },
2821
+ {
2822
+ name: "Pub/Sub oldest unacked message age",
2823
+ metricName: "pubsub.googleapis.com/subscription/oldest_unacked_message_age",
2824
+ attributes: { ...PUBSUB_SUBSCRIPTION_RESOURCE },
2825
+ expected: PUBSUB_BILLING_SUB,
2826
+ },
2827
+ {
2828
+ name: "Pub/Sub dead-lettered messages (collector 0.137+: label on the datapoint)",
2829
+ metricName: "pubsub.googleapis.com/subscription/dead_letter_message_count",
2830
+ attributes: { ...PUBSUB_SUBSCRIPTION_RESOURCE, response_code: "success" },
2831
+ expected: PUBSUB_BILLING_SUB,
2832
+ },
2833
+ {
2834
+ name: "Pub/Sub dead-lettered messages (collector 0.116-0.136: label on the resource)",
2835
+ metricName: "pubsub.googleapis.com/subscription/dead_letter_message_count",
2836
+ attributes: {
2837
+ ...PUBSUB_SUBSCRIPTION_RESOURCE,
2838
+ "resource.response_code": "success",
2839
+ },
2840
+ expected: PUBSUB_BILLING_SUB,
2841
+ },
2842
+ {
2843
+ name: "Pub/Sub acknowledged messages",
2844
+ metricName: "pubsub.googleapis.com/subscription/ack_message_count",
2845
+ attributes: { ...PUBSUB_SUBSCRIPTION_RESOURCE, delivery_type: "pull" },
2846
+ expected: withDirection(PUBSUB_BILLING_SUB, "consume"),
2847
+ },
2848
+ {
2849
+ name: "Pub/Sub publish requests (on the topic)",
2850
+ metricName: "pubsub.googleapis.com/topic/send_request_count",
2851
+ attributes: {
2852
+ ...PUBSUB_TOPIC_RESOURCE,
2853
+ response_class: "success",
2854
+ response_code: "success",
2855
+ },
2856
+ expected: destinationOf({
2857
+ system: "gcp_pubsub",
2858
+ destination: "orders",
2859
+ direction: "publish",
2860
+ }),
2861
+ },
2862
+
2863
+ // Apache Pulsar — prometheus scrape of the broker (live capture, Pulsar 4.2.4).
2864
+ {
2865
+ name: "Pulsar topic backlog (a partition)",
2866
+ metricName: "pulsar_msg_backlog",
2867
+ attributes: { ...PULSAR_SCRAPE },
2868
+ expected: PULSAR_PAYMENTS,
2869
+ },
2870
+ {
2871
+ name: "Pulsar subscription backlog",
2872
+ metricName: "pulsar_subscription_back_log",
2873
+ attributes: { ...PULSAR_SCRAPE, subscription: "ledger" },
2874
+ expected: PULSAR_PAYMENTS,
2875
+ },
2876
+ {
2877
+ name: "Pulsar backlog age",
2878
+ metricName: "pulsar_storage_backlog_age_seconds",
2879
+ attributes: { ...PULSAR_SCRAPE },
2880
+ expected: PULSAR_PAYMENTS,
2881
+ },
2882
+ {
2883
+ name: "Pulsar messages in",
2884
+ metricName: "pulsar_in_messages_total",
2885
+ attributes: { ...PULSAR_SCRAPE },
2886
+ expected: withDirection(PULSAR_PAYMENTS, "publish"),
2887
+ },
2888
+ {
2889
+ name: "Pulsar messages out",
2890
+ metricName: "pulsar_out_messages_total",
2891
+ attributes: { ...PULSAR_SCRAPE, subscription: "ledger" },
2892
+ expected: withDirection(PULSAR_PAYMENTS, "consume"),
2893
+ },
2894
+
2895
+ // Apache RocketMQ — prometheus scrape (metricsExporterType=PROM).
2896
+ {
2897
+ name: "RocketMQ consumer lag",
2898
+ metricName: "rocketmq_consumer_lag_messages",
2899
+ attributes: {
2900
+ ...ROCKETMQ_SCRAPE,
2901
+ consumer_group: "billing-group",
2902
+ is_retry: "false",
2903
+ },
2904
+ expected: ROCKETMQ_ORDERS,
2905
+ },
2906
+ {
2907
+ name: "RocketMQ ready messages",
2908
+ metricName: "rocketmq_consumer_ready_messages",
2909
+ attributes: {
2910
+ ...ROCKETMQ_SCRAPE,
2911
+ consumer_group: "billing-group",
2912
+ is_retry: "false",
2913
+ },
2914
+ expected: ROCKETMQ_ORDERS,
2915
+ },
2916
+ {
2917
+ name: "RocketMQ sent to the dead-letter queue",
2918
+ metricName: "rocketmq_send_to_dlq_messages_total",
2919
+ attributes: { ...ROCKETMQ_SCRAPE, consumer_group: "billing-group" },
2920
+ expected: ROCKETMQ_ORDERS,
2921
+ },
2922
+ {
2923
+ name: "RocketMQ messages in",
2924
+ metricName: "rocketmq_messages_in_total",
2925
+ attributes: { ...ROCKETMQ_SCRAPE, message_type: "Normal" },
2926
+ expected: withDirection(ROCKETMQ_ORDERS, "publish"),
2927
+ },
2928
+
2929
+ // Messaging CLIENT metrics (semconv) and application gauges.
2930
+ {
2931
+ name: "semconv messaging.client.sent.messages",
2932
+ metricName: "messaging.client.sent.messages",
2933
+ attributes: {
2934
+ "messaging.system": "kafka",
2935
+ "messaging.destination.name": "orders",
2936
+ "messaging.operation.name": "send",
2937
+ "server.address": "kafka-1",
2938
+ "server.port": 9092,
2939
+ },
2940
+ expected: destinationOf({
2941
+ system: "kafka",
2942
+ destination: "orders",
2943
+ direction: "publish",
2944
+ brokerAddress: "kafka-1:9092",
2945
+ }),
2946
+ },
2947
+ {
2948
+ name: "semconv messaging.client.consumed.messages",
2949
+ metricName: "messaging.client.consumed.messages",
2950
+ attributes: {
2951
+ "messaging.system": "kafka",
2952
+ "messaging.destination.name": "orders",
2953
+ "messaging.consumer.group.name": "billing",
2954
+ "messaging.destination.partition.id": "1",
2955
+ },
2956
+ expected: destinationOf({
2957
+ system: "kafka",
2958
+ destination: "orders",
2959
+ direction: "consume",
2960
+ consumerGroup: "billing",
2961
+ }),
2962
+ },
2963
+ {
2964
+ name: "semconv messaging.client.operation.duration (direction from the operation type)",
2965
+ metricName: "messaging.client.operation.duration",
2966
+ attributes: {
2967
+ "messaging.system": "rabbitmq",
2968
+ "messaging.destination.name": "amq.default",
2969
+ "messaging.rabbitmq.destination.routing_key": "orders",
2970
+ "messaging.operation.type": "receive",
2971
+ "messaging.operation.name": "fetch",
2972
+ },
2973
+ expected: destinationOf({
2974
+ system: "rabbitmq",
2975
+ destination: "orders",
2976
+ direction: "consume",
2977
+ }),
2978
+ },
2979
+ {
2980
+ name: "semconv messaging.process.duration",
2981
+ metricName: "messaging.process.duration",
2982
+ attributes: {
2983
+ "messaging.system": "servicebus",
2984
+ "messaging.destination.name": "orders",
2985
+ "server.address": SERVICE_BUS_HOST,
2986
+ },
2987
+ expected: destinationOf({
2988
+ system: "servicebus",
2989
+ destination: "orders",
2990
+ brokerScope: "orders-prod",
2991
+ brokerAddress: SERVICE_BUS_HOST,
2992
+ direction: "consume",
2993
+ }),
2994
+ },
2995
+ {
2996
+ name: "deprecated messaging.publish.duration (Java agent default mode)",
2997
+ metricName: "messaging.publish.duration",
2998
+ attributes: {
2999
+ "messaging.system": "pulsar",
3000
+ "messaging.destination.name":
3001
+ "persistent://public/default/orders-partition-0",
3002
+ },
3003
+ expected: destinationOf({
3004
+ system: "pulsar",
3005
+ destination: "persistent://public/default/orders",
3006
+ direction: "publish",
3007
+ }),
3008
+ },
3009
+ {
3010
+ name: "deprecated messaging.receive.duration",
3011
+ metricName: "messaging.receive.duration",
3012
+ attributes: {
3013
+ "messaging.system": "aws_sqs",
3014
+ "messaging.destination.name": "orders",
3015
+ },
3016
+ expected: destinationOf({
3017
+ system: "aws_sqs",
3018
+ destination: "orders",
3019
+ direction: "consume",
3020
+ }),
3021
+ },
3022
+ {
3023
+ name: "deprecated messaging.publish.messages",
3024
+ metricName: "messaging.publish.messages",
3025
+ attributes: {
3026
+ "messaging.system": "jms",
3027
+ "messaging.destination.name": "orders.queue",
3028
+ },
3029
+ expected: destinationOf({
3030
+ system: "jms",
3031
+ destination: "orders.queue",
3032
+ direction: "publish",
3033
+ }),
3034
+ },
3035
+ {
3036
+ name: "deprecated messaging.receive.messages",
3037
+ metricName: "messaging.receive.messages",
3038
+ attributes: {
3039
+ "messaging.system": "jms",
3040
+ "messaging.destination.name": "orders.queue",
3041
+ },
3042
+ expected: destinationOf({
3043
+ system: "jms",
3044
+ destination: "orders.queue",
3045
+ direction: "consume",
3046
+ }),
3047
+ },
3048
+ {
3049
+ name: "deprecated messaging.process.messages",
3050
+ metricName: "messaging.process.messages",
3051
+ attributes: {
3052
+ "messaging.system": "nats",
3053
+ "messaging.destination.name": "orders.created",
3054
+ },
3055
+ expected: destinationOf({
3056
+ system: "nats",
3057
+ destination: "orders.created",
3058
+ direction: "consume",
3059
+ }),
3060
+ },
3061
+ {
3062
+ name: "Azure SDK for Java messaging.client.published.messages (pre-1.28 name)",
3063
+ metricName: "messaging.client.published.messages",
3064
+ attributes: {
3065
+ "messaging.system": "eventhubs",
3066
+ "messaging.destination.name": "telemetry",
3067
+ "messaging.destination.partition.id": "0",
3068
+ "server.address": EVENT_HUBS_HOST,
3069
+ },
3070
+ expected: destinationOf({
3071
+ system: "eventhubs",
3072
+ destination: "telemetry",
3073
+ brokerScope: "ingest-prod",
3074
+ brokerAddress: EVENT_HUBS_HOST,
3075
+ direction: "publish",
3076
+ }),
3077
+ },
3078
+ /*
3079
+ * The Java agent's opt-in RabbitMQ client metrics, as MessagingMetricsAdvice
3080
+ * keeps them: the span's joined name and its operation name, never the
3081
+ * routing key, and the operation type on messaging.client.operation.duration
3082
+ * alone. Each keys the queue of the opt-in span above that it measures.
3083
+ */
3084
+ {
3085
+ name: "Java agent opt-in messaging.client.sent.messages of a RabbitMQ publish ({exchange}:{routing key})",
3086
+ metricName: "messaging.client.sent.messages",
3087
+ attributes: {
3088
+ "messaging.operation.name": "publish",
3089
+ "messaging.system": "rabbitmq",
3090
+ "messaging.destination.name": "direct_logs:warning",
3091
+ "server.address": "rabbit.prod",
3092
+ "server.port": 5672,
3093
+ },
3094
+ expected: destinationOf({
3095
+ system: "rabbitmq",
3096
+ destination: "direct_logs",
3097
+ direction: "publish",
3098
+ brokerAddress: "rabbit.prod:5672",
3099
+ }),
3100
+ },
3101
+ {
3102
+ name: "Java agent opt-in messaging.client.operation.duration of a RabbitMQ publish ({exchange}:{routing key})",
3103
+ metricName: "messaging.client.operation.duration",
3104
+ attributes: {
3105
+ "messaging.operation.name": "publish",
3106
+ "messaging.system": "rabbitmq",
3107
+ "messaging.destination.name": "direct_logs:warning",
3108
+ "messaging.operation.type": "send",
3109
+ "server.address": "rabbit.prod",
3110
+ "server.port": 5672,
3111
+ },
3112
+ expected: destinationOf({
3113
+ system: "rabbitmq",
3114
+ destination: "direct_logs",
3115
+ direction: "publish",
3116
+ brokerAddress: "rabbit.prod:5672",
3117
+ }),
3118
+ },
3119
+ {
3120
+ name: "Java agent opt-in messaging.client.consumed.messages of a RabbitMQ delivery ({exchange}:{routing key}:{queue})",
3121
+ metricName: "messaging.client.consumed.messages",
3122
+ attributes: {
3123
+ "messaging.operation.name": "process",
3124
+ "messaging.system": "rabbitmq",
3125
+ "messaging.destination.name": "direct_logs:warning:warning_queue",
3126
+ },
3127
+ expected: destinationOf({
3128
+ system: "rabbitmq",
3129
+ destination: "warning_queue",
3130
+ direction: "consume",
3131
+ }),
3132
+ },
3133
+ {
3134
+ name: "Java agent opt-in messaging.process.duration of a RabbitMQ delivery ({exchange}:{routing key}, the routing key the queue)",
3135
+ metricName: "messaging.process.duration",
3136
+ attributes: {
3137
+ "messaging.operation.name": "process",
3138
+ "messaging.system": "rabbitmq",
3139
+ "messaging.destination.name": "direct_logs:warning",
3140
+ },
3141
+ expected: destinationOf({
3142
+ system: "rabbitmq",
3143
+ destination: "warning",
3144
+ direction: "consume",
3145
+ }),
3146
+ },
3147
+ {
3148
+ name: "Java agent opt-in messaging.client.consumed.messages of a RabbitMQ delivery from a fanout exchange ({exchange}:{queue})",
3149
+ metricName: "messaging.client.consumed.messages",
3150
+ attributes: {
3151
+ "messaging.operation.name": "process",
3152
+ "messaging.system": "rabbitmq",
3153
+ "messaging.destination.name": "logs:logs-audit",
3154
+ },
3155
+ expected: destinationOf({
3156
+ system: "rabbitmq",
3157
+ destination: "logs-audit",
3158
+ direction: "consume",
3159
+ }),
3160
+ },
3161
+ {
3162
+ name: "OneUptime's own BullMQ queue.size gauge",
3163
+ metricName: "queue.size",
3164
+ attributes: {
3165
+ "messaging.system": "bullmq",
3166
+ "messaging.destination.name": "Workers",
3167
+ state: "waiting",
3168
+ "resource.service.name": "oneuptime-app",
3169
+ },
3170
+ expected: destinationOf({
3171
+ system: "bullmq",
3172
+ destination: "Workers",
3173
+ }),
3174
+ },
3175
+
3176
+ // Never a queue.
3177
+ {
3178
+ name: "Azure Monitor namespace-level value (-NamespaceOnlyMetric-)",
3179
+ metricName: "azure_incomingmessages_total",
3180
+ attributes: {
3181
+ ...SERVICE_BUS_ENTITY,
3182
+ metadata_entityname: "-NamespaceOnlyMetric-",
3183
+ },
3184
+ expected: null,
3185
+ },
3186
+ {
3187
+ name: "Azure Monitor metric of another resource type (Storage)",
3188
+ metricName: "azure_incomingmessages_total",
3189
+ attributes: {
3190
+ ...SERVICE_BUS_ENTITY,
3191
+ type: "Microsoft.Storage/storageAccounts",
3192
+ },
3193
+ expected: null,
3194
+ },
3195
+ {
3196
+ name: "Pulsar system topic",
3197
+ metricName: "pulsar_msg_backlog",
3198
+ attributes: {
3199
+ ...PULSAR_SCRAPE,
3200
+ topic: "persistent://public/default/__change_events",
3201
+ },
3202
+ expected: null,
3203
+ },
3204
+ {
3205
+ name: "JMX Scraper advisory topic",
3206
+ metricName: "activemq.message.queue.size",
3207
+ attributes: {
3208
+ ...ACTIVEMQ_DESTINATION,
3209
+ "activemq.destination.type": "topic",
3210
+ "messaging.destination.name": "ActiveMQ.Advisory.Connection",
3211
+ },
3212
+ expected: null,
3213
+ },
3214
+ {
3215
+ name: "JMX Scraper producer count (not curated; no messaging.system)",
3216
+ metricName: "activemq.producer.count",
3217
+ attributes: { ...ACTIVEMQ_DESTINATION },
3218
+ expected: null,
3219
+ },
3220
+ {
3221
+ name: "NATS JetStream consumer metric (per stream and consumer, not per subject)",
3222
+ metricName: "jetstream_consumer_num_pending",
3223
+ attributes: {
3224
+ "resource.server.address": "nats-exporter",
3225
+ "resource.server.port": "7777",
3226
+ "resource.service.name": "nats",
3227
+ account: "$G",
3228
+ stream_name: "ORDERS",
3229
+ consumer_name: "billing",
3230
+ is_consumer_leader: "true",
3231
+ },
3232
+ expected: null,
3233
+ },
3234
+ {
3235
+ name: "A host metric",
3236
+ metricName: "system.cpu.utilization",
3237
+ attributes: { state: "user", "resource.host.name": "web-1" },
3238
+ expected: null,
3239
+ },
3240
+ ];
3241
+
3242
+ /*
3243
+ * The values ClickHouse's Map(String, String) keeps for a row: strings as
3244
+ * they are, numbers and booleans as String(), arrays as their JSON text, and
3245
+ * "" for every requested key the row lacks — the shape the discovery cron
3246
+ * reads back with `attributes['<key>']`.
3247
+ */
3248
+ export function toStoredColumns(
3249
+ attributes: FixtureAttributes,
3250
+ keys: ReadonlyArray<string>,
3251
+ ): Record<string, string> {
3252
+ const row: Record<string, string> = {};
3253
+ for (const key of keys) {
3254
+ const value: unknown = Object.prototype.hasOwnProperty.call(attributes, key)
3255
+ ? attributes[key]
3256
+ : undefined;
3257
+ if (typeof value === "string") {
3258
+ row[key] = value;
3259
+ } else if (typeof value === "number" || typeof value === "boolean") {
3260
+ row[key] = String(value);
3261
+ } else if (Array.isArray(value)) {
3262
+ row[key] = JSON.stringify(value);
3263
+ } else {
3264
+ row[key] = "";
3265
+ }
3266
+ }
3267
+ return row;
3268
+ }
3269
+
3270
+ /*
3271
+ * The text the span table's Nullable kind column keeps for the kind a row
3272
+ * was inserted with (JSONEachRow, which writes a JSON value's text into a
3273
+ * String column): a string as it is, anything else JSON can write as its
3274
+ * JSON text (2 → "2", 1e21 → "1e+21", true → "true"), and NULL for no kind
3275
+ * — null, undefined, and a number JSON writes as null (NaN, Infinity). The
3276
+ * real-ClickHouse discovery suite checks it against the server.
3277
+ */
3278
+ export function toStoredKind(kind: unknown): string | null {
3279
+ if (kind === null || kind === undefined) {
3280
+ return null;
3281
+ }
3282
+ if (typeof kind === "string") {
3283
+ return kind;
3284
+ }
3285
+ const text: string | undefined = JSON.stringify(kind);
3286
+ return text === undefined || text === "null" ? null : text;
3287
+ }