如何使用 libcurl(对于 Influxdb)发布包含换行符的数据?
Posted
技术标签:
【中文标题】如何使用 libcurl(对于 Influxdb)发布包含换行符的数据?【英文标题】:How to post data including a line break with libcurl (for Influxdb)? 【发布时间】:2019-05-08 10:02:35 【问题描述】:我在 C++ 中使用 libcurl
将数据点发布到 InfluxDB。单个数据点正在工作,但对于多个点,我正在努力解决必要的换行符 (\n),如 InfluxDB HTTP API 中所定义:
通过一个请求将多个点写入数据库,每个点用新行分隔。
从带有@标志的文件中写入点。该文件应包含一批线路协议格式的点。各个点必须在自己的行上,并用换行符 (\n) 分隔。包含回车的文件会导致解析器错误。
我猜这可能是字符格式的问题,但我不知道为什么?下面的代码只写了 5 的距离,但应该写两个距离。
#include "stdafx.h"
#include "tchar.h"
#include <string>
#include <curl\curl.h>
#include <sstream>
int main()
int dataPoints[] = 3, 5 ;
std::string fieldIdentifier = "distance";
std::stringstream ss;
for (int i = 0; i < 1; i++)
ss << "aufbau1,ort=halle ";
ss << fieldIdentifier;
ss << "=" << dataPoints[i];
ss << std::endl; //I guess this is the problem, it adds \n
ss << "aufbau1,ort=halle ";
ss << fieldIdentifier;
ss << "=" << dataPoints[1];
std::string data = ss.str();
const char *dataChar = data.c_str();
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl)
curl_easy_setopt(curl, CURLOPT_URL, "http://myIP:8086/write?db=testdb&u=myUser&p=myPwd");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, dataChar);
res = curl_easy_perform(curl);
/* Check for errors */
if (res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
curl_easy_cleanup(curl);
return 0;
【问题讨论】:
使用stringstream ss(std::ios_base_out|std::ios_base::binary);
将您的字符串流设置为binary mode 这将阻止从\n
到\r\n
的转换
@Botje 我已经按照您的建议尝试了二进制模式。我猜你的意思是std::ios_base::out
而不是std::ios_base_out
?不幸的是,问题仍然存在。
尝试将data
的内容转储到文件中(绝对不要忘记binary
模式)并使用十六进制转储器对其进行检查。如果看起来不错,请尝试按照手册的建议使用curl --data-binary @file
发布它。您的请求可能有else错误。
文件看起来不错,第一行末尾只有LF
。但不幸的是,curl --data-binary @file
再次添加了第二个数据点。
好吧,我实际上错过了一些关键的东西。将多个数据点发布到 InfluxDB 时,时间戳是强制性的。通过添加它,一切正常,使用@Botje 的建议将字符串流设置为stringstream ss(std::ios_base_out|std::ios_base::binary);
非常感谢!
【参考方案1】:
在 python 中,在标签/字段值内有一个<br>
html 标签似乎就像一个换行符,同时在 grafana 中查看这些数据。
关于\n
influxdb 说
注意:行协议不支持标签值或字段值中的换行符\n。
https://docs.influxdata.com/influxdb/v1.8/write_protocols/line_protocol_reference/
【讨论】:
以上是关于如何使用 libcurl(对于 Influxdb)发布包含换行符的数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 influxdb-python 向 influxdb 发送正确的时间戳