diff --git a/donkey/src/main/java/com/mirth/connect/donkey/server/controllers/ChannelController.java b/donkey/src/main/java/com/mirth/connect/donkey/server/controllers/ChannelController.java index c3b219087a..adac29ec2c 100644 --- a/donkey/src/main/java/com/mirth/connect/donkey/server/controllers/ChannelController.java +++ b/donkey/src/main/java/com/mirth/connect/donkey/server/controllers/ChannelController.java @@ -86,10 +86,18 @@ public Statistics getTotalStatistics() { } public Statistics getStatisticsFromStorage(String serverId) { + return getStatisticsFromStorage(serverId, null); + } + + /** + * The stored current statistics of the given channels, or of every channel when + * {@code channelIds} is null or empty. + */ + public Statistics getStatisticsFromStorage(String serverId, Set channelIds) { DonkeyDao dao = donkey.getReadOnlyDaoFactory().getDao(); try { - return dao.getChannelStatistics(serverId); + return dao.getChannelStatistics(serverId, channelIds); } finally { dao.close(); } @@ -106,10 +114,15 @@ public List getPortsInUse() { } public Statistics getTotalStatisticsFromStorage(String serverId) { + return getTotalStatisticsFromStorage(serverId, null); + } + + /** The lifetime counterpart of {@link #getStatisticsFromStorage(String, Set)}. */ + public Statistics getTotalStatisticsFromStorage(String serverId, Set channelIds) { DonkeyDao dao = donkey.getReadOnlyDaoFactory().getDao(); try { - return dao.getChannelTotalStatistics(serverId); + return dao.getChannelTotalStatistics(serverId, channelIds); } finally { dao.close(); } diff --git a/donkey/src/main/java/com/mirth/connect/donkey/server/data/DonkeyDao.java b/donkey/src/main/java/com/mirth/connect/donkey/server/data/DonkeyDao.java index 032d65986e..320b7f2d60 100644 --- a/donkey/src/main/java/com/mirth/connect/donkey/server/data/DonkeyDao.java +++ b/donkey/src/main/java/com/mirth/connect/donkey/server/data/DonkeyDao.java @@ -130,7 +130,13 @@ public interface DonkeyDao { public Statistics getChannelStatistics(String serverId); + /** The current statistics of the given channels only. A null or empty set means every channel. */ + public Statistics getChannelStatistics(String serverId, Set channelIds); + public Statistics getChannelTotalStatistics(String serverId); + + /** The lifetime counterpart of {@link #getChannelStatistics(String, Set)}. */ + public Statistics getChannelTotalStatistics(String serverId, Set channelIds); public List getPortsInUse(); diff --git a/donkey/src/main/java/com/mirth/connect/donkey/server/data/buffered/BufferedDao.java b/donkey/src/main/java/com/mirth/connect/donkey/server/data/buffered/BufferedDao.java index fc1c2efbaa..001aa93a2e 100644 --- a/donkey/src/main/java/com/mirth/connect/donkey/server/data/buffered/BufferedDao.java +++ b/donkey/src/main/java/com/mirth/connect/donkey/server/data/buffered/BufferedDao.java @@ -579,6 +579,17 @@ public Statistics getChannelStatistics(String serverId) { } } + @Override + public Statistics getChannelStatistics(String serverId, Set channelIds) { + DonkeyDao dao = getDelegateDao(); + + try { + return dao.getChannelStatistics(serverId, channelIds); + } finally { + dao.close(); + } + } + @Override public Statistics getChannelTotalStatistics(String serverId) { DonkeyDao dao = getDelegateDao(); @@ -589,6 +600,17 @@ public Statistics getChannelTotalStatistics(String serverId) { dao.close(); } } + + @Override + public Statistics getChannelTotalStatistics(String serverId, Set channelIds) { + DonkeyDao dao = getDelegateDao(); + + try { + return dao.getChannelTotalStatistics(serverId, channelIds); + } finally { + dao.close(); + } + } @Override public List getPortsInUse() { diff --git a/donkey/src/main/java/com/mirth/connect/donkey/server/data/jdbc/JdbcDao.java b/donkey/src/main/java/com/mirth/connect/donkey/server/data/jdbc/JdbcDao.java index 999b863f0c..227098eacc 100644 --- a/donkey/src/main/java/com/mirth/connect/donkey/server/data/jdbc/JdbcDao.java +++ b/donkey/src/main/java/com/mirth/connect/donkey/server/data/jdbc/JdbcDao.java @@ -2354,21 +2354,35 @@ public void resetAllStatistics(String channelId) { @Override public Statistics getChannelStatistics(String serverId) { - return getChannelStatistics(serverId, false); + return getChannelStatistics(serverId, null, false); + } + + @Override + public Statistics getChannelStatistics(String serverId, Set channelIds) { + return getChannelStatistics(serverId, channelIds, false); } @Override public Statistics getChannelTotalStatistics(String serverId) { - return getChannelStatistics(serverId, true); + return getChannelStatistics(serverId, null, true); } - private Statistics getChannelStatistics(String serverId, boolean total) { - Map channelIds = getLocalChannelIds(); + @Override + public Statistics getChannelTotalStatistics(String serverId, Set channelIds) { + return getChannelStatistics(serverId, channelIds, true); + } + + private Statistics getChannelStatistics(String serverId, Set requestedChannelIds, boolean total) { + Map localChannelIds = getLocalChannelIds(); String queryId = (total) ? "getChannelTotalStatistics" : "getChannelStatistics"; Statistics statistics = new Statistics(!total); ResultSet resultSet = null; - for (String channelId : channelIds.keySet()) { + for (String channelId : localChannelIds.keySet()) { + if (CollectionUtils.isNotEmpty(requestedChannelIds) && !requestedChannelIds.contains(channelId)) { + continue; + } + PreparedStatement statement = null; try { statement = prepareStatement(queryId, channelId); diff --git a/donkey/src/main/java/com/mirth/connect/donkey/server/data/passthru/PassthruDao.java b/donkey/src/main/java/com/mirth/connect/donkey/server/data/passthru/PassthruDao.java index 9856290c6f..1d24dd06f0 100644 --- a/donkey/src/main/java/com/mirth/connect/donkey/server/data/passthru/PassthruDao.java +++ b/donkey/src/main/java/com/mirth/connect/donkey/server/data/passthru/PassthruDao.java @@ -340,11 +340,21 @@ public Statistics getChannelStatistics(String serverId) { return new Statistics(false); } + @Override + public Statistics getChannelStatistics(String serverId, Set channelIds) { + return new Statistics(false); + } + @Override public Statistics getChannelTotalStatistics(String serverId) { return new Statistics(false); } + @Override + public Statistics getChannelTotalStatistics(String serverId, Set channelIds) { + return new Statistics(false); + } + @Override public List getConnectorMessages(String channelId, long messageId, Set metaDataIds, boolean includeContent) { return null; diff --git a/donkey/src/main/java/com/mirth/connect/donkey/server/data/timed/TimedDao.java b/donkey/src/main/java/com/mirth/connect/donkey/server/data/timed/TimedDao.java index b6234ef99d..a16a760213 100644 --- a/donkey/src/main/java/com/mirth/connect/donkey/server/data/timed/TimedDao.java +++ b/donkey/src/main/java/com/mirth/connect/donkey/server/data/timed/TimedDao.java @@ -662,6 +662,17 @@ public Statistics getChannelStatistics(String serverId) { } } + @Override + public Statistics getChannelStatistics(String serverId, Set channelIds) { + long startTime = System.currentTimeMillis(); + + try { + return dao.getChannelStatistics(serverId, channelIds); + } finally { + timer.log("getChannelStatistics", System.currentTimeMillis() - startTime); + } + } + @Override public Statistics getChannelTotalStatistics(String serverId) { long startTime = System.currentTimeMillis(); @@ -672,6 +683,17 @@ public Statistics getChannelTotalStatistics(String serverId) { timer.log("getChannelTotalStatistics", System.currentTimeMillis() - startTime); } } + + @Override + public Statistics getChannelTotalStatistics(String serverId, Set channelIds) { + long startTime = System.currentTimeMillis(); + + try { + return dao.getChannelTotalStatistics(serverId, channelIds); + } finally { + timer.log("getChannelTotalStatistics", System.currentTimeMillis() - startTime); + } + } @Override public List getPortsInUse() { diff --git a/server/src/main/java/com/mirth/connect/server/api/servlets/ChannelStatisticsServlet.java b/server/src/main/java/com/mirth/connect/server/api/servlets/ChannelStatisticsServlet.java index 48467e6598..6f69628e7d 100644 --- a/server/src/main/java/com/mirth/connect/server/api/servlets/ChannelStatisticsServlet.java +++ b/server/src/main/java/com/mirth/connect/server/api/servlets/ChannelStatisticsServlet.java @@ -105,6 +105,11 @@ public ChannelStatistics getStatistics(String channelId) { if (CollectionUtils.isNotEmpty(channelStatisticsList)) { channelStatistics = channelStatisticsList.get(0); + + // Paranoia: verify that the channel ID matches the requested one + if (!channelId.equals(channelStatistics.getChannelId())) { + throw new IllegalStateException("Channel ID mismatch: expected " + channelId + " but got " + channelStatistics.getChannelId()); + } } else { channelStatistics = new ChannelStatistics(); channelStatistics.setChannelId(channelId); diff --git a/server/src/main/java/com/mirth/connect/server/controllers/ChannelController.java b/server/src/main/java/com/mirth/connect/server/controllers/ChannelController.java index b7897771c7..21b9eede6a 100644 --- a/server/src/main/java/com/mirth/connect/server/controllers/ChannelController.java +++ b/server/src/main/java/com/mirth/connect/server/controllers/ChannelController.java @@ -86,8 +86,12 @@ public static ChannelController getInstance() { public abstract Statistics getStatisticsFromStorage(String serverId); + public abstract Statistics getStatisticsFromStorage(String serverId, Set channelIds); + public abstract Statistics getTotalStatisticsFromStorage(String serverId); + public abstract Statistics getTotalStatisticsFromStorage(String serverId, Set channelIds); + public abstract int getConnectorMessageCount(String channelId, String serverId, int metaDataId, Status status); public abstract void resetStatistics(Map> channelConnectorMap, Set statuses); diff --git a/server/src/main/java/com/mirth/connect/server/controllers/DefaultChannelController.java b/server/src/main/java/com/mirth/connect/server/controllers/DefaultChannelController.java index 2dba0303e5..b42aeb996f 100644 --- a/server/src/main/java/com/mirth/connect/server/controllers/DefaultChannelController.java +++ b/server/src/main/java/com/mirth/connect/server/controllers/DefaultChannelController.java @@ -732,11 +732,21 @@ public Statistics getStatisticsFromStorage(String serverId) { return com.mirth.connect.donkey.server.controllers.ChannelController.getInstance().getStatisticsFromStorage(serverId); } + @Override + public Statistics getStatisticsFromStorage(String serverId, Set channelIds) { + return com.mirth.connect.donkey.server.controllers.ChannelController.getInstance().getStatisticsFromStorage(serverId, channelIds); + } + @Override public Statistics getTotalStatisticsFromStorage(String serverId) { return com.mirth.connect.donkey.server.controllers.ChannelController.getInstance().getTotalStatisticsFromStorage(serverId); } + @Override + public Statistics getTotalStatisticsFromStorage(String serverId, Set channelIds) { + return com.mirth.connect.donkey.server.controllers.ChannelController.getInstance().getTotalStatisticsFromStorage(serverId, channelIds); + } + @Override public int getConnectorMessageCount(String channelId, String serverId, int metaDataId, Status status) { return com.mirth.connect.donkey.server.controllers.ChannelController.getInstance().getConnectorMessageCount(channelId, serverId, metaDataId, status); diff --git a/server/src/main/java/com/mirth/connect/server/controllers/DonkeyEngineController.java b/server/src/main/java/com/mirth/connect/server/controllers/DonkeyEngineController.java index d661850330..88f289fbbe 100644 --- a/server/src/main/java/com/mirth/connect/server/controllers/DonkeyEngineController.java +++ b/server/src/main/java/com/mirth/connect/server/controllers/DonkeyEngineController.java @@ -739,7 +739,7 @@ private Map getDashboardChannels(Set channelIds) { synchronized (deployingChannels) { for (Channel channel : deployingChannels) { - if (!channels.containsKey(channel.getChannelId())) { + if (requested(channelIds, channel) && !channels.containsKey(channel.getChannelId())) { channels.put(channel.getChannelId(), channel); } } @@ -747,7 +747,7 @@ private Map getDashboardChannels(Set channelIds) { synchronized (undeployingChannels) { for (Channel channel : undeployingChannels) { - if (!channels.containsKey(channel.getChannelId())) { + if (requested(channelIds, channel) && !channels.containsKey(channel.getChannelId())) { channels.put(channel.getChannelId(), channel); } } @@ -755,6 +755,11 @@ private Map getDashboardChannels(Set channelIds) { return channels; } + /** Whether one channel is in the set a caller asked about; an empty set means all of them. */ + private boolean requested(Set channelIds, Channel channel) { + return CollectionUtils.isEmpty(channelIds) || channelIds.contains(channel.getChannelId()); + } + @Override public List getChannelStatusList(Set channelIds, boolean includeUndeployed) { List statusList = new ArrayList<>(); @@ -778,8 +783,16 @@ public List getChannelStatusList(Set channelIds, boolea private List getUndeployedDashboardStatuses(Collection channelModels, Map metadataMap) { List statuses = new ArrayList(); - Statistics stats = channelController.getStatisticsFromStorage(configurationController.getServerId()); - Statistics lifetimeStats = channelController.getTotalStatisticsFromStorage(configurationController.getServerId()); + if (channelModels.isEmpty()) { + return statuses; + } + + Set channelIds = new HashSet(); + for (com.mirth.connect.model.Channel channelModel : channelModels) { + channelIds.add(channelModel.getId()); + } + Statistics stats = channelController.getStatisticsFromStorage(configurationController.getServerId(), channelIds); + Statistics lifetimeStats = channelController.getTotalStatisticsFromStorage(configurationController.getServerId(), channelIds); String serverId = configurationController.getServerId(); for (com.mirth.connect.model.Channel channelModel : channelModels) { @@ -1043,7 +1056,15 @@ private List getDashboardChannelStatistics(Collection getUndeployedChannelStatistics(Collection channelModels, Set includeMetaDataIds, Set excludeMetaDataIds) { List statisticsList = new ArrayList(); - Statistics stats = channelController.getStatisticsFromStorage(configurationController.getServerId()); + if (channelModels.isEmpty()) { + return statisticsList; + } + + Set channelIds = new HashSet(); + for (com.mirth.connect.model.Channel channelModel : channelModels) { + channelIds.add(channelModel.getId()); + } + Statistics stats = channelController.getStatisticsFromStorage(configurationController.getServerId(), channelIds); String serverId = configurationController.getServerId();