如何解决InfluxDBListener - 使用 locust 获取 401
运行 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 容器中,而只是在本地运行。
确认:
- Influx 肯定在 localhost:8086 上运行。我可以在我的电脑上访问 http://localhost:8086 来访问 InfluxDB。
- 存储桶
load_bucket
已经存在 [注意到 InfluxDBListener 实际上尝试创建数据库] - 用户名和密码正确
- 在我写的另一个脚本中,我可以毫无问题地做到这一点:
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,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,line 347,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,body=body,headers=headers)
File "C:\Python38\lib\http\client.py",line 1255,in request
self._send_request(method,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,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,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 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'))
这是 influx
的 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
解决方法
Influx 肯定在 localhost:8086 上运行
不完全是。假设 InfluxDB 服务在您的 docker-compose.yml 文件中称为“influxdb”,则该数据库在 influxdb:8086
运行,如果您公开端口 8086,则在您的 docker 上显示为 localhost:8086
主持人。
但是,运行您的脚本的容器不会将暴露的端口视为 localhost
,因此在 python 脚本中,localhost
是您的脚本运行的容器,而不是 Docker 主机。您正在尝试连接到本地端口 8086,该端口没有数据库连接,因此出现错误。
最简单的解决方案是将 influx_host='localhost'
替换为 influx_host='influxdb'
(再次假设 influxdb
是您在 docker-compose.yml 文件中拥有的 InfluxDB 服务的名称,编辑根据需要)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。