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 <[email protected]>
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) {