6

This is probably the weirdest situation that I ever seen. Basically I have a system built in Laravel 5.1 which needs to make a request to an external system. The thing is, sometimes it works but sometimes I get

GuzzleHttp\Exception\ConnectException: cURL error 6: Could not resolve host: hosthere

Absolutely nothing changes, in terms of code. I run the application with exactly the same parameters and sometimes I get the error, sometimes I get the right response.

Any ideas?

Thanks in advance

EDIT 2 When I execute nslookup domainthatineedtouse.com I get

;; Got SERVFAIL reply from 8.8.8.8, trying next server
Server: 8.8.4.4
Address:    8.8.4.4#53

Non-authoritative answer:
Name:   domainthatineedtouse.com
Address: therealipaddressishere

Can this be related to the issue?

EDIT This is part of the class that is making the connection.

<?php


use GuzzleHttp\ClientInterface;

class MyClass
{
    const ENDPOINT = 'http://example.com/v1/endpoint';

    /**
     * @var \GuzzleHttp\ClientInterface
     */
    protected $client;

    /**
     * @var string The api key used to connect to the service
     */
    protected $apiKey;

    /**
     * Constructor.
     *
     * @param $apiKey
     * @param ClientInterface $client
     */
    public function __construct($apiKey, ClientInterface $client)
    {
        $this->client = $client;
        $this->apiKey = $apiKey;
    }

    /**
     * Here is where I make the request
     *
     * @param $param1
     * @param $param2
     * @return \Psr\Http\Message\ResponseInterface
     */
    public function makeTheRequest($param1, $param2)
    {
        return $this->client->request('get', self::ENDPOINT, [
            'query' => [
                'api_token' => $this->apiKey,
                'parameter_1' => $param1,
                'parameter_2' => $param2,
            ]
        ]);
    }
}

3 Answers 3

7

This is something one should always anticipate while calling external APIs most of them face outages including the very popular Amazon's Product Advertising API. So keeping that in mind this should always be placed in a try/catch along with using retries placed in a do/while.

You should always catch these two types of common timeouts, connection timeouts and request timeouts. \GuzzleHttp\Exception\ConnectException and \GuzzleHttp\Exception\RequestException

// query External API
// retry by using a do/while
$retry_count    = 0;
do {
    try {
        $response = json_decode($this->external_service->runOperation($operation));
    } catch (\GuzzleHttp\Exception\ConnectException $e) {
        // log the error here

        Log::Warning('guzzle_connect_exception', [
                'url' => $this->request->fullUrl(),
                'message' => $e->getMessage()
        ]);
    } catch (\GuzzleHttp\Exception\RequestException $e) {

        Log::Warning('guzzle_connection_timeout', [
                'url' => $this->request->fullUrl(),
                'message' => $e->getMessage()
        ]);
    }

    // Do max 5 attempts
    if (++$retry_count == 5) {
        break;
    }
} while(!is_array($response));
Sign up to request clarification or add additional context in comments.

5 Comments

This is a great strategy. I will implement it to avoid this issue in future releases but still think that currently there is something wrong in terms of server configuration (but the funny thing is that nothing was changed as far as I know)
hmm, if its happening everytime then it might be a server issue, but if its random then its definitely the external API's outage. might be better if you try this from a simple script outside of laravel and the server environment.
Thanks for your reply. I decided to restart the server (is a droplet in Digital Ocean) and made some requests and it looks that now is working. I'm not sure when was the last time the server was restarted but it looks like this was the issue. I was checking the logs and it was failing not only for this request but also when I was trying to send emails (via sendgrid): Swift_TransportException: Connection could not be established with host smtp.sendgrid.net [php_network_getaddresses: getaddrinfo failed: No address associated with hostname #0]
ah nothing fixes it like a reboot does ;) however I would still keep this strategy because we never know when the requested DNS of the external api does give an issue.
Some growing delay would be nice to be added, to not fire all retries one after each.
0

It could be helpful if you share actual code with us.


What I can say now, there are chances to be one of 2 issues:

a) DNS settings problem on your server. You need to try different configuration

b) you are passing http:// as part of the url.

2 Comments

Thanks for your reply @acabala! I edited the question and added part of the class that I'm using to make the request. To actually establish the connection I'm using GuzzleHttp.
I decided to restart the server (is a droplet in Digital Ocean) and made some requests and it looks like is working (no more errors happening randomly). I'm not sure when was the last time the server was restarted but it looks like this was the issue. The good old reboot... lol
0

I hope this helps. Basically the problem was related to the server:

https://twitter.com/digitalocean/status/844178536835551233

In my case, I just needed to reboot and everything seems fine now.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.