@confluentinc/mcp-confluent 1.1.0 → 1.2.1
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 +507 -342
- package/dist/build-config.d.ts +2 -0
- package/dist/build-config.d.ts.map +1 -0
- package/dist/build-config.js +2 -0
- package/dist/build-config.js.map +1 -0
- 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 -2
- package/dist/confluent/middleware.js.map +1 -1
- package/dist/confluent/node-deps.d.ts +63 -0
- package/dist/confluent/node-deps.d.ts.map +1 -0
- package/dist/confluent/node-deps.js +14 -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 +101 -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/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.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 +7 -0
- 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 +7 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/index.js +67 -5
- package/dist/index.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/package.json +16 -7
|
@@ -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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"}
|