influxdata / influxdb-python

Python client for InfluxDB
MIT License
1.7k stars 522 forks source link

A query with a certain date yields an UnicodeDecodeError when decoding msgpack response #911

Open shaoran opened 2 years ago

shaoran commented 2 years ago

I initialized the client:


def as_utc_with_z(date):
    date_str = date.astimezone(tz.UTC).isoformat()
    return f"{date_str[:-6]}Z"

def parse_datetime(dt):
    d = dateutil.parser.parse(dt)
    if d.tzinfo is None:
        d = d.replace(tzinfo=tz.tzlocal())

    return d

def main():
    parser = argparse.ArgumentParser()
    ...
    args = parser.parse_args(argv)

    fetch_range = (parse_datetime(args.begin), parse_datetime(args.end))
    ...
    fetch_range = [as_utc_with_z(x) for x in fetch_range]

    kwargs = { 
         "host": credentials["host"],
         "port": credentials["port"],
         "username": credentials["user"],
         "password": credentials["password"],
         "database": credentials["db"],
         "ssl": True,
         "verify_ssl": True,
    }   

    client = InfluxDBClient(**kwargs)

    query = f"SELECT * FROM verzuolo WHERE time >= '{fetch_range[0]}' AND time <= '{fetch_range[1]}'"
    res = client.query(query)
    ...

When I execute my script with --begin 2021-06-03T00:00 --end 2021-06-03T23:59 then I get this error:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 0: invalid start byte

I know that the customer started writing data at some point on the 3rd of June, if I set the date to 2nd of June I get an empty response. But when I use any other day, then I get a proper reponse.

So the problem is in the influxdb/client.py file on line 357 (request function). Passing raw=False to msgpack.unpackb yields the execption. Passing raw=True does not yield an error but in the response you don't get str-objects but byte-objects.

So the question is: where is the error? On the server side, or on the client side? And as an user of this library, is there anything I can do?

Version information