InfluxDB HTTP API 接口調用詳解(二)

實際應用案例演示

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;那么無論從…