简体   繁体   English

InfluxDBListener - 使用 locust 获取 401

[英]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.运行 docker 容器 InfluxDB 数据库,我正在尝试使用 InfluxDBListener 将locust数据发送到数据库。

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

The script which I am running is not in a docker container but just running locally.我正在运行的脚本不在 docker 容器中,而只是在本地运行。

Confirmed:确认的:

  • Influx is definitely running on localhost:8086. Influx 肯定在 localhost:8086 上运行。 I can go to http://localhost:8086 on my computer to get to InfluxDB.我可以在我的计算机上从 go 到 http://localhost:8086 访问 InfluxDB。
  • the bucket load_bucket already exists [noticed that the InfluxDBListener actually tries to create the DB]load_bucket已经存在 [注意到 InfluxDBListener 实际上试图创建数据库]
  • 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: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'))

Here is the influx section of the docker-compose.yml :这是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 Influx 肯定在 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 .假设 InfluxDB 服务在您的 docker-compose.yml 文件中称为“influxdb”,则 db 在influxdb:8086运行,如果您公开端口 8086,则在 docker 主机上显示为localhost:8086

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.但是,运行脚本的容器不会将暴露的端口视为localhost ,因此在 python 脚本中, localhost是运行脚本的容器,而不是 Docker 主机。 You're attempting to connect to the local port 8086, which doesn't have a DB connection, and so the error.您正在尝试连接到没有数据库连接的本地端口 8086,因此出现错误。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM