From c870dc7022e81a8cf02fe0bf1d933cef0e091be9 Mon Sep 17 00:00:00 2001 From: Dennis van der Stelt Date: Mon, 16 Mar 2026 16:45:12 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=E2=9C=A8=20Add=20activity=20filter=20for?= =?UTF-8?q?=20endpoint=20message=20types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Allow users to filter message types by recent activity (All, 1 min, 5 min, 15 min) so they can quickly find actively processing types without paginating through inactive ones. Closes #2890. --- .../monitoring/EndpointMessageTypes.vue | 19 ++++- .../monitoring/MessageTypeActivityFilter.vue | 74 +++++++++++++++++++ 2 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 src/Frontend/src/components/monitoring/MessageTypeActivityFilter.vue diff --git a/src/Frontend/src/components/monitoring/EndpointMessageTypes.vue b/src/Frontend/src/components/monitoring/EndpointMessageTypes.vue index 93d610e1b8..4536dceb94 100644 --- a/src/Frontend/src/components/monitoring/EndpointMessageTypes.vue +++ b/src/Frontend/src/components/monitoring/EndpointMessageTypes.vue @@ -7,6 +7,7 @@ import { storeToRefs } from "pinia"; import NoData from "@/components/NoData.vue"; import SmallGraph from "./SmallGraph.vue"; import PaginationStrip from "@/components/PaginationStrip.vue"; +import MessageTypeActivityFilter from "./MessageTypeActivityFilter.vue"; import { useMonitoringEndpointDetailsStore } from "@/stores/MonitoringEndpointDetailsStore"; import ColumnHeader from "@/components/ColumnHeader.vue"; import { CriticalTime, MessageType, ProcessingTime, ScheduledRetries, Throughput } from "@/resources/MonitoringResources"; @@ -19,11 +20,16 @@ const { endpointDetails: endpoint, messageTypes, messageTypesAvailable } = store const route = useRoute(); const router = useRouter(); const messageTypesPage = ref(Number(route?.query?.pageNo ?? "1")); +const activityFilter = ref(0); watch(messageTypesPage, () => { router.replace({ query: { ...route.query, pageNo: messageTypesPage.value } }); }); +watch(activityFilter, () => { + messageTypesPage.value = 1; +}); + const props = defineProps({ perPage: { type: Number, @@ -31,10 +37,16 @@ const props = defineProps({ }, }); +const filteredMessageTypes = computed(() => { + if (!messageTypes.value) return []; + if (activityFilter.value === 0) return messageTypes.value.data; + return messageTypes.value.data.filter((mt) => mt.metrics.throughput.average > 0 || mt.metrics.throughput.points.some((p) => p > 0)); +}); + const paginatedMessageTypes = computed(() => { const pageStart = (messageTypesPage.value - 1) * props.perPage; const pageEnd = messageTypesPage.value * props.perPage; - return messageTypes.value ? messageTypes.value.data.slice(pageStart, pageEnd) : []; + return filteredMessageTypes.value.slice(pageStart, pageEnd); }); @@ -46,6 +58,8 @@ const paginatedMessageTypes = computed(() => { Click here to reload the view + +
@@ -65,6 +79,7 @@ const paginatedMessageTypes = computed(() => {
+
@@ -157,7 +172,7 @@ const paginatedMessageTypes = computed(() => {
- + diff --git a/src/Frontend/src/components/monitoring/MessageTypeActivityFilter.vue b/src/Frontend/src/components/monitoring/MessageTypeActivityFilter.vue new file mode 100644 index 0000000000..9b00d87386 --- /dev/null +++ b/src/Frontend/src/components/monitoring/MessageTypeActivityFilter.vue @@ -0,0 +1,74 @@ + + + + + From e6e822ecb6be6a471b58bf399ce8046f27cd9efb Mon Sep 17 00:00:00 2001 From: Dennis van der Stelt Date: Mon, 16 Mar 2026 23:30:41 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=90=9B=20Filter=20message=20types=20b?= =?UTF-8?q?y=20actual=20time-based=20activity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The filter now checks only the trailing portion of data points matching the selected time window, so inactive message types disappear when their last activity exceeds the filter threshold. Also hides filter options that exceed the current history period. --- .../monitoring/EndpointMessageTypes.vue | 15 +++++++++++++-- .../monitoring/MessageTypeActivityFilter.vue | 13 ++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/Frontend/src/components/monitoring/EndpointMessageTypes.vue b/src/Frontend/src/components/monitoring/EndpointMessageTypes.vue index 4536dceb94..3f9de34e32 100644 --- a/src/Frontend/src/components/monitoring/EndpointMessageTypes.vue +++ b/src/Frontend/src/components/monitoring/EndpointMessageTypes.vue @@ -13,9 +13,11 @@ import ColumnHeader from "@/components/ColumnHeader.vue"; import { CriticalTime, MessageType, ProcessingTime, ScheduledRetries, Throughput } from "@/resources/MonitoringResources"; import FAIcon from "@/components/FAIcon.vue"; import { faWarning } from "@fortawesome/free-solid-svg-icons"; +import { useMonitoringHistoryPeriodStore } from "@/stores/MonitoringHistoryPeriodStore"; const monitoringStore = useMonitoringEndpointDetailsStore(); const { endpointDetails: endpoint, messageTypes, messageTypesAvailable } = storeToRefs(monitoringStore); +const { historyPeriod } = storeToRefs(useMonitoringHistoryPeriodStore()); const route = useRoute(); const router = useRouter(); @@ -40,7 +42,16 @@ const props = defineProps({ const filteredMessageTypes = computed(() => { if (!messageTypes.value) return []; if (activityFilter.value === 0) return messageTypes.value.data; - return messageTypes.value.data.filter((mt) => mt.metrics.throughput.average > 0 || mt.metrics.throughput.points.some((p) => p > 0)); + + return messageTypes.value.data.filter((mt) => { + const points = mt.metrics.throughput.points; + if (points.length === 0) return false; + + const pVal = historyPeriod.value.pVal; + const pointsToCheck = Math.min(points.length, Math.ceil((activityFilter.value / pVal) * points.length)); + const recentPoints = points.slice(-pointsToCheck); + return recentPoints.some((p) => p > 0); + }); }); const paginatedMessageTypes = computed(() => { @@ -58,7 +69,7 @@ const paginatedMessageTypes = computed(() => { Click here to reload the view - + diff --git a/src/Frontend/src/components/monitoring/MessageTypeActivityFilter.vue b/src/Frontend/src/components/monitoring/MessageTypeActivityFilter.vue index 9b00d87386..170067f17e 100644 --- a/src/Frontend/src/components/monitoring/MessageTypeActivityFilter.vue +++ b/src/Frontend/src/components/monitoring/MessageTypeActivityFilter.vue @@ -1,17 +1,28 @@