From 46b461ecf6f5152d7d158f2b38944d89e75edd43 Mon Sep 17 00:00:00 2001 From: Olivier Maury <Olivier.Maury@inrae.fr> Date: Tue, 18 Feb 2025 10:18:28 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20initialiser=20la=20m=C3=A9trique=20'vis?= =?UTF-8?q?its'=20avec=20le=20nombre=20total=20de=20visites?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/site/markdown/development.md | 11 ++++++++++ .../www/server/dao/DailyVisitDao.java | 8 ++++++++ .../server/dao/DailyVisitDaoHibernate.java | 20 ++++++++++++++++--- .../www/server/dao/DaoHibernate.java | 14 ++++++------- .../scheduled/BackgroundJobManager.java | 17 ++++++++++++++++ .../dao/DailyVisitDaoHibernateTest.java | 16 +++++++++++++++ 6 files changed, 75 insertions(+), 11 deletions(-) diff --git a/src/site/markdown/development.md b/src/site/markdown/development.md index 6fcdf9e..7266414 100644 --- a/src/site/markdown/development.md +++ b/src/site/markdown/development.md @@ -102,3 +102,14 @@ To run static analyses: `mvn checkstyle:checkstyle pmd:pmd pmd:cpd`. To run one test class: `mvn test -DfailIfNoTests=false -Dsurefire.failIfNoSpecifiedTests=false -Dtest=fr.agrometinfo.www.server.rs.IndicatorResourceTest`. +## Check SAVA response from servlet + +These are values from [SAVA README.md](https://forgemia.inra.fr/agroclim/sava/-/blob/main/README.md?ref_type=heads), they must be adapted. +Port 8080 is the default for Tomcat in Eclipse. + +```sh +SAVA_KEY="HldIAeGvVxgxFcBj8z2j" +SAVA_PASS="AfEy82sBOD0yVvUeoMM6" +BASE64_AUTH=$(echo -n "$SAVA_KEY:$SAVA_PASS" | base64) +curl http://localhost:8080/www-server/metrics --header "Authorization: Basic $BASE64_AUTH" +``` diff --git a/www-server/src/main/java/fr/agrometinfo/www/server/dao/DailyVisitDao.java b/www-server/src/main/java/fr/agrometinfo/www/server/dao/DailyVisitDao.java index f870971..ba64f70 100644 --- a/www-server/src/main/java/fr/agrometinfo/www/server/dao/DailyVisitDao.java +++ b/www-server/src/main/java/fr/agrometinfo/www/server/dao/DailyVisitDao.java @@ -15,6 +15,14 @@ public interface DailyVisitDao { */ List<DailyVisit> findAll(); + /** + * Get the total number of visits for the environment. + * + * @param environment code + * @return total number of visits for the environment + */ + Long getTotalNumberOfVisits(String environment); + /** * Increment the daily value if exists or add a new row with 1 as total number * of visits. diff --git a/www-server/src/main/java/fr/agrometinfo/www/server/dao/DailyVisitDaoHibernate.java b/www-server/src/main/java/fr/agrometinfo/www/server/dao/DailyVisitDaoHibernate.java index 6e9979f..85b33fc 100644 --- a/www-server/src/main/java/fr/agrometinfo/www/server/dao/DailyVisitDaoHibernate.java +++ b/www-server/src/main/java/fr/agrometinfo/www/server/dao/DailyVisitDaoHibernate.java @@ -1,5 +1,7 @@ package fr.agrometinfo.www.server.dao; +import java.util.Map; + import fr.agrometinfo.www.server.model.DailyVisit; import jakarta.enterprise.context.ApplicationScoped; import jakarta.transaction.Transactional; @@ -11,17 +13,23 @@ import jakarta.transaction.Transactional; */ @ApplicationScoped public class DailyVisitDaoHibernate extends DaoHibernate<DailyVisit> implements DailyVisitDao { + /** + * Query parameter. + */ + private static final String PARAM_ENVIRONMENT = "environment"; + /** * Statement to insert a new row. */ private static final String INSERT_SQL = """ INSERT INTO dailyvisit (date, environment, number) VALUES (CURRENT_DATE, :environment, 1) """; + /** * Statement to increment. */ private static final String UPDATE_SQL = """ - UPDATE dailyvisit SET number=number+1 WHERE date=CURRENT_DATE and environment=:environment + UPDATE dailyvisit SET number=number+1 WHERE date=CURRENT_DATE AND environment=:environment """; /** @@ -31,6 +39,12 @@ public class DailyVisitDaoHibernate extends DaoHibernate<DailyVisit> implements super(DailyVisit.class); } + @Override + public final Long getTotalNumberOfVisits(final String environment) { + final var sql = "SELECT COALESCE(SUM(number), 0) FROM dailyvisit WHERE environment=?1"; + return findFirstScalar(sql, Map.of(1, environment)); + } + @Transactional @Override public final void increment(final String environment) { @@ -38,11 +52,11 @@ public class DailyVisitDaoHibernate extends DaoHibernate<DailyVisit> implements // MERGE is available in PostgreSQL >= 14 and H2 doInJpaTransaction(em -> { var query = em.createNativeQuery(UPDATE_SQL); - query.setParameter("environment", environment); + query.setParameter(PARAM_ENVIRONMENT, environment); final var nb = query.executeUpdate(); if (nb == 0) { query = em.createNativeQuery(INSERT_SQL); - query.setParameter("environment", environment); + query.setParameter(PARAM_ENVIRONMENT, environment); query.executeUpdate(); } }); diff --git a/www-server/src/main/java/fr/agrometinfo/www/server/dao/DaoHibernate.java b/www-server/src/main/java/fr/agrometinfo/www/server/dao/DaoHibernate.java index 856d1ff..3f2acc5 100644 --- a/www-server/src/main/java/fr/agrometinfo/www/server/dao/DaoHibernate.java +++ b/www-server/src/main/java/fr/agrometinfo/www/server/dao/DaoHibernate.java @@ -317,19 +317,17 @@ class DaoHibernate<T> { * @return size of all content of a schema, in bytes */ public BigDecimal getSchemaSize(final String schema) { - try (ScopedEntityManager em = getScopedEntityManager()) { - if (isPostgreSQLDriver()) { + if (isPostgreSQLDriver()) { + try (ScopedEntityManager em = getScopedEntityManager()) { final String sql = """ SELECT SUM(pg_total_relation_size(CONCAT(quote_ident(schemaname), '.', quote_ident(tablename)))) - FROM pg_catalog.pg_tables WHERE schemaname=:schema + FROM pg_catalog.pg_tables WHERE schemaname=?1 """; - final Query query = em.createNativeQuery(sql); - query.setParameter("schema", schema); - return (BigDecimal) query.getSingleResult(); - } else { - throw new UnsupportedOperationException("Database driver not handled! " + getDriver()); + return findFirstScalar(sql, Map.of(1, schema)); } + } else { + throw new UnsupportedOperationException("Database driver not handled! " + getDriver()); } } diff --git a/www-server/src/main/java/fr/agrometinfo/www/server/scheduled/BackgroundJobManager.java b/www-server/src/main/java/fr/agrometinfo/www/server/scheduled/BackgroundJobManager.java index a70b4b8..e8e6383 100644 --- a/www-server/src/main/java/fr/agrometinfo/www/server/scheduled/BackgroundJobManager.java +++ b/www-server/src/main/java/fr/agrometinfo/www/server/scheduled/BackgroundJobManager.java @@ -10,6 +10,9 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import fr.agroclim.sava.core.SavaUtils; +import fr.agrometinfo.www.server.AgroMetInfoConfiguration; +import fr.agrometinfo.www.server.AgroMetInfoConfiguration.ConfigurationKey; +import fr.agrometinfo.www.server.dao.DailyVisitDao; import fr.agrometinfo.www.server.dao.IndicatorDao; import fr.agrometinfo.www.server.dao.PersistenceManager; import jakarta.inject.Inject; @@ -54,6 +57,18 @@ public class BackgroundJobManager implements ServletContextListener { return Duration.between(now, next).getSeconds(); } + /** + * Application configuration. + */ + @Inject + private AgroMetInfoConfiguration configuration; + + /** + * DAO providing total number of visits. + */ + @Inject + private DailyVisitDao dailyVisitDao; + /** * DAO providing database details. */ @@ -87,6 +102,8 @@ public class BackgroundJobManager implements ServletContextListener { private void initMetrics() { SavaUtils.addGauge("schema_size", "Database schema size, in bytes", "schema_name"); SavaUtils.addCounter("visits", "Number of visits", null); + final var environment = configuration.get(ConfigurationKey.ENVIRONMENT); + SavaUtils.incrementCounter("visits", null, dailyVisitDao.getTotalNumberOfVisits(environment).doubleValue()); } /** diff --git a/www-server/src/test/java/fr/agrometinfo/www/server/dao/DailyVisitDaoHibernateTest.java b/www-server/src/test/java/fr/agrometinfo/www/server/dao/DailyVisitDaoHibernateTest.java index 1da6967..9cd97a7 100644 --- a/www-server/src/test/java/fr/agrometinfo/www/server/dao/DailyVisitDaoHibernateTest.java +++ b/www-server/src/test/java/fr/agrometinfo/www/server/dao/DailyVisitDaoHibernateTest.java @@ -36,4 +36,20 @@ class DailyVisitDaoHibernateTest { assertFalse(actual.isEmpty()); assertEquals(2, actual.get(0).getNumber()); } + + @Test + void getTotalNumberOfVisits() { + final var environment = "test2"; + Long actual = dao.getTotalNumberOfVisits(environment); + // when no visit is done: 0 + assertEquals(0L, actual); + + dao.increment(environment); + actual = dao.getTotalNumberOfVisits(environment); + assertEquals(1L, actual); + + dao.increment(environment); + actual = dao.getTotalNumberOfVisits(environment); + assertEquals(2L, actual); + } } -- GitLab