实际应用案例演示

1. 数据写入案例

假设在一个物联网设备数据采集场景中,有多个传感器设备持续采集环境的温度和湿度数据。我们以 Python 语言为例,使用requests库来调用 InfluxDB 的 Write 接口将数据写入 InfluxDB。

首先,确保已经安装了requests库,如果没有安装,可以使用以下命令进行安装:

 

pip install requests

接下来,编写 Python 代码模拟设备数据的生成和写入:

 

import requests

import random

import time

# InfluxDB服务器地址和端口

url = 'http://localhost:8086/write?db=mydb&precision=s'

# API Token,替换为实际的Token

headers = {

'Authorization': 'Token <your_token>'

}

# 模拟设备数据生成和写入

while True:

sensor_id = f'Sensor_{random.randint(1, 10)}'

temperature = round(random.uniform(20, 30), 2)

humidity = round(random.uniform(40, 60), 2)

timestamp = int(time.time())

data = f'environment_data,sensor_id={sensor_id} temperature={temperature},humidity={humidity} {timestamp}'

response = requests.post(url, headers=headers, data=data)

if response.status_code == 204:

print(f'Data written successfully: {data}')

else:

print(f'Failed to write data. Status code: {response.status_code}, Response: {response.text}')

# 模拟设备每5秒采集一次数据

time.sleep(5)

在上述代码中,我们通过while True循环不断模拟设备数据的生成。每次生成一个随机的传感器 ID,以及随机的温度和湿度值,并获取当前的时间戳作为数据的时间标记。然后,按照 InfluxDB 的行协议格式构建数据字符串,通过requests.post方法将数据发送到 InfluxDB 的 Write 接口。如果写入成功,会打印成功信息;如果失败,则会打印失败的状态码和响应内容。同时,通过time.sleep(5)使程序每 5 秒生成并写入一次数据,模拟实际设备的数据采集频率。

如果使用 curl 命令来实现同样的数据写入,可以参考以下命令:

 

while true; do

sensor_id="Sensor_$(shuf -i 1-10 -n 1)"

temperature=$(echo "scale=2; 20 + $RANDOM % 1000 / 100.0" | bc)

humidity=$(echo "scale=2; 40 + $RANDOM % 2000 / 100.0" | bc)

timestamp=$(date +%s)

data="environment_data,sensor_id=$sensor_id temperature=$temperature,humidity=$humidity $timestamp"

curl -i -XPOST 'http://localhost:8086/write?db=mydb&precision=s' \

-H "Authorization: Token <your_token>" \

--data-binary "$data"

sleep 5

done

这个 curl 命令脚本同样是在一个无限循环中,每次循环生成随机的传感器 ID、温度、湿度和时间戳,构建数据字符串后,使用 curl 命令发送 POST 请求将数据写入 InfluxDB,并且每 5 秒执行一次循环。

2. 数据查询案例

基于上述写入的数据,我们提出一些查询需求,并展示如何使用 Query 接口实现这些查询。

假设我们要查询过去一小时内所有传感器的平均温度和平均湿度,可以使用以下 InfluxQL 查询语句:

 

SELECT mean("temperature"), mean("humidity") FROM "environment_data" WHERE time >= now() - 1h

使用 Python 的requests库执行这个查询的代码如下:

 

import requests

# InfluxDB服务器地址和端口

url = 'http://localhost:8086/query?db=mydb'

# API Token,替换为实际的Token

headers = {

'Authorization': 'Token <your_token>'

}

# 查询语句

query = 'SELECT mean("temperature"), mean("humidity") FROM "environment_data" WHERE time >= now() - 1h'

params = {'q': query}

response = requests.get(url, headers=headers, params=params)

if response.status_code == 200:

data = response.json()

print('Query results:')

for result in data.get('results', []):

for series in result.get('series', []):

print(series)

else:

print(f'Failed to query data. Status code: {response.status_code}, Response: {response.text}')

在这段代码中,我们构建了查询的 URL,设置了请求头和查询参数,然后使用requests.get方法发送 GET 请求执行查询。如果查询成功,将解析返回的 JSON 数据并打印查询结果;如果失败,打印失败信息。

使用 curl 命令执行这个查询如下:

 

curl -G 'http://localhost:8086/query?db=mydb' \

-H "Authorization: Token <your_token>" \

--data-urlencode "q=SELECT mean('temperature'), mean('humidity') FROM 'environment_data' WHERE time >= now() - 1h"

假设查询结果如下:

 

{

"results": [

{

"statement_id": 0,

"series": [

{

"name": "environment_data",

"columns": ["time", "mean(temperature)", "mean(humidity)"],

"values": [

["2024-10-10T12:00:00Z", 25.5, 50.2]

]

}

]

}

]

}

这表示在过去一小时内,所有传感器的平均温度为 25.5,平均湿度为 50.2。

再比如,我们要查询特定传感器(如 Sensor_5)在昨天的温度数据,可以使用以下查询语句:

 

SELECT "temperature" FROM "environment_data" WHERE "sensor_id" = 'Sensor_5' AND time >= now() - 1d AND time < now() - 1d + 1h

使用 Python 执行这个查询的代码与上述类似,只需修改查询语句即可:

 

import requests

# InfluxDB服务器地址和端口

url = 'http://localhost:8086/query?db=mydb'

# API Token,替换为实际的Token

headers = {

'Authorization': 'Token <your_token>'

}

# 查询语句

query = 'SELECT "temperature" FROM "environment_data" WHERE "sensor_id" = \'Sensor_5\' AND time >= now() - 1d AND time < now() - 1d + 1h'

params = {'q': query}

response = requests.get(url, headers=headers, params=params)

if response.status_code == 200:

data = response.json()

print('Query results:')

for result in data.get('results', []):

for series in result.get('series', []):

print(series)

else:

print(f'Failed to query data. Status code: {response.status_code}, Response: {response.text}')

使用 curl 命令执行这个查询如下:

 

curl -G 'http://localhost:8086/query?db=mydb' \

-H "Authorization: Token <your_token>" \

--data-urlencode "q=SELECT 'temperature' FROM 'environment_data' WHERE'sensor_id' = 'Sensor_5' AND time >= now() - 1d AND time < now() - 1d + 1h"

通过这些实际应用案例,我们可以更直观地了解 InfluxDB HTTP API 接口在数据写入和查询方面的实际操作和应用 。

常见问题及解决方法

1. 授权问题

在使用 InfluxDB HTTP API 时,授权问题是较为常见的。当出现授权失败的情况时,通常有以下几种表现。一是 Token 无效,这可能是因为 Token 生成过程中出现错误,或者 Token 已经过期。在 InfluxDB 2.0 及以上版本中,API Token 用于身份验证,如果 Token 无效,服务器将拒绝请求。例如,在使用 Python 的requests库调用 API 时,如果 Token 错误:

 

import requests

url = 'http://localhost:8086/query?db=mydb'

headers = {

'Authorization': 'Token invalid_token'

}

query = 'SELECT mean("value") FROM "temperature"'

params = {'q': query}

response = requests.get(url, headers=headers, params=params)

print(response.status_code)

此时,返回的状态码可能是 401 Unauthorized,表示身份验证失败。

另一种情况是未携带 Token,有些开发者可能在请求中遗漏了添加 Token 这一关键步骤,导致服务器无法识别请求的身份。例如使用 curl 命令时忘记添加 Token:

 

curl -G 'http://localhost:8086/query?db=mydb' --data-urlencode 'q=SELECT mean("value") FROM "temperature"'

这种情况下,同样会返回 401 Unauthorized 状态码。

解决办法方面,如果是 Token 无效,首先要确认 Token 的生成过程是否正确,比如在 InfluxDB Web 界面生成 Token 时是否正确选择了权限范围。如果 Token 过期,需要重新生成 Token。可以在 InfluxDB 的 Web 界面中,再次点击 “Generate Token” 按钮,按照提示生成新的 Token。

对于未携带 Token 的问题,要仔细检查请求的代码或命令,确保在请求头中正确添加了 Token。在 Python 中,像上面示例那样,将正确的 Token 添加到Authorization头中;在使用 curl 时,使用-H参数添加 Token,如curl -H "Authorization: Token <your_token>" -G 'http://localhost:8086/query?db=mydb' --data-urlencode 'q=SELECT mean("value") FROM "temperature"' 。

2. 数据格式问题

数据格式不符合要求是导致写入失败的常见原因之一。在 InfluxDB 中,支持行协议和 JSON 格式的数据写入,但如果数据格式错误,就无法成功写入。

常见的行协议格式错误包括语法错误,例如标签或字段的名称不符合规范,或者时间戳格式不正确。行协议中,标签和字段名称必须是合法的标识符,不能包含特殊字符(除了下划线等特定字符)。时间戳必须是纳秒精度的整数(如果未指定其他精度)。例如,以下是一个错误的行协议数据示例:

 

temperature,sensor id=S1 value=25.5 1630424257000000000

这里,sensor id包含了空格,不符合标签名称的规范,正确的应该是sensor_id。

JSON 格式错误可能表现为 JSON 结构不完整或字段类型错误。在 JSON 格式中,必须包含measurement(测量值名称)、fields(字段数据)等必要字段,并且字段值的类型要符合要求。例如,以下是一个错误的 JSON 格式数据示例:

 

[{"measurement": "temperature", "fields": {"value": "25.5abc"}}]

这里,value字段的值应该是数值类型,而不是包含字母的字符串,这会导致写入失败。

检查和修正数据格式的方法,对于行协议,可以仔细检查数据的语法,确保标签和字段名称符合规范,时间戳格式正确。可以使用一些文本编辑器的语法检查功能,或者参考 InfluxDB 官方文档中的行协议规范进行逐一核对。对于 JSON 格式,可以使用在线 JSON 校验工具,如 JSONLint(JSON Online Validator and Formatter - JSON Lint ),将数据粘贴到工具中进行校验,工具会指出格式错误的位置和原因,然后根据提示进行修正 。

3. 网络连接问题

网络连接不稳定或中断是导致 InfluxDB HTTP API 接口调用失败的一个重要因素。当网络出现问题时,可能会出现请求超时、连接被拒绝等错误。

在排查网络问题时,可以首先检查网络配置,确认本地网络连接是否正常,网络设置是否正确。例如,检查网络接口是否正常工作,IP 地址和子网掩码是否配置正确。在 Linux 系统中,可以使用ifconfig命令查看网络接口状态,如ifconfig eth0(假设网卡名为 eth0),查看是否有异常信息。

使用 ping 命令测试连接也是一种常用的方法,通过 ping InfluxDB 服务器的 IP 地址或主机名,可以判断网络是否可达。例如,ping 192.168.1.100(假设 InfluxDB 服务器 IP 为 192.168.1.100),如果 ping 不通,可能是网络线路故障、路由器配置问题或服务器未正常运行。

解决建议方面,如果是网络不稳定,可以考虑优化网络,如检查网络线路是否有损坏、更换网络设备等。在代码中,可以设置合理的超时时间,避免因长时间等待响应而导致程序无响应。在使用 Python 的requests库时,可以设置timeout参数,例如:

 

import requests

url = 'http://localhost:8086/query?db=mydb'

headers = {

'Authorization': 'Token <your_token>'

}

query = 'SELECT mean("value") FROM "temperature"'

params = {'q': query}

try:

response = requests.get(url, headers=headers, params=params, timeout=5)

print(response.status_code)

except requests.exceptions.Timeout:

print('Request timed out')

这里设置了超时时间为 5 秒,如果在 5 秒内未收到服务器响应,将抛出Timeout异常 。

总结与展望

InfluxDB 的 HTTP API 接口为我们提供了一种便捷、灵活的方式来与 InfluxDB 进行交互,实现时间序列数据的高效管理和分析。通过本文的介绍,我们深入了解了 InfluxDB HTTP API 的基础概念、常用接口的调用方法,包括 Ping 接口用于检查服务状态、Query 接口进行数据查询和资源管理、Write 接口实现数据写入,同时通过实际应用案例演示了如何在物联网数据采集场景中进行数据的写入和查询操作 。

在实际应用过程中,我们也遇到并解决了一些常见问题,如授权问题、数据格式问题和网络连接问题等。通过正确生成和使用 API Token 解决授权问题,依据 InfluxDB 的数据格式规范仔细检查和修正数据格式,以及优化网络配置并在代码中合理设置超时时间来解决网络连接问题,这些经验将有助于我们在后续的项目中更加顺畅地使用 InfluxDB HTTP API。

展望未来,随着物联网、大数据等技术的不断发展,时间序列数据的规模和复杂性将持续增长,InfluxDB 在时间序列数据处理领域有望发挥更为重要的作用。其 HTTP API 也可能会不断演进和完善,支持更多的功能和更高效的数据处理方式,以满足日益增长的业务需求。

希望读者通过本文的学习,能够熟练掌握 InfluxDB HTTP API 的使用方法,并将其应用到实际项目中。在实践过程中,不断探索和创新,充分挖掘 InfluxDB 在时间序列数据处理方面的潜力,为解决实际业务问题提供有力支持。如果在使用过程中遇到任何问题,欢迎在评论区留言交流,让我们共同进步 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90675.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90675.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/90675.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

世运会线上知识竞赛答题pk小程序怎么做

随着2025年成都世界运动会的来临&#xff0c;越来越多的企事业单位组织员工进行线上知识竞赛&#xff0c;那么答题PK小程序该怎么做&#xff0c;接下来我们来一一分析&#xff1a; 世运会线上知识竞赛答题pk小程序怎么做一、答题功能&#xff1a;支持多种题型&#xff0c;如选择…

Java毕业设计 | 基于微信小程序的家校互动作业管理系统(Spring Boot+Vue.js+uni-app+AI,附源码+文档)

Java毕业设计 | 基于微信小程序的家校互动作业管理系统&#xff08;Spring BootVue.jsuni-app&#xff0c;附源码文档&#xff09;&#x1f3af; 毕业设计私人教练 专注计算机毕设辅导第 6 年&#xff0c;累计 1v1 带飞 800 同学顺利通关。从选题、开题、代码、论文到答辩&…

CentOS8 使用 Docker 搭建 Jellyfin 家庭影音服务器

CentOS8 使用 Docker 搭建 Jellyfin 家庭影音服务器 一、前言 由于 Jellyfin 的 GPL 协议和 Intel 的 media-driver (iHD) Linux 驱动&#xff08;部分开源&#xff09;在协议上不兼容的缘故&#xff0c;Jellyfin 官方的 Docker 镜像&#xff1a;jellyfin/jellyfin 并不包含 …

PyTorch武侠演义 第一卷:初入江湖 第4章:损失玉佩的评分风波

第一卷&#xff1a;初入江湖 第4章&#xff1a;损失玉佩的评分风波比武开幕 晨钟响彻山谷&#xff0c;PyTorch派三年一度的"模型比武大会"正式开始。各分舵弟子列队入场&#xff0c;林小码跟在Tensor大师身后&#xff0c;眼睛瞪得溜圆——只见&#xff1a; "卷积…

HttpServletRequestWrapper存储Request

HTTP请求的输入流只能被读取一次&#xff0c;再想获取就获取不到了&#xff0c;那有什么方法可以缓存呢&#xff0c;我们可以自定义一个HttpServletRequest&#xff0c;或者是想在请求参数中统一添加或删除参数也可以使用此类进行改造&#xff0c;然后通过过滤器继续向下流转。…

算法:数组part02: 209. 长度最小的子数组 + 59.螺旋矩阵II + 代码随想录补充58.区间和 + 44. 开发商购买土地

算法&#xff1a;数组part02: 209. 长度最小的子数组 59.螺旋矩阵II 代码随想录补充58.区间和 44. 开发商购买土地 209. 长度最小的子数组题目&#xff1a;https://leetcode.cn/problems/minimum-size-subarray-sum/description/ 文章讲解&#xff1a;https://programmercarl…

Spring 核心知识点梳理 1

目录 Spring Spring是什么&#xff1f; Spring中重要的模块 Spring中最重要的就是IOC(控制反转)和AOP(面向切面编程) 什么是IOC DI和IOC之间的区别 为什么要使用IOC呢&#xff1f; IOC的实现机制 什么是AOP Aop的核心概念 AOP的环绕方式 AOP发生的时期 AOP和OOP的…

Kafka运维实战 07 - kafka 三节点集群部署(混合模式)(KRaft 版本3.7.0)

目录环境准备主机准备补充说明JDK安装 (三台主机分别执行)下载jdkjdk安装kafka 部署(三台主机分别执行)kafka 下载kafka 版本号结构解析kafka 安装下载和解压安装包(3台主机都执行)配置 server.properties &#xff08;KRaft 模式&#xff09;192.168.37.10192.168.37.11192.16…

linux内核与GNU之间的联系和区别

要理解操作系统&#xff08;如 GNU/Linux&#xff09;的组成&#xff0c;需要明确 内核&#xff08;Kernel&#xff09; 和 GNU 工具链 各自的功能&#xff0c;以及它们如何协作构成完整的操作系统。以下是详细分析&#xff1a;1. 内核&#xff08;Kernel&#xff09;的功能 内…

文件包含学习总结

目录 漏洞简介 漏洞原理 漏洞分类 漏洞防御 漏洞简介 程序开发人员一般会把重复使用的函数写到单个文件中&#xff0c;需要使用某个函数时直接调用此文件&#xff0c;而无需再次编写&#xff0c;这种文件调用的过程一般被称为文件包含。程序开发人员一般希望代码更灵活&…

TQZC706开发板教程:创建PCIE项目

本例程基于zc706开发板&#xff0c;使用xdma核创建PCIE项目&#xff0c;最终实现插入主机可识别出Xilinx设备。在vivado中创建一个空的706项目。创建完成后添加IP核-->搜索xdma-->双击打开配置。添加XDMA核如下所示basic配置peic id中设置设备号等信息&#xff0c;这里保…

科技赋能景区生.态,负氧离子气象监测站筑牢清新防线

负氧离子气象监测站&#xff0c;如同景区空气质量的坚固防线&#xff0c;默默守护着每一寸土地的清新。​它以精准的监测能力为防线基石。借助 “吸入式电容收集法”&#xff0c;能敏锐捕捉空气中负氧离子的踪迹&#xff0c;精准测量其浓度&#xff0c;同时将温度、湿度、PM2.5…

AMD官网下载失败,不让账户登录下载

别使用163邮箱 使用QQ邮箱&#xff0c;然后用GPT生成一个外国&#xff0c;比如日本的地区信息填上去就可以下载了

Elasticsearch-8.17.0 centos7安装

下载链接 https://www.elastic.co/downloads/past-releases/elasticsearch-8-17-0 https://www.elastic.co/downloads/past-releases/logstash-8-17-0 https://www.elastic.co/cn/downloads/past-releases/kibana-8-17-0https://artifacts.elastic.co/downloads/elasticsearch/…

windows下SAS9.4软件下载与安装教程

SAS 9.4是SAS公司推出的一款功能强大的统计分析软件&#xff0c;广泛应用于数据分析、商业智能、预测分析、数据挖掘及统计建模等多个领域。数据处理与管理能力&#xff1a;SAS 9.4支持多种数据格式的导入导出&#xff0c;包括JSON、XML等&#xff0c;便于处理来自Web和API的数…

MyBatis-Plus极速开发指南

MyBatis-Plus简介MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;简化开发&#xff0c;提高效率。它提供了以下主要特性&#xff1a;无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响强大的 …

Django接口自动化平台实现(五)

8. 测试用例执行 预期效果如下&#xff1a;用例执行逻辑如下&#xff1a;前端提交用例 id 列表到后台&#xff0c;后台获取每一条用例的信息&#xff1b;后台获取域名信息、用例 id 列表&#xff1b;对用例的请求数据进行变量的参数化、函数化等预处理操作&#xff1b;根据先后…

一个没有手动加分号引发的bug

最近因为分号的疏忽&#xff0c;导致出现了一个bug&#xff0c;记录下来&#xff0c;分享给大家。 1、一个示例 给你下面这一段代码&#xff0c;你根据经验判断一下运营结果 let [a,b] [a,b] let [x,y] [1,2] if(x < y){[x,y] [y,x][a,b] [b,a] }按照一般的理解&#xf…

Elasticsearch安全审计日志设置与最佳实践

一、Elasticsearch安全审计简介 审计日志&#xff08;Audit Logging&#xff09;用于记录Elasticsearch中的安全相关事件&#xff0c;包括认证失败、连接拒绝、数据访问事件以及通过API对安全配置&#xff08;如用户、角色、API密钥&#xff09;的变更记录。 注意&#xff1a;审…

算法训练营day29 贪心算法③ 134. 加油站、135. 分发糖果 、860.柠檬水找零、406.根据身高重建队列

贪心算法的第三篇博客&#xff0c;继续脑筋风暴&#xff01; 134. 加油站 写在前面 这道题规定了有解的话&#xff0c;必定为唯一解 贪心思路 直接从全局进行贪心选择&#xff0c;情况如下&#xff1a; 情况一&#xff1a;如果gas的总和小于cost总和&#xff0c;那么无论从…