Search code examples
pythonfluxinfluxdb-2

Why I cannot query Influxdbv2 data using python?


I'm trying to query data from InfluxDBv2 (2.0.2) using python3. The query is in flux, it works well inside InfluxDB (it displays the data well). I've tried to executed inside the same VM (Ubuntu 18.04) and the host machine (Windows10 Jupyter python-kernel=python3).

!pip install influxdb-client
!pip install pandas
import pandas as pd
from influxdb_client import InfluxDBClient
client = InfluxDBClient(url="http://192.168.1.55:9999", token="RQrupr_Za863NcxjbWDWpVWgdgsgshwawkfYuPrc02tTvwCxwYOHywb_huoK4EttYY4pPOPr3Vcfv-7xo8cBlldw==", org="bim")
query_api=client.query_api()
data_frame = query_api.query_data_frame('from(bucket:"manager") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "mqtt_consumer") |> filter(fn: (r) => r["_field"] == "timestamp") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> yield(name: "mean")')
data_frame.head()

r@r-VirtualBox:~$ python qr.py
Traceback (most recent call last):
  File "qr.py", line 8, in <module>
    data_frame = query_api.query_data_frame('from(bucket:"manager") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "mqtt_consumer") |> filter(fn: (r) => r["_field"] == "timestamp") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> yield(name: "mean")')
  File "/home//.local/lib/python3.6/site-packages/influxdb_client/client/query_api.py", line 116, in query_data_frame
    _generator = self.query_data_frame_stream(query, org=org, data_frame_index=data_frame_index)
  File "/home/.local/lib/python3.6/site-packages/influxdb_client/client/query_api.py", line 141, in query_data_frame_stream
    async_req=False, _preload_content=False, _return_http_data_only=False)
  File "/home/.local/lib/python3.6/site-packages/influxdb_client/service/query_service.py", line 260, in post_query
    (data) = self.post_query_with_http_info(**kwargs)  # noqa: E501
  File "/home/.local/lib/python3.6/site-packages/influxdb_client/service/query_service.py", line 355, in post_query_with_http_info
    urlopen_kw=urlopen_kw)
  File "/home/.local/lib/python3.6/site-packages/influxdb_client/api_client.py", line 345, in call_api
    _preload_content, _request_timeout, urlopen_kw)
  File "/home/.local/lib/python3.6/site-packages/influxdb_client/api_client.py", line 174, in __call_api
    _request_timeout=_request_timeout, **urlopen_kw)
  File "/home/.local/lib/python3.6/site-packages/influxdb_client/api_client.py", line 392, in request
    **urlopen_kw)
  File "/home/.local/lib/python3.6/site-packages/influxdb_client/rest.py", line 309, in POST
    **urlopen_kw)
  File "/home/.local/lib/python3.6/site-packages/influxdb_client/rest.py", line 252, in request
    raise ApiException(http_resp=r)
influxdb_client.rest.ApiException: (400)
Reason: Bad Request
HTTP response headers: HTTPHeaderDict({'Content-Type': 'application/json; charset=utf-8', 'Vary': 'Accept-Encoding', 'X-Platform-Error-Code': 'invalid', 'Date': 'Fri, 18 Dec 2020 08:06:28 GMT', 'Transfer-Encoding': 'chunked'})
HTTP response body: b'{"code":"invalid","message":"error @1:219-1:220: undefined identifier v"}'

Am I missing something? I've followed examples of this official site https://github.com/influxdata/influxdb-client-python#pandas-dataframe


Solution

  • Did you read the error?

    {"code":"invalid","message":"error @1:219-1:220: undefined identifier v"}
    

    Your query is

    from(bucket:"manager") |> 
    range(start: v.timeRangeStart, stop: v.timeRangeStop) |> 
    filter(fn: (r) => r["_measurement"] == "mqtt_consumer") |> 
    filter(fn: (r) => r["_field"] == "timestamp") |> 
    aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> 
    yield(name: "mean")
    

    yet you never define the v variable used in the range and aggregateWindow clauses in any way.

    They might work in some other InfluxDB client because its UI defines them and likely replaces them into the query before passing it to the InfluxDB server.