diff options
Diffstat (limited to 'vendor/open-telemetry/api/Trace/functions.php')
-rw-r--r-- | vendor/open-telemetry/api/Trace/functions.php | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/vendor/open-telemetry/api/Trace/functions.php b/vendor/open-telemetry/api/Trace/functions.php new file mode 100644 index 000000000..79f730717 --- /dev/null +++ b/vendor/open-telemetry/api/Trace/functions.php @@ -0,0 +1,44 @@ +<?php + +declare(strict_types=1); + +namespace OpenTelemetry\API\Trace; + +use Closure; +use Throwable; + +/** + * Executes the given closure within the provided span. + * + * The span will be ended. + * + * @template R + * @param SpanInterface $span span to enclose the closure with + * @param Closure(...): R $closure closure to invoke + * @param iterable<int|string, mixed> $args arguments to provide to the closure + * @return R result of the closure invocation + * + * @phpstan-ignore-next-line + */ +function trace(SpanInterface $span, Closure $closure, iterable $args = []) +{ + $s = $span; + $c = $closure; + $a = $args; + unset($span, $closure, $args); + + $scope = $s->activate(); + + try { + /** @psalm-suppress InvalidArgument */ + return $c(...$a, ...($a = [])); + } catch (Throwable $e) { + $s->setStatus(StatusCode::STATUS_ERROR, $e->getMessage()); + $s->recordException($e, ['exception.escaped' => true]); + + throw $e; + } finally { + $scope->detach(); + $s->end(); + } +} |