From a22c0807187209dff6eaec53e41a46a4075e7214 Mon Sep 17 00:00:00 2001 From: Antonis Lempesis Date: Fri, 26 Jan 2024 13:48:32 +0200 Subject: [PATCH] added a rudimentary stats method --- .../controllers/CacheController.java | 5 +++ .../statstool/repositories/StatsCache.java | 3 ++ .../repositories/StatsDBRepository.java | 41 +++++++++++++++++-- .../repositories/StatsRedisRepository.java | 6 +++ .../statstool/services/CacheService.java | 4 ++ .../statstool/services/CacheServiceImpl.java | 4 ++ 6 files changed, 60 insertions(+), 3 deletions(-) diff --git a/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/controllers/CacheController.java b/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/controllers/CacheController.java index 19947b5..d4fe12a 100644 --- a/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/controllers/CacheController.java +++ b/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/controllers/CacheController.java @@ -22,4 +22,9 @@ public class CacheController { public void dropCache() throws Exception { cacheService.dropCache(); } + + @GetMapping("stats") + public void getStats() throws Exception { + cacheService.getStats(); + } } \ No newline at end of file diff --git a/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/repositories/StatsCache.java b/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/repositories/StatsCache.java index 23f9a16..202e9a9 100644 --- a/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/repositories/StatsCache.java +++ b/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/repositories/StatsCache.java @@ -6,6 +6,7 @@ import java.security.MessageDigest; import java.util.List; +import java.util.Map; public interface StatsCache { static String getCacheKey(String query, List parameters, String dbId) throws Exception { @@ -44,4 +45,6 @@ static String MD5(String string) throws Exception { return sb.toString(); } + + Map stats() throws Exception; } diff --git a/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/repositories/StatsDBRepository.java b/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/repositories/StatsDBRepository.java index 657b1b3..27e75d6 100644 --- a/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/repositories/StatsDBRepository.java +++ b/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/repositories/StatsDBRepository.java @@ -16,9 +16,7 @@ import javax.sql.DataSource; import java.io.IOException; import java.sql.Timestamp; -import java.util.Collections; -import java.util.Date; -import java.util.List; +import java.util.*; @Repository @ConditionalOnProperty( @@ -191,4 +189,41 @@ public void deleteEntry(String key) { jdbcTemplate.update("delete from cache_entry where key=?", key); } + + public Map stats() { + DatasourceContext.setContext(CACHE_DB_NAME); + + Map stats = new HashMap<>(); + + stats.put("total", jdbcTemplate.queryForObject("select count(*) from cache_entry",new Object[] {}, Integer.class)); + stats.put("with_shadow", jdbcTemplate.queryForObject("select count(*) from cache_entry where shadow is not null",new Object[] {}, Integer.class)); + stats.put("top10", jdbcTemplate.query("select * from cache_entry where key not in ('SHADOW_STATS_NUMBERS', 'STATS_NUMBERS') order by total_hits", (rs, rowNum) -> { + CacheEntry entry = null; + + try { + QueryWithParameters query = new ObjectMapper().readValue(rs.getString("query"), QueryWithParameters.class); + String key = rs.getString("key"); + Result result = new ObjectMapper().readValue(rs.getString("result"), Result.class); + + entry = new CacheEntry(key, query, result); + + if (rs.getTimestamp("created") != null) + entry.setCreated(new Date(rs.getTimestamp("created").getTime())); + if (rs.getTimestamp("updated") != null) + entry.setUpdated(new Date(rs.getTimestamp("updated").getTime())); + if (rs.getString("shadow") != null) + entry.setShadowResult(new ObjectMapper().readValue(rs.getString("shadow"), Result.class)); + + entry.setTotalHits(rs.getInt("total_hits")); + entry.setSessionHits(rs.getInt("session_hits")); + entry.setPinned(rs.getBoolean("pinned")); + } catch (IOException e) { + log.error("Error reading entry", e); + } + + return entry; + })); + + return stats; + } } diff --git a/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/repositories/StatsRedisRepository.java b/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/repositories/StatsRedisRepository.java index cb0aaaf..2497ae5 100644 --- a/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/repositories/StatsRedisRepository.java +++ b/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/repositories/StatsRedisRepository.java @@ -167,4 +167,10 @@ public void deleteEntry(String key) { redisTemplate.delete(key); } + + @Override + public Map stats() throws Exception { + // TODO implement + return new HashMap<>(); + } } \ No newline at end of file diff --git a/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/services/CacheService.java b/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/services/CacheService.java index 0dbe3ff..3377572 100644 --- a/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/services/CacheService.java +++ b/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/services/CacheService.java @@ -1,5 +1,7 @@ package gr.uoa.di.madgik.statstool.services; +import java.util.Map; + public interface CacheService { public void updateCache(); @@ -7,4 +9,6 @@ public interface CacheService { public void promoteCache(); public void dropCache() throws Exception; + + public Map getStats() throws Exception; } diff --git a/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/services/CacheServiceImpl.java b/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/services/CacheServiceImpl.java index 95fb897..cf0965c 100644 --- a/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/services/CacheServiceImpl.java +++ b/DBAccess/src/main/java/gr/uoa/di/madgik/statstool/services/CacheServiceImpl.java @@ -56,6 +56,10 @@ public void dropCache() throws Exception { this.statsCache.dropCache(); } + public Map getStats() throws Exception { + return this.statsCache.stats(); + } + private void doUpdateCache() { log.info("Starting cache update"); List entries = statsCache.getEntries();