Search code examples
pythondockerinfluxdblocustinfluxdb-2

InfluxDBListener - Getting 401 using with locust


Running a docker container InfluxDB database, and I'm trying to use the InfluxDBListener to send locust data to the database.

Here's my code:

@events.init.add_listener
def on_locust_init(environment, **_kwargs):
    """
    Hook event that enables starting an influxdb connection
    """
    bucket = 'load_bucket'
    org = 'some_organization'     # not used
    token = 'zzzz_etc_etc_etc_=='    # not used
    # this settings matches the given docker-compose file
    influxDBSettings = InfluxDBSettings(
        influx_host='localhost',
        influx_port=8086,
        user='Load Tester',
        pwd='some_password',
        database=bucket
    )
    # start listener with the given configuration
    InfluxDBListener(env=environment, influxDbSettings=influxDBSettings)

Error in locust log:

[2021-06-02 11:42:35,514] ILGUYL-LT1/ERROR/root: Could not connect to influxdb
Traceback (most recent call last):
  File "c:\git\engine-load-tests\venv\lib\site-packages\locust_influxdb_listener\__init__.py", line 55, in __init__
    self.influxdb_client.create_database(influxDbSettings.database)
  File "c:\git\engine-load-tests\venv\lib\site-packages\influxdb\client.py", line 746, in create_database
    self.query("CREATE DATABASE {0}".format(quote_ident(dbname)),
  File "c:\git\engine-load-tests\venv\lib\site-packages\influxdb\client.py", line 521, in query
    response = self.request(
  File "c:\git\engine-load-tests\venv\lib\site-packages\influxdb\client.py", line 378, in request
    raise InfluxDBClientError(err_msg, response.status_code)
influxdb.exceptions.InfluxDBClientError: 401: {"code":"unauthorized","message":"Unauthorized"}

The script which I am running is not in a docker container but just running locally.

Confirmed:

  • Influx is definitely running on localhost:8086. I can go to http://localhost:8086 on my computer to get to InfluxDB.
  • the bucket load_bucket already exists [noticed that the InfluxDBListener actually tries to create the DB]
  • user name and password are correct
  • In another script I wrote, I can do this with no problem:
    with InfluxDBClient(url="http://localhost:8086", token=token, org=org) as _client:
        with _client.write_api(write_options=WriteOptions(batch_size=500,
                                                          flush_interval=10_000,
                                                          jitter_interval=2_000,
                                                          retry_interval=5_000,
                                                          max_retries=5,
                                                          max_retry_delay=30_000,
                                                          exponential_base=2,
                                                          write_type=SYNCHRONOUS)) as _write_client:

After changing influx_host='localhost' to influx_host='influxdb', I get the following error:

Traceback (most recent call last):
  File "c:\git\engine-load-tests\venv\lib\site-packages\urllib3\connection.py", line 169, in _new_conn
    conn = connection.create_connection(
  File "c:\git\engine-load-tests\venv\lib\site-packages\urllib3\util\connection.py", line 73, in create_connection
    for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
  File "c:\git\engine-load-tests\venv\lib\site-packages\gevent\_socketcommon.py", line 247, in getaddrinfo
    addrlist = get_hub().resolver.getaddrinfo(host, port, family, type, proto, flags)
  File "c:\git\engine-load-tests\venv\lib\site-packages\gevent\resolver\thread.py", line 63, in getaddrinfo
    return self.pool.apply(_socket.getaddrinfo, args, kwargs)
  File "c:\git\engine-load-tests\venv\lib\site-packages\gevent\pool.py", line 161, in apply
    return self.spawn(func, *args, **kwds).get()
  File "src\\gevent\\event.py", line 329, in gevent._gevent_cevent.AsyncResult.get
  File "src\\gevent\\event.py", line 359, in gevent._gevent_cevent.AsyncResult.get
  File "src\\gevent\\event.py", line 347, in gevent._gevent_cevent.AsyncResult.get
  File "src\\gevent\\event.py", line 327, in gevent._gevent_cevent.AsyncResult._raise_exception
  File "c:\git\engine-load-tests\venv\lib\site-packages\gevent\_compat.py", line 65, in reraise
    raise value.with_traceback(tb)
  File "c:\git\engine-load-tests\venv\lib\site-packages\gevent\threadpool.py", line 167, in __run_task
    thread_result.set(func(*args, **kwargs))
socket.gaierror: [Errno 11001] getaddrinfo failed

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\git\engine-load-tests\venv\lib\site-packages\urllib3\connectionpool.py", line 699, in urlopen
    httplib_response = self._make_request(
  File "c:\git\engine-load-tests\venv\lib\site-packages\urllib3\connectionpool.py", line 394, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "c:\git\engine-load-tests\venv\lib\site-packages\urllib3\connection.py", line 234, in request
    super(HTTPConnection, self).request(method, url, body=body, headers=headers)
  File "C:\Python38\lib\http\client.py", line 1255, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\Python38\lib\http\client.py", line 1301, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "C:\Python38\lib\http\client.py", line 1250, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "C:\Python38\lib\http\client.py", line 1010, in _send_output
    self.send(msg)
  File "C:\Python38\lib\http\client.py", line 950, in send
    self.connect()
  File "c:\git\engine-load-tests\venv\lib\site-packages\urllib3\connection.py", line 200, in connect
    conn = self._new_conn()
  File "c:\git\engine-load-tests\venv\lib\site-packages\urllib3\connection.py", line 181, in _new_conn
    raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x00000221080B8C10>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\git\engine-load-tests\venv\lib\site-packages\requests\adapters.py", line 439, in send
    resp = conn.urlopen(
  File "c:\git\engine-load-tests\venv\lib\site-packages\urllib3\connectionpool.py", line 755, in urlopen
    retries = retries.increment(
  File "c:\git\engine-load-tests\venv\lib\site-packages\urllib3\util\retry.py", line 574, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='influxdb', port=8086): Max retries exceeded with url: /query?q=CREATE+DATABASE+%22load_bucket%22&db=load_bucket (Caused by NewConnectionError('<urllib3.connection.HTTPConnectio
n object at 0x00000221080B8C10>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\git\engine-load-tests\venv\lib\site-packages\locust_influxdb_listener\__init__.py", line 55, in __init__
    self.influxdb_client.create_database(influxDbSettings.database)
  File "c:\git\engine-load-tests\venv\lib\site-packages\influxdb\client.py", line 746, in create_database
    self.query("CREATE DATABASE {0}".format(quote_ident(dbname)),
  File "c:\git\engine-load-tests\venv\lib\site-packages\influxdb\client.py", line 521, in query
    response = self.request(
  File "c:\git\engine-load-tests\venv\lib\site-packages\influxdb\client.py", line 332, in request
    response = self._session.request(
  File "c:\git\engine-load-tests\venv\lib\site-packages\requests\sessions.py", line 542, in request
    resp = self.send(prep, **send_kwargs)
  File "c:\git\engine-load-tests\venv\lib\site-packages\requests\sessions.py", line 655, in send
    r = adapter.send(request, **kwargs)
  File "c:\git\engine-load-tests\venv\lib\site-packages\requests\adapters.py", line 516, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='influxdb', port=8086): Max retries exceeded with url: /query?q=CREATE+DATABASE+%22load_bucket%22&db=load_bucket (Caused by NewConnectionError('<urllib3.connection.HTTPConnec
tion object at 0x00000221080B8C10>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))

Here is the influx section of the docker-compose.yml:

$ cat docker-compose.yml
influxdb:
  image: influxdb:latest
  container_name: influxdb
  ports:
    - "8083:8083"
    - "8086:8086"
    - "8090:8090"
  env_file:
    - 'env.influxdb'
  volumes:
    # Data persistency
    # sudo mkdir -p /srv/docker/influxdb/data
    - /srv/docker/influxdb/data:/var/lib/influxdb2
$ cat influxdb.conf
[default]
  url = "http://localhost:8086"
  token = "<my-token>"
  org = "<my org name>"
  active = true
$ cat env.influxdb
INFLUXDB_DATA_ENGINE=tsm1
INFLUXDB_REPORTING_DISABLED=false

Solution

  • Influx is definitely running on localhost:8086

    Not quite. Assuming the InfluxDB service is called "influxdb" in your docker-compose.yml file, the db is running at influxdb:8086 which, if you expose port 8086, is visible as localhost:8086 on your docker host.

    However, the container running your script does not see the exposed port as localhost, so in the python script localhost is the container where thy script runs, not the Docker host machine. You're attempting to connect to the local port 8086, which doesn't have a DB connection, and so the error.

    The easiest solution is to replace influx_host='localhost' with influx_host='influxdb' (again with the assumption that influxdb is the name of the InfluxDB service you have in the docker-compose.yml file, edit as needed).