我一直在尝试找出如何将python字典写到InfluxDB中,但没有成功。我尝试过使用InfluxDBClient,也尝试过通过应用程序接口使用请求发布。
我有以下代码:
for server in data['service_group_stat']['member_stat_list']:
metrics = {}
metrics['measurement'] = "LB01"
metrics['tags'] = {}
metrics['fields'] = {}
metrics['tags']['SGNAME'] = name
metrics['tags']['SRVNAME'] = server['server']
metrics['fields']['CURCONNS'] = server['cur_conns']
metrics['fields']['TOTCONNS'] = server['tot_conns']
metrics['fields']['REQBYTES'] = server['req_bytes']
metrics['fields']['REQPKTS'] = server['req_pkts']
metrics['fields']['RESPBYTES'] = server['resp_bytes']
metrics['fields']['RESPPKTS'] = server['resp_pkts']
pprint(metrics)
这将为我提供以下输出:
{'fields': {'CURCONNS': 33,
'REQBYTES': 3151292236,
'REQPKTS': 21160834,
'RESPBYTES': 66671993850,
'RESPPKTS': 51709706,
'TOTCONNS': 332177},
'measurement': 'LB01',
'tags': {'SGNAME': 'SG_ACCOUNT.BUSINESS.COM_443',
'SRVNAME': u'WWW0006'}}
{'fields': {'CURCONNS': 39,
'REQBYTES': 3387948728,
'REQPKTS': 23103920,
'RESPBYTES': 71703285665,
'RESPPKTS': 55687510,
'TOTCONNS': 369628},
'measurement': 'LB01',
'tags': {'SGNAME': 'SG_ACCOUNT.BUSINESS.COM_443',
'SRVNAME': u'WWW0005'}}
{'fields': {'CURCONNS': 16,
'REQBYTES': 3401134891,
'REQPKTS': 24014042,
'RESPBYTES': 70917802336,
'RESPPKTS': 55029480,
'TOTCONNS': 342360},
'measurement': 'LB01',
'tags': {'SGNAME': 'SG_ACCOUNT.BUSINESS.COM_443',
'SRVNAME': u'WWW0004'}}
我已经尝试过使用requests.post来利用InfluxDB应用程序接口:
url = "http://localhost:8086/write?db=metrics"
r = requests.post(url, metrics)
然而,我似乎总是得到一个400的响应:
reply: 'HTTP/1.1 400 Bad Request\r\n'
我也尝试过使用InfluxDBClient:
from influxdb import InfluxDBClient
# Define InfluxDB Client Information
client = InfluxDBClient(host='127.0.0.1', port=8086, username='root', password='root', database='metrics')
for server in data['service_group_stat']['member_stat_list']:
metrics = {}
metrics['measurement'] = "LB01"
metrics['tags'] = {}
metrics['fields'] = {}
metrics['tags']['SGNAME'] = name
metrics['tags']['SRVNAME'] = server['server']
metrics['fields']['CURCONNS'] = server['cur_conns']
metrics['fields']['TOTCONNS'] = server['tot_conns']
metrics['fields']['REQBYTES'] = server['req_bytes']
metrics['fields']['REQPKTS'] = server['req_pkts']
metrics['fields']['RESPBYTES'] = server['resp_bytes']
metrics['fields']['RESPPKTS'] = server['resp_pkts']
client.write_points(metrics)
这最终给出了以下错误:
client.write_points(metrics)
File "/usr/lib/python2.7/site-packages/influxdb/client.py", line 456, in write_points
tags=tags, protocol=protocol)
File "/usr/lib/python2.7/site-packages/influxdb/client.py", line 506, in _write_points
protocol=protocol
File "/usr/lib/python2.7/site-packages/influxdb/client.py", line 292, in write
data = make_lines(data, precision).encode('utf-8')
File "/usr/lib/python2.7/site-packages/influxdb/line_protocol.py", line 126, in make_lines
point.get('measurement', data.get('measurement'))
AttributeError: 'str' object has no attribute 'get'
对我哪里做错了有什么建议吗?
发布于 2017-06-21 18:19:17
在使用json协议(这是默认协议)时,您必须将字典列表传递给InfluxDBClient.write_points()。
您可以检查make_lines()方法的the source code,以确信它遍历了多个点。
答案:使用client.write_points([metrics])
发布于 2017-05-12 18:18:47
上周,我在实习项目中遇到了类似的问题。python似乎不喜欢这样的语法:
metrics['tags']['SGNAME'] = name
也许你可以试试这样的东西..这对我很管用。
for server in data['service_group_stat']['member_stat_list']:
metrics = {}
metrics['measurement'] = "LB01"
tags = {}
fields = {}
tags['SGNAME'] = name
tags['SRVNAME'] = server['server']
metrics['tags'] = tags
fields['CURCONNS'] = server['cur_conns']
fields['TOTCONNS'] = server['tot_conns']
fields['REQBYTES'] = server['req_bytes']
fields['REQPKTS'] = server['req_pkts']
fields['RESPBYTES'] = server['resp_bytes']
fields['RESPPKTS'] = server['resp_pkts']
metrics['fields'] = fields
client.write_points(metrics)
希望能有所帮助
https://stackoverflow.com/questions/43682736
复制相似问题