【问题标题】:Influxdb Python write_points errorInfluxdb Python write_points错误
【发布时间】:2017-10-13 15:27:11
【问题描述】:

我正在尝试使用以下代码使用 influxdb-python 将 json(见下文)写入 influxDB -

DBclient = client(host, port, user, password, dbname) 
influx_data = json.dumps(write_to_influx_json)
print influx_data
# Writing Data in Influx
DBclient.write_points(influx_data)

JSON -

    [{
    "fields": [{
        "PATH": "/",
        "DISK_USED_PERCENT": "10"
    }, {
        "PATH": "/xxxxxxxxx",
        "DISK_USED_PERCENT": "0"
    }, {
        "PATH": "/dev/xxxxxxxxx",
        "DISK_USED_PERCENT": "0"
    }, {
        "PATH": "/xxxxxxxxx",
        "DISK_USED_PERCENT": "3"
    }, {
        "PATH": "/sys/xxxxxxxxx/xxxxxxxxx",
        "DISK_USED_PERCENT": "0"
    }, {
        "PATH": "/run/xxxxxxxxx",
        "DISK_USED_PERCENT": "0"
    }, {
        "PATH": "xxxxxxxxx",
        "DISK_USED_PERCENT": "0"
    }],
    "tags": {
        "host_identifier": "xxxxxx",
        "name": "mount_point_percentage"
    },
    "time": "xxxxx",
    "measurement": "xxxxxxx"
  }]

但我不断收到以下错误 -

AttributeError: 'str' object has no attribute 'get'

谁能指点我正确的方向。

【问题讨论】:

    标签: python influxdb-python


    【解决方案1】:

    您似乎没有正确调用 write_points()。 Docs 似乎表明您需要提供更多信息。 write_points(points, time_precision=None, database=None, retention_policy=None, tags=None, batch_size=None, protocol=u'json') 参数:

    points(字典列表,每个字典代表一个点)——要写入数据库的点列表

    time_precision (str) – smmsu,默认为无

    database (str) – 将点写入的数据库。默认为客户端的当前数据库

    tags (dict) – 一组与每个点关联的键值对。键和值都必须是字符串。这些是共享标签,将与特定于点的标签合并,默认为无

    retention_policy (str) – 积分的保留政策。默认为无

    batch_size (int) – 分批写入点的值,而不是一次性写入所有点。用于将数据从一个数据库转储到另一个数据库或进行大量写入操作时很有用,默认为无

    protocol (str) – 写入数据的协议。 linejson

    【讨论】:

    • 试过这个 - DBclient.write_points(influx_data, time_precision=None, database=None, retention_policy=None, tags=None, batch_size=None, protocol=u'json'),仍然遇到同样的异常
    • 在 Python 中,只需要没有默认值的非关键字参数。以上只是points
    • 不知time_precision==None是什么意思?引用的文档中没有任何内容。也许这意味着无限不精确的时间?这听起来像是神秘博士插曲的基础;)
    【解决方案2】:
    influx_data = json.dumps(write_to_influx_json)
    

    数据需要是字典列表,而不是 json。

    docs

    write_points(点)

    点(字典列表,每个字典 表示一个点)——要写入数据库的点列表

    【讨论】:

      【解决方案3】:

      您的代码中有 2 个问题。

      首先,您没有正确调用write_points()(就像@Davidgs 和@danny 所说的那样)。 docs 声明如下:

      write_points(点)

      points(字典列表,每个字典代表一个点)——要写入数据库的点列表

      在您的代码中,您调用的是DBclient.write_points(influx_data),但参数influx_data 是一个字符串。该方法期望它是一个字典列表。这可以通过发送 JSON 数据 write_to_influx_json 而不是 influx_data 来解决。所以你的代码应该是这样的:

      DBclient.write_points(write_to_influx_json)
      

      第二个问题是 JSON 结构,更具体地说,是 fields 元素。它应该是字典,而不是列表(如 tags 元素)。据我所知,您正在尝试发送多个数据点。数据点必须是单独的字典(如文档所述)。所以你的 JSON 数据结构应该是这样的:

      [
          {
              "fields": {
                  "PATH": "/",
                  "DISK_USED_PERCENT": "10"
              },
              "tags": {
                  "host_identifier": "xxxxxx",
                  "name": "mount_point_percentage"
              },
              "time": "xxxxx",
              "measurement": "xxxxxxx"
          },
          {
              "fields": {
                  "PATH": "/xxxxxxxxx",
                  "DISK_USED_PERCENT": "0"
              },
              "tags": {
                  "host_identifier": "xxxxxx",
                  "name": "mount_point_percentage"
              },
              "time": "xxxxx",
              "measurement": "xxxxxxx"
          },
          {
              "fields": {
                  "PATH": "/dev/xxxxxxxxx",
                  "DISK_USED_PERCENT": "0"
              },
              "tags": {
                  "host_identifier": "xxxxxx",
                  "name": "mount_point_percentage"
              },
              "time": "xxxxx",
              "measurement": "xxxxxxx"
          },
          {
              "fields": {
                  "PATH": "/xxxxxxxxx",
                  "DISK_USED_PERCENT": "3"
              },
              "tags": {
                  "host_identifier": "xxxxxx",
                  "name": "mount_point_percentage"
              },
              "time": "xxxxx",
              "measurement": "xxxxxxx"
          }
      ]
      

      等等。

      这个错误也发生在我的代码中! :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-24
        • 2017-10-23
        • 1970-01-01
        • 1970-01-01
        • 2015-02-18
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        相关资源
        最近更新 更多