This is an automated email from the ASF dual-hosted git repository.

sebawagner pushed a commit to branch 
feature/OPENMEETINGS-2567-investigate-performance-monitoring
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to 
refs/heads/feature/OPENMEETINGS-2567-investigate-performance-monitoring by this 
push:
     new 6bbfb51  OPENMEETINGS-2567 Add basic configuration for different types 
of metrics.
6bbfb51 is described below

commit 6bbfb51dd94d7472b937bc3e7880a1b828d5cada
Author: Sebastian Wagner <sebawag...@apache.org>
AuthorDate: Thu Feb 4 20:40:31 2021 +1300

    OPENMEETINGS-2567 Add basic configuration for different types of metrics.
---
 openmeetings-core/pom.xml                          | 13 -----
 .../openmeetings/core/remote/StreamProcessor.java  |  4 +-
 .../apache/openmeetings/db/dao/basic/ChatDao.java  |  9 +++
 .../db/dao/basic/ConfigurationDao.java             |  9 +++
 .../openmeetings/db/dao/file/FileItemDao.java      | 10 ++++
 .../apache/openmeetings/db/dao/room/RoomDao.java   |  5 ++
 .../openmeetings/db/dao/server/SOAPLoginDao.java   |  4 ++
 .../openmeetings/db/dao/server/SessiondataDao.java |  4 ++
 .../apache/openmeetings/db/dao/user/UserDao.java   | 15 +++++
 openmeetings-util/pom.xml                          | 18 ++++++
 .../util/logging/PrometheusAspect.java             | 40 ++++++--------
 .../openmeetings/util/logging/PrometheusUtil.java  | 16 ++++++
 .../logging/{Timed.java => TimedApplication.java}  |  4 +-
 .../logging/{Timed.java => TimedDatabase.java}     |  4 +-
 .../apache/openmeetings/web/room/RoomPanel.java    | 63 ++++++++-------------
 .../openmeetings/web/room/menu/RoomMenuPanel.java  | 64 ++++++++++++----------
 .../openmeetings/web/room/sidebar/RoomSidebar.java | 43 +++++++++------
 17 files changed, 199 insertions(+), 126 deletions(-)

diff --git a/openmeetings-core/pom.xml b/openmeetings-core/pom.xml
index 617b3ae..217fa9e 100644
--- a/openmeetings-core/pom.xml
+++ b/openmeetings-core/pom.xml
@@ -100,19 +100,6 @@
                        <version>${spring.version}</version>
                </dependency>
                <dependency>
-                       <groupId>org.springframework</groupId>
-                       <artifactId>spring-aop</artifactId>
-               </dependency>
-               <dependency>
-                   <groupId>org.aspectj</groupId>
-                   <artifactId>aspectjtools</artifactId>
-                   <version>1.9.6</version>
-               </dependency>
-               <dependency>
-                       <groupId>io.prometheus</groupId>
-                       <artifactId>simpleclient</artifactId>
-               </dependency>
-               <dependency>
                        <groupId>org.kurento</groupId>
                        <artifactId>kurento-client</artifactId>
                </dependency>
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
index 0355abe..18773dd 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
@@ -38,7 +38,6 @@ import 
org.apache.openmeetings.core.converter.IRecordingConverter;
 import org.apache.openmeetings.core.converter.InterviewConverter;
 import org.apache.openmeetings.core.converter.RecordingConverter;
 import org.apache.openmeetings.core.util.WebSocketHelper;
-import org.apache.openmeetings.core.util.logging.Timed;
 import org.apache.openmeetings.db.dao.record.RecordingDao;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.basic.Client.Activity;
@@ -51,6 +50,7 @@ import 
org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.db.manager.IClientManager;
 import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.db.util.ws.TextRoomMessage;
+import org.apache.openmeetings.util.logging.TimedApplication;
 import org.apache.wicket.util.string.Strings;
 import org.kurento.client.IceCandidate;
 import org.kurento.client.internal.server.KurentoServerException;
@@ -84,7 +84,7 @@ public class StreamProcessor implements IStreamProcessor {
        @Autowired
        private InterviewConverter interviewConverter;
 
-       @Timed
+       @TimedApplication
        void onMessage(Client c, final String cmdId, JSONObject msg) {
                final String uid = msg.optString("uid");
                KStream sender;
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
index 2624887..3d5e5a3 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
@@ -28,6 +28,7 @@ import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.entity.basic.ChatMessage;
+import org.apache.openmeetings.util.logging.TimedDatabase;
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -37,6 +38,7 @@ public class ChatDao {
        @PersistenceContext
        private EntityManager em;
 
+       @TimedDatabase
        public ChatMessage get(long id) {
                return em.createNamedQuery("getChatMessageById", 
ChatMessage.class)
                                .setParameter("id", id)
@@ -44,16 +46,19 @@ public class ChatDao {
        }
 
        //for export
+       @TimedDatabase
        public List<ChatMessage> get(long start, long count) {
                return setLimits(em.createNamedQuery("getChatMessages", 
ChatMessage.class)
                                , start, count).getResultList();
        }
 
+       @TimedDatabase
        public List<ChatMessage> getGlobal(long start, long count) {
                return setLimits(em.createNamedQuery("getGlobalChatMessages", 
ChatMessage.class)
                                , start, count).getResultList();
        }
 
+       @TimedDatabase
        public List<ChatMessage> getRoom(long roomId, long start, long count, 
boolean all) {
                return setLimits(em.createNamedQuery("getChatMessagesByRoom", 
ChatMessage.class)
                                        .setParameter("roomId", roomId)
@@ -61,12 +66,14 @@ public class ChatDao {
                                , start, count).getResultList();
        }
 
+       @TimedDatabase
        public List<ChatMessage> getUser(long userId, long start, long count) {
                return setLimits(em.createNamedQuery("getChatMessagesByUser", 
ChatMessage.class)
                                        .setParameter(PARAM_USER_ID, userId)
                                , start, count).getResultList();
        }
 
+       @TimedDatabase
        public List<ChatMessage> getUserRecent(long userId, Date date, long 
start, long count) {
                return 
setLimits(em.createNamedQuery("getChatMessagesByUserTime", ChatMessage.class)
                                        .setParameter(PARAM_USER_ID, userId)
@@ -75,6 +82,7 @@ public class ChatDao {
                                , start, count).getResultList();
        }
 
+       @TimedDatabase
        public void closeMessages(long userId) {
                em.createNamedQuery("chatCloseMessagesByUser")
                        .setParameter(PARAM_USER_ID, userId)
@@ -86,6 +94,7 @@ public class ChatDao {
                return update(entity, null);
        }
 
+       @TimedDatabase
        public ChatMessage update(ChatMessage entity, Date sent) {
                entity.setSent(sent == null ? new Date() : sent);
                if (entity.getId() == null) {
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
index 35d68c7..f039170 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
@@ -48,6 +48,7 @@ import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.basic.Configuration;
 import org.apache.openmeetings.db.util.DaoHelper;
 import org.apache.openmeetings.util.crypt.CryptProvider;
+import org.apache.openmeetings.util.logging.TimedDatabase;
 import org.apache.wicket.Application;
 import org.apache.wicket.csp.CSPDirective;
 import org.apache.wicket.csp.CSPHeaderConfiguration;
@@ -105,6 +106,7 @@ public class ConfigurationDao implements 
IDataProviderDao<Configuration> {
         * @param key - key of the {@link Configuration} to get
         * @return correspondent {@link Configuration} or null
         */
+       @TimedDatabase
        public Configuration forceGet(String key) {
                try {
                        List<Configuration> list = 
em.createNamedQuery("forceGetConfigurationByKey", Configuration.class)
@@ -120,6 +122,7 @@ public class ConfigurationDao implements 
IDataProviderDao<Configuration> {
                return null;
        }
 
+       @TimedDatabase
        public List<Configuration> get(String... keys) {
                List<Configuration> result = new ArrayList<>();
                for (String key : keys) { //iteration is necessary to fill list 
with all values
@@ -187,6 +190,7 @@ public class ConfigurationDao implements 
IDataProviderDao<Configuration> {
        }
 
        @Override
+       @TimedDatabase
        public Configuration get(Long id) {
                if (id == null) {
                        return null;
@@ -196,23 +200,27 @@ public class ConfigurationDao implements 
IDataProviderDao<Configuration> {
        }
 
        @Override
+       @TimedDatabase
        public List<Configuration> get(long start, long count) {
                return 
setLimits(em.createNamedQuery("getNondeletedConfiguration", Configuration.class)
                                , start, count).getResultList();
        }
 
        @Override
+       @TimedDatabase
        public List<Configuration> get(String search, long start, long count, 
String sort) {
                return 
setLimits(em.createQuery(DaoHelper.getSearchQuery("Configuration", "c", search, 
true, false, sort, searchFields), Configuration.class)
                                , start, count).getResultList();
        }
 
        @Override
+       @TimedDatabase
        public long count() {
                return em.createNamedQuery("countConfigurations", 
Long.class).getSingleResult();
        }
 
        @Override
+       @TimedDatabase
        public long count(String search) {
                TypedQuery<Long> q = 
em.createQuery(DaoHelper.getSearchQuery("Configuration", "c", search, true, 
true, null, searchFields), Long.class);
                return q.getSingleResult();
@@ -223,6 +231,7 @@ public class ConfigurationDao implements 
IDataProviderDao<Configuration> {
                return update(entity, userId, false);
        }
 
+       @TimedDatabase
        public Configuration update(Configuration entity, Long userId, boolean 
deleted) {
                String key = entity.getKey();
                String value = entity.getValue();
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemDao.java
index afe0999..24f4b8c 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemDao.java
@@ -32,6 +32,7 @@ import 
org.apache.openmeetings.db.entity.file.BaseFileItem.Type;
 import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.util.OmFileHelper;
+import org.apache.openmeetings.util.logging.TimedDatabase;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Repository;
@@ -46,11 +47,13 @@ import 
org.springframework.transaction.annotation.Transactional;
 public class FileItemDao extends BaseFileItemDao {
        private static final Logger log = 
LoggerFactory.getLogger(FileItemDao.class);
 
+       @TimedDatabase
        public List<FileItem> getByRoom(Long roomId) {
                log.debug("getByRoom roomId :: {}", roomId);
                return em.createNamedQuery("getFilesByRoom", 
FileItem.class).setParameter("roomId", roomId).getResultList();
        }
 
+       @TimedDatabase
        public List<FileItem> getByOwner(Long ownerId) {
                log.debug("getByOwner() started");
                TypedQuery<FileItem> query = 
em.createNamedQuery("getFilesByOwner", FileItem.class);
@@ -59,6 +62,7 @@ public class FileItemDao extends BaseFileItemDao {
                return query.getResultList();
        }
 
+       @TimedDatabase
        public List<FileItem> getByGroup(Long groupId) {
                log.debug("getByGroup() started");
                return em.createNamedQuery("getFileByGroup", FileItem.class)
@@ -66,6 +70,7 @@ public class FileItemDao extends BaseFileItemDao {
                                .getResultList();
        }
 
+       @TimedDatabase
        public List<FileItem> getByGroup(Long groupId, List<Type> filter) {
                if (filter == null) {
                        return getByGroup(groupId);
@@ -77,6 +82,7 @@ public class FileItemDao extends BaseFileItemDao {
                                .getResultList();
        }
 
+       @TimedDatabase
        public List<FileItem> getByParent(Long parentId) {
                log.debug("getByParent() started");
                return em.createNamedQuery("getFilesByParent", FileItem.class)
@@ -84,6 +90,7 @@ public class FileItemDao extends BaseFileItemDao {
                                .getResultList();
        }
 
+       @TimedDatabase
        public List<FileItem> getByParent(Long parentId, List<Type> filter) {
                if (filter == null) {
                        return getByParent(parentId);
@@ -106,6 +113,7 @@ public class FileItemDao extends BaseFileItemDao {
                return bf instanceof FileItem ? (FileItem)bf : null;
        }
 
+       @TimedDatabase
        public FileItem get(String externalId, String externalType) {
                log.debug("get started");
 
@@ -115,12 +123,14 @@ public class FileItemDao extends BaseFileItemDao {
                return list.size() == 1 ? list.get(0) : null;
        }
 
+       @TimedDatabase
        public List<FileItem> get() {
                log.debug("get started");
 
                return em.createNamedQuery("getAllFiles", 
FileItem.class).getResultList();
        }
 
+       @TimedDatabase
        public List<FileItem> getExternal(String externalType) {
                log.debug("get external started");
 
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
index d90d83b..42a6ad3 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
@@ -49,6 +49,7 @@ import org.apache.openmeetings.db.entity.room.RoomFile;
 import org.apache.openmeetings.db.entity.room.RoomGroup;
 import org.apache.openmeetings.db.manager.ISipManager;
 import org.apache.openmeetings.db.util.DaoHelper;
+import org.apache.openmeetings.util.logging.TimedDatabase;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -227,6 +228,7 @@ public class RoomDao implements 
IGroupAdminDataProviderDao<Room> {
                update(entity, userId);
        }
 
+       @TimedDatabase
        public Room getUserRoom(Long ownerId, Room.Type type, String name) {
                log.debug("getUserRoom : {} || {}", ownerId, type);
                Room room = 
single(em.createNamedQuery("getRoomByOwnerAndTypeId", Room.class)
@@ -259,6 +261,7 @@ public class RoomDao implements 
IGroupAdminDataProviderDao<Room> {
                }
        }
 
+       @TimedDatabase
        public Room getExternal(String externalType, String externalId) {
                log.debug("getExternal : {}  - {}", externalType, externalId);
                return single(fillLazy(em
@@ -268,6 +271,7 @@ public class RoomDao implements 
IGroupAdminDataProviderDao<Room> {
                                , GRP_GROUPS));
        }
 
+       @TimedDatabase
        public Room getExternal(Type type, String externalType, String 
externalId) {
                log.debug("getExternal : {} - {}  - {}", type, externalType, 
externalId);
                return single(fillLazy(em
@@ -278,6 +282,7 @@ public class RoomDao implements 
IGroupAdminDataProviderDao<Room> {
                                , GRP_GROUPS));
        }
 
+       @TimedDatabase
        public List<Room> getRecent(Long userId) {
                List<Room> result = new ArrayList<>();
                Set<Long> ids = new HashSet<>();
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SOAPLoginDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SOAPLoginDao.java
index 8996843..f4d07c5 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SOAPLoginDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SOAPLoginDao.java
@@ -28,6 +28,7 @@ import javax.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.dto.room.RoomOptionsDTO;
 import org.apache.openmeetings.db.entity.server.SOAPLogin;
+import org.apache.openmeetings.util.logging.TimedDatabase;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Repository;
@@ -41,6 +42,7 @@ public class SOAPLoginDao {
        @PersistenceContext
        private EntityManager em;
 
+       @TimedDatabase
        public String addSOAPLogin(String sessionHash, RoomOptionsDTO options) {
                SOAPLogin soapLogin = new SOAPLogin();
                soapLogin.setCreated(new Date());
@@ -68,6 +70,7 @@ public class SOAPLoginDao {
                return null;
        }
 
+       @TimedDatabase
        public SOAPLogin get(String hash) {
                if (hash == null) {
                        return null;
@@ -95,6 +98,7 @@ public class SOAPLoginDao {
                return null;
        }
 
+       @TimedDatabase
        public void update(SOAPLogin soapLogin) {
                try {
                        if (soapLogin.getId() == null) {
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SessiondataDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SessiondataDao.java
index fd67e9b..ed46575 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SessiondataDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/SessiondataDao.java
@@ -27,6 +27,7 @@ import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.entity.server.Sessiondata;
+import org.apache.openmeetings.util.logging.TimedDatabase;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Repository;
@@ -89,6 +90,7 @@ public class SessiondataDao {
         * @param sid - sessionId
         * @return {@link Sessiondata} with sessionId == SID, or null if not 
found
         */
+       @TimedDatabase
        public Sessiondata find(String sid) {
                if (sid == null) {
                        return null;
@@ -126,6 +128,7 @@ public class SessiondataDao {
         * @param refreshed - date to compare session update time with
         * @return - the list of all expired session data
         */
+       @TimedDatabase
        private List<Sessiondata> getSessionToDelete(Date refreshed) {
                return em.createNamedQuery("getSessionToDelete", 
Sessiondata.class)
                                .setParameter("refreshed", refreshed)
@@ -152,6 +155,7 @@ public class SessiondataDao {
                }
        }
 
+       @TimedDatabase
        public Sessiondata update(Sessiondata sd) {
                sd.setRefreshed(new Date());
 
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
index bae79dc..cc4bdd9 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
@@ -61,6 +61,7 @@ import org.apache.openmeetings.util.OmException;
 import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.util.crypt.CryptProvider;
 import org.apache.openmeetings.util.crypt.ICrypt;
+import org.apache.openmeetings.util.logging.TimedDatabase;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -117,6 +118,7 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
        }
 
        @Override
+       @TimedDatabase
        public List<User> get(long first, long count) {
                return setLimits(
                                em.createNamedQuery("getNondeletedUsers", 
User.class)
@@ -151,6 +153,7 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
                }
        }
 
+       @TimedDatabase
        private List<User> get(String search, Long start, Long count, String 
order, boolean filterContacts, Long currentUserId, boolean filterDeleted) {
                Map<String, Object> params = new HashMap<>();
                TypedQuery<User> q = 
em.createQuery(DaoHelper.getSearchQuery("User", "u", 
getAdditionalJoin(filterContacts), search, true, filterDeleted, false
@@ -160,6 +163,7 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
        }
 
        // This is AdminDao method
+       @TimedDatabase
        public List<User> get(String search, boolean excludeContacts, long 
first, long count) {
                Map<String, Object> params = new HashMap<>();
                TypedQuery<User> q = 
em.createQuery(DaoHelper.getSearchQuery("User", "u", null, search, true, true, 
false
@@ -178,6 +182,7 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
        }
 
        @Override
+       @TimedDatabase
        public List<User> adminGet(String search, Long adminId, long start, 
long count, String order) {
                TypedQuery<User> q = 
em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.user)", "u", null, 
search, true, false, false
                                , "gu.group.id IN (SELECT gu1.group.id FROM 
GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", order, 
searchFields), User.class);
@@ -194,6 +199,7 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
        }
 
        @Override
+       @TimedDatabase
        public long count() {
                // get all users
                TypedQuery<Long> q = 
em.createNamedQuery("countNondeletedUsers", Long.class);
@@ -219,6 +225,7 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
        }
 
        @Override
+       @TimedDatabase
        public long adminCount(String search, Long adminId) {
                TypedQuery<Long> q = 
em.createQuery(DaoHelper.getSearchQuery("GroupUser gu, IN(gu.user)", "u", null, 
search, true, false, true
                                , "gu.group.id IN (SELECT gu1.group.id FROM 
GroupUser gu1 WHERE gu1.moderator = true AND gu1.user.id = :adminId)", null, 
searchFields), Long.class);
@@ -227,6 +234,7 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
        }
 
        @Override
+       @TimedDatabase
        public User update(User u, Long userId) {
                if (u.getId() == null) {
                        if (u.getRegdate() == null) {
@@ -265,6 +273,7 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
        }
 
        @Override
+       @TimedDatabase
        public User get(Long id) {
                return get(id, false);
        }
@@ -345,10 +354,12 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
                }
        }
 
+       @TimedDatabase
        public List<User> get(Collection<Long> ids) {
                return em.createNamedQuery("getUsersByIds", 
User.class).setParameter("ids", ids).getResultList();
        }
 
+       @TimedDatabase
        public List<User> getAllUsers() {
                return fillLazy(em
                                , oem -> 
oem.createNamedQuery("getNondeletedUsers", User.class)
@@ -407,6 +418,7 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
                return getByEmail(email, User.Type.USER, null);
        }
 
+       @TimedDatabase
        public User getByEmail(String email, User.Type type, Long domainId) {
                return single(fillLazy(em
                                , oem -> oem.createNamedQuery("getUserByEmail", 
User.class)
@@ -416,6 +428,7 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
                                , FETCH_GROUP_GROUP));
        }
 
+       @TimedDatabase
        public User getUserByHash(String hash) {
                if (Strings.isEmpty(hash)) {
                        return null;
@@ -431,6 +444,7 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
         * @param search - term to search
         * @return - number of matching user
         */
+       @TimedDatabase
        public Long selectMaxFromUsersWithSearch(String search) {
                try {
                        // get all users
@@ -607,6 +621,7 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
         * @return User object in case of successful login
         * @throws OmException in case of any issue
         */
+       @TimedDatabase
        public User login(String userOrEmail, String userpass) throws 
OmException {
                List<User> users = em.createNamedQuery("getUserByLoginOrEmail", 
User.class)
                                .setParameter("userOrEmail", userOrEmail)
diff --git a/openmeetings-util/pom.xml b/openmeetings-util/pom.xml
index 880e7e3..9e7bd07 100644
--- a/openmeetings-util/pom.xml
+++ b/openmeetings-util/pom.xml
@@ -131,5 +131,23 @@
                        <groupId>org.apache.tika</groupId>
                        <artifactId>tika-parsers</artifactId>
                </dependency>
+               <dependency>
+                       <groupId>org.springframework</groupId>
+                       <artifactId>spring-webmvc</artifactId>
+                       <version>${spring.version}</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.springframework</groupId>
+                       <artifactId>spring-aop</artifactId>
+               </dependency>
+               <dependency>
+                   <groupId>org.aspectj</groupId>
+                   <artifactId>aspectjtools</artifactId>
+                   <version>1.9.6</version>
+               </dependency>
+               <dependency>
+                       <groupId>io.prometheus</groupId>
+                       <artifactId>simpleclient</artifactId>
+               </dependency>
        </dependencies>
 </project>
diff --git 
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/PrometheusAspect.java
 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/PrometheusAspect.java
index 7fef622..0b9b083 100644
--- 
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/PrometheusAspect.java
+++ 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/PrometheusAspect.java
@@ -17,48 +17,44 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.core.util.logging;
-
-import java.util.HashMap;
+package org.apache.openmeetings.util.logging;
 
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
 import org.springframework.stereotype.Component;
 
-import io.prometheus.client.Summary;
+import io.prometheus.client.Histogram;
 
 @Aspect
 @Component
 public class PrometheusAspect {
 
-       private final HashMap<String, Summary> summaries = new HashMap<String, 
Summary>();
-
-       private Summary getSummary(String className, String methodName) {
-               String key = className + "_" + methodName;
-               Summary sum = summaries.get(key);
-               if (sum != null) {
-                       return sum;
+       @Around("@annotation(TimedDatabase)")
+       public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws 
Throwable {
+               String className = 
joinPoint.getSignature().getDeclaringType().getSimpleName();
+               String methodName = joinPoint.getSignature().getName();
+               Histogram.Timer timer = PrometheusUtil.getHistogram() //
+                               .labels(className, methodName, 
"database").startTimer();
+               try {
+                       return joinPoint.proceed();
+               } finally {
+                       timer.observeDuration();
                }
-               sum = Summary.build() //
-                       .name(key) //
-                       .help(key) //
-                       .register();
-               summaries.put(key, sum);
-               return sum;
        }
 
-       @Around("@annotation(Timed)")
-       public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws 
Throwable {
+       @Around("@annotation(TimedApplication)")
+       public Object logExecutionTimedApplication(ProceedingJoinPoint 
joinPoint) throws Throwable {
                String className = 
joinPoint.getSignature().getDeclaringType().getSimpleName();
                String methodName = joinPoint.getSignature().getName();
-               Summary sum = getSummary(className, methodName);
-               Summary.Timer requestTimer = sum.startTimer();
+               Histogram.Timer timer = PrometheusUtil.getHistogram() //
+                               .labels(className, methodName, 
"application").startTimer();
                try {
                        return joinPoint.proceed();
                } finally {
-                       requestTimer.observeDuration();
+                       timer.observeDuration();
                }
        }
 
+
 }
diff --git 
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/PrometheusUtil.java
 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/PrometheusUtil.java
new file mode 100644
index 0000000..c0426e7
--- /dev/null
+++ 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/PrometheusUtil.java
@@ -0,0 +1,16 @@
+package org.apache.openmeetings.util.logging;
+
+import io.prometheus.client.Histogram;
+
+public class PrometheusUtil {
+
+       private static Histogram histogram = Histogram.build() //
+                       .help("OpenMeetings Application Metrics") //
+                       .name("org_openmeetings_metrics") //
+                       .labelNames("class", "method", "type") //
+                       .register();
+
+       public static Histogram getHistogram() {
+               return histogram;
+       }
+}
diff --git 
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/Timed.java
 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedApplication.java
similarity index 92%
copy from 
openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/Timed.java
copy to 
openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedApplication.java
index 2d7e648..09c25ea 100644
--- 
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/Timed.java
+++ 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedApplication.java
@@ -17,7 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.core.util.logging;
+package org.apache.openmeetings.util.logging;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
@@ -26,6 +26,6 @@ import java.lang.annotation.Target;
 
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
-public @interface Timed {
+public @interface TimedApplication {
 
 }
diff --git 
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/Timed.java
 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedDatabase.java
similarity index 92%
rename from 
openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/Timed.java
rename to 
openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedDatabase.java
index 2d7e648..0280295 100644
--- 
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/Timed.java
+++ 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/logging/TimedDatabase.java
@@ -17,7 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.core.util.logging;
+package org.apache.openmeetings.util.logging;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
@@ -26,6 +26,6 @@ import java.lang.annotation.Target;
 
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
-public @interface Timed {
+public @interface TimedDatabase {
 
 }
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
index 3cea173..43af947 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
@@ -73,6 +73,7 @@ import org.apache.openmeetings.web.room.wb.WbAction;
 import org.apache.openmeetings.web.room.wb.WbPanel;
 import org.apache.openmeetings.web.util.ExtendedClientProperties;
 import org.apache.openmeetings.web.util.TouchPunchResourceReference;
+import org.apache.openmeetings.util.logging.PrometheusUtil;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
@@ -117,8 +118,7 @@ import 
de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Alert;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal.Backdrop;
 import 
de.agilecoders.wicket.core.markup.html.bootstrap.dialog.TextContentModal;
-import io.prometheus.client.SimpleTimer;
-import io.prometheus.client.Summary;
+import io.prometheus.client.Histogram;
 
 @AuthorizeInstantiation("ROOM")
 public class RoomPanel extends BasePanel {
@@ -136,27 +136,14 @@ public class RoomPanel extends BasePanel {
        private final Room r;
        private final boolean interview;
        private final WebMarkupContainer room = new 
WebMarkupContainer("roomContainer");
-       static final Summary metric_roomPanel_init = Summary.build() //
-                       .name("requests_roomPanel_init") //
-                       .help("Request latency in seconds.") //
-                       .labelNames("aLabel") //
-                       .register();
-       static final Summary metric_roomPanel_roomEnter = Summary.build() //
-                       .name("requests_roomPanel_room_enter") //
-                       .help("Request latency in seconds.") //
-                       .labelNames("aLabel") //
-                       .register();
-       static final Summary metric_roomPanel_initVideo = Summary.build() //
-                       .name("requests_roomPanel_init_video") //
-                       .help("Request latency in seconds.") //
-                       .labelNames("aLabel") //
-                       .register();
+
        private final AbstractDefaultAjaxBehavior roomEnter = new 
AbstractDefaultAjaxBehavior() {
                private static final long serialVersionUID = 1L;
 
                @Override
                protected void respond(AjaxRequestTarget target) {
-                       SimpleTimer requestTimer = new SimpleTimer();
+                       Histogram.Timer timer = PrometheusUtil.getHistogram() //
+                                       .labels("RoomPanel", "roomEnter", 
"application").startTimer();
                        try {
                                log.debug("RoomPanel::roomEnter");
                                WebSession ws = WebSession.get();
@@ -198,30 +185,25 @@ public class RoomPanel extends BasePanel {
                                }
                                wb.update(target);
                        } finally {
-                               
metric_roomPanel_roomEnter.labels("aLabelValue").observe(requestTimer.elapsedSeconds());
+                               timer.observeDuration();
                        }
                }
 
                private void initVideos(AjaxRequestTarget target) {
-                       SimpleTimer requestTimer = new SimpleTimer();
-                       try {
-                               StringBuilder sb = new StringBuilder();
-                               JSONArray streams = new JSONArray();
-                               cm.streamByRoom(getRoom().getId())
-                                       .map(Client::getStreams)
-                                       .flatMap(List::stream)
-                                       .forEach(sd -> 
streams.put(sd.toJson()));
-                               if (streams.length() > 0) {
-                                       
sb.append("VideoManager.play(").append(streams).append(", 
").append(kHandler.getTurnServers(getClient())).append(");");
-                               }
-                               if (interview && 
streamProcessor.recordingAllowed(getClient())) {
-                                       
sb.append("WbArea.setRecEnabled(true);");
-                               }
-                               if (!Strings.isEmpty(sb)) {
-                                       target.appendJavaScript(sb);
-                               }
-                       } finally {
-                               
metric_roomPanel_initVideo.labels("aLabelValue").observe(requestTimer.elapsedSeconds());
+                       StringBuilder sb = new StringBuilder();
+                       JSONArray streams = new JSONArray();
+                       cm.streamByRoom(getRoom().getId())
+                               .map(Client::getStreams)
+                               .flatMap(List::stream)
+                               .forEach(sd -> streams.put(sd.toJson()));
+                       if (streams.length() > 0) {
+                               
sb.append("VideoManager.play(").append(streams).append(", 
").append(kHandler.getTurnServers(getClient())).append(");");
+                       }
+                       if (interview && 
streamProcessor.recordingAllowed(getClient())) {
+                               sb.append("WbArea.setRecEnabled(true);");
+                       }
+                       if (!Strings.isEmpty(sb)) {
+                               target.appendJavaScript(sb);
                        }
                }
        };
@@ -296,7 +278,8 @@ public class RoomPanel extends BasePanel {
 
        @Override
        protected void onInitialize() {
-               SimpleTimer requestTimer = new SimpleTimer();
+               Histogram.Timer timer = PrometheusUtil.getHistogram() //
+                               .labels("RoomPanel", "onInitialize", 
"application").startTimer();
                try {
                        super.onInitialize();
                        //let's refresh user in client
@@ -455,7 +438,7 @@ public class RoomPanel extends BasePanel {
                                        }
                                });
                } finally {
-                       
metric_roomPanel_init.labels("aLabelValue").observe(requestTimer.elapsedSeconds());
+                       timer.observeDuration();
                }
        }
 
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
index e242717..1d4adcf 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
@@ -46,6 +46,7 @@ import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.util.ws.RoomMessage.Type;
 import org.apache.openmeetings.db.util.ws.TextRoomMessage;
+import org.apache.openmeetings.util.logging.PrometheusUtil;
 import org.apache.openmeetings.web.app.ClientManager;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.ImagePanel;
@@ -70,6 +71,7 @@ import com.github.openjson.JSONObject;
 
 import 
de.agilecoders.wicket.core.markup.html.bootstrap.navbar.INavbarComponent;
 import 
de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5IconType;
+import io.prometheus.client.Histogram;
 
 public class RoomMenuPanel extends Panel {
        private static final long serialVersionUID = 1L;
@@ -141,40 +143,46 @@ public class RoomMenuPanel extends Panel {
 
        @Override
        protected void onInitialize() {
-               exitMenuItem = new OmMenuItem(getString("308"), 
getString("309"), FontAwesome5IconType.sign_out_alt_s) {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public void onClick(AjaxRequestTarget target) {
-                               chatDao.closeMessages(getUserId());
-                               exit(target);
-                       }
-               };
-               filesMenu = new OmMenuItem(getString("245"), null, false);
-               actionsSubMenu.init();
-               pollsSubMenu.init();
-               add((menuPanel = new MenuPanel("menu", 
getMenu())).setVisible(isVisible()));
-
-               add(askBtn.add(AttributeModifier.replace(ATTR_TITLE, 
getString("84"))));
-               Label demo = new Label("demo", Model.of(""));
-               Room r = room.getRoom();
-               add(demo.setVisible(r.isDemoRoom() && r.getDemoTime() != null 
&& room.getRoom().getDemoTime().intValue() > 0));
-               if (demo.isVisible()) {
-                       demo.add(new 
OmTimerBehavior(room.getRoom().getDemoTime().intValue(), "637") {
+               Histogram.Timer timer = PrometheusUtil.getHistogram() //
+                               .labels("RoomMenuPanel", "onInitialize", 
"application").startTimer();
+               try {
+                       exitMenuItem = new OmMenuItem(getString("308"), 
getString("309"), FontAwesome5IconType.sign_out_alt_s) {
                                private static final long serialVersionUID = 1L;
 
                                @Override
-                               protected void onTimer(int remain) {
-                                       
getComponent().add(AttributeModifier.replace(ATTR_TITLE, 
getText(getString("637"), remain)));
-                               }
-
-                               @Override
-                               protected void onFinish(AjaxRequestTarget 
target) {
+                               public void onClick(AjaxRequestTarget target) {
+                                       chatDao.closeMessages(getUserId());
                                        exit(target);
                                }
-                       });
+                       };
+                       filesMenu = new OmMenuItem(getString("245"), null, 
false);
+                       actionsSubMenu.init();
+                       pollsSubMenu.init();
+                       add((menuPanel = new MenuPanel("menu", 
getMenu())).setVisible(isVisible()));
+
+                       add(askBtn.add(AttributeModifier.replace(ATTR_TITLE, 
getString("84"))));
+                       Label demo = new Label("demo", Model.of(""));
+                       Room r = room.getRoom();
+                       add(demo.setVisible(r.isDemoRoom() && r.getDemoTime() 
!= null && room.getRoom().getDemoTime().intValue() > 0));
+                       if (demo.isVisible()) {
+                               demo.add(new 
OmTimerBehavior(room.getRoom().getDemoTime().intValue(), "637") {
+                                       private static final long 
serialVersionUID = 1L;
+
+                                       @Override
+                                       protected void onTimer(int remain) {
+                                               
getComponent().add(AttributeModifier.replace(ATTR_TITLE, 
getText(getString("637"), remain)));
+                                       }
+
+                                       @Override
+                                       protected void 
onFinish(AjaxRequestTarget target) {
+                                               exit(target);
+                                       }
+                               });
+                       }
+                       super.onInitialize();
+               } finally {
+                       timer.observeDuration();
                }
-               super.onInitialize();
        }
 
        @Override
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
index a506b1a..2771943 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
@@ -27,6 +27,7 @@ import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.db.util.ws.TextRoomMessage;
+import org.apache.openmeetings.util.logging.PrometheusUtil;
 import org.apache.openmeetings.web.app.ClientManager;
 import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.room.RoomPanel;
@@ -45,6 +46,8 @@ import org.slf4j.LoggerFactory;
 
 import com.github.openjson.JSONObject;
 
+import io.prometheus.client.Histogram;
+
 public class RoomSidebar extends Panel {
        private static final long serialVersionUID = 1L;
        private static final Logger log = 
LoggerFactory.getLogger(RoomSidebar.class);
@@ -73,23 +76,29 @@ public class RoomSidebar extends Panel {
 
        @Override
        protected void onInitialize() {
-               super.onInitialize();
-               final NameDialog addFolder = new NameDialog("addFolder", 
getString("712")) {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       protected void onSubmit(AjaxRequestTarget target) {
-                               roomFiles.createFolder(target, 
getModelObject());
-                               super.onSubmit(target);
-                       }
-               };
-               roomFiles = new RoomFilePanel("tree", room, addFolder);
-               add(fileTab.setVisible(!room.isInterview()), 
roomFiles.setVisible(!room.isInterview()));
-
-               add(addFolder, settings);
-               add(upload = new UploadDialog("upload", room, roomFiles));
-               updateShowFiles(null);
-               add(activities = new ActivitiesPanel("activities", room));
+               Histogram.Timer timer = PrometheusUtil.getHistogram() //
+                               .labels("RoomSidebar", "onInitialize", 
"application").startTimer();
+               try {
+                       super.onInitialize();
+                       final NameDialog addFolder = new 
NameDialog("addFolder", getString("712")) {
+                               private static final long serialVersionUID = 1L;
+
+                               @Override
+                               protected void onSubmit(AjaxRequestTarget 
target) {
+                                       roomFiles.createFolder(target, 
getModelObject());
+                                       super.onSubmit(target);
+                               }
+                       };
+                       roomFiles = new RoomFilePanel("tree", room, addFolder);
+                       add(fileTab.setVisible(!room.isInterview()), 
roomFiles.setVisible(!room.isInterview()));
+
+                       add(addFolder, settings);
+                       add(upload = new UploadDialog("upload", room, 
roomFiles));
+                       updateShowFiles(null);
+                       add(activities = new ActivitiesPanel("activities", 
room));
+               } finally {
+                       timer.observeDuration();
+               }
        }
 
        private void updateShowFiles(IPartialPageRequestHandler handler) {

Reply via email to