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