InfluxDBListener - 使用 Locust 获取 401

InfluxDBListener - Getting 401 using with locust

运行 一个 docker 容器 InfluxDB 数据库,我正在尝试使用 InfluxDBListener 将 locust 数据发送到数据库。

这是我的代码:

@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)

locust 日志中的错误:

[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"}

我是 运行 的脚本不在 docker 容器中,而是 运行 在本地。

已确认:

    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:

influx_host='localhost'更改为influx_host='influxdb'后,出现以下错误:

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'))

这是 docker-compose.ymlinflux 部分:

$ 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

Influx is definitely running on localhost:8086

不完全是。假设 InfluxDB 服务在你的 docker-compose.yml 文件中被称为“influxdb”,数据库是 运行 在 influxdb:8086,如果你公开端口 8086,它是可见的 localhost:8086 在您的 docker 主机上

但是,容器 运行 您的脚本没有将公开的端口视为 localhost,因此在 python 脚本中 localhost 是您的脚本运行的容器,而不是 Docker 主机。您正在尝试连接到 local 端口 8086,该端口没有数据库连接,因此出现错误。

最简单的解决方案是将 influx_host='localhost' 替换为 influx_host='influxdb'(再次假设 influxdb 是您在 docker 中拥有的 InfluxDB 服务的名称- compose.yml 文件,根据需要编辑)。