feat(traffic): expose external actor source/response details in monitor
Some checks failed
Deploy to 110 WOOO Server / deploy (push) Failing after 7s
Some checks failed
Deploy to 110 WOOO Server / deploy (push) Failing after 7s
This commit is contained in:
@@ -422,6 +422,18 @@ export async function GET(request: NextRequest) {
|
||||
error_message: string;
|
||||
created_at_ms: number;
|
||||
}> = [];
|
||||
const externalActorActivities: Map<string, {
|
||||
actor_id: string;
|
||||
events: number;
|
||||
latest_action: string;
|
||||
latest_surface: string;
|
||||
latest_source_ip: string;
|
||||
latest_user_agent: string;
|
||||
latest_response_status: number | null;
|
||||
latest_response_summary: string;
|
||||
latest_reason: string;
|
||||
latest_created_at_ms: number;
|
||||
}> = new Map();
|
||||
|
||||
recentEvents.forEach((event) => {
|
||||
const actorId = event.actorId || "agent:unknown";
|
||||
@@ -442,12 +454,32 @@ export async function GET(request: NextRequest) {
|
||||
const errorName = typeof metadata?.error_name === "string" ? metadata.error_name : "";
|
||||
const errorMessage = typeof metadata?.error_message === "string" ? metadata.error_message : "";
|
||||
const taskId = typeof metadata?.task_id === "string" ? metadata.task_id : (event.entityId || "-");
|
||||
const responseSummary =
|
||||
typeof metadata?.response_summary === "string" ? metadata.response_summary : "unknown";
|
||||
|
||||
updateActorBucket(externalSourceSurfaceMap, normalizedSurface, actorId, eventAt, { surface: normalizedSurface });
|
||||
updateActorBucket(externalIpSurfaceMap, normalizedIp, actorId, eventAt, { sourceIp: normalizedIp });
|
||||
updateActorBucket(externalUserAgentMap, normalizedUa, actorId, eventAt, { userAgent: normalizedUa });
|
||||
addCountedBucket(responseStatusSummary, String(responseStatus ?? "n/a"), actorId, eventAt);
|
||||
|
||||
const existingActorActivity = externalActorActivities.get(actorId);
|
||||
if (!existingActorActivity) {
|
||||
externalActorActivities.set(actorId, {
|
||||
actor_id: actorId,
|
||||
events: 1,
|
||||
latest_action: event.action,
|
||||
latest_surface: normalizedSurface,
|
||||
latest_source_ip: normalizedIp,
|
||||
latest_user_agent: normalizedUa,
|
||||
latest_response_status: responseStatus,
|
||||
latest_response_summary: responseSummary,
|
||||
latest_reason: event.reason || "unknown",
|
||||
latest_created_at_ms: eventAt,
|
||||
});
|
||||
} else {
|
||||
existingActorActivity.events += 1;
|
||||
}
|
||||
|
||||
if (
|
||||
event.action.includes("ERROR") ||
|
||||
event.action.includes("FORBIDDEN") ||
|
||||
@@ -521,6 +553,15 @@ export async function GET(request: NextRequest) {
|
||||
.sort((left, right) => right.created_at_ms - left.created_at_ms)
|
||||
.slice(0, 30);
|
||||
|
||||
const externalActorActivityRows = Array.from(externalActorActivities.values())
|
||||
.sort((left, right) => {
|
||||
if (right.events !== left.events) {
|
||||
return right.events - left.events;
|
||||
}
|
||||
return right.latest_created_at_ms - left.latest_created_at_ms;
|
||||
})
|
||||
.slice(0, 40);
|
||||
|
||||
return NextResponse.json({
|
||||
period_minutes: minutes,
|
||||
total_events: totalRows,
|
||||
@@ -536,6 +577,7 @@ export async function GET(request: NextRequest) {
|
||||
external_source_ip_summary: externalSourceIpSummary,
|
||||
external_user_agent_summary: externalUserAgentSummary,
|
||||
external_response_status_summary: externalResponseStatusSummary,
|
||||
external_actor_activities: externalActorActivityRows,
|
||||
external_error_rows: externalErrorRowsSorted,
|
||||
recent_external_events: recentExternalEvents,
|
||||
recent_internal_events: recentInternalEvents,
|
||||
|
||||
Reference in New Issue
Block a user