diff --git a/packages/api/src/lib/invocations.js b/packages/api/src/lib/invocations.js index d34e0a3..ea7b48a 100644 --- a/packages/api/src/lib/invocations.js +++ b/packages/api/src/lib/invocations.js @@ -22,11 +22,26 @@ const getStatusCodeFromSpan = (span) => { return null; }; +const getResultSummaryFromSpan = (span) => { + let mainStatus = "Successful"; + if (span.error) { + mainStatus = span.error?.type || "Invocation failed"; + } + + const statusCode = getStatusCodeFromSpan(span); + if (statusCode) { + mainStatus += ` (${statusCode})`; + } + + return mainStatus; +}; + export const saveInvocation = async (span) => { - await put( + return put( { ...span, statusCode: getStatusCodeFromSpan(span), + resultSummary: getResultSummaryFromSpan(span), pk: `function#${span.region}#${span.name}`, sk: `invocation#${span.started}#${span.id}`, type: "invocation", diff --git a/packages/api/src/routes/explore/index.js b/packages/api/src/routes/explore/index.js index ea00ad9..de8dd5d 100644 --- a/packages/api/src/routes/explore/index.js +++ b/packages/api/src/routes/explore/index.js @@ -65,7 +65,8 @@ app.get("/functions/:region/:name/invocations", async (c) => { const endTs = end.getTime(); const startKey = c.req.query("startKey"); - const { Items, LastEvaluatedKey } = await query({ + + const params = { KeyConditionExpression: "#pk = :pk AND #sk BETWEEN :skStart AND :skEnd", ExclusiveStartKey: startKey ? JSON.parse(startKey) : undefined, ExpressionAttributeNames: { @@ -77,6 +78,7 @@ app.get("/functions/:region/:name/invocations", async (c) => { "#region": "region", "#name": "name", "#statusCode": "statusCode", + "#resultSummary": "resultSummary", }, ExpressionAttributeValues: { ":pk": `function#${c.req.param("region")}#${c.req.param("name")}`, @@ -84,10 +86,23 @@ app.get("/functions/:region/:name/invocations", async (c) => { ":skEnd": `invocation#${endTs}`, }, ProjectionExpression: - "#pk, #sk, #type, #error, #id, #region, #name, #statusCode, transactionId, started, ended, readiness, memoryAllocated", + "#pk, #sk, #type, #error, #id, #region, #name, #statusCode, #resultSummary, transactionId, started, ended, readiness, memoryAllocated", Limit: 50, ScanIndexForward: false, - }); + }; + + const resultSummaryFilters = c.req.query("resultSummaryFilters")?.split(',') || []; + if (resultSummaryFilters.length) { + const filterExpression = []; + for (const filter of resultSummaryFilters) { + const variableName = `:f${filterExpression.length}`; + filterExpression.push(`#resultSummary = ${variableName}`); + params.ExpressionAttributeValues[variableName] = filter; + } + params.FilterExpression = filterExpression.join(" OR "); + } + + const { Items, LastEvaluatedKey } = await query(params); return c.json({ invocations: Items,