InfluxDB HTTP API 实战指南:从基础查询到高级数据写入

InfluxDB HTTP API 实战指南:从基础查询到高级数据操作 本文提供了InfluxDB HTTP API的实战指南,涵盖从基础查询到高级数据操作的全流程。通过详细的接口调用示例,包括健康检查、数据写入与查询,以及性能调优技巧,帮助开发者高效处理时序数据,构建稳定可靠的数据管道。 阅读详情

1. 为什么你需要掌握InfluxDB HTTP API?

如果你正在处理物联网传感器数据、服务器监控指标,或者任何随时间变化的数据流,那么InfluxDB很可能已经进入了你的技术选型清单。它是一个为时间序列数据量身打造的高性能数据库,但光有数据库还不够,你得知道怎么跟它“对话”。这就是HTTP API的用武之地。

我见过不少开发者,数据库装好了,数据也采集了,但一到读写查询就抓瞎,要么是性能上不去,要么是数据对不上。其实很多时候,问题就出在对HTTP API的理解和运用不够深入。通过HTTP API,你可以用任何熟悉的编程语言(Python、Go、Java等等)或者简单的命令行工具,像访问一个普通网页一样,去操作InfluxDB。无论是往里面塞入海量的传感器读数,还是从中提取出过去一小时的CPU平均负载,都变得异常简单直接。

这篇文章不会给你讲一堆枯燥的理论。我会直接带你上手,从最基础的“健康检查”开始,到如何高效地写入成千上万条数据,再到执行复杂的查询和分析。我会分享我实际项目中踩过的坑和总结的最佳实践,比如怎么通过批量写入把性能提升10倍,怎么精确控制时间戳避免时区混乱。无论你是刚接触InfluxDB的新手,还是想优化现有流程的老手,相信这些实战经验都能让你少走弯路。

2. 动手之前:环境、令牌和工具一个都不能少

在开始敲代码调用API之前,咱们得先把“战场”布置好。这就像做饭前要先备好菜和锅一样,准备工作做足了,后面才能顺畅。

2.1 快速搭建InfluxDB运行环境

首先,你得有个InfluxDB在跑着。这里我强烈建议使用Docker来安装,这能省去一大堆依赖和配置的麻烦,特别适合快速开始和测试。如果你还没安装Docker,去官网下一个,安装过程很简单。

打开你的终端,执行下面这条命令,一个InfluxDB 2.7的服务就跑起来了:

docker run -d -p 8086:8086 \
  --name influxdb \
  -v influxdb2-data:/var/lib/influxdb2 \
  influxdb:2.7

这条命令做了几件事:-d 让它在后台运行,-p 8086:8086 把容器内的8086端口映射到你本机的8086端口(这样你才能访问),--name 给容器起个名字方便管理,-v 把数据卷挂载出来,确保数据不会因为容器删除而丢失。执行完后,用 docker ps 看看状态,如果是 Up 就说明成功了。

现在,打开你的浏览器,访问 http://localhost:8086。你应该能看到InfluxDB的初始化页面,按照提示创建一个初始用户、组织和一个存储桶(Bucket)。这个“存储桶”在InfluxDB 2.x里就相当于1.x版本的“数据库”。

2.2 获取你的通行证:API Token

在InfluxDB 2.x里,API Token是你的唯一通行证,所有API请求都需要携带它来证明身份和权限。获取它很简单:

  1. 登录刚才的Web界面 (http://localhost:8086)。
  2. 点击左侧导航栏的 “加载数据” (Load Data) -> “API令牌” (API Tokens)。
  3. 点击 “生成API令牌” (Generate API Token)。这里你可以选择令牌的权限范围,比如“所有访问权限”,或者更细粒度地控制。为了测试方便,我们可以先选“所有访问权限”。注意:在生产环境中,务必遵循最小权限原则!
  4. 生成的令牌字符串只会显示一次,务必立即复制并妥善保存到一个安全的地方(比如密码管理器)。关掉这个窗口就再也找不回来了。

这个令牌长这样:LqVK4e8EoGp_r4U2jQnXyHuAaBcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789==。接下来我们调用任何API,都需要在请求头里带上它:Authorization: Token YOUR_API_TOKEN。

2.3 挑选称手的测试工具

工欲善其事,必先利其器。测试API,我首推 Postman 或它的优秀国产替代品 ApiPost。它们有直观的图形界面,能轻松管理请求、设置环境变量、查看响应,对调试非常友好。

以Postman为例:

  1. 新建一个集合(Collection),比如叫“InfluxDB实战”。
  2. 在这个集合下,创建一个环境变量(Environment)。添加一个变量,比如 influx_token,值就是你刚才保存的API Token。
  3. 在集合的“预请求脚本”(Pre-request Script)或“认证”(Authorization)标签页中,设置全局的请求头:Authorization -> Bearer {{influx_token}}。这样,这个集合下的每个请求都会自动带上令牌。

当然,如果你喜欢命令行,curl 永远是可靠的选择。它的好处是便于集成到脚本中,做自动化测试。我们后面的例子也会给出对应的 curl 命令。

3. 从“心跳”开始:Ping接口与基础查询

让我们从一个最简单的接口开始,确保一切就绪。

3.1 健康检查:Ping接口

Ping接口用来检查InfluxDB服务是否活着,并且可以获取版本信息。它非常简单,不需要任何认证。

请求示例 (使用 curl):

curl -I http://localhost:8086/ping

使用 -I 参数只获取响应头。如果服务正常,你会看到:

HTTP/1.1 204 No Content
Content-Type: application/json
X-Influxdb-Build: OSS
X-Influxdb-Version: 2.7.1
X-Request-Id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

状态码 204 表示成功,并且返回头里包含了构建类型和版本号。如果服务没启动,你会收到连接拒绝的错误。

3.2 数据查询的核心:Query接口

Query接口是InfluxDB的“大脑”,你所有的数据读取、聚合、管理操作(在兼容模式下)都通过它完成。它支持GET和POST请求,但更推荐POST,尤其是查询语句较长时。

关键参数:

  • org: 必填。你的组织名称或ID。在InfluxDB 2.x中,这是必须的。
  • bucket: 必填。你要查询的存储桶名称。
  • q (或请求体): 必填。你的查询语句,使用 Flux 语言。InfluxDB 2.x默认使用Flux,它比1.x的InfluxQL更强大灵活。

实战示例1:查询最近5分钟的CPU数据 假设我们有一个存储桶叫system_metrics,里面记录了服务器CPU使用率。

curl --request POST http://localhost:8086/api/v2/query?org=my-org \
  --header 'Authorization: Token YOUR_API_TOKEN' \
  --header 'Content-Type: application/vnd.flux' \
  --data '
from(bucket: "system_metrics")
  |> range(start: -5m)
  |> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage_user")
  |> aggregateWindow(every: 1m, fn: mean)
  |> yield(name: "mean_cpu_usage")
'

让我解释一下这个Flux脚本:

  1. from: 指定数据源(存储桶)。
  2. range: 限定时间范围(最近5分钟)。
  3. filter: 过滤出 measurement 为 cpu 且 _field 为 usage_user 的数据。
  4. aggregateWindow: 按1分钟窗口进行聚合,计算每个窗口的平均值。
  5. yield: 输出结果集。

返回结果 是CSV格式(Flux默认返回CSV),结构清晰,易于程序解析。你会看到类似这样的数据:

#group,false,false,true,true,false,false,true,true,true
#datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,double,string,string,string
#default,_result,,,,,,,,
,result,table,_start,_stop,_time,_value,_field,_measurement,host
,,0,2023-10-27T10:00:00Z,2023-10-27T10:05:00Z,2023-10-27T10:01:00Z,12.34,usage_user,cpu,server01
,,0,2023-10-27T10:00:00Z,2023-10-27T10:05:00Z,2023-10-27T10:02:00Z,15.67,usage_user,cpu,server01
...

实战示例2:使用查询参数(兼容v1 API) 如果你有旧的InfluxQL脚本需要迁移,或者在使用一些只支持v1 API的工具,InfluxDB 2.x也提供了兼容端点。

curl -G 'http://localhost:8086/query?db=my_db&rp=my_rp' \
  --header 'Authorization: Token YOUR_API_TOKEN' \
  --data-urlencode 'q=SELECT mean("usage_user") FROM "cpu" WHERE time > now() - 5m GROUP BY time(1m)'

注意这里用的是 /query 端点,并且参数是 db(数据库名)和 rp(保留策略)。这需要你在InfluxDB 2.x中配置好DBRP映射(将数据库和保留策略映射到存储桶)。这种方式适合渐进式迁移。

4. 高效写入数据:Write接口的进阶技巧

把数据存进去是第一步,但存得好、存得快才是关键。Write接口负责数据写入,这里面的门道不少。

4.1 理解行协议:数据的“DNA”

InfluxDB最高效的数据格式是 行协议 (Line Protocol)。它长这样:

<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]
  • measurement: 测量名称,相当于表名。
  • tags: 标签,键值对格式,用于索引和分组查询。必须是字符串。例如 host=server01,region=us-west。
  • fields: 字段,实际存储的数据值,可以是整数、浮点数、字符串或布尔值。例如 value=25.5。
  • timestamp: 时间戳,可选。不提供时,InfluxDB会使用服务器当前时间。强烈建议由数据产生方提供精确时间戳。

一个具体的例子:

temperature,device_id=sensor-001,location=room-101 value=22.1 1698391234567890123

这表示:在时间戳 1698391234567890123(纳秒精度),设备 sensor-001 在 room-101 位置,测量到的温度值是 22.1。

4.2 单点写入与批量写入

单点写入(不推荐用于生产):

curl --request POST http://localhost:8086/api/v2/write?org=my-org&bucket=system_metrics \
  --header 'Authorization: Token YOUR_API_TOKEN' \
  --header 'Content-Type: text/plain; charset=utf-8' \
  --data 'cpu,host=web-server-01 usage_user=65.4,usage_system=12.1 1698391300000000000'

这适合偶尔写入一两条数据。但对于物联网或监控场景,每秒成千上万的数据点,这样写效率极低。

批量写入(强烈推荐): 批量写入的核心是用换行符 \n 分隔每一行协议数据。

curl --request POST http://localhost:8086/api/v2/write?org=my-org&bucket=system_metrics \
  --header 'Authorization: Token YOUR_API_TOKEN' \
  --header 'Content-Type: text/plain; charset=utf-8' \
  --data-binary $'cpu,host=web-server-01 usage_user=65.4 1698391300000000000\ncpu,host=web-server-01 usage_user=66.1 1698391360000000000\ncpu,host=web-server-02 usage_user=15.2 1698391300000000000'

注意这里用了 --data-binary 和 $'...' 的格式(在Bash中),确保换行符被正确传递。批量写入能极大减少HTTP请求开销,是提升写入吞吐量的首要手段。

4.3 关键参数:精度与一致性

在写入时,有两个参数至关重要:

  1. precision (精度):指定你提供的时间戳的精度。如果你的时间戳是毫秒(如 1698391300123),就必须设置 precision=ms。可选值有 ns(纳秒,默认)、us(微秒)、ms(毫秒)、s(秒)。如果精度不匹配,会导致时间戳错误,数据可能被存到过去或未来!

    # 使用毫秒时间戳写入
    curl --request POST 'http://localhost:8086/api/v2/write?org=my-org&bucket=system_metrics&precision=ms' \
      --header 'Authorization: Token YOUR_API_TOKEN' \
      --header 'Content-Type: text/plain; charset=utf-8' \
      --data-binary 'cpu,host=web-server-01 usage_user=65.4 1698391300123'
    
  2. consistency (一致性):这个参数在某些场景下(如InfluxDB企业版集群)用于控制写入一致性级别。常见选项有 any、one、quorum、all。对于单机版或对写入延迟敏感的场景,通常使用 any(默认值)以获得最快速度。

4.4 从文件批量导入:应对初始数据迁移

如果你有一大堆历史数据文件(比如CSV),用脚本一条条发HTTP请求太慢。InfluxDB提供了命令行工具 influx write,它能直接读取文件并高效导入。

首先,把你的数据整理成行协议格式,保存为 data.txt:

temperature,device=sensor1 value=21.5 1698391000000000000
temperature,device=sensor1 value=21.7 1698391060000000000
temperature,device=sensor2 value=23.1 1698391000000000000

然后使用 influx CLI导入:

# 配置CLI连接到你的InfluxDB实例
influx config create --config-name local \
  --host-url http://localhost:8086 \
  --org my-org \
  --token YOUR_API_TOKEN \
  --active

# 执行导入
influx write --bucket system_metrics --file ./data.txt

这种方法速度非常快,是进行数据初始化或恢复的最佳实践。

5. 应对海量数据:写入优化与错误处理

当数据量真的上来之后,一些基础操作就需要优化了。我在这里踩过不少坑。

5.1 找到最佳的批量大小

批量写入不是越大越好。过大的批次可能导致单个HTTP请求超时,或者给InfluxDB造成内存压力。过小的批次则无法发挥批量优势。根据InfluxData官方建议和我的经验,每个批次在 5,000 到 10,000 个数据点之间是一个甜点区。

你可以用以下方法简单测试:编写一个脚本,以不同的批次大小(比如1000, 5000, 10000, 20000)写入相同总量的数据,记录耗时。你会发现,在达到某个点后,吞吐量提升会变得不明显甚至下降。

5.2 处理背压与重试策略

在高并发写入时,可能会遇到 429 Too Many Requests 错误,这表示InfluxDB正在施加背压,让你慢一点。一个健壮的写入客户端必须实现指数退避重试策略。

伪代码示例(Python思路):

import time
import requests

def write_with_retry(data_points, url, headers, max_retries=5):
    delay = 1  # 初始延迟1秒
    for attempt in range(max_retries):
        response = requests.post(url, data=data_points, headers=headers)
        if response.status_code == 204:
            return True  # 成功
        elif response.status_code == 429:
            print(f"被限流,第 {attempt+1} 次重试,等待 {delay} 秒...")
            time.sleep(delay)
            delay *= 2  # 指数退避
        else:
            # 其他错误,如400(数据格式错误),可能不需要重试
            print(f"写入失败,错误码:{response.status_code}, 响应:{response.text}")
            return False
    print("达到最大重试次数,写入失败")
    return False

这个策略能在服务暂时过载时,优雅地降低写入速度,避免雪崩。

5.3 解析写入错误响应

写入失败时,InfluxDB会返回一个包含错误信息的JSON响应。学会解读它,能快速定位问题。

常见错误示例:

{
  "code": "invalid",
  "message": "unable to parse 'cpu load=91 123abc': bad timestamp"
}

这个错误很明显,时间戳 123abc 不是有效的数字。

{
  "code": "not found",
  "message": "bucket not found"
}

这表示你指定的存储桶不存在,检查bucket名称或权限。

部分成功的情况: 如果你批量写入10行数据,其中第5行格式错误,InfluxDB默认会整体拒绝这批次数据。如果你希望它接受正确的行,忽略错误的行,可以在写入时添加参数 ?precision=ns&consistency=any(v1 API风格),但更推荐在客户端做好数据校验。

6. 高级查询与性能调优

查得慢?结果不对?这部分我们来解决查询中的疑难杂症。

6.1 控制返回数据量:分块查询

当你查询一个时间范围很长的数据时,返回的结果集可能非常大,导致客户端内存溢出或请求超时。Flux提供了 分块查询 (Chunked Query) 功能。

在Flux查询中,你可以使用 chunkSize 函数来控制每次返回的表大小。

from(bucket: "system_metrics")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "network")
  |> chunkSize(n: 1000) // 每块最多1000行

对于兼容的v1 API,你可以在URL中添加 chunked=true&chunk_size=10000 参数。这样,响应会以流式方式返回多个JSON块,而不是一个巨大的JSON。

6.2 时间戳格式:Epoch与RFC3339

默认情况下,InfluxDB返回RFC3339格式的时间戳(如 2023-10-27T10:01:00.123456Z)。如果你希望返回更容易处理的Unix时间戳(整数),可以在查询时指定 epoch 参数。

使用v1兼容API:

curl -G 'http://localhost:8086/query?db=my_db&epoch=s' \
  --header 'Authorization: Token YOUR_API_TOKEN' \
  --data-urlencode 'q=SELECT * FROM cpu LIMIT 1'

这里 epoch=s 表示返回秒级精度的Unix时间戳。还可以是 ms(毫秒)、us(微秒)、ns(纳秒)。

在Flux中,你需要使用 map 函数手动转换时间列:

from(bucket: "system_metrics")
  |> range(start: -5m)
  |> map(fn: (r) => ({ r with _time: int(v: r._time) / 1000000 })) // 转换为毫秒

6.3 使用子查询与函数进行复杂分析

Flux的函数式特性让它能轻松处理复杂分析。比如,我想计算每个主机在过去一小时内CPU使用率的95分位数,并只显示超过80%的主机:

from(bucket: "system_metrics")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage_user")
  |> group(columns: ["host"])
  |> aggregateWindow(every: 5m, fn: quantile, q: 0.95)
  |> filter(fn: (r) => r._value > 80.0)
  |> yield(name: "high_cpu_hosts")

这个查询做了分组、时间窗口聚合(95分位数)、二次过滤。用InfluxQL写起来会麻烦很多,而Flux的管道操作非常清晰。

6.4 查询性能诊断:explain 与监控

如果你的查询很慢,可以使用 explify() 函数来查看查询的执行计划(需要企业版支持)。更通用的方法是检查查询的耗时和返回的点数。

你可以在查询时添加 profiler 标签来获取一些内部指标(实验性功能)。同时,监控InfluxDB自身的 _internal 存储桶,里面有关于查询执行次数、耗时等丰富的指标,可以帮助你定位慢查询。

一个简单的自查清单:

  1. 时间范围是否过大? 尽量缩小 range。
  2. 是否使用了合适的索引? 确保你的 filter 条件用到了tag(标签),因为tag是索引了的,而field没有。
  3. 聚合窗口是否太小? 对于很长期的数据,先进行大窗口的聚合,再进行小窗口的分析。
  4. 返回的序列是否太多? 过多的唯一tag组合会导致高序列基数,这是InfluxDB的性能杀手。检查你的tag设计,避免使用变化无穷的值(如用户ID、请求ID)作为tag。

7. 实战场景:构建一个物联网数据管道

让我们把这些知识点串起来,模拟一个真实的物联网场景:我们有100个温度传感器,每秒上报一次数据,我们需要实时写入InfluxDB,并提供一个API供前端查询任意传感器最近一小时的温度曲线。

7.1 设计数据模式

  • Measurement: temperature
  • Tags:
    • sensor_id: 传感器唯一标识 (如 sensor-001)。这是高基数字段,但查询必备,适合做tag。
    • location: 传感器位置 (如 building-a/floor-2)。用于按区域聚合。
  • Fields:
    • value: 温度值 (浮点数)
    • battery: 电池电压 (浮点数,可选)
  • Timestamp: 由传感器网关在采集时生成,毫秒精度。

7.2 实现高效写入客户端(Python示例)

我们使用Python的 requests 库,并实现批量写入和重试。

import requests
import time
import random
from queue import Queue
from threading import Thread

class InfluxDBWriter:
    def __init__(self, url, token, org, bucket, batch_size=5000):
        self.url = f"{url}/api/v2/write?org={org}&bucket={bucket}&precision=ms"
        self.headers = {
            'Authorization': f'Token {token}',
            'Content-Type': 'text/plain; charset=utf-8'
        }
        self.batch_size = batch_size
        self._queue = Queue()
        self._buffer = []

    def _send_batch(self, batch_data):
        """发送单个批次,包含指数退避重试"""
        delay = 1
        max_retries = 5
        data_lines = '\n'.join(batch_data)
        
        for i in range(max_retries):
            try:
                resp = requests.post(self.url, data=data_lines, headers=self.headers, timeout=30)
                if resp.status_code == 204:
                    print(f"成功写入 {len(batch_data)} 个数据点")
                    return True
                elif resp.status_code == 429:
                    print(f"写入被限流,等待 {delay} 秒后重试 ({i+1}/{max_retries})")
                    time.sleep(delay)
                    delay *= 2
                else:
                    print(f"写入失败,HTTP {resp.status_code}: {resp.text}")
                    # 可以在这里加入将失败批次存入磁盘的逻辑,后续重放
                    return False
            except requests.exceptions.RequestException as e:
                print(f"网络错误: {e},等待 {delay} 秒后重试")
                time.sleep(delay)
                delay *= 2
        print("重试次数用尽,批次写入失败")
        return False

    def _worker(self):
        """后台工作线程,负责定时或定量刷新缓冲区"""
        while True:
            time.sleep(1)  # 每1秒检查一次
            if not self._buffer:
                continue
            # 复制当前缓冲区并清空,准备发送
            batch_to_send = self._buffer[:]
            self._buffer = []
            if self._send_batch(batch_to_send):
                print("批次发送成功")
            else:
                # 发送失败,可以选择将数据重新放回队列或持久化
                print("批次发送失败,数据已丢失(示例中简单丢弃)")

    def write_point(self, measurement, tags, fields, timestamp_ms):
        """写入一个数据点"""
        # 构建行协议
        tag_str = ','.join([f'{k}={v}' for k, v in tags.items()])
        field_str = ','.join([f'{k}={v}' for k, v in fields.items()])
        line = f"{measurement},{tag_str} {field_str} {timestamp_ms}"
        
        self._buffer.append(line)
        
        # 如果缓冲区达到批次大小,立即触发发送(在实际中,可能由工作线程控制)
        if len(self._buffer) >= self.batch_size:
            batch_to_send = self._buffer[:]
            self._buffer = []
            # 在实际应用中,这里应该将批次提交给工作线程或线程池,避免阻塞
            Thread(target=self._send_batch, args=(batch_to_send,), daemon=True).start()

    def start(self):
        """启动后台工作线程"""
        worker_thread = Thread(target=self._worker, daemon=True)
        worker_thread.start()

# 使用示例
writer = InfluxDBWriter(
    url="http://localhost:8086",
    token="YOUR_TOKEN",
    org="my-org",
    bucket="iot_temperature",
    batch_size=1000
)
writer.start()

# 模拟传感器数据
for i in range(100):
    sensor_id = f"sensor-{i:03d}"
    for _ in range(60):  # 模拟60秒数据
        writer.write_point(
            measurement="temperature",
            tags={"sensor_id": sensor_id, "location": "factory-floor"},
            fields={"value": round(random.uniform(20.0, 30.0), 2), "battery": round(random.uniform(3.6, 4.2), 2)},
            timestamp_ms=int(time.time() * 1000)
        )
        time.sleep(0.01)  # 模拟一点延迟

这个示例提供了一个具备批量写入、错误重试和简单背压处理能力的写入客户端框架。在生产环境中,你可能需要考虑使用更成熟的消息队列(如Kafka)作为缓冲,或者使用专门的InfluxDB客户端库(如 influxdb-client-python),它们已经内置了这些优化。

7.3 提供查询API

为前端提供一个简单的HTTP端点,查询特定传感器最近一小时的数据,并自动下采样到1分钟精度以减少数据量。

使用Flask框架示例:

from flask import Flask, request, jsonify
import influxdb_client
from influxdb_client.client.flux_table import TableList
from influxdb_client.client.query_api import QueryApi

app = Flask(__name__)

# 初始化InfluxDB查询客户端
client = influxdb_client.InfluxDBClient(
    url="http://localhost:8086",
    token="YOUR_TOKEN",
    org="my-org"
)
query_api = client.query_api()

@app.route('/api/sensor/temperature')
def get_sensor_temperature():
    sensor_id = request.args.get('sensor_id')
    if not sensor_id:
        return jsonify({"error": "Missing sensor_id parameter"}), 400
    
    # 构建Flux查询
    flux_query = f'''
    from(bucket: "iot_temperature")
      |> range(start: -1h)
      |> filter(fn: (r) => r._measurement == "temperature")
      |> filter(fn: (r) => r.sensor_id == "{sensor_id}")
      |> filter(fn: (r) => r._field == "value")
      |> aggregateWindow(every: 1m, fn: mean)
      |> yield(name: "temperature")
    '''
    
    try:
        # 执行查询
        result: TableList = query_api.query(flux_query)
        data = []
        for table in result:
            for record in table.records:
                # 将数据转换为前端友好的格式
                data.append({
                    "time": record.get_time().isoformat() + 'Z',
                    "value": record.get_value()
                })
        return jsonify({"sensor_id": sensor_id, "data": data})
    except Exception as e:
        return jsonify({"error": str(e)}), 500

if __name__ == '__main__':
    app.run(debug=True)

这个API端点接收 sensor_id 参数,返回该传感器最近一小时每分钟的平均温度,格式是前端图表库(如ECharts、Chart.js)易于处理的JSON。

通过这个完整的实战案例,你应该能够看到,从数据建模、高效写入到服务端查询API暴露,InfluxDB HTTP API扮演了核心角色。掌握它,你就能自如地驾驭时间序列数据,为你的物联网、监控或分析应用提供坚实的数据底座。记住,关键是多动手实践,遇到问题时,仔细阅读错误信息,善用官方文档和社区资源。

InfluxDB基础操作 一、InfluxDB简介 时序数据库 InfluxDB® 版是一款专门处理高写入和查询负载的时序数据库,用于存储大规模的时序数据并进行实时分析,包括来自DevOps监控、应用指标和IoT传感器上的数据 主要特点: 专为时间序列数据量身订造高性能数据存储。TSM引擎提供数据高速读写和压缩等功能 简单高效的HTTP API写入和查询接口 针对时序数据,量身订造类似SQL的查询语言,轻松查询聚合数据 允许对tag建索引,实现快速有效的查询 数据保留策略(Retention policies)能够有效地使旧数据自 阅读详情

相关推荐

InfluxDB HTTP API实战:5分钟搞定数据写入与查询(附Python代码)

本文提供了通过InfluxDB HTTP API进行数据读写操作的实战指南。文章详细介绍了如何使用Python的requests库,在5分钟内完成从服务健康检查、身份认证到数据写入与查询的全流程,并包含单点写入、批量操作、错误处理及性能优化等核心代码示例,帮助开发者快速构建高效的时间序列数据处理管道。

weixin_28455801的博客 278

InfluxDb系列:几个关键概念(主要是和关系数据库做对比)

https://docs.influxdata.com/influxdb/v0.9/concepts/key_concepts/ #,measurement,就相当于关系数据库中的table,他就是tag,field,time的容器;#,对于influxDb的measurement来说,field是必须的,并且不能根据field来排序;#,Tag是可选的,tag可以用来做索引,tag是以字符串的形...

weixin_34075268的博客 567

PPT| 公司网络安全意识培训 P73

近年来,随着互联网的不断发展,网络安全问题也日益凸显,各种网络安全事件层出不穷,对个人和企业的信息安全带来了巨大的威胁。针对这一现状,国家加强了对信息安全的保护,相继颁布了多项法律法规,其中最重要的就是网络安全法。本文将从网络安全法和其他相关法律入手,对信息安全的保护措施进行深入分析。 本人在四大咨询机构从事咨询工作多年,二十年一线数字化规划咨询经验,提供制造业数智化转型规划服务,顶层规划/企业架构/数据治理/数据安全解决方案资料干货. 该PPT共73页,原文获取及来源公众号:【智能制造数字化咨询】

waldensss的博客 1422

InfluxDB HTTP API实战:5分钟搞定数据写入与查询(Python示例)

本文详细介绍了如何使用InfluxDB HTTP API进行数据写入与查询的Python实战指南。通过行协议与JSON格式对比、基础到高级查询示例,以及错误处理与性能优化技巧,帮助开发者快速掌握时序数据处理。特别适合物联网设备监控、系统指标分析等场景。

julia4scientist的博客 661

拓扑优化背后的科学:ANSYS Workbench中的算法与原理

本文深入解析了ANSYS Workbench中拓扑优化的科学原理与算法实现,重点介绍了密度法(SIMP)和灵敏度分析等核心算法。通过分层架构解析和参数调优实战,展示如何有效进行模型验证与多物理场耦合优化,帮助工程师提升结构设计效率与性能。

weixin_29250403的博客 417

别再花钱买商业软件了!这4款免费DIC工具,从散斑生成到应变分析全搞定

本文介绍了4款免费开源的DIC(数字图像相关技术)工具,涵盖从散斑生成到应变分析的全流程,帮助用户零成本构建专业级DIC工作流。这些工具在精度、算法透明度和生态整合方面具有优势,适用于材料力学和实验力学研究,可替代昂贵的商业软件。

weixin_42525369的博客 169

InfluxDB使用HTTP的API查询数据

仅供学习,转载请注明出处 参考官方开源文档 使用HTTP API查询数据 使用HTTP的API查询数据 HTTP API是在InfluxDB中查询数据的主要方法(有关查询数据库的其他方法,请参阅命令行界面和客户端库)。 注意:以下示例使用curl命令行工具,该工具使用URL传输数据。学习的基础知识curl与HTTP脚本指南。 API查询语句 查询语句如下: curl -G ...

DevOps海洋的渔夫@专栏 2487

基于FPGA进位链的TDC高精度延时链设计与实现

本文详细介绍了基于FPGA进位链的高精度TDC延时链设计与实现方法。通过利用FPGA的CARRY4硬件资源,构建了理论分辨率达13.25ps/级的延时链,并提供了Verilog代码实现、物理布局约束技巧以及温度补偿策略。文章还涵盖了标定方法、数据转换处理和系统验证方案,为激光测距、高能物理等需要精确时间测量的应用提供了实用解决方案。

weixin_28731223的博客 488

InfluxDB HTTP API实战:5分钟搞定数据写入与查询(附Python代码示例)

本文通过Python代码示例,详细讲解了如何使用InfluxDB HTTP API进行时间序列数据的写入与查询。内容涵盖从环境搭建、行协议理解到单点与批量数据写入,以及基础与高级查询操作,帮助开发者快速掌握这一核心接口调用技能,高效处理物联网和监控场景下的时序数据。

yhn456789的博客 891

新建菜单Office被替换为腾讯文档 - 解决方案

右键新建菜单中的Office被替换为腾讯文档。原因是安装了腾讯文档软件,此软件安装时会自动将新建菜单中的Office替换为腾讯文档,下文介绍解决方案。

NSJim的博客 2933

Marvell 88Q6113 如何制作一个完整的量产固件88Q6113_flash.bin并进行烧录

本章节介绍如何基于Marvell工具链,制作一个完整的量产固件88Q6113_flash.bin,集成用户自定义的配置文件 config.bin,用于88Q6113的Flash烧录。注:Marvell 88Q5072 与 Marvell 88Q6113 的配置流程是一样的。

老板来份猪脚拼叉烧的博客 2013

InfluxDB HTTP API 实战指南:从基础查询到高级参数调优

本文详细介绍了InfluxDB HTTP API的使用方法,从基础查询到高级参数调优。通过实战示例讲解如何执行单条和多条查询、时间范围过滤、聚合函数应用,以及数据写入的最佳实践。同时涵盖性能优化技巧和常见问题排查,帮助开发者高效使用InfluxDB处理时间序列数据。

ss78901的博客 555

[Python + UG NX 二次开发新手教程] 第五课 采用Python / UF 开发模式

在 NX 二次开发里看到的“UF”是的缩写,它是 Siemens 提供的集合,也是整个 NX Open 体系里最贴近内核、历史最悠久的一套接口。相当于 NX 的“系统调用”——只要 NX 能做的事,UF 几乎都能调得动。Siemens 从 NX 12 开始把原来的 C 接口(UF)全部打包进了官方 Python 模块,命名空间为 NXOpen.UF.*,所以只要 NX 安装目录里带了 NXOpen\UF 子模块,就能在 Python 里直接调用 UF 函数。

温良 1007

influxdb java api使用_InfluxDB使用HTTP的API查询数据

仅供学习,转载请注明出处参考官方开源文档使用HTTP的API查询数据HTTP API是在InfluxDB中查询数据的主要方法(有关查询数据库的其他方法,请参阅命令行界面和客户端库)。注意:以下示例使用curl命令行工具,该工具使用URL传输数据。学习的基础知识curl与HTTP脚本指南。API查询语句查询语句如下:curl -G 'http://localhost:8086/query?prett...

weixin_32659227的博客 1234

ADS基础教程23 - 有限元电磁仿真(FEM)可视化操作

一、引言 二、FEM可视化操作流程1.打开可视化界面2.查看介质的网格3.设置网格颜色4.选择网格5.传感器选择6.编辑传感器7.选择频率8.动画 三、总结介绍了在ADS中如何进行FEM仿真场视图操作过程。

XZ_ZC的博客 1816

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

InfluxDB 写入&查询 Qt工程(C++ 客户端 API)

InfluxDB 读写 Qt工程(C++ API) - 写入数据 - 查询数据 - 支持的协议仅包括基于认证的HTTP/HTTPS协议

士杰的博客 4839

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

InfluxDB学习之InfluxDB的HTTP API写入操作

HTTP API也有两种操作:写入和查询,本文就先给大家介绍一下 InfluxDB的HTTP API的写入操作方式。 在InfluxDB学习的上一篇文章:InfluxDB学习之InfluxDB的基本操作中,我们提到 InfluxDB操作有三种方式,其中一种是HTTP API的方式。 HTTP API也有两种操作:写入和查询,本文就先给大家介绍一下 InfluxDB...

djaksj8721的博客 333

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

InfluxDB学习之InfluxDB的HTTP API查询操作

在 InfluxDB学习 的上一篇文章:InfluxDB学习之InfluxDB的HTTP API写入操作中,我们介绍了使用InfluxDB的HTTP API进行数据写入操作的过程,本文我们再来介绍下使用InfluxDB的HTTP API进行数据查询操作的过程。更多InfluxDB详细教程请看:InfluxDB系列学习教程目录 InfluxDB技术交流群:580487672(点击加入)...

djaksj8721的博客 586

Java 数据 15:InfluxDB 时序数据写入(Java 客户端实战)

本文介绍了如何使用Java客户端向InfluxDB时序数据库写入数据。主要内容包括:InfluxDB的基本概念与数据模型(Measurement、Tags、Fields、Timestamp);通过Docker快速搭建InfluxDB环境;Java客户端的版本选择(推荐2.x版本);使用WriteApi进行同步和异步批量写入的代码示例;以及数据精度、批处理配置等关键参数说明。文章提供了从基础写入到生产级批量处理的完整实现方案,帮助开发者高效地将时间序列数据存储到InfluxDB中。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

influxdb-client-go 快速上手:5 分钟写出第一个 InfluxDB 数据写入与查询程序

influxdb-client-go 是 InfluxDB 2.x 的官方 Go 客户端库,它让你可以用 Go 语言轻松完成时序数据的写入与查询。本文是一份 influxdb-client-go 快速上手指南,面向零基础新手,5 分钟即可写出第一个可运行的 InfluxDB 数据写入与查询程序,全程无需复杂配置。 ## 什么是 influxdb-client-go?🚀 InfluxDB 是目

gitblog_00347的博客 640

03-InfluxDB 安装与实操:库、表、数据写入与查询

《InfluxDB安装与基础操作指南》摘要: 本文介绍了InfluxDB的安装部署和基础操作。使用Docker可快速部署InfluxDB 2.7版本,通过环境变量配置初始化参数。安装完成后,需要创建Bucket(数据存储容器)和API Token(访问凭证)。数据写入支持三种方式:HTTP API(通用性强)、CLI(适合测试)和Python客户端(生产推荐)。其中Python方式支持同步/异步写入,异步批量写入可获得最高吞吐量。文章包含详细的命令示例和参数说明,特别强调生产环境应使用批量写入而非单条循环写

爱片闲串,爱钓鱼,爱中医,爱分享 179

InfluxDB 与 HTTP 协议交互进阶(一)

复杂查询条件的 HTTP API 构建,分页查询与流式响应处理,错误码解析与异常处理,基于 Token 的 API 认证机制强化。

1082

influxdb写入mysql_InfluxDB学习之InfluxDB的HTTP API写入操作

HTTP API也有两种操作:写入和查询,本文就先给大家介绍一下 InfluxDB的HTTP API的写入操作方式。在InfluxDB学习的上一篇文章:InfluxDB学习之InfluxDB的基本操作中,我们提到 InfluxDB操作有三种方式,其中一种是HTTP API的方式。HTTP API也有两种操作:写入和查询,本文就先给大家介绍一下 InfluxDB的HTTP API的写入操作方式。更...

weixin_42501904的博客 290

influxDB HTTP API使用

influxDB HTTP API使用 数据库操作 # 创建数据库 curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE mydb" # 查看数据库 curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=my...

落叶下的光 1万+
上一篇: ESXI 7.0 激活码大全:最新可用序列号一键获取(2023年亲测有效)
下一篇: 闲置树莓派3B变身家庭影音库:OMV+Samba+WebDAV实战配置
python9snake
博客等级 码龄1天 0粉丝 1724原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值