我会使用线路协议将数据发送到电报。
我经常使用 influxdb-python 将统计信息直接提交给 InfluxDB。将结果本地发送到 telegraf 可能会更快,这取决于您的 InfluxDB 安装响应的速度和可靠性——如果出现延迟,这将阻止您的应用程序。
线路协议对我来说似乎比其他选项更容易使用,并且电报可以直接接受线路协议。一个潜在的缺点是,您以这种方式发送的任何内容最终都会出现在分配给电报统计信息的数据库中。直接进入 InfluxDB,你可以选择你的数据最终存放在哪个数据库中,尽管如果你想使用 line protcol 格式,这意味着绕过 python 模块。
要使用 influxdb-python 并直接发送到 InfluxDB,您可以选择 JSON 格式或使用 SeriesHelper 的子类
JSON
创建write_points/write 使用的 JSON 结构真的很笨拙。无论如何,它只会将其转换为行格式。
比较 JSON:
json_body = [
{
"measurement": "cpu_load_short",
"tags": {
"host": "server01",
"region": "us-west"
},
"time": "2009-11-10T23:00:00Z",
"fields": {
"value": 0.64
}
}
]
转行格式:
# measurement,tag1=tag1value,tag2=tag2value column1=...
cpu_load_short,host=server01,region=us-west value=0.64 1465290833288375000
我知道我认为哪个更容易生成(而且我知道时间戳不匹配,我只是在使用示例)。行格式可以是 POST 使用 requests 库直接发送到 InfluxDB,或者如果已配置该侦听器,则通过 UDP 发送。
系列助手
该模块有一种方法只接受值和标签,通过使用SeriesHelper,这可能很难设置,但易于使用。
他们给出的例子是:
from influxdb import InfluxDBClient, SeriesHelper
myclient = InfluxDBClient(host, port, user, password, dbname)
class MySeriesHelper(SeriesHelper):
# Meta class stores time series helper configuration.
class Meta:
client = myclient
series_name = 'events.stats.{server_name}'
fields = ['some_stat', 'other_stat']
tags = ['server_name']
bulk_size = 5
autocommit = True
MySeriesHelper(server_name='us.east-1', some_stat=159, other_stat=10)
MySeriesHelper(server_name='us.east-1', some_stat=158, other_stat=20)
所以你可以从调用 MySeriesHelper 中看到,一旦设置好它就会变得很容易,但是客户端的配置要么需要在全局范围内(这对模块不利)要么在类定义中进行设置。这不利于从配置文件或服务发现中获取配置,因此您最终会在配置解析函数中执行以下操作:
# Read host, port, user password, dbname from config file, then:
MySeriesHelper.Meta.client = InfluxDBClient(host, port, user, password, dbname)
# Now it is safe to call MySeriesHelper
我在使用 influxdb-python 时没有遇到过可靠性问题,而且大多数时候我们使用SeriesHelper 类。这不是最复杂的事情,但度量背后的想法不是一个有知识的人把它全部加起来,而是它是所有在链中每个部分编写代码的人的生活方式的一部分。从这个角度来看,易用性是让人们采用工具的关键。