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) {