@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.
- package/README.md +5 -3
- package/dist/build-config.d.ts +1 -0
- package/dist/build-config.d.ts.map +1 -1
- package/dist/build-config.js +1 -0
- package/dist/build-config.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +128 -94
- package/dist/cli.js.map +1 -1
- package/dist/confluent/base-client-manager.d.ts +1 -1
- package/dist/confluent/base-client-manager.d.ts.map +1 -1
- package/dist/confluent/base-client-manager.js +1 -1
- package/dist/confluent/base-client-manager.js.map +1 -1
- package/dist/confluent/client-manager.d.ts +1 -1
- package/dist/confluent/client-manager.d.ts.map +1 -1
- package/dist/confluent/direct-client-manager.d.ts +1 -1
- package/dist/confluent/direct-client-manager.d.ts.map +1 -1
- package/dist/confluent/middleware.d.ts +1 -1
- package/dist/confluent/middleware.d.ts.map +1 -1
- package/dist/confluent/node-deps.d.ts +8 -0
- package/dist/confluent/node-deps.d.ts.map +1 -1
- package/dist/confluent/node-deps.js +9 -2
- package/dist/confluent/node-deps.js.map +1 -1
- package/dist/confluent/oauth/pkce-login.d.ts.map +1 -1
- package/dist/confluent/oauth/pkce-login.js +180 -150
- package/dist/confluent/oauth/pkce-login.js.map +1 -1
- package/dist/confluent/oauth-client-manager.d.ts +1 -1
- package/dist/confluent/oauth-client-manager.d.ts.map +1 -1
- package/dist/confluent/schema-registry-helper.d.ts +20 -3
- package/dist/confluent/schema-registry-helper.d.ts.map +1 -1
- package/dist/confluent/schema-registry-helper.js +38 -4
- package/dist/confluent/schema-registry-helper.js.map +1 -1
- package/dist/confluent/schema.d.ts +2 -2
- package/dist/confluent/schema.d.ts.map +1 -1
- package/dist/confluent/sentry-redact.d.ts +5 -0
- package/dist/confluent/sentry-redact.d.ts.map +1 -0
- package/dist/confluent/sentry-redact.js +64 -0
- package/dist/confluent/sentry-redact.js.map +1 -0
- package/dist/confluent/sentry.d.ts +23 -0
- package/dist/confluent/sentry.d.ts.map +1 -0
- package/dist/confluent/sentry.js +68 -0
- package/dist/confluent/sentry.js.map +1 -0
- package/dist/confluent/tools/base-tools.d.ts +5 -4
- package/dist/confluent/tools/base-tools.d.ts.map +1 -1
- package/dist/confluent/tools/base-tools.js +2 -1
- package/dist/confluent/tools/base-tools.js.map +1 -1
- package/dist/confluent/tools/cluster-arg-resolvers.d.ts +2 -2
- package/dist/confluent/tools/cluster-arg-resolvers.d.ts.map +1 -1
- package/dist/confluent/tools/cluster-arg-resolvers.js +7 -6
- package/dist/confluent/tools/cluster-arg-resolvers.js.map +1 -1
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts +9 -3
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js +76 -61
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.d.ts +4 -3
- package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.js.map +1 -1
- package/dist/confluent/tools/handlers/catalog/create-topic-tags.d.ts +4 -3
- package/dist/confluent/tools/handlers/catalog/create-topic-tags.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/catalog/create-topic-tags.js.map +1 -1
- package/dist/confluent/tools/handlers/catalog/delete-tag.d.ts +4 -3
- package/dist/confluent/tools/handlers/catalog/delete-tag.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/catalog/delete-tag.js.map +1 -1
- package/dist/confluent/tools/handlers/catalog/list-tags.d.ts +4 -3
- package/dist/confluent/tools/handlers/catalog/list-tags.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/catalog/list-tags.js.map +1 -1
- package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.d.ts +4 -3
- package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.js.map +1 -1
- package/dist/confluent/tools/handlers/clusters/list-clusters-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/clusters/list-clusters-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/clusters/list-clusters-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/connect-tool-handler.d.ts +1 -1
- package/dist/confluent/tools/handlers/connect/connect-tool-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/create-connector-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/connect/create-connector-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/create-connector-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/delete-connector-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/connect/delete-connector-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/delete-connector-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/get-connector-config-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/connect/get-connector-config-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/get-connector-config-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/get-connector-error-recommendations-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/connect/get-connector-error-recommendations-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/get-connector-error-recommendations-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.js +1 -1
- package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.js +139 -93
- package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/get-connector-offsets-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/connect/get-connector-offsets-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/get-connector-offsets-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/get-connector-status-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/connect/get-connector-status-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/get-connector-status-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/get-connector-tasks-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/connect/get-connector-tasks-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/get-connector-tasks-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/list-connectors-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/connect/list-connectors-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/list-connectors-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/pause-connector-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/connect/pause-connector-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/pause-connector-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/restart-connector-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/connect/restart-connector-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/restart-connector-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/resume-connector-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/connect/resume-connector-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/resume-connector-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/update-connector-config-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/connect/update-connector-config-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/update-connector-config-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/diagnostics/config-help-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/diagnostics/config-help-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/diagnostics/config-help-handler.js +1 -1
- package/dist/confluent/tools/handlers/diagnostics/config-help-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/diagnostics/describe-configured-connection-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/diagnostics/describe-configured-connection-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/diagnostics/describe-configured-connection-handler.js +1 -1
- package/dist/confluent/tools/handlers/diagnostics/describe-configured-connection-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.js +1 -1
- package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/diagnostics/list-configured-connections-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/diagnostics/list-configured-connections-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/diagnostics/list-configured-connections-handler.js +1 -1
- package/dist/confluent/tools/handlers/diagnostics/list-configured-connections-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/docs/search-product-docs-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/docs/search-product-docs-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/docs/search-product-docs-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/environments/list-environments-handler.d.ts +9 -3
- package/dist/confluent/tools/handlers/environments/list-environments-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/environments/list-environments-handler.js +67 -45
- package/dist/confluent/tools/handlers/environments/list-environments-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/environments/read-environment-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/environments/read-environment-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/environments/read-environment-handler.js +1 -1
- package/dist/confluent/tools/handlers/environments/read-environment-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js +12 -6
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/flink-catalog-tool-handler.d.ts +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/flink-catalog-tool-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/create-flink-statement-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/flink/create-flink-statement-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/create-flink-statement-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/delete-flink-statement-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/flink/delete-flink-statement-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/delete-flink-statement-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.js +183 -138
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.d.ts +12 -8
- package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.js +346 -377
- package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.js +350 -295
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts +1 -1
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/flink-tool-handler.d.ts +1 -1
- package/dist/confluent/tools/handlers/flink/flink-tool-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/flink-tool-handler.js +2 -1
- package/dist/confluent/tools/handlers/flink/flink-tool-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/get-flink-statement-results-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/flink/get-flink-statement-results-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/get-flink-statement-results-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/list-compute-pools-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/flink/list-compute-pools-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/list-compute-pools-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/alter-topic-config.d.ts +4 -3
- package/dist/confluent/tools/handlers/kafka/alter-topic-config.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/alter-topic-config.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.d.ts +6 -5
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.js +82 -63
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/create-topics-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/kafka/create-topics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/create-topics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/delete-topics-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/kafka/delete-topics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/delete-topics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.js +5 -40
- package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.js +5 -9
- package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/get-partition-offsets-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/kafka/get-partition-offsets-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/get-partition-offsets-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/get-topic-config.d.ts +4 -3
- package/dist/confluent/tools/handlers/kafka/get-topic-config.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/get-topic-config.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/list-consumer-groups-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/kafka/list-consumer-groups-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/list-consumer-groups-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/list-topics-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/kafka/list-topics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/list-topics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/partition-watermarks.d.ts +1 -1
- package/dist/confluent/tools/handlers/kafka/partition-watermarks.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.d.ts +6 -5
- package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js +102 -57
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js +69 -53
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/metrics/telemetry-error.d.ts +9 -0
- package/dist/confluent/tools/handlers/metrics/telemetry-error.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/metrics/telemetry-error.js +38 -0
- package/dist/confluent/tools/handlers/metrics/telemetry-error.js.map +1 -0
- package/dist/confluent/tools/handlers/organizations/list-organizations-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/organizations/list-organizations-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/organizations/list-organizations-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/schema/create-schema-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/schema/create-schema-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/schema/create-schema-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.js +100 -71
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.d.ts +4 -3
- package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/create-tableflow-catalog-integration-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/tableflow/catalog/create-tableflow-catalog-integration-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/create-tableflow-catalog-integration-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/delete-tableflow-catalog-integration-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/tableflow/catalog/delete-tableflow-catalog-integration-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/delete-tableflow-catalog-integration-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/list-tableflow-catalog-integrations-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/tableflow/catalog/list-tableflow-catalog-integrations-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/list-tableflow-catalog-integrations-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/read-tableflow-catalog-integration-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/tableflow/catalog/read-tableflow-catalog-integration-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/read-tableflow-catalog-integration-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/update-tableflow-catalog-integration-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/tableflow/catalog/update-tableflow-catalog-integration-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/catalog/update-tableflow-catalog-integration-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.d.ts +1 -1
- package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/create-tableflow-topic-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/tableflow/topic/create-tableflow-topic-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/create-tableflow-topic-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/delete-tableflow-topic-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/tableflow/topic/delete-tableflow-topic-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/delete-tableflow-topic-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/list-tableflow-topics-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/tableflow/topic/list-tableflow-topics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/list-tableflow-topics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/read-tableflow-topic-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/tableflow/topic/read-tableflow-topic-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/read-tableflow-topic-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/update-tableflow-topic-handler.d.ts +3 -3
- package/dist/confluent/tools/handlers/tableflow/topic/update-tableflow-topic-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/topic/update-tableflow-topic-handler.js.map +1 -1
- package/dist/confluent/tools/pagination.d.ts +31 -0
- package/dist/confluent/tools/pagination.d.ts.map +1 -0
- package/dist/confluent/tools/pagination.js +40 -0
- package/dist/confluent/tools/pagination.js.map +1 -0
- package/dist/confluent/tools/tool-availability.d.ts +4 -4
- package/dist/confluent/tools/tool-availability.d.ts.map +1 -1
- package/dist/confluent/tools/tool-availability.js.map +1 -1
- package/dist/confluent/tools/tool-input-error.d.ts +17 -0
- package/dist/confluent/tools/tool-input-error.d.ts.map +1 -0
- package/dist/confluent/tools/tool-input-error.js +23 -0
- package/dist/confluent/tools/tool-input-error.js.map +1 -0
- package/dist/confluent/tools/tool-metadata-handler.d.ts +3 -2
- package/dist/confluent/tools/tool-metadata-handler.d.ts.map +1 -1
- package/dist/confluent/tools/tool-metadata-handler.js +1 -1
- package/dist/confluent/tools/tool-metadata-handler.js.map +1 -1
- package/dist/confluent/tools/tool-registry.d.ts +1 -1
- package/dist/confluent/tools/tool-registry.d.ts.map +1 -1
- package/dist/env.d.ts +1 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/logger.d.ts +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/mcp/server.d.ts +6 -4
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +11 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/transports/auth.d.ts +1 -1
- package/dist/mcp/transports/auth.d.ts.map +1 -1
- package/dist/mcp/transports/http.d.ts +3 -3
- package/dist/mcp/transports/http.d.ts.map +1 -1
- package/dist/mcp/transports/manager.d.ts +1 -1
- package/dist/mcp/transports/manager.d.ts.map +1 -1
- package/dist/mcp/transports/manager.js.map +1 -1
- package/dist/mcp/transports/ping.d.ts +1 -1
- package/dist/mcp/transports/ping.d.ts.map +1 -1
- package/dist/mcp/transports/server.d.ts +3 -3
- package/dist/mcp/transports/server.d.ts.map +1 -1
- package/dist/mcp/transports/server.js +1 -1
- package/dist/mcp/transports/server.js.map +1 -1
- package/dist/mcp/transports/sse.d.ts +3 -3
- package/dist/mcp/transports/sse.d.ts.map +1 -1
- package/dist/mcp/transports/stdio.d.ts +2 -2
- package/dist/mcp/transports/stdio.d.ts.map +1 -1
- package/dist/print-md-schema.js +21 -18
- package/dist/print-md-schema.js.map +1 -1
- package/dist/server-main.d.ts +8 -2
- package/dist/server-main.d.ts.map +1 -1
- package/dist/server-main.js +30 -3
- package/dist/server-main.js.map +1 -1
- package/dist/server-runtime.d.ts +3 -3
- package/dist/server-runtime.d.ts.map +1 -1
- package/package.json +6 -2
- package/dist/confluent/tools/handlers/kafka/topic-metadata.d.ts +0 -18
- package/dist/confluent/tools/handlers/kafka/topic-metadata.d.ts.map +0 -1
- package/dist/confluent/tools/handlers/kafka/topic-metadata.js +0 -18
- 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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
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
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
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
|