Ver código fonte

try fix: timeout brasilapi

Gustavo Mantovani 1 semana atrás
pai
commit
62cde43d45
2 arquivos alterados com 56 adições e 7 exclusões
  1. 12 0
      .env.example
  2. 44 7
      app/Services/ZipCodeCoordinatesService.php

+ 12 - 0
.env.example

@@ -51,6 +51,18 @@ GEMINI_MODEL=
 
 #
 
+BRASIL_API_BASE_URL=https://brasilapi.com.br
+
+BRASIL_API_CONNECT_TIMEOUT=2
+
+BRASIL_API_TIMEOUT=3
+
+BRASIL_API_CEP_CACHE_TTL=2592000
+
+BRASIL_API_CEP_FAILURE_CACHE_TTL=600
+
+#
+
 PAGARME_BASE_URL=https://api.pagar.me/core/v5
 
 PAGARME_SECRET_KEY=

+ 44 - 7
app/Services/ZipCodeCoordinatesService.php

@@ -122,23 +122,30 @@ class ZipCodeCoordinatesService
             'mode'             => 'preload',
             'pending_count'    => count($pending),
             'zip_codes_sample' => array_slice(array_values($pending), 0, 20),
+            'connect_timeout'  => (int) config('services.brasil_api.connect_timeout', 2),
+            'timeout'          => (int) config('services.brasil_api.timeout', 3),
+            'ip_resolve'       => 'ipv4',
         ]);
 
         try {
             $baseUrl = rtrim((string) config('services.brasil_api.base_url'), '/');
+            $startedAt = microtime(true);
 
             $responses = Http::pool(fn (Pool $pool) => array_map(
                 fn (string $zipCode) => $pool
                     ->as($zipCode)
                     ->acceptJson()
+                    ->withUserAgent($this->brasilApiUserAgent())
                     ->connectTimeout((int) config('services.brasil_api.connect_timeout', 2))
                     ->timeout((int) config('services.brasil_api.timeout', 3))
+                    ->withOptions($this->curlForceIpv4Options())
                     ->get("{$baseUrl}/api/cep/v2/{$zipCode}"),
                 $pending,
             ));
         } catch (Throwable $exception) {
             Log::warning('ZipCodeCoordinates Brasil API preload failed', [
                 'pending_count' => count($pending),
+                'elapsed_ms'    => isset($startedAt) ? round((microtime(true) - $startedAt) * 1000, 2) : null,
                 'error'         => $exception->getMessage(),
             ]);
 
@@ -156,6 +163,7 @@ class ZipCodeCoordinatesService
                 'zip_code'     => $zipCode,
                 'has_response' => $response instanceof Response,
                 'status'       => $response instanceof Response ? $response->status() : null,
+                'elapsed_ms'   => isset($startedAt) ? round((microtime(true) - $startedAt) * 1000, 2) : null,
                 'found'        => $coordinates !== null,
                 'coordinates'  => $coordinates,
             ]);
@@ -206,23 +214,33 @@ class ZipCodeCoordinatesService
 
     private function requestCoordinates(string $zipCode): ?array
     {
+        $startedAt = microtime(true);
+
         try {
             Log::info('ZipCodeCoordinates calling Brasil API', [
-                'zip_code' => $zipCode,
-                'base_url' => rtrim((string) config('services.brasil_api.base_url'), '/'),
+                'zip_code'        => $zipCode,
+                'base_url'        => rtrim((string) config('services.brasil_api.base_url'), '/'),
+                'user_agent'      => $this->brasilApiUserAgent(),
+                'connect_timeout' => (int) config('services.brasil_api.connect_timeout', 2),
+                'timeout'         => (int) config('services.brasil_api.timeout', 3),
+                'ip_resolve'      => 'ipv4',
             ]);
 
-            $response = Http::baseUrl(rtrim((string) config('services.brasil_api.base_url'), '/'))
-                ->acceptJson()
+            $baseUrl = rtrim((string) config('services.brasil_api.base_url'), '/');
+
+            $response = Http::acceptJson()
+                ->withUserAgent($this->brasilApiUserAgent())
+                ->withOptions($this->curlForceIpv4Options())
                 ->connectTimeout((int) config('services.brasil_api.connect_timeout', 2))
                 ->timeout((int) config('services.brasil_api.timeout', 3))
-                ->get("api/cep/v2/{$zipCode}");
+                ->get("{$baseUrl}/api/cep/v2/{$zipCode}");
 
             $coordinates = $this->coordinatesFromResponse($response);
 
             Log::info('ZipCodeCoordinates Brasil API response', [
                 'zip_code'    => $zipCode,
                 'status'      => $response->status(),
+                'elapsed_ms'  => round((microtime(true) - $startedAt) * 1000, 2),
                 'found'       => $coordinates !== null,
                 'coordinates' => $coordinates,
             ]);
@@ -230,14 +248,33 @@ class ZipCodeCoordinatesService
             return $coordinates;
         } catch (Throwable $exception) {
             Log::warning('ZipCodeCoordinates Brasil API request failed', [
-                'zip_code' => $zipCode,
-                'error'    => $exception->getMessage(),
+                'zip_code'   => $zipCode,
+                'elapsed_ms' => round((microtime(true) - $startedAt) * 1000, 2),
+                'error'      => $exception->getMessage(),
             ]);
 
             return null;
         }
     }
 
+    private function curlForceIpv4Options(): array
+    {
+        if (! defined('CURLOPT_IPRESOLVE') || ! defined('CURL_IPRESOLVE_V4')) {
+            return [];
+        }
+
+        return [
+            'curl' => [
+                CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
+            ],
+        ];
+    }
+
+    private function brasilApiUserAgent(): string
+    {
+        return 'insomnia/11.3.0';
+    }
+
     private function coordinatesFromResponse(Response $response): ?array
     {
         if (! $response->successful()) {