diff --git a/src/site/markdown/development.md b/src/site/markdown/development.md index 6fcdf9efb798836c2d72e3080e253ed32e79ff01..7266414ebdd55887ae57945f917226eea18e4cc4 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 f8709715009068f78b7b16193945536a6be63202..ba64f70c841a7a743144753e3ceba5e1d69a6e96 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 6e9979f2c766711a1715aa8e60f82215b19cce20..85b33fc3913c6287796227e45251b065fcb230a1 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 856d1ff41dfe027e66320c99ced69fdf4020e990..3f2acc51a7f535af4ff705219273f68af65b0229 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 a70b4b81f3a1addafcff0bad1a6a168d7e97f37b..e8e63839e6872081c353155a7b7b7699725f943f 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 1da6967a10a51ef62ff60f37dbd73c39c15bef1e..9cd97a74db3594a6254cba305d561ed575fbccac 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); + } }