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

commit 8c441764d59d5d8503e1dd70019cb4a07eb4ffe2
Author: Sebastian Wagner <sebawag...@apache.org>
AuthorDate: Thu Feb 4 09:19:13 2021 +1300

    OPENMEETINGS-2567 Add metrics for Room enter to measure performance.
---
 .../apache/openmeetings/web/room/RoomPanel.java    | 408 +++++++++++----------
 1 file changed, 220 insertions(+), 188 deletions(-)

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 f79c1bb..3cea173 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
@@ -117,6 +117,8 @@ 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;
 
 @AuthorizeInstantiation("ROOM")
 public class RoomPanel extends BasePanel {
@@ -134,67 +136,92 @@ 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) {
-                       log.debug("RoomPanel::roomEnter");
-                       WebSession ws = WebSession.get();
-                       Client c = getClient();
-                       JSONObject options = 
VideoSettings.getInitJson(c.getSid())
-                                       .put("uid", c.getUid())
-                                       .put("userId", c.getUserId())
-                                       .put("rights", 
c.toJson(true).getJSONArray("rights"))
-                                       .put("interview", interview)
-                                       .put("audioOnly", r.isAudioOnly())
-                                       .put("allowRecording", 
r.isAllowRecording())
-                                       .put("questions", 
r.isAllowUserQuestions())
-                                       .put("showMicStatus", 
!r.getHiddenElements().contains(RoomElement.MICROPHONE_STATUS));
-                       if (!Strings.isEmpty(r.getRedirectURL()) && 
(ws.getSoapLogin() != null || ws.getInvitation() != null)) {
-                               options.put("reloadUrl", r.getRedirectURL());
-                       }
-                       StringBuilder sb = new 
StringBuilder("Room.init(").append(options.toString(new 
NullStringer())).append(");")
-                                       .append(wb.getInitScript())
-                                       .append(getQuickPollJs());
-                       sb.append(sendClientsOnInit());
-                       target.appendJavaScript(sb);
-
-                       WebSocketHelper.sendRoom(new TextRoomMessage(r.getId(), 
c, RoomMessage.Type.ROOM_ENTER, c.getUid()));
-                       // play video from other participants
-                       initVideos(target);
-                       getMainPanel().getChat().roomEnter(r, target);
-                       if (r.isFilesOpened()) {
-                               sidebar.setFilesActive(target);
-                       }
-                       if (Room.Type.PRESENTATION != r.getType()) {
-                               boolean modsEmpty = noModerators();
-                               log.debug("RoomPanel::roomEnter, mods IS EMPTY 
? {}, is MOD ? {}", modsEmpty, c.hasRight(Room.Right.MODERATOR));
-                               if (modsEmpty) {
-                                       showIdeaAlert(target, 
getString(r.isModerated() ? "641" : "498"));
+                       SimpleTimer requestTimer = new SimpleTimer();
+                       try {
+                               log.debug("RoomPanel::roomEnter");
+                               WebSession ws = WebSession.get();
+                               Client c = getClient();
+                               JSONObject options = 
VideoSettings.getInitJson(c.getSid())
+                                               .put("uid", c.getUid())
+                                               .put("userId", c.getUserId())
+                                               .put("rights", 
c.toJson(true).getJSONArray("rights"))
+                                               .put("interview", interview)
+                                               .put("audioOnly", 
r.isAudioOnly())
+                                               .put("allowRecording", 
r.isAllowRecording())
+                                               .put("questions", 
r.isAllowUserQuestions())
+                                               .put("showMicStatus", 
!r.getHiddenElements().contains(RoomElement.MICROPHONE_STATUS));
+                               if (!Strings.isEmpty(r.getRedirectURL()) && 
(ws.getSoapLogin() != null || ws.getInvitation() != null)) {
+                                       options.put("reloadUrl", 
r.getRedirectURL());
                                }
+                               StringBuilder sb = new 
StringBuilder("Room.init(").append(options.toString(new 
NullStringer())).append(");")
+                                               .append(wb.getInitScript())
+                                               .append(getQuickPollJs());
+                               sb.append(sendClientsOnInit());
+                               target.appendJavaScript(sb);
+
+                               WebSocketHelper.sendRoom(new 
TextRoomMessage(r.getId(), c, RoomMessage.Type.ROOM_ENTER, c.getUid()));
+                               // play video from other participants
+                               initVideos(target);
+                               getMainPanel().getChat().roomEnter(r, target);
+                               if (r.isFilesOpened()) {
+                                       sidebar.setFilesActive(target);
+                               }
+                               if (Room.Type.PRESENTATION != r.getType()) {
+                                       boolean modsEmpty = noModerators();
+                                       log.debug("RoomPanel::roomEnter, mods 
IS EMPTY ? {}, is MOD ? {}", modsEmpty, c.hasRight(Room.Right.MODERATOR));
+                                       if (modsEmpty) {
+                                               showIdeaAlert(target, 
getString(r.isModerated() ? "641" : "498"));
+                                       }
+                               }
+                               if (r.isWaitRecording()) {
+                                       showIdeaAlert(target, 
getString("1315"));
+                               }
+                               wb.update(target);
+                       } finally {
+                               
metric_roomPanel_roomEnter.labels("aLabelValue").observe(requestTimer.elapsedSeconds());
                        }
-                       if (r.isWaitRecording()) {
-                               showIdeaAlert(target, getString("1315"));
-                       }
-                       wb.update(target);
                }
 
                private void initVideos(AjaxRequestTarget target) {
-                       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);
+                       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());
                        }
                }
        };
@@ -269,162 +296,167 @@ public class RoomPanel extends BasePanel {
 
        @Override
        protected void onInitialize() {
-               super.onInitialize();
-               //let's refresh user in client
-               Client c = getClient().updateUser(userDao);
-               Component accessDenied = new 
WebMarkupContainer(ACCESS_DENIED_ID).setVisible(false);
-
-               room.setOutputMarkupPlaceholderTag(true);
-               room.add(menu = new RoomMenuPanel("menu", this));
-               room.add(AttributeModifier.append("data-room-id", r.getId()));
-               if (interview) {
-                       room.add(new WebMarkupContainer("wb-area").add(wb));
-               } else {
-                       Droppable<BaseFileItem> wbArea = new 
Droppable<>("wb-area") {
-                               private static final long serialVersionUID = 1L;
-
-                               @Override
-                               public void onConfigure(JQueryBehavior 
behavior) {
-                                       super.onConfigure(behavior);
-                                       behavior.setOption("hoverClass", 
Options.asString("droppable-hover"));
-                                       behavior.setOption("accept", 
Options.asString(".recorditem, .fileitem, .readonlyitem"));
-                               }
+               SimpleTimer requestTimer = new SimpleTimer();
+               try {
+                       super.onInitialize();
+                       //let's refresh user in client
+                       Client c = getClient().updateUser(userDao);
+                       Component accessDenied = new 
WebMarkupContainer(ACCESS_DENIED_ID).setVisible(false);
+
+                       room.setOutputMarkupPlaceholderTag(true);
+                       room.add(menu = new RoomMenuPanel("menu", this));
+                       room.add(AttributeModifier.append("data-room-id", 
r.getId()));
+                       if (interview) {
+                               room.add(new 
WebMarkupContainer("wb-area").add(wb));
+                       } else {
+                               Droppable<BaseFileItem> wbArea = new 
Droppable<>("wb-area") {
+                                       private static final long 
serialVersionUID = 1L;
+
+                                       @Override
+                                       public void onConfigure(JQueryBehavior 
behavior) {
+                                               super.onConfigure(behavior);
+                                               
behavior.setOption("hoverClass", Options.asString("droppable-hover"));
+                                               behavior.setOption("accept", 
Options.asString(".recorditem, .fileitem, .readonlyitem"));
+                                       }
 
-                               @Override
-                               public void onDrop(AjaxRequestTarget target, 
Component component) {
-                                       Object o = 
component.getDefaultModelObject();
-                                       if (wb.isVisible() && o instanceof 
BaseFileItem) {
-                                               BaseFileItem f = 
(BaseFileItem)o;
-                                               if 
(sidebar.getFilesPanel().isSelected(f)) {
-                                                       for (Entry<String, 
BaseFileItem> e : sidebar.getFilesPanel().getSelected().entrySet()) {
-                                                               
wb.sendFileToWb(e.getValue(), false);
+                                       @Override
+                                       public void onDrop(AjaxRequestTarget 
target, Component component) {
+                                               Object o = 
component.getDefaultModelObject();
+                                               if (wb.isVisible() && o 
instanceof BaseFileItem) {
+                                                       BaseFileItem f = 
(BaseFileItem)o;
+                                                       if 
(sidebar.getFilesPanel().isSelected(f)) {
+                                                               for 
(Entry<String, BaseFileItem> e : 
sidebar.getFilesPanel().getSelected().entrySet()) {
+                                                                       
wb.sendFileToWb(e.getValue(), false);
+                                                               }
+                                                       } else {
+                                                               
wb.sendFileToWb(f, false);
                                                        }
-                                               } else {
-                                                       wb.sendFileToWb(f, 
false);
                                                }
                                        }
-                               }
-                       };
-                       room.add(wbArea.add(wb));
-               }
-               room.add(roomEnter);
-               room.add(sidebar = new RoomSidebar("sidebar", this));
-               add(roomClosed = new RedirectMessageDialog("room-closed", 
"1098", r.isClosed(), r.getRedirectURL()));
-               if (r.isClosed()) {
-                       room.setVisible(false);
-               } else if (cm.streamByRoom(r.getId()).count() >= 
r.getCapacity()) {
-                       accessDenied = new 
ExpiredMessageDialog(ACCESS_DENIED_ID, getString("99"), menu);
-                       room.setVisible(false);
-               } else if (r.getId().equals(WebSession.get().getRoomId())) {
-                       // secureHash/invitationHash, already checked
-               } else {
-                       boolean allowed = false;
-                       String deniedMessage = null;
-                       if (r.isAppointment()) {
-                               Appointment a = apptDao.getByRoom(r.getId());
-                               if (a != null && !a.isDeleted()) {
-                                       boolean isOwner = 
a.getOwner().getId().equals(getUserId());
-                                       allowed = isOwner;
-                                       log.debug("appointed room, isOwner ? 
{}", isOwner);
-                                       if (!allowed) {
-                                               for (MeetingMember mm : 
a.getMeetingMembers()) {
-                                                       if 
(getUserId().equals(mm.getUser().getId())) {
-                                                               allowed = true;
-                                                               break;
+                               };
+                               room.add(wbArea.add(wb));
+                       }
+                       room.add(roomEnter);
+                       room.add(sidebar = new RoomSidebar("sidebar", this));
+                       add(roomClosed = new 
RedirectMessageDialog("room-closed", "1098", r.isClosed(), r.getRedirectURL()));
+                       if (r.isClosed()) {
+                               room.setVisible(false);
+                       } else if (cm.streamByRoom(r.getId()).count() >= 
r.getCapacity()) {
+                               accessDenied = new 
ExpiredMessageDialog(ACCESS_DENIED_ID, getString("99"), menu);
+                               room.setVisible(false);
+                       } else if 
(r.getId().equals(WebSession.get().getRoomId())) {
+                               // secureHash/invitationHash, already checked
+                       } else {
+                               boolean allowed = false;
+                               String deniedMessage = null;
+                               if (r.isAppointment()) {
+                                       Appointment a = 
apptDao.getByRoom(r.getId());
+                                       if (a != null && !a.isDeleted()) {
+                                               boolean isOwner = 
a.getOwner().getId().equals(getUserId());
+                                               allowed = isOwner;
+                                               log.debug("appointed room, 
isOwner ? {}", isOwner);
+                                               if (!allowed) {
+                                                       for (MeetingMember mm : 
a.getMeetingMembers()) {
+                                                               if 
(getUserId().equals(mm.getUser().getId())) {
+                                                                       allowed 
= true;
+                                                                       break;
+                                                               }
                                                        }
                                                }
-                                       }
-                                       if (allowed) {
-                                               Calendar cal = 
WebSession.getCalendar();
-                                               if (isOwner || 
cal.getTime().after(allowedStart(a.getStart())) && 
cal.getTime().before(a.getEnd())) {
-                                                       eventDetail = new 
EventDetailDialog(EVENT_DETAILS_ID, a);
-                                               } else {
-                                                       allowed = false;
-                                                       deniedMessage = 
String.format("%s %s - %s", getString("error.hash.period"), 
getDateFormat().format(a.getStart()), getDateFormat().format(a.getEnd()));
+                                               if (allowed) {
+                                                       Calendar cal = 
WebSession.getCalendar();
+                                                       if (isOwner || 
cal.getTime().after(allowedStart(a.getStart())) && 
cal.getTime().before(a.getEnd())) {
+                                                               eventDetail = 
new EventDetailDialog(EVENT_DETAILS_ID, a);
+                                                       } else {
+                                                               allowed = false;
+                                                               deniedMessage = 
String.format("%s %s - %s", getString("error.hash.period"), 
getDateFormat().format(a.getStart()), getDateFormat().format(a.getEnd()));
+                                                       }
                                                }
                                        }
-                               }
-                       } else {
-                               allowed = r.getIspublic() || (r.getOwnerId() != 
null && r.getOwnerId().equals(getUserId()));
-                               log.debug("public ? {}, ownedId ? {} {}", 
r.getIspublic(), r.getOwnerId(), allowed);
-                               if (!allowed) {
-                                       User u = c.getUser();
-                                       for (RoomGroup ro : r.getGroups()) {
-                                               for (GroupUser ou : 
u.getGroupUsers()) {
-                                                       if 
(ro.getGroup().getId().equals(ou.getGroup().getId())) {
-                                                               allowed = true;
+                               } else {
+                                       allowed = r.getIspublic() || 
(r.getOwnerId() != null && r.getOwnerId().equals(getUserId()));
+                                       log.debug("public ? {}, ownedId ? {} 
{}", r.getIspublic(), r.getOwnerId(), allowed);
+                                       if (!allowed) {
+                                               User u = c.getUser();
+                                               for (RoomGroup ro : 
r.getGroups()) {
+                                                       for (GroupUser ou : 
u.getGroupUsers()) {
+                                                               if 
(ro.getGroup().getId().equals(ou.getGroup().getId())) {
+                                                                       allowed 
= true;
+                                                                       break;
+                                                               }
+                                                       }
+                                                       if (allowed) {
                                                                break;
                                                        }
                                                }
-                                               if (allowed) {
-                                                       break;
-                                               }
                                        }
                                }
-                       }
-                       if (!allowed) {
-                               if (deniedMessage == null) {
-                                       deniedMessage = getString("1599");
+                               if (!allowed) {
+                                       if (deniedMessage == null) {
+                                               deniedMessage = 
getString("1599");
+                                       }
+                                       accessDenied = new 
ExpiredMessageDialog(ACCESS_DENIED_ID, deniedMessage, menu);
+                                       room.setVisible(false);
                                }
-                               accessDenied = new 
ExpiredMessageDialog(ACCESS_DENIED_ID, deniedMessage, menu);
-                               room.setVisible(false);
                        }
-               }
-               RepeatingView groupstyles = new RepeatingView("groupstyle");
-               add(groupstyles.setVisible(room.isVisible() && 
!r.getGroups().isEmpty()));
-               if (room.isVisible()) {
-                       add(new NicknameDialog("nickname", this));
-                       add(download);
-                       add(new BaseWebSocketBehavior("media"));
-                       for (RoomGroup rg : r.getGroups()) {
-                               WebMarkupContainer groupstyle = new 
WebMarkupContainer(groupstyles.newChildId());
-                               groupstyle.add(AttributeModifier.append("href"
-                                               , 
(String)RequestCycle.get().urlFor(new GroupCustomCssResourceReference(), new 
PageParameters().add("id", rg.getGroup().getId()))
-                                               ));
-                               groupstyles.add(groupstyle);
-                       }
-                       //We are setting initial rights here
-                       final int count = cm.addToRoom(c.setRoom(getRoom()));
-                       SOAPLogin soap = WebSession.get().getSoapLogin();
-                       if (soap != null && soap.isModerator()) {
-                               c.allow(Right.SUPER_MODERATOR);
-                       } else {
-                               Set<Right> rr = 
AuthLevelUtil.getRoomRight(c.getUser(), r, r.isAppointment() ? 
apptDao.getByRoom(r.getId()) : null, count);
-                               if (!rr.isEmpty()) {
-                                       c.allow(rr);
-                                       log.info("Setting rights for client:: 
{} -> {}", rr, c.hasRight(Right.MODERATOR));
+                       RepeatingView groupstyles = new 
RepeatingView("groupstyle");
+                       add(groupstyles.setVisible(room.isVisible() && 
!r.getGroups().isEmpty()));
+                       if (room.isVisible()) {
+                               add(new NicknameDialog("nickname", this));
+                               add(download);
+                               add(new BaseWebSocketBehavior("media"));
+                               for (RoomGroup rg : r.getGroups()) {
+                                       WebMarkupContainer groupstyle = new 
WebMarkupContainer(groupstyles.newChildId());
+                                       
groupstyle.add(AttributeModifier.append("href"
+                                                       , 
(String)RequestCycle.get().urlFor(new GroupCustomCssResourceReference(), new 
PageParameters().add("id", rg.getGroup().getId()))
+                                                       ));
+                                       groupstyles.add(groupstyle);
+                               }
+                               //We are setting initial rights here
+                               final int count = 
cm.addToRoom(c.setRoom(getRoom()));
+                               SOAPLogin soap = 
WebSession.get().getSoapLogin();
+                               if (soap != null && soap.isModerator()) {
+                                       c.allow(Right.SUPER_MODERATOR);
+                               } else {
+                                       Set<Right> rr = 
AuthLevelUtil.getRoomRight(c.getUser(), r, r.isAppointment() ? 
apptDao.getByRoom(r.getId()) : null, count);
+                                       if (!rr.isEmpty()) {
+                                               c.allow(rr);
+                                               log.info("Setting rights for 
client:: {} -> {}", rr, c.hasRight(Right.MODERATOR));
+                                       }
+                               }
+                               if (r.isModerated() && r.isWaitModerator()
+                                               && !c.hasRight(Right.MODERATOR)
+                                               && noModerators())
+                               {
+                                       room.setVisible(false);
+                                       createWaitModerator(true);
+                                       getMainPanel().getChat().toggle(null, 
false);
                                }
+                               timerService.scheduleModCheck(r);
+                       } else {
+                               add(new 
WebMarkupContainer("nickname").setVisible(false));
                        }
-                       if (r.isModerated() && r.isWaitModerator()
-                                       && !c.hasRight(Right.MODERATOR)
-                                       && noModerators())
-                       {
-                               room.setVisible(false);
-                               createWaitModerator(true);
-                               getMainPanel().getChat().toggle(null, false);
+                       cm.update(c);
+                       if (waitModerator == null) {
+                               createWaitModerator(false);
                        }
-                       timerService.scheduleModCheck(r);
-               } else {
-                       add(new 
WebMarkupContainer("nickname").setVisible(false));
-               }
-               cm.update(c);
-               if (waitModerator == null) {
-                       createWaitModerator(false);
+                       add(room, accessDenied, eventDetail, waitModerator);
+                       add(clientKicked = new 
TextContentModal("client-kicked", new ResourceModel("606")));
+                       clientKicked
+                               .header(new ResourceModel("797"))
+                               .setCloseOnEscapeKey(false)
+                               .setBackdrop(Backdrop.FALSE)
+                               .addButton(new BootstrapAjaxLink<>("button", 
Model.of(""), Buttons.Type.Outline_Primary, new ResourceModel("54")) {
+                                       private static final long 
serialVersionUID = 1L;
+
+                                       public void onClick(AjaxRequestTarget 
target) {
+                                               clientKicked.close(target);
+                                               menu.exit(target);
+                                       }
+                               });
+               } finally {
+                       
metric_roomPanel_init.labels("aLabelValue").observe(requestTimer.elapsedSeconds());
                }
-               add(room, accessDenied, eventDetail, waitModerator);
-               add(clientKicked = new TextContentModal("client-kicked", new 
ResourceModel("606")));
-               clientKicked
-                       .header(new ResourceModel("797"))
-                       .setCloseOnEscapeKey(false)
-                       .setBackdrop(Backdrop.FALSE)
-                       .addButton(new BootstrapAjaxLink<>("button", 
Model.of(""), Buttons.Type.Outline_Primary, new ResourceModel("54")) {
-                               private static final long serialVersionUID = 1L;
-
-                               public void onClick(AjaxRequestTarget target) {
-                                       clientKicked.close(target);
-                                       menu.exit(target);
-                               }
-                       });
        }
 
        @Override

Reply via email to