From f10cfd7ad0415bb156d47d212cde535e62bd3f80 Mon Sep 17 00:00:00 2001 From: Athou Date: Fri, 26 May 2023 15:20:17 +0200 Subject: [PATCH] add feed refresh engine metrics --- .../src/pages/admin/MetricsPage.tsx | 20 +++++++++++++++++-- .../backend/feed/FeedRefreshEngine.java | 13 ++++++++---- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/commafeed-client/src/pages/admin/MetricsPage.tsx b/commafeed-client/src/pages/admin/MetricsPage.tsx index 61d62ac2..64203a4d 100644 --- a/commafeed-client/src/pages/admin/MetricsPage.tsx +++ b/commafeed-client/src/pages/admin/MetricsPage.tsx @@ -1,6 +1,7 @@ -import { Accordion, Tabs } from "@mantine/core" +import { Accordion, Box, Tabs } from "@mantine/core" import { client } from "app/client" import { Loader } from "components/Loader" +import { Gauge } from "components/metrics/Gauge" import { Meter } from "components/metrics/Meter" import { MetricAccordionItem } from "components/metrics/MetricAccordionItem" import { Timer } from "components/metrics/Timer" @@ -15,11 +16,17 @@ const shownMeters: { [key: string]: string } = { "com.commafeed.backend.feed.FeedRefreshUpdater.entryCacheMiss": "Entry cache miss rate", } +const shownGauges: { [key: string]: string } = { + "com.commafeed.backend.feed.FeedRefreshEngine.queue.size": "Queue size", + "com.commafeed.backend.feed.FeedRefreshEngine.worker.active": "Feed Worker active", + "com.commafeed.backend.feed.FeedRefreshEngine.updater.active": "Feed Updater active", +} + export function MetricsPage() { const query = useAsync(() => client.admin.getMetrics(), []) if (!query.result) return - const { meters, timers } = query.result.data + const { meters, gauges, timers } = query.result.data return ( @@ -39,6 +46,15 @@ export function MetricsPage() { ))} + + + {Object.keys(shownGauges).map(g => ( + + {shownGauges[g]}  + + + ))} + diff --git a/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java b/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java index c5e1c31f..0668fa11 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java @@ -18,6 +18,7 @@ import javax.inject.Singleton; import org.apache.commons.lang3.time.DateUtils; import org.hibernate.SessionFactory; +import com.codahale.metrics.Gauge; import com.codahale.metrics.Meter; import com.codahale.metrics.MetricRegistry; import com.commafeed.CommaFeedConfiguration; @@ -45,8 +46,8 @@ public class FeedRefreshEngine implements Managed { private final ExecutorService feedProcessingLoopExecutor; private final ExecutorService refillLoopExecutor; private final ExecutorService refillExecutor; - private final ExecutorService workerExecutor; - private final ExecutorService databaseUpdaterExecutor; + private final ThreadPoolExecutor workerExecutor; + private final ThreadPoolExecutor databaseUpdaterExecutor; @Inject public FeedRefreshEngine(SessionFactory sessionFactory, FeedDAO feedDAO, FeedRefreshWorker worker, FeedRefreshUpdater updater, @@ -65,6 +66,10 @@ public class FeedRefreshEngine implements Managed { this.refillExecutor = newDiscardingSingleThreadExecutorService(); this.workerExecutor = newBlockingExecutorService(config.getApplicationSettings().getBackgroundThreads()); this.databaseUpdaterExecutor = newBlockingExecutorService(config.getApplicationSettings().getDatabaseUpdateThreads()); + + metrics.register(MetricRegistry.name(getClass(), "queue", "size"), (Gauge) queue::size); + metrics.register(MetricRegistry.name(getClass(), "worker", "active"), (Gauge) workerExecutor::getActiveCount); + metrics.register(MetricRegistry.name(getClass(), "updater", "active"), (Gauge) databaseUpdaterExecutor::getActiveCount); } @Override @@ -185,7 +190,7 @@ public class FeedRefreshEngine implements Managed { /** * returns an ExecutorService with a single thread that discards tasks if a task is already running */ - private ExecutorService newDiscardingSingleThreadExecutorService() { + private ThreadPoolExecutor newDiscardingSingleThreadExecutorService() { ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new SynchronousQueue<>()); pool.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); return pool; @@ -194,7 +199,7 @@ public class FeedRefreshEngine implements Managed { /** * returns an ExecutorService that blocks submissions until a thread is available */ - private ExecutorService newBlockingExecutorService(int threads) { + private ThreadPoolExecutor newBlockingExecutorService(int threads) { ThreadPoolExecutor pool = new ThreadPoolExecutor(threads, threads, 0L, TimeUnit.MILLISECONDS, new SynchronousQueue<>()); pool.setRejectedExecutionHandler((r, e) -> { if (e.isShutdown()) {