summaryrefslogtreecommitdiff
path: root/shared/logger/node_modules/@sentry/browser/esm/profiling/integration.js
diff options
context:
space:
mode:
Diffstat (limited to 'shared/logger/node_modules/@sentry/browser/esm/profiling/integration.js')
-rw-r--r--shared/logger/node_modules/@sentry/browser/esm/profiling/integration.js81
1 files changed, 81 insertions, 0 deletions
diff --git a/shared/logger/node_modules/@sentry/browser/esm/profiling/integration.js b/shared/logger/node_modules/@sentry/browser/esm/profiling/integration.js
new file mode 100644
index 0000000..f09e4ed
--- /dev/null
+++ b/shared/logger/node_modules/@sentry/browser/esm/profiling/integration.js
@@ -0,0 +1,81 @@
+import { logger } from '@sentry/utils';
+import { wrapTransactionWithProfiling } from './hubextensions.js';
+import { PROFILE_MAP, findProfiledTransactionsFromEnvelope, createProfilingEvent, addProfilesToEnvelope } from './utils.js';
+
+/**
+ * Browser profiling integration. Stores any event that has contexts["profile"]["profile_id"]
+ * This exists because we do not want to await async profiler.stop calls as transaction.finish is called
+ * in a synchronous context. Instead, we handle sending the profile async from the promise callback and
+ * rely on being able to pull the event from the cache when we need to construct the envelope. This makes the
+ * integration less reliable as we might be dropping profiles when the cache is full.
+ *
+ * @experimental
+ */
+class BrowserProfilingIntegration {constructor() { BrowserProfilingIntegration.prototype.__init.call(this);BrowserProfilingIntegration.prototype.__init2.call(this); }
+ __init() {this.name = 'BrowserProfilingIntegration';}
+ __init2() {this.getCurrentHub = undefined;}
+
+ /**
+ * @inheritDoc
+ */
+ setupOnce(addGlobalEventProcessor, getCurrentHub) {
+ this.getCurrentHub = getCurrentHub;
+ const client = this.getCurrentHub().getClient() ;
+
+ if (client && typeof client.on === 'function') {
+ client.on('startTransaction', (transaction) => {
+ wrapTransactionWithProfiling(transaction);
+ });
+
+ client.on('beforeEnvelope', (envelope) => {
+ // if not profiles are in queue, there is nothing to add to the envelope.
+ if (!PROFILE_MAP['size']) {
+ return;
+ }
+
+ const profiledTransactionEvents = findProfiledTransactionsFromEnvelope(envelope);
+ if (!profiledTransactionEvents.length) {
+ return;
+ }
+
+ const profilesToAddToEnvelope = [];
+
+ for (const profiledTransaction of profiledTransactionEvents) {
+ const context = profiledTransaction && profiledTransaction.contexts;
+ const profile_id = context && context['profile'] && (context['profile']['profile_id'] );
+
+ if (!profile_id) {
+ (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&
+ logger.log('[Profiling] cannot find profile for a transaction without a profile context');
+ continue;
+ }
+
+ // Remove the profile from the transaction context before sending, relay will take care of the rest.
+ if (context && context['profile']) {
+ delete context.profile;
+ }
+
+ const profile = PROFILE_MAP.get(profile_id);
+ if (!profile) {
+ (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.log(`[Profiling] Could not retrieve profile for transaction: ${profile_id}`);
+ continue;
+ }
+
+ PROFILE_MAP.delete(profile_id);
+ const profileEvent = createProfilingEvent(profile_id, profile, profiledTransaction );
+
+ if (profileEvent) {
+ profilesToAddToEnvelope.push(profileEvent);
+ }
+ }
+
+ addProfilesToEnvelope(envelope, profilesToAddToEnvelope);
+ });
+ } else {
+ logger.warn('[Profiling] Client does not support hooks, profiling will be disabled');
+ }
+ }
+}
+
+export { BrowserProfilingIntegration };
+//# sourceMappingURL=integration.js.map