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