@jaypie/mcp 0.8.7 → 0.8.10
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 +0 -2
- package/dist/suites/datadog/datadog.js +6 -12
- package/dist/suites/datadog/datadog.js.map +1 -1
- package/dist/suites/datadog/help.md +1 -3
- package/dist/suites/docs/index.js +1 -1
- package/package.json +1 -1
- package/release-notes/constructs/1.2.39.md +11 -0
- package/release-notes/jaypie/1.2.28.md +9 -0
- package/release-notes/llm/1.2.21.md +13 -0
- package/release-notes/logger/1.2.9.md +23 -0
- package/release-notes/mcp/0.8.8.md +10 -0
- package/release-notes/mcp/0.8.9.md +9 -0
- package/skills/cdk.md +2 -0
- package/skills/cicd.md +9 -0
- package/skills/lambda.md +2 -0
- package/skills/mcp-datadog.md +0 -2
- package/skills/mcp.md +0 -2
- package/skills/migrations.md +4 -3
- package/skills/subpackage.md +13 -0
package/README.md
CHANGED
|
@@ -28,8 +28,6 @@ AWS tools use the host's existing credential chain:
|
|
|
28
28
|
| `DATADOG_API_KEY` or `DD_API_KEY` | Datadog API key |
|
|
29
29
|
| `DATADOG_APP_KEY` or `DD_APP_KEY` | Datadog Application key |
|
|
30
30
|
| `DD_ENV` | Default environment filter |
|
|
31
|
-
| `DD_SERVICE` | Default service filter |
|
|
32
|
-
| `DD_SOURCE` | Default log source (defaults to "lambda") |
|
|
33
31
|
| `DD_QUERY` | Default query terms appended to searches |
|
|
34
32
|
|
|
35
33
|
## MCP Tools
|
|
@@ -88,26 +88,20 @@ async function validateDatadogCredentials(credentials) {
|
|
|
88
88
|
*/
|
|
89
89
|
function buildDatadogQuery(options) {
|
|
90
90
|
const ddEnv = process.env.DD_ENV;
|
|
91
|
-
const ddService = process.env.DD_SERVICE;
|
|
92
|
-
const ddSource = process.env.DD_SOURCE;
|
|
93
91
|
const ddQuery = process.env.DD_QUERY;
|
|
94
92
|
const queryParts = [];
|
|
95
|
-
// Add source (parameter
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const effectiveSource = options.source || ddSource || (queryHasSource ? undefined : "lambda");
|
|
99
|
-
if (effectiveSource) {
|
|
100
|
-
queryParts.push(`source:${effectiveSource}`);
|
|
93
|
+
// Add source (parameter only, no env var default)
|
|
94
|
+
if (options.source) {
|
|
95
|
+
queryParts.push(`source:${options.source}`);
|
|
101
96
|
}
|
|
102
97
|
// Add env (parameter > env var)
|
|
103
98
|
const effectiveEnv = options.env || ddEnv;
|
|
104
99
|
if (effectiveEnv) {
|
|
105
100
|
queryParts.push(`env:${effectiveEnv}`);
|
|
106
101
|
}
|
|
107
|
-
// Add service (parameter
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
queryParts.push(`service:${effectiveService}`);
|
|
102
|
+
// Add service (parameter only, no env var default)
|
|
103
|
+
if (options.service) {
|
|
104
|
+
queryParts.push(`service:${options.service}`);
|
|
111
105
|
}
|
|
112
106
|
// Add base query from DD_QUERY if available
|
|
113
107
|
if (ddQuery) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datadog.js","sources":["../../../src/suites/datadog/datadog.ts"],"sourcesContent":["/**\n * Datadog API integration module\n */\nimport * as https from \"node:https\";\n\nexport interface DatadogCredentials {\n apiKey: string;\n appKey: string;\n}\n\nexport interface DatadogSearchOptions {\n query?: string;\n source?: string;\n env?: string;\n service?: string;\n from?: string;\n to?: string;\n limit?: number;\n sort?: \"timestamp\" | \"-timestamp\";\n}\n\nexport interface DatadogAnalyticsOptions {\n query?: string;\n source?: string;\n env?: string;\n service?: string;\n from?: string;\n to?: string;\n groupBy: string[];\n compute?: Array<{\n aggregation: \"count\" | \"avg\" | \"sum\" | \"min\" | \"max\" | \"cardinality\";\n metric?: string;\n }>;\n}\n\n// Monitors types\nexport interface DatadogMonitorsOptions {\n tags?: string[];\n monitorTags?: string[];\n name?: string;\n status?: (\"Alert\" | \"Warn\" | \"No Data\" | \"OK\")[];\n}\n\nexport interface DatadogMonitor {\n id: number;\n name: string;\n type: string;\n status: string;\n message?: string;\n tags: string[];\n priority?: number;\n query?: string;\n overallState?: string;\n}\n\nexport interface DatadogMonitorsResult {\n success: boolean;\n monitors: DatadogMonitor[];\n error?: string;\n}\n\n// Synthetics types\nexport interface DatadogSyntheticsOptions {\n tags?: string[];\n type?: \"api\" | \"browser\";\n}\n\nexport interface DatadogSyntheticTest {\n publicId: string;\n name: string;\n type: string;\n status: string;\n tags: string[];\n locations: string[];\n message?: string;\n}\n\nexport interface DatadogSyntheticResult {\n publicId: string;\n resultId: string;\n status: number;\n checkTime: number;\n passed: boolean;\n location?: string;\n}\n\nexport interface DatadogSyntheticsResult {\n success: boolean;\n tests: DatadogSyntheticTest[];\n error?: string;\n}\n\nexport interface DatadogSyntheticResultsResult {\n success: boolean;\n publicId: string;\n results: DatadogSyntheticResult[];\n error?: string;\n}\n\n// Metrics types\nexport interface DatadogMetricsOptions {\n query: string;\n from: number;\n to: number;\n}\n\nexport interface DatadogMetricSeries {\n metric: string;\n scope: string;\n pointlist: Array<[number, number | null]>;\n unit?: string;\n}\n\nexport interface DatadogMetricsResult {\n success: boolean;\n query: string;\n timeRange: { from: number; to: number };\n series: DatadogMetricSeries[];\n error?: string;\n}\n\n// RUM types\nexport interface DatadogRumOptions {\n query?: string;\n from?: string;\n to?: string;\n limit?: number;\n sort?: \"timestamp\" | \"-timestamp\";\n}\n\nexport interface DatadogRumEvent {\n id: string;\n type: string;\n timestamp?: string;\n sessionId?: string;\n viewUrl?: string;\n viewName?: string;\n errorMessage?: string;\n errorType?: string;\n attributes?: Record<string, unknown>;\n}\n\nexport interface DatadogRumResult {\n success: boolean;\n query: string;\n timeRange: { from: string; to: string };\n events: DatadogRumEvent[];\n error?: string;\n}\n\n// Validation types\nexport interface DatadogValidationResult {\n success: boolean;\n apiKey: { present: boolean; source: string | null };\n appKey: { present: boolean; source: string | null };\n}\n\nexport interface DatadogLogEntry {\n id: string;\n timestamp?: string;\n status?: string;\n service?: string;\n message?: string;\n attributes?: Record<string, unknown>;\n}\n\nexport interface DatadogSearchResult {\n success: boolean;\n query: string;\n timeRange: { from: string; to: string };\n logs: DatadogLogEntry[];\n error?: string;\n}\n\nexport interface DatadogAnalyticsBucket {\n by: Record<string, string>;\n computes: Record<string, number>;\n}\n\nexport interface DatadogAnalyticsResult {\n success: boolean;\n query: string;\n timeRange: { from: string; to: string };\n groupBy: string[];\n buckets: DatadogAnalyticsBucket[];\n error?: string;\n}\n\ninterface Logger {\n info: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\nconst nullLogger: Logger = {\n info: () => {},\n error: () => {},\n};\n\n/**\n * Get Datadog credentials from environment variables\n */\nexport function getDatadogCredentials(): DatadogCredentials | null {\n const apiKey = process.env.DATADOG_API_KEY || process.env.DD_API_KEY;\n const appKey =\n process.env.DATADOG_APP_KEY ||\n process.env.DATADOG_APPLICATION_KEY ||\n process.env.DD_APP_KEY ||\n process.env.DD_APPLICATION_KEY;\n\n if (!apiKey || !appKey) {\n return null;\n }\n\n return { apiKey, appKey };\n}\n\n/**\n * Validate Datadog setup without making API calls\n */\nexport function validateDatadogSetup(): DatadogValidationResult {\n const apiKeySource = process.env.DATADOG_API_KEY\n ? \"DATADOG_API_KEY\"\n : process.env.DD_API_KEY\n ? \"DD_API_KEY\"\n : null;\n\n const appKeySource = process.env.DATADOG_APP_KEY\n ? \"DATADOG_APP_KEY\"\n : process.env.DATADOG_APPLICATION_KEY\n ? \"DATADOG_APPLICATION_KEY\"\n : process.env.DD_APP_KEY\n ? \"DD_APP_KEY\"\n : process.env.DD_APPLICATION_KEY\n ? \"DD_APPLICATION_KEY\"\n : null;\n\n return {\n apiKey: { present: apiKeySource !== null, source: apiKeySource },\n appKey: { present: appKeySource !== null, source: appKeySource },\n success: apiKeySource !== null && appKeySource !== null,\n };\n}\n\n/**\n * Validate Datadog API credentials\n */\nexport async function validateDatadogCredentials(\n credentials: DatadogCredentials,\n): Promise<{ valid: boolean; error?: string }> {\n return new Promise((resolve) => {\n const options = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v1/validate\",\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(options, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n if (res.statusCode === 200) {\n resolve({ valid: true });\n } else {\n resolve({\n valid: false,\n error: `Datadog API returned status ${res.statusCode}: ${data}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n resolve({ valid: false, error: error.message });\n });\n\n req.end();\n });\n}\n\n/**\n * Build query string from environment variables and options\n */\nexport function buildDatadogQuery(options: DatadogSearchOptions): string {\n const ddEnv = process.env.DD_ENV;\n const ddService = process.env.DD_SERVICE;\n const ddSource = process.env.DD_SOURCE;\n const ddQuery = process.env.DD_QUERY;\n\n const queryParts: string[] = [];\n\n // Add source (parameter > env var > default 'lambda')\n // Skip default source if the query already contains a source: token\n const queryHasSource = options.query && /\\bsource:/.test(options.query);\n const effectiveSource =\n options.source || ddSource || (queryHasSource ? undefined : \"lambda\");\n if (effectiveSource) {\n queryParts.push(`source:${effectiveSource}`);\n }\n\n // Add env (parameter > env var)\n const effectiveEnv = options.env || ddEnv;\n if (effectiveEnv) {\n queryParts.push(`env:${effectiveEnv}`);\n }\n\n // Add service (parameter > env var)\n const effectiveService = options.service || ddService;\n if (effectiveService) {\n queryParts.push(`service:${effectiveService}`);\n }\n\n // Add base query from DD_QUERY if available\n if (ddQuery) {\n queryParts.push(ddQuery);\n }\n\n // Add user-provided query terms\n if (options.query) {\n queryParts.push(options.query);\n }\n\n return queryParts.join(\" \");\n}\n\n/**\n * Search Datadog logs\n */\nexport async function searchDatadogLogs(\n credentials: DatadogCredentials,\n options: DatadogSearchOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogSearchResult> {\n const effectiveQuery = buildDatadogQuery(options);\n const effectiveFrom = options.from || \"now-15m\";\n const effectiveTo = options.to || \"now\";\n const effectiveLimit = Math.min(options.limit || 50, 1000);\n const effectiveSort = options.sort || \"-timestamp\";\n\n logger.info(`Effective query: ${effectiveQuery}`);\n logger.info(\n `Search params: from=${effectiveFrom}, to=${effectiveTo}, limit=${effectiveLimit}, sort=${effectiveSort}`,\n );\n\n const requestBody = JSON.stringify({\n filter: {\n query: effectiveQuery,\n from: effectiveFrom,\n to: effectiveTo,\n },\n page: {\n limit: effectiveLimit,\n },\n sort: effectiveSort,\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v2/logs/events/search\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n \"Content-Length\": Buffer.byteLength(requestBody),\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 400) {\n errorMessage = `Invalid query syntax. Check your query: \"${effectiveQuery}\". Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have logs_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your query scope.\";\n }\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n data?: Array<{\n id: string;\n attributes?: {\n timestamp?: string;\n status?: string;\n service?: string;\n message?: string;\n attributes?: Record<string, unknown>;\n };\n }>;\n };\n\n const logs = (response.data || []).map((log) => {\n const attrs = log.attributes || {};\n return {\n id: log.id,\n timestamp: attrs.timestamp,\n status: attrs.status,\n service: attrs.service,\n message: attrs.message,\n attributes: attrs.attributes,\n };\n });\n\n logger.info(`Retrieved ${logs.length} log entries`);\n\n resolve({\n success: true,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs,\n });\n } catch (parseError) {\n logger.error(\"Failed to parse Datadog response:\", parseError);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.write(requestBody);\n req.end();\n });\n}\n\n/**\n * Aggregate Datadog logs using the Analytics API\n * Groups logs by specified fields and computes aggregations\n */\nexport async function aggregateDatadogLogs(\n credentials: DatadogCredentials,\n options: DatadogAnalyticsOptions,\n logger: Logger = nullLogger,\n): Promise<DatadogAnalyticsResult> {\n const effectiveQuery = buildDatadogQuery(options);\n const effectiveFrom = options.from || \"now-15m\";\n const effectiveTo = options.to || \"now\";\n const groupBy = options.groupBy;\n const compute = options.compute || [{ aggregation: \"count\" as const }];\n\n logger.info(`Analytics query: ${effectiveQuery}`);\n logger.info(`Group by: ${groupBy.join(\", \")}`);\n logger.info(`Time range: ${effectiveFrom} to ${effectiveTo}`);\n\n // Build compute array - each item needs aggregation and type\n const computeItems = compute.map((c) => {\n const item: {\n aggregation: string;\n type: string;\n metric?: string;\n } = {\n aggregation: c.aggregation,\n type: \"total\",\n };\n if (c.metric) {\n item.metric = c.metric;\n }\n return item;\n });\n\n // Build group_by with proper sort configuration\n const groupByItems = groupBy.map((field) => {\n const item: {\n facet: string;\n limit: number;\n sort: {\n type: string;\n order: string;\n aggregation?: string;\n };\n } = {\n facet: field,\n limit: 100,\n sort: {\n type: \"measure\",\n order: \"desc\",\n aggregation: compute[0]?.aggregation || \"count\",\n },\n };\n return item;\n });\n\n const requestBody = JSON.stringify({\n filter: {\n query: effectiveQuery,\n from: effectiveFrom,\n to: effectiveTo,\n },\n group_by: groupByItems,\n compute: computeItems,\n page: {\n limit: 100,\n },\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v2/logs/analytics/aggregate\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n \"Content-Length\": Buffer.byteLength(requestBody),\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Analytics API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 400) {\n errorMessage = `Invalid query or groupBy fields. Verify facet names exist: ${groupBy.join(\", \")}. Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have logs_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your query scope.\";\n }\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n data?: {\n buckets?: Array<{\n by?: Record<string, string>;\n computes?: Record<string, number>;\n }>;\n };\n };\n\n const buckets = (response.data?.buckets || []).map((bucket) => ({\n by: bucket.by || {},\n computes: bucket.computes || {},\n }));\n\n logger.info(`Retrieved ${buckets.length} aggregation buckets`);\n\n resolve({\n success: true,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog analytics response:\",\n parseError,\n );\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.write(requestBody);\n req.end();\n });\n}\n\n/**\n * List Datadog monitors with optional filtering\n */\nexport async function listDatadogMonitors(\n credentials: DatadogCredentials,\n options: DatadogMonitorsOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogMonitorsResult> {\n logger.info(\"Fetching Datadog monitors\");\n\n const queryParams = new URLSearchParams();\n\n if (options.tags && options.tags.length > 0) {\n queryParams.set(\"tags\", options.tags.join(\",\"));\n }\n if (options.monitorTags && options.monitorTags.length > 0) {\n queryParams.set(\"monitor_tags\", options.monitorTags.join(\",\"));\n }\n if (options.name) {\n queryParams.set(\"name\", options.name);\n }\n\n const queryString = queryParams.toString();\n const path = `/api/v1/monitor${queryString ? `?${queryString}` : \"\"}`;\n\n logger.info(`Request path: ${path}`);\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path,\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Monitors API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have monitors_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again.\";\n }\n resolve({\n success: false,\n monitors: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as Array<{\n id: number;\n name: string;\n type: string;\n overall_state?: string;\n message?: string;\n tags?: string[];\n priority?: number;\n query?: string;\n }>;\n\n let monitors = response.map((monitor) => ({\n id: monitor.id,\n name: monitor.name,\n type: monitor.type,\n status: monitor.overall_state || \"Unknown\",\n message: monitor.message,\n tags: monitor.tags || [],\n priority: monitor.priority,\n query: monitor.query,\n overallState: monitor.overall_state,\n }));\n\n // Filter by status if specified\n if (options.status && options.status.length > 0) {\n monitors = monitors.filter((m) =>\n options.status!.includes(\n m.status as \"Alert\" | \"Warn\" | \"No Data\" | \"OK\",\n ),\n );\n }\n\n logger.info(`Retrieved ${monitors.length} monitors`);\n\n resolve({\n success: true,\n monitors,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog monitors response:\",\n parseError,\n );\n resolve({\n success: false,\n monitors: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n monitors: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * List Datadog Synthetic tests\n */\nexport async function listDatadogSynthetics(\n credentials: DatadogCredentials,\n options: DatadogSyntheticsOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogSyntheticsResult> {\n logger.info(\"Fetching Datadog Synthetic tests\");\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v1/synthetics/tests\",\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Synthetics API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have synthetics_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again.\";\n }\n resolve({\n success: false,\n tests: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n tests?: Array<{\n public_id: string;\n name: string;\n type: string;\n status: string;\n tags?: string[];\n locations?: string[];\n message?: string;\n }>;\n };\n\n let tests = (response.tests || []).map((test) => ({\n publicId: test.public_id,\n name: test.name,\n type: test.type,\n status: test.status,\n tags: test.tags || [],\n locations: test.locations || [],\n message: test.message,\n }));\n\n // Filter by type if specified\n if (options.type) {\n tests = tests.filter((t) => t.type === options.type);\n }\n\n // Filter by tags if specified\n if (options.tags && options.tags.length > 0) {\n tests = tests.filter((t) =>\n options.tags!.some((tag) => t.tags.includes(tag)),\n );\n }\n\n logger.info(`Retrieved ${tests.length} synthetic tests`);\n\n resolve({\n success: true,\n tests,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog synthetics response:\",\n parseError,\n );\n resolve({\n success: false,\n tests: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n tests: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * Get recent results for a specific Synthetic test\n */\nexport async function getDatadogSyntheticResults(\n credentials: DatadogCredentials,\n publicId: string,\n logger: Logger = nullLogger,\n): Promise<DatadogSyntheticResultsResult> {\n logger.info(`Fetching results for Synthetic test: ${publicId}`);\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: `/api/v1/synthetics/tests/${publicId}/results`,\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(\n `Datadog Synthetics Results API error: ${res.statusCode}`,\n );\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have synthetics_read permission.\";\n } else if (res.statusCode === 404) {\n errorMessage = `Synthetic test '${publicId}' not found. Use datadog_synthetics (without testId) to list available tests.`;\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again.\";\n }\n resolve({\n success: false,\n publicId,\n results: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n results?: Array<{\n result_id: string;\n status: number;\n check_time: number;\n dc_id?: number;\n result?: {\n passed?: boolean;\n };\n }>;\n };\n\n const results = (response.results || []).map((result) => ({\n publicId,\n resultId: result.result_id,\n status: result.status,\n checkTime: result.check_time,\n passed: result.result?.passed ?? result.status === 0,\n location: result.dc_id?.toString(),\n }));\n\n logger.info(`Retrieved ${results.length} synthetic results`);\n\n resolve({\n success: true,\n publicId,\n results,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog synthetic results:\",\n parseError,\n );\n resolve({\n success: false,\n publicId,\n results: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n publicId,\n results: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * Query Datadog metrics\n */\nexport async function queryDatadogMetrics(\n credentials: DatadogCredentials,\n options: DatadogMetricsOptions,\n logger: Logger = nullLogger,\n): Promise<DatadogMetricsResult> {\n logger.info(`Querying metrics: ${options.query}`);\n logger.info(`Time range: ${options.from} to ${options.to}`);\n\n const queryParams = new URLSearchParams({\n query: options.query,\n from: options.from.toString(),\n to: options.to.toString(),\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: `/api/v1/query?${queryParams.toString()}`,\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Metrics API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 400) {\n errorMessage = `Invalid metric query. Check format: 'aggregation:metric.name{tags}'. Query: \"${options.query}\". Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have metrics_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your time range.\";\n }\n resolve({\n success: false,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n series?: Array<{\n metric: string;\n scope: string;\n pointlist: Array<[number, number | null]>;\n unit?: Array<{ name?: string }>;\n }>;\n };\n\n const series = (response.series || []).map((s) => ({\n metric: s.metric,\n scope: s.scope,\n pointlist: s.pointlist,\n unit: s.unit?.[0]?.name,\n }));\n\n logger.info(`Retrieved ${series.length} metric series`);\n\n resolve({\n success: true,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series,\n });\n } catch (parseError) {\n logger.error(\"Failed to parse Datadog metrics response:\", parseError);\n resolve({\n success: false,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * Search Datadog RUM events\n */\nexport async function searchDatadogRum(\n credentials: DatadogCredentials,\n options: DatadogRumOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogRumResult> {\n const effectiveQuery = options.query || \"*\";\n const effectiveFrom = options.from || \"now-15m\";\n const effectiveTo = options.to || \"now\";\n const effectiveLimit = Math.min(options.limit || 50, 1000);\n const effectiveSort = options.sort || \"-timestamp\";\n\n logger.info(`RUM query: ${effectiveQuery}`);\n logger.info(`Time range: ${effectiveFrom} to ${effectiveTo}`);\n\n const requestBody = JSON.stringify({\n filter: {\n query: effectiveQuery,\n from: effectiveFrom,\n to: effectiveTo,\n },\n page: {\n limit: effectiveLimit,\n },\n sort: effectiveSort,\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v2/rum/events/search\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n \"Content-Length\": Buffer.byteLength(requestBody),\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog RUM API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n // Check for specific \"No valid indexes\" error which means no RUM app is configured\n if (data.includes(\"No valid indexes\")) {\n errorMessage =\n \"No RUM application found. Ensure you have a RUM application configured in Datadog and it has collected data. \" +\n \"You can create a RUM application at https://app.datadoghq.com/rum/list\";\n } else if (res.statusCode === 400) {\n errorMessage = `Invalid RUM query. Check syntax: \"${effectiveQuery}\". Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have rum_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your query scope.\";\n }\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n data?: Array<{\n id: string;\n type: string;\n attributes?: {\n timestamp?: string;\n attributes?: {\n session?: { id?: string };\n view?: { url?: string; name?: string };\n error?: { message?: string; type?: string };\n [key: string]: unknown;\n };\n };\n }>;\n };\n\n const events = (response.data || []).map((event) => {\n const attrs = event.attributes?.attributes || {};\n return {\n id: event.id,\n type: event.type,\n timestamp: event.attributes?.timestamp,\n sessionId: attrs.session?.id,\n viewUrl: attrs.view?.url,\n viewName: attrs.view?.name,\n errorMessage: attrs.error?.message,\n errorType: attrs.error?.type,\n attributes: attrs,\n };\n });\n\n logger.info(`Retrieved ${events.length} RUM events`);\n\n resolve({\n success: true,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events,\n });\n } catch (parseError) {\n logger.error(\"Failed to parse Datadog RUM response:\", parseError);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.write(requestBody);\n req.end();\n });\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"datadog.js","sources":["../../../src/suites/datadog/datadog.ts"],"sourcesContent":["/**\n * Datadog API integration module\n */\nimport * as https from \"node:https\";\n\nexport interface DatadogCredentials {\n apiKey: string;\n appKey: string;\n}\n\nexport interface DatadogSearchOptions {\n query?: string;\n source?: string;\n env?: string;\n service?: string;\n from?: string;\n to?: string;\n limit?: number;\n sort?: \"timestamp\" | \"-timestamp\";\n}\n\nexport interface DatadogAnalyticsOptions {\n query?: string;\n source?: string;\n env?: string;\n service?: string;\n from?: string;\n to?: string;\n groupBy: string[];\n compute?: Array<{\n aggregation: \"count\" | \"avg\" | \"sum\" | \"min\" | \"max\" | \"cardinality\";\n metric?: string;\n }>;\n}\n\n// Monitors types\nexport interface DatadogMonitorsOptions {\n tags?: string[];\n monitorTags?: string[];\n name?: string;\n status?: (\"Alert\" | \"Warn\" | \"No Data\" | \"OK\")[];\n}\n\nexport interface DatadogMonitor {\n id: number;\n name: string;\n type: string;\n status: string;\n message?: string;\n tags: string[];\n priority?: number;\n query?: string;\n overallState?: string;\n}\n\nexport interface DatadogMonitorsResult {\n success: boolean;\n monitors: DatadogMonitor[];\n error?: string;\n}\n\n// Synthetics types\nexport interface DatadogSyntheticsOptions {\n tags?: string[];\n type?: \"api\" | \"browser\";\n}\n\nexport interface DatadogSyntheticTest {\n publicId: string;\n name: string;\n type: string;\n status: string;\n tags: string[];\n locations: string[];\n message?: string;\n}\n\nexport interface DatadogSyntheticResult {\n publicId: string;\n resultId: string;\n status: number;\n checkTime: number;\n passed: boolean;\n location?: string;\n}\n\nexport interface DatadogSyntheticsResult {\n success: boolean;\n tests: DatadogSyntheticTest[];\n error?: string;\n}\n\nexport interface DatadogSyntheticResultsResult {\n success: boolean;\n publicId: string;\n results: DatadogSyntheticResult[];\n error?: string;\n}\n\n// Metrics types\nexport interface DatadogMetricsOptions {\n query: string;\n from: number;\n to: number;\n}\n\nexport interface DatadogMetricSeries {\n metric: string;\n scope: string;\n pointlist: Array<[number, number | null]>;\n unit?: string;\n}\n\nexport interface DatadogMetricsResult {\n success: boolean;\n query: string;\n timeRange: { from: number; to: number };\n series: DatadogMetricSeries[];\n error?: string;\n}\n\n// RUM types\nexport interface DatadogRumOptions {\n query?: string;\n from?: string;\n to?: string;\n limit?: number;\n sort?: \"timestamp\" | \"-timestamp\";\n}\n\nexport interface DatadogRumEvent {\n id: string;\n type: string;\n timestamp?: string;\n sessionId?: string;\n viewUrl?: string;\n viewName?: string;\n errorMessage?: string;\n errorType?: string;\n attributes?: Record<string, unknown>;\n}\n\nexport interface DatadogRumResult {\n success: boolean;\n query: string;\n timeRange: { from: string; to: string };\n events: DatadogRumEvent[];\n error?: string;\n}\n\n// Validation types\nexport interface DatadogValidationResult {\n success: boolean;\n apiKey: { present: boolean; source: string | null };\n appKey: { present: boolean; source: string | null };\n}\n\nexport interface DatadogLogEntry {\n id: string;\n timestamp?: string;\n status?: string;\n service?: string;\n message?: string;\n attributes?: Record<string, unknown>;\n}\n\nexport interface DatadogSearchResult {\n success: boolean;\n query: string;\n timeRange: { from: string; to: string };\n logs: DatadogLogEntry[];\n error?: string;\n}\n\nexport interface DatadogAnalyticsBucket {\n by: Record<string, string>;\n computes: Record<string, number>;\n}\n\nexport interface DatadogAnalyticsResult {\n success: boolean;\n query: string;\n timeRange: { from: string; to: string };\n groupBy: string[];\n buckets: DatadogAnalyticsBucket[];\n error?: string;\n}\n\ninterface Logger {\n info: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\nconst nullLogger: Logger = {\n info: () => {},\n error: () => {},\n};\n\n/**\n * Get Datadog credentials from environment variables\n */\nexport function getDatadogCredentials(): DatadogCredentials | null {\n const apiKey = process.env.DATADOG_API_KEY || process.env.DD_API_KEY;\n const appKey =\n process.env.DATADOG_APP_KEY ||\n process.env.DATADOG_APPLICATION_KEY ||\n process.env.DD_APP_KEY ||\n process.env.DD_APPLICATION_KEY;\n\n if (!apiKey || !appKey) {\n return null;\n }\n\n return { apiKey, appKey };\n}\n\n/**\n * Validate Datadog setup without making API calls\n */\nexport function validateDatadogSetup(): DatadogValidationResult {\n const apiKeySource = process.env.DATADOG_API_KEY\n ? \"DATADOG_API_KEY\"\n : process.env.DD_API_KEY\n ? \"DD_API_KEY\"\n : null;\n\n const appKeySource = process.env.DATADOG_APP_KEY\n ? \"DATADOG_APP_KEY\"\n : process.env.DATADOG_APPLICATION_KEY\n ? \"DATADOG_APPLICATION_KEY\"\n : process.env.DD_APP_KEY\n ? \"DD_APP_KEY\"\n : process.env.DD_APPLICATION_KEY\n ? \"DD_APPLICATION_KEY\"\n : null;\n\n return {\n apiKey: { present: apiKeySource !== null, source: apiKeySource },\n appKey: { present: appKeySource !== null, source: appKeySource },\n success: apiKeySource !== null && appKeySource !== null,\n };\n}\n\n/**\n * Validate Datadog API credentials\n */\nexport async function validateDatadogCredentials(\n credentials: DatadogCredentials,\n): Promise<{ valid: boolean; error?: string }> {\n return new Promise((resolve) => {\n const options = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v1/validate\",\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(options, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n if (res.statusCode === 200) {\n resolve({ valid: true });\n } else {\n resolve({\n valid: false,\n error: `Datadog API returned status ${res.statusCode}: ${data}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n resolve({ valid: false, error: error.message });\n });\n\n req.end();\n });\n}\n\n/**\n * Build query string from environment variables and options\n */\nexport function buildDatadogQuery(options: DatadogSearchOptions): string {\n const ddEnv = process.env.DD_ENV;\n const ddQuery = process.env.DD_QUERY;\n\n const queryParts: string[] = [];\n\n // Add source (parameter only, no env var default)\n if (options.source) {\n queryParts.push(`source:${options.source}`);\n }\n\n // Add env (parameter > env var)\n const effectiveEnv = options.env || ddEnv;\n if (effectiveEnv) {\n queryParts.push(`env:${effectiveEnv}`);\n }\n\n // Add service (parameter only, no env var default)\n if (options.service) {\n queryParts.push(`service:${options.service}`);\n }\n\n // Add base query from DD_QUERY if available\n if (ddQuery) {\n queryParts.push(ddQuery);\n }\n\n // Add user-provided query terms\n if (options.query) {\n queryParts.push(options.query);\n }\n\n return queryParts.join(\" \");\n}\n\n/**\n * Search Datadog logs\n */\nexport async function searchDatadogLogs(\n credentials: DatadogCredentials,\n options: DatadogSearchOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogSearchResult> {\n const effectiveQuery = buildDatadogQuery(options);\n const effectiveFrom = options.from || \"now-15m\";\n const effectiveTo = options.to || \"now\";\n const effectiveLimit = Math.min(options.limit || 50, 1000);\n const effectiveSort = options.sort || \"-timestamp\";\n\n logger.info(`Effective query: ${effectiveQuery}`);\n logger.info(\n `Search params: from=${effectiveFrom}, to=${effectiveTo}, limit=${effectiveLimit}, sort=${effectiveSort}`,\n );\n\n const requestBody = JSON.stringify({\n filter: {\n query: effectiveQuery,\n from: effectiveFrom,\n to: effectiveTo,\n },\n page: {\n limit: effectiveLimit,\n },\n sort: effectiveSort,\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v2/logs/events/search\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n \"Content-Length\": Buffer.byteLength(requestBody),\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 400) {\n errorMessage = `Invalid query syntax. Check your query: \"${effectiveQuery}\". Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have logs_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your query scope.\";\n }\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n data?: Array<{\n id: string;\n attributes?: {\n timestamp?: string;\n status?: string;\n service?: string;\n message?: string;\n attributes?: Record<string, unknown>;\n };\n }>;\n };\n\n const logs = (response.data || []).map((log) => {\n const attrs = log.attributes || {};\n return {\n id: log.id,\n timestamp: attrs.timestamp,\n status: attrs.status,\n service: attrs.service,\n message: attrs.message,\n attributes: attrs.attributes,\n };\n });\n\n logger.info(`Retrieved ${logs.length} log entries`);\n\n resolve({\n success: true,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs,\n });\n } catch (parseError) {\n logger.error(\"Failed to parse Datadog response:\", parseError);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.write(requestBody);\n req.end();\n });\n}\n\n/**\n * Aggregate Datadog logs using the Analytics API\n * Groups logs by specified fields and computes aggregations\n */\nexport async function aggregateDatadogLogs(\n credentials: DatadogCredentials,\n options: DatadogAnalyticsOptions,\n logger: Logger = nullLogger,\n): Promise<DatadogAnalyticsResult> {\n const effectiveQuery = buildDatadogQuery(options);\n const effectiveFrom = options.from || \"now-15m\";\n const effectiveTo = options.to || \"now\";\n const groupBy = options.groupBy;\n const compute = options.compute || [{ aggregation: \"count\" as const }];\n\n logger.info(`Analytics query: ${effectiveQuery}`);\n logger.info(`Group by: ${groupBy.join(\", \")}`);\n logger.info(`Time range: ${effectiveFrom} to ${effectiveTo}`);\n\n // Build compute array - each item needs aggregation and type\n const computeItems = compute.map((c) => {\n const item: {\n aggregation: string;\n type: string;\n metric?: string;\n } = {\n aggregation: c.aggregation,\n type: \"total\",\n };\n if (c.metric) {\n item.metric = c.metric;\n }\n return item;\n });\n\n // Build group_by with proper sort configuration\n const groupByItems = groupBy.map((field) => {\n const item: {\n facet: string;\n limit: number;\n sort: {\n type: string;\n order: string;\n aggregation?: string;\n };\n } = {\n facet: field,\n limit: 100,\n sort: {\n type: \"measure\",\n order: \"desc\",\n aggregation: compute[0]?.aggregation || \"count\",\n },\n };\n return item;\n });\n\n const requestBody = JSON.stringify({\n filter: {\n query: effectiveQuery,\n from: effectiveFrom,\n to: effectiveTo,\n },\n group_by: groupByItems,\n compute: computeItems,\n page: {\n limit: 100,\n },\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v2/logs/analytics/aggregate\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n \"Content-Length\": Buffer.byteLength(requestBody),\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Analytics API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 400) {\n errorMessage = `Invalid query or groupBy fields. Verify facet names exist: ${groupBy.join(\", \")}. Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have logs_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your query scope.\";\n }\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n data?: {\n buckets?: Array<{\n by?: Record<string, string>;\n computes?: Record<string, number>;\n }>;\n };\n };\n\n const buckets = (response.data?.buckets || []).map((bucket) => ({\n by: bucket.by || {},\n computes: bucket.computes || {},\n }));\n\n logger.info(`Retrieved ${buckets.length} aggregation buckets`);\n\n resolve({\n success: true,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog analytics response:\",\n parseError,\n );\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.write(requestBody);\n req.end();\n });\n}\n\n/**\n * List Datadog monitors with optional filtering\n */\nexport async function listDatadogMonitors(\n credentials: DatadogCredentials,\n options: DatadogMonitorsOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogMonitorsResult> {\n logger.info(\"Fetching Datadog monitors\");\n\n const queryParams = new URLSearchParams();\n\n if (options.tags && options.tags.length > 0) {\n queryParams.set(\"tags\", options.tags.join(\",\"));\n }\n if (options.monitorTags && options.monitorTags.length > 0) {\n queryParams.set(\"monitor_tags\", options.monitorTags.join(\",\"));\n }\n if (options.name) {\n queryParams.set(\"name\", options.name);\n }\n\n const queryString = queryParams.toString();\n const path = `/api/v1/monitor${queryString ? `?${queryString}` : \"\"}`;\n\n logger.info(`Request path: ${path}`);\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path,\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Monitors API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have monitors_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again.\";\n }\n resolve({\n success: false,\n monitors: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as Array<{\n id: number;\n name: string;\n type: string;\n overall_state?: string;\n message?: string;\n tags?: string[];\n priority?: number;\n query?: string;\n }>;\n\n let monitors = response.map((monitor) => ({\n id: monitor.id,\n name: monitor.name,\n type: monitor.type,\n status: monitor.overall_state || \"Unknown\",\n message: monitor.message,\n tags: monitor.tags || [],\n priority: monitor.priority,\n query: monitor.query,\n overallState: monitor.overall_state,\n }));\n\n // Filter by status if specified\n if (options.status && options.status.length > 0) {\n monitors = monitors.filter((m) =>\n options.status!.includes(\n m.status as \"Alert\" | \"Warn\" | \"No Data\" | \"OK\",\n ),\n );\n }\n\n logger.info(`Retrieved ${monitors.length} monitors`);\n\n resolve({\n success: true,\n monitors,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog monitors response:\",\n parseError,\n );\n resolve({\n success: false,\n monitors: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n monitors: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * List Datadog Synthetic tests\n */\nexport async function listDatadogSynthetics(\n credentials: DatadogCredentials,\n options: DatadogSyntheticsOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogSyntheticsResult> {\n logger.info(\"Fetching Datadog Synthetic tests\");\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v1/synthetics/tests\",\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Synthetics API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have synthetics_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again.\";\n }\n resolve({\n success: false,\n tests: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n tests?: Array<{\n public_id: string;\n name: string;\n type: string;\n status: string;\n tags?: string[];\n locations?: string[];\n message?: string;\n }>;\n };\n\n let tests = (response.tests || []).map((test) => ({\n publicId: test.public_id,\n name: test.name,\n type: test.type,\n status: test.status,\n tags: test.tags || [],\n locations: test.locations || [],\n message: test.message,\n }));\n\n // Filter by type if specified\n if (options.type) {\n tests = tests.filter((t) => t.type === options.type);\n }\n\n // Filter by tags if specified\n if (options.tags && options.tags.length > 0) {\n tests = tests.filter((t) =>\n options.tags!.some((tag) => t.tags.includes(tag)),\n );\n }\n\n logger.info(`Retrieved ${tests.length} synthetic tests`);\n\n resolve({\n success: true,\n tests,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog synthetics response:\",\n parseError,\n );\n resolve({\n success: false,\n tests: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n tests: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * Get recent results for a specific Synthetic test\n */\nexport async function getDatadogSyntheticResults(\n credentials: DatadogCredentials,\n publicId: string,\n logger: Logger = nullLogger,\n): Promise<DatadogSyntheticResultsResult> {\n logger.info(`Fetching results for Synthetic test: ${publicId}`);\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: `/api/v1/synthetics/tests/${publicId}/results`,\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(\n `Datadog Synthetics Results API error: ${res.statusCode}`,\n );\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have synthetics_read permission.\";\n } else if (res.statusCode === 404) {\n errorMessage = `Synthetic test '${publicId}' not found. Use datadog_synthetics (without testId) to list available tests.`;\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again.\";\n }\n resolve({\n success: false,\n publicId,\n results: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n results?: Array<{\n result_id: string;\n status: number;\n check_time: number;\n dc_id?: number;\n result?: {\n passed?: boolean;\n };\n }>;\n };\n\n const results = (response.results || []).map((result) => ({\n publicId,\n resultId: result.result_id,\n status: result.status,\n checkTime: result.check_time,\n passed: result.result?.passed ?? result.status === 0,\n location: result.dc_id?.toString(),\n }));\n\n logger.info(`Retrieved ${results.length} synthetic results`);\n\n resolve({\n success: true,\n publicId,\n results,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog synthetic results:\",\n parseError,\n );\n resolve({\n success: false,\n publicId,\n results: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n publicId,\n results: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * Query Datadog metrics\n */\nexport async function queryDatadogMetrics(\n credentials: DatadogCredentials,\n options: DatadogMetricsOptions,\n logger: Logger = nullLogger,\n): Promise<DatadogMetricsResult> {\n logger.info(`Querying metrics: ${options.query}`);\n logger.info(`Time range: ${options.from} to ${options.to}`);\n\n const queryParams = new URLSearchParams({\n query: options.query,\n from: options.from.toString(),\n to: options.to.toString(),\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: `/api/v1/query?${queryParams.toString()}`,\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Metrics API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 400) {\n errorMessage = `Invalid metric query. Check format: 'aggregation:metric.name{tags}'. Query: \"${options.query}\". Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have metrics_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your time range.\";\n }\n resolve({\n success: false,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n series?: Array<{\n metric: string;\n scope: string;\n pointlist: Array<[number, number | null]>;\n unit?: Array<{ name?: string }>;\n }>;\n };\n\n const series = (response.series || []).map((s) => ({\n metric: s.metric,\n scope: s.scope,\n pointlist: s.pointlist,\n unit: s.unit?.[0]?.name,\n }));\n\n logger.info(`Retrieved ${series.length} metric series`);\n\n resolve({\n success: true,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series,\n });\n } catch (parseError) {\n logger.error(\"Failed to parse Datadog metrics response:\", parseError);\n resolve({\n success: false,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * Search Datadog RUM events\n */\nexport async function searchDatadogRum(\n credentials: DatadogCredentials,\n options: DatadogRumOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogRumResult> {\n const effectiveQuery = options.query || \"*\";\n const effectiveFrom = options.from || \"now-15m\";\n const effectiveTo = options.to || \"now\";\n const effectiveLimit = Math.min(options.limit || 50, 1000);\n const effectiveSort = options.sort || \"-timestamp\";\n\n logger.info(`RUM query: ${effectiveQuery}`);\n logger.info(`Time range: ${effectiveFrom} to ${effectiveTo}`);\n\n const requestBody = JSON.stringify({\n filter: {\n query: effectiveQuery,\n from: effectiveFrom,\n to: effectiveTo,\n },\n page: {\n limit: effectiveLimit,\n },\n sort: effectiveSort,\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v2/rum/events/search\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n \"Content-Length\": Buffer.byteLength(requestBody),\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog RUM API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n // Check for specific \"No valid indexes\" error which means no RUM app is configured\n if (data.includes(\"No valid indexes\")) {\n errorMessage =\n \"No RUM application found. Ensure you have a RUM application configured in Datadog and it has collected data. \" +\n \"You can create a RUM application at https://app.datadoghq.com/rum/list\";\n } else if (res.statusCode === 400) {\n errorMessage = `Invalid RUM query. Check syntax: \"${effectiveQuery}\". Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have rum_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your query scope.\";\n }\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n data?: Array<{\n id: string;\n type: string;\n attributes?: {\n timestamp?: string;\n attributes?: {\n session?: { id?: string };\n view?: { url?: string; name?: string };\n error?: { message?: string; type?: string };\n [key: string]: unknown;\n };\n };\n }>;\n };\n\n const events = (response.data || []).map((event) => {\n const attrs = event.attributes?.attributes || {};\n return {\n id: event.id,\n type: event.type,\n timestamp: event.attributes?.timestamp,\n sessionId: attrs.session?.id,\n viewUrl: attrs.view?.url,\n viewName: attrs.view?.name,\n errorMessage: attrs.error?.message,\n errorType: attrs.error?.type,\n attributes: attrs,\n };\n });\n\n logger.info(`Retrieved ${events.length} RUM events`);\n\n resolve({\n success: true,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events,\n });\n } catch (parseError) {\n logger.error(\"Failed to parse Datadog RUM response:\", parseError);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.write(requestBody);\n req.end();\n });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -27,7 +27,7 @@ All parameters are passed at the top level (no nested objects):
|
|
|
27
27
|
| `limit` | number | Maximum results to return |
|
|
28
28
|
| `env` | string | Environment filter |
|
|
29
29
|
| `service` | string | Service name filter |
|
|
30
|
-
| `source` | string | Log source filter
|
|
30
|
+
| `source` | string | Log source filter |
|
|
31
31
|
| `groupBy` | string | Fields to group by, comma-separated (for log_analytics) |
|
|
32
32
|
| `aggregation` | string | Aggregation type: count, avg, sum, min, max, cardinality |
|
|
33
33
|
| `status` | string | Monitor status filter, comma-separated: Alert, Warn, No Data, OK |
|
|
@@ -42,8 +42,6 @@ All parameters are passed at the top level (no nested objects):
|
|
|
42
42
|
| `DATADOG_API_KEY` or `DD_API_KEY` | Datadog API key |
|
|
43
43
|
| `DATADOG_APP_KEY` or `DD_APP_KEY` | Datadog Application key |
|
|
44
44
|
| `DD_ENV` | Default environment filter |
|
|
45
|
-
| `DD_SERVICE` | Default service filter |
|
|
46
|
-
| `DD_SOURCE` | Default log source (defaults to "lambda") |
|
|
47
45
|
|
|
48
46
|
## Examples
|
|
49
47
|
|
|
@@ -9,7 +9,7 @@ import { gt } from 'semver';
|
|
|
9
9
|
/**
|
|
10
10
|
* Docs Suite - Documentation services (skill, version, release_notes)
|
|
11
11
|
*/
|
|
12
|
-
const BUILD_VERSION_STRING = "@jaypie/mcp@0.8.
|
|
12
|
+
const BUILD_VERSION_STRING = "@jaypie/mcp@0.8.10#b3e5862c"
|
|
13
13
|
;
|
|
14
14
|
const __filename$1 = fileURLToPath(import.meta.url);
|
|
15
15
|
const __dirname$1 = path.dirname(__filename$1);
|
package/package.json
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.39
|
|
3
|
+
date: 2026-03-31
|
|
4
|
+
summary: Add environment prop and deploy nonce to JaypieMigration
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Add `environment` prop to `JaypieMigration` for passing environment variables to the migration Lambda
|
|
10
|
+
- Add `deployNonce` custom resource property to force re-invocation on every deploy, even when only Lambda code changes
|
|
11
|
+
- Closes #261
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.21
|
|
3
|
+
date: 2026-03-31
|
|
4
|
+
summary: Update default model constants for Anthropic, Gemini, OpenAI, and xAI providers
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Update Anthropic defaults to Claude 4.6 (sonnet-4-6, opus-4-6)
|
|
10
|
+
- Update Gemini defaults to 3.1 series (3.1-pro-preview, 3.1-flash-lite-preview)
|
|
11
|
+
- Update OpenAI defaults to GPT-5.4 series
|
|
12
|
+
- Update xAI defaults to Grok 4.20-0309 series
|
|
13
|
+
- Remove OpenRouter model constants (provider still supported, models specified at runtime)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.9
|
|
3
|
+
date: 2026-03-31
|
|
4
|
+
summary: Rename JSON log field from "level" to "status" to avoid Datadog array collision
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Renamed `"level"` field to `"status"` in JSON output to prevent Lambda/CloudWatch/Datadog Forwarder from merging it with their own `level` field, which created an array (`["error","ERROR"]`) that Datadog discarded
|
|
10
|
+
- Updated DatadogTransport to strip `"status"` instead of `"level"` when forwarding
|
|
11
|
+
|
|
12
|
+
## Migration
|
|
13
|
+
|
|
14
|
+
JSON output changes from:
|
|
15
|
+
```json
|
|
16
|
+
{"level":"debug","message":"hello"}
|
|
17
|
+
```
|
|
18
|
+
to:
|
|
19
|
+
```json
|
|
20
|
+
{"message":"hello","status":"debug"}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Any log parsing rules that match on the `"level"` field should be updated to match `"status"`.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 0.8.8
|
|
3
|
+
date: 2026-03-31
|
|
4
|
+
summary: Remove DD_SOURCE and DD_SERVICE auto-injection from Datadog searches; add build-order guidance for new subpackages
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Datadog MCP tool no longer auto-appends `DD_SOURCE` or `DD_SERVICE` env vars to search queries; source and service filters must be passed explicitly as parameters
|
|
10
|
+
- Added CI/CD build-order guidance to subpackage, cicd, cdk, and lambda skills for new packages that need `dist/` built before CDK synth
|
package/skills/cdk.md
CHANGED
|
@@ -47,6 +47,8 @@ new JaypieLambda(this, "Api", {
|
|
|
47
47
|
|
|
48
48
|
For ESM bundles, use `.mjs` extension or include `package.json` with `"type": "module"` in dist. See `skill("express")` for full esbuild config.
|
|
49
49
|
|
|
50
|
+
**CRITICAL**: When referencing `code: "../package/dist"`, the package must be built **before** CDK synth/deploy. In CI/CD, `npm run build` at the root handles this — but new packages must have a `build` script in their `package.json`. If the package is a build-time dependency of others, add it to `build:core-deps` in the root `package.json`. Without this, CI/CD fails with `"../package/dist" doesn't exist`.
|
|
51
|
+
|
|
50
52
|
### JaypieQueue
|
|
51
53
|
|
|
52
54
|
SQS queue with DLQ and Lambda trigger:
|
package/skills/cicd.md
CHANGED
|
@@ -127,6 +127,15 @@ Required repository secrets:
|
|
|
127
127
|
| `NPM_TOKEN` | npm publish authentication |
|
|
128
128
|
| `DATADOG_API_KEY` | Optional: Test tracing |
|
|
129
129
|
|
|
130
|
+
## New Package Build Order
|
|
131
|
+
|
|
132
|
+
**CRITICAL**: When adding a new subpackage, ensure it builds correctly in CI/CD:
|
|
133
|
+
|
|
134
|
+
- The root `npm run build` runs `build:core-deps` first (types, errors, fabric), then all workspaces via `--workspaces --if-present`
|
|
135
|
+
- If a CDK stack references `code: "../newpackage/dist"`, the package **must** be built before `cdk synth`/`cdk deploy`
|
|
136
|
+
- If the new package is a dependency of other packages at build time, add it to `build:core-deps` in the root `package.json`
|
|
137
|
+
- Without this, CI/CD will fail with `"../newpackage/dist" doesn't exist`
|
|
138
|
+
|
|
130
139
|
## Workflow Tips
|
|
131
140
|
|
|
132
141
|
### Skip Already-Published Versions
|
package/skills/lambda.md
CHANGED
|
@@ -158,6 +158,8 @@ new JaypieLambda(this, "Handler", {
|
|
|
158
158
|
});
|
|
159
159
|
```
|
|
160
160
|
|
|
161
|
+
**Build order**: When using `code: "../package/dist"` instead of `entry`, ensure the package has a `build` script and builds before CDK synth in CI/CD. New packages need to be added to `build:core-deps` in root `package.json` if they're build-time dependencies. See `skill("cicd")` for details.
|
|
162
|
+
|
|
161
163
|
## ESM Deployment
|
|
162
164
|
|
|
163
165
|
Lambda handlers using ESM require Node.js to recognize the module format.
|
package/skills/mcp-datadog.md
CHANGED
|
@@ -68,8 +68,6 @@ Configure defaults via environment:
|
|
|
68
68
|
| `DATADOG_API_KEY` or `DD_API_KEY` | API key (required) |
|
|
69
69
|
| `DATADOG_APP_KEY` or `DD_APP_KEY` | Application key (required) |
|
|
70
70
|
| `DD_ENV` | Default environment filter |
|
|
71
|
-
| `DD_SERVICE` | Default service filter |
|
|
72
|
-
| `DD_SOURCE` | Default log source (default: lambda) |
|
|
73
71
|
|
|
74
72
|
## Log Search
|
|
75
73
|
|
package/skills/mcp.md
CHANGED
|
@@ -59,5 +59,3 @@ datadog("monitors", { status: ["Alert", "Warn"] })
|
|
|
59
59
|
- `DATADOG_API_KEY` or `DD_API_KEY` - API key
|
|
60
60
|
- `DATADOG_APP_KEY` or `DD_APP_KEY` - App key
|
|
61
61
|
- `DD_ENV` - Default environment filter
|
|
62
|
-
- `DD_SERVICE` - Default service filter
|
|
63
|
-
- `DD_SOURCE` - Default log source
|
package/skills/migrations.md
CHANGED
|
@@ -32,16 +32,17 @@ new JaypieMigration(this, "SeedData", {
|
|
|
32
32
|
| Prop | Type | Default | Description |
|
|
33
33
|
|------|------|---------|-------------|
|
|
34
34
|
| `code` | `lambda.Code \| string` | *required* | Path to bundled migration code or CDK Code object |
|
|
35
|
+
| `dependencies` | `Construct[]` | `[]` | Constructs that must be created before the migration runs |
|
|
36
|
+
| `environment` | `Record<string, string> \| (Record<string, string> \| string)[]` | - | Environment variables for the migration Lambda |
|
|
35
37
|
| `handler` | `string` | `"index.handler"` | Lambda entry point |
|
|
36
|
-
| `tables` | `dynamodb.ITable[]` | `[]` | DynamoDB tables to grant read/write access |
|
|
37
38
|
| `secrets` | `SecretsArrayItem[]` | `[]` | Secrets to make available to the Lambda |
|
|
38
|
-
| `
|
|
39
|
+
| `tables` | `dynamodb.ITable[]` | `[]` | DynamoDB tables to grant read/write access |
|
|
39
40
|
|
|
40
41
|
## Behavior
|
|
41
42
|
|
|
42
43
|
- **Timeout**: 5 minutes (vs 30s for API Lambdas) to accommodate long-running migrations
|
|
43
44
|
- **Role**: Tagged as `CDK.ROLE.PROCESSING`
|
|
44
|
-
- **Execution**: Runs on every deploy via CloudFormation custom resource
|
|
45
|
+
- **Execution**: Runs on every deploy via CloudFormation custom resource (uses a deploy nonce to force re-invocation even when only Lambda code changes)
|
|
45
46
|
- **Dependencies**: Use `dependencies` to ensure tables and other resources exist before the migration executes
|
|
46
47
|
|
|
47
48
|
## Migration Lambda Handler
|
package/skills/subpackage.md
CHANGED
|
@@ -201,6 +201,17 @@ export default ["packages/*/vitest.config.{ts,js}"];
|
|
|
201
201
|
|
|
202
202
|
New packages are automatically included when they have a `vitest.config.ts`.
|
|
203
203
|
|
|
204
|
+
## CI/CD Build Integration
|
|
205
|
+
|
|
206
|
+
**CRITICAL**: New subpackages must be buildable in CI/CD. The root `npm run build` runs all workspaces via `--workspaces --if-present`, so any package with a `build` script will be included automatically. However:
|
|
207
|
+
|
|
208
|
+
1. **Ensure `build` script exists** in the new package's `package.json`
|
|
209
|
+
2. **If the package is a build dependency of other packages** (e.g., CDK stacks reference `code: "../newpackage/dist"`), add it to `build:core-deps` in the root `package.json` so it builds before dependents
|
|
210
|
+
3. **Verify the `dist/` directory is produced** — CDK constructs using `code: "../newpackage/dist"` will fail in CI if the package wasn't built first
|
|
211
|
+
4. **Run `npm run build` from the root** to confirm the new package builds in the correct order
|
|
212
|
+
|
|
213
|
+
Without this, CI/CD will fail with errors like `"../newpackage/dist" doesn't exist`.
|
|
214
|
+
|
|
204
215
|
## Checklist
|
|
205
216
|
|
|
206
217
|
After creating a subpackage:
|
|
@@ -211,6 +222,8 @@ After creating a subpackage:
|
|
|
211
222
|
4. ✅ Run `npm install` from root to link workspace
|
|
212
223
|
5. ✅ Verify with `npm run build -w packages/<package-name>`
|
|
213
224
|
6. ✅ Verify with `npm run test -w packages/<package-name>`
|
|
225
|
+
7. ✅ Verify `npm run build` from root succeeds (CI/CD order)
|
|
226
|
+
8. ✅ If CDK references `dist/`, add to `build:core-deps` in root `package.json`
|
|
214
227
|
|
|
215
228
|
## Next Steps
|
|
216
229
|
|