【轉】prometheus數據寫入TDengine


 

原文: https://www.taosdata.com/cn/documentation/insert#prometheus

--------------------------------------------

 

高效寫入數據

TDengine支持多種接口寫入數據,包括SQL, Prometheus, Telegraf, EMQ MQTT Broker, HiveMQ Broker, CSV文件等,后續還將提供Kafka, OPC等接口。數據可以單條插入,也可以批量插入,可以插入一個數據采集點的數據,也可以同時插入多個數據采集點的數據。支持多線程插入,支持時間亂序數據插入,也支持歷史數據插入。

SQL寫入

應用通過C/C++, JDBC, GO, 或Python Connector 執行SQL insert語句來插入數據,用戶還可以通過TAOS Shell,手動輸入SQL insert語句插入數據。比如下面這條insert 就將一條記錄寫入到表d1001中:

  1. INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31);

TDengine支持一次寫入多條記錄,比如下面這條命令就將兩條記錄寫入到表d1001中:

  1. INSERT INTO d1001 VALUES (1538548684000, 10.2, 220, 0.23) (1538548696650, 10.3, 218, 0.25);

TDengine也支持一次向多個表寫入數據,比如下面這條命令就向d1001寫入兩條記錄,向d1002寫入一條記錄:

  1. INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31) (1538548695000, 12.6, 218, 0.33) d1002 VALUES (1538548696800, 12.3, 221, 0.31);

詳細的SQL INSERT語法規則請見 TAOS SQL 的數據寫入 章節。

Tips:

  • 要提高寫入效率,需要批量寫入。一批寫入的記錄條數越多,插入效率就越高。但一條記錄不能超過16K,一條SQL語句總長度不能超過64K(可通過參數maxSQLLength配置,最大可配置為1M)。
  • TDengine支持多線程同時寫入,要進一步提高寫入速度,一個客戶端需要打開20個以上的線程同時寫。但線程數達到一定數量后,無法再提高,甚至還會下降,因為線程切頻繁切換,帶來額外開銷。
  • 對同一張表,如果新插入記錄的時間戳已經存在,默認(沒有使用 UPDATE 1 創建數據庫)新記錄將被直接拋棄,也就是說,在一張表里,時間戳必須是唯一的。如果應用自動生成記錄,很有可能生成的時間戳是一樣的,這樣,成功插入的記錄條數會小於應用插入的記錄條數。如果在創建數據庫時使用 UPDATE 1 選項,插入相同時間戳的新記錄將覆蓋原有記錄。
  • 寫入的數據的時間戳必須大於當前時間減去配置參數keep的時間。如果keep配置為3650天,那么無法寫入比3650天還老的數據。寫入數據的時間戳也不能大於當前時間加配置參數days。如果days配置為2,那么無法寫入比當前時間還晚2天的數據。

Prometheus直接寫入

Prometheus作為Cloud Native Computing Fundation畢業的項目,在性能監控以及K8S性能監控領域有着非常廣泛的應用。TDengine提供一個小工具Bailongma,只需在Prometheus做簡單配置,無需任何代碼,就可將Prometheus采集的數據直接寫入TDengine,並按規則在TDengine自動創建庫和相關表項。博文用Docker容器快速搭建一個Devops監控Demo即是采用bailongma將Prometheus和Telegraf的數據寫入TDengine中的示例,可以參考。

從源代碼編譯blm_prometheus

用戶需要從github下載Bailongma的源碼,使用Golang語言編譯器編譯生成可執行文件。在開始編譯前,需要准備好以下條件:

  • Linux操作系統的服務器
  • 安裝好Golang, 1.10版本以上
  • 對應的TDengine版本。因為用到了TDengine的客戶端動態鏈接庫,因此需要安裝好和服務端相同版本的TDengine程序;比如服務端版本是TDengine 2.0.0, 則在bailongma所在的linux服務器(可以與TDengine在同一台服務器,或者不同服務器)

Bailongma項目中有一個文件夾blm_prometheus,存放了prometheus的寫入API程序。編譯過程如下:

  1. cd blm_prometheus
  2. go build

一切正常的情況下,就會在對應的目錄下生成一個blm_prometheus的可執行程序。

安裝Prometheus

通過Prometheus的官網下載安裝。下載地址

配置Prometheus

參考Prometheus的配置文檔,在Prometheus的配置文件中的<remote_write>部分,增加以下配置

  • url: bailongma API服務提供的URL, 參考下面的blm_prometheus啟動示例章節

啟動Prometheus后,可以通過taos客戶端查詢確認數據是否成功寫入。

啟動blm_prometheus程序

blm_prometheus程序有以下選項,在啟動blm_prometheus程序時可以通過設定這些選項來設定blm_prometheus的配置。

  1. --tdengine-name
  2. 如果TDengine安裝在一台具備域名的服務器上,也可以通過配置TDengine的域名來訪問TDengine。在K8S環境下,可以配置成TDengine所運行的service name
  3. --batch-size
  4. blm_prometheus會將收到的prometheus的數據拼裝成TDengine的寫入請求,這個參數控制一次發給TDengine的寫入請求中攜帶的數據條數。
  5. --dbname
  6. 設置在TDengine中創建的數據庫名稱,blm_prometheus會自動在TDengine中創建一個以dbname為名稱的數據庫,缺省值是prometheus
  7. --dbuser
  8. 設置訪問TDengine的用戶名,缺省值是'root'
  9. --dbpassword
  10. 設置訪問TDengine的密碼,缺省值是'taosdata'
  11. --port
  12. blm_prometheusprometheus提供服務的端口號。

啟動示例

通過以下命令啟動一個blm_prometheus的API服務

  1. ./blm_prometheus -port 8088

假設blm_prometheus所在服務器的IP地址為"10.1.2.3",則在prometheus的配置文件中<remote_write>部分增加url為

  1. remote_write:
  2. - url: "http://10.1.2.3:8088/receive"

查詢prometheus寫入數據

prometheus產生的數據格式如下:

  1. {
  2. Timestamp: 1576466279341,
  3. Value: 37.000000,
  4. apiserver_request_latencies_bucket {
  5. component="apiserver",
  6. instance="192.168.99.116:8443",
  7. job="kubernetes-apiservers",
  8. le="125000",
  9. resource="persistentvolumes", s
  10. cope="cluster",
  11. verb="LIST",
  12. version=“v1"
  13. }
  14. }

其中,apiserver_request_latencies_bucket為prometheus采集的時序數據的名稱,后面{}中的為該時序數據的標簽。blm_prometheus會以時序數據的名稱在TDengine中自動創建一個超級表,並將{}中的標簽轉換成TDengine的tag值,Timestamp作為時間戳,value作為該時序數據的值。因此在TDengine的客戶端中,可以通過以下指令查到這個數據是否成功寫入。

  1. use prometheus;
  2. select * from apiserver_request_latencies_bucket;

Telegraf直接寫入

Telegraf是一流行的IT運維數據采集開源工具,TDengine提供一個小工具Bailongma,只需在Telegraf做簡單配置,無需任何代碼,就可將Telegraf采集的數據直接寫入TDengine,並按規則在TDengine自動創建庫和相關表項。博文用Docker容器快速搭建一個Devops監控Demo即是采用bailongma將Prometheus和Telegraf的數據寫入TDengine中的示例,可以參考。

從源代碼編譯blm_telegraf

用戶需要從github下載Bailongma的源碼,使用Golang語言編譯器編譯生成可執行文件。在開始編譯前,需要准備好以下條件:

  • Linux操作系統的服務器
  • 安裝好Golang, 1.10版本以上
  • 對應的TDengine版本。因為用到了TDengine的客戶端動態鏈接庫,因此需要安裝好和服務端相同版本的TDengine程序;比如服務端版本是TDengine 2.0.0, 則在bailongma所在的linux服務器(可以與TDengine在同一台服務器,或者不同服務器)

Bailongma項目中有一個文件夾blm_telegraf,存放了Telegraf的寫入API程序。編譯過程如下:

  1. cd blm_telegraf
  2. go build

一切正常的情況下,就會在對應的目錄下生成一個blm_telegraf的可執行程序。

安裝Telegraf

目前TDengine支持Telegraf 1.7.4以上的版本。用戶可以根據當前的操作系統,到Telegraf官網下載安裝包,並執行安裝。下載地址如下:https://portal.influxdata.com/downloads

配置Telegraf

修改Telegraf配置文件/etc/telegraf/telegraf.conf中與TDengine有關的配置項。

在output plugins部分,增加[[outputs.http]]配置項:

  • url: bailongma API服務提供的URL, 參考下面的啟動示例章節
  • data_format: "json"
  • json_timestamp_units: "1ms"

在agent部分:

  • hostname: 區分不同采集設備的機器名稱,需確保其唯一性
  • metric_batch_size: 100,允許Telegraf每批次寫入記錄最大數量,增大其數量可以降低Telegraf的請求發送頻率。

關於如何使用Telegraf采集數據以及更多有關使用Telegraf的信息,請參考Telegraf官方的文檔

啟動blm_telegraf程序

blm_telegraf程序有以下選項,在啟動blm_telegraf程序時可以通過設定這些選項來設定blm_telegraf的配置。

  1. --host
  2. TDengine服務端的IP地址,缺省值為空
  3. --batch-size
  4. blm_telegraf會將收到的telegraf的數據拼裝成TDengine的寫入請求,這個參數控制一次發給TDengine的寫入請求中攜帶的數據條數。
  5. --dbname
  6. 設置在TDengine中創建的數據庫名稱,blm_telegraf會自動在TDengine中創建一個以dbname為名稱的數據庫,缺省值是prometheus
  7. --dbuser
  8. 設置訪問TDengine的用戶名,缺省值是'root'
  9. --dbpassword
  10. 設置訪問TDengine的密碼,缺省值是'taosdata'
  11. --port
  12. blm_telegraftelegraf提供服務的端口號。

啟動示例

通過以下命令啟動一個blm_telegraf的API服務

  1. ./blm_telegraf -host 127.0.0.1 -port 8089

假設blm_telegraf所在服務器的IP地址為"10.1.2.3",則在telegraf的配置文件中, 在output plugins部分,增加[[outputs.http]]配置項:

  1. url = "http://10.1.2.3:8089/telegraf"

查詢telegraf寫入數據

telegraf產生的數據格式如下:

  1. {
  2. "fields": {
  3. "usage_guest": 0,
  4. "usage_guest_nice": 0,
  5. "usage_idle": 89.7897897897898,
  6. "usage_iowait": 0,
  7. "usage_irq": 0,
  8. "usage_nice": 0,
  9. "usage_softirq": 0,
  10. "usage_steal": 0,
  11. "usage_system": 5.405405405405405,
  12. "usage_user": 4.804804804804805
  13. },
  14. "name": "cpu",
  15. "tags": {
  16. "cpu": "cpu2",
  17. "host": "bogon"
  18. },
  19. "timestamp": 1576464360
  20. }

其中,name字段為telegraf采集的時序數據的名稱,tags字段為該時序數據的標簽。blm_telegraf會以時序數據的名稱在TDengine中自動創建一個超級表,並將tags字段中的標簽轉換成TDengine的tag值,Timestamp作為時間戳,fields字段中的值作為該時序數據的值。因此在TDengine的客戶端中,可以通過以下指令查到這個數據是否成功寫入。

  1. use telegraf;
  2. select * from cpu;

MQTT是一流行的物聯網數據傳輸協議,TDengine 可以很方便的接入 MQTT Broker 接受的數據並寫入到 TDengine。

EMQ Broker 直接寫入

EMQ是一開源的MQTT Broker軟件,無需任何代碼,只需要在EMQ Dashboard里使用“規則”做簡單配置,即可將MQTT的數據直接寫入TDengine。EMQ X 支持通過 發送到 Web 服務 的方式保存數據到 TDengine,也在企業版上提供原生的 TDengine 驅動實現直接保存。詳細使用方法請參考EMQ 官方文檔

HiveMQ Broker 直接寫入

HiveMQ 是一個提供免費個人版和企業版的 MQTT 代理,主要用於企業和新興的機器到機器M2M通訊和內部傳輸,滿足可伸縮性、易管理和安全特性。HiveMQ 提供了開源的插件開發包。可以通過 HiveMQ extension - TDengine 保存數據到 TDengine。詳細使用方法請參考 HiveMQ extension - TDengine 說明文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM