@confluentinc/mcp-confluent 1.0.6 → 1.2.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 +608 -297
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -0
- package/dist/cli.js.map +1 -1
- package/dist/confluent/client-manager.d.ts +9 -0
- package/dist/confluent/client-manager.d.ts.map +1 -1
- package/dist/confluent/client-manager.js +35 -4
- package/dist/confluent/client-manager.js.map +1 -1
- package/dist/confluent/middleware.d.ts +3 -2
- package/dist/confluent/middleware.d.ts.map +1 -1
- package/dist/confluent/middleware.js +9 -1
- package/dist/confluent/middleware.js.map +1 -1
- package/dist/confluent/node-deps.d.ts +60 -0
- package/dist/confluent/node-deps.d.ts.map +1 -0
- package/dist/confluent/node-deps.js +12 -0
- package/dist/confluent/node-deps.js.map +1 -0
- package/dist/confluent/telemetry.d.ts +18 -0
- package/dist/confluent/telemetry.d.ts.map +1 -0
- package/dist/confluent/telemetry.js +104 -0
- package/dist/confluent/telemetry.js.map +1 -0
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js +174 -0
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/clusters/list-clusters-handler.d.ts +7 -141
- package/dist/confluent/tools/handlers/clusters/list-clusters-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/environments/list-environments-handler.d.ts +8 -164
- package/dist/confluent/tools/handlers/environments/list-environments-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts +77 -0
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js +136 -0
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.js +111 -0
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.js +110 -0
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.js +74 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.js +81 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.js +90 -0
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.js +131 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/check-health-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.js +248 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.d.ts +88 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.js +443 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/metrics-helper.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.js +398 -0
- package/dist/confluent/tools/handlers/flink/diagnostics/query-profiler-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts +23 -0
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.js +133 -0
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.js.map +1 -0
- package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.js +72 -0
- package/dist/confluent/tools/handlers/flink/get-flink-exceptions-handler.js.map +1 -0
- 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 +20 -3
- package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.d.ts +6 -54
- 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 +1 -1
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/create-topics-handler.js +1 -1
- package/dist/confluent/tools/handlers/kafka/create-topics-handler.js.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/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/produce-kafka-message-handler.js +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 +11 -0
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js +193 -0
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts +11 -0
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js +224 -0
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts +10 -0
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.js +71 -0
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.js +1 -5
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.js.map +1 -1
- package/dist/confluent/tools/tool-factory.d.ts.map +1 -1
- package/dist/confluent/tools/tool-factory.js +26 -0
- package/dist/confluent/tools/tool-factory.js.map +1 -1
- package/dist/confluent/tools/tool-name.d.ts +14 -1
- package/dist/confluent/tools/tool-name.d.ts.map +1 -1
- package/dist/confluent/tools/tool-name.js +13 -0
- package/dist/confluent/tools/tool-name.js.map +1 -1
- package/dist/env-schema.d.ts +17 -62
- package/dist/env-schema.d.ts.map +1 -1
- package/dist/env-schema.js +37 -2
- package/dist/env-schema.js.map +1 -1
- package/dist/env.d.ts +8 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/index.js +67 -5
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +2 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +1 -1
- package/dist/logger.js.map +1 -1
- package/dist/mcp/transports/auth.d.ts +55 -0
- package/dist/mcp/transports/auth.d.ts.map +1 -0
- package/dist/mcp/transports/auth.js +127 -0
- package/dist/mcp/transports/auth.js.map +1 -0
- package/dist/mcp/transports/index.d.ts +1 -0
- package/dist/mcp/transports/index.d.ts.map +1 -1
- package/dist/mcp/transports/index.js +1 -0
- package/dist/mcp/transports/index.js.map +1 -1
- package/dist/mcp/transports/manager.d.ts +13 -1
- package/dist/mcp/transports/manager.d.ts.map +1 -1
- package/dist/mcp/transports/manager.js +20 -2
- package/dist/mcp/transports/manager.js.map +1 -1
- package/dist/mcp/transports/server.d.ts +10 -1
- package/dist/mcp/transports/server.d.ts.map +1 -1
- package/dist/mcp/transports/server.js +12 -2
- package/dist/mcp/transports/server.js.map +1 -1
- package/dist/print-md-schema.js +2 -2
- package/dist/print-md-schema.js.map +1 -1
- package/package.json +20 -9
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { getEnsuredParam } from "../../../../../confluent/helpers.js";
|
|
2
|
+
import { BaseToolHandler, } from "../../../../../confluent/tools/base-tools.js";
|
|
3
|
+
import { resolveCatalogName } from "../../../../../confluent/tools/handlers/flink/catalog/catalog-resolver.js";
|
|
4
|
+
import { executeFlinkSql } from "../../../../../confluent/tools/handlers/flink/flink-sql-helper.js";
|
|
5
|
+
import { ToolName } from "../../../../../confluent/tools/tool-name.js";
|
|
6
|
+
import env from "../../../../../env.js";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
const listTablesArguments = z.object({
|
|
9
|
+
baseUrl: z
|
|
10
|
+
.string()
|
|
11
|
+
.describe("The base URL of the Flink REST API.")
|
|
12
|
+
.url()
|
|
13
|
+
.default(() => env.FLINK_REST_ENDPOINT ?? "")
|
|
14
|
+
.optional(),
|
|
15
|
+
organizationId: z
|
|
16
|
+
.string()
|
|
17
|
+
.trim()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe("The unique identifier for the organization."),
|
|
20
|
+
environmentId: z
|
|
21
|
+
.string()
|
|
22
|
+
.trim()
|
|
23
|
+
.optional()
|
|
24
|
+
.describe("The unique identifier for the environment."),
|
|
25
|
+
computePoolId: z
|
|
26
|
+
.string()
|
|
27
|
+
.trim()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe("The id associated with the compute pool in context."),
|
|
30
|
+
catalogName: z
|
|
31
|
+
.string()
|
|
32
|
+
.trim()
|
|
33
|
+
.optional()
|
|
34
|
+
.describe("The Flink catalog name (environment ID, e.g., env-xxxxx). Omit to use defaults."),
|
|
35
|
+
databaseName: z
|
|
36
|
+
.string()
|
|
37
|
+
.trim()
|
|
38
|
+
.optional()
|
|
39
|
+
.describe("The database/schema name (Kafka cluster ID, e.g., lkc-xxxxx). Omit to list all tables across the catalog."),
|
|
40
|
+
});
|
|
41
|
+
export class ListTablesHandler extends BaseToolHandler {
|
|
42
|
+
async handle(clientManager, toolArguments) {
|
|
43
|
+
const { organizationId, environmentId, computePoolId, catalogName, databaseName, baseUrl, } = listTablesArguments.parse(toolArguments);
|
|
44
|
+
const organization_id = getEnsuredParam("FLINK_ORG_ID", "Organization ID is required", organizationId);
|
|
45
|
+
const environment_id = getEnsuredParam("FLINK_ENV_ID", "Environment ID is required", environmentId);
|
|
46
|
+
const compute_pool_id = getEnsuredParam("FLINK_COMPUTE_POOL_ID", "Compute Pool ID is required", computePoolId);
|
|
47
|
+
// Smart resolution: only accept env-* format, otherwise fall back to FLINK_ENV_ID
|
|
48
|
+
const catalog_name = resolveCatalogName(catalogName);
|
|
49
|
+
if (!catalog_name) {
|
|
50
|
+
return this.createResponse("Catalog name could not be resolved. Set FLINK_ENV_ID or provide a valid environment ID (env-xxxxx).", true);
|
|
51
|
+
}
|
|
52
|
+
// Note: databaseName parameter is currently unused - we fetch all tables and let the client filter
|
|
53
|
+
// This is because TABLE_SCHEMA may contain friendly names, not cluster IDs
|
|
54
|
+
void databaseName;
|
|
55
|
+
if (baseUrl !== undefined && baseUrl !== "") {
|
|
56
|
+
clientManager.setConfluentCloudFlinkEndpoint(baseUrl);
|
|
57
|
+
}
|
|
58
|
+
// Query INFORMATION_SCHEMA.TABLES for all tables
|
|
59
|
+
// Must fully qualify with catalog and use backticks per Confluent Cloud requirements
|
|
60
|
+
// Return all tables (excluding INFORMATION_SCHEMA) - client can filter by TABLE_SCHEMA as needed
|
|
61
|
+
const sql = `SELECT \`TABLE_CATALOG\`, \`TABLE_SCHEMA\`, \`TABLE_NAME\`, \`TABLE_TYPE\` FROM \`${catalog_name}\`.\`INFORMATION_SCHEMA\`.\`TABLES\` WHERE \`TABLE_SCHEMA\` <> 'INFORMATION_SCHEMA'`;
|
|
62
|
+
const result = await executeFlinkSql(clientManager, sql, {
|
|
63
|
+
organizationId: organization_id,
|
|
64
|
+
environmentId: environment_id,
|
|
65
|
+
computePoolId: compute_pool_id,
|
|
66
|
+
});
|
|
67
|
+
if (!result.success) {
|
|
68
|
+
return this.createResponse(`Failed to list tables: ${result.error}`, true);
|
|
69
|
+
}
|
|
70
|
+
const tables = result.data ?? [];
|
|
71
|
+
if (tables.length === 0) {
|
|
72
|
+
return this.createResponse(`No tables found in catalog '${catalog_name}'.`);
|
|
73
|
+
}
|
|
74
|
+
return this.createResponse(`Tables in catalog '${catalog_name}':\n${JSON.stringify(tables, null, 2)}`);
|
|
75
|
+
}
|
|
76
|
+
getToolConfig() {
|
|
77
|
+
return {
|
|
78
|
+
name: ToolName.LIST_FLINK_TABLES,
|
|
79
|
+
description: "List all tables in a Flink database via INFORMATION_SCHEMA.TABLES. Returns table names and types.",
|
|
80
|
+
inputSchema: listTablesArguments.shape,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
getRequiredEnvVars() {
|
|
84
|
+
return ["FLINK_API_KEY", "FLINK_API_SECRET"];
|
|
85
|
+
}
|
|
86
|
+
isConfluentCloudOnly() {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=list-tables-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-tables-handler.js","sourceRoot":"","sources":["../../../../../../src/confluent/tools/handlers/flink/catalog/list-tables-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ClientManager } from "../../../../../confluent/client-manager.js";
|
|
2
|
+
import { CallToolResult } from "../../../../../confluent/schema.js";
|
|
3
|
+
import { BaseToolHandler, ToolConfig } from "../../../../../confluent/tools/base-tools.js";
|
|
4
|
+
import { EnvVar } from "../../../../../env-schema.js";
|
|
5
|
+
export declare class CheckHealthHandler extends BaseToolHandler {
|
|
6
|
+
handle(clientManager: ClientManager, toolArguments: Record<string, unknown> | undefined): Promise<CallToolResult>;
|
|
7
|
+
getToolConfig(): ToolConfig;
|
|
8
|
+
getRequiredEnvVars(): EnvVar[];
|
|
9
|
+
isConfluentCloudOnly(): boolean;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=check-health-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-health-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/confluent/tools/handlers/flink/diagnostics/check-health-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EACL,eAAe,EACf,UAAU,EACX,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA+C5C,qBAAa,kBAAmB,SAAQ,eAAe;IAC/C,MAAM,CACV,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACjD,OAAO,CAAC,cAAc,CAAC;IAyH1B,aAAa,IAAI,UAAU;IAS3B,kBAAkB,IAAI,MAAM,EAAE;IAI9B,oBAAoB,IAAI,OAAO;CAGhC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { getEnsuredParam } from "../../../../../confluent/helpers.js";
|
|
2
|
+
import { BaseToolHandler, } from "../../../../../confluent/tools/base-tools.js";
|
|
3
|
+
import { ToolName } from "../../../../../confluent/tools/tool-name.js";
|
|
4
|
+
import env from "../../../../../env.js";
|
|
5
|
+
import { wrapAsPathBasedClient } from "openapi-fetch";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
const checkHealthArguments = z.object({
|
|
8
|
+
baseUrl: z
|
|
9
|
+
.string()
|
|
10
|
+
.describe("The base URL of the Flink REST API.")
|
|
11
|
+
.url()
|
|
12
|
+
.default(() => env.FLINK_REST_ENDPOINT ?? "")
|
|
13
|
+
.optional(),
|
|
14
|
+
organizationId: z
|
|
15
|
+
.string()
|
|
16
|
+
.trim()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("The unique identifier for the organization."),
|
|
19
|
+
environmentId: z
|
|
20
|
+
.string()
|
|
21
|
+
.trim()
|
|
22
|
+
.optional()
|
|
23
|
+
.describe("The unique identifier for the environment."),
|
|
24
|
+
statementName: z
|
|
25
|
+
.string()
|
|
26
|
+
.regex(new RegExp("[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*"))
|
|
27
|
+
.nonempty()
|
|
28
|
+
.max(100)
|
|
29
|
+
.describe("The name of the Flink SQL statement to check health for."),
|
|
30
|
+
});
|
|
31
|
+
export class CheckHealthHandler extends BaseToolHandler {
|
|
32
|
+
async handle(clientManager, toolArguments) {
|
|
33
|
+
const { statementName, environmentId, organizationId, baseUrl } = checkHealthArguments.parse(toolArguments);
|
|
34
|
+
const organization_id = getEnsuredParam("FLINK_ORG_ID", "Organization ID is required", organizationId);
|
|
35
|
+
const environment_id = getEnsuredParam("FLINK_ENV_ID", "Environment ID is required", environmentId);
|
|
36
|
+
if (baseUrl !== undefined && baseUrl !== "") {
|
|
37
|
+
clientManager.setConfluentCloudFlinkEndpoint(baseUrl);
|
|
38
|
+
}
|
|
39
|
+
const pathBasedClient = wrapAsPathBasedClient(clientManager.getConfluentCloudFlinkRestClient());
|
|
40
|
+
// Get statement status
|
|
41
|
+
const { data: statementData, error: statusError } = await pathBasedClient["/sql/v1/organizations/{organization_id}/environments/{environment_id}/statements/{statement_name}"].GET({
|
|
42
|
+
params: {
|
|
43
|
+
path: {
|
|
44
|
+
organization_id: organization_id,
|
|
45
|
+
environment_id: environment_id,
|
|
46
|
+
statement_name: statementName,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
if (statusError) {
|
|
51
|
+
return this.createResponse(`Failed to get statement status: ${JSON.stringify(statusError)}`, true);
|
|
52
|
+
}
|
|
53
|
+
// Get exceptions
|
|
54
|
+
const { data: exceptionsData } = await pathBasedClient["/sql/v1/organizations/{organization_id}/environments/{environment_id}/statements/{statement_name}/exceptions"].GET({
|
|
55
|
+
params: {
|
|
56
|
+
path: {
|
|
57
|
+
organization_id: organization_id,
|
|
58
|
+
environment_id: environment_id,
|
|
59
|
+
statement_name: statementName,
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
const phase = statementData?.status?.phase || "UNKNOWN";
|
|
64
|
+
const exceptions = exceptionsData?.data || [];
|
|
65
|
+
const latestException = exceptions[0];
|
|
66
|
+
// Determine health status
|
|
67
|
+
const health = {
|
|
68
|
+
status: "unknown",
|
|
69
|
+
phase,
|
|
70
|
+
message: "",
|
|
71
|
+
details: {
|
|
72
|
+
hasExceptions: exceptions.length > 0,
|
|
73
|
+
exceptionCount: exceptions.length,
|
|
74
|
+
latestException: latestException?.message,
|
|
75
|
+
statementSql: statementData?.spec?.statement,
|
|
76
|
+
computePoolId: statementData?.spec?.compute_pool_id,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
switch (phase) {
|
|
80
|
+
case "RUNNING":
|
|
81
|
+
if (exceptions.length > 0) {
|
|
82
|
+
health.status = "warning";
|
|
83
|
+
health.message = `Statement is running but has ${exceptions.length} recent exception(s). Latest: ${latestException?.message}`;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
health.status = "healthy";
|
|
87
|
+
health.message =
|
|
88
|
+
"Statement is running normally with no recent exceptions.";
|
|
89
|
+
}
|
|
90
|
+
break;
|
|
91
|
+
case "COMPLETED":
|
|
92
|
+
health.status = "healthy";
|
|
93
|
+
health.message = "Statement completed successfully.";
|
|
94
|
+
break;
|
|
95
|
+
case "FAILED":
|
|
96
|
+
health.status = "critical";
|
|
97
|
+
health.message = `Statement failed. ${statementData?.status?.detail || latestException?.message || "Check exceptions for details."}`;
|
|
98
|
+
break;
|
|
99
|
+
case "FAILING":
|
|
100
|
+
health.status = "critical";
|
|
101
|
+
health.message = `Statement is failing. ${latestException?.message || "Check exceptions for details."}`;
|
|
102
|
+
break;
|
|
103
|
+
case "STOPPED":
|
|
104
|
+
health.status = "warning";
|
|
105
|
+
health.message = "Statement has been stopped.";
|
|
106
|
+
break;
|
|
107
|
+
case "PENDING":
|
|
108
|
+
health.status = "warning";
|
|
109
|
+
health.message = "Statement is pending execution.";
|
|
110
|
+
break;
|
|
111
|
+
default:
|
|
112
|
+
health.status = "unknown";
|
|
113
|
+
health.message = `Statement is in ${phase} state.`;
|
|
114
|
+
}
|
|
115
|
+
return this.createResponse(`Health check for '${statementName}':\n${JSON.stringify(health, null, 2)}`);
|
|
116
|
+
}
|
|
117
|
+
getToolConfig() {
|
|
118
|
+
return {
|
|
119
|
+
name: ToolName.CHECK_FLINK_STATEMENT_HEALTH,
|
|
120
|
+
description: "Perform an aggregate health check for a Flink SQL statement. Returns status (healthy/warning/critical), current phase, recent exceptions, and diagnostic details.",
|
|
121
|
+
inputSchema: checkHealthArguments.shape,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
getRequiredEnvVars() {
|
|
125
|
+
return ["FLINK_API_KEY", "FLINK_API_SECRET"];
|
|
126
|
+
}
|
|
127
|
+
isConfluentCloudOnly() {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=check-health-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-health-handler.js","sourceRoot":"","sources":["../../../../../../src/confluent/tools/handlers/flink/diagnostics/check-health-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EACL,eAAe,GAEhB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAE7D,OAAO,GAAG,MAAM,aAAa,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,CAAC,qCAAqC,CAAC;SAC/C,GAAG,EAAE;SACL,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC;SAC5C,QAAQ,EAAE;IACb,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,IAAI,EAAE;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,6CAA6C,CAAC;IAC1D,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,IAAI,EAAE;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,4CAA4C,CAAC;IACzD,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,KAAK,CACJ,IAAI,MAAM,CACR,kEAAkE,CACnE,CACF;SACA,QAAQ,EAAE;SACV,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,CAAC,0DAA0D,CAAC;CACxE,CAAC,CAAC;AAeH,MAAM,OAAO,kBAAmB,SAAQ,eAAe;IACrD,KAAK,CAAC,MAAM,CACV,aAA4B,EAC5B,aAAkD;QAElD,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,GAC7D,oBAAoB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAE5C,MAAM,eAAe,GAAG,eAAe,CACrC,cAAc,EACd,6BAA6B,EAC7B,cAAc,CACf,CAAC;QACF,MAAM,cAAc,GAAG,eAAe,CACpC,cAAc,EACd,4BAA4B,EAC5B,aAAa,CACd,CAAC;QAEF,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YAC5C,aAAa,CAAC,8BAA8B,CAAC,OAAO,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,eAAe,GAAG,qBAAqB,CAC3C,aAAa,CAAC,gCAAgC,EAAE,CACjD,CAAC;QAEF,uBAAuB;QACvB,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,eAAe,CACvE,mGAAmG,CACpG,CAAC,GAAG,CAAC;YACJ,MAAM,EAAE;gBACN,IAAI,EAAE;oBACJ,eAAe,EAAE,eAAe;oBAChC,cAAc,EAAE,cAAc;oBAC9B,cAAc,EAAE,aAAa;iBAC9B;aACF;SACF,CAAC,CAAC;QAEH,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,cAAc,CACxB,mCAAmC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,EAChE,IAAI,CACL,CAAC;QACJ,CAAC;QAED,iBAAiB;QACjB,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,MAAM,eAAe,CACpD,8GAA8G,CAC/G,CAAC,GAAG,CAAC;YACJ,MAAM,EAAE;gBACN,IAAI,EAAE;oBACJ,eAAe,EAAE,eAAe;oBAChC,cAAc,EAAE,cAAc;oBAC9B,cAAc,EAAE,aAAa;iBAC9B;aACF;SACF,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,aAAa,EAAE,MAAM,EAAE,KAAK,IAAI,SAAS,CAAC;QACxD,MAAM,UAAU,GAAG,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC;QAC9C,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAEtC,0BAA0B;QAC1B,MAAM,MAAM,GAAiB;YAC3B,MAAM,EAAE,SAAS;YACjB,KAAK;YACL,OAAO,EAAE,EAAE;YACX,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC;gBACpC,cAAc,EAAE,UAAU,CAAC,MAAM;gBACjC,eAAe,EAAE,eAAe,EAAE,OAAO;gBACzC,YAAY,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS;gBAC5C,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe;aACpD;SACF,CAAC;QAEF,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,SAAS;gBACZ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;oBAC1B,MAAM,CAAC,OAAO,GAAG,gCAAgC,UAAU,CAAC,MAAM,iCAAiC,eAAe,EAAE,OAAO,EAAE,CAAC;gBAChI,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;oBAC1B,MAAM,CAAC,OAAO;wBACZ,0DAA0D,CAAC;gBAC/D,CAAC;gBACD,MAAM;YAER,KAAK,WAAW;gBACd,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC1B,MAAM,CAAC,OAAO,GAAG,mCAAmC,CAAC;gBACrD,MAAM;YAER,KAAK,QAAQ;gBACX,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC;gBAC3B,MAAM,CAAC,OAAO,GAAG,qBAAqB,aAAa,EAAE,MAAM,EAAE,MAAM,IAAI,eAAe,EAAE,OAAO,IAAI,+BAA+B,EAAE,CAAC;gBACrI,MAAM;YAER,KAAK,SAAS;gBACZ,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC;gBAC3B,MAAM,CAAC,OAAO,GAAG,yBAAyB,eAAe,EAAE,OAAO,IAAI,+BAA+B,EAAE,CAAC;gBACxG,MAAM;YAER,KAAK,SAAS;gBACZ,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC1B,MAAM,CAAC,OAAO,GAAG,6BAA6B,CAAC;gBAC/C,MAAM;YAER,KAAK,SAAS;gBACZ,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC1B,MAAM,CAAC,OAAO,GAAG,iCAAiC,CAAC;gBACnD,MAAM;YAER;gBACE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC1B,MAAM,CAAC,OAAO,GAAG,mBAAmB,KAAK,SAAS,CAAC;QACvD,CAAC;QAED,OAAO,IAAI,CAAC,cAAc,CACxB,qBAAqB,aAAa,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAC3E,CAAC;IACJ,CAAC;IAED,aAAa;QACX,OAAO;YACL,IAAI,EAAE,QAAQ,CAAC,4BAA4B;YAC3C,WAAW,EACT,mKAAmK;YACrK,WAAW,EAAE,oBAAoB,CAAC,KAAK;SACxC,CAAC;IACJ,CAAC;IAED,kBAAkB;QAChB,OAAO,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;IAC/C,CAAC;IAED,oBAAoB;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ClientManager } from "../../../../../confluent/client-manager.js";
|
|
2
|
+
import { CallToolResult } from "../../../../../confluent/schema.js";
|
|
3
|
+
import { BaseToolHandler, ToolConfig } from "../../../../../confluent/tools/base-tools.js";
|
|
4
|
+
import { EnvVar } from "../../../../../env-schema.js";
|
|
5
|
+
export declare class DetectIssuesHandler extends BaseToolHandler {
|
|
6
|
+
handle(clientManager: ClientManager, toolArguments: Record<string, unknown> | undefined): Promise<CallToolResult>;
|
|
7
|
+
getToolConfig(): ToolConfig;
|
|
8
|
+
getRequiredEnvVars(): EnvVar[];
|
|
9
|
+
isConfluentCloudOnly(): boolean;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=detect-issues-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-issues-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EACL,eAAe,EACf,UAAU,EACX,MAAM,oCAAoC,CAAC;AAM5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAoD5C,qBAAa,mBAAoB,SAAQ,eAAe;IAChD,MAAM,CACV,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACjD,OAAO,CAAC,cAAc,CAAC;IAyQ1B,aAAa,IAAI,UAAU;IAS3B,kBAAkB,IAAI,MAAM,EAAE;IAI9B,oBAAoB,IAAI,OAAO;CAGhC"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { getEnsuredParam } from "../../../../../confluent/helpers.js";
|
|
2
|
+
import { BaseToolHandler, } from "../../../../../confluent/tools/base-tools.js";
|
|
3
|
+
import { getStatementMetrics, analyzeMetrics, } from "../../../../../confluent/tools/handlers/flink/diagnostics/metrics-helper.js";
|
|
4
|
+
import { ToolName } from "../../../../../confluent/tools/tool-name.js";
|
|
5
|
+
import env from "../../../../../env.js";
|
|
6
|
+
import { wrapAsPathBasedClient } from "openapi-fetch";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
const detectIssuesArguments = z.object({
|
|
9
|
+
baseUrl: z
|
|
10
|
+
.string()
|
|
11
|
+
.describe("The base URL of the Flink REST API.")
|
|
12
|
+
.url()
|
|
13
|
+
.default(() => env.FLINK_REST_ENDPOINT ?? "")
|
|
14
|
+
.optional(),
|
|
15
|
+
organizationId: z
|
|
16
|
+
.string()
|
|
17
|
+
.trim()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe("The unique identifier for the organization."),
|
|
20
|
+
environmentId: z
|
|
21
|
+
.string()
|
|
22
|
+
.trim()
|
|
23
|
+
.optional()
|
|
24
|
+
.describe("The unique identifier for the environment."),
|
|
25
|
+
computePoolId: z
|
|
26
|
+
.string()
|
|
27
|
+
.trim()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe("The compute pool ID. Required for metrics analysis."),
|
|
30
|
+
statementName: z
|
|
31
|
+
.string()
|
|
32
|
+
.regex(new RegExp("[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*"))
|
|
33
|
+
.nonempty()
|
|
34
|
+
.max(100)
|
|
35
|
+
.describe("The name of the Flink SQL statement to detect issues for."),
|
|
36
|
+
includeMetrics: z
|
|
37
|
+
.boolean()
|
|
38
|
+
.default(true)
|
|
39
|
+
.describe("Include performance metrics analysis (backpressure, lag, etc.). Requires CONFLUENT_CLOUD_API_KEY."),
|
|
40
|
+
});
|
|
41
|
+
export class DetectIssuesHandler extends BaseToolHandler {
|
|
42
|
+
async handle(clientManager, toolArguments) {
|
|
43
|
+
const { statementName, environmentId, organizationId, computePoolId, baseUrl, includeMetrics, } = detectIssuesArguments.parse(toolArguments);
|
|
44
|
+
const organization_id = getEnsuredParam("FLINK_ORG_ID", "Organization ID is required", organizationId);
|
|
45
|
+
const environment_id = getEnsuredParam("FLINK_ENV_ID", "Environment ID is required", environmentId);
|
|
46
|
+
const compute_pool_id = computePoolId || env.FLINK_COMPUTE_POOL_ID;
|
|
47
|
+
if (baseUrl !== undefined && baseUrl !== "") {
|
|
48
|
+
clientManager.setConfluentCloudFlinkEndpoint(baseUrl);
|
|
49
|
+
}
|
|
50
|
+
const pathBasedClient = wrapAsPathBasedClient(clientManager.getConfluentCloudFlinkRestClient());
|
|
51
|
+
// Get statement status
|
|
52
|
+
const { data: statementData, error: statusError } = await pathBasedClient["/sql/v1/organizations/{organization_id}/environments/{environment_id}/statements/{statement_name}"].GET({
|
|
53
|
+
params: {
|
|
54
|
+
path: {
|
|
55
|
+
organization_id: organization_id,
|
|
56
|
+
environment_id: environment_id,
|
|
57
|
+
statement_name: statementName,
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
if (statusError) {
|
|
62
|
+
return this.createResponse(`Failed to get statement status: ${JSON.stringify(statusError)}`, true);
|
|
63
|
+
}
|
|
64
|
+
// Get exceptions
|
|
65
|
+
const { data: exceptionsData } = await pathBasedClient["/sql/v1/organizations/{organization_id}/environments/{environment_id}/statements/{statement_name}/exceptions"].GET({
|
|
66
|
+
params: {
|
|
67
|
+
path: {
|
|
68
|
+
organization_id: organization_id,
|
|
69
|
+
environment_id: environment_id,
|
|
70
|
+
statement_name: statementName,
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
const phase = statementData?.status?.phase || "UNKNOWN";
|
|
75
|
+
const detail = statementData?.status?.detail || "";
|
|
76
|
+
const exceptions = exceptionsData?.data || [];
|
|
77
|
+
const issues = [];
|
|
78
|
+
// Detect issues based on state
|
|
79
|
+
if (phase === "FAILED") {
|
|
80
|
+
issues.push({
|
|
81
|
+
type: "statement_failed",
|
|
82
|
+
severity: "critical",
|
|
83
|
+
description: `Statement has failed: ${detail}`,
|
|
84
|
+
suggestion: "Check the exceptions for root cause. Consider fixing the SQL or configuration and resubmitting.",
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
if (phase === "FAILING") {
|
|
88
|
+
issues.push({
|
|
89
|
+
type: "statement_failing",
|
|
90
|
+
severity: "high",
|
|
91
|
+
description: `Statement is in a failing state and may stop soon.${detail ? ` Detail: ${detail}` : ""}`,
|
|
92
|
+
suggestion: "Investigate exceptions immediately. The statement may recover or fail completely.",
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
if (phase === "DEGRADED") {
|
|
96
|
+
issues.push({
|
|
97
|
+
type: "statement_degraded",
|
|
98
|
+
severity: "high",
|
|
99
|
+
description: `Statement is in a degraded state: ${detail || "Performance may be impacted."}`,
|
|
100
|
+
suggestion: "This typically indicates an internal system issue. Contact Confluent support if the issue persists.",
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (phase === "STOPPED") {
|
|
104
|
+
issues.push({
|
|
105
|
+
type: "statement_stopped",
|
|
106
|
+
severity: "medium",
|
|
107
|
+
description: "Statement has been stopped.",
|
|
108
|
+
suggestion: "Resume the statement if processing should continue.",
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// Check for error details even when phase is RUNNING or other states
|
|
112
|
+
if (detail &&
|
|
113
|
+
phase !== "FAILED" &&
|
|
114
|
+
phase !== "DEGRADED" &&
|
|
115
|
+
phase !== "FAILING") {
|
|
116
|
+
// Only report if detail contains error-like keywords
|
|
117
|
+
const errorKeywords = [
|
|
118
|
+
"error",
|
|
119
|
+
"fail",
|
|
120
|
+
"issue",
|
|
121
|
+
"problem",
|
|
122
|
+
"attention",
|
|
123
|
+
"contact support",
|
|
124
|
+
];
|
|
125
|
+
const hasErrorKeyword = errorKeywords.some((keyword) => detail.toLowerCase().includes(keyword));
|
|
126
|
+
if (hasErrorKeyword) {
|
|
127
|
+
issues.push({
|
|
128
|
+
type: "status_warning",
|
|
129
|
+
severity: "medium",
|
|
130
|
+
description: `Status detail: ${detail}`,
|
|
131
|
+
suggestion: "Review the status message for potential issues.",
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Analyze exceptions for patterns
|
|
136
|
+
for (const exception of exceptions) {
|
|
137
|
+
const message = exception.message || "";
|
|
138
|
+
const name = exception.name || "";
|
|
139
|
+
// Common error patterns
|
|
140
|
+
if (message.includes("OutOfMemory") ||
|
|
141
|
+
name.includes("OutOfMemoryError")) {
|
|
142
|
+
issues.push({
|
|
143
|
+
type: "memory_issue",
|
|
144
|
+
severity: "high",
|
|
145
|
+
description: "Out of memory error detected.",
|
|
146
|
+
suggestion: "Consider increasing compute pool resources or optimizing the query to reduce state size.",
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
if (message.includes("timeout") || message.includes("Timeout")) {
|
|
150
|
+
issues.push({
|
|
151
|
+
type: "timeout",
|
|
152
|
+
severity: "medium",
|
|
153
|
+
description: `Timeout detected: ${message}`,
|
|
154
|
+
suggestion: "Check network connectivity and source/sink availability. Consider increasing timeout configurations.",
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
if (message.includes("serialization") ||
|
|
158
|
+
message.includes("Serialization")) {
|
|
159
|
+
issues.push({
|
|
160
|
+
type: "serialization_error",
|
|
161
|
+
severity: "high",
|
|
162
|
+
description: `Serialization error: ${message}`,
|
|
163
|
+
suggestion: "Check schema compatibility between source and sink. Ensure data types match expected formats.",
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
if (message.includes("permission") ||
|
|
167
|
+
message.includes("Permission") ||
|
|
168
|
+
message.includes("Access denied")) {
|
|
169
|
+
issues.push({
|
|
170
|
+
type: "permission_error",
|
|
171
|
+
severity: "high",
|
|
172
|
+
description: `Permission error: ${message}`,
|
|
173
|
+
suggestion: "Verify API keys and permissions for accessing Kafka topics and other resources.",
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
if (message.includes("not found") || message.includes("does not exist")) {
|
|
177
|
+
issues.push({
|
|
178
|
+
type: "resource_not_found",
|
|
179
|
+
severity: "high",
|
|
180
|
+
description: `Resource not found: ${message}`,
|
|
181
|
+
suggestion: "Verify that all referenced tables, topics, and databases exist.",
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Check for exception frequency (multiple exceptions indicate ongoing issues)
|
|
186
|
+
if (exceptions.length >= 5) {
|
|
187
|
+
issues.push({
|
|
188
|
+
type: "frequent_exceptions",
|
|
189
|
+
severity: "medium",
|
|
190
|
+
description: `High exception frequency: ${exceptions.length} exceptions in recent history.`,
|
|
191
|
+
suggestion: "The statement is experiencing repeated failures. Investigate the root cause before exceptions accumulate.",
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
// Query and analyze metrics if enabled and compute pool is available
|
|
195
|
+
let metricsSummary = "";
|
|
196
|
+
if (includeMetrics && compute_pool_id) {
|
|
197
|
+
const metricsResult = await getStatementMetrics(clientManager, {
|
|
198
|
+
statementName,
|
|
199
|
+
computePoolId: compute_pool_id,
|
|
200
|
+
intervalMinutes: 5,
|
|
201
|
+
});
|
|
202
|
+
if (metricsResult.success && metricsResult.metrics) {
|
|
203
|
+
const analysis = analyzeMetrics(metricsResult.metrics);
|
|
204
|
+
metricsSummary = analysis.summary;
|
|
205
|
+
// Add metrics-based issues
|
|
206
|
+
for (const metricsIssue of analysis.issues) {
|
|
207
|
+
issues.push(metricsIssue);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else if (metricsResult.error) {
|
|
211
|
+
// Include metrics error in response but don't fail the whole request
|
|
212
|
+
metricsSummary = `Metrics unavailable: ${metricsResult.error}`;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (issues.length === 0 && phase === "RUNNING") {
|
|
216
|
+
const msg = metricsSummary
|
|
217
|
+
? `No issues detected for statement '${statementName}'. Statement is running normally.\nMetrics: ${metricsSummary}`
|
|
218
|
+
: `No issues detected for statement '${statementName}'. Statement is running normally.`;
|
|
219
|
+
return this.createResponse(msg);
|
|
220
|
+
}
|
|
221
|
+
if (issues.length === 0) {
|
|
222
|
+
return this.createResponse(`No issues detected for statement '${statementName}'. Current phase: ${phase}`);
|
|
223
|
+
}
|
|
224
|
+
const response = {
|
|
225
|
+
statementName,
|
|
226
|
+
phase,
|
|
227
|
+
...(detail && { statusDetail: detail }),
|
|
228
|
+
issueCount: issues.length,
|
|
229
|
+
issues,
|
|
230
|
+
...(metricsSummary && { metricsSummary }),
|
|
231
|
+
};
|
|
232
|
+
return this.createResponse(`Detected ${issues.length} issue(s) for statement '${statementName}':\n${JSON.stringify(response, null, 2)}`);
|
|
233
|
+
}
|
|
234
|
+
getToolConfig() {
|
|
235
|
+
return {
|
|
236
|
+
name: ToolName.DETECT_FLINK_STATEMENT_ISSUES,
|
|
237
|
+
description: "Detect issues for a Flink SQL statement by analyzing status, exceptions, and performance metrics. Identifies problems like failures, backpressure, consumer lag, late data, memory issues, and provides suggested fixes.",
|
|
238
|
+
inputSchema: detectIssuesArguments.shape,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
getRequiredEnvVars() {
|
|
242
|
+
return ["FLINK_API_KEY", "FLINK_API_SECRET"];
|
|
243
|
+
}
|
|
244
|
+
isConfluentCloudOnly() {
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=detect-issues-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-issues-handler.js","sourceRoot":"","sources":["../../../../../../src/confluent/tools/handlers/flink/diagnostics/detect-issues-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { ClientManager } from "../../../../../confluent/client-manager.js";
|
|
2
|
+
/**
|
|
3
|
+
* Flink statement metrics from the Confluent Cloud Telemetry API.
|
|
4
|
+
* Based on: https://api.telemetry.confluent.cloud/docs/descriptors/datasets/cloud
|
|
5
|
+
*/
|
|
6
|
+
export interface TaskMetrics {
|
|
7
|
+
taskId: string;
|
|
8
|
+
numRecordsIn?: number;
|
|
9
|
+
numRecordsOut?: number;
|
|
10
|
+
numBytesIn?: number;
|
|
11
|
+
numBytesOut?: number;
|
|
12
|
+
backpressureTimeMsPerSecond?: number;
|
|
13
|
+
busyTimeMsPerSecond?: number;
|
|
14
|
+
idleTimeMsPerSecond?: number;
|
|
15
|
+
stateSizeBytes?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface SplitMetrics {
|
|
18
|
+
splitName: string;
|
|
19
|
+
currentWatermarkMs?: number;
|
|
20
|
+
watermarkActiveTimeMsPerSecond?: number;
|
|
21
|
+
watermarkPausedTimeMsPerSecond?: number;
|
|
22
|
+
watermarkIdleTimeMsPerSecond?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface FlinkStatementMetrics {
|
|
25
|
+
numRecordsIn?: number;
|
|
26
|
+
numRecordsOut?: number;
|
|
27
|
+
numRecordsInFromTopics?: number;
|
|
28
|
+
numRecordsInFromFiles?: number;
|
|
29
|
+
numBytesIn?: number;
|
|
30
|
+
numBytesOut?: number;
|
|
31
|
+
pendingRecords?: number;
|
|
32
|
+
backpressureTimeMsPerSecond?: number;
|
|
33
|
+
busyTimeMsPerSecond?: number;
|
|
34
|
+
idleTimeMsPerSecond?: number;
|
|
35
|
+
currentInputWatermarkMs?: number;
|
|
36
|
+
currentOutputWatermarkMs?: number;
|
|
37
|
+
watermarkLagMs?: number;
|
|
38
|
+
numLateRecordsIn?: number;
|
|
39
|
+
maxInputLatenessMs?: number;
|
|
40
|
+
currentCfus?: number;
|
|
41
|
+
cfuMinutesConsumed?: number;
|
|
42
|
+
stateSizeBytes?: number;
|
|
43
|
+
currentParallelism?: number;
|
|
44
|
+
maxParallelism?: number;
|
|
45
|
+
status?: string;
|
|
46
|
+
byTask?: TaskMetrics[];
|
|
47
|
+
bySplit?: SplitMetrics[];
|
|
48
|
+
}
|
|
49
|
+
export interface MetricDataPoint {
|
|
50
|
+
value: number;
|
|
51
|
+
timestamp: string;
|
|
52
|
+
}
|
|
53
|
+
export interface MetricQueryResult {
|
|
54
|
+
metric: string;
|
|
55
|
+
data: MetricDataPoint[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Query Flink statement metrics from the Confluent Cloud Telemetry API.
|
|
59
|
+
*
|
|
60
|
+
* @param clientManager - The client manager with telemetry client
|
|
61
|
+
* @param options - Query options
|
|
62
|
+
* @returns Aggregated metrics for the statement
|
|
63
|
+
*/
|
|
64
|
+
export declare function getStatementMetrics(clientManager: ClientManager, options: {
|
|
65
|
+
statementName: string;
|
|
66
|
+
computePoolId: string;
|
|
67
|
+
intervalMinutes?: number;
|
|
68
|
+
includeTaskBreakdown?: boolean;
|
|
69
|
+
includeSplitBreakdown?: boolean;
|
|
70
|
+
}): Promise<{
|
|
71
|
+
success: boolean;
|
|
72
|
+
metrics?: FlinkStatementMetrics;
|
|
73
|
+
error?: string;
|
|
74
|
+
}>;
|
|
75
|
+
/**
|
|
76
|
+
* Analyze metrics and return diagnostic insights.
|
|
77
|
+
*/
|
|
78
|
+
export declare function analyzeMetrics(metrics: FlinkStatementMetrics): {
|
|
79
|
+
issues: Array<{
|
|
80
|
+
type: string;
|
|
81
|
+
severity: "low" | "medium" | "high" | "critical";
|
|
82
|
+
description: string;
|
|
83
|
+
suggestion: string;
|
|
84
|
+
value?: number;
|
|
85
|
+
}>;
|
|
86
|
+
summary: string;
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=metrics-helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics-helper.d.ts","sourceRoot":"","sources":["../../../../../../src/confluent/tools/handlers/flink/diagnostics/metrics-helper.ts"],"names":[],"mappings":"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"}
|