From 31d902b6c672c5f77fe7f2c3b61742e20079c2a7 Mon Sep 17 00:00:00 2001 From: Jon Bates Date: Mon, 3 Feb 2025 21:49:11 +0000 Subject: [PATCH] fix gRPC timeout (#1498) (#1499) --- src/API/Common/Time/ClockInterface.php | 1 + src/Contrib/Grpc/GrpcTransport.php | 6 +++++- src/Contrib/Grpc/GrpcTransportFactory.php | 2 +- tests/Unit/Contrib/Grpc/GrpcTransportTest.php | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/API/Common/Time/ClockInterface.php b/src/API/Common/Time/ClockInterface.php index b4a953c11..115c10600 100644 --- a/src/API/Common/Time/ClockInterface.php +++ b/src/API/Common/Time/ClockInterface.php @@ -9,6 +9,7 @@ interface ClockInterface public const NANOS_PER_SECOND = 1_000_000_000; public const NANOS_PER_MILLISECOND = 1_000_000; public const NANOS_PER_MICROSECOND = 1_000; + public const MICROS_PER_MILLISECOND = 1_000; public const MILLIS_PER_SECOND = 1_000; /** diff --git a/src/Contrib/Grpc/GrpcTransport.php b/src/Contrib/Grpc/GrpcTransport.php index 6268eecef..babc1ab16 100644 --- a/src/Contrib/Grpc/GrpcTransport.php +++ b/src/Contrib/Grpc/GrpcTransport.php @@ -18,6 +18,7 @@ use const Grpc\OP_SEND_MESSAGE; use const Grpc\STATUS_OK; use Grpc\Timeval; +use OpenTelemetry\API\Common\Time\ClockInterface; use OpenTelemetry\Contrib\Otlp\ContentTypes; use OpenTelemetry\SDK\Common\Export\TransportInterface; use OpenTelemetry\SDK\Common\Future\CancellationInterface; @@ -38,15 +39,18 @@ final class GrpcTransport implements TransportInterface private readonly array $metadata; private readonly Channel $channel; private bool $closed = false; + private Timeval $exportTimeout; public function __construct( string $endpoint, array $opts, private readonly string $method, array $headers = [], + int $timeoutMillis = 500, ) { $this->channel = new Channel($endpoint, $opts); $this->metadata = $this->formatMetadata(array_change_key_case($headers)); + $this->exportTimeout = new Timeval($timeoutMillis * ClockInterface::MICROS_PER_MILLISECOND); } public function contentType(): string @@ -60,7 +64,7 @@ public function send(string $payload, ?CancellationInterface $cancellation = nul return new ErrorFuture(new BadMethodCallException('Transport closed')); } - $call = new Call($this->channel, $this->method, Timeval::infFuture()); + $call = new Call($this->channel, $this->method, $this->exportTimeout); $cancellation ??= new NullCancellation(); $cancellationId = $cancellation->subscribe(static fn (Throwable $e) => $call->cancel()); diff --git a/src/Contrib/Grpc/GrpcTransportFactory.php b/src/Contrib/Grpc/GrpcTransportFactory.php index 246b0cacb..4c03562f4 100644 --- a/src/Contrib/Grpc/GrpcTransportFactory.php +++ b/src/Contrib/Grpc/GrpcTransportFactory.php @@ -81,6 +81,7 @@ public function create( $opts, $method, $headers, + (int) ($timeout * 1000), ); } @@ -116,7 +117,6 @@ private static function createOpts( 'method' => null, ], ], - 'timeout' => sprintf('%0.6fs', $timeout), 'retryPolicy' => [ 'maxAttempts' => $maxRetries, 'initialBackoff' => sprintf('%0.3fs', $retryDelay / 1000), diff --git a/tests/Unit/Contrib/Grpc/GrpcTransportTest.php b/tests/Unit/Contrib/Grpc/GrpcTransportTest.php index 2e3d4beb5..bfca24ba8 100644 --- a/tests/Unit/Contrib/Grpc/GrpcTransportTest.php +++ b/tests/Unit/Contrib/Grpc/GrpcTransportTest.php @@ -18,7 +18,7 @@ final class GrpcTransportTest extends TestCase public function setUp(): void { - $this->transport = new GrpcTransport('http://localhost:4317', [], '/method', []); + $this->transport = new GrpcTransport('http://localhost:4317', [], '/method', [], 123); } public function test_grpc_transport_supports_only_protobuf(): void