将python web app指标发送到InfluxDB

2024-05-23 22:37:31 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我配置了这样的监控系统:

web_app (via python statsd client) -> statsd -> ...
    ... -> carbon-relay-ng -> carbon-cache -> whisper

我使用Grafana上的Graphite作为绘图工具。在

由于查询性能太差,我决定将这个堆栈改为InfluxDB+Grafana捆绑包。所以,我的问题是如何将应用程序指标发送到InfluxDB?我希望这个捆绑包非常简单,所以如果可能的话,我想跳过statsd。我应该将python statsd client替换为influxdb-python,并使用telegrafUDP服务作为InfluxDB前面的聚合部分,还是直接将度量发送到InfluxDB实例?在


Tags: clientwebapp绘图cache系统ngstatsd
1条回答
网友
1楼 · 发布于 2024-05-23 22:37:31

我会用线路协议把数据发送给telegraf。在

我经常使用influxdb python直接向influxdb提交统计信息。将结果本地发送到telegraf可能会更快,这取决于InfluxDB安装响应的速度和可靠性-如果有延迟,这将阻止您的应用程序。在

线路协议对我来说似乎比其他选项更容易使用,telegraf可以直接接受线路协议。一个潜在的缺点是,通过这种方式发送的任何内容最终都会进入分配给telegraf stats的数据库中。直接进入InfluxDB,您可以选择您的数据将最终存放在哪个数据库中,尽管如果您想使用line protcol格式,这意味着绕过python模块。在

要使用influxdbpython并直接发送到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
        }
    }
]

行格式:

^{2}$

我知道我认为哪个更容易生成(我知道时间戳不匹配,我只是举个例子)。可以使用POST库将行格式POST直接发送到InfluxDB,或者如果已经配置了侦听器,则可以通过UDP发送。在

系列帮助器

该模块有一种方法只接受值和标记,方法是使用^{},这可能很难设置,但很容易使用。在

他们给出的例子是:

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中看到,一旦设置了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

我对influxdbpython的可靠性没有任何问题,大多数时候我们使用SeriesHelper类。这并不是最复杂的事情,但度量背后的思想并不是让一个拥有知识的人将其全部相加,而是它是所有人在链的每个部分编写代码的生活方式的一部分。从这个角度来看,易用性是让人们采用工具的关键。在

相关问题 更多 >