@confluentinc/mcp-confluent 1.4.0 → 1.6.0

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 (489) hide show
  1. package/README.md +57 -34
  2. package/config.example.yaml +36 -7
  3. package/config.oauth.example.yaml +14 -1
  4. package/dist/build-config.d.ts +1 -0
  5. package/dist/build-config.d.ts.map +1 -1
  6. package/dist/build-config.js +1 -0
  7. package/dist/build-config.js.map +1 -1
  8. package/dist/cli.d.ts +1 -1
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +128 -94
  11. package/dist/cli.js.map +1 -1
  12. package/dist/config/env-config.d.ts +9 -3
  13. package/dist/config/env-config.d.ts.map +1 -1
  14. package/dist/config/env-config.js +15 -34
  15. package/dist/config/env-config.js.map +1 -1
  16. package/dist/config/models.d.ts +105 -13
  17. package/dist/config/models.d.ts.map +1 -1
  18. package/dist/config/models.js +49 -37
  19. package/dist/config/models.js.map +1 -1
  20. package/dist/confluent/base-client-manager.d.ts +3 -1
  21. package/dist/confluent/base-client-manager.d.ts.map +1 -1
  22. package/dist/confluent/base-client-manager.js +5 -1
  23. package/dist/confluent/base-client-manager.js.map +1 -1
  24. package/dist/confluent/client-manager.d.ts +15 -1
  25. package/dist/confluent/client-manager.d.ts.map +1 -1
  26. package/dist/confluent/direct-client-manager.d.ts +1 -1
  27. package/dist/confluent/direct-client-manager.d.ts.map +1 -1
  28. package/dist/confluent/middleware.d.ts +1 -1
  29. package/dist/confluent/middleware.d.ts.map +1 -1
  30. package/dist/confluent/node-deps.d.ts +8 -0
  31. package/dist/confluent/node-deps.d.ts.map +1 -1
  32. package/dist/confluent/node-deps.js +9 -2
  33. package/dist/confluent/node-deps.js.map +1 -1
  34. package/dist/confluent/oauth/auth0-config.d.ts +26 -4
  35. package/dist/confluent/oauth/auth0-config.d.ts.map +1 -1
  36. package/dist/confluent/oauth/auth0-config.js +59 -19
  37. package/dist/confluent/oauth/auth0-config.js.map +1 -1
  38. package/dist/confluent/oauth/pkce-login.d.ts.map +1 -1
  39. package/dist/confluent/oauth/pkce-login.js +180 -150
  40. package/dist/confluent/oauth/pkce-login.js.map +1 -1
  41. package/dist/confluent/oauth/types.d.ts +1 -2
  42. package/dist/confluent/oauth/types.d.ts.map +1 -1
  43. package/dist/confluent/oauth-client-manager.d.ts +6 -3
  44. package/dist/confluent/oauth-client-manager.d.ts.map +1 -1
  45. package/dist/confluent/oauth-client-manager.js +28 -6
  46. package/dist/confluent/oauth-client-manager.js.map +1 -1
  47. package/dist/confluent/oauth-resource-resolvers.d.ts +11 -0
  48. package/dist/confluent/oauth-resource-resolvers.d.ts.map +1 -1
  49. package/dist/confluent/oauth-resource-resolvers.js +24 -0
  50. package/dist/confluent/oauth-resource-resolvers.js.map +1 -1
  51. package/dist/confluent/schema-registry-helper.d.ts +131 -7
  52. package/dist/confluent/schema-registry-helper.d.ts.map +1 -1
  53. package/dist/confluent/schema-registry-helper.js +336 -40
  54. package/dist/confluent/schema-registry-helper.js.map +1 -1
  55. package/dist/confluent/schema.d.ts +2 -2
  56. package/dist/confluent/schema.d.ts.map +1 -1
  57. package/dist/confluent/sentry-redact.d.ts +5 -0
  58. package/dist/confluent/sentry-redact.d.ts.map +1 -0
  59. package/dist/confluent/sentry-redact.js +64 -0
  60. package/dist/confluent/sentry-redact.js.map +1 -0
  61. package/dist/confluent/sentry.d.ts +23 -0
  62. package/dist/confluent/sentry.d.ts.map +1 -0
  63. package/dist/confluent/sentry.js +68 -0
  64. package/dist/confluent/sentry.js.map +1 -0
  65. package/dist/confluent/tools/base-tools.d.ts +169 -24
  66. package/dist/confluent/tools/base-tools.d.ts.map +1 -1
  67. package/dist/confluent/tools/base-tools.js +225 -21
  68. package/dist/confluent/tools/base-tools.js.map +1 -1
  69. package/dist/confluent/tools/cluster-arg-resolvers.d.ts +22 -1
  70. package/dist/confluent/tools/cluster-arg-resolvers.d.ts.map +1 -1
  71. package/dist/confluent/tools/cluster-arg-resolvers.js +50 -4
  72. package/dist/confluent/tools/cluster-arg-resolvers.js.map +1 -1
  73. package/dist/confluent/tools/connection-predicates.d.ts +70 -7
  74. package/dist/confluent/tools/connection-predicates.d.ts.map +1 -1
  75. package/dist/confluent/tools/connection-predicates.js +69 -6
  76. package/dist/confluent/tools/connection-predicates.js.map +1 -1
  77. package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts +9 -3
  78. package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts.map +1 -1
  79. package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js +77 -62
  80. package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js.map +1 -1
  81. package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.d.ts +5 -5
  82. package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.d.ts.map +1 -1
  83. package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.js +9 -5
  84. package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.js.map +1 -1
  85. package/dist/confluent/tools/handlers/catalog/create-topic-tags.d.ts +5 -5
  86. package/dist/confluent/tools/handlers/catalog/create-topic-tags.d.ts.map +1 -1
  87. package/dist/confluent/tools/handlers/catalog/create-topic-tags.js +9 -5
  88. package/dist/confluent/tools/handlers/catalog/create-topic-tags.js.map +1 -1
  89. package/dist/confluent/tools/handlers/catalog/delete-tag.d.ts +5 -5
  90. package/dist/confluent/tools/handlers/catalog/delete-tag.d.ts.map +1 -1
  91. package/dist/confluent/tools/handlers/catalog/delete-tag.js +9 -5
  92. package/dist/confluent/tools/handlers/catalog/delete-tag.js.map +1 -1
  93. package/dist/confluent/tools/handlers/catalog/list-tags.d.ts +6 -6
  94. package/dist/confluent/tools/handlers/catalog/list-tags.d.ts.map +1 -1
  95. package/dist/confluent/tools/handlers/catalog/list-tags.js +14 -6
  96. package/dist/confluent/tools/handlers/catalog/list-tags.js.map +1 -1
  97. package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.d.ts +5 -5
  98. package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.d.ts.map +1 -1
  99. package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.js +9 -5
  100. package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.js.map +1 -1
  101. package/dist/confluent/tools/handlers/clusters/list-clusters-handler.d.ts +4 -3
  102. package/dist/confluent/tools/handlers/clusters/list-clusters-handler.d.ts.map +1 -1
  103. package/dist/confluent/tools/handlers/clusters/list-clusters-handler.js +1 -1
  104. package/dist/confluent/tools/handlers/clusters/list-clusters-handler.js.map +1 -1
  105. package/dist/confluent/tools/handlers/connect/connect-tool-handler.d.ts +8 -8
  106. package/dist/confluent/tools/handlers/connect/connect-tool-handler.d.ts.map +1 -1
  107. package/dist/confluent/tools/handlers/connect/connect-tool-handler.js +9 -10
  108. package/dist/confluent/tools/handlers/connect/connect-tool-handler.js.map +1 -1
  109. package/dist/confluent/tools/handlers/connect/create-connector-handler.d.ts +3 -3
  110. package/dist/confluent/tools/handlers/connect/create-connector-handler.d.ts.map +1 -1
  111. package/dist/confluent/tools/handlers/connect/create-connector-handler.js +1 -2
  112. package/dist/confluent/tools/handlers/connect/create-connector-handler.js.map +1 -1
  113. package/dist/confluent/tools/handlers/connect/delete-connector-handler.d.ts +3 -3
  114. package/dist/confluent/tools/handlers/connect/delete-connector-handler.d.ts.map +1 -1
  115. package/dist/confluent/tools/handlers/connect/delete-connector-handler.js +1 -2
  116. package/dist/confluent/tools/handlers/connect/delete-connector-handler.js.map +1 -1
  117. package/dist/confluent/tools/handlers/connect/get-connector-config-handler.d.ts +3 -3
  118. package/dist/confluent/tools/handlers/connect/get-connector-config-handler.d.ts.map +1 -1
  119. package/dist/confluent/tools/handlers/connect/get-connector-config-handler.js +1 -2
  120. package/dist/confluent/tools/handlers/connect/get-connector-config-handler.js.map +1 -1
  121. package/dist/confluent/tools/handlers/connect/get-connector-error-recommendations-handler.d.ts +3 -3
  122. package/dist/confluent/tools/handlers/connect/get-connector-error-recommendations-handler.d.ts.map +1 -1
  123. package/dist/confluent/tools/handlers/connect/get-connector-error-recommendations-handler.js +1 -2
  124. package/dist/confluent/tools/handlers/connect/get-connector-error-recommendations-handler.js.map +1 -1
  125. package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.d.ts +3 -3
  126. package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.d.ts.map +1 -1
  127. package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.js +2 -3
  128. package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.js.map +1 -1
  129. package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.d.ts +3 -3
  130. package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.d.ts.map +1 -1
  131. package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.js +171 -100
  132. package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.js.map +1 -1
  133. package/dist/confluent/tools/handlers/connect/get-connector-offsets-handler.d.ts +3 -3
  134. package/dist/confluent/tools/handlers/connect/get-connector-offsets-handler.d.ts.map +1 -1
  135. package/dist/confluent/tools/handlers/connect/get-connector-offsets-handler.js +1 -2
  136. package/dist/confluent/tools/handlers/connect/get-connector-offsets-handler.js.map +1 -1
  137. package/dist/confluent/tools/handlers/connect/get-connector-status-handler.d.ts +3 -3
  138. package/dist/confluent/tools/handlers/connect/get-connector-status-handler.d.ts.map +1 -1
  139. package/dist/confluent/tools/handlers/connect/get-connector-status-handler.js +1 -2
  140. package/dist/confluent/tools/handlers/connect/get-connector-status-handler.js.map +1 -1
  141. package/dist/confluent/tools/handlers/connect/get-connector-tasks-handler.d.ts +3 -3
  142. package/dist/confluent/tools/handlers/connect/get-connector-tasks-handler.d.ts.map +1 -1
  143. package/dist/confluent/tools/handlers/connect/get-connector-tasks-handler.js +1 -2
  144. package/dist/confluent/tools/handlers/connect/get-connector-tasks-handler.js.map +1 -1
  145. package/dist/confluent/tools/handlers/connect/list-connectors-handler.d.ts +3 -3
  146. package/dist/confluent/tools/handlers/connect/list-connectors-handler.d.ts.map +1 -1
  147. package/dist/confluent/tools/handlers/connect/list-connectors-handler.js +1 -2
  148. package/dist/confluent/tools/handlers/connect/list-connectors-handler.js.map +1 -1
  149. package/dist/confluent/tools/handlers/connect/pause-connector-handler.d.ts +3 -3
  150. package/dist/confluent/tools/handlers/connect/pause-connector-handler.d.ts.map +1 -1
  151. package/dist/confluent/tools/handlers/connect/pause-connector-handler.js +1 -2
  152. package/dist/confluent/tools/handlers/connect/pause-connector-handler.js.map +1 -1
  153. package/dist/confluent/tools/handlers/connect/restart-connector-handler.d.ts +3 -3
  154. package/dist/confluent/tools/handlers/connect/restart-connector-handler.d.ts.map +1 -1
  155. package/dist/confluent/tools/handlers/connect/restart-connector-handler.js +1 -2
  156. package/dist/confluent/tools/handlers/connect/restart-connector-handler.js.map +1 -1
  157. package/dist/confluent/tools/handlers/connect/resume-connector-handler.d.ts +3 -3
  158. package/dist/confluent/tools/handlers/connect/resume-connector-handler.d.ts.map +1 -1
  159. package/dist/confluent/tools/handlers/connect/resume-connector-handler.js +1 -2
  160. package/dist/confluent/tools/handlers/connect/resume-connector-handler.js.map +1 -1
  161. package/dist/confluent/tools/handlers/connect/update-connector-config-handler.d.ts +3 -3
  162. package/dist/confluent/tools/handlers/connect/update-connector-config-handler.d.ts.map +1 -1
  163. package/dist/confluent/tools/handlers/connect/update-connector-config-handler.js +1 -2
  164. package/dist/confluent/tools/handlers/connect/update-connector-config-handler.js.map +1 -1
  165. package/dist/confluent/tools/handlers/diagnostics/config-help-handler.d.ts +43 -0
  166. package/dist/confluent/tools/handlers/diagnostics/config-help-handler.d.ts.map +1 -0
  167. package/dist/confluent/tools/handlers/diagnostics/config-help-handler.js +297 -0
  168. package/dist/confluent/tools/handlers/diagnostics/config-help-handler.js.map +1 -0
  169. package/dist/confluent/tools/handlers/diagnostics/describe-configured-connection-handler.d.ts +32 -0
  170. package/dist/confluent/tools/handlers/diagnostics/describe-configured-connection-handler.d.ts.map +1 -0
  171. package/dist/confluent/tools/handlers/diagnostics/describe-configured-connection-handler.js +116 -0
  172. package/dist/confluent/tools/handlers/diagnostics/describe-configured-connection-handler.js.map +1 -0
  173. package/dist/confluent/tools/handlers/diagnostics/describe-fields.d.ts +52 -0
  174. package/dist/confluent/tools/handlers/diagnostics/describe-fields.d.ts.map +1 -0
  175. package/dist/confluent/tools/handlers/diagnostics/describe-fields.js +114 -0
  176. package/dist/confluent/tools/handlers/diagnostics/describe-fields.js.map +1 -0
  177. package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.d.ts +22 -44
  178. package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.d.ts.map +1 -1
  179. package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.js +95 -81
  180. package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.js.map +1 -1
  181. package/dist/confluent/tools/handlers/diagnostics/list-configured-connections-handler.d.ts +28 -0
  182. package/dist/confluent/tools/handlers/diagnostics/list-configured-connections-handler.d.ts.map +1 -0
  183. package/dist/confluent/tools/handlers/diagnostics/list-configured-connections-handler.js +93 -0
  184. package/dist/confluent/tools/handlers/diagnostics/list-configured-connections-handler.js.map +1 -0
  185. package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.d.ts +4 -3
  186. package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.d.ts.map +1 -1
  187. package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.js.map +1 -1
  188. package/dist/confluent/tools/handlers/docs/search-product-docs-handler.d.ts +4 -3
  189. package/dist/confluent/tools/handlers/docs/search-product-docs-handler.d.ts.map +1 -1
  190. package/dist/confluent/tools/handlers/docs/search-product-docs-handler.js.map +1 -1
  191. package/dist/confluent/tools/handlers/environments/list-environments-handler.d.ts +9 -3
  192. package/dist/confluent/tools/handlers/environments/list-environments-handler.d.ts.map +1 -1
  193. package/dist/confluent/tools/handlers/environments/list-environments-handler.js +68 -46
  194. package/dist/confluent/tools/handlers/environments/list-environments-handler.js.map +1 -1
  195. package/dist/confluent/tools/handlers/environments/read-environment-handler.d.ts +4 -3
  196. package/dist/confluent/tools/handlers/environments/read-environment-handler.d.ts.map +1 -1
  197. package/dist/confluent/tools/handlers/environments/read-environment-handler.js +2 -2
  198. package/dist/confluent/tools/handlers/environments/read-environment-handler.js.map +1 -1
  199. package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts +1 -1
  200. package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts.map +1 -1
  201. package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js +12 -6
  202. package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js.map +1 -1
  203. package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.d.ts +3 -3
  204. package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.d.ts.map +1 -1
  205. package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.js +24 -21
  206. package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.js.map +1 -1
  207. package/dist/confluent/tools/handlers/flink/catalog/flink-catalog-tool-handler.d.ts +1 -1
  208. package/dist/confluent/tools/handlers/flink/catalog/flink-catalog-tool-handler.d.ts.map +1 -1
  209. package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.d.ts +3 -3
  210. package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.d.ts.map +1 -1
  211. package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.js +24 -21
  212. package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.js.map +1 -1
  213. package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.d.ts +3 -3
  214. package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.d.ts.map +1 -1
  215. package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.js +9 -7
  216. package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.js.map +1 -1
  217. package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.d.ts +3 -3
  218. package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.d.ts.map +1 -1
  219. package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.js +14 -12
  220. package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.js.map +1 -1
  221. package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.d.ts +3 -3
  222. package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.d.ts.map +1 -1
  223. package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.js +14 -12
  224. package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.js.map +1 -1
  225. package/dist/confluent/tools/handlers/flink/create-flink-statement-handler.d.ts +3 -3
  226. package/dist/confluent/tools/handlers/flink/create-flink-statement-handler.d.ts.map +1 -1
  227. package/dist/confluent/tools/handlers/flink/create-flink-statement-handler.js +27 -22
  228. package/dist/confluent/tools/handlers/flink/create-flink-statement-handler.js.map +1 -1
  229. package/dist/confluent/tools/handlers/flink/delete-flink-statement-handler.d.ts +3 -3
  230. package/dist/confluent/tools/handlers/flink/delete-flink-statement-handler.d.ts.map +1 -1
  231. package/dist/confluent/tools/handlers/flink/delete-flink-statement-handler.js +20 -12
  232. package/dist/confluent/tools/handlers/flink/delete-flink-statement-handler.js.map +1 -1
  233. package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.d.ts +3 -3
  234. package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.d.ts.map +1 -1
  235. package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.js +20 -12
  236. package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.js.map +1 -1
  237. package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.d.ts +3 -3
  238. package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.d.ts.map +1 -1
  239. package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.js +203 -156
  240. package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.js.map +1 -1
  241. package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.d.ts +12 -8
  242. package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.d.ts.map +1 -1
  243. package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.js +346 -377
  244. package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.js.map +1 -1
  245. package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.d.ts +3 -3
  246. package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.d.ts.map +1 -1
  247. package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.js +374 -317
  248. package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.js.map +1 -1
  249. package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts +4 -3
  250. package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts.map +1 -1
  251. package/dist/confluent/tools/handlers/flink/flink-sql-helper.js +133 -57
  252. package/dist/confluent/tools/handlers/flink/flink-sql-helper.js.map +1 -1
  253. package/dist/confluent/tools/handlers/flink/flink-tool-handler.d.ts +27 -6
  254. package/dist/confluent/tools/handlers/flink/flink-tool-handler.d.ts.map +1 -1
  255. package/dist/confluent/tools/handlers/flink/flink-tool-handler.js +37 -7
  256. package/dist/confluent/tools/handlers/flink/flink-tool-handler.js.map +1 -1
  257. package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.d.ts +3 -3
  258. package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.d.ts.map +1 -1
  259. package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.js +20 -12
  260. package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.js.map +1 -1
  261. package/dist/confluent/tools/handlers/flink/get-flink-statement-results-handler.d.ts +9 -0
  262. package/dist/confluent/tools/handlers/flink/get-flink-statement-results-handler.d.ts.map +1 -0
  263. package/dist/confluent/tools/handlers/flink/{read-flink-statement-handler.js → get-flink-statement-results-handler.js} +30 -22
  264. package/dist/confluent/tools/handlers/flink/get-flink-statement-results-handler.js.map +1 -0
  265. package/dist/confluent/tools/handlers/flink/list-compute-pools-handler.d.ts +11 -0
  266. package/dist/confluent/tools/handlers/flink/list-compute-pools-handler.d.ts.map +1 -0
  267. package/dist/confluent/tools/handlers/flink/list-compute-pools-handler.js +118 -0
  268. package/dist/confluent/tools/handlers/flink/list-compute-pools-handler.js.map +1 -0
  269. package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.d.ts +3 -3
  270. package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.d.ts.map +1 -1
  271. package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.js +19 -17
  272. package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.js.map +1 -1
  273. package/dist/confluent/tools/handlers/kafka/alter-topic-config.d.ts +4 -3
  274. package/dist/confluent/tools/handlers/kafka/alter-topic-config.d.ts.map +1 -1
  275. package/dist/confluent/tools/handlers/kafka/alter-topic-config.js +1 -1
  276. package/dist/confluent/tools/handlers/kafka/alter-topic-config.js.map +1 -1
  277. package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.d.ts +21 -10
  278. package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.d.ts.map +1 -1
  279. package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.js +136 -73
  280. package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.js.map +1 -1
  281. package/dist/confluent/tools/handlers/kafka/create-topics-handler.d.ts +4 -3
  282. package/dist/confluent/tools/handlers/kafka/create-topics-handler.d.ts.map +1 -1
  283. package/dist/confluent/tools/handlers/kafka/create-topics-handler.js +12 -3
  284. package/dist/confluent/tools/handlers/kafka/create-topics-handler.js.map +1 -1
  285. package/dist/confluent/tools/handlers/kafka/delete-topics-handler.d.ts +4 -3
  286. package/dist/confluent/tools/handlers/kafka/delete-topics-handler.d.ts.map +1 -1
  287. package/dist/confluent/tools/handlers/kafka/delete-topics-handler.js +1 -1
  288. package/dist/confluent/tools/handlers/kafka/delete-topics-handler.js.map +1 -1
  289. package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.d.ts +4 -3
  290. package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.d.ts.map +1 -1
  291. package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.js +6 -41
  292. package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.js.map +1 -1
  293. package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.d.ts +4 -3
  294. package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.d.ts.map +1 -1
  295. package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.js +6 -10
  296. package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.js.map +1 -1
  297. package/dist/confluent/tools/handlers/kafka/get-partition-offsets-handler.d.ts +4 -3
  298. package/dist/confluent/tools/handlers/kafka/get-partition-offsets-handler.d.ts.map +1 -1
  299. package/dist/confluent/tools/handlers/kafka/get-partition-offsets-handler.js +1 -1
  300. package/dist/confluent/tools/handlers/kafka/get-partition-offsets-handler.js.map +1 -1
  301. package/dist/confluent/tools/handlers/kafka/get-topic-config.d.ts +4 -3
  302. package/dist/confluent/tools/handlers/kafka/get-topic-config.d.ts.map +1 -1
  303. package/dist/confluent/tools/handlers/kafka/get-topic-config.js +1 -1
  304. package/dist/confluent/tools/handlers/kafka/get-topic-config.js.map +1 -1
  305. package/dist/confluent/tools/handlers/kafka/list-consumer-groups-handler.d.ts +4 -3
  306. package/dist/confluent/tools/handlers/kafka/list-consumer-groups-handler.d.ts.map +1 -1
  307. package/dist/confluent/tools/handlers/kafka/list-consumer-groups-handler.js +1 -1
  308. package/dist/confluent/tools/handlers/kafka/list-consumer-groups-handler.js.map +1 -1
  309. package/dist/confluent/tools/handlers/kafka/list-topics-handler.d.ts +4 -3
  310. package/dist/confluent/tools/handlers/kafka/list-topics-handler.d.ts.map +1 -1
  311. package/dist/confluent/tools/handlers/kafka/list-topics-handler.js +1 -1
  312. package/dist/confluent/tools/handlers/kafka/list-topics-handler.js.map +1 -1
  313. package/dist/confluent/tools/handlers/kafka/partition-watermarks.d.ts +1 -1
  314. package/dist/confluent/tools/handlers/kafka/partition-watermarks.d.ts.map +1 -1
  315. package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.d.ts +12 -4
  316. package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.d.ts.map +1 -1
  317. package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.js +140 -34
  318. package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.js.map +1 -1
  319. package/dist/confluent/tools/handlers/metrics/list-metrics-handler.d.ts +5 -5
  320. package/dist/confluent/tools/handlers/metrics/list-metrics-handler.d.ts.map +1 -1
  321. package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js +105 -60
  322. package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js.map +1 -1
  323. package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts +5 -5
  324. package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts.map +1 -1
  325. package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js +75 -57
  326. package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js.map +1 -1
  327. package/dist/confluent/tools/handlers/metrics/telemetry-error.d.ts +9 -0
  328. package/dist/confluent/tools/handlers/metrics/telemetry-error.d.ts.map +1 -0
  329. package/dist/confluent/tools/handlers/metrics/telemetry-error.js +38 -0
  330. package/dist/confluent/tools/handlers/metrics/telemetry-error.js.map +1 -0
  331. package/dist/confluent/tools/handlers/organizations/list-organizations-handler.d.ts +4 -3
  332. package/dist/confluent/tools/handlers/organizations/list-organizations-handler.d.ts.map +1 -1
  333. package/dist/confluent/tools/handlers/organizations/list-organizations-handler.js +2 -1
  334. package/dist/confluent/tools/handlers/organizations/list-organizations-handler.js.map +1 -1
  335. package/dist/confluent/tools/handlers/schema/create-schema-handler.d.ts +11 -0
  336. package/dist/confluent/tools/handlers/schema/create-schema-handler.d.ts.map +1 -0
  337. package/dist/confluent/tools/handlers/schema/create-schema-handler.js +76 -0
  338. package/dist/confluent/tools/handlers/schema/create-schema-handler.js.map +1 -0
  339. package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts +4 -3
  340. package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts.map +1 -1
  341. package/dist/confluent/tools/handlers/schema/delete-schema-handler.js +1 -1
  342. package/dist/confluent/tools/handlers/schema/delete-schema-handler.js.map +1 -1
  343. package/dist/confluent/tools/handlers/schema/list-schemas-handler.d.ts +4 -3
  344. package/dist/confluent/tools/handlers/schema/list-schemas-handler.d.ts.map +1 -1
  345. package/dist/confluent/tools/handlers/schema/list-schemas-handler.js +101 -72
  346. package/dist/confluent/tools/handlers/schema/list-schemas-handler.js.map +1 -1
  347. package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.d.ts +5 -5
  348. package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.d.ts.map +1 -1
  349. package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.js +9 -5
  350. package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.js.map +1 -1
  351. package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.d.ts +5 -5
  352. package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.d.ts.map +1 -1
  353. package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.js +9 -5
  354. package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.js.map +1 -1
  355. package/dist/confluent/tools/handlers/tableflow/catalog/create-tableflow-catalog-integration-handler.d.ts +3 -3
  356. package/dist/confluent/tools/handlers/tableflow/catalog/create-tableflow-catalog-integration-handler.d.ts.map +1 -1
  357. package/dist/confluent/tools/handlers/tableflow/catalog/create-tableflow-catalog-integration-handler.js +2 -2
  358. package/dist/confluent/tools/handlers/tableflow/catalog/create-tableflow-catalog-integration-handler.js.map +1 -1
  359. package/dist/confluent/tools/handlers/tableflow/catalog/delete-tableflow-catalog-integration-handler.d.ts +3 -3
  360. package/dist/confluent/tools/handlers/tableflow/catalog/delete-tableflow-catalog-integration-handler.d.ts.map +1 -1
  361. package/dist/confluent/tools/handlers/tableflow/catalog/delete-tableflow-catalog-integration-handler.js +2 -2
  362. package/dist/confluent/tools/handlers/tableflow/catalog/delete-tableflow-catalog-integration-handler.js.map +1 -1
  363. package/dist/confluent/tools/handlers/tableflow/catalog/list-tableflow-catalog-integrations-handler.d.ts +3 -3
  364. package/dist/confluent/tools/handlers/tableflow/catalog/list-tableflow-catalog-integrations-handler.d.ts.map +1 -1
  365. package/dist/confluent/tools/handlers/tableflow/catalog/list-tableflow-catalog-integrations-handler.js +2 -2
  366. package/dist/confluent/tools/handlers/tableflow/catalog/list-tableflow-catalog-integrations-handler.js.map +1 -1
  367. package/dist/confluent/tools/handlers/tableflow/catalog/read-tableflow-catalog-integration-handler.d.ts +3 -3
  368. package/dist/confluent/tools/handlers/tableflow/catalog/read-tableflow-catalog-integration-handler.d.ts.map +1 -1
  369. package/dist/confluent/tools/handlers/tableflow/catalog/read-tableflow-catalog-integration-handler.js +2 -2
  370. package/dist/confluent/tools/handlers/tableflow/catalog/read-tableflow-catalog-integration-handler.js.map +1 -1
  371. package/dist/confluent/tools/handlers/tableflow/catalog/update-tableflow-catalog-integration-handler.d.ts +3 -3
  372. package/dist/confluent/tools/handlers/tableflow/catalog/update-tableflow-catalog-integration-handler.d.ts.map +1 -1
  373. package/dist/confluent/tools/handlers/tableflow/catalog/update-tableflow-catalog-integration-handler.js +1 -1
  374. package/dist/confluent/tools/handlers/tableflow/catalog/update-tableflow-catalog-integration-handler.js.map +1 -1
  375. package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.d.ts +3 -3
  376. package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.d.ts.map +1 -1
  377. package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.js +1 -1
  378. package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.js.map +1 -1
  379. package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.d.ts +15 -10
  380. package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.d.ts.map +1 -1
  381. package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.js +17 -14
  382. package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.js.map +1 -1
  383. package/dist/confluent/tools/handlers/tableflow/topic/create-tableflow-topic-handler.d.ts +3 -3
  384. package/dist/confluent/tools/handlers/tableflow/topic/create-tableflow-topic-handler.d.ts.map +1 -1
  385. package/dist/confluent/tools/handlers/tableflow/topic/create-tableflow-topic-handler.js +2 -2
  386. package/dist/confluent/tools/handlers/tableflow/topic/create-tableflow-topic-handler.js.map +1 -1
  387. package/dist/confluent/tools/handlers/tableflow/topic/delete-tableflow-topic-handler.d.ts +3 -3
  388. package/dist/confluent/tools/handlers/tableflow/topic/delete-tableflow-topic-handler.d.ts.map +1 -1
  389. package/dist/confluent/tools/handlers/tableflow/topic/delete-tableflow-topic-handler.js +2 -2
  390. package/dist/confluent/tools/handlers/tableflow/topic/delete-tableflow-topic-handler.js.map +1 -1
  391. package/dist/confluent/tools/handlers/tableflow/topic/list-tableflow-topics-handler.d.ts +3 -3
  392. package/dist/confluent/tools/handlers/tableflow/topic/list-tableflow-topics-handler.d.ts.map +1 -1
  393. package/dist/confluent/tools/handlers/tableflow/topic/list-tableflow-topics-handler.js +2 -2
  394. package/dist/confluent/tools/handlers/tableflow/topic/list-tableflow-topics-handler.js.map +1 -1
  395. package/dist/confluent/tools/handlers/tableflow/topic/read-tableflow-topic-handler.d.ts +3 -3
  396. package/dist/confluent/tools/handlers/tableflow/topic/read-tableflow-topic-handler.d.ts.map +1 -1
  397. package/dist/confluent/tools/handlers/tableflow/topic/read-tableflow-topic-handler.js +2 -2
  398. package/dist/confluent/tools/handlers/tableflow/topic/read-tableflow-topic-handler.js.map +1 -1
  399. package/dist/confluent/tools/handlers/tableflow/topic/update-tableflow-topic-handler.d.ts +3 -3
  400. package/dist/confluent/tools/handlers/tableflow/topic/update-tableflow-topic-handler.d.ts.map +1 -1
  401. package/dist/confluent/tools/handlers/tableflow/topic/update-tableflow-topic-handler.js +1 -1
  402. package/dist/confluent/tools/handlers/tableflow/topic/update-tableflow-topic-handler.js.map +1 -1
  403. package/dist/confluent/tools/pagination.d.ts +31 -0
  404. package/dist/confluent/tools/pagination.d.ts.map +1 -0
  405. package/dist/confluent/tools/pagination.js +40 -0
  406. package/dist/confluent/tools/pagination.js.map +1 -0
  407. package/dist/confluent/tools/tool-availability.d.ts +63 -32
  408. package/dist/confluent/tools/tool-availability.d.ts.map +1 -1
  409. package/dist/confluent/tools/tool-availability.js +101 -69
  410. package/dist/confluent/tools/tool-availability.js.map +1 -1
  411. package/dist/confluent/tools/tool-input-error.d.ts +17 -0
  412. package/dist/confluent/tools/tool-input-error.d.ts.map +1 -0
  413. package/dist/confluent/tools/tool-input-error.js +23 -0
  414. package/dist/confluent/tools/tool-input-error.js.map +1 -0
  415. package/dist/confluent/tools/tool-metadata-handler.d.ts +52 -0
  416. package/dist/confluent/tools/tool-metadata-handler.d.ts.map +1 -0
  417. package/dist/confluent/tools/tool-metadata-handler.js +61 -0
  418. package/dist/confluent/tools/tool-metadata-handler.js.map +1 -0
  419. package/dist/confluent/tools/tool-name.d.ts +7 -2
  420. package/dist/confluent/tools/tool-name.d.ts.map +1 -1
  421. package/dist/confluent/tools/tool-name.js +6 -1
  422. package/dist/confluent/tools/tool-name.js.map +1 -1
  423. package/dist/confluent/tools/tool-registry.d.ts +1 -1
  424. package/dist/confluent/tools/tool-registry.d.ts.map +1 -1
  425. package/dist/confluent/tools/tool-registry.js +24 -2
  426. package/dist/confluent/tools/tool-registry.js.map +1 -1
  427. package/dist/env-schema.d.ts +0 -1
  428. package/dist/env-schema.d.ts.map +1 -1
  429. package/dist/env-schema.js +0 -7
  430. package/dist/env-schema.js.map +1 -1
  431. package/dist/env.d.ts +1 -2
  432. package/dist/env.d.ts.map +1 -1
  433. package/dist/index.d.ts +54 -64
  434. package/dist/index.d.ts.map +1 -1
  435. package/dist/index.js +78 -324
  436. package/dist/index.js.map +1 -1
  437. package/dist/lazy.d.ts +4 -2
  438. package/dist/lazy.d.ts.map +1 -1
  439. package/dist/lazy.js +27 -12
  440. package/dist/lazy.js.map +1 -1
  441. package/dist/logger.d.ts +1 -1
  442. package/dist/logger.d.ts.map +1 -1
  443. package/dist/mcp/server.d.ts +6 -4
  444. package/dist/mcp/server.d.ts.map +1 -1
  445. package/dist/mcp/server.js +19 -6
  446. package/dist/mcp/server.js.map +1 -1
  447. package/dist/mcp/transports/auth.d.ts +1 -1
  448. package/dist/mcp/transports/auth.d.ts.map +1 -1
  449. package/dist/mcp/transports/http.d.ts +3 -3
  450. package/dist/mcp/transports/http.d.ts.map +1 -1
  451. package/dist/mcp/transports/manager.d.ts +1 -1
  452. package/dist/mcp/transports/manager.d.ts.map +1 -1
  453. package/dist/mcp/transports/manager.js.map +1 -1
  454. package/dist/mcp/transports/ping.d.ts +1 -1
  455. package/dist/mcp/transports/ping.d.ts.map +1 -1
  456. package/dist/mcp/transports/server.d.ts +3 -3
  457. package/dist/mcp/transports/server.d.ts.map +1 -1
  458. package/dist/mcp/transports/server.js +1 -1
  459. package/dist/mcp/transports/server.js.map +1 -1
  460. package/dist/mcp/transports/sse.d.ts +3 -3
  461. package/dist/mcp/transports/sse.d.ts.map +1 -1
  462. package/dist/mcp/transports/stdio.d.ts +2 -2
  463. package/dist/mcp/transports/stdio.d.ts.map +1 -1
  464. package/dist/preflight.d.ts +33 -0
  465. package/dist/preflight.d.ts.map +1 -0
  466. package/dist/preflight.js +68 -0
  467. package/dist/preflight.js.map +1 -0
  468. package/dist/print-md-schema.js +21 -18
  469. package/dist/print-md-schema.js.map +1 -1
  470. package/dist/server-main.d.ts +104 -0
  471. package/dist/server-main.d.ts.map +1 -0
  472. package/dist/server-main.js +410 -0
  473. package/dist/server-main.js.map +1 -0
  474. package/dist/server-runtime.d.ts +22 -7
  475. package/dist/server-runtime.d.ts.map +1 -1
  476. package/dist/server-runtime.js +45 -28
  477. package/dist/server-runtime.js.map +1 -1
  478. package/dist/utils/quote-join-ids.d.ts +9 -0
  479. package/dist/utils/quote-join-ids.d.ts.map +1 -0
  480. package/dist/utils/quote-join-ids.js +11 -0
  481. package/dist/utils/quote-join-ids.js.map +1 -0
  482. package/package.json +37 -35
  483. package/dist/confluent/tools/handlers/flink/read-flink-statement-handler.d.ts +0 -9
  484. package/dist/confluent/tools/handlers/flink/read-flink-statement-handler.d.ts.map +0 -1
  485. package/dist/confluent/tools/handlers/flink/read-flink-statement-handler.js.map +0 -1
  486. package/dist/confluent/tools/handlers/kafka/topic-metadata.d.ts +0 -18
  487. package/dist/confluent/tools/handlers/kafka/topic-metadata.d.ts.map +0 -1
  488. package/dist/confluent/tools/handlers/kafka/topic-metadata.js +0 -18
  489. package/dist/confluent/tools/handlers/kafka/topic-metadata.js.map +0 -1
@@ -9,155 +9,26 @@ const LONG_MIN_VALUE = -9223372036854776000;
9
9
  */
10
10
  export async function getStatementMetrics(clientManager, options) {
11
11
  const { statementName, computePoolId, intervalMinutes = 5, includeTaskBreakdown = false, includeSplitBreakdown = false, } = options;
12
- // Calculate time range
13
12
  const now = new Date();
14
13
  const startTime = new Date(now.getTime() - intervalMinutes * 60 * 1000);
15
- // Metrics to query - these are the most diagnostic-relevant ones
16
- const metricsToQuery = [
17
- "io.confluent.flink/num_records_in",
18
- "io.confluent.flink/num_records_out",
19
- "io.confluent.flink/pending_records",
20
- "io.confluent.flink/task/backpressure_time_ms_per_second",
21
- "io.confluent.flink/task/busy_time_ms_per_second",
22
- "io.confluent.flink/task/idle_time_ms_per_second",
23
- "io.confluent.flink/current_input_watermark_milliseconds",
24
- "io.confluent.flink/current_output_watermark_milliseconds",
25
- "io.confluent.flink/num_late_records_in",
26
- "io.confluent.flink/max_input_lateness_milliseconds",
27
- "io.confluent.flink/statement_utilization/current_cfus",
28
- "io.confluent.flink/operator/state_size_bytes",
29
- "io.confluent.flink/statement_status",
30
- ];
14
+ const scope = {
15
+ statementName,
16
+ computePoolId,
17
+ startTime,
18
+ now,
19
+ };
31
20
  try {
32
21
  const telemetryClient = clientManager.getConfluentCloudTelemetryRestClient();
33
- const metrics = {};
34
- // Query each metric individually (API only allows one aggregation per request)
35
- for (const metric of metricsToQuery) {
36
- try {
37
- const response = (await telemetryClient.POST("/v2/metrics/{dataset}/query", {
38
- params: { path: { dataset: "cloud" } },
39
- body: {
40
- aggregations: [{ metric }],
41
- filter: {
42
- op: "AND",
43
- filters: [
44
- {
45
- field: "resource.flink_statement.name",
46
- op: "EQ",
47
- value: statementName,
48
- },
49
- {
50
- field: "resource.compute_pool.id",
51
- op: "EQ",
52
- value: computePoolId,
53
- },
54
- ],
55
- },
56
- granularity: "PT1M",
57
- intervals: [`${startTime.toISOString()}/${now.toISOString()}`],
58
- limit: 1000,
59
- group_by: ["metric.flink_task.id"],
60
- format: "GROUPED",
61
- },
62
- }));
63
- const data = response.data;
64
- if (data?.data && data.data.length > 0) {
65
- // Aggregate values across all tasks
66
- // Use SUM for counters, MAX for backpressure (bottleneck), AVG for rates
67
- let sumValue = 0;
68
- let maxValue = 0;
69
- let count = 0;
70
- for (const item of data.data) {
71
- const points = item.points;
72
- const pointValue = points?.[points.length - 1]?.value;
73
- if (pointValue !== undefined &&
74
- pointValue > LONG_MIN_VALUE + 1000000) {
75
- sumValue += pointValue;
76
- maxValue = Math.max(maxValue, pointValue);
77
- count++;
78
- }
79
- }
80
- if (count > 0) {
81
- const avgValue = sumValue / count;
82
- // Map metric names to our interface with appropriate aggregation
83
- if (metric.includes("num_records_in") &&
84
- !metric.includes("from_") &&
85
- !metric.includes("late")) {
86
- metrics.numRecordsIn = sumValue; // SUM for counters
87
- }
88
- else if (metric.includes("num_records_out") &&
89
- !metric.includes("task") &&
90
- !metric.includes("operator")) {
91
- metrics.numRecordsOut = sumValue;
92
- }
93
- else if (metric.includes("pending_records")) {
94
- metrics.pendingRecords = sumValue;
95
- }
96
- else if (metric.includes("backpressure_time")) {
97
- // Convert ms/second to percentage (1000ms = 100%)
98
- metrics.backpressureTimeMsPerSecond = (maxValue / 1000) * 100; // MAX to find bottleneck
99
- }
100
- else if (metric.includes("busy_time")) {
101
- metrics.busyTimeMsPerSecond = (avgValue / 1000) * 100; // AVG as percentage
102
- }
103
- else if (metric.includes("idle_time") &&
104
- metric.includes("task")) {
105
- metrics.idleTimeMsPerSecond = (avgValue / 1000) * 100;
106
- }
107
- else if (metric.includes("current_input_watermark")) {
108
- metrics.currentInputWatermarkMs = maxValue; // MAX for watermarks
109
- }
110
- else if (metric.includes("current_output_watermark")) {
111
- metrics.currentOutputWatermarkMs = maxValue;
112
- }
113
- else if (metric.includes("num_late_records")) {
114
- metrics.numLateRecordsIn = sumValue;
115
- }
116
- else if (metric.includes("max_input_lateness")) {
117
- metrics.maxInputLatenessMs = maxValue; // MAX for lateness
118
- }
119
- else if (metric.includes("current_cfus")) {
120
- metrics.currentCfus = sumValue; // SUM for CFUs
121
- }
122
- else if (metric.includes("state_size_bytes")) {
123
- metrics.stateSizeBytes = sumValue; // SUM for total state
124
- }
125
- }
126
- }
127
- }
128
- catch {
129
- // Continue with other metrics if one fails
130
- }
131
- }
132
- // Calculate watermark lag if we have both input and output watermarks
133
- if (metrics.currentInputWatermarkMs !== undefined &&
134
- metrics.currentOutputWatermarkMs !== undefined) {
135
- metrics.watermarkLagMs =
136
- metrics.currentInputWatermarkMs - metrics.currentOutputWatermarkMs;
137
- }
138
- // Query per-task breakdown if requested
22
+ const metrics = await collectAggregatedMetrics(telemetryClient, scope);
139
23
  if (includeTaskBreakdown) {
140
- const taskMetrics = await queryTaskMetrics(telemetryClient, {
141
- statementName,
142
- computePoolId,
143
- startTime,
144
- now,
145
- });
146
- if (taskMetrics.length > 0) {
24
+ const taskMetrics = await queryTaskMetrics(telemetryClient, scope);
25
+ if (taskMetrics.length > 0)
147
26
  metrics.byTask = taskMetrics;
148
- }
149
27
  }
150
- // Query per-split breakdown if requested
151
28
  if (includeSplitBreakdown) {
152
- const splitMetrics = await querySplitMetrics(telemetryClient, {
153
- statementName,
154
- computePoolId,
155
- startTime,
156
- now,
157
- });
158
- if (splitMetrics.length > 0) {
29
+ const splitMetrics = await querySplitMetrics(telemetryClient, scope);
30
+ if (splitMetrics.length > 0)
159
31
  metrics.bySplit = splitMetrics;
160
- }
161
32
  }
162
33
  return { success: true, metrics };
163
34
  }
@@ -172,94 +43,348 @@ export async function getStatementMetrics(clientManager, options) {
172
43
  * Analyze metrics and return diagnostic insights.
173
44
  */
174
45
  export function analyzeMetrics(metrics) {
175
- const issues = [];
176
- // Check backpressure (high backpressure indicates downstream bottleneck)
177
- // Values are already in percentage (0-100)
178
- if (metrics.backpressureTimeMsPerSecond !== undefined) {
179
- const backpressurePercent = metrics.backpressureTimeMsPerSecond;
180
- if (backpressurePercent > 50) {
181
- issues.push({
182
- type: "high_backpressure",
183
- severity: "high",
184
- description: `High backpressure detected: ${backpressurePercent.toFixed(1)}% of time spent backpressured.`,
185
- suggestion: "Downstream operators or sinks are slow. Consider: 1) Increasing sink parallelism, 2) Optimizing sink performance, 3) Checking for slow consumers.",
186
- value: backpressurePercent,
187
- });
46
+ const issues = ISSUE_DETECTORS.map((detect) => detect(metrics)).filter((issue) => issue !== undefined);
47
+ return { issues, summary: buildMetricsSummary(metrics) };
48
+ }
49
+ /**
50
+ * Query per-task metrics breakdown using GROUPED format.
51
+ */
52
+ async function queryTaskMetrics(telemetryClient, scope) {
53
+ const taskMap = new Map();
54
+ for (const metric of Object.keys(TASK_METRIC_FIELDS)) {
55
+ try {
56
+ const items = await postGroupedMetric(telemetryClient, metric, scope, "metric.flink_task.id");
57
+ for (const item of items) {
58
+ const taskId = item["metric.flink_task.id"];
59
+ const value = lastPointValue(item);
60
+ if (!taskId || value === undefined)
61
+ continue;
62
+ const field = TASK_METRIC_FIELDS[metric];
63
+ if (!field)
64
+ continue;
65
+ const entry = taskMap.get(taskId) ?? { taskId };
66
+ entry[field] = value;
67
+ taskMap.set(taskId, entry);
68
+ }
188
69
  }
189
- else if (backpressurePercent > 20) {
190
- issues.push({
191
- type: "moderate_backpressure",
192
- severity: "medium",
193
- description: `Moderate backpressure: ${backpressurePercent.toFixed(1)}% of time spent backpressured.`,
194
- suggestion: "Some downstream slowdown detected. Monitor for increases.",
195
- value: backpressurePercent,
196
- });
70
+ catch {
71
+ // Continue with other metrics if one fails
197
72
  }
198
73
  }
199
- // Check pending records (consumer lag)
200
- if (metrics.pendingRecords !== undefined && metrics.pendingRecords > 100000) {
201
- issues.push({
202
- type: "high_lag",
203
- severity: metrics.pendingRecords > 1000000 ? "high" : "medium",
204
- description: `High consumer lag: ${metrics.pendingRecords.toLocaleString()} pending records.`,
205
- suggestion: "Statement is falling behind input rate. Consider: 1) Increasing parallelism, 2) Optimizing query, 3) Adding more CFUs.",
206
- value: metrics.pendingRecords,
207
- });
74
+ return Array.from(taskMap.values());
75
+ }
76
+ /**
77
+ * Query per-split metrics breakdown using GROUPED format.
78
+ * Split names are human-readable (e.g., "orders-0" for topic-partition).
79
+ */
80
+ async function querySplitMetrics(telemetryClient, scope) {
81
+ const splitMap = new Map();
82
+ for (const metric of Object.keys(SPLIT_METRIC_FIELDS)) {
83
+ try {
84
+ const items = await postGroupedMetric(telemetryClient, metric, scope, "metric.flink_split");
85
+ for (const item of items) {
86
+ const splitName = item["metric.flink_split"];
87
+ const value = lastPointValue(item);
88
+ if (!splitName || value === undefined)
89
+ continue;
90
+ // Skip Long.MIN_VALUE (no watermark set)
91
+ if (metric.includes("watermark_ms") && value < LONG_MIN_VALUE + 1000000)
92
+ continue;
93
+ const field = SPLIT_METRIC_FIELDS[metric];
94
+ if (!field)
95
+ continue;
96
+ const entry = splitMap.get(splitName) ?? { splitName };
97
+ entry[field] = value;
98
+ splitMap.set(splitName, entry);
99
+ }
100
+ }
101
+ catch {
102
+ // Continue with other metrics if one fails
103
+ }
208
104
  }
209
- // Check for late data
210
- if (metrics.numLateRecordsIn !== undefined && metrics.numLateRecordsIn > 0) {
211
- const severity = metrics.numLateRecordsIn > 10000
212
- ? "high"
213
- : metrics.numLateRecordsIn > 1000
214
- ? "medium"
215
- : "low";
216
- issues.push({
217
- type: "late_data",
218
- severity,
219
- description: `Late records detected: ${metrics.numLateRecordsIn.toLocaleString()} records arrived after watermark.`,
220
- suggestion: "Consider: 1) Increasing watermark delay tolerance, 2) Investigating source timestamp issues, 3) Using allowed lateness in window operations.",
221
- value: metrics.numLateRecordsIn,
222
- });
105
+ return Array.from(splitMap.values());
106
+ }
107
+ /**
108
+ * Issue POST to the telemetry query endpoint for one metric grouped by the
109
+ * given label, returning the GROUPED data rows (empty array when absent).
110
+ */
111
+ async function postGroupedMetric(telemetryClient, metric, scope, groupBy) {
112
+ const response = (await telemetryClient.POST("/v2/metrics/{dataset}/query", {
113
+ params: { path: { dataset: "cloud" } },
114
+ body: {
115
+ aggregations: [{ metric }],
116
+ filter: {
117
+ op: "AND",
118
+ filters: [
119
+ {
120
+ field: "resource.flink_statement.name",
121
+ op: "EQ",
122
+ value: scope.statementName,
123
+ },
124
+ {
125
+ field: "resource.compute_pool.id",
126
+ op: "EQ",
127
+ value: scope.computePoolId,
128
+ },
129
+ ],
130
+ },
131
+ granularity: "PT1M",
132
+ intervals: [
133
+ `${scope.startTime.toISOString()}/${scope.now.toISOString()}`,
134
+ ],
135
+ limit: 1000,
136
+ group_by: [groupBy],
137
+ format: "GROUPED",
138
+ },
139
+ }));
140
+ const data = response.data;
141
+ return data?.data ?? [];
142
+ }
143
+ /**
144
+ * The value of a GROUPED row's most recent point, or undefined when the row
145
+ * carries no points.
146
+ */
147
+ function lastPointValue(item) {
148
+ const points = item.points;
149
+ return points?.[points.length - 1]?.value;
150
+ }
151
+ /**
152
+ * Query one statement-level metric and reduce its per-task points into
153
+ * SUM / MAX / AVG, dropping the Long.MIN_VALUE watermark sentinel. Returns
154
+ * undefined when no valid points exist or the query fails.
155
+ */
156
+ async function queryAggregatedStatementMetric(telemetryClient, metric, scope) {
157
+ try {
158
+ const items = await postGroupedMetric(telemetryClient, metric, scope, "metric.flink_task.id");
159
+ let sum = 0;
160
+ let max = 0;
161
+ let count = 0;
162
+ for (const item of items) {
163
+ const value = lastPointValue(item);
164
+ if (value !== undefined && value > LONG_MIN_VALUE + 1000000) {
165
+ sum += value;
166
+ max = Math.max(max, value);
167
+ count++;
168
+ }
169
+ }
170
+ if (count === 0)
171
+ return undefined;
172
+ return { sum, max, avg: sum / count };
223
173
  }
224
- // Check max lateness
225
- if (metrics.maxInputLatenessMs !== undefined &&
226
- metrics.maxInputLatenessMs > 60000) {
227
- issues.push({
228
- type: "high_lateness",
229
- severity: metrics.maxInputLatenessMs > 300000 ? "high" : "medium",
230
- description: `High input lateness: max ${(metrics.maxInputLatenessMs / 1000).toFixed(1)}s behind watermark.`,
231
- suggestion: "Some records are arriving significantly late. This may cause data loss in window operations.",
232
- value: metrics.maxInputLatenessMs,
233
- });
174
+ catch {
175
+ return undefined;
234
176
  }
235
- // Check idle time (might indicate waiting for data)
236
- // Values are already in percentage (0-100)
237
- if (metrics.idleTimeMsPerSecond !== undefined) {
238
- const idlePercent = metrics.idleTimeMsPerSecond;
239
- if (idlePercent > 90 && metrics.numRecordsIn === 0) {
240
- issues.push({
241
- type: "no_input_data",
242
- severity: "medium",
243
- description: `Statement is mostly idle (${idlePercent.toFixed(1)}%) with no input records.`,
244
- suggestion: "Check if source topics have data. Verify topic names and connectivity.",
245
- value: idlePercent,
246
- });
247
- }
177
+ }
178
+ /**
179
+ * Query every statement-level metric individually (the API allows one
180
+ * aggregation per request), assign each into its target field, and derive
181
+ * watermark lag when both watermarks are present.
182
+ */
183
+ async function collectAggregatedMetrics(telemetryClient, scope) {
184
+ const metrics = {};
185
+ for (const metric of Object.keys(STATEMENT_METRIC_MAPPINGS)) {
186
+ const aggregated = await queryAggregatedStatementMetric(telemetryClient, metric, scope);
187
+ if (aggregated === undefined)
188
+ continue;
189
+ const mapping = STATEMENT_METRIC_MAPPINGS[metric];
190
+ if (mapping)
191
+ metrics[mapping.field] = mapping.aggregate(aggregated);
248
192
  }
249
- // Check state size (large state can cause performance issues)
250
- if (metrics.stateSizeBytes !== undefined) {
251
- const stateSizeGB = metrics.stateSizeBytes / (1024 * 1024 * 1024);
252
- if (stateSizeGB > 10) {
253
- issues.push({
254
- type: "large_state",
255
- severity: "medium",
256
- description: `Large state size: ${stateSizeGB.toFixed(2)} GB.`,
257
- suggestion: "Consider: 1) Adding TTL to stateful operations, 2) Using incremental checkpoints, 3) Reviewing deduplication windows.",
258
- value: metrics.stateSizeBytes,
259
- });
260
- }
193
+ if (metrics.currentInputWatermarkMs !== undefined &&
194
+ metrics.currentOutputWatermarkMs !== undefined) {
195
+ metrics.watermarkLagMs =
196
+ metrics.currentInputWatermarkMs - metrics.currentOutputWatermarkMs;
197
+ }
198
+ return metrics;
199
+ }
200
+ // Statement-level metrics to query, each mapped to its target field and the
201
+ // aggregation appropriate for it: SUM for counters, MAX for bottleneck/
202
+ // watermark gauges, AVG for utilization rates. ms/second rates are scaled to
203
+ // a 0-100 percentage (1000 ms/s = 100%).
204
+ const STATEMENT_METRIC_MAPPINGS = {
205
+ "io.confluent.flink/num_records_in": {
206
+ field: "numRecordsIn",
207
+ aggregate: (a) => a.sum,
208
+ },
209
+ "io.confluent.flink/num_records_out": {
210
+ field: "numRecordsOut",
211
+ aggregate: (a) => a.sum,
212
+ },
213
+ "io.confluent.flink/pending_records": {
214
+ field: "pendingRecords",
215
+ aggregate: (a) => a.sum,
216
+ },
217
+ "io.confluent.flink/task/backpressure_time_ms_per_second": {
218
+ field: "backpressureTimeMsPerSecond",
219
+ aggregate: (a) => (a.max / 1000) * 100,
220
+ },
221
+ "io.confluent.flink/task/busy_time_ms_per_second": {
222
+ field: "busyTimeMsPerSecond",
223
+ aggregate: (a) => (a.avg / 1000) * 100,
224
+ },
225
+ "io.confluent.flink/task/idle_time_ms_per_second": {
226
+ field: "idleTimeMsPerSecond",
227
+ aggregate: (a) => (a.avg / 1000) * 100,
228
+ },
229
+ "io.confluent.flink/current_input_watermark_milliseconds": {
230
+ field: "currentInputWatermarkMs",
231
+ aggregate: (a) => a.max,
232
+ },
233
+ "io.confluent.flink/current_output_watermark_milliseconds": {
234
+ field: "currentOutputWatermarkMs",
235
+ aggregate: (a) => a.max,
236
+ },
237
+ "io.confluent.flink/num_late_records_in": {
238
+ field: "numLateRecordsIn",
239
+ aggregate: (a) => a.sum,
240
+ },
241
+ "io.confluent.flink/max_input_lateness_milliseconds": {
242
+ field: "maxInputLatenessMs",
243
+ aggregate: (a) => a.max,
244
+ },
245
+ "io.confluent.flink/statement_utilization/current_cfus": {
246
+ field: "currentCfus",
247
+ aggregate: (a) => a.sum,
248
+ },
249
+ "io.confluent.flink/operator/state_size_bytes": {
250
+ field: "stateSizeBytes",
251
+ aggregate: (a) => a.sum,
252
+ },
253
+ };
254
+ // Per-task metrics to query, mapped to their target TaskMetrics field.
255
+ const TASK_METRIC_FIELDS = {
256
+ "io.confluent.flink/task/num_records_in": "numRecordsIn",
257
+ "io.confluent.flink/task/num_records_out": "numRecordsOut",
258
+ "io.confluent.flink/task/num_bytes_in": "numBytesIn",
259
+ "io.confluent.flink/task/num_bytes_out": "numBytesOut",
260
+ "io.confluent.flink/task/backpressure_time_ms_per_second": "backpressureTimeMsPerSecond",
261
+ "io.confluent.flink/task/busy_time_ms_per_second": "busyTimeMsPerSecond",
262
+ "io.confluent.flink/task/idle_time_ms_per_second": "idleTimeMsPerSecond",
263
+ "io.confluent.flink/operator/state_size_bytes": "stateSizeBytes",
264
+ };
265
+ // Per-split metrics to query, mapped to their target SplitMetrics field.
266
+ const SPLIT_METRIC_FIELDS = {
267
+ "io.confluent.flink/split/current_watermark_ms": "currentWatermarkMs",
268
+ "io.confluent.flink/split/watermark_active_time_ms_per_second": "watermarkActiveTimeMsPerSecond",
269
+ "io.confluent.flink/split/watermark_paused_time_ms_per_second": "watermarkPausedTimeMsPerSecond",
270
+ "io.confluent.flink/split/watermark_idle_time_ms_per_second": "watermarkIdleTimeMsPerSecond",
271
+ };
272
+ /**
273
+ * Ordered issue detectors, each inspecting one metric dimension and returning
274
+ * a finding or undefined. analyzeMetrics runs them in order and keeps the hits.
275
+ */
276
+ const ISSUE_DETECTORS = [
277
+ detectBackpressure,
278
+ detectLag,
279
+ detectLateData,
280
+ detectLateness,
281
+ detectIdle,
282
+ detectLargeState,
283
+ ];
284
+ // High backpressure indicates a downstream bottleneck. Values are already a
285
+ // 0-100 percentage.
286
+ function detectBackpressure(metrics) {
287
+ const backpressurePercent = metrics.backpressureTimeMsPerSecond;
288
+ if (backpressurePercent === undefined)
289
+ return undefined;
290
+ if (backpressurePercent > 50) {
291
+ return {
292
+ type: "high_backpressure",
293
+ severity: "high",
294
+ description: `High backpressure detected: ${backpressurePercent.toFixed(1)}% of time spent backpressured.`,
295
+ suggestion: "Downstream operators or sinks are slow. Consider: 1) Increasing sink parallelism, 2) Optimizing sink performance, 3) Checking for slow consumers.",
296
+ value: backpressurePercent,
297
+ };
298
+ }
299
+ if (backpressurePercent > 20) {
300
+ return {
301
+ type: "moderate_backpressure",
302
+ severity: "medium",
303
+ description: `Moderate backpressure: ${backpressurePercent.toFixed(1)}% of time spent backpressured.`,
304
+ suggestion: "Some downstream slowdown detected. Monitor for increases.",
305
+ value: backpressurePercent,
306
+ };
261
307
  }
262
- // Build summary
308
+ return undefined;
309
+ }
310
+ // Pending records are the statement's consumer lag.
311
+ function detectLag(metrics) {
312
+ if (metrics.pendingRecords === undefined || metrics.pendingRecords <= 100000)
313
+ return undefined;
314
+ return {
315
+ type: "high_lag",
316
+ severity: metrics.pendingRecords > 1000000 ? "high" : "medium",
317
+ description: `High consumer lag: ${metrics.pendingRecords.toLocaleString()} pending records.`,
318
+ suggestion: "Statement is falling behind input rate. Consider: 1) Increasing parallelism, 2) Optimizing query, 3) Adding more CFUs.",
319
+ value: metrics.pendingRecords,
320
+ };
321
+ }
322
+ // Records that arrived after the watermark.
323
+ function detectLateData(metrics) {
324
+ if (metrics.numLateRecordsIn === undefined || metrics.numLateRecordsIn <= 0)
325
+ return undefined;
326
+ const severity = metrics.numLateRecordsIn > 10000
327
+ ? "high"
328
+ : metrics.numLateRecordsIn > 1000
329
+ ? "medium"
330
+ : "low";
331
+ return {
332
+ type: "late_data",
333
+ severity,
334
+ description: `Late records detected: ${metrics.numLateRecordsIn.toLocaleString()} records arrived after watermark.`,
335
+ suggestion: "Consider: 1) Increasing watermark delay tolerance, 2) Investigating source timestamp issues, 3) Using allowed lateness in window operations.",
336
+ value: metrics.numLateRecordsIn,
337
+ };
338
+ }
339
+ // How far behind the watermark the latest records are.
340
+ function detectLateness(metrics) {
341
+ if (metrics.maxInputLatenessMs === undefined ||
342
+ metrics.maxInputLatenessMs <= 60000)
343
+ return undefined;
344
+ return {
345
+ type: "high_lateness",
346
+ severity: metrics.maxInputLatenessMs > 300000 ? "high" : "medium",
347
+ description: `High input lateness: max ${(metrics.maxInputLatenessMs / 1000).toFixed(1)}s behind watermark.`,
348
+ suggestion: "Some records are arriving significantly late. This may cause data loss in window operations.",
349
+ value: metrics.maxInputLatenessMs,
350
+ };
351
+ }
352
+ // Mostly-idle with no input often means the source topics are empty. Values
353
+ // are already a 0-100 percentage.
354
+ function detectIdle(metrics) {
355
+ const idlePercent = metrics.idleTimeMsPerSecond;
356
+ if (idlePercent === undefined || idlePercent <= 90)
357
+ return undefined;
358
+ if (metrics.numRecordsIn !== 0)
359
+ return undefined;
360
+ return {
361
+ type: "no_input_data",
362
+ severity: "medium",
363
+ description: `Statement is mostly idle (${idlePercent.toFixed(1)}%) with no input records.`,
364
+ suggestion: "Check if source topics have data. Verify topic names and connectivity.",
365
+ value: idlePercent,
366
+ };
367
+ }
368
+ // Large state can degrade performance.
369
+ function detectLargeState(metrics) {
370
+ if (metrics.stateSizeBytes === undefined)
371
+ return undefined;
372
+ const stateSizeGB = metrics.stateSizeBytes / (1024 * 1024 * 1024);
373
+ if (stateSizeGB <= 10)
374
+ return undefined;
375
+ return {
376
+ type: "large_state",
377
+ severity: "medium",
378
+ description: `Large state size: ${stateSizeGB.toFixed(2)} GB.`,
379
+ suggestion: "Consider: 1) Adding TTL to stateful operations, 2) Using incremental checkpoints, 3) Reviewing deduplication windows.",
380
+ value: metrics.stateSizeBytes,
381
+ };
382
+ }
383
+ /**
384
+ * A single pipe-delimited line of the headline throughput/utilization figures,
385
+ * or a placeholder when no metrics are populated.
386
+ */
387
+ function buildMetricsSummary(metrics) {
263
388
  const parts = [];
264
389
  if (metrics.numRecordsIn !== undefined) {
265
390
  parts.push(`Records in: ${metrics.numRecordsIn.toLocaleString()}`);
@@ -282,162 +407,6 @@ export function analyzeMetrics(metrics) {
282
407
  if (metrics.currentCfus !== undefined) {
283
408
  parts.push(`CFUs: ${metrics.currentCfus.toFixed(2)}`);
284
409
  }
285
- const summary = parts.length > 0 ? parts.join(" | ") : "No metrics data available";
286
- return { issues, summary };
287
- }
288
- /**
289
- * Query per-task metrics breakdown using GROUPED format.
290
- */
291
- async function queryTaskMetrics(telemetryClient, options) {
292
- const { statementName, computePoolId, startTime, now } = options;
293
- // Metrics to query per task
294
- const taskMetricsToQuery = [
295
- "io.confluent.flink/task/num_records_in",
296
- "io.confluent.flink/task/num_records_out",
297
- "io.confluent.flink/task/num_bytes_in",
298
- "io.confluent.flink/task/num_bytes_out",
299
- "io.confluent.flink/task/backpressure_time_ms_per_second",
300
- "io.confluent.flink/task/busy_time_ms_per_second",
301
- "io.confluent.flink/task/idle_time_ms_per_second",
302
- "io.confluent.flink/operator/state_size_bytes",
303
- ];
304
- const taskMap = new Map();
305
- for (const metric of taskMetricsToQuery) {
306
- try {
307
- const response = (await telemetryClient.POST("/v2/metrics/{dataset}/query", {
308
- params: { path: { dataset: "cloud" } },
309
- body: {
310
- aggregations: [{ metric }],
311
- filter: {
312
- op: "AND",
313
- filters: [
314
- {
315
- field: "resource.flink_statement.name",
316
- op: "EQ",
317
- value: statementName,
318
- },
319
- {
320
- field: "resource.compute_pool.id",
321
- op: "EQ",
322
- value: computePoolId,
323
- },
324
- ],
325
- },
326
- granularity: "PT1M",
327
- intervals: [`${startTime.toISOString()}/${now.toISOString()}`],
328
- limit: 1000,
329
- group_by: ["metric.flink_task.id"],
330
- format: "GROUPED",
331
- },
332
- }));
333
- const data = response.data;
334
- if (data?.data) {
335
- for (const item of data.data) {
336
- const taskId = item["metric.flink_task.id"];
337
- const value = item.points?.[item.points.length - 1]?.value;
338
- if (!taskId || value === undefined)
339
- continue;
340
- if (!taskMap.has(taskId)) {
341
- taskMap.set(taskId, { taskId });
342
- }
343
- const taskMetrics = taskMap.get(taskId);
344
- if (metric.includes("num_records_in"))
345
- taskMetrics.numRecordsIn = value;
346
- else if (metric.includes("num_records_out"))
347
- taskMetrics.numRecordsOut = value;
348
- else if (metric.includes("num_bytes_in"))
349
- taskMetrics.numBytesIn = value;
350
- else if (metric.includes("num_bytes_out"))
351
- taskMetrics.numBytesOut = value;
352
- else if (metric.includes("backpressure"))
353
- taskMetrics.backpressureTimeMsPerSecond = value;
354
- else if (metric.includes("busy_time"))
355
- taskMetrics.busyTimeMsPerSecond = value;
356
- else if (metric.includes("idle_time"))
357
- taskMetrics.idleTimeMsPerSecond = value;
358
- else if (metric.includes("state_size"))
359
- taskMetrics.stateSizeBytes = value;
360
- }
361
- }
362
- }
363
- catch {
364
- // Continue with other metrics if one fails
365
- }
366
- }
367
- return Array.from(taskMap.values());
368
- }
369
- /**
370
- * Query per-split metrics breakdown using GROUPED format.
371
- * Split names are human-readable (e.g., "orders-0" for topic-partition).
372
- */
373
- async function querySplitMetrics(telemetryClient, options) {
374
- const { statementName, computePoolId, startTime, now } = options;
375
- // Metrics to query per split
376
- const splitMetricsToQuery = [
377
- "io.confluent.flink/split/current_watermark_ms",
378
- "io.confluent.flink/split/watermark_active_time_ms_per_second",
379
- "io.confluent.flink/split/watermark_paused_time_ms_per_second",
380
- "io.confluent.flink/split/watermark_idle_time_ms_per_second",
381
- ];
382
- const splitMap = new Map();
383
- for (const metric of splitMetricsToQuery) {
384
- try {
385
- const response = (await telemetryClient.POST("/v2/metrics/{dataset}/query", {
386
- params: { path: { dataset: "cloud" } },
387
- body: {
388
- aggregations: [{ metric }],
389
- filter: {
390
- op: "AND",
391
- filters: [
392
- {
393
- field: "resource.flink_statement.name",
394
- op: "EQ",
395
- value: statementName,
396
- },
397
- {
398
- field: "resource.compute_pool.id",
399
- op: "EQ",
400
- value: computePoolId,
401
- },
402
- ],
403
- },
404
- granularity: "PT1M",
405
- intervals: [`${startTime.toISOString()}/${now.toISOString()}`],
406
- limit: 1000,
407
- group_by: ["metric.flink_split"],
408
- format: "GROUPED",
409
- },
410
- }));
411
- const data = response.data;
412
- if (data?.data) {
413
- for (const item of data.data) {
414
- const splitName = item["metric.flink_split"];
415
- const value = item.points?.[item.points.length - 1]?.value;
416
- if (!splitName || value === undefined)
417
- continue;
418
- // Skip Long.MIN_VALUE (no watermark set)
419
- if (metric.includes("watermark_ms") &&
420
- value < LONG_MIN_VALUE + 1000000)
421
- continue;
422
- if (!splitMap.has(splitName)) {
423
- splitMap.set(splitName, { splitName });
424
- }
425
- const splitMetrics = splitMap.get(splitName);
426
- if (metric.includes("current_watermark_ms"))
427
- splitMetrics.currentWatermarkMs = value;
428
- else if (metric.includes("active_time"))
429
- splitMetrics.watermarkActiveTimeMsPerSecond = value;
430
- else if (metric.includes("paused_time"))
431
- splitMetrics.watermarkPausedTimeMsPerSecond = value;
432
- else if (metric.includes("idle_time"))
433
- splitMetrics.watermarkIdleTimeMsPerSecond = value;
434
- }
435
- }
436
- }
437
- catch {
438
- // Continue with other metrics if one fails
439
- }
440
- }
441
- return Array.from(splitMap.values());
410
+ return parts.length > 0 ? parts.join(" | ") : "No metrics data available";
442
411
  }
443
412
  //# sourceMappingURL=metrics-helper.js.map