diff --git a/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREvent.java b/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREvent.java index 430c9f7d..7370ca3a 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREvent.java +++ b/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREvent.java @@ -65,7 +65,7 @@ public class CDREvent implements Comparable { this.startTime = this.timeStamp; } - public CDREvent(CDREventName eventName, String sessionId, Recording recording) { + public CDREvent(CDREventName eventName, String sessionId, Recording recording, String reason) { this.eventName = eventName; if ((sessionId.indexOf('/')) != -1) { this.sessionId = sessionId.substring(sessionId.lastIndexOf('/') + 1, sessionId.length()); @@ -80,6 +80,7 @@ public class CDREvent implements Comparable { this.hasAudio = recording.hasAudio(); this.hasVideo = recording.hasVideo(); this.recordingLayout = recording.getRecordingLayout(); + this.reason = reason; } public CDREvent(CDREventName eventName, Participant participant, String sessionId) { diff --git a/openvidu-server/src/main/java/io/openvidu/server/cdr/CallDetailRecord.java b/openvidu-server/src/main/java/io/openvidu/server/cdr/CallDetailRecord.java index 21729245..e73e2a89 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/cdr/CallDetailRecord.java +++ b/openvidu-server/src/main/java/io/openvidu/server/cdr/CallDetailRecord.java @@ -17,7 +17,9 @@ package io.openvidu.server.cdr; +import java.util.Arrays; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -85,6 +87,8 @@ public class CallDetailRecord { private Map participants = new ConcurrentHashMap<>(); private Map publications = new ConcurrentHashMap<>(); private Map> subscriptions = new ConcurrentHashMap<>(); + + private final List lastParticipantLeftReasons = Arrays.asList(new String[] {"disconnect", "forceDisconnectByUser", "forceDisconnectByServer", "networkDisconnect"}); public CallDetailRecord(CDRLogger logger) { this.logger = logger; @@ -98,7 +102,7 @@ public class CallDetailRecord { public void recordSessionDestroyed(String sessionId, String reason) { CDREvent e = this.sessions.remove(sessionId); - if (openviduConfig.isCdrEnabled()) this.logger.log(new CDREvent(CDREventName.sessionDestroyed, e, reason)); + if (openviduConfig.isCdrEnabled()) this.logger.log(new CDREvent(CDREventName.sessionDestroyed, e, this.finalReason(reason))); } public void recordParticipantJoined(Participant participant, String sessionId) { @@ -156,11 +160,19 @@ public class CallDetailRecord { } public void recordRecordingStarted(String sessionId, Recording recording) { - if (openviduConfig.isCdrEnabled()) this.logger.log(new CDREvent(CDREventName.recordingStarted, sessionId, recording)); + if (openviduConfig.isCdrEnabled()) this.logger.log(new CDREvent(CDREventName.recordingStarted, sessionId, recording, null)); } - public void recordRecordingStopped(String sessionId, Recording recording) { - if (openviduConfig.isCdrEnabled()) this.logger.log(new CDREvent(CDREventName.recordingStopped, sessionId, recording)); + public void recordRecordingStopped(String sessionId, Recording recording, String reason) { + if (openviduConfig.isCdrEnabled()) this.logger.log(new CDREvent(CDREventName.recordingStopped, sessionId, recording, this.finalReason(reason))); + } + + private String finalReason(String reason) { + if (lastParticipantLeftReasons.contains(reason)) { + return "lastParticipantLeft"; + } else { + return reason; + } } } diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/SessionEventsHandler.java b/openvidu-server/src/main/java/io/openvidu/server/core/SessionEventsHandler.java index a15d10ff..ec07ddd1 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/SessionEventsHandler.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/SessionEventsHandler.java @@ -410,9 +410,9 @@ public class SessionEventsHandler { } } - public void sendRecordingStoppedNotification(Session session, Recording recording) { + public void sendRecordingStoppedNotification(Session session, Recording recording, String reason) { - CDR.recordRecordingStopped(session.getSessionId(), recording); + CDR.recordRecordingStopped(session.getSessionId(), recording, reason); // Be sure to clean this map (this should return null) this.recordingsStarted.remove(session.getSessionId()); diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java b/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java index 224837f7..2e7d4567 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java @@ -424,7 +424,7 @@ public abstract class SessionManager { this.closeSessionAndEmptyCollections(session, reason); if (recordingService.sessionIsBeingRecorded(session.getSessionId())) { - recordingService.stopRecording(session); + recordingService.stopRecording(session, reason); } return participants; diff --git a/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java b/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java index 019b6af3..ba3a0323 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java @@ -173,7 +173,7 @@ public class KurentoSessionManager extends SessionManager { .equals(remainingParticipants.iterator().next().getParticipantPublicId())) { log.info("Last participant left. Stopping recording for session {}", sessionId); - recordingService.stopRecording(session); + recordingService.stopRecording(session, reason); evictParticipant(session.getParticipantByPublicId(ProtocolElements.RECORDER_PARTICIPANT_PUBLICID), null, null, "EVICT_RECORDER"); } diff --git a/openvidu-server/src/main/java/io/openvidu/server/recording/ComposedRecordingService.java b/openvidu-server/src/main/java/io/openvidu/server/recording/ComposedRecordingService.java index 6b990820..ea4b6304 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/recording/ComposedRecordingService.java +++ b/openvidu-server/src/main/java/io/openvidu/server/recording/ComposedRecordingService.java @@ -156,7 +156,7 @@ public class ComposedRecordingService { return recording; } - public Recording stopRecording(Session session) { + public Recording stopRecording(Session session, String reason) { Recording recording = this.sessionsRecordings.remove(session.getSessionId()); String containerId = this.sessionsContainers.remove(session.getSessionId()); this.startedRecordings.remove(recording.getId()); @@ -217,7 +217,7 @@ public class ComposedRecordingService { "There was an error generating the metadata report file for the recording"); } - this.sessionHandler.sendRecordingStoppedNotification(session, recording); + this.sessionHandler.sendRecordingStoppedNotification(session, recording, reason); return recording; } diff --git a/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java b/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java index 49b5af8c..87541bd4 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java +++ b/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java @@ -329,7 +329,7 @@ public class SessionRestController { Session session = sessionManager.getSession(recording.getSessionId()); - Recording stoppedRecording = this.recordingService.stopRecording(session); + Recording stoppedRecording = this.recordingService.stopRecording(session, "recordingStoppedByServer"); sessionManager.evictParticipant( session.getParticipantByPublicId(ProtocolElements.RECORDER_PARTICIPANT_PUBLICID), null, null,