-
-
Notifications
You must be signed in to change notification settings - Fork 475
feat(replay): Add manual replay control API #5978
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: romtsn/feat/java-665-replay-start-stop
Are you sure you want to change the base?
Changes from all commits
a05b31d
05bdcbc
bd1914c
8073208
0582fec
df60eec
20d793b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -141,14 +141,6 @@ public class ReplayIntegration( | |
| return | ||
| } | ||
|
|
||
| if ( | ||
| !options.sessionReplay.isSessionReplayEnabled && | ||
| !options.sessionReplay.isSessionReplayForErrorsEnabled | ||
| ) { | ||
| options.logger.log(INFO, "Session replay is disabled, no sample rate specified") | ||
| return | ||
| } | ||
|
|
||
| this.scopes = scopes | ||
| recorder = | ||
| recorderProvider?.invoke() | ||
|
|
@@ -167,10 +159,38 @@ public class ReplayIntegration( | |
| override fun isRecording(): Boolean = state.get().isRecording | ||
|
|
||
| override fun start() { | ||
| enqueueOnMainThread { startInternal() } | ||
| enqueueOnMainThread { startInternal(isFullSession = true) } | ||
| } | ||
|
|
||
| private fun startInternal() { | ||
| override fun startBuffering() { | ||
| enqueueOnMainThread { startInternal(isFullSession = false) } | ||
| } | ||
|
|
||
| override fun onAppForegrounded(startNewSession: Boolean) { | ||
| enqueueOnMainThread { | ||
| if (!isEnabled.get()) { | ||
| return@enqueueOnMainThread | ||
| } | ||
| if (startNewSession) { | ||
| val isFullSession = sample(options.sessionReplay.sessionSampleRate) | ||
| if (!isFullSession && !options.sessionReplay.isSessionReplayForErrorsEnabled) { | ||
| options.logger.log( | ||
| INFO, | ||
| "Session replay is not started, full session was not sampled and onErrorSampleRate is not specified", | ||
| ) | ||
| } else { | ||
| startInternal(isFullSession) | ||
| } | ||
| } | ||
| resumeInternal() | ||
| } | ||
| } | ||
|
|
||
| override fun onAppBackgrounded() { | ||
| enqueueOnMainThread { pauseInternal() } | ||
| } | ||
|
|
||
| private fun startInternal(isFullSession: Boolean) { | ||
| if (!isEnabled.get()) { | ||
| return | ||
| } | ||
|
|
@@ -184,15 +204,7 @@ public class ReplayIntegration( | |
| return | ||
| } | ||
|
|
||
| val isFullSession = sample(options.sessionReplay.sessionSampleRate) | ||
| if (!isFullSession && !options.sessionReplay.isSessionReplayForErrorsEnabled) { | ||
| options.logger.log( | ||
| INFO, | ||
| "Session replay is not started, full session was not sampled and onErrorSampleRate is not specified", | ||
| ) | ||
| return | ||
| } | ||
|
|
||
| isManualPause = false | ||
| val strategy = | ||
| replayCaptureStrategyProvider?.invoke(isFullSession) | ||
| ?: if (isFullSession) { | ||
|
|
@@ -334,6 +346,17 @@ public class ReplayIntegration( | |
|
|
||
| override fun getReplayId(): SentryId = state.get().replayId | ||
|
|
||
| override fun flush() { | ||
|
cursor[bot] marked this conversation as resolved.
|
||
| enqueueOnMainThread { | ||
| val current = state.get() | ||
| if (!current.isRecording) { | ||
| startInternal(isFullSession = true) | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. why does
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also following the JS API :) I agree it can be a real footgun though - there's one issue open in sentry-javascript re. that getsentry/sentry-javascript#12664. I think I'd still not introduce |
||
| } else { | ||
| captureReplayInternal(current.generation, current.replayId, false) | ||
| } | ||
| } | ||
| } | ||
|
|
||
| override fun setBreadcrumbConverter(converter: ReplayBreadcrumbConverter) { | ||
| replayBreadcrumbConverter = converter | ||
| } | ||
|
|
@@ -399,6 +422,7 @@ public class ReplayIntegration( | |
| recorder?.stop() | ||
| gestureRecorder?.stop() | ||
| current.captureStrategy?.stop() | ||
| isManualPause = false | ||
| state.set( | ||
| current.copy( | ||
| lifecycleState = STOPPED, | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.