参考
【InfluxDB V2.0】介绍与使用,flux查询、数据可视化_influxdb2.0使用和管理-CSDN博客
-----------------------------------------------------------------------------------------------------------------------
python对influxdb 2.0 操作文档
https://docs.influxdata.com/influxdb/v2/api-guide/client-libraries/python/
-----------------------------------------------------------------------------------------------------------------------
插入数据方法参考:
时序数据库influxDB(三)Python连接TSDB——influxDB2_influx2 py-CSDN博客
-----------------------------------------------------------------------------------------------------------------------
读取数据参考:本质上是使用python向influxdb发送一条FLUX查询语句让其返回数值
https://influxdb-client.readthedocs.io/en/latest/api.html#queryapi
-----------------------------------------------------------------------------------------------------------------------
删除数据参考:
User Guide — influxdb_client 1.46.0dev0 documentation
-----------------------------------------------------------------------------------------------------------------------
FLUX数据脚本语言:
-----------------------------------------------------------------------------------------------------------------------
插入数据方法,详细请参照上面的链接。
from datetime import datetime
from influxdb_client import InfluxDBClient, Point, WritePrecision
from influxdb_client.client.write_api import SYNCHRONOUS
bucket = "<my-bucket>"
org = "<my-org>"
token = "<my-token>"
with InfluxDBClient(url="http://localhost:8086/", token=token, org=org) as client:
write_api = client.write_api(write_options=SYNCHRONOUS)
# 写入方法1
data = "mem,host=host1 used_percent=19.43234543"
write_api.write(bucket, org, data)
# 写入方法2 (推荐这种)
point = Point("mem") \
.tag("host", "host1") \
.field("used_percent", 26.43234545) \
.time(datetime.utcnow(), WritePrecision.NS)
write_api.write(bucket, org, point)
#写入方法3
sequence = ["mem,host=host1 used_percent=30.43234543",
"mem,host=host1 available_percent=37.856523"]
write_api.write(bucket, org, sequence)
# TODO 这里写查询
# 用完关闭
client.close()
data = "mem,host=host1 used_percent=19.43234543"
write_api.write(bucket, org, data)
mem可以替换为任意字符串当作表头,对应参数:_measurement
host = host1 ,host1可以替换为任意字符串,对应参数host
used_percent 可以替换为任意 变量名(数据的名字),对应参数_field,19.43234543就是数据。
point = Point("mem") \
.tag("host", "host1") \
.field("used_percent", 26.43234545) \
.time(datetime.utcnow(), WritePrecision.NS)
write_api.write(bucket, org, point)
mem可以替换为任意字符串当作表头,对应参数:_measurement
host = host1 ,host1可以替换为任意字符串,对应参数host
used_percent 可以替换为任意 变量名(数据的名字),对应参数_field,26.4323就是数据。
sequence = ["mem,host=host1 used_percent=30.43234543",
"mem,host=host1 available_percent=37.856523"]
write_api.write(bucket, org, sequence)
写入多个数据
mem可以替换为任意字符串当作表头,对应参数:_measurement
host = host1 ,host1可以替换为任意字符串,对应参数host
used_percent 可以替换为任意 变量名(数据的名字),对应参数_field,26.4323就是数据。
---------------------------------------------------------------------------------------------------------------------------------
读取数据方法:
import influxdb_client
from influxdb_client.client.write_api import SYNCHRONOUS
bucket = "<my-bucket>"
org = "<my-org>"
token = "<my-token>"
# Store the URL of your InfluxDB instance
url = "http://localhost:8086/"
client = influxdb_client.InfluxDBClient(
url=url,
token=token,
org=org
)
# Query script
query_api = client.query_api()
query = 'from(bucket: "interesting_data")\
|> range(start: 2024-09-10T04:00:00Z, stop: 2024-09-10T06:00:00Z)\
|> filter(fn: (r) => r["_measurement"] == "mem")\
|> filter(fn: (r) => r["_field"] == "used_percent")\
|> filter(fn: (r) => r["host"] == "host1")\
|> aggregateWindow(every: 1s, fn: mean, createEmpty: false)\
|> yield(name: "mean")'
result = query_api.query(org=org, query=query)
results = []
for table in result:
for record in table.records:
results.append((record.get_field(), record.get_value()))
print(results)
直接复制就行,核心是flux语句。
bucket = "<my-bucket>"
org = "<my-org>"
token = "<my-token>"
对应桶、组织、令牌
query = 'from(bucket: "interesting_data")\
|> range(start: 2024-09-10T04:00:00Z, stop: 2024-09-10T06:00:00Z)\
|> filter(fn: (r) => r["_measurement"] == "mem")\
|> filter(fn: (r) => r["_field"] == "used_percent")\
|> filter(fn: (r) => r["host"] == "host1")\
|> aggregateWindow(every: 1s, fn: mean, createEmpty: false)\
|> yield(name: "mean")'
result = query_api.query(org=org, query=query)
results = []
range(start: 2024-09-10T04:00:00Z, stop: 2024-09-10T06:00:00Z)用来确定查询时间范围
range()有两个参数,分别是start和stop。
# Relative time range with start only. Stop defaults to now.
'from(bucket:"example-bucket")\
|> range(start: -1h)'
# Relative time range with start and stop
'from(bucket:"example-bucket")\
|> range(start: -1h, stop: -10m)'
# 使用绝对时间
'from(bucket:"example-bucket")\
|> range(start: 2024-09-10T04:00:00Z, stop: 2024-09-10T06:00:00Z)'
# 过去十五分钟的数据
'from(bucket:"example-bucket")\
|> range(start: -15m)'
filter() 过滤数据 满足时间、 _measurement 、_field、host条件的数据就会输出回来
aggregateWindow()辅助函数,详细看FLUX语句文章4.5.7
其中every会将数据按时间分成块,输出的数据是这个块中的平均值。
使用 Flux 的 yield() 函数将过滤后的表作为查询结果输出。
result里面就带有数据,直接用for循环就能打印出来了
---------------------------------------------------------------------------------------------------------------------------------
删除方法:
from influxdb_client import InfluxDBClient
bucket = "<my-bucket>"
org = "<my-org>"
token = "<my-token>"
client = InfluxDBClient(url="http://localhost:8086", token=token)
delete_api = client.delete_api()
"""
Delete Data
"""
start = "2024-09-09T00:00:00Z"
stop = "2024-09-10T10:20:00Z"
delete_api.delete(start, stop, '_measurement="mem"AND host="host1"', bucket=bucket, org=org)
"""
Close client
"""
client.close()
核心函数:
delete_api.delete(start, stop, '_measurement="mem"AND host="host1"', bucket=bucket, org=org)
mem可以替换为任意字符串当作表头,对应参数:_measurement
host = host1 ,host1可以替换为任意字符串,对应参数host
---------------------------------------------------------------------------------------------------------------------------------
注意事项:
incluxdb 存储数据的时间是系统时区的UTC时间。如果在东八区10:00点插入数据,查询结果,time为2:00
要么手动更改-8h,要么找别的方法来对上这个时间。