@mcp-consultant-tools/log-analytics 28.0.0 → 29.0.0-beta.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/build/cli/commands/function-commands.d.ts +7 -0
- package/build/cli/commands/function-commands.d.ts.map +1 -0
- package/build/cli/commands/function-commands.js +120 -0
- package/build/cli/commands/function-commands.js.map +1 -0
- package/build/cli/commands/index.d.ts +10 -0
- package/build/cli/commands/index.d.ts.map +1 -0
- package/build/cli/commands/index.js +15 -0
- package/build/cli/commands/index.js.map +1 -0
- package/build/cli/commands/query-commands.d.ts +7 -0
- package/build/cli/commands/query-commands.d.ts.map +1 -0
- package/build/cli/commands/query-commands.js +486 -0
- package/build/cli/commands/query-commands.js.map +1 -0
- package/build/cli/commands/workspace-commands.d.ts +7 -0
- package/build/cli/commands/workspace-commands.d.ts.map +1 -0
- package/build/cli/commands/workspace-commands.js +47 -0
- package/build/cli/commands/workspace-commands.js.map +1 -0
- package/build/cli/output.d.ts +11 -0
- package/build/cli/output.d.ts.map +1 -0
- package/build/cli/output.js +10 -0
- package/build/cli/output.js.map +1 -0
- package/build/cli.d.ts +9 -0
- package/build/cli.d.ts.map +1 -0
- package/build/cli.js +27 -0
- package/build/cli.js.map +1 -0
- package/build/context-factory.d.ts +4 -0
- package/build/context-factory.d.ts.map +1 -0
- package/build/context-factory.js +45 -0
- package/build/context-factory.js.map +1 -0
- package/build/index.d.ts +14 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +35 -1121
- package/build/index.js.map +1 -1
- package/build/prompts/index.d.ts +7 -0
- package/build/prompts/index.d.ts.map +1 -0
- package/build/prompts/index.js +6 -0
- package/build/prompts/index.js.map +1 -0
- package/build/prompts/templates.d.ts +3 -0
- package/build/prompts/templates.d.ts.map +1 -0
- package/build/prompts/templates.js +195 -0
- package/build/prompts/templates.js.map +1 -0
- package/build/services/index.d.ts +3 -0
- package/build/services/index.d.ts.map +1 -0
- package/build/services/index.js +2 -0
- package/build/services/index.js.map +1 -0
- package/build/services/log-analytics-service.d.ts +117 -0
- package/build/services/log-analytics-service.d.ts.map +1 -0
- package/build/services/log-analytics-service.js +419 -0
- package/build/services/log-analytics-service.js.map +1 -0
- package/build/tool-examples.d.ts +1 -8
- package/build/tool-examples.d.ts.map +1 -1
- package/build/tool-examples.js +1 -12
- package/build/tool-examples.js.map +1 -1
- package/build/tools/function-tools.d.ts +3 -0
- package/build/tools/function-tools.d.ts.map +1 -0
- package/build/tools/function-tools.js +536 -0
- package/build/tools/function-tools.js.map +1 -0
- package/build/tools/index.d.ts +9 -0
- package/build/tools/index.d.ts.map +1 -0
- package/build/tools/index.js +12 -0
- package/build/tools/index.js.map +1 -0
- package/build/tools/query-tools.d.ts +3 -0
- package/build/tools/query-tools.d.ts.map +1 -0
- package/build/tools/query-tools.js +105 -0
- package/build/tools/query-tools.js.map +1 -0
- package/build/tools/workspace-tools.d.ts +3 -0
- package/build/tools/workspace-tools.d.ts.map +1 -0
- package/build/tools/workspace-tools.js +53 -0
- package/build/tools/workspace-tools.js.map +1 -0
- package/build/types.d.ts +9 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query CLI Commands - 6 commands for KQL queries, log search, and investigation
|
|
3
|
+
*/
|
|
4
|
+
import { getGlobalFlags, handleCliError } from '@mcp-consultant-tools/core';
|
|
5
|
+
import { outputResult } from '../output.js';
|
|
6
|
+
import { formatTableAsMarkdown, filterColumns, resolveColumnPreset, } from '../../utils/loganalytics-formatters.js';
|
|
7
|
+
export function registerQueryCommands(program, ctx) {
|
|
8
|
+
const query = program.command('query').description('KQL query and log search operations');
|
|
9
|
+
query
|
|
10
|
+
.command('execute')
|
|
11
|
+
.description('Execute a custom KQL query against Log Analytics workspace')
|
|
12
|
+
.argument('<resourceId>', 'Resource ID')
|
|
13
|
+
.argument('<kql>', 'KQL query string')
|
|
14
|
+
.option('-t, --timespan <timespan>', 'Time range (e.g., PT1H, P1D)', 'PT1H')
|
|
15
|
+
.option('-p, --preset <preset>', 'Column preset: minimal, investigation, full')
|
|
16
|
+
.option('-c, --columns <columns>', 'Custom columns (comma-separated)')
|
|
17
|
+
.option('-f, --format <format>', 'Output format: json, markdown', 'json')
|
|
18
|
+
.action(async (resourceId, kql, opts) => {
|
|
19
|
+
try {
|
|
20
|
+
const result = await ctx.logAnalytics.executeQuery(resourceId, kql, opts.timespan);
|
|
21
|
+
// Apply column filtering
|
|
22
|
+
const columns = opts.columns ? opts.columns.split(',').map((c) => c.trim()) : undefined;
|
|
23
|
+
const columnsToInclude = resolveColumnPreset(opts.preset, columns);
|
|
24
|
+
const filteredTables = result.tables.map((t) => filterColumns(t, columnsToInclude));
|
|
25
|
+
const filteredResult = { ...result, tables: filteredTables };
|
|
26
|
+
// Format output
|
|
27
|
+
let data = filteredResult;
|
|
28
|
+
if (opts.format === 'markdown' && filteredTables.length > 0) {
|
|
29
|
+
data = filteredTables.map((t) => formatTableAsMarkdown(t)).join('\n\n');
|
|
30
|
+
}
|
|
31
|
+
const rowCount = filteredTables.reduce((acc, t) => acc + (t.rows?.length || 0), 0);
|
|
32
|
+
outputResult({ fileName: `query-${resourceId}`, data, summary: `Query returned ${rowCount} row(s)` }, getGlobalFlags(program));
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
handleCliError(error, 'execute query');
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
query
|
|
39
|
+
.command('recent')
|
|
40
|
+
.description('Get recent events from a specific Log Analytics table')
|
|
41
|
+
.argument('<resourceId>', 'Resource ID')
|
|
42
|
+
.argument('<tableName>', 'Table name (e.g., AppTraces, AppExceptions, FunctionAppLogs)')
|
|
43
|
+
.option('-t, --timespan <timespan>', 'Time range (e.g., PT1H, P1D)', 'PT1H')
|
|
44
|
+
.option('-l, --limit <n>', 'Maximum results', '100')
|
|
45
|
+
.option('-p, --preset <preset>', 'Column preset: minimal, investigation, full')
|
|
46
|
+
.option('-c, --columns <columns>', 'Custom columns (comma-separated)')
|
|
47
|
+
.option('-f, --format <format>', 'Output format: json, markdown', 'json')
|
|
48
|
+
.action(async (resourceId, tableName, opts) => {
|
|
49
|
+
try {
|
|
50
|
+
const result = await ctx.logAnalytics.getRecentEvents(resourceId, tableName, opts.timespan, parseInt(opts.limit));
|
|
51
|
+
const columns = opts.columns ? opts.columns.split(',').map((c) => c.trim()) : undefined;
|
|
52
|
+
const columnsToInclude = resolveColumnPreset(opts.preset, columns);
|
|
53
|
+
const filteredTables = result.tables.map((t) => filterColumns(t, columnsToInclude));
|
|
54
|
+
const filteredResult = { ...result, tables: filteredTables };
|
|
55
|
+
let data = filteredResult;
|
|
56
|
+
if (opts.format === 'markdown' && filteredTables.length > 0) {
|
|
57
|
+
data = filteredTables.map((t) => formatTableAsMarkdown(t)).join('\n\n');
|
|
58
|
+
}
|
|
59
|
+
const rowCount = filteredTables.reduce((acc, t) => acc + (t.rows?.length || 0), 0);
|
|
60
|
+
outputResult({ fileName: `recent-${resourceId}-${tableName}`, data, summary: `Found ${rowCount} recent event(s) in ${tableName}` }, getGlobalFlags(program));
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
handleCliError(error, 'get recent events');
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
query
|
|
67
|
+
.command('search')
|
|
68
|
+
.description('Search logs by text content across tables or a specific table')
|
|
69
|
+
.argument('<resourceId>', 'Resource ID')
|
|
70
|
+
.argument('<searchText>', 'Text to search for (case-insensitive)')
|
|
71
|
+
.option('--table <tableName>', 'Table name to search in (searches all if not specified)')
|
|
72
|
+
.option('-t, --timespan <timespan>', 'Time range (e.g., PT1H, P1D)', 'PT1H')
|
|
73
|
+
.option('-l, --limit <n>', 'Maximum results', '100')
|
|
74
|
+
.option('-p, --preset <preset>', 'Column preset: minimal, investigation, full')
|
|
75
|
+
.option('-c, --columns <columns>', 'Custom columns (comma-separated)')
|
|
76
|
+
.option('-f, --format <format>', 'Output format: json, markdown', 'json')
|
|
77
|
+
.action(async (resourceId, searchText, opts) => {
|
|
78
|
+
try {
|
|
79
|
+
const result = await ctx.logAnalytics.searchLogs(resourceId, searchText, opts.table, opts.timespan, parseInt(opts.limit));
|
|
80
|
+
const columns = opts.columns ? opts.columns.split(',').map((c) => c.trim()) : undefined;
|
|
81
|
+
const columnsToInclude = resolveColumnPreset(opts.preset, columns);
|
|
82
|
+
const filteredTables = result.tables.map((t) => filterColumns(t, columnsToInclude));
|
|
83
|
+
const filteredResult = { ...result, tables: filteredTables };
|
|
84
|
+
let data = filteredResult;
|
|
85
|
+
if (opts.format === 'markdown' && filteredTables.length > 0) {
|
|
86
|
+
data = filteredTables.map((t) => formatTableAsMarkdown(t)).join('\n\n');
|
|
87
|
+
}
|
|
88
|
+
const rowCount = filteredTables.reduce((acc, t) => acc + (t.rows?.length || 0), 0);
|
|
89
|
+
outputResult({ fileName: `search-${resourceId}-${searchText.replace(/\s+/g, '-')}`, data, summary: `Found ${rowCount} result(s) matching '${searchText}'` }, getGlobalFlags(program));
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
handleCliError(error, 'search logs');
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
query
|
|
96
|
+
.command('error-summary')
|
|
97
|
+
.description('Get aggregated error summary by type - ideal for starting investigations')
|
|
98
|
+
.argument('<resourceId>', 'Resource ID')
|
|
99
|
+
.option('-t, --timespan <timespan>', 'Time range (e.g., PT1H, P1D)', 'PT1H')
|
|
100
|
+
.option('--table <tableName>', 'Table to analyze: AppExceptions, AppTraces, FunctionAppLogs', 'AppExceptions')
|
|
101
|
+
.option('--min-count <n>', 'Minimum error count to include', '1')
|
|
102
|
+
.option('--no-deduplicate', 'Disable retry deduplication (grouped by OperationId by default)')
|
|
103
|
+
.option('-f, --format <format>', 'Output format: json, markdown', 'markdown')
|
|
104
|
+
.action(async (resourceId, opts) => {
|
|
105
|
+
try {
|
|
106
|
+
const table = opts.table || 'AppExceptions';
|
|
107
|
+
const timespanValue = opts.timespan || 'PT1H';
|
|
108
|
+
const minCountValue = parseInt(opts.minCount) || 1;
|
|
109
|
+
const dedupe = opts.deduplicate !== false;
|
|
110
|
+
let kql;
|
|
111
|
+
if (table === 'AppExceptions') {
|
|
112
|
+
if (dedupe) {
|
|
113
|
+
kql = `
|
|
114
|
+
AppExceptions
|
|
115
|
+
| summarize
|
|
116
|
+
RetryCount = count(),
|
|
117
|
+
FirstSeen = min(TimeGenerated),
|
|
118
|
+
LastSeen = max(TimeGenerated),
|
|
119
|
+
SampleMessage = take_any(OuterMessage)
|
|
120
|
+
by OperationId, ExceptionType, AppRoleName
|
|
121
|
+
| summarize
|
|
122
|
+
UniqueErrors = count(),
|
|
123
|
+
TotalRetries = sum(RetryCount),
|
|
124
|
+
FirstSeen = min(FirstSeen),
|
|
125
|
+
LastSeen = max(LastSeen),
|
|
126
|
+
SampleMessage = take_any(SampleMessage)
|
|
127
|
+
by ExceptionType, AppRoleName
|
|
128
|
+
| where UniqueErrors >= ${minCountValue}
|
|
129
|
+
| order by UniqueErrors desc
|
|
130
|
+
`;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
kql = `
|
|
134
|
+
AppExceptions
|
|
135
|
+
| summarize
|
|
136
|
+
Count = count(),
|
|
137
|
+
FirstSeen = min(TimeGenerated),
|
|
138
|
+
LastSeen = max(TimeGenerated),
|
|
139
|
+
SampleMessage = take_any(OuterMessage)
|
|
140
|
+
by ExceptionType, AppRoleName
|
|
141
|
+
| where Count >= ${minCountValue}
|
|
142
|
+
| order by Count desc
|
|
143
|
+
`;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else if (table === 'AppTraces') {
|
|
147
|
+
if (dedupe) {
|
|
148
|
+
kql = `
|
|
149
|
+
AppTraces
|
|
150
|
+
| where SeverityLevel >= 3
|
|
151
|
+
| summarize
|
|
152
|
+
RetryCount = count(),
|
|
153
|
+
FirstSeen = min(TimeGenerated),
|
|
154
|
+
LastSeen = max(TimeGenerated),
|
|
155
|
+
SampleMessage = take_any(Message)
|
|
156
|
+
by OperationId, AppRoleName, SeverityLevel
|
|
157
|
+
| summarize
|
|
158
|
+
UniqueErrors = count(),
|
|
159
|
+
TotalRetries = sum(RetryCount),
|
|
160
|
+
FirstSeen = min(FirstSeen),
|
|
161
|
+
LastSeen = max(LastSeen),
|
|
162
|
+
SampleMessage = take_any(SampleMessage)
|
|
163
|
+
by AppRoleName, SeverityLevel
|
|
164
|
+
| where UniqueErrors >= ${minCountValue}
|
|
165
|
+
| order by UniqueErrors desc
|
|
166
|
+
`;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
kql = `
|
|
170
|
+
AppTraces
|
|
171
|
+
| where SeverityLevel >= 3
|
|
172
|
+
| summarize
|
|
173
|
+
Count = count(),
|
|
174
|
+
FirstSeen = min(TimeGenerated),
|
|
175
|
+
LastSeen = max(TimeGenerated),
|
|
176
|
+
SampleMessage = take_any(Message)
|
|
177
|
+
by AppRoleName, SeverityLevel
|
|
178
|
+
| where Count >= ${minCountValue}
|
|
179
|
+
| order by Count desc
|
|
180
|
+
`;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
if (dedupe) {
|
|
185
|
+
kql = `
|
|
186
|
+
FunctionAppLogs
|
|
187
|
+
| where ExceptionDetails != ''
|
|
188
|
+
| summarize
|
|
189
|
+
RetryCount = count(),
|
|
190
|
+
FirstSeen = min(TimeGenerated),
|
|
191
|
+
LastSeen = max(TimeGenerated),
|
|
192
|
+
SampleMessage = take_any(Message)
|
|
193
|
+
by InvocationId, FunctionName
|
|
194
|
+
| summarize
|
|
195
|
+
UniqueErrors = count(),
|
|
196
|
+
TotalRetries = sum(RetryCount),
|
|
197
|
+
FirstSeen = min(FirstSeen),
|
|
198
|
+
LastSeen = max(LastSeen),
|
|
199
|
+
SampleMessage = take_any(SampleMessage)
|
|
200
|
+
by FunctionName
|
|
201
|
+
| where UniqueErrors >= ${minCountValue}
|
|
202
|
+
| order by UniqueErrors desc
|
|
203
|
+
`;
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
kql = `
|
|
207
|
+
FunctionAppLogs
|
|
208
|
+
| where ExceptionDetails != ''
|
|
209
|
+
| summarize
|
|
210
|
+
Count = count(),
|
|
211
|
+
FirstSeen = min(TimeGenerated),
|
|
212
|
+
LastSeen = max(TimeGenerated),
|
|
213
|
+
SampleMessage = take_any(Message)
|
|
214
|
+
by FunctionName
|
|
215
|
+
| where Count >= ${minCountValue}
|
|
216
|
+
| order by Count desc
|
|
217
|
+
`;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
const result = await ctx.logAnalytics.executeQuery(resourceId, kql, timespanValue);
|
|
221
|
+
const format = opts.format || 'markdown';
|
|
222
|
+
let data = result;
|
|
223
|
+
if (format === 'markdown' && result.tables && result.tables.length > 0) {
|
|
224
|
+
const dedupeNote = dedupe ? ' (deduplicated by OperationId)' : '';
|
|
225
|
+
data = `## Error Summary (${table})${dedupeNote}\n\n**Time range:** ${timespanValue}\n\n` +
|
|
226
|
+
result.tables.map((t) => formatTableAsMarkdown(t)).join('\n\n');
|
|
227
|
+
}
|
|
228
|
+
const rowCount = result.tables?.reduce((acc, t) => acc + (t.rows?.length || 0), 0) || 0;
|
|
229
|
+
outputResult({ fileName: `error-summary-${resourceId}`, data, summary: `Error summary: ${rowCount} error type(s) found in ${table}` }, getGlobalFlags(program));
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
handleCliError(error, 'get error summary');
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
query
|
|
236
|
+
.command('investigate-app')
|
|
237
|
+
.description('Combined investigation: exceptions + traces + recent errors (deduplicated)')
|
|
238
|
+
.argument('<resourceId>', 'Resource ID')
|
|
239
|
+
.option('--app-name <pattern>', 'Filter by app name (searches AppRoleName, partial match)')
|
|
240
|
+
.option('-t, --timespan <timespan>', 'Time range (e.g., PT1H, P1D)', 'PT1H')
|
|
241
|
+
.option('--no-details', 'Exclude recent error details')
|
|
242
|
+
.option('--details-limit <n>', 'Max recent errors to include', '20')
|
|
243
|
+
.option('--no-deduplicate', 'Disable retry deduplication (grouped by OperationId by default)')
|
|
244
|
+
.action(async (resourceId, opts) => {
|
|
245
|
+
try {
|
|
246
|
+
const timespanValue = opts.timespan || 'PT1H';
|
|
247
|
+
const showDetails = opts.details !== false;
|
|
248
|
+
const limit = parseInt(opts.detailsLimit) || 20;
|
|
249
|
+
const dedupe = opts.deduplicate !== false;
|
|
250
|
+
const appNamePattern = opts.appName;
|
|
251
|
+
const appFilter = appNamePattern
|
|
252
|
+
? `| where AppRoleName contains "${appNamePattern}"`
|
|
253
|
+
: '';
|
|
254
|
+
const exceptionSummaryQuery = dedupe ? `
|
|
255
|
+
AppExceptions
|
|
256
|
+
${appFilter}
|
|
257
|
+
| summarize
|
|
258
|
+
RetryCount = count(),
|
|
259
|
+
FirstSeen = min(TimeGenerated),
|
|
260
|
+
LastSeen = max(TimeGenerated)
|
|
261
|
+
by OperationId, ExceptionType, AppRoleName
|
|
262
|
+
| summarize
|
|
263
|
+
UniqueErrors = count(),
|
|
264
|
+
TotalRetries = sum(RetryCount),
|
|
265
|
+
FirstSeen = min(FirstSeen),
|
|
266
|
+
LastSeen = max(LastSeen)
|
|
267
|
+
by ExceptionType, AppRoleName
|
|
268
|
+
| order by UniqueErrors desc
|
|
269
|
+
| take 20
|
|
270
|
+
` : `
|
|
271
|
+
AppExceptions
|
|
272
|
+
${appFilter}
|
|
273
|
+
| summarize
|
|
274
|
+
Count = count(),
|
|
275
|
+
FirstSeen = min(TimeGenerated),
|
|
276
|
+
LastSeen = max(TimeGenerated)
|
|
277
|
+
by ExceptionType, AppRoleName
|
|
278
|
+
| order by Count desc
|
|
279
|
+
| take 20
|
|
280
|
+
`;
|
|
281
|
+
const traceSeverityQuery = dedupe ? `
|
|
282
|
+
AppTraces
|
|
283
|
+
${appFilter}
|
|
284
|
+
| summarize RetryCount = count() by OperationId, SeverityLevel, AppRoleName
|
|
285
|
+
| summarize UniqueTraces = count(), TotalCount = sum(RetryCount) by SeverityLevel, AppRoleName
|
|
286
|
+
| order by SeverityLevel desc
|
|
287
|
+
` : `
|
|
288
|
+
AppTraces
|
|
289
|
+
${appFilter}
|
|
290
|
+
| summarize Count = count() by SeverityLevel, AppRoleName
|
|
291
|
+
| order by SeverityLevel desc
|
|
292
|
+
`;
|
|
293
|
+
const recentErrorsQuery = showDetails ? (dedupe ? `
|
|
294
|
+
AppExceptions
|
|
295
|
+
${appFilter}
|
|
296
|
+
| summarize
|
|
297
|
+
TimeGenerated = max(TimeGenerated),
|
|
298
|
+
RetryCount = count(),
|
|
299
|
+
OuterMessage = take_any(OuterMessage)
|
|
300
|
+
by OperationId, AppRoleName, ExceptionType
|
|
301
|
+
| project TimeGenerated, AppRoleName, ExceptionType, OuterMessage, RetryCount
|
|
302
|
+
| order by TimeGenerated desc
|
|
303
|
+
| take ${limit}
|
|
304
|
+
` : `
|
|
305
|
+
AppExceptions
|
|
306
|
+
${appFilter}
|
|
307
|
+
| project TimeGenerated, AppRoleName, ExceptionType, OuterMessage
|
|
308
|
+
| order by TimeGenerated desc
|
|
309
|
+
| take ${limit}
|
|
310
|
+
`) : null;
|
|
311
|
+
const [exceptionSummary, traceSeverity, recentErrors] = await Promise.all([
|
|
312
|
+
ctx.logAnalytics.executeQuery(resourceId, exceptionSummaryQuery, timespanValue),
|
|
313
|
+
ctx.logAnalytics.executeQuery(resourceId, traceSeverityQuery, timespanValue),
|
|
314
|
+
recentErrorsQuery ? ctx.logAnalytics.executeQuery(resourceId, recentErrorsQuery, timespanValue) : null,
|
|
315
|
+
]);
|
|
316
|
+
let markdown = `# App Investigation Report\n\n`;
|
|
317
|
+
markdown += `**Filter:** ${appNamePattern || '(all apps)'}\n`;
|
|
318
|
+
markdown += `**Time range:** ${timespanValue}\n`;
|
|
319
|
+
markdown += dedupe ? `**Deduplication:** enabled (grouped by OperationId)\n\n` : '\n';
|
|
320
|
+
markdown += `## Exception Summary\n\n`;
|
|
321
|
+
if (exceptionSummary.tables && exceptionSummary.tables.length > 0 && exceptionSummary.tables[0].rows.length > 0) {
|
|
322
|
+
markdown += formatTableAsMarkdown(exceptionSummary.tables[0]);
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
markdown += '*No exceptions found*';
|
|
326
|
+
}
|
|
327
|
+
markdown += '\n\n';
|
|
328
|
+
markdown += `## Trace Severity Distribution\n\n`;
|
|
329
|
+
if (traceSeverity.tables && traceSeverity.tables.length > 0 && traceSeverity.tables[0].rows.length > 0) {
|
|
330
|
+
markdown += formatTableAsMarkdown(traceSeverity.tables[0]);
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
markdown += '*No traces found*';
|
|
334
|
+
}
|
|
335
|
+
markdown += '\n\n';
|
|
336
|
+
if (showDetails && recentErrors) {
|
|
337
|
+
markdown += `## Recent Errors (${limit} max)\n\n`;
|
|
338
|
+
if (recentErrors.tables && recentErrors.tables.length > 0 && recentErrors.tables[0].rows.length > 0) {
|
|
339
|
+
markdown += formatTableAsMarkdown(recentErrors.tables[0]);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
markdown += '*No recent errors*';
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
outputResult({ fileName: `investigate-app-${resourceId}`, data: markdown, summary: `App investigation report for '${appNamePattern || 'all apps'}' (${timespanValue})` }, getGlobalFlags(program));
|
|
346
|
+
}
|
|
347
|
+
catch (error) {
|
|
348
|
+
handleCliError(error, 'investigate app');
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
query
|
|
352
|
+
.command('investigate-sync')
|
|
353
|
+
.description('Investigate SmartConnectorCloud (SCC) sync failures. Auto-derives sync app from workspace ID.')
|
|
354
|
+
.argument('<resourceId>', 'Resource ID (e.g., log-dev-rtpi-uks-01)')
|
|
355
|
+
.option('-t, --timespan <timespan>', 'Time range (default: PT8H - typical work day)', 'PT8H')
|
|
356
|
+
.option('--no-details', 'Exclude recent error details')
|
|
357
|
+
.option('--details-limit <n>', 'Max recent errors to include', '10')
|
|
358
|
+
.action(async (resourceId, opts) => {
|
|
359
|
+
try {
|
|
360
|
+
const timespanValue = opts.timespan || 'PT8H';
|
|
361
|
+
const showDetails = opts.details !== false;
|
|
362
|
+
const limit = parseInt(opts.detailsLimit) || 10;
|
|
363
|
+
const match = resourceId.match(/^log-([^-]+)-([^-]+)/);
|
|
364
|
+
if (!match) {
|
|
365
|
+
console.error(`Could not parse environment/client from resourceId '${resourceId}'. Expected format: log-{environment}-{client}-...`);
|
|
366
|
+
process.exit(1);
|
|
367
|
+
}
|
|
368
|
+
const environment = match[1];
|
|
369
|
+
const client = match[2];
|
|
370
|
+
const syncAppPattern = `func-${environment}-${client}-sc-sync`;
|
|
371
|
+
const errorsByFunctionQuery = `
|
|
372
|
+
AppExceptions
|
|
373
|
+
| where AppRoleName contains "${syncAppPattern}"
|
|
374
|
+
| extend FunctionName = tostring(Properties.AzureFunctions_FunctionName)
|
|
375
|
+
| summarize
|
|
376
|
+
RetryCount = count(),
|
|
377
|
+
FirstSeen = min(TimeGenerated),
|
|
378
|
+
LastSeen = max(TimeGenerated),
|
|
379
|
+
SampleMessage = take_any(OuterMessage)
|
|
380
|
+
by OperationId, FunctionName, ExceptionType
|
|
381
|
+
| summarize
|
|
382
|
+
UniqueErrors = count(),
|
|
383
|
+
TotalRetries = sum(RetryCount),
|
|
384
|
+
FirstSeen = min(FirstSeen),
|
|
385
|
+
LastSeen = max(LastSeen),
|
|
386
|
+
SampleMessage = take_any(SampleMessage)
|
|
387
|
+
by FunctionName, ExceptionType
|
|
388
|
+
| order by UniqueErrors desc
|
|
389
|
+
`;
|
|
390
|
+
const errorCategoryQuery = `
|
|
391
|
+
AppExceptions
|
|
392
|
+
| where AppRoleName contains "${syncAppPattern}"
|
|
393
|
+
| extend ErrorCategory = case(
|
|
394
|
+
ExceptionType contains "FaultException" or ExceptionType contains "OrganizationService", "Dataverse",
|
|
395
|
+
ExceptionType contains "ServiceBus", "ServiceBus",
|
|
396
|
+
ExceptionType contains "Sql", "Database",
|
|
397
|
+
ExceptionType contains "Timeout", "Timeout",
|
|
398
|
+
ExceptionType contains "Socket" or ExceptionType contains "Http", "Network",
|
|
399
|
+
"Other"
|
|
400
|
+
)
|
|
401
|
+
| summarize
|
|
402
|
+
RetryCount = count(),
|
|
403
|
+
UniqueOps = dcount(OperationId)
|
|
404
|
+
by ErrorCategory
|
|
405
|
+
| order by UniqueOps desc
|
|
406
|
+
`;
|
|
407
|
+
const recentErrorsQuery = showDetails ? `
|
|
408
|
+
AppExceptions
|
|
409
|
+
| where AppRoleName contains "${syncAppPattern}"
|
|
410
|
+
| extend FunctionName = tostring(Properties.AzureFunctions_FunctionName)
|
|
411
|
+
| summarize
|
|
412
|
+
TimeGenerated = max(TimeGenerated),
|
|
413
|
+
RetryCount = count(),
|
|
414
|
+
OuterMessage = take_any(OuterMessage)
|
|
415
|
+
by OperationId, FunctionName, ExceptionType
|
|
416
|
+
| project TimeGenerated, FunctionName, ExceptionType, OuterMessage, RetryCount
|
|
417
|
+
| order by TimeGenerated desc
|
|
418
|
+
| take ${limit}
|
|
419
|
+
` : null;
|
|
420
|
+
const errorTracesQuery = `
|
|
421
|
+
AppTraces
|
|
422
|
+
| where AppRoleName contains "${syncAppPattern}"
|
|
423
|
+
| where SeverityLevel >= 3
|
|
424
|
+
| summarize
|
|
425
|
+
RetryCount = count()
|
|
426
|
+
by OperationId, Message
|
|
427
|
+
| summarize
|
|
428
|
+
UniqueErrors = count(),
|
|
429
|
+
TotalCount = sum(RetryCount)
|
|
430
|
+
by Message
|
|
431
|
+
| order by UniqueErrors desc
|
|
432
|
+
| take 10
|
|
433
|
+
`;
|
|
434
|
+
const [errorsByFunction, errorCategory, recentErrors, errorTraces] = await Promise.all([
|
|
435
|
+
ctx.logAnalytics.executeQuery(resourceId, errorsByFunctionQuery, timespanValue),
|
|
436
|
+
ctx.logAnalytics.executeQuery(resourceId, errorCategoryQuery, timespanValue),
|
|
437
|
+
recentErrorsQuery ? ctx.logAnalytics.executeQuery(resourceId, recentErrorsQuery, timespanValue) : null,
|
|
438
|
+
ctx.logAnalytics.executeQuery(resourceId, errorTracesQuery, timespanValue),
|
|
439
|
+
]);
|
|
440
|
+
let markdown = `# SmartConnector Sync Investigation\n\n`;
|
|
441
|
+
markdown += `**Environment:** ${environment}\n`;
|
|
442
|
+
markdown += `**Client:** ${client}\n`;
|
|
443
|
+
markdown += `**Sync App:** ${syncAppPattern}-*\n`;
|
|
444
|
+
markdown += `**Time range:** ${timespanValue}\n`;
|
|
445
|
+
markdown += `**Deduplication:** enabled (grouped by OperationId)\n\n`;
|
|
446
|
+
markdown += `## Error Categories\n\n`;
|
|
447
|
+
if (errorCategory.tables?.[0]?.rows?.length > 0) {
|
|
448
|
+
markdown += formatTableAsMarkdown(errorCategory.tables[0]);
|
|
449
|
+
}
|
|
450
|
+
else {
|
|
451
|
+
markdown += '*No errors found*';
|
|
452
|
+
}
|
|
453
|
+
markdown += '\n\n';
|
|
454
|
+
markdown += `## Errors by Sync Operation\n\n`;
|
|
455
|
+
if (errorsByFunction.tables?.[0]?.rows?.length > 0) {
|
|
456
|
+
markdown += formatTableAsMarkdown(errorsByFunction.tables[0]);
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
markdown += '*No errors found*';
|
|
460
|
+
}
|
|
461
|
+
markdown += '\n\n';
|
|
462
|
+
markdown += `## Error Traces (Severity 3+)\n\n`;
|
|
463
|
+
if (errorTraces.tables?.[0]?.rows?.length > 0) {
|
|
464
|
+
markdown += formatTableAsMarkdown(errorTraces.tables[0]);
|
|
465
|
+
}
|
|
466
|
+
else {
|
|
467
|
+
markdown += '*No error traces found*';
|
|
468
|
+
}
|
|
469
|
+
markdown += '\n\n';
|
|
470
|
+
if (showDetails && recentErrors) {
|
|
471
|
+
markdown += `## Recent Errors (${limit} max)\n\n`;
|
|
472
|
+
if (recentErrors.tables?.[0]?.rows?.length > 0) {
|
|
473
|
+
markdown += formatTableAsMarkdown(recentErrors.tables[0]);
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
markdown += '*No recent errors*';
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
outputResult({ fileName: `investigate-sync-${resourceId}`, data: markdown, summary: `SCC sync investigation for ${syncAppPattern}-* (${timespanValue})` }, getGlobalFlags(program));
|
|
480
|
+
}
|
|
481
|
+
catch (error) {
|
|
482
|
+
handleCliError(error, 'investigate sync');
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
//# sourceMappingURL=query-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-commands.js","sourceRoot":"","sources":["../../../src/cli/commands/query-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace CLI Commands - 3 commands for workspace management
|
|
3
|
+
*/
|
|
4
|
+
import type { Command } from 'commander';
|
|
5
|
+
import type { ServiceContext } from '../../context-factory.js';
|
|
6
|
+
export declare function registerWorkspaceCommands(program: Command, ctx: ServiceContext): void;
|
|
7
|
+
//# sourceMappingURL=workspace-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/workspace-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CA2CrF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace CLI Commands - 3 commands for workspace management
|
|
3
|
+
*/
|
|
4
|
+
import { getGlobalFlags, handleCliError } from '@mcp-consultant-tools/core';
|
|
5
|
+
import { outputResult } from '../output.js';
|
|
6
|
+
export function registerWorkspaceCommands(program, ctx) {
|
|
7
|
+
const workspace = program.command('workspace').description('Workspace operations');
|
|
8
|
+
workspace
|
|
9
|
+
.command('list')
|
|
10
|
+
.description('List all configured Log Analytics workspaces (active and inactive)')
|
|
11
|
+
.action(async () => {
|
|
12
|
+
try {
|
|
13
|
+
const resources = ctx.logAnalytics.getAllResources();
|
|
14
|
+
outputResult({ fileName: 'workspaces', data: resources, summary: `Found ${resources.length} configured workspace(s)` }, getGlobalFlags(program));
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
handleCliError(error, 'list workspaces');
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
workspace
|
|
21
|
+
.command('metadata')
|
|
22
|
+
.description('Get schema metadata (tables and columns) for a workspace')
|
|
23
|
+
.argument('<resourceId>', 'Resource ID (use workspace list to find IDs)')
|
|
24
|
+
.action(async (resourceId) => {
|
|
25
|
+
try {
|
|
26
|
+
const metadata = await ctx.logAnalytics.getMetadata(resourceId);
|
|
27
|
+
outputResult({ fileName: `metadata-${resourceId}`, data: metadata, summary: `Metadata for workspace '${resourceId}'` }, getGlobalFlags(program));
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
handleCliError(error, 'get metadata');
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
workspace
|
|
34
|
+
.command('test')
|
|
35
|
+
.description('Test access to a Log Analytics workspace')
|
|
36
|
+
.argument('<resourceId>', 'Resource ID')
|
|
37
|
+
.action(async (resourceId) => {
|
|
38
|
+
try {
|
|
39
|
+
const result = await ctx.logAnalytics.testWorkspaceAccess(resourceId);
|
|
40
|
+
outputResult({ fileName: `test-${resourceId}`, data: result, summary: result.success ? `Access OK: ${result.message}` : `Access FAILED: ${result.message}` }, getGlobalFlags(program));
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
handleCliError(error, 'test access');
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=workspace-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-commands.js","sourceRoot":"","sources":["../../../src/cli/commands/workspace-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,UAAU,yBAAyB,CAAC,OAAgB,EAAE,GAAmB;IAC7E,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAEnF,SAAS;SACN,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,oEAAoE,CAAC;SACjF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;YACrD,YAAY,CACV,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,SAAS,CAAC,MAAM,0BAA0B,EAAE,EACzG,cAAc,CAAC,OAAO,CAAC,CACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,cAAc,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEL,SAAS;SACN,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,0DAA0D,CAAC;SACvE,QAAQ,CAAC,cAAc,EAAE,8CAA8C,CAAC;SACxE,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YAChE,YAAY,CACV,EAAE,QAAQ,EAAE,YAAY,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,UAAU,GAAG,EAAE,EACzG,cAAc,CAAC,OAAO,CAAC,CACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEL,SAAS;SACN,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0CAA0C,CAAC;SACvD,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACtE,YAAY,CACV,EAAE,QAAQ,EAAE,QAAQ,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,kBAAkB,MAAM,CAAC,OAAO,EAAE,EAAE,EAC/I,cAAc,CAAC,OAAO,CAAC,CACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI output helper for log-analytics package.
|
|
3
|
+
* Thin wrapper setting the package-specific cache directory.
|
|
4
|
+
*/
|
|
5
|
+
import { type GlobalFlags } from '@mcp-consultant-tools/core';
|
|
6
|
+
export declare function outputResult(opts: {
|
|
7
|
+
fileName: string;
|
|
8
|
+
data: unknown;
|
|
9
|
+
summary: string;
|
|
10
|
+
}, flags: GlobalFlags): void;
|
|
11
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAoC,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAIhG,wBAAgB,YAAY,CAC1B,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAC1D,KAAK,EAAE,WAAW,GACjB,IAAI,CAEN"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI output helper for log-analytics package.
|
|
3
|
+
* Thin wrapper setting the package-specific cache directory.
|
|
4
|
+
*/
|
|
5
|
+
import { outputResult as coreOutputResult } from '@mcp-consultant-tools/core';
|
|
6
|
+
const CACHE_DIR = '.mcp-loganalytics-cache';
|
|
7
|
+
export function outputResult(opts, flags) {
|
|
8
|
+
coreOutputResult({ ...opts, cacheDir: CACHE_DIR }, flags);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAoB,MAAM,4BAA4B,CAAC;AAEhG,MAAM,SAAS,GAAG,yBAAyB,CAAC;AAE5C,MAAM,UAAU,YAAY,CAC1B,IAA0D,EAC1D,KAAkB;IAElB,gBAAgB,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;AAC5D,CAAC"}
|
package/build/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
|
package/build/cli.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @mcp-consultant-tools/log-analytics CLI
|
|
4
|
+
*
|
|
5
|
+
* Command-line interface for Azure Log Analytics operations.
|
|
6
|
+
* Reuses the same ServiceContext and services as the MCP server.
|
|
7
|
+
*/
|
|
8
|
+
import { createCliProgram, loadEnvForCli } from '@mcp-consultant-tools/core';
|
|
9
|
+
import { createServiceContext } from './context-factory.js';
|
|
10
|
+
import { registerAllCommands } from './cli/commands/index.js';
|
|
11
|
+
const program = createCliProgram({
|
|
12
|
+
name: 'mcp-loganalytics-cli',
|
|
13
|
+
description: 'Azure Log Analytics CLI - workspace queries and Azure Functions monitoring',
|
|
14
|
+
version: '27.0.0',
|
|
15
|
+
});
|
|
16
|
+
// Load env before parsing (--env-file handled by commander hook)
|
|
17
|
+
program.hook('preAction', (thisCommand) => {
|
|
18
|
+
const opts = thisCommand.opts();
|
|
19
|
+
loadEnvForCli(opts.envFile);
|
|
20
|
+
});
|
|
21
|
+
const ctx = createServiceContext();
|
|
22
|
+
registerAllCommands(program, ctx);
|
|
23
|
+
program.parseAsync(process.argv).catch((error) => {
|
|
24
|
+
console.error('CLI error:', error.message);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=cli.js.map
|