From 413839452c65c03ef1f3c14a21cd430219da2ea5 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Tue, 24 Mar 2026 08:28:05 +0100 Subject: [PATCH] fix: use statsForApp when application is set without routeId MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The stats endpoint was calling statsForRoute(null, agentIds) when only application was set — this filtered by route_id=null, returning zero results. Now correctly routes to statsForApp/timeseriesForApp which queries the stats_1m_app continuous aggregate by application_name. Also reverts the group parameter alias workaround — the deployed backend correctly accepts 'application'. Three code paths now: - No filters → stats_1m_all (global) - application only → stats_1m_app (per-app) - routeId (±application) → stats_1m_route (per-route) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../app/controller/SearchController.java | 27 +++++++++++-------- .../server/core/search/SearchService.java | 8 ++++++ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/SearchController.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/SearchController.java index c52b5e5f..b09e07ab 100644 --- a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/SearchController.java +++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/SearchController.java @@ -52,14 +52,12 @@ public class SearchController { @RequestParam(required = false) String agentId, @RequestParam(required = false) String processorType, @RequestParam(required = false) String application, - @RequestParam(required = false) String group, @RequestParam(defaultValue = "0") int offset, @RequestParam(defaultValue = "50") int limit, @RequestParam(required = false) String sortField, @RequestParam(required = false) String sortDir) { - String app = application != null ? application : group; - List agentIds = resolveApplicationToAgentIds(app); + List agentIds = resolveApplicationToAgentIds(application); SearchRequest request = new SearchRequest( status, timeFrom, timeTo, @@ -67,7 +65,7 @@ public class SearchController { correlationId, text, null, null, null, routeId, agentId, processorType, - app, agentIds, + application, agentIds, offset, limit, sortField, sortDir ); @@ -94,13 +92,15 @@ public class SearchController { @RequestParam Instant from, @RequestParam(required = false) Instant to, @RequestParam(required = false) String routeId, - @RequestParam(required = false) String application, - @RequestParam(required = false) String group) { + @RequestParam(required = false) String application) { Instant end = to != null ? to : Instant.now(); - List agentIds = resolveApplicationToAgentIds(application != null ? application : group); - if (routeId == null && agentIds == null) { + if (routeId == null && application == null) { return ResponseEntity.ok(searchService.stats(from, end)); } + if (routeId == null) { + return ResponseEntity.ok(searchService.statsForApp(from, end, application)); + } + List agentIds = resolveApplicationToAgentIds(application); return ResponseEntity.ok(searchService.stats(from, end, routeId, agentIds)); } @@ -111,10 +111,15 @@ public class SearchController { @RequestParam(required = false) Instant to, @RequestParam(defaultValue = "24") int buckets, @RequestParam(required = false) String routeId, - @RequestParam(required = false) String application, - @RequestParam(required = false) String group) { + @RequestParam(required = false) String application) { Instant end = to != null ? to : Instant.now(); - List agentIds = resolveApplicationToAgentIds(application != null ? application : group); + if (routeId == null && application == null) { + return ResponseEntity.ok(searchService.timeseries(from, end, buckets)); + } + if (routeId == null) { + return ResponseEntity.ok(searchService.timeseriesForApp(from, end, buckets, application)); + } + List agentIds = resolveApplicationToAgentIds(application); if (routeId == null && agentIds == null) { return ResponseEntity.ok(searchService.timeseries(from, end, buckets)); } diff --git a/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/SearchService.java b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/SearchService.java index 014c606d..7389bfe5 100644 --- a/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/SearchService.java +++ b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/SearchService.java @@ -28,6 +28,10 @@ public class SearchService { return statsStore.stats(from, to); } + public ExecutionStats statsForApp(Instant from, Instant to, String applicationName) { + return statsStore.statsForApp(from, to, applicationName); + } + public ExecutionStats stats(Instant from, Instant to, String routeId, List agentIds) { return statsStore.statsForRoute(from, to, routeId, agentIds); } @@ -36,6 +40,10 @@ public class SearchService { return statsStore.timeseries(from, to, bucketCount); } + public StatsTimeseries timeseriesForApp(Instant from, Instant to, int bucketCount, String applicationName) { + return statsStore.timeseriesForApp(from, to, bucketCount, applicationName); + } + public StatsTimeseries timeseries(Instant from, Instant to, int bucketCount, String routeId, List agentIds) { return statsStore.timeseriesForRoute(from, to, bucketCount, routeId, agentIds);