function startSpan(context, callback) {
  const spanContext = normalizeContext(context);

  return hub.runWithAsyncContext(() => {
    return exports$1.withScope(context.scope, scope => {
      // eslint-disable-next-line deprecation/deprecation
      const hub$1 = hub.getCurrentHub();
      // eslint-disable-next-line deprecation/deprecation
      const parentSpan = scope.getSpan();

      const shouldSkipSpan = context.onlyIfParent && !parentSpan;
      const activeSpan = shouldSkipSpan
        ? undefined
        : createChildSpanOrTransaction(hub$1, {
            parentSpan,
            spanContext,
            forceTransaction: context.forceTransaction,
            scope,
          });

      return handleCallbackErrors.handleCallbackErrors(
        () => callback(activeSpan),
        () => {
          // Only update the span status if it hasn't been changed yet
          if (activeSpan) {
            const { status } = spanUtils.spanToJSON(activeSpan);
            if (!status || status === 'ok') {
              activeSpan.setStatus('internal_error');
            }
          }
        },
        () => activeSpan && activeSpan.end(),
      );
    });
  });
}
Wraps a function with a transaction/span and finishes the span after the function is done.
The created span is the active span and will be used as parent by other spans created inside the function
and can be accessed via `Sentry.getSpan()`, as long as the function is executed while the scope is active.

If you want to create a span that is not set as active, use {@link startInactiveSpan}.

Note that if you have not enabled tracing extensions via `addTracingExtensions`
or you didn't set `tracesSampleRate`, this function will not generate spans
and the `span` returned from the callback will be undefined.