You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by se...@apache.org on 2021/02/03 20:19:54 UTC
[openmeetings] 02/02: OPENMEETINGS-2567 Add metrics for Room enter
to measure performance.
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 <se...@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