本文主要是介绍OpenTSDB 写入介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
OpenTSDB支持几种写入方式。包括Telnet API、HTTP API、import方式、客户端采集器(tcollector/telegraf)。Telnet适合测试用,tcollector/telegraf是日志采集客户端可用于流式加载日志,import方式适合批量导入数据。当然,最后还有一种方式就是直接写入Hbase(官网不推荐),这样OpenTSDB也可以直接展示数据。
一、创建metric
两种方式,选择其一即可。不管何种导入方式都必须先设置metric。
1. 事先在opentsdb中创建metric。如生成两个名为mymetric.data_1和mymetric.data_2的metric。如下:
tsdb mkmetric mymetric.data_1 mymetric.data_2
2.设置自动生成metric。修改opentsdb.conf设置:
tsd.core.auto_create_metrics = true
二、Telnet Put 方式
参考:http://opentsdb.net/docs/build/html/api_telnet/put.html
尝试将数据点写入存储。Telnet API无法处理UTF-8字符,可改用/api/put方法或直接使用Java API。命令格式如下:
put <metric> <timestamp> <value> <tagk_1>=<tagv_1>[ <tagk_n>=<tagv_n>]
终端运行示例:
echo "put mymetric.test.data 1295643636 48 a=foo" | nc -w 15 tsdHost tsdPort
三、HTTP API Put 方式
参考:http://opentsdb.net/docs/build/html/api_http/put.html
此端点允许在OpenTSDB中通过HTTP存储数据,可替代Telnet接口。放置请求只能通过与POST方法关联的内容来执行。
为了节省带宽,put API允许客户端在单个请求中存储多个数据点。数据点之间可以毫无关联。每个数据点被单独处理,并且一个数据的错误将不会影响良好数据的存储。这意味着如果你的请求有100个数据点,其中1个数据点有错误。那么该错误数据点会被拒绝写入,但其余的99个数据点仍将被写入。
虽然API每个请求都支持多个数据点,但API在处理完每个请求之前不会返回。这意味着必须验证度量和标记名称/值,解析值,并将数据排队等待存储。如果你的put请求具有大量的数据点,则API可能需要很长时间才能响应,尤其是如果OpenTSDB必须将UID分配给标记名称或值。因此,最好限制每个请求的最大数据点数; 50每个请求是一个好的起点。
另一个建议是在HTTP客户端上启用keep-alives,这样您可以在每次放置数据时重新使用与服务器的连接。
1 HTTP 请求解析
2 数据写入示例
- 单点数据写入
{"metric": "sys.cpu.nice","timestamp": 1346846400,"value": 18,"tags": {"host": "web01","dc": "lga"}
}
- 多点数据写入
多点数据写入必须被包装成数组形式
[{"metric": "sys.cpu.nice","timestamp": 1346846400,"value": 18,"tags": {"host": "web01","dc": "lga"}},{"metric": "sys.cpu.nice","timestamp": 1346846400,"value": 9,"tags": {"host": "web02","dc": "lga"}}
]
3 返回响应
默认情况下,如果所有数据点都已成功存储,put端点将使用HTTP 204状态码进行响应,而无内容。如果一个或多个数据点有错误,API将在内容中返回一个带有错误消息的400状态码。响应解析说明和响应示例如下图所示:
四、批量导入
参考:http://opentsdb.net/docs/build/html/user_guide/cli/import.html
Import命令允许将时间序列数据批量加载到OpenTSDB中。可提供一个或多个文件,OpenTSDB将解析和加载数据。数据必须和Telnet put的数据格式一致,文本文件中每一行作为一个数据点。此外,文件还可以可选地使用GZip压缩,并且以.gz扩展名结束。
1 输入格式
路径可以是相对路径,也可以是绝对路径。
import path [...paths]
import /home/hobbes/timeseries1.gz /home/hobbes/timeseries2.gz
2 参数说明
格式和Telnet 接口相同。
<metric> <timestamp> <value> <tagk=tagv> [<tagkN=tagvN>]
- metric Is the name of the metric. Note that the metric name may not include spaces.
- timestamp Is the absolute timestamp of the data point in seconds or milliseconds
- value Is the value to store
- tagk=tagv Is a pair of one or more space sparate tag name and value pairs. Note that the tags may not have spaces in them.
Example:
sys.cpu.user 1356998400 42 host=web01 cpu=0
代码示例如下:
./tsdb import --config=/Applications/opentsdb/src/opentsdb.conf /Applications/opentsdb/
my_test_data/opentsdb.txt
文件的内容格式如下,其中时间戳必须升序:
mymetric.test.data 1479303678 0.841470984808 host=xyd_host
mymetric.test.data 1479303679 0.909297426826 host=xyd_host
mymetric.test.data 1479303680 0.14112000806 host=xyd_host
mymetric.test.data 1479303681 -0.756802495308 host=xyd_host
mymetric.test.data 1479303682 -0.958924274663 host=xyd_host
mymetric.test.data 1479303683 -0.279415498199 host=xyd_host
mymetric.test.data 1479303684 0.656986598719 host=xyd_host
mymetric.test.data 1479303685 0.989358246623 host=xyd_host
mymetric.test.data 1479303686 0.412118485242 host=xyd_host
mymetric.test.data 1479303687 -0.544021110889 host=xyd_host
mymetric.test.data 1479303688 -0.999990206551 host=xyd_host
mymetric.test.data 1479303689 -0.536572918 host=xyd_host
五、Tcollector/Telegraf 客户端写入
这里使用Tcollect收集,Telegraf不做演示。Tcollector是一个客户端程序,用来收集本机的指标数据,并将数据发送到OpenTSDB。
Tcollector GitHub地址:https://github.com/OpenTSDB/tcollector/
Tcollector 官方地址:http://opentsdb.net/docs/build/html/user_guide/utilities/tcollector.html
关于Tcollector安装和介绍,在此就不详细说明了。这里展示的是按照官方要求,直接用python定义一个收集器,向opentsdb发送数据。
运行:
sudo ./tcollector start
用Python自定义一个mycollector.py,注意文件权限为755,也可直接设为777。
#!/usr/bin/env python import sys
import time
import math
from collectors.lib import utilsCOLLECTION_INTERVAL = 5 # secondsdef getValue(num):return math.cos(num)def main():utils.drop_privileges()i = 100while True:print("xyd.test.cos %d %s"% (int(time.time()), getValue(i)))i += 0.1sys.stdout.flush()time.sleep(COLLECTION_INTERVAL)if __name__ == "__main__":sys.stdin.close()sys.exit(main())
执行效果如下,生成一个只有正值的cos函数,貌似opentsdb不显示负数的:
这篇关于OpenTSDB 写入介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!