diff --git a/pom.xml b/pom.xml
index c140bc7f..a1e1e5fe 100644
--- a/pom.xml
+++ b/pom.xml
@@ -372,6 +372,17 @@
provided
+
+ com.codahale.metrics
+ metrics-core
+ 3.0.1
+
+
+ com.codahale.metrics
+ metrics-json
+ 3.0.1
+
+
junit
junit
diff --git a/src/main/java/com/commafeed/backend/MetricsBean.java b/src/main/java/com/commafeed/backend/MetricsBean.java
deleted file mode 100644
index fd3035c5..00000000
--- a/src/main/java/com/commafeed/backend/MetricsBean.java
+++ /dev/null
@@ -1,179 +0,0 @@
-package com.commafeed.backend;
-
-import javax.ejb.Singleton;
-import javax.interceptor.AroundInvoke;
-import javax.interceptor.InvocationContext;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-
-import org.hibernate.Session;
-import org.hibernate.SessionFactory;
-import org.hibernate.stat.Statistics;
-
-@Singleton
-public class MetricsBean {
-
- @PersistenceContext
- EntityManager em;
-
- private Metric lastMinute = new Metric();
- private Metric thisMinute = new Metric();
-
- private Metric lastHour = new Metric();
- private Metric thisHour = new Metric();
-
- private long minuteTimestamp;
- private long hourTimestamp;
-
- @AroundInvoke
- private Object roll(InvocationContext context) throws Exception {
- long now = System.currentTimeMillis();
- if (now - minuteTimestamp > 60000) {
- lastMinute = thisMinute;
- thisMinute = new Metric();
- minuteTimestamp = now;
-
- }
-
- if (now - hourTimestamp > 60000 * 60) {
- lastHour = thisHour;
- thisHour = new Metric();
- hourTimestamp = now;
-
- }
- return context.proceed();
- }
-
- public void feedRefreshed() {
- thisMinute.feedsRefreshed++;
- thisHour.feedsRefreshed++;
- }
-
- public void feedUpdated() {
- thisHour.feedsUpdated++;
- thisMinute.feedsUpdated++;
-
- }
-
- public void entryInserted() {
-
- thisHour.entriesInserted++;
- thisMinute.entriesInserted++;
-
- }
-
- public void entryCacheHit() {
- thisHour.entryCacheHit++;
- thisMinute.entryCacheHit++;
- }
-
- public void entryCacheMiss() {
- thisHour.entryCacheMiss++;
- thisMinute.entryCacheMiss++;
- }
-
- public void pushReceived(int feedCount) {
-
- thisHour.pushNotificationsReceived++;
- thisMinute.pushNotificationsReceived++;
-
- thisHour.pushFeedsQueued += feedCount;
- thisMinute.pushFeedsQueued += feedCount;
- }
-
- public void threadWaited() {
- thisHour.threadWaited++;
- thisMinute.threadWaited++;
- }
-
- public Metric getLastMinute() {
- return lastMinute;
- }
-
- public Metric getLastHour() {
- return lastHour;
- }
-
- public String getCacheStats() {
- Session session = em.unwrap(Session.class);
- SessionFactory sessionFactory = session.getSessionFactory();
- Statistics statistics = sessionFactory.getStatistics();
- return statistics.toString();
- }
-
- public static class Metric {
- private int feedsRefreshed;
- private int feedsUpdated;
- private int entriesInserted;
- private int threadWaited;
- private int pushNotificationsReceived;
- private int pushFeedsQueued;
- private int entryCacheHit;
- private int entryCacheMiss;
-
- public int getFeedsRefreshed() {
- return feedsRefreshed;
- }
-
- public void setFeedsRefreshed(int feedsRefreshed) {
- this.feedsRefreshed = feedsRefreshed;
- }
-
- public int getFeedsUpdated() {
- return feedsUpdated;
- }
-
- public void setFeedsUpdated(int feedsUpdated) {
- this.feedsUpdated = feedsUpdated;
- }
-
- public int getEntriesInserted() {
- return entriesInserted;
- }
-
- public void setEntriesInserted(int entriesInserted) {
- this.entriesInserted = entriesInserted;
- }
-
- public int getThreadWaited() {
- return threadWaited;
- }
-
- public void setThreadWaited(int threadWaited) {
- this.threadWaited = threadWaited;
- }
-
- public int getPushNotificationsReceived() {
- return pushNotificationsReceived;
- }
-
- public void setPushNotificationsReceived(int pushNotificationsReceived) {
- this.pushNotificationsReceived = pushNotificationsReceived;
- }
-
- public int getPushFeedsQueued() {
- return pushFeedsQueued;
- }
-
- public void setPushFeedsQueued(int pushFeedsQueued) {
- this.pushFeedsQueued = pushFeedsQueued;
- }
-
- public int getEntryCacheHit() {
- return entryCacheHit;
- }
-
- public void setEntryCacheHit(int entryCacheHit) {
- this.entryCacheHit = entryCacheHit;
- }
-
- public int getEntryCacheMiss() {
- return entryCacheMiss;
- }
-
- public void setEntryCacheMiss(int entryCacheMiss) {
- this.entryCacheMiss = entryCacheMiss;
- }
-
- }
-}
diff --git a/src/main/java/com/commafeed/backend/ScheduledTasks.java b/src/main/java/com/commafeed/backend/ScheduledTasks.java
index b88700b2..f4f7c93c 100644
--- a/src/main/java/com/commafeed/backend/ScheduledTasks.java
+++ b/src/main/java/com/commafeed/backend/ScheduledTasks.java
@@ -9,6 +9,7 @@ import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import com.commafeed.backend.services.ApplicationSettingsService;
+import com.commafeed.backend.services.DatabaseCleaningService;
/**
* Contains all scheduled tasks
@@ -21,7 +22,7 @@ public class ScheduledTasks {
ApplicationSettingsService applicationSettingsService;
@Inject
- DatabaseCleaner cleaner;
+ DatabaseCleaningService cleaner;
@PersistenceContext
EntityManager em;
diff --git a/src/main/java/com/commafeed/backend/feeds/FeedRefreshExecutor.java b/src/main/java/com/commafeed/backend/feeds/FeedRefreshExecutor.java
index 4f989bb8..13718c26 100644
--- a/src/main/java/com/commafeed/backend/feeds/FeedRefreshExecutor.java
+++ b/src/main/java/com/commafeed/backend/feeds/FeedRefreshExecutor.java
@@ -7,6 +7,9 @@ import java.util.concurrent.TimeUnit;
import lombok.extern.slf4j.Slf4j;
+import com.codahale.metrics.Gauge;
+import com.codahale.metrics.MetricRegistry;
+
/**
* Wraps a {@link ThreadPoolExecutor} instance. Blocks when queue is full instead of rejecting the task. Allow priority queueing by using
* {@link Task} instead of {@link Runnable}
@@ -19,7 +22,7 @@ public class FeedRefreshExecutor {
private ThreadPoolExecutor pool;
private LinkedBlockingDeque queue;
- public FeedRefreshExecutor(final String poolName, int threads, int queueCapacity) {
+ public FeedRefreshExecutor(final String poolName, int threads, int queueCapacity, MetricRegistry metrics) {
log.info("Creating pool {} with {} threads", poolName, threads);
this.poolName = poolName;
pool = new ThreadPoolExecutor(threads, threads, 0, TimeUnit.MILLISECONDS, queue = new LinkedBlockingDeque(queueCapacity) {
@@ -51,20 +54,26 @@ public class FeedRefreshExecutor {
}
}
});
+
+ metrics.register(MetricRegistry.name(getClass(), poolName, "active"), new Gauge() {
+ @Override
+ public Integer getValue() {
+ return pool.getActiveCount();
+ }
+ });
+
+ metrics.register(MetricRegistry.name(getClass(), poolName, "pending"), new Gauge() {
+ @Override
+ public Integer getValue() {
+ return queue.size();
+ }
+ });
}
public void execute(Task task) {
pool.execute(task);
}
- public int getQueueSize() {
- return queue.size();
- }
-
- public int getActiveCount() {
- return pool.getActiveCount();
- }
-
public static interface Task extends Runnable {
boolean isUrgent();
}
diff --git a/src/main/java/com/commafeed/backend/feeds/FeedRefreshTaskGiver.java b/src/main/java/com/commafeed/backend/feeds/FeedRefreshTaskGiver.java
index ba6d3cc6..8673f383 100644
--- a/src/main/java/com/commafeed/backend/feeds/FeedRefreshTaskGiver.java
+++ b/src/main/java/com/commafeed/backend/feeds/FeedRefreshTaskGiver.java
@@ -17,7 +17,8 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.time.DateUtils;
-import com.commafeed.backend.MetricsBean;
+import com.codahale.metrics.Meter;
+import com.codahale.metrics.MetricRegistry;
import com.commafeed.backend.dao.FeedDAO;
import com.commafeed.backend.model.Feed;
import com.commafeed.backend.services.ApplicationSettingsService;
@@ -41,7 +42,7 @@ public class FeedRefreshTaskGiver {
ApplicationSettingsService applicationSettingsService;
@Inject
- MetricsBean metricsBean;
+ MetricRegistry metrics;
@Inject
FeedRefreshWorker worker;
@@ -54,10 +55,15 @@ public class FeedRefreshTaskGiver {
private ExecutorService executor;
+ private Meter feedRefreshed;
+ private Meter threadWaited;
+
@PostConstruct
public void init() {
backgroundThreads = applicationSettingsService.get().getBackgroundThreads();
executor = Executors.newFixedThreadPool(1);
+ feedRefreshed = metrics.meter(MetricRegistry.name(getClass(), "feedRefreshed"));
+ threadWaited = metrics.meter(MetricRegistry.name(getClass(), "threadWaited"));
}
@PreDestroy
@@ -88,11 +94,11 @@ public class FeedRefreshTaskGiver {
try {
FeedRefreshContext context = take();
if (context != null) {
- metricsBean.feedRefreshed();
+ feedRefreshed.mark();
worker.updateFeed(context);
} else {
log.debug("nothing to do, sleeping for 15s");
- metricsBean.threadWaited();
+ threadWaited.mark();
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
diff --git a/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java b/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java
index e7d17fef..a809d2b5 100644
--- a/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java
+++ b/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java
@@ -19,7 +19,8 @@ import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
-import com.commafeed.backend.MetricsBean;
+import com.codahale.metrics.Meter;
+import com.codahale.metrics.MetricRegistry;
import com.commafeed.backend.cache.CacheService;
import com.commafeed.backend.dao.FeedDAO;
import com.commafeed.backend.dao.FeedEntryDAO;
@@ -57,7 +58,7 @@ public class FeedRefreshUpdater {
ApplicationSettingsService applicationSettingsService;
@Inject
- MetricsBean metricsBean;
+ MetricRegistry metrics;
@Inject
FeedSubscriptionDAO feedSubscriptionDAO;
@@ -71,12 +72,22 @@ public class FeedRefreshUpdater {
private FeedRefreshExecutor pool;
private Striped locks;
+ private Meter entryCacheMiss;
+ private Meter entryCacheHit;
+ private Meter feedUpdated;
+ private Meter entryInserted;
+
@PostConstruct
public void init() {
ApplicationSettings settings = applicationSettingsService.get();
int threads = Math.max(settings.getDatabaseUpdateThreads(), 1);
- pool = new FeedRefreshExecutor("feed-refresh-updater", threads, Math.min(50 * threads, 1000));
+ pool = new FeedRefreshExecutor("feed-refresh-updater", threads, Math.min(50 * threads, 1000), metrics);
locks = Striped.lazyWeakLock(threads * 100000);
+
+ entryCacheMiss = metrics.meter(MetricRegistry.name(getClass(), "entryCacheMiss"));
+ entryCacheHit = metrics.meter(MetricRegistry.name(getClass(), "entryCacheHit"));
+ feedUpdated = metrics.meter(MetricRegistry.name(getClass(), "feedUpdated"));
+ entryInserted = metrics.meter(MetricRegistry.name(getClass(), "entryInserted"));
}
@PreDestroy
@@ -116,10 +127,10 @@ public class FeedRefreshUpdater {
subscriptions = feedSubscriptionDAO.findByFeed(feed);
}
ok &= addEntry(feed, entry, subscriptions);
- metricsBean.entryCacheMiss();
+ entryCacheMiss.mark();
} else {
log.debug("cache hit for {}", entry.getUrl());
- metricsBean.entryCacheHit();
+ entryCacheHit.mark();
}
currentEntries.add(cacheKey);
@@ -147,7 +158,7 @@ public class FeedRefreshUpdater {
// requeue asap
feed.setDisabledUntil(new Date(0));
}
- metricsBean.feedUpdated();
+ feedUpdated.mark();
taskGiver.giveBack(feed);
}
@@ -180,7 +191,7 @@ public class FeedRefreshUpdater {
if (locked1 && locked2) {
boolean inserted = feedUpdateService.addEntry(feed, entry);
if (inserted) {
- metricsBean.entryInserted();
+ entryInserted.mark();
}
success = true;
} else {
@@ -213,13 +224,4 @@ public class FeedRefreshUpdater {
}
}
}
-
- public int getQueueSize() {
- return pool.getQueueSize();
- }
-
- public int getActiveCount() {
- return pool.getActiveCount();
- }
-
}
diff --git a/src/main/java/com/commafeed/backend/feeds/FeedRefreshWorker.java b/src/main/java/com/commafeed/backend/feeds/FeedRefreshWorker.java
index 7fb0d687..4c198fa4 100644
--- a/src/main/java/com/commafeed/backend/feeds/FeedRefreshWorker.java
+++ b/src/main/java/com/commafeed/backend/feeds/FeedRefreshWorker.java
@@ -13,6 +13,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.time.DateUtils;
+import com.codahale.metrics.MetricRegistry;
import com.commafeed.backend.HttpGetter.NotModifiedException;
import com.commafeed.backend.feeds.FeedRefreshExecutor.Task;
import com.commafeed.backend.model.ApplicationSettings;
@@ -37,6 +38,9 @@ public class FeedRefreshWorker {
@Inject
FeedRefreshTaskGiver taskGiver;
+ @Inject
+ MetricRegistry metrics;
+
@Inject
ApplicationSettingsService applicationSettingsService;
@@ -46,7 +50,7 @@ public class FeedRefreshWorker {
private void init() {
ApplicationSettings settings = applicationSettingsService.get();
int threads = settings.getBackgroundThreads();
- pool = new FeedRefreshExecutor("feed-refresh-worker", threads, Math.min(20 * threads, 1000));
+ pool = new FeedRefreshExecutor("feed-refresh-worker", threads, Math.min(20 * threads, 1000), metrics);
}
@PreDestroy
@@ -58,14 +62,6 @@ public class FeedRefreshWorker {
pool.execute(new FeedTask(context));
}
- public int getQueueSize() {
- return pool.getQueueSize();
- }
-
- public int getActiveCount() {
- return pool.getActiveCount();
- }
-
private class FeedTask implements Task {
private FeedRefreshContext context;
diff --git a/src/main/java/com/commafeed/backend/metrics/MetricRegistryProducer.java b/src/main/java/com/commafeed/backend/metrics/MetricRegistryProducer.java
new file mode 100644
index 00000000..9690afe4
--- /dev/null
+++ b/src/main/java/com/commafeed/backend/metrics/MetricRegistryProducer.java
@@ -0,0 +1,17 @@
+package com.commafeed.backend.metrics;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+
+import com.codahale.metrics.MetricRegistry;
+
+@ApplicationScoped
+public class MetricRegistryProducer {
+
+ private final MetricRegistry registry = new MetricRegistry();
+
+ @Produces
+ public MetricRegistry produceMetricsRegistry() {
+ return registry;
+ }
+}
diff --git a/src/main/java/com/commafeed/backend/feeds/OPMLExporter.java b/src/main/java/com/commafeed/backend/opml/OPMLExporter.java
similarity index 95%
rename from src/main/java/com/commafeed/backend/feeds/OPMLExporter.java
rename to src/main/java/com/commafeed/backend/opml/OPMLExporter.java
index a75faac1..f0ed28d6 100644
--- a/src/main/java/com/commafeed/backend/feeds/OPMLExporter.java
+++ b/src/main/java/com/commafeed/backend/opml/OPMLExporter.java
@@ -1,4 +1,4 @@
-package com.commafeed.backend.feeds;
+package com.commafeed.backend.opml;
import java.util.Date;
import java.util.List;
diff --git a/src/main/java/com/commafeed/backend/feeds/OPMLImporter.java b/src/main/java/com/commafeed/backend/opml/OPMLImporter.java
similarity index 94%
rename from src/main/java/com/commafeed/backend/feeds/OPMLImporter.java
rename to src/main/java/com/commafeed/backend/opml/OPMLImporter.java
index 8998fd3f..1aa663d1 100644
--- a/src/main/java/com/commafeed/backend/feeds/OPMLImporter.java
+++ b/src/main/java/com/commafeed/backend/opml/OPMLImporter.java
@@ -1,4 +1,4 @@
-package com.commafeed.backend.feeds;
+package com.commafeed.backend.opml;
import java.io.StringReader;
import java.util.List;
@@ -15,6 +15,7 @@ import org.apache.commons.lang.StringUtils;
import com.commafeed.backend.cache.CacheService;
import com.commafeed.backend.dao.FeedCategoryDAO;
+import com.commafeed.backend.feeds.FeedUtils;
import com.commafeed.backend.model.FeedCategory;
import com.commafeed.backend.model.User;
import com.commafeed.backend.services.FeedSubscriptionService;
diff --git a/src/main/java/com/commafeed/backend/DatabaseCleaner.java b/src/main/java/com/commafeed/backend/services/DatabaseCleaningService.java
similarity index 91%
rename from src/main/java/com/commafeed/backend/DatabaseCleaner.java
rename to src/main/java/com/commafeed/backend/services/DatabaseCleaningService.java
index 1591a4fa..d26d497f 100644
--- a/src/main/java/com/commafeed/backend/DatabaseCleaner.java
+++ b/src/main/java/com/commafeed/backend/services/DatabaseCleaningService.java
@@ -1,4 +1,4 @@
-package com.commafeed.backend;
+package com.commafeed.backend.services;
import java.util.Calendar;
import java.util.Date;
@@ -16,14 +16,13 @@ import com.commafeed.backend.dao.FeedEntryStatusDAO;
import com.commafeed.backend.dao.FeedSubscriptionDAO;
import com.commafeed.backend.model.Feed;
import com.commafeed.backend.model.FeedSubscription;
-import com.commafeed.backend.services.ApplicationSettingsService;
/**
* Contains utility methods for cleaning the database
*
*/
@Slf4j
-public class DatabaseCleaner {
+public class DatabaseCleaningService {
@Inject
FeedDAO feedDAO;
diff --git a/src/main/java/com/commafeed/backend/DatabaseUpdater.java b/src/main/java/com/commafeed/backend/startup/DatabaseUpdater.java
similarity index 95%
rename from src/main/java/com/commafeed/backend/DatabaseUpdater.java
rename to src/main/java/com/commafeed/backend/startup/DatabaseUpdater.java
index e0a25eca..1bdd1e24 100644
--- a/src/main/java/com/commafeed/backend/DatabaseUpdater.java
+++ b/src/main/java/com/commafeed/backend/startup/DatabaseUpdater.java
@@ -1,4 +1,4 @@
-package com.commafeed.backend;
+package com.commafeed.backend.startup;
import java.sql.Connection;
diff --git a/src/main/java/com/commafeed/backend/StartupBean.java b/src/main/java/com/commafeed/backend/startup/StartupBean.java
similarity index 94%
rename from src/main/java/com/commafeed/backend/StartupBean.java
rename to src/main/java/com/commafeed/backend/startup/StartupBean.java
index e895ceef..77e47b06 100644
--- a/src/main/java/com/commafeed/backend/StartupBean.java
+++ b/src/main/java/com/commafeed/backend/startup/StartupBean.java
@@ -1,4 +1,4 @@
-package com.commafeed.backend;
+package com.commafeed.backend.startup;
import java.io.InputStream;
import java.io.InputStreamReader;
diff --git a/src/main/java/com/commafeed/frontend/pages/BasePage.java b/src/main/java/com/commafeed/frontend/pages/BasePage.java
index f0f96b96..4d6eeefc 100644
--- a/src/main/java/com/commafeed/frontend/pages/BasePage.java
+++ b/src/main/java/com/commafeed/frontend/pages/BasePage.java
@@ -15,7 +15,6 @@ import org.apache.wicket.markup.html.TransparentWebMarkupContainer;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
-import com.commafeed.backend.StartupBean;
import com.commafeed.backend.dao.FeedCategoryDAO;
import com.commafeed.backend.dao.FeedDAO;
import com.commafeed.backend.dao.FeedEntryDAO;
@@ -29,6 +28,7 @@ import com.commafeed.backend.model.User;
import com.commafeed.backend.model.UserSettings;
import com.commafeed.backend.services.ApplicationSettingsService;
import com.commafeed.backend.services.MailService;
+import com.commafeed.backend.startup.StartupBean;
import com.commafeed.frontend.CommaFeedSession;
import com.commafeed.frontend.utils.WicketUtils;
import com.google.common.collect.Maps;
diff --git a/src/main/java/com/commafeed/frontend/pages/DemoLoginPage.java b/src/main/java/com/commafeed/frontend/pages/DemoLoginPage.java
index 98daa197..a61ca868 100644
--- a/src/main/java/com/commafeed/frontend/pages/DemoLoginPage.java
+++ b/src/main/java/com/commafeed/frontend/pages/DemoLoginPage.java
@@ -4,8 +4,8 @@ import javax.inject.Inject;
import org.apache.wicket.markup.html.WebPage;
-import com.commafeed.backend.StartupBean;
import com.commafeed.backend.services.UserService;
+import com.commafeed.backend.startup.StartupBean;
import com.commafeed.frontend.CommaFeedSession;
public class DemoLoginPage extends WebPage {
diff --git a/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java b/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java
index 788eb6f4..929e1a3d 100644
--- a/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java
+++ b/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java
@@ -24,6 +24,8 @@ import org.apache.wicket.protocol.http.servlet.ServletWebResponse;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.util.crypt.Base64;
+import com.codahale.metrics.Meter;
+import com.codahale.metrics.MetricRegistry;
import com.commafeed.backend.dao.UserDAO;
import com.commafeed.backend.model.User;
import com.commafeed.backend.model.UserRole.Role;
@@ -42,6 +44,9 @@ public abstract class AbstractREST {
@Context
private HttpServletResponse response;
+ @Inject
+ MetricRegistry metrics;
+
@Inject
private UserDAO userDAO;
@@ -93,10 +98,14 @@ public abstract class AbstractREST {
}
@AroundInvoke
- public Object checkSecurity(InvocationContext context) throws Exception {
+ public Object intercept(InvocationContext context) throws Exception {
+ Method method = context.getMethod();
+ handleMetric(method);
+
+ // check security
boolean allowed = true;
User user = null;
- Method method = context.getMethod();
+
SecurityCheck check = method.isAnnotationPresent(SecurityCheck.class) ? method.getAnnotation(SecurityCheck.class) : method
.getDeclaringClass().getAnnotation(SecurityCheck.class);
@@ -121,6 +130,11 @@ public abstract class AbstractREST {
return context.proceed();
}
+ private void handleMetric(Method method) {
+ Meter callCount = metrics.meter(MetricRegistry.name(method.getDeclaringClass(), method.getName(), "callCount"));
+ callCount.mark();
+ }
+
private boolean checkRole(Role requiredRole) {
if (requiredRole == Role.NONE) {
return true;
diff --git a/src/main/java/com/commafeed/frontend/rest/resources/AdminREST.java b/src/main/java/com/commafeed/frontend/rest/resources/AdminREST.java
index ea14acc1..2bcda43f 100644
--- a/src/main/java/com/commafeed/frontend/rest/resources/AdminREST.java
+++ b/src/main/java/com/commafeed/frontend/rest/resources/AdminREST.java
@@ -17,9 +17,7 @@ import javax.ws.rs.core.Response.Status;
import org.apache.commons.lang.StringUtils;
-import com.commafeed.backend.DatabaseCleaner;
-import com.commafeed.backend.MetricsBean;
-import com.commafeed.backend.StartupBean;
+import com.codahale.metrics.MetricRegistry;
import com.commafeed.backend.dao.FeedDAO;
import com.commafeed.backend.dao.FeedDAO.DuplicateMode;
import com.commafeed.backend.dao.UserDAO;
@@ -33,14 +31,17 @@ import com.commafeed.backend.model.User;
import com.commafeed.backend.model.UserRole;
import com.commafeed.backend.model.UserRole.Role;
import com.commafeed.backend.services.ApplicationSettingsService;
+import com.commafeed.backend.services.DatabaseCleaningService;
import com.commafeed.backend.services.FeedService;
import com.commafeed.backend.services.PasswordEncryptionService;
import com.commafeed.backend.services.UserService;
+import com.commafeed.backend.startup.StartupBean;
import com.commafeed.frontend.SecurityCheck;
import com.commafeed.frontend.model.FeedCount;
import com.commafeed.frontend.model.UserModel;
import com.commafeed.frontend.model.request.FeedMergeRequest;
import com.commafeed.frontend.model.request.IDRequest;
+import com.commafeed.frontend.rest.PrettyPrint;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -70,10 +71,10 @@ public class AdminREST extends AbstractREST {
FeedDAO feedDAO;
@Inject
- MetricsBean metricsBean;
+ MetricRegistry metrics;
@Inject
- DatabaseCleaner cleaner;
+ DatabaseCleaningService cleaner;
@Inject
FeedRefreshWorker feedRefreshWorker;
@@ -227,20 +228,8 @@ public class AdminREST extends AbstractREST {
@Path("/metrics")
@GET
@ApiOperation(value = "Retrieve server metrics")
- public Response getMetrics(@QueryParam("backlog") @DefaultValue("false") boolean backlog) {
- Map map = Maps.newLinkedHashMap();
- map.put("lastMinute", metricsBean.getLastMinute());
- map.put("lastHour", metricsBean.getLastHour());
- if (backlog) {
- map.put("backlog", taskGiver.getUpdatableCount());
- }
- map.put("http_active", feedRefreshWorker.getActiveCount());
- map.put("http_queue", feedRefreshWorker.getQueueSize());
- map.put("database_active", feedRefreshUpdater.getActiveCount());
- map.put("database_queue", feedRefreshUpdater.getQueueSize());
- map.put("cache", metricsBean.getCacheStats());
-
- return Response.ok(map).build();
+ public Response getMetrics() {
+ return Response.ok(metrics).build();
}
@Path("/cleanup/feeds")
diff --git a/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java b/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java
index f9e5fead..b9810aea 100644
--- a/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java
+++ b/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java
@@ -37,7 +37,6 @@ import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
-import com.commafeed.backend.StartupBean;
import com.commafeed.backend.cache.CacheService;
import com.commafeed.backend.dao.FeedCategoryDAO;
import com.commafeed.backend.dao.FeedEntryStatusDAO;
@@ -47,8 +46,6 @@ import com.commafeed.backend.feeds.FeedFetcher;
import com.commafeed.backend.feeds.FeedRefreshTaskGiver;
import com.commafeed.backend.feeds.FeedUtils;
import com.commafeed.backend.feeds.FetchedFeed;
-import com.commafeed.backend.feeds.OPMLExporter;
-import com.commafeed.backend.feeds.OPMLImporter;
import com.commafeed.backend.model.Feed;
import com.commafeed.backend.model.FeedCategory;
import com.commafeed.backend.model.FeedEntryStatus;
@@ -56,9 +53,12 @@ import com.commafeed.backend.model.FeedSubscription;
import com.commafeed.backend.model.UserRole.Role;
import com.commafeed.backend.model.UserSettings.ReadingMode;
import com.commafeed.backend.model.UserSettings.ReadingOrder;
+import com.commafeed.backend.opml.OPMLExporter;
+import com.commafeed.backend.opml.OPMLImporter;
import com.commafeed.backend.services.ApplicationSettingsService;
import com.commafeed.backend.services.FeedEntryService;
import com.commafeed.backend.services.FeedSubscriptionService;
+import com.commafeed.backend.startup.StartupBean;
import com.commafeed.frontend.SecurityCheck;
import com.commafeed.frontend.model.Entries;
import com.commafeed.frontend.model.Entry;
diff --git a/src/main/java/com/commafeed/frontend/rest/resources/PubSubHubbubCallbackREST.java b/src/main/java/com/commafeed/frontend/rest/resources/PubSubHubbubCallbackREST.java
index 2feddbdf..96ab38c5 100644
--- a/src/main/java/com/commafeed/frontend/rest/resources/PubSubHubbubCallbackREST.java
+++ b/src/main/java/com/commafeed/frontend/rest/resources/PubSubHubbubCallbackREST.java
@@ -3,6 +3,7 @@ package com.commafeed.frontend.rest.resources;
import java.util.Date;
import java.util.List;
+import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
@@ -22,7 +23,8 @@ import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
-import com.commafeed.backend.MetricsBean;
+import com.codahale.metrics.Meter;
+import com.codahale.metrics.MetricRegistry;
import com.commafeed.backend.dao.FeedDAO;
import com.commafeed.backend.feeds.FeedParser;
import com.commafeed.backend.feeds.FeedRefreshTaskGiver;
@@ -52,8 +54,13 @@ public class PubSubHubbubCallbackREST extends AbstractREST {
@Inject
ApplicationSettingsService applicationSettingsService;
- @Inject
- MetricsBean metricsBean;
+ private Meter pushReceived;
+
+ @PostConstruct
+ public void initMetrics() {
+ pushReceived = metrics.meter(MetricRegistry.name(getClass(), "pushReceived"));
+
+ }
@Path("/callback")
@GET
@@ -119,7 +126,7 @@ public class PubSubHubbubCallbackREST extends AbstractREST {
log.debug("pushing content to queue for {}", feed.getUrl());
taskGiver.add(feed, false);
}
- metricsBean.pushReceived(feeds.size());
+ pushReceived.mark();
} catch (Exception e) {
log.error("Could not parse pubsub callback: " + e.getMessage());
diff --git a/src/main/java/com/commafeed/frontend/rest/resources/ServerREST.java b/src/main/java/com/commafeed/frontend/rest/resources/ServerREST.java
index 83c4d1ed..e99ebb09 100644
--- a/src/main/java/com/commafeed/frontend/rest/resources/ServerREST.java
+++ b/src/main/java/com/commafeed/frontend/rest/resources/ServerREST.java
@@ -10,10 +10,10 @@ import javax.ws.rs.core.Response.Status;
import com.commafeed.backend.HttpGetter;
import com.commafeed.backend.HttpGetter.HttpResult;
-import com.commafeed.backend.StartupBean;
import com.commafeed.backend.feeds.FeedUtils;
import com.commafeed.backend.services.ApplicationPropertiesService;
import com.commafeed.backend.services.ApplicationSettingsService;
+import com.commafeed.backend.startup.StartupBean;
import com.commafeed.frontend.model.ServerInfo;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
diff --git a/src/main/java/com/commafeed/frontend/rest/resources/UserREST.java b/src/main/java/com/commafeed/frontend/rest/resources/UserREST.java
index f1629aa9..b20bc20e 100644
--- a/src/main/java/com/commafeed/frontend/rest/resources/UserREST.java
+++ b/src/main/java/com/commafeed/frontend/rest/resources/UserREST.java
@@ -11,7 +11,6 @@ import javax.ws.rs.core.Response.Status;
import org.apache.commons.lang.StringUtils;
-import com.commafeed.backend.StartupBean;
import com.commafeed.backend.dao.UserDAO;
import com.commafeed.backend.dao.UserRoleDAO;
import com.commafeed.backend.dao.UserSettingsDAO;
@@ -25,6 +24,7 @@ import com.commafeed.backend.model.UserSettings.ViewMode;
import com.commafeed.backend.services.ApplicationSettingsService;
import com.commafeed.backend.services.PasswordEncryptionService;
import com.commafeed.backend.services.UserService;
+import com.commafeed.backend.startup.StartupBean;
import com.commafeed.frontend.SecurityCheck;
import com.commafeed.frontend.model.Settings;
import com.commafeed.frontend.model.UserModel;