@confluentinc/mcp-confluent 1.5.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 (368) hide show
  1. package/README.md +5 -3
  2. package/dist/build-config.d.ts +1 -0
  3. package/dist/build-config.d.ts.map +1 -1
  4. package/dist/build-config.js +1 -0
  5. package/dist/build-config.js.map +1 -1
  6. package/dist/cli.d.ts +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +128 -94
  9. package/dist/cli.js.map +1 -1
  10. package/dist/confluent/base-client-manager.d.ts +1 -1
  11. package/dist/confluent/base-client-manager.d.ts.map +1 -1
  12. package/dist/confluent/base-client-manager.js +1 -1
  13. package/dist/confluent/base-client-manager.js.map +1 -1
  14. package/dist/confluent/client-manager.d.ts +1 -1
  15. package/dist/confluent/client-manager.d.ts.map +1 -1
  16. package/dist/confluent/direct-client-manager.d.ts +1 -1
  17. package/dist/confluent/direct-client-manager.d.ts.map +1 -1
  18. package/dist/confluent/middleware.d.ts +1 -1
  19. package/dist/confluent/middleware.d.ts.map +1 -1
  20. package/dist/confluent/node-deps.d.ts +8 -0
  21. package/dist/confluent/node-deps.d.ts.map +1 -1
  22. package/dist/confluent/node-deps.js +9 -2
  23. package/dist/confluent/node-deps.js.map +1 -1
  24. package/dist/confluent/oauth/pkce-login.d.ts.map +1 -1
  25. package/dist/confluent/oauth/pkce-login.js +180 -150
  26. package/dist/confluent/oauth/pkce-login.js.map +1 -1
  27. package/dist/confluent/oauth-client-manager.d.ts +1 -1
  28. package/dist/confluent/oauth-client-manager.d.ts.map +1 -1
  29. package/dist/confluent/schema-registry-helper.d.ts +20 -3
  30. package/dist/confluent/schema-registry-helper.d.ts.map +1 -1
  31. package/dist/confluent/schema-registry-helper.js +38 -4
  32. package/dist/confluent/schema-registry-helper.js.map +1 -1
  33. package/dist/confluent/schema.d.ts +2 -2
  34. package/dist/confluent/schema.d.ts.map +1 -1
  35. package/dist/confluent/sentry-redact.d.ts +5 -0
  36. package/dist/confluent/sentry-redact.d.ts.map +1 -0
  37. package/dist/confluent/sentry-redact.js +64 -0
  38. package/dist/confluent/sentry-redact.js.map +1 -0
  39. package/dist/confluent/sentry.d.ts +23 -0
  40. package/dist/confluent/sentry.d.ts.map +1 -0
  41. package/dist/confluent/sentry.js +68 -0
  42. package/dist/confluent/sentry.js.map +1 -0
  43. package/dist/confluent/tools/base-tools.d.ts +5 -4
  44. package/dist/confluent/tools/base-tools.d.ts.map +1 -1
  45. package/dist/confluent/tools/base-tools.js +2 -1
  46. package/dist/confluent/tools/base-tools.js.map +1 -1
  47. package/dist/confluent/tools/cluster-arg-resolvers.d.ts +2 -2
  48. package/dist/confluent/tools/cluster-arg-resolvers.d.ts.map +1 -1
  49. package/dist/confluent/tools/cluster-arg-resolvers.js +7 -6
  50. package/dist/confluent/tools/cluster-arg-resolvers.js.map +1 -1
  51. package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts +9 -3
  52. package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts.map +1 -1
  53. package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js +76 -61
  54. package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js.map +1 -1
  55. package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.d.ts +4 -3
  56. package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.d.ts.map +1 -1
  57. package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.js.map +1 -1
  58. package/dist/confluent/tools/handlers/catalog/create-topic-tags.d.ts +4 -3
  59. package/dist/confluent/tools/handlers/catalog/create-topic-tags.d.ts.map +1 -1
  60. package/dist/confluent/tools/handlers/catalog/create-topic-tags.js.map +1 -1
  61. package/dist/confluent/tools/handlers/catalog/delete-tag.d.ts +4 -3
  62. package/dist/confluent/tools/handlers/catalog/delete-tag.d.ts.map +1 -1
  63. package/dist/confluent/tools/handlers/catalog/delete-tag.js.map +1 -1
  64. package/dist/confluent/tools/handlers/catalog/list-tags.d.ts +4 -3
  65. package/dist/confluent/tools/handlers/catalog/list-tags.d.ts.map +1 -1
  66. package/dist/confluent/tools/handlers/catalog/list-tags.js.map +1 -1
  67. package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.d.ts +4 -3
  68. package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.d.ts.map +1 -1
  69. package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.js.map +1 -1
  70. package/dist/confluent/tools/handlers/clusters/list-clusters-handler.d.ts +4 -3
  71. package/dist/confluent/tools/handlers/clusters/list-clusters-handler.d.ts.map +1 -1
  72. package/dist/confluent/tools/handlers/clusters/list-clusters-handler.js.map +1 -1
  73. package/dist/confluent/tools/handlers/connect/connect-tool-handler.d.ts +1 -1
  74. package/dist/confluent/tools/handlers/connect/connect-tool-handler.d.ts.map +1 -1
  75. package/dist/confluent/tools/handlers/connect/create-connector-handler.d.ts +3 -3
  76. package/dist/confluent/tools/handlers/connect/create-connector-handler.d.ts.map +1 -1
  77. package/dist/confluent/tools/handlers/connect/create-connector-handler.js.map +1 -1
  78. package/dist/confluent/tools/handlers/connect/delete-connector-handler.d.ts +3 -3
  79. package/dist/confluent/tools/handlers/connect/delete-connector-handler.d.ts.map +1 -1
  80. package/dist/confluent/tools/handlers/connect/delete-connector-handler.js.map +1 -1
  81. package/dist/confluent/tools/handlers/connect/get-connector-config-handler.d.ts +3 -3
  82. package/dist/confluent/tools/handlers/connect/get-connector-config-handler.d.ts.map +1 -1
  83. package/dist/confluent/tools/handlers/connect/get-connector-config-handler.js.map +1 -1
  84. package/dist/confluent/tools/handlers/connect/get-connector-error-recommendations-handler.d.ts +3 -3
  85. package/dist/confluent/tools/handlers/connect/get-connector-error-recommendations-handler.d.ts.map +1 -1
  86. package/dist/confluent/tools/handlers/connect/get-connector-error-recommendations-handler.js.map +1 -1
  87. package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.d.ts +3 -3
  88. package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.d.ts.map +1 -1
  89. package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.js +1 -1
  90. package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.js.map +1 -1
  91. package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.d.ts +3 -3
  92. package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.d.ts.map +1 -1
  93. package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.js +139 -93
  94. package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.js.map +1 -1
  95. package/dist/confluent/tools/handlers/connect/get-connector-offsets-handler.d.ts +3 -3
  96. package/dist/confluent/tools/handlers/connect/get-connector-offsets-handler.d.ts.map +1 -1
  97. package/dist/confluent/tools/handlers/connect/get-connector-offsets-handler.js.map +1 -1
  98. package/dist/confluent/tools/handlers/connect/get-connector-status-handler.d.ts +3 -3
  99. package/dist/confluent/tools/handlers/connect/get-connector-status-handler.d.ts.map +1 -1
  100. package/dist/confluent/tools/handlers/connect/get-connector-status-handler.js.map +1 -1
  101. package/dist/confluent/tools/handlers/connect/get-connector-tasks-handler.d.ts +3 -3
  102. package/dist/confluent/tools/handlers/connect/get-connector-tasks-handler.d.ts.map +1 -1
  103. package/dist/confluent/tools/handlers/connect/get-connector-tasks-handler.js.map +1 -1
  104. package/dist/confluent/tools/handlers/connect/list-connectors-handler.d.ts +3 -3
  105. package/dist/confluent/tools/handlers/connect/list-connectors-handler.d.ts.map +1 -1
  106. package/dist/confluent/tools/handlers/connect/list-connectors-handler.js.map +1 -1
  107. package/dist/confluent/tools/handlers/connect/pause-connector-handler.d.ts +3 -3
  108. package/dist/confluent/tools/handlers/connect/pause-connector-handler.d.ts.map +1 -1
  109. package/dist/confluent/tools/handlers/connect/pause-connector-handler.js.map +1 -1
  110. package/dist/confluent/tools/handlers/connect/restart-connector-handler.d.ts +3 -3
  111. package/dist/confluent/tools/handlers/connect/restart-connector-handler.d.ts.map +1 -1
  112. package/dist/confluent/tools/handlers/connect/restart-connector-handler.js.map +1 -1
  113. package/dist/confluent/tools/handlers/connect/resume-connector-handler.d.ts +3 -3
  114. package/dist/confluent/tools/handlers/connect/resume-connector-handler.d.ts.map +1 -1
  115. package/dist/confluent/tools/handlers/connect/resume-connector-handler.js.map +1 -1
  116. package/dist/confluent/tools/handlers/connect/update-connector-config-handler.d.ts +3 -3
  117. package/dist/confluent/tools/handlers/connect/update-connector-config-handler.d.ts.map +1 -1
  118. package/dist/confluent/tools/handlers/connect/update-connector-config-handler.js.map +1 -1
  119. package/dist/confluent/tools/handlers/diagnostics/config-help-handler.d.ts +4 -3
  120. package/dist/confluent/tools/handlers/diagnostics/config-help-handler.d.ts.map +1 -1
  121. package/dist/confluent/tools/handlers/diagnostics/config-help-handler.js +1 -1
  122. package/dist/confluent/tools/handlers/diagnostics/config-help-handler.js.map +1 -1
  123. package/dist/confluent/tools/handlers/diagnostics/describe-configured-connection-handler.d.ts +4 -3
  124. package/dist/confluent/tools/handlers/diagnostics/describe-configured-connection-handler.d.ts.map +1 -1
  125. package/dist/confluent/tools/handlers/diagnostics/describe-configured-connection-handler.js +1 -1
  126. package/dist/confluent/tools/handlers/diagnostics/describe-configured-connection-handler.js.map +1 -1
  127. package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.d.ts +4 -3
  128. package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.d.ts.map +1 -1
  129. package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.js +1 -1
  130. package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.js.map +1 -1
  131. package/dist/confluent/tools/handlers/diagnostics/list-configured-connections-handler.d.ts +4 -3
  132. package/dist/confluent/tools/handlers/diagnostics/list-configured-connections-handler.d.ts.map +1 -1
  133. package/dist/confluent/tools/handlers/diagnostics/list-configured-connections-handler.js +1 -1
  134. package/dist/confluent/tools/handlers/diagnostics/list-configured-connections-handler.js.map +1 -1
  135. package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.d.ts +4 -3
  136. package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.d.ts.map +1 -1
  137. package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.js.map +1 -1
  138. package/dist/confluent/tools/handlers/docs/search-product-docs-handler.d.ts +4 -3
  139. package/dist/confluent/tools/handlers/docs/search-product-docs-handler.d.ts.map +1 -1
  140. package/dist/confluent/tools/handlers/docs/search-product-docs-handler.js.map +1 -1
  141. package/dist/confluent/tools/handlers/environments/list-environments-handler.d.ts +9 -3
  142. package/dist/confluent/tools/handlers/environments/list-environments-handler.d.ts.map +1 -1
  143. package/dist/confluent/tools/handlers/environments/list-environments-handler.js +67 -45
  144. package/dist/confluent/tools/handlers/environments/list-environments-handler.js.map +1 -1
  145. package/dist/confluent/tools/handlers/environments/read-environment-handler.d.ts +4 -3
  146. package/dist/confluent/tools/handlers/environments/read-environment-handler.d.ts.map +1 -1
  147. package/dist/confluent/tools/handlers/environments/read-environment-handler.js +1 -1
  148. package/dist/confluent/tools/handlers/environments/read-environment-handler.js.map +1 -1
  149. package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts +1 -1
  150. package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts.map +1 -1
  151. package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js +12 -6
  152. package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js.map +1 -1
  153. package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.d.ts +3 -3
  154. package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.d.ts.map +1 -1
  155. package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.js.map +1 -1
  156. package/dist/confluent/tools/handlers/flink/catalog/flink-catalog-tool-handler.d.ts +1 -1
  157. package/dist/confluent/tools/handlers/flink/catalog/flink-catalog-tool-handler.d.ts.map +1 -1
  158. package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.d.ts +3 -3
  159. package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.d.ts.map +1 -1
  160. package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.js.map +1 -1
  161. package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.d.ts +3 -3
  162. package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.d.ts.map +1 -1
  163. package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.js.map +1 -1
  164. package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.d.ts +3 -3
  165. package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.d.ts.map +1 -1
  166. package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.js.map +1 -1
  167. package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.d.ts +3 -3
  168. package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.d.ts.map +1 -1
  169. package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.js.map +1 -1
  170. package/dist/confluent/tools/handlers/flink/create-flink-statement-handler.d.ts +3 -3
  171. package/dist/confluent/tools/handlers/flink/create-flink-statement-handler.d.ts.map +1 -1
  172. package/dist/confluent/tools/handlers/flink/create-flink-statement-handler.js.map +1 -1
  173. package/dist/confluent/tools/handlers/flink/delete-flink-statement-handler.d.ts +3 -3
  174. package/dist/confluent/tools/handlers/flink/delete-flink-statement-handler.d.ts.map +1 -1
  175. package/dist/confluent/tools/handlers/flink/delete-flink-statement-handler.js.map +1 -1
  176. package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.d.ts +3 -3
  177. package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.d.ts.map +1 -1
  178. package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.js.map +1 -1
  179. package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.d.ts +3 -3
  180. package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.d.ts.map +1 -1
  181. package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.js +183 -138
  182. package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.js.map +1 -1
  183. package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.d.ts +12 -8
  184. package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.d.ts.map +1 -1
  185. package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.js +346 -377
  186. package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.js.map +1 -1
  187. package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.d.ts +3 -3
  188. package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.d.ts.map +1 -1
  189. package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.js +350 -295
  190. package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.js.map +1 -1
  191. package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts +1 -1
  192. package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts.map +1 -1
  193. package/dist/confluent/tools/handlers/flink/flink-sql-helper.js.map +1 -1
  194. package/dist/confluent/tools/handlers/flink/flink-tool-handler.d.ts +1 -1
  195. package/dist/confluent/tools/handlers/flink/flink-tool-handler.d.ts.map +1 -1
  196. package/dist/confluent/tools/handlers/flink/flink-tool-handler.js +2 -1
  197. package/dist/confluent/tools/handlers/flink/flink-tool-handler.js.map +1 -1
  198. package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.d.ts +3 -3
  199. package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.d.ts.map +1 -1
  200. package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.js.map +1 -1
  201. package/dist/confluent/tools/handlers/flink/get-flink-statement-results-handler.d.ts +3 -3
  202. package/dist/confluent/tools/handlers/flink/get-flink-statement-results-handler.d.ts.map +1 -1
  203. package/dist/confluent/tools/handlers/flink/get-flink-statement-results-handler.js.map +1 -1
  204. package/dist/confluent/tools/handlers/flink/list-compute-pools-handler.d.ts +4 -3
  205. package/dist/confluent/tools/handlers/flink/list-compute-pools-handler.d.ts.map +1 -1
  206. package/dist/confluent/tools/handlers/flink/list-compute-pools-handler.js.map +1 -1
  207. package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.d.ts +3 -3
  208. package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.d.ts.map +1 -1
  209. package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.js.map +1 -1
  210. package/dist/confluent/tools/handlers/kafka/alter-topic-config.d.ts +4 -3
  211. package/dist/confluent/tools/handlers/kafka/alter-topic-config.d.ts.map +1 -1
  212. package/dist/confluent/tools/handlers/kafka/alter-topic-config.js.map +1 -1
  213. package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.d.ts +6 -5
  214. package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.d.ts.map +1 -1
  215. package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.js +82 -63
  216. package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.js.map +1 -1
  217. package/dist/confluent/tools/handlers/kafka/create-topics-handler.d.ts +4 -3
  218. package/dist/confluent/tools/handlers/kafka/create-topics-handler.d.ts.map +1 -1
  219. package/dist/confluent/tools/handlers/kafka/create-topics-handler.js.map +1 -1
  220. package/dist/confluent/tools/handlers/kafka/delete-topics-handler.d.ts +4 -3
  221. package/dist/confluent/tools/handlers/kafka/delete-topics-handler.d.ts.map +1 -1
  222. package/dist/confluent/tools/handlers/kafka/delete-topics-handler.js.map +1 -1
  223. package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.d.ts +4 -3
  224. package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.d.ts.map +1 -1
  225. package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.js +5 -40
  226. package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.js.map +1 -1
  227. package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.d.ts +4 -3
  228. package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.d.ts.map +1 -1
  229. package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.js +5 -9
  230. package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.js.map +1 -1
  231. package/dist/confluent/tools/handlers/kafka/get-partition-offsets-handler.d.ts +4 -3
  232. package/dist/confluent/tools/handlers/kafka/get-partition-offsets-handler.d.ts.map +1 -1
  233. package/dist/confluent/tools/handlers/kafka/get-partition-offsets-handler.js.map +1 -1
  234. package/dist/confluent/tools/handlers/kafka/get-topic-config.d.ts +4 -3
  235. package/dist/confluent/tools/handlers/kafka/get-topic-config.d.ts.map +1 -1
  236. package/dist/confluent/tools/handlers/kafka/get-topic-config.js.map +1 -1
  237. package/dist/confluent/tools/handlers/kafka/list-consumer-groups-handler.d.ts +4 -3
  238. package/dist/confluent/tools/handlers/kafka/list-consumer-groups-handler.d.ts.map +1 -1
  239. package/dist/confluent/tools/handlers/kafka/list-consumer-groups-handler.js.map +1 -1
  240. package/dist/confluent/tools/handlers/kafka/list-topics-handler.d.ts +4 -3
  241. package/dist/confluent/tools/handlers/kafka/list-topics-handler.d.ts.map +1 -1
  242. package/dist/confluent/tools/handlers/kafka/list-topics-handler.js.map +1 -1
  243. package/dist/confluent/tools/handlers/kafka/partition-watermarks.d.ts +1 -1
  244. package/dist/confluent/tools/handlers/kafka/partition-watermarks.d.ts.map +1 -1
  245. package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.d.ts +6 -5
  246. package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.d.ts.map +1 -1
  247. package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.js.map +1 -1
  248. package/dist/confluent/tools/handlers/metrics/list-metrics-handler.d.ts +4 -3
  249. package/dist/confluent/tools/handlers/metrics/list-metrics-handler.d.ts.map +1 -1
  250. package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js +102 -57
  251. package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js.map +1 -1
  252. package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts +4 -3
  253. package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts.map +1 -1
  254. package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js +69 -53
  255. package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js.map +1 -1
  256. package/dist/confluent/tools/handlers/metrics/telemetry-error.d.ts +9 -0
  257. package/dist/confluent/tools/handlers/metrics/telemetry-error.d.ts.map +1 -0
  258. package/dist/confluent/tools/handlers/metrics/telemetry-error.js +38 -0
  259. package/dist/confluent/tools/handlers/metrics/telemetry-error.js.map +1 -0
  260. package/dist/confluent/tools/handlers/organizations/list-organizations-handler.d.ts +4 -3
  261. package/dist/confluent/tools/handlers/organizations/list-organizations-handler.d.ts.map +1 -1
  262. package/dist/confluent/tools/handlers/organizations/list-organizations-handler.js.map +1 -1
  263. package/dist/confluent/tools/handlers/schema/create-schema-handler.d.ts +4 -3
  264. package/dist/confluent/tools/handlers/schema/create-schema-handler.d.ts.map +1 -1
  265. package/dist/confluent/tools/handlers/schema/create-schema-handler.js.map +1 -1
  266. package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts +4 -3
  267. package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts.map +1 -1
  268. package/dist/confluent/tools/handlers/schema/delete-schema-handler.js.map +1 -1
  269. package/dist/confluent/tools/handlers/schema/list-schemas-handler.d.ts +4 -3
  270. package/dist/confluent/tools/handlers/schema/list-schemas-handler.d.ts.map +1 -1
  271. package/dist/confluent/tools/handlers/schema/list-schemas-handler.js +100 -71
  272. package/dist/confluent/tools/handlers/schema/list-schemas-handler.js.map +1 -1
  273. package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.d.ts +4 -3
  274. package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.d.ts.map +1 -1
  275. package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.js.map +1 -1
  276. package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.d.ts +4 -3
  277. package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.d.ts.map +1 -1
  278. package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.js.map +1 -1
  279. package/dist/confluent/tools/handlers/tableflow/catalog/create-tableflow-catalog-integration-handler.d.ts +3 -3
  280. package/dist/confluent/tools/handlers/tableflow/catalog/create-tableflow-catalog-integration-handler.d.ts.map +1 -1
  281. package/dist/confluent/tools/handlers/tableflow/catalog/create-tableflow-catalog-integration-handler.js.map +1 -1
  282. package/dist/confluent/tools/handlers/tableflow/catalog/delete-tableflow-catalog-integration-handler.d.ts +3 -3
  283. package/dist/confluent/tools/handlers/tableflow/catalog/delete-tableflow-catalog-integration-handler.d.ts.map +1 -1
  284. package/dist/confluent/tools/handlers/tableflow/catalog/delete-tableflow-catalog-integration-handler.js.map +1 -1
  285. package/dist/confluent/tools/handlers/tableflow/catalog/list-tableflow-catalog-integrations-handler.d.ts +3 -3
  286. package/dist/confluent/tools/handlers/tableflow/catalog/list-tableflow-catalog-integrations-handler.d.ts.map +1 -1
  287. package/dist/confluent/tools/handlers/tableflow/catalog/list-tableflow-catalog-integrations-handler.js.map +1 -1
  288. package/dist/confluent/tools/handlers/tableflow/catalog/read-tableflow-catalog-integration-handler.d.ts +3 -3
  289. package/dist/confluent/tools/handlers/tableflow/catalog/read-tableflow-catalog-integration-handler.d.ts.map +1 -1
  290. package/dist/confluent/tools/handlers/tableflow/catalog/read-tableflow-catalog-integration-handler.js.map +1 -1
  291. package/dist/confluent/tools/handlers/tableflow/catalog/update-tableflow-catalog-integration-handler.d.ts +3 -3
  292. package/dist/confluent/tools/handlers/tableflow/catalog/update-tableflow-catalog-integration-handler.d.ts.map +1 -1
  293. package/dist/confluent/tools/handlers/tableflow/catalog/update-tableflow-catalog-integration-handler.js.map +1 -1
  294. package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.d.ts +3 -3
  295. package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.d.ts.map +1 -1
  296. package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.js.map +1 -1
  297. package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.d.ts +1 -1
  298. package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.d.ts.map +1 -1
  299. package/dist/confluent/tools/handlers/tableflow/topic/create-tableflow-topic-handler.d.ts +3 -3
  300. package/dist/confluent/tools/handlers/tableflow/topic/create-tableflow-topic-handler.d.ts.map +1 -1
  301. package/dist/confluent/tools/handlers/tableflow/topic/create-tableflow-topic-handler.js.map +1 -1
  302. package/dist/confluent/tools/handlers/tableflow/topic/delete-tableflow-topic-handler.d.ts +3 -3
  303. package/dist/confluent/tools/handlers/tableflow/topic/delete-tableflow-topic-handler.d.ts.map +1 -1
  304. package/dist/confluent/tools/handlers/tableflow/topic/delete-tableflow-topic-handler.js.map +1 -1
  305. package/dist/confluent/tools/handlers/tableflow/topic/list-tableflow-topics-handler.d.ts +3 -3
  306. package/dist/confluent/tools/handlers/tableflow/topic/list-tableflow-topics-handler.d.ts.map +1 -1
  307. package/dist/confluent/tools/handlers/tableflow/topic/list-tableflow-topics-handler.js.map +1 -1
  308. package/dist/confluent/tools/handlers/tableflow/topic/read-tableflow-topic-handler.d.ts +3 -3
  309. package/dist/confluent/tools/handlers/tableflow/topic/read-tableflow-topic-handler.d.ts.map +1 -1
  310. package/dist/confluent/tools/handlers/tableflow/topic/read-tableflow-topic-handler.js.map +1 -1
  311. package/dist/confluent/tools/handlers/tableflow/topic/update-tableflow-topic-handler.d.ts +3 -3
  312. package/dist/confluent/tools/handlers/tableflow/topic/update-tableflow-topic-handler.d.ts.map +1 -1
  313. package/dist/confluent/tools/handlers/tableflow/topic/update-tableflow-topic-handler.js.map +1 -1
  314. package/dist/confluent/tools/pagination.d.ts +31 -0
  315. package/dist/confluent/tools/pagination.d.ts.map +1 -0
  316. package/dist/confluent/tools/pagination.js +40 -0
  317. package/dist/confluent/tools/pagination.js.map +1 -0
  318. package/dist/confluent/tools/tool-availability.d.ts +4 -4
  319. package/dist/confluent/tools/tool-availability.d.ts.map +1 -1
  320. package/dist/confluent/tools/tool-availability.js.map +1 -1
  321. package/dist/confluent/tools/tool-input-error.d.ts +17 -0
  322. package/dist/confluent/tools/tool-input-error.d.ts.map +1 -0
  323. package/dist/confluent/tools/tool-input-error.js +23 -0
  324. package/dist/confluent/tools/tool-input-error.js.map +1 -0
  325. package/dist/confluent/tools/tool-metadata-handler.d.ts +3 -2
  326. package/dist/confluent/tools/tool-metadata-handler.d.ts.map +1 -1
  327. package/dist/confluent/tools/tool-metadata-handler.js +1 -1
  328. package/dist/confluent/tools/tool-metadata-handler.js.map +1 -1
  329. package/dist/confluent/tools/tool-registry.d.ts +1 -1
  330. package/dist/confluent/tools/tool-registry.d.ts.map +1 -1
  331. package/dist/env.d.ts +1 -1
  332. package/dist/env.d.ts.map +1 -1
  333. package/dist/logger.d.ts +1 -1
  334. package/dist/logger.d.ts.map +1 -1
  335. package/dist/mcp/server.d.ts +6 -4
  336. package/dist/mcp/server.d.ts.map +1 -1
  337. package/dist/mcp/server.js +11 -1
  338. package/dist/mcp/server.js.map +1 -1
  339. package/dist/mcp/transports/auth.d.ts +1 -1
  340. package/dist/mcp/transports/auth.d.ts.map +1 -1
  341. package/dist/mcp/transports/http.d.ts +3 -3
  342. package/dist/mcp/transports/http.d.ts.map +1 -1
  343. package/dist/mcp/transports/manager.d.ts +1 -1
  344. package/dist/mcp/transports/manager.d.ts.map +1 -1
  345. package/dist/mcp/transports/manager.js.map +1 -1
  346. package/dist/mcp/transports/ping.d.ts +1 -1
  347. package/dist/mcp/transports/ping.d.ts.map +1 -1
  348. package/dist/mcp/transports/server.d.ts +3 -3
  349. package/dist/mcp/transports/server.d.ts.map +1 -1
  350. package/dist/mcp/transports/server.js +1 -1
  351. package/dist/mcp/transports/server.js.map +1 -1
  352. package/dist/mcp/transports/sse.d.ts +3 -3
  353. package/dist/mcp/transports/sse.d.ts.map +1 -1
  354. package/dist/mcp/transports/stdio.d.ts +2 -2
  355. package/dist/mcp/transports/stdio.d.ts.map +1 -1
  356. package/dist/print-md-schema.js +21 -18
  357. package/dist/print-md-schema.js.map +1 -1
  358. package/dist/server-main.d.ts +8 -2
  359. package/dist/server-main.d.ts.map +1 -1
  360. package/dist/server-main.js +30 -3
  361. package/dist/server-main.js.map +1 -1
  362. package/dist/server-runtime.d.ts +3 -3
  363. package/dist/server-runtime.d.ts.map +1 -1
  364. package/package.json +6 -2
  365. package/dist/confluent/tools/handlers/kafka/topic-metadata.d.ts +0 -18
  366. package/dist/confluent/tools/handlers/kafka/topic-metadata.d.ts.map +0 -1
  367. package/dist/confluent/tools/handlers/kafka/topic-metadata.js +0 -18
  368. package/dist/confluent/tools/handlers/kafka/topic-metadata.js.map +0 -1
@@ -49,7 +49,6 @@ export class QueryProfilerHandler extends FlinkToolHandler {
49
49
  environmentId,
50
50
  computePoolId,
51
51
  });
52
- // Step 1: Fetch the task graph to get human-readable task/operator names
53
52
  const pathBasedClient = wrapAsPathBasedClient(await clientManager.getFlinkRestClient(compute_pool_id, environment_id));
54
53
  const { data: taskGraphResponse, error: taskGraphError } = await pathBasedClient["/sql/v1/organizations/{organization_id}/environments/{environment_id}/statements/{statement_name}/task-graph"].GET({
55
54
  params: {
@@ -63,308 +62,29 @@ export class QueryProfilerHandler extends FlinkToolHandler {
63
62
  if (taskGraphError) {
64
63
  return this.createResponse(`Failed to get task graph: ${JSON.stringify(taskGraphError)}`, true);
65
64
  }
66
- // Parse the task graph (Graph field is JSON-encoded string)
67
- let taskGraph;
68
- try {
69
- const graphJson = taskGraphResponse?.Graph;
70
- if (!graphJson) {
71
- return this.createResponse("Task graph not available. The statement may not be running.", true);
72
- }
73
- taskGraph = JSON.parse(graphJson);
65
+ const parsed = parseTaskGraph(taskGraphResponse);
66
+ if ("errorMessage" in parsed) {
67
+ return this.createResponse(parsed.errorMessage, true);
74
68
  }
75
- catch {
76
- return this.createResponse("Failed to parse task graph.", true);
77
- }
78
- // Build task ID to name mapping
79
- const taskIdToInfo = new Map();
80
- for (const task of taskGraph.tasks) {
81
- taskIdToInfo.set(task.task_id, {
82
- name: task.task_name,
83
- operators: task.included_operators.map((op) => op.operator_name),
84
- inputs: task.input_tasks.map((t) => t.task_id),
85
- });
86
- }
87
- // Step 2: Query telemetry metrics per task
69
+ const taskMetrics = initializeTaskMetrics(parsed.tasks);
88
70
  const telemetryClient = clientManager.getConfluentCloudTelemetryRestClient();
89
71
  const now = new Date();
90
- const startTime = new Date(now.getTime() - intervalMinutes * 60 * 1000);
91
- // Metrics to query per task
92
- const metricsToQuery = [
93
- { metric: "io.confluent.flink/task/num_records_in", field: "recordsIn" },
94
- {
95
- metric: "io.confluent.flink/task/num_records_out",
96
- field: "recordsOut",
97
- },
98
- {
99
- metric: "io.confluent.flink/operator/state_size_bytes",
100
- field: "stateBytes",
101
- },
102
- {
103
- metric: "io.confluent.flink/task/busy_time_ms_per_second",
104
- field: "busyPercent",
105
- isPercent: true,
106
- },
107
- {
108
- metric: "io.confluent.flink/task/idle_time_ms_per_second",
109
- field: "idlePercent",
110
- isPercent: true,
111
- },
112
- {
113
- metric: "io.confluent.flink/task/backpressure_time_ms_per_second",
114
- field: "backpressurePercent",
115
- isPercent: true,
116
- },
117
- {
118
- metric: "io.confluent.flink/operator/current_input_watermark_ms",
119
- field: "inputWatermarkMs",
120
- },
121
- {
122
- metric: "io.confluent.flink/operator/current_output_watermark_ms",
123
- field: "outputWatermarkMs",
124
- },
125
- ];
126
- // Initialize task metrics
127
- const taskMetrics = new Map();
128
- for (const [taskId, info] of taskIdToInfo) {
129
- taskMetrics.set(taskId, {
130
- taskId,
131
- taskName: info.name,
132
- operators: info.operators,
133
- inputTasks: info.inputs.map((id) => taskIdToInfo.get(id)?.name || id),
134
- });
135
- }
136
- // Query each metric
137
- for (const { metric, field, isPercent } of metricsToQuery) {
138
- try {
139
- const response = (await telemetryClient.POST("/v2/metrics/{dataset}/query", {
140
- params: { path: { dataset: "cloud" } },
141
- body: {
142
- aggregations: [{ metric }],
143
- filter: {
144
- op: "AND",
145
- filters: [
146
- {
147
- field: "resource.flink_statement.name",
148
- op: "EQ",
149
- value: statementName,
150
- },
151
- {
152
- field: "resource.compute_pool.id",
153
- op: "EQ",
154
- value: compute_pool_id,
155
- },
156
- ],
157
- },
158
- granularity: "PT1M",
159
- intervals: [`${startTime.toISOString()}/${now.toISOString()}`],
160
- limit: 1000,
161
- group_by: ["metric.flink_task.id"],
162
- format: "GROUPED",
163
- },
164
- }));
165
- const data = response.data?.data;
166
- if (data) {
167
- for (const item of data) {
168
- const taskId = item["metric.flink_task.id"];
169
- const value = item.points?.[item.points.length - 1]?.value;
170
- if (taskId &&
171
- value !== undefined &&
172
- value > LONG_MIN_VALUE + 1000000) {
173
- const task = taskMetrics.get(taskId);
174
- if (task) {
175
- const finalValue = isPercent ? (value / 1000) * 100 : value;
176
- task[field] =
177
- finalValue;
178
- }
179
- }
180
- }
181
- }
182
- }
183
- catch {
184
- // Continue with other metrics
185
- }
186
- }
187
- // Step 3: Query statement-level summary metrics (no group_by)
188
- const summary = {};
189
- const summaryMetrics = [
190
- { metric: "io.confluent.flink/num_records_in", field: "recordsIn" },
191
- { metric: "io.confluent.flink/num_records_out", field: "recordsOut" },
192
- {
193
- metric: "io.confluent.flink/operator/state_size_bytes",
194
- field: "stateBytes",
195
- },
196
- {
197
- metric: "io.confluent.flink/current_input_watermark_milliseconds",
198
- field: "inputWatermarkMs",
199
- },
200
- {
201
- metric: "io.confluent.flink/current_output_watermark_milliseconds",
202
- field: "outputWatermarkMs",
203
- },
204
- {
205
- metric: "io.confluent.flink/statement_utilization/current_cfus",
206
- field: "cfus",
207
- },
208
- { metric: "io.confluent.flink/pending_records", field: "pendingRecords" },
209
- {
210
- metric: "io.confluent.flink/num_late_records_in",
211
- field: "numLateRecordsIn",
212
- },
213
- ];
214
- for (const { metric, field } of summaryMetrics) {
215
- try {
216
- const response = (await telemetryClient.POST("/v2/metrics/{dataset}/query", {
217
- params: { path: { dataset: "cloud" } },
218
- body: {
219
- aggregations: [{ metric }],
220
- filter: {
221
- op: "AND",
222
- filters: [
223
- {
224
- field: "resource.flink_statement.name",
225
- op: "EQ",
226
- value: statementName,
227
- },
228
- {
229
- field: "resource.compute_pool.id",
230
- op: "EQ",
231
- value: compute_pool_id,
232
- },
233
- ],
234
- },
235
- granularity: "PT1M",
236
- intervals: [`${startTime.toISOString()}/${now.toISOString()}`],
237
- limit: 1000,
238
- format: "GROUPED",
239
- },
240
- }));
241
- const data = response.data?.data;
242
- if (data && data.length > 0) {
243
- const firstEntry = data[0];
244
- const points = firstEntry?.points;
245
- if (points && points.length > 0) {
246
- const value = points[points.length - 1]?.value;
247
- if (value !== undefined && value > LONG_MIN_VALUE + 1000000) {
248
- summary[field] = value;
249
- }
250
- }
251
- }
252
- }
253
- catch {
254
- // Continue
255
- }
256
- }
257
- // Build the response
258
- const tasks = Array.from(taskMetrics.values()).map((task) => ({
259
- name: task.taskName,
260
- operators: task.operators,
261
- metrics: {
262
- recordsIn: task.recordsIn,
263
- recordsOut: task.recordsOut,
264
- stateBytes: task.stateBytes,
265
- busyPercent: task.busyPercent !== undefined
266
- ? `${task.busyPercent.toFixed(1)}%`
267
- : undefined,
268
- idlePercent: task.idlePercent !== undefined
269
- ? `${task.idlePercent.toFixed(1)}%`
270
- : undefined,
271
- backpressurePercent: task.backpressurePercent !== undefined
272
- ? `${task.backpressurePercent.toFixed(1)}%`
273
- : undefined,
274
- inputWatermark: task.inputWatermarkMs
275
- ? new Date(task.inputWatermarkMs).toISOString()
276
- : undefined,
277
- outputWatermark: task.outputWatermarkMs
278
- ? new Date(task.outputWatermarkMs).toISOString()
279
- : undefined,
280
- },
281
- }));
282
- // Analyze metrics for issues if requested
283
- const detectedIssues = [];
284
- if (includeAnalysis) {
285
- // Check per-task metrics for backpressure issues
286
- for (const task of taskMetrics.values()) {
287
- if (task.backpressurePercent !== undefined &&
288
- task.backpressurePercent > 50) {
289
- detectedIssues.push({
290
- type: "high_backpressure",
291
- severity: task.backpressurePercent > 80 ? "high" : "medium",
292
- description: `Task '${task.taskName}' has ${task.backpressurePercent.toFixed(1)}% backpressure.`,
293
- suggestion: "Downstream operators are slow. Consider increasing parallelism or optimizing sink performance.",
294
- taskName: task.taskName,
295
- });
296
- }
297
- }
298
- // Check consumer lag
299
- if (summary.pendingRecords !== undefined &&
300
- summary.pendingRecords > 100000) {
301
- detectedIssues.push({
302
- type: "high_consumer_lag",
303
- severity: summary.pendingRecords > 1000000 ? "high" : "medium",
304
- description: `High consumer lag: ${summary.pendingRecords.toLocaleString()} pending records.`,
305
- suggestion: "Statement is falling behind input rate. Consider increasing parallelism or CFUs.",
306
- });
307
- }
308
- // Check late data
309
- if (summary.numLateRecordsIn !== undefined &&
310
- summary.numLateRecordsIn > 0) {
311
- const severity = summary.numLateRecordsIn > 10000
312
- ? "high"
313
- : summary.numLateRecordsIn > 1000
314
- ? "medium"
315
- : "low";
316
- detectedIssues.push({
317
- type: "late_data",
318
- severity,
319
- description: `${summary.numLateRecordsIn.toLocaleString()} late records detected (arrived after watermark).`,
320
- suggestion: "Consider increasing watermark delay tolerance or investigating source timestamp issues.",
321
- });
322
- }
323
- // Check state size
324
- if (summary.stateBytes !== undefined) {
325
- const stateSizeGB = summary.stateBytes / (1024 * 1024 * 1024);
326
- if (stateSizeGB > 10) {
327
- detectedIssues.push({
328
- type: "large_state",
329
- severity: "medium",
330
- description: `Large state size: ${stateSizeGB.toFixed(2)} GB.`,
331
- suggestion: "Consider adding TTL to stateful operations or reviewing deduplication windows.",
332
- });
333
- }
334
- }
335
- // Check for idle with no throughput
336
- const allTasksIdle = Array.from(taskMetrics.values()).every((t) => t.idlePercent !== undefined && t.idlePercent > 90);
337
- if (allTasksIdle && summary.recordsIn === 0) {
338
- detectedIssues.push({
339
- type: "no_input_data",
340
- severity: "medium",
341
- description: "Statement is mostly idle with no input records.",
342
- suggestion: "Check if source topics have data. Verify topic names and connectivity.",
343
- });
344
- }
345
- }
72
+ const queryContext = {
73
+ statementName,
74
+ computePoolId: compute_pool_id,
75
+ startTime: new Date(now.getTime() - intervalMinutes * 60 * 1000),
76
+ now,
77
+ };
78
+ await collectPerTaskMetrics(telemetryClient, taskMetrics, queryContext);
79
+ const summary = await collectSummaryMetrics(telemetryClient, queryContext);
346
80
  const result = {
347
81
  statementName,
348
82
  intervalMinutes,
349
- summary: {
350
- recordsIn: summary.recordsIn,
351
- recordsOut: summary.recordsOut,
352
- stateBytes: summary.stateBytes,
353
- stateSizeMB: summary.stateBytes
354
- ? (summary.stateBytes / (1024 * 1024)).toFixed(2)
355
- : undefined,
356
- pendingRecords: summary.pendingRecords,
357
- inputWatermark: summary.inputWatermarkMs
358
- ? new Date(summary.inputWatermarkMs).toISOString()
359
- : undefined,
360
- outputWatermark: summary.outputWatermarkMs
361
- ? new Date(summary.outputWatermarkMs).toISOString()
362
- : undefined,
363
- cfus: summary.cfus,
364
- },
365
- tasks,
83
+ summary: buildSummaryView(summary),
84
+ tasks: Array.from(taskMetrics.values()).map(buildTaskView),
366
85
  };
367
86
  if (includeAnalysis) {
87
+ const detectedIssues = detectIssues(taskMetrics, summary);
368
88
  result.detectedIssues = detectedIssues;
369
89
  result.issueCount = detectedIssues.length;
370
90
  }
@@ -381,4 +101,339 @@ export class QueryProfilerHandler extends FlinkToolHandler {
381
101
  /** Overrides FlinkToolHandler: also requires a telemetry block because profiling fetches metrics from the Telemetry API in addition to the Flink REST API. */
382
102
  predicate = flinkWithTelemetryOrOAuth;
383
103
  }
104
+ /**
105
+ * Decode the JSON-encoded `Graph` field returned by the task-graph endpoint.
106
+ * Returns a caller-facing message rather than throwing so the handler can
107
+ * distinguish "statement not running" from "malformed payload".
108
+ */
109
+ function parseTaskGraph(taskGraphResponse) {
110
+ const graphJson = taskGraphResponse?.Graph;
111
+ if (!graphJson) {
112
+ return {
113
+ errorMessage: "Task graph not available. The statement may not be running.",
114
+ };
115
+ }
116
+ let decoded;
117
+ try {
118
+ decoded = JSON.parse(graphJson);
119
+ }
120
+ catch {
121
+ return { errorMessage: "Failed to parse task graph." };
122
+ }
123
+ const tasks = decoded?.tasks;
124
+ if (!Array.isArray(tasks)) {
125
+ return { errorMessage: "Task graph payload is missing its tasks array." };
126
+ }
127
+ return { tasks };
128
+ }
129
+ /**
130
+ * Seed one TaskMetricsData per task, resolving each input-task id to its
131
+ * human-readable name (falling back to the raw id when unknown).
132
+ */
133
+ function initializeTaskMetrics(tasks) {
134
+ const idToName = new Map();
135
+ for (const task of tasks) {
136
+ idToName.set(task.task_id, task.task_name);
137
+ }
138
+ const taskMetrics = new Map();
139
+ for (const task of tasks) {
140
+ taskMetrics.set(task.task_id, {
141
+ taskId: task.task_id,
142
+ taskName: task.task_name,
143
+ operators: task.included_operators.map((op) => op.operator_name),
144
+ inputTasks: task.input_tasks.map((t) => idToName.get(t.task_id) || t.task_id),
145
+ });
146
+ }
147
+ return taskMetrics;
148
+ }
149
+ const PER_TASK_METRICS = [
150
+ { metric: "io.confluent.flink/task/num_records_in", field: "recordsIn" },
151
+ { metric: "io.confluent.flink/task/num_records_out", field: "recordsOut" },
152
+ {
153
+ metric: "io.confluent.flink/operator/state_size_bytes",
154
+ field: "stateBytes",
155
+ },
156
+ {
157
+ metric: "io.confluent.flink/task/busy_time_ms_per_second",
158
+ field: "busyPercent",
159
+ isPercent: true,
160
+ },
161
+ {
162
+ metric: "io.confluent.flink/task/idle_time_ms_per_second",
163
+ field: "idlePercent",
164
+ isPercent: true,
165
+ },
166
+ {
167
+ metric: "io.confluent.flink/task/backpressure_time_ms_per_second",
168
+ field: "backpressurePercent",
169
+ isPercent: true,
170
+ },
171
+ {
172
+ metric: "io.confluent.flink/operator/current_input_watermark_ms",
173
+ field: "inputWatermarkMs",
174
+ },
175
+ {
176
+ metric: "io.confluent.flink/operator/current_output_watermark_ms",
177
+ field: "outputWatermarkMs",
178
+ },
179
+ ];
180
+ const SUMMARY_METRICS = [
181
+ { metric: "io.confluent.flink/num_records_in", field: "recordsIn" },
182
+ { metric: "io.confluent.flink/num_records_out", field: "recordsOut" },
183
+ {
184
+ metric: "io.confluent.flink/operator/state_size_bytes",
185
+ field: "stateBytes",
186
+ },
187
+ {
188
+ metric: "io.confluent.flink/current_input_watermark_milliseconds",
189
+ field: "inputWatermarkMs",
190
+ },
191
+ {
192
+ metric: "io.confluent.flink/current_output_watermark_milliseconds",
193
+ field: "outputWatermarkMs",
194
+ },
195
+ {
196
+ metric: "io.confluent.flink/statement_utilization/current_cfus",
197
+ field: "cfus",
198
+ },
199
+ { metric: "io.confluent.flink/pending_records", field: "pendingRecords" },
200
+ {
201
+ metric: "io.confluent.flink/num_late_records_in",
202
+ field: "numLateRecordsIn",
203
+ },
204
+ ];
205
+ /**
206
+ * POST a single-aggregation telemetry query filtered to one statement and
207
+ * compute pool, returning the grouped rows (empty when none). When
208
+ * `groupByTask` is set the rows carry a per-task id for task-level breakdown.
209
+ */
210
+ async function queryTelemetryMetric(telemetryClient, metric, ctx, groupByTask) {
211
+ const response = (await telemetryClient.POST("/v2/metrics/{dataset}/query", {
212
+ params: { path: { dataset: "cloud" } },
213
+ body: {
214
+ aggregations: [{ metric }],
215
+ filter: {
216
+ op: "AND",
217
+ filters: [
218
+ {
219
+ field: "resource.flink_statement.name",
220
+ op: "EQ",
221
+ value: ctx.statementName,
222
+ },
223
+ {
224
+ field: "resource.compute_pool.id",
225
+ op: "EQ",
226
+ value: ctx.computePoolId,
227
+ },
228
+ ],
229
+ },
230
+ granularity: "PT1M",
231
+ intervals: [`${ctx.startTime.toISOString()}/${ctx.now.toISOString()}`],
232
+ limit: 1000,
233
+ ...(groupByTask ? { group_by: ["metric.flink_task.id"] } : {}),
234
+ format: "GROUPED",
235
+ },
236
+ }));
237
+ return response.data?.data ?? [];
238
+ }
239
+ /** Query every per-task metric and fold each into `taskMetrics`. */
240
+ async function collectPerTaskMetrics(telemetryClient, taskMetrics, ctx) {
241
+ for (const spec of PER_TASK_METRICS) {
242
+ await collectPerTaskMetric(telemetryClient, taskMetrics, spec, ctx);
243
+ }
244
+ }
245
+ async function collectPerTaskMetric(telemetryClient, taskMetrics, spec, ctx) {
246
+ try {
247
+ const groups = await queryTelemetryMetric(telemetryClient, spec.metric, ctx, true);
248
+ for (const group of groups) {
249
+ applyPerTaskPoint(taskMetrics, spec, group);
250
+ }
251
+ }
252
+ catch {
253
+ // A single failing metric shouldn't abort the whole profile.
254
+ }
255
+ }
256
+ /**
257
+ * Fold one grouped telemetry row into its task, honoring the Long.MIN_VALUE
258
+ * "no watermark" sentinel and the ms/second → percent conversion.
259
+ */
260
+ function applyPerTaskPoint(taskMetrics, spec, group) {
261
+ const taskId = group["metric.flink_task.id"];
262
+ const value = lastPointValue(group.points);
263
+ if (!taskId || value === undefined || value <= LONG_MIN_VALUE + 1000000) {
264
+ return;
265
+ }
266
+ const task = taskMetrics.get(taskId);
267
+ if (!task) {
268
+ return;
269
+ }
270
+ task[spec.field] = spec.isPercent
271
+ ? (value / 1000) * 100
272
+ : value;
273
+ }
274
+ /** Query every statement-level metric (no group_by) into a fresh summary. */
275
+ async function collectSummaryMetrics(telemetryClient, ctx) {
276
+ const summary = {};
277
+ for (const spec of SUMMARY_METRICS) {
278
+ await collectSummaryMetric(telemetryClient, summary, spec, ctx);
279
+ }
280
+ return summary;
281
+ }
282
+ async function collectSummaryMetric(telemetryClient, summary, spec, ctx) {
283
+ try {
284
+ const groups = await queryTelemetryMetric(telemetryClient, spec.metric, ctx, false);
285
+ const value = lastPointValue(groups[0]?.points);
286
+ if (value === undefined || value <= LONG_MIN_VALUE + 1000000) {
287
+ return;
288
+ }
289
+ summary[spec.field] = value;
290
+ }
291
+ catch {
292
+ // A single failing metric shouldn't abort the whole profile.
293
+ }
294
+ }
295
+ /** Value of the last data point, or undefined when there are none. */
296
+ function lastPointValue(points) {
297
+ return points?.at(-1)?.value;
298
+ }
299
+ /**
300
+ * Shape one task's metrics for the response, formatting percentages and
301
+ * converting watermark epochs to ISO strings.
302
+ */
303
+ function buildTaskView(task) {
304
+ return {
305
+ name: task.taskName,
306
+ operators: task.operators,
307
+ metrics: {
308
+ recordsIn: task.recordsIn,
309
+ recordsOut: task.recordsOut,
310
+ stateBytes: task.stateBytes,
311
+ busyPercent: formatPercent(task.busyPercent),
312
+ idlePercent: formatPercent(task.idlePercent),
313
+ backpressurePercent: formatPercent(task.backpressurePercent),
314
+ inputWatermark: epochMsToIso(task.inputWatermarkMs),
315
+ outputWatermark: epochMsToIso(task.outputWatermarkMs),
316
+ },
317
+ };
318
+ }
319
+ /** Shape the statement-level summary for the response. */
320
+ function buildSummaryView(summary) {
321
+ return {
322
+ recordsIn: summary.recordsIn,
323
+ recordsOut: summary.recordsOut,
324
+ stateBytes: summary.stateBytes,
325
+ stateSizeMB: formatStateSizeMB(summary.stateBytes),
326
+ pendingRecords: summary.pendingRecords,
327
+ inputWatermark: epochMsToIso(summary.inputWatermarkMs),
328
+ outputWatermark: epochMsToIso(summary.outputWatermarkMs),
329
+ cfus: summary.cfus,
330
+ };
331
+ }
332
+ function formatPercent(value) {
333
+ if (value === undefined) {
334
+ return undefined;
335
+ }
336
+ return `${value.toFixed(1)}%`;
337
+ }
338
+ function formatStateSizeMB(bytes) {
339
+ if (bytes === undefined) {
340
+ return undefined;
341
+ }
342
+ return (bytes / (1024 * 1024)).toFixed(2);
343
+ }
344
+ function epochMsToIso(ms) {
345
+ if (ms === undefined) {
346
+ return undefined;
347
+ }
348
+ return new Date(ms).toISOString();
349
+ }
350
+ /** Run every metric-based issue detector and collect the ones that fired. */
351
+ function detectIssues(taskMetrics, summary) {
352
+ return [
353
+ ...detectBackpressure(taskMetrics),
354
+ detectConsumerLag(summary),
355
+ detectLateData(summary),
356
+ detectLargeState(summary),
357
+ detectNoInputData(taskMetrics, summary),
358
+ ].filter((issue) => issue !== undefined);
359
+ }
360
+ /** One issue per task spending >50% of its time backpressured. */
361
+ function detectBackpressure(taskMetrics) {
362
+ const issues = [];
363
+ for (const task of taskMetrics.values()) {
364
+ if (task.backpressurePercent === undefined ||
365
+ task.backpressurePercent <= 50) {
366
+ continue;
367
+ }
368
+ issues.push({
369
+ type: "high_backpressure",
370
+ severity: task.backpressurePercent > 80 ? "high" : "medium",
371
+ description: `Task '${task.taskName}' has ${task.backpressurePercent.toFixed(1)}% backpressure.`,
372
+ suggestion: "Downstream operators are slow. Consider increasing parallelism or optimizing sink performance.",
373
+ taskName: task.taskName,
374
+ });
375
+ }
376
+ return issues;
377
+ }
378
+ function detectConsumerLag(summary) {
379
+ if (summary.pendingRecords === undefined ||
380
+ summary.pendingRecords <= 100000) {
381
+ return undefined;
382
+ }
383
+ return {
384
+ type: "high_consumer_lag",
385
+ severity: summary.pendingRecords > 1000000 ? "high" : "medium",
386
+ description: `High consumer lag: ${summary.pendingRecords.toLocaleString()} pending records.`,
387
+ suggestion: "Statement is falling behind input rate. Consider increasing parallelism or CFUs.",
388
+ };
389
+ }
390
+ function detectLateData(summary) {
391
+ const lateRecords = summary.numLateRecordsIn;
392
+ if (lateRecords === undefined || lateRecords <= 0) {
393
+ return undefined;
394
+ }
395
+ return {
396
+ type: "late_data",
397
+ severity: lateDataSeverity(lateRecords),
398
+ description: `${lateRecords.toLocaleString()} late records detected (arrived after watermark).`,
399
+ suggestion: "Consider increasing watermark delay tolerance or investigating source timestamp issues.",
400
+ };
401
+ }
402
+ function lateDataSeverity(lateRecords) {
403
+ if (lateRecords > 10000) {
404
+ return "high";
405
+ }
406
+ if (lateRecords > 1000) {
407
+ return "medium";
408
+ }
409
+ return "low";
410
+ }
411
+ function detectLargeState(summary) {
412
+ if (summary.stateBytes === undefined) {
413
+ return undefined;
414
+ }
415
+ const stateSizeGB = summary.stateBytes / (1024 * 1024 * 1024);
416
+ if (stateSizeGB <= 10) {
417
+ return undefined;
418
+ }
419
+ return {
420
+ type: "large_state",
421
+ severity: "medium",
422
+ description: `Large state size: ${stateSizeGB.toFixed(2)} GB.`,
423
+ suggestion: "Consider adding TTL to stateful operations or reviewing deduplication windows.",
424
+ };
425
+ }
426
+ /** Fires when every task is >90% idle and no input records arrived. */
427
+ function detectNoInputData(taskMetrics, summary) {
428
+ const allTasksIdle = Array.from(taskMetrics.values()).every((t) => t.idlePercent !== undefined && t.idlePercent > 90);
429
+ if (!allTasksIdle || summary.recordsIn !== 0) {
430
+ return undefined;
431
+ }
432
+ return {
433
+ type: "no_input_data",
434
+ severity: "medium",
435
+ description: "Statement is mostly idle with no input records.",
436
+ suggestion: "Check if source topics have data. Verify topic names and connectivity.",
437
+ };
438
+ }
384
439
  //# sourceMappingURL=query-profiler-handler.js.map