diff --git a/docs/examples/java/src/main/java/com/taos/example/WSConnectExample.java b/docs/examples/java/src/main/java/com/taos/example/WSConnectExample.java index d683cc64a6..21f184b45a 100644 --- a/docs/examples/java/src/main/java/com/taos/example/WSConnectExample.java +++ b/docs/examples/java/src/main/java/com/taos/example/WSConnectExample.java @@ -8,31 +8,33 @@ import java.sql.SQLException; import java.util.Properties; public class WSConnectExample { -// ANCHOR: main -public static void main(String[] args) throws SQLException { - // use - // String jdbcUrl = "jdbc:TAOS-RS://localhost:6041/dbName?user=root&password=taosdata"; - // if you want to connect a specified database named "dbName". - String jdbcUrl = "jdbc:TAOS-RS://localhost:6041?user=root&password=taosdata"; - Properties connProps = new Properties(); - connProps.setProperty(TSDBDriver.PROPERTY_KEY_BATCH_LOAD, "true"); - connProps.setProperty(TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT, "true"); - connProps.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8"); - connProps.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8"); + // ANCHOR: main + public static void main(String[] args) throws SQLException { + // use + // String jdbcUrl = + // "jdbc:TAOS-RS://localhost:6041/dbName?user=root&password=taosdata&batchfetch=true"; + // if you want to connect a specified database named "dbName". + String jdbcUrl = "jdbc:TAOS-RS://localhost:6041?user=root&password=taosdata&batchfetch=true"; + Properties connProps = new Properties(); + connProps.setProperty(TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT, "true"); + connProps.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8"); + connProps.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8"); - try (Connection conn = DriverManager.getConnection(jdbcUrl, connProps)){ - System.out.println("Connected to " + jdbcUrl + " successfully."); + try (Connection conn = DriverManager.getConnection(jdbcUrl, connProps)) { + System.out.println("Connected to " + jdbcUrl + " successfully."); - // you can use the connection for execute SQL here + // you can use the connection for execute SQL here - } catch (SQLException ex) { - // handle any errors, please refer to the JDBC specifications for detailed exceptions info - System.out.println("Failed to connect to " + jdbcUrl + "; ErrCode:" + ex.getErrorCode() + "; ErrMessage: " + ex.getMessage()); - throw ex; - } catch (Exception ex){ - System.out.println("Failed to connect to " + jdbcUrl + "; ErrMessage: " + ex.getMessage()); - throw ex; + } catch (SQLException ex) { + // handle any errors, please refer to the JDBC specifications for detailed + // exceptions info + System.out.println("Failed to connect to " + jdbcUrl + "; ErrCode:" + ex.getErrorCode() + "; ErrMessage: " + + ex.getMessage()); + throw ex; + } catch (Exception ex) { + System.out.println("Failed to connect to " + jdbcUrl + "; ErrMessage: " + ex.getMessage()); + throw ex; + } } -} -// ANCHOR_END: main + // ANCHOR_END: main } diff --git a/docs/zh/08-develop/01-connect/index.md b/docs/zh/08-develop/01-connect/index.md index 8932e7fb2e..fdde4aea2e 100644 --- a/docs/zh/08-develop/01-connect/index.md +++ b/docs/zh/08-develop/01-connect/index.md @@ -259,17 +259,19 @@ dotnet add package TDengine.Connector ## 建立连接 在执行这一步之前,请确保有一个正在运行的,且可以访问到的 TDengine,而且服务端的 FQDN 配置正确。以下示例代码,都假设 TDengine 安装在本机,且 FQDN(默认 localhost) 和 serverPort(默认 6030) 都使用默认配置。 + ### 连接参数 连接的配置项较多,因此在建立连接之前,我们能先介绍一下各语言连接器建立连接使用的参数。 + Java 连接器建立连接的参数有 URL 和 Properties。 + TDengine 的 JDBC URL 规范格式为: + `jdbc:[TAOS|TAOS-RS]://[host_name]:[port]/[database_name]?[user={user}|&password={password}|&charset={charset}|&cfgdir={config_dir}|&locale={locale}|&timezone={timezone}|&batchfetch={batchfetch}]` -Java 连接器建立连接的参数有 URL 和 Properties。 -TDengine 的 JDBC URL 规范格式为: -`jdbc:[TAOS|TAOS-RS]://[host_name]:[port]/[database_name]?[user={user}|&password={password}|&charset={charset}|&cfgdir={config_dir}|&locale={locale}|&timezone={timezone}]` + URL 和 Properties 的详细参数说明和如何使用详见 [url 规范](../../reference/connector/java/#url-规范) -URL 和 Properties 的详细参数说明和如何使用详见 [url 规范](../../reference/connector/java/#url-规范) + **注**:REST 连接中增加 `batchfetch` 参数并设置为 true,将开启 WebSocket 连接。 @@ -343,7 +345,7 @@ DSN 的详细说明和如何使用详见 [连接功能](../../reference/connecto - **database**: 数据库名称。 - **params**: 其他参数。 例如token。 - - 完整 D 示例: + - 完整 DSN 示例: ```js ws://root:taosdata@localhost:6041 diff --git a/docs/zh/08-develop/02-sql.md b/docs/zh/08-develop/02-sql.md index 18d1072ce9..3cad007078 100644 --- a/docs/zh/08-develop/02-sql.md +++ b/docs/zh/08-develop/02-sql.md @@ -90,7 +90,7 @@ curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql/power' \ -> **注意**:如果不使用 `USE power` 指定数据库,则后续对表的操作都需要增加数据库名称作为前缀,如 `power.meters`。 +> **注意**:建议采用 `.` 的格式构造SQL语句,不推荐在应用中采用 `USE DBName` 方式访问。 ## 插入数据 下面以智能电表为例,展示如何使用连接器执行 SQL 来插入数据到 `power` 数据库的 `meters` 超级表。样例使用 TDengine 自动建表 SQL 语法,写入 d1001 子表中 3 条数据,写入 d1002 子表中 1 条数据,然后打印出实际插入数据条数。 diff --git a/docs/zh/08-develop/04-schemaless.md b/docs/zh/08-develop/04-schemaless.md index 2c5279f1d6..1bc750c3cb 100644 --- a/docs/zh/08-develop/04-schemaless.md +++ b/docs/zh/08-develop/04-schemaless.md @@ -169,7 +169,7 @@ st,t1=3,t2=4,t3=t3 c1=3i64,c6="passit" 1626006833640000000 ``` -执行带有 reqId 的无模式写入,此 reqId 可用于请求链路追踪。 +执行带有 reqId 的无模式写入,最后一个参数 reqId 可用于请求链路追踪。 ```java writer.write(lineDemo, SchemalessProtocolType.LINE, SchemalessTimestampType.NANO_SECONDS, 1L); @@ -213,7 +213,7 @@ writer.write(lineDemo, SchemalessProtocolType.LINE, SchemalessTimestampType.NANO {{#include examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/SchemalessJniTest.java:schemaless}} ``` -执行带有 reqId 的无模式写入,此 reqId 可用于请求链路追踪。 +执行带有 reqId 的无模式写入,最后一个参数 reqId 可用于请求链路追踪。 ```java writer.write(lineDemo, SchemalessProtocolType.LINE, SchemalessTimestampType.NANO_SECONDS, 1L); diff --git a/docs/zh/14-reference/01-components/12-tdinsight/index.mdx b/docs/zh/14-reference/01-components/12-tdinsight/index.mdx index 224fd5908d..34a06e13c4 100644 --- a/docs/zh/14-reference/01-components/12-tdinsight/index.mdx +++ b/docs/zh/14-reference/01-components/12-tdinsight/index.mdx @@ -17,6 +17,12 @@ TDengine 通过 taosKeeper 将服务器的 CPU、内存、硬盘空间、带宽 - TDengine 已经安装并正常运行,此仪表盘需要 TDengine 3.0.0.0 及以上,并开启监控上报配置,具体配置请参考:[TDengine 监控配置](../taosd/#监控相关)。 - taosAdapter 已经安装并正常运行。具体细节请参考:[taosAdapter 参考手册](../taosadapter) - taosKeeper 已安装并正常运行。具体细节请参考:[taosKeeper 参考手册](../taoskeeper) +- Grafana 服务已安装并正常运行。我们建议您使用最新的 Grafana 版本,TDInsight 支持 Grafana 7.5 及以上版本。 + :::info + + 下文介绍中,都以 Grafana v11.0.0 版本为例,其他版本功能可能有差异,请参考 [Grafana 官网](https://grafana.com/docs/grafana/latest/)。 + + ::: 然后记录以下信息: @@ -24,22 +30,11 @@ TDengine 通过 taosKeeper 将服务器的 CPU、内存、硬盘空间、带宽 - taosAdapter 集群认证信息,可使用用户名及密码。 - taosKeeper 记录监控指标的数据库名称。 -## 安装和启动 Grafana -我们建议您使用最新的 Grafana 版本,TDInsight 支持 Grafana 7.5 及以上版本。您可以在任何[支持的操作系统](https://grafana.com/docs/grafana/latest/installation/requirements/#supported-operating-systems)中,按照 [Grafana 官方文档安装说明](https://grafana.com/docs/grafana/latest/installation/) 安装 Grafana。 -安装后请参考 [启动 Grafana](https://grafana.com/docs/grafana/latest/setup-grafana/start-restart-grafana/) 启动 Grafana 服务。 - -安装完成后就可以在 Web 浏览器中打开 Grafana 网址,默认是:`http://localhost:3000`。 默认用户名/密码都是 `admin`。Grafana 会要求在首次登录后更改密码。 - -:::info - -下文介绍中,都以 Grafana v11.0.0 版本为例,其他版本功能可能有差异,请参考 [Grafana 官网](https://grafana.com/docs/grafana/latest/)。 - -::: ## 安装 TDengine 数据源插件 -TDInsight 支持图形界面安装、手动安装和脚本安装三种安装方式,一般建议图形界面安装。对于 Grafana 8.5 以下版本可以使用手动安装和脚本安装方式。 +TDengine 数据源插件支持图形界面安装、手动安装和脚本安装三种安装方式,一般建议图形界面安装。对于 Grafana 8.5 以下版本可以使用手动安装和脚本安装方式。 @@ -108,13 +103,13 @@ chmod +x TDinsight.sh 点击 `Save & Test` 进行测试,成功会提示:`TDengine Data source is working`。 -## 导入 TDengine V3 仪表盘 +## 导入 TDinsightV3 仪表盘 在配置 TDengine 数据源界面,点击 “Dashboards” tab,再点击 ”import” 导入 ”TDengine for 3.x” 仪表盘。 导入成功后可以进入这个 dashboard,在左上角 ”Log from“ 选项中选择 taosKeeper 中设置的记录监控指标的数据库就可以看到监控结果。 -## TDengine V3 仪表盘详情 +## TDinsightV3 仪表盘详情 TDinsight 仪表盘旨在提供 TDengine 相关资源的使用情况和状态,比如 dnodes、 mnodes、 vnodes 和数据库等。 主要分为集群状态、DNodes 概述、MNode 概述、请求、数据库、DNode 资源使用情况和 taosAdapter 监控信息。下面我们分别详细介绍。 diff --git a/docs/zh/14-reference/05-connector/14-java.mdx b/docs/zh/14-reference/05-connector/14-java.mdx index 8d19745668..0dc85feb13 100644 --- a/docs/zh/14-reference/05-connector/14-java.mdx +++ b/docs/zh/14-reference/05-connector/14-java.mdx @@ -199,7 +199,7 @@ Websocket 和 REST 连接使用驱动类 `com.taosdata.jdbc.rs.RestfulDriver`。 #### URL 规范 TDengine 的 JDBC URL 规范格式为: -`jdbc:[TAOS|TAOS-RS]://[host_name]:[port]/[database_name]?[user={user}|&password={password}|&charset={charset}|&cfgdir={config_dir}|&locale={locale}|&timezone={timezone}]` +`jdbc:[TAOS|TAOS-RS]://[host_name]:[port]/[database_name]?[user={user}|&password={password}|&charset={charset}|&cfgdir={config_dir}|&locale={locale}|&timezone={timezone}|&batchfetch={batchfetch}]` 对于建立连接,原生连接与 REST 连接有细微不同。 Websocket 和 REST 连接使用驱动类 `com.taosdata.jdbc.rs.RestfulDriver`。原生连接使用驱动类 `com.taosdata.jdbc.TSDBDriver`。 diff --git a/docs/zh/14-reference/05-connector/index.md b/docs/zh/14-reference/05-connector/index.md index 1c051bf163..5c58a4e7bc 100644 --- a/docs/zh/14-reference/05-connector/index.md +++ b/docs/zh/14-reference/05-connector/index.md @@ -28,14 +28,14 @@ TDengine 提供了丰富的应用程序开发接口,为了便于用户快速 TDengine 版本更新往往会增加新的功能特性,列表中的连接器版本为连接器最佳适配版本。 -| **TDengine 版本** | **Java** | **Python** | **Go** | **C#** | **Node.js** | **Rust** | -| ---------------------- | ------------- | ------------------------------------------- | ------------ | ------------- | --------------- | -------- | -| **3.3.0.0 及以上** | 3.3.2.0及以上 | taospy 2.7.15及以上,taos-ws-py 0.3.2及以上 | 3.5.5及以上 | 3.1.3及以上 | 3.1.0及以上 | 当前版本 | -| **3.0.0.0 及以上** | 3.0.2以上 | 当前版本 | 3.0 分支 | 3.0.0 | 3.1.0 | 当前版本 | -| **2.4.0.14 及以上** | 2.0.38 | 当前版本 | develop 分支 | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | 当前版本 | -| **2.4.0.4 - 2.4.0.13** | 2.0.37 | 当前版本 | develop 分支 | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | 当前版本 | -| **2.2.x.x ** | 2.0.36 | 当前版本 | master 分支 | n/a | 2.0.7 - 2.0.9 | 当前版本 | -| **2.0.x.x ** | 2.0.34 | 当前版本 | master 分支 | n/a | 2.0.1 - 2.0.6 | 当前版本 | +| **TDengine 版本** | **Java** | **Python** | **Go** | **C#** | **Node.js** | **Rust** | +| ---------------------- | ----------- | ------------------------------------------- | ------------ | ------------- | --------------- | -------- | +| **3.3.0.0 及以上** | 3.3.0及以上 | taospy 2.7.15及以上,taos-ws-py 0.3.2及以上 | 3.5.5及以上 | 3.1.3及以上 | 3.1.0及以上 | 当前版本 | +| **3.0.0.0 及以上** | 3.0.2以上 | 当前版本 | 3.0 分支 | 3.0.0 | 3.1.0 | 当前版本 | +| **2.4.0.14 及以上** | 2.0.38 | 当前版本 | develop 分支 | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | 当前版本 | +| **2.4.0.4 - 2.4.0.13** | 2.0.37 | 当前版本 | develop 分支 | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | 当前版本 | +| **2.2.x.x ** | 2.0.36 | 当前版本 | master 分支 | n/a | 2.0.7 - 2.0.9 | 当前版本 | +| **2.0.x.x ** | 2.0.34 | 当前版本 | master 分支 | n/a | 2.0.1 - 2.0.6 | 当前版本 | ## 功能特性 @@ -43,31 +43,36 @@ TDengine 版本更新往往会增加新的功能特性,列表中的连接器 ### 使用原生接口(taosc) -| **功能特性** | **Java** | **Python** | **Go** | **C#** | **Node.js** | **Rust** | -| ------------------- | -------- | ---------- | ------ | ------ | ----------- | -------- | -| **连接管理** | 支持 | 支持 | 支持 | 支持 | 不支持 | 支持 | -| **普通查询** | 支持 | 支持 | 支持 | 支持 | 不支持 | 支持 | -| **参数绑定** | 支持 | 支持 | 支持 | 支持 | 不支持 | 支持 | -| **数据订阅(TMQ)** | 支持 | 支持 | 支持 | 支持 | 不支持 | 支持 | -| **Schemaless** | 支持 | 支持 | 支持 | 支持 | 不支持 | 支持 | +| **功能特性** | **Java** | **Python** | **Go** | **C#** | **Rust** | +| ------------------- | -------- | ---------- | ------ | ------ | -------- | +| **连接管理** | 支持 | 支持 | 支持 | 支持 | 支持 | +| **普通查询** | 支持 | 支持 | 支持 | 支持 | 支持 | +| **参数绑定** | 支持 | 支持 | 支持 | 支持 | 支持 | +| **数据订阅(TMQ)** | 支持 | 支持 | 支持 | 支持 | 支持 | +| **Schemaless** | 支持 | 支持 | 支持 | 支持 | 支持 | :::info 由于不同编程语言数据库框架规范不同,并不意味着所有 C/C++ 接口都需要对应封装支持。 ::: -### 使用 http (REST 或 WebSocket) 接口 +### 使用 http REST 接口 -| **功能特性** | **Java** | **Python** | **Go** | **C#** | **Node.js** | **Rust** | -| ------------------------------ | -------- | ---------- | ------ | ------ | ----------- | -------- | -| **连接管理** | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | -| **普通查询** | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | -| **参数绑定** | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | -| **数据订阅(TMQ)** | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | -| **Schemaless** | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | -| **批量拉取(基于 WebSocket)** | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | +| **功能特性** | **Java** | **Python** | **Go** | **C#** | +| ------------ | -------- | ---------- | ------ | ------ | +| **连接管理** | 支持 | 支持 | 支持 | 支持 | +| **普通查询** | 支持 | 支持 | 支持 | 支持 | + +### 使用 Websocket 接口 + +| **功能特性** | **Java** | **Python** | **Go** | **C#** | **Node.js** | **Rust** | +| ------------------- | -------- | ---------- | ------ | ------ | ----------- | -------- | +| **连接管理** | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | +| **普通查询** | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | +| **参数绑定** | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | +| **数据订阅(TMQ)** | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | +| **Schemaless** | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | :::warning - - 无论选用何种编程语言的连接器,2.0 及以上版本的 TDengine 推荐数据库应用的每个线程都建立一个独立的连接,或基于线程建立连接池,以避免连接内的“USE statement”状态量在线程之间相互干扰(但连接的查询和写入操作都是线程安全的)。 ::: diff --git a/docs/zh/20-third-party/03-visual/01-grafana.mdx b/docs/zh/20-third-party/03-visual/01-grafana.mdx index 9d12e1db04..93f0cf6eaa 100644 --- a/docs/zh/20-third-party/03-visual/01-grafana.mdx +++ b/docs/zh/20-third-party/03-visual/01-grafana.mdx @@ -7,13 +7,18 @@ toc_max_heading_level: 4 import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; -TDengine 能够与开源数据可视化系统 [Grafana](https://www.grafana.com/) 快速集成搭建数据监测报警系统,整个过程无需任何代码开发,TDengine 中数据表的内容可以在仪表盘(DashBoard)上进行可视化展现。关于 TDengine 插件的使用您可以在 [GitHub](https://github.com/taosdata/grafanaplugin/blob/master/README.md) 中了解更多。 +## 概述 +本文档介绍如何将 TDengine 数据源与开源数据可视化系统 [Grafana](https://www.grafana.com/) 集成,以实现数据的可视化和监测报警系统的搭建。通过 TDengine 插件,您可以轻松地将 TDengine 数据表的数据展示在 Grafana 仪表盘上,且无需进行复杂的开发工作。 + +## Grafana 版本要求 +当前 TDengine 支持 Grafana 7.5 及以上版本,建议使用最新版本。请根据您的系统环境下载并安装对应版本的 Grafana。 + ## 前置条件 要让 Grafana 能正常添加 TDengine 数据源,需要以下几方面的准备工作。 -- Grafana 服务已经部署并正常运行。目前 TDengine 支持 Grafana 7.5 以上的版本。用户可以根据当前的操作系统,到 Grafana 官网下载安装包,并执行安装。下载地址如下:[https://grafana.com/grafana/download](https://grafana.com/grafana/download) 。 +- Grafana 服务已经部署并正常运行。 :::info **注意**:要确保启动 Grafana 的账号有其安装目录的写权限,否则可能后面无法安装插件。 @@ -22,8 +27,6 @@ TDengine 能够与开源数据可视化系统 [Grafana](https://www.grafana.com/ - TDengine 集群已经部署并正常运行。 - taosAdapter 已经安装并正常运行。具体细节请参考 [taosAdapter 的使用手册](../../../reference/components/taosadapter) - - 记录以下信息: - TDengine 集群 REST API 地址,如:`http://tdengine.local:6041`。 @@ -173,14 +176,22 @@ docker run -d \ - :::info 下文介绍中,都以 Grafana v11.0.0 版本为例,其他版本功能可能有差异,请参考 [Grafana 官网](https://grafana.com/docs/grafana/latest/)。 ::: -## 内置变量和自定义变量 +## Dashboard 使用指南 + +本节内容按如下方式组织: +1. 介绍基础知识,包括 Grafana 的内置变量和自定义变量,TDengine 对与时序查询的特色语法支持。 +2. 介绍如何使用 TDengine 数据源在 Grafana 中创建 Dashboard,然后给出使用时序查询的特色语法和如何分组展示数据。 +3. 由于配置的 Dashbord 在页面显示时会定时查询 TDengine 来刷新显示,如果 SQL 编写不当会导致严重的性能问题,我们给出了性能优化建议。 +4. 最后我们以 TDengine 监控面板 TDinsight 为例介绍了如何导入我们提供的 DashBoard。 + +### Grafana 内置变量和自定义变量 + Grafana 中的 Variable(变量)功能非常强大,可以在 Dashboard 的查询、面板标题、标签等地方使用,用来创建更加动态和交互式的 Dashbord,提高用户体验和效率。 变量的主要作用和特点包括: @@ -191,26 +202,30 @@ Grafana 中的 Variable(变量)功能非常强大,可以在 Dashboard 的 - 灵活的配置选项:变量提供了多种配置选项,如预定义的静态值列表、从数据源动态查询值、正则表达式过滤等,使得变量的应用更加灵活和强大。 - Grafana 提供了内置变量和自定义变量,它们都可以可以在编写 SQL 时引用,引用的方式是 `$variableName`,`variableName` 是变量的名字,其他引用方式请参考 [引用方式](https://grafana.com/docs/grafana/latest/dashboards/variables/variable-syntax/)。 -### 内置变量 +#### 内置变量 + Grafana 内置了 `from`、`to` 和 `interval` 等变量,都取自于 Grafana 插件面板。其含义如下: - `from` 查询范围的起始时间 - `to` 查询范围的结束时间 - `interval` 窗口切分间隔 -对于每个查询都建议设置查询范围的起始时间和结束时间,可以有效的减少 TDengine 服务端执行查询扫描的数据量。`interval` 是窗口切分的大小,在 Grafana 11 版本中,其大小为时间间隔和返回点数计算而得。 +对于每个查询都建议设置查询范围的起始时间和结束时间,可以有效的减少 TDengine 服务端执行查询扫描的数据量。`interval` 是窗口切分的大小,在 Grafana 11 版本中,其大小为时间间隔和返回点数计算而得。 + 除了上述三个常用变量,Grafana 还提供了如 `__timezone`, `__org`, `__user` 等变量,详情请参考 [内置变量](https://grafana.com/docs/grafana/latest/dashboards/variables/add-template-variables/#global-variables)。 -### 自定义变量 +#### 自定义变量 + 我们可以在 Dashbord 中增加自定义变量。自定义变量和内置变量的使用方式没有区别,都是在 SQL 中用 `$variableName` 进行引用。 自定义变量支持多种类型,常见的类型包括 `Query`(查询)、`Constant`(常量)、`Interval`(间隔)、`Data source`(数据源)等。 自定义变量可以引用其他自定义变量,比如一个变量表示区域,另一个变量可以引用区域的值,来查询这个区域的设备。 -#### 添加查询类型变量 + +##### 添加查询类型变量 + 在 Dashbord 的配置中,选择 【Variables】,然后点击 【New variable】: -1. 在 “Name“ 字段中,输入你的变量名,此处我们设置变量名为 `selected_groups`。 -2. 在 【Select variable type】下拉菜单中,选择 ”Query“(查询)。 +1. 在 “Name” 字段中,输入你的变量名,此处我们设置变量名为 `selected_groups`。 +2. 在 【Select variable type】下拉菜单中,选择 “Query”(查询)。 根据选择的变量类型,配置相应的选项。例如,如果选择了 “Query” 类型,你需要指定数据源和用于获取变量值的查询语句。此处我们还以智能电表为例,设置查询类型,选择数据源后,配置 SQL 为 `select distinct(groupid) from power.meters where groupid < 3 and ts > $from and ts < $to;` 3. 点击底部的【Run Query】后,可以在 “Preview of values”(值预览)部分,查看到根据你的配置生成的变量值。 4. 还有其他配置不再赘述,完成配置后,点击页面底部的【Apply】(应用)按钮,然后点击右上角的【Save dashboard】保存。 @@ -219,9 +234,10 @@ Grafana 内置了 `from`、`to` 和 `interval` 等变量,都取自于 Grafana 我们还可以再新增自定义变量来引用这个 `selected_groups` 变量,比如我们新增一个名为 `tbname_max_current` 的查询变量,其 SQL 为 `select tbname from power.meters where groupid = $selected_groups and ts > $from and ts < $to;` -#### 添加间隔类型变量 +##### 添加间隔类型变量 + 我们可以自定义时间窗口间隔,可以更加贴合业务需求。 -1. 在 “Name“ 字段中,输入变量名为 `interval`。 +1. 在 “Name” 字段中,输入变量名为 `interval`。 2. 在 【Select variable type】下拉菜单中,选择 “Interval”(间隔)。 3. 在 【Interval options】选项中输入 `1s,2s,5s,10s,15s,30s,1m`。 4. 还有其他配置不再赘述,完成配置后,点击页面底部的【Apply】(应用)按钮,然后点击右上角的【Save dashboard】保存。 @@ -234,7 +250,8 @@ Grafana 内置了 `from`、`to` 和 `interval` 等变量,都取自于 Grafana ::: -## TDengine 时间序列查询支持 +### TDengine 时序查询支持 + TDengine 在支持标准 SQL 的基础之上,还提供了一系列满足时序业务场景需求的特色查询语法,这些语法能够为时序场景的应用的开发带来极大的便利。 - `partition by` 子句可以按一定的维度对数据进行切分,然后在切分出的数据空间内再进行一系列的计算。绝大多数情况可以替代 `group by`。 - `interval` 子句用于产生相等时间周期的窗口 @@ -243,19 +260,21 @@ TDengine 在支持标准 SQL 的基础之上,还提供了一系列满足时序 上述特性详细介绍可以参考 [特色查询](../../../reference/taos-sql/distinguished/)。 -## 创建 Dashboard +### 创建 Dashboard -回到主界面创建 Dashboard,点击【Add Query】进入面板查询页面: +有了前面的基础知识,我们可以配置基于 TDengine 数据源的时间序列数据展示 Dashbord。 +在 Grafana 主界面创建 Dashboard,点击【Add Query】进入面板查询页面: ![TDengine Database Grafana plugin create dashboard](./create_dashboard1.webp) -如上图所示,在 ”Query“ 中选中 `TDengine` 数据源,在下方查询框可输入相应 SQL 进行查询。 我们继续用智能电表来举例,为了展示曲线美观,此处**用了虚拟数据**。 +如上图所示,在 “Query” 中选中 `TDengine` 数据源,在下方查询框可输入相应 SQL 进行查询。 我们继续用智能电表来举例,为了展示曲线美观,此处**用了虚拟数据**。 + +#### 时间序列数据展示 -## 时间序列数据展示 假设我们想查询一段时间内的平均电流大小,时间窗口按 `$interval` 切分,若某一时间窗口区间数据缺失,填充 null。 -- “INPUT SQL“:输入要查询的语句(该 SQL 语句的结果集应为两列多行),此处输入:`select _wstart as ts, avg(current) as current from power.meters where groupid in ($selected_groups) and ts > $from and ts < $to interval($interval) fill(null)` ,其中,from、to 和 interval 为 Grafana 内置变量,selected_groups 为自定义变量。 -- “ALIAS BY“:可设置当前查询别名。 -- “GENERATE SQL“: 点击该按钮会自动替换相应变量,并生成最终执行的语句。 +- “INPUT SQL”:输入要查询的语句(该 SQL 语句的结果集应为两列多行),此处输入:`select _wstart as ts, avg(current) as current from power.meters where groupid in ($selected_groups) and ts > $from and ts < $to interval($interval) fill(null)` ,其中,from、to 和 interval 为 Grafana 内置变量,selected_groups 为自定义变量。 +- “ALIAS BY”:可设置当前查询别名。 +- “GENERATE SQL”: 点击该按钮会自动替换相应变量,并生成最终执行的语句。 在顶部的自定义变量中,若选择 `selected_groups` 的值为 1,则查询 `meters` 超级表中 `groupid` 为 1 的所有设备电流平均值变化如下图: @@ -267,11 +286,12 @@ TDengine 在支持标准 SQL 的基础之上,还提供了一系列满足时序 ::: -## 时间序列数据分组展示 +#### 时间序列数据分组展示 + 假设我们想查询一段时间内的平均电流大小,按 `groupid` 分组展示,我们可以修改之前的 SQL 为 `select _wstart as ts, groupid, avg(current) as current from power.meters where ts > $from and ts < $to partition by groupid interval($interval) fill(null)` -- “Group by column(s)“: **半角**逗号分隔的 `group by` 或 `partition by` 列名。如果是 `group by` 或 `partition by` 查询语句,设置 “Group by“ 列,可以展示多维数据。此处设置 “Group by“ 列名为 `groupid`,可以按 `groupid` 分组展示数据。 -- “Group By Format“: `Group by` 或 `Partition by` 场景下多维数据 legend 格式化格式。例如上述 INPUT SQL,将 “Group By Format“ 设置为 `groupid-{{groupid}}`,展示的 legend 名字为格式化的分组名。 +- “Group by column(s)”: **半角**逗号分隔的 `group by` 或 `partition by` 列名。如果是 `group by` 或 `partition by` 查询语句,设置 “Group by” 列,可以展示多维数据。此处设置 “Group by” 列名为 `groupid`,可以按 `groupid` 分组展示数据。 +- “Group By Format”: `Group by` 或 `Partition by` 场景下多维数据 legend 格式化格式。例如上述 INPUT SQL,将 “Group By Format” 设置为 `groupid-{{groupid}}`,展示的 legend 名字为格式化的分组名。 完成设置后,按照 `groupid` 分组展示如下图: @@ -279,12 +299,12 @@ TDengine 在支持标准 SQL 的基础之上,还提供了一系列满足时序 > 关于如何使用 Grafana 创建相应的监测界面以及更多有关使用 Grafana 的信息,请参考 Grafana 官方的[文档](https://grafana.com/docs/)。 -## 性能建议 +### 性能优化建议 + - **所有查询加上时间范围**,在时序数据库中,如果不加查询的时间范围,会扫表导致性能低下。常见的 SQL 写法是 `select column_name from db.table where ts > $from and ts < $to;` - 对于最新状态类型的查询,我们一般建议在**创建数据库的时候打开缓存**(`CACHEMODEL` 设置为 last_row 或者 both),常见的 SQL 写法是 `select last(column_name) from db.table where ts > $from and ts < $to;` - -## 导入 Dashboard +### 导入 Dashboard 在数据源配置页面,您可以为该数据源导入 TDinsight 面板,作为 TDengine 集群的监控可视化工具。如果 TDengine 服务端为 3.0 版本请选择 `TDinsight for 3.x` 导入。注意 TDinsight for 3.x 需要运行和配置 taoskeeper。 @@ -299,30 +319,36 @@ TDengine 在支持标准 SQL 的基础之上,还提供了一系列满足时序 - [15167](https://grafana.com/grafana/dashboards/15167): TDinsight - [16388](https://grafana.com/grafana/dashboards/16388): Telegraf 采集节点信息的数据展示 -## 告警配置简介 -### 告警配置流程 +## 告警配置 + TDengine Grafana 插件支持告警,如果要配置告警,需要以下几个步骤: -1. 配置联络点(“Contact points“):配置通知渠道,包括 DingDing、Email、Slack、WebHook、Prometheus Alertmanager 等 -2. 配置告警通知策略(“Notification policies“):配置告警发送到哪个通道的路由,以及发送通知的时间和重复频率 -3. 配置 “Alert rules“:配置详细的告警规则 +1. 配置联络点(“Contact points”):配置通知渠道,包括 DingDing、Email、Slack、WebHook、Prometheus Alertmanager 等 +2. 配置告警通知策略(“Notification policies”):配置告警发送到哪个通道的路由,以及发送通知的时间和重复频率 +3. 配置告警规则(“Alert rules”):配置详细的告警规则 3.1 配置告警名称 - 3.2 配置查询及告警触发条件 + 3.2 配置查询和告警触发条件 3.3 配置规则评估策略 3.4 配置标签和告警通道 3.5 配置通知文案 -### 告警配置界面 -在Grafana 11 告警界面一共有 6 个 Tab,分别是 “Alert rules“、“Contact points“、“Notification policies“、“Silences“、 “Groups“ 和 “Settings“。 -- “Alert rules“ 告警规则列表,用于展示和配置告警规则 -- “Contact points“ 通知渠道,包括 DingDing、Email、Slack、WebHook、Prometheus Alertmanager 等 -- “Notification policies“ 配置告警发送到哪个通道的路由,以及发送通知的时间和重复频率 -- “Silences“ 配置告警静默时间段 -- “Groups“ 告警组,配置的告警触发后会在这里分组显示 -- “Settings“ 提供通过 JSON 方式修改告警配置 +### 告警配置界面介绍 + +在Grafana 11 告警界面一共有 6 个 Tab,分别是 “Alert rules”、“Contact points”、“Notification policies”、“Silences”、 “Groups” 和 “Settings”。 +- “Alert rules” 告警规则列表,用于展示和配置告警规则 +- “Contact points” 通知渠道,包括 DingDing、Email、Slack、WebHook、Prometheus Alertmanager 等 +- “Notification policies” 配置告警发送到哪个通道的路由,以及发送通知的时间和重复频率 +- “Silences” 配置告警静默时间段 +- “Groups” 告警组,配置的告警触发后会在这里分组显示 +- “Settings” 提供通过 JSON 方式修改告警配置 + +### 配置联络点 + +本节以邮件和飞书为例配置联络点。 + +#### 配置邮件联络点 + +在 Grafana 服务的配置文件中添加 SMTP/Emailing 和 Alerting 模块。(以 Linux 系统为例,其配置文件一般位于 `/etc/grafana/grafana.ini`) -## 配置邮件联络点 -### Grafana Server 配置文件修改 -在 Grafana 服务的配置文件中添加 SMTP/Emailing 和 Alerting 模块,以 Linux 系统为例,其配置文件一般位于 `/etc/grafana/grafana.ini` 在配置文件中增加下面内容: ```ini @@ -336,106 +362,110 @@ skip_verify = true from_address = sender@foxmail.com ``` -然后重启 Grafana 服务即可, 以 Linux 系统为例,执行 `systemctl restart grafana-server.service` +然后重启 Grafana 服务(以 Linux 系统为例,执行 `systemctl restart grafana-server.service`)即可添加完成 -### Grafana 页面创建新联络点 - -在 Grafana 页面找到 “Home“ -> “Alerting“ -> “Contact points“,创建新联络点 -”Name“: Email Contact Point -“Integration“:选择联络类型,这里选择 Email,填写邮件接收地址,完成后保存联络点 +在 Grafana 页面找到 “Home” -> “Alerting” -> “Contact points”,创建新联络点 +“Name”: Email Contact Point +“Integration”:选择联络类型,这里选择 Email,填写邮件接收地址,完成后保存联络点 ![TDengine Database Grafana plugin alert email](./alert-email.webp) -## 配置飞书联络点 +#### 配置飞书联络点 -### 飞书机器人配置 -1. “飞书工作台“ -> “获取应用“ -> “搜索飞书机器人助手“ -> “新建指令“ +按照以下步骤配置飞书机器人: + +1. “飞书工作台” -> “获取应用” -> “搜索飞书机器人助手” -> “新建指令” 2. 选择触发器:Grafana 3. 选择操作:通过官方机器人发送消息,填写发送对象和发送内容 ![TDengine Database Grafana plugin feishu robot](./alert-feishu1.webp) -### Grafana 配置飞书联络点 - -在 Grafana 页面找到 “Home“ -> “Alerting“ -> “Contact points“ 创建新联络点 -“Name“:Feishu Contact Point -“Integration“:选择联络类型,这里选择 Webhook,并填写 URL (在飞书机器人助手的 Grafana 触发器 Webhook 地址),完成后保存联络点 +在 Grafana 页面找到 “Home” -> “Alerting” -> “Contact points” 创建新联络点 +“Name”:Feishu Contact Point +“Integration”:选择联络类型,这里选择 Webhook,并填写 URL (在飞书机器人助手的 Grafana 触发器 Webhook 地址),完成后保存联络点 ![TDengine Database Grafana plugin feishu contact point](./alert-feishu2.webp) -## 通知策略 +### 配置告警通知策略 + 配置好联络点后,可以看到已有一个Default Policy ![TDengine Database Grafana plugin Notification default policy](./alert-notification1.webp) -点击右侧 ”...“ -> ”Edit“,然后编辑默认通知策略,弹出配置窗口: +点击右侧 “...” -> ”Edit”,然后编辑默认通知策略,弹出配置窗口: ![TDengine Database Grafana plugin Notification](./alert-notification2.webp) 然后配置下列参数: -- “Group wait“: 发送首次告警之前的等待时间。 -- “Group interval“: 发送第一个告警后,为该组发送下一批新告警的等待时间。 -- “Repeat interval“: 成功发送告警后再次重复发送告警的等待时间。 +- “Group wait”: 发送首次告警之前的等待时间。 +- “Group interval”: 发送第一个告警后,为该组发送下一批新告警的等待时间。 +- “Repeat interval”: 成功发送告警后再次重复发送告警的等待时间。 -## 配置告警规则 +### 配置告警规则 -### 配置查询和告警触发条件 +以配置智能电表告警为例,告警规则的配置主要包括告警名称、查询和告警触发条件、规则评估策略、标签和告警通道、通知文案。 -在需要配置告警的面板中选择 “Edit“ -> “Alert“ -> “New alert rule“。 +#### 配置告警名称 + +在需要配置告警的面板中选择 “Edit” -> “Alert” -> “New alert rule”。 + +“Enter alert rule name“ (输入告警规则名称):此处以智能电表为例输入 `power meters alert` + +#### 配置查询和告警触发条件 + +在 “Define query and alert condition” (定义查询和告警触发条件) 中配置告警规则。 +1. 选择数据源:`TDengine Datasource` +2. 查询语句: -1. “Enter alert rule name“ (输入告警规则名称):此处以智能电表为例输入 `power meters alert` -2. “Define query and alert condition“ (定义查询和告警触发条件) - 2.1 选择数据源:`TDengine Datasource` - 2.2 查询语句: ```sql select _wstart as ts, groupid, avg(current) as current from power.meters where ts > $from and ts < $to partition by groupid interval($interval) fill(null) ``` - 2.3 设置 ”Expression“(表达式):`Threshold is above 100` - 2.4 点击【Set as alert condition】 - 2.5 “Preview“:查看设置的规则的结果 + +3. 设置 “Expression”(表达式):`Threshold is above 100` +4. 点击【Set as alert condition】 +5. “Preview”:查看设置的规则的结果 完成设置后可以看到下面图片展示: ![TDengine Database Grafana plugin Alert Rules](./alert-rules1.webp) -### 配置表达式和计算规则 - -Grafana 的 “Expression“(表达式)支持对数据做各种操作和计算,其类型分为: -1. “Reduce“:将所选时间范围内的时间序列值聚合为单个值 - 1.1 “Function“ 用来设置聚合方法,支持 Min、Max、Last、Mean、Sum 和 Count。 - 1.2 “Mode“ 支持下面三种: - - “Strict“:如果查询不到数据,数据会赋值为 NaN。 - - “Drop Non-numeric Value“:去掉非法数据结果。 - - “Replace Non-numeric Value“:如果是非法数据,使用固定值进行替换。 -2. “Threshold“:检查时间序列数据是否符合阈值判断条件。当条件为假时返回 0,为真则返回1。支持下列方式: +Grafana 的 “Expression”(表达式)支持对数据做各种操作和计算,其类型分为: +1. “Reduce”:将所选时间范围内的时间序列值聚合为单个值 + 1.1 “Function” 用来设置聚合方法,支持 Min、Max、Last、Mean、Sum 和 Count。 + 1.2 “Mode” 支持下面三种: + - “Strict”:如果查询不到数据,数据会赋值为 NaN。 + - “Drop Non-numeric Value”:去掉非法数据结果。 + - “Replace Non-numeric Value”:如果是非法数据,使用固定值进行替换。 +2. “Threshold”:检查时间序列数据是否符合阈值判断条件。当条件为假时返回 0,为真则返回1。支持下列方式: - Is above (x > y) - Is below (x < y) - Is within range (x > y1 AND x < y2) - Is outside range (x < y1 AND x > y2) -3. “Math“:对时间序列的数据进行数学运算。 -4. “Resample“:更改每个时间序列中的时间戳使其具有一致的时间间隔,以便在它们之间执行数学运算。 -5. “Classic condition (legacy)“: 可配置多个逻辑条件,判断是否触发告警。 +3. “Math”:对时间序列的数据进行数学运算。 +4. “Resample”:更改每个时间序列中的时间戳使其具有一致的时间间隔,以便在它们之间执行数学运算。 +5. “Classic condition (legacy)”: 可配置多个逻辑条件,判断是否触发告警。 如上节截图显示,此处我们设置最大值超过 100 触发告警。 -### 配置评估策略 +#### 配置规则评估策略 ![TDengine Database Grafana plugin Alert Evaluation Behavior](./alert-evaluation.webp) 完成下面配置: -- “Folder“:设置告警规则所属目录。 -- “Evaluation group“:设置告警规则评估组。“Evaluation group“ 可以选择已有组或者新建组,新建组可以设置组名和评估时间间隔。 -- “Pending period“:在告警规则的阈值被触发后,异常值持续多长时间可以触发告警,合理设置可以避免误报。 +- “Folder”:设置告警规则所属目录。 +- “Evaluation group”:设置告警规则评估组。“Evaluation group” 可以选择已有组或者新建组,新建组可以设置组名和评估时间间隔。 +- “Pending period”:在告警规则的阈值被触发后,异常值持续多长时间可以触发告警,合理设置可以避免误报。 + +#### 配置标签和告警通道 -### 配置标签和告警通道 ![TDengine Database Grafana plugin Alert Labels and Notifications](./alert-labels.webp) 完成下面配置: -- “Labels“ 将标签添加到规则中,以便进行搜索、静默或路由到通知策略。 -- “Contact point“ 选择联络点,当告警发生时通过设置的联络点进行通知。 +- “Labels” 将标签添加到规则中,以便进行搜索、静默或路由到通知策略。 +- “Contact point” 选择联络点,当告警发生时通过设置的联络点进行通知。 -### 配置通知文案 +#### 配置通知文案 ![TDengine Database Grafana plugin Alert Labels and Notifications](./alert-annotations.webp) -设置 “Summary” 和 ”Description” 后,若告警触发,将会收到告警通知。 +设置 “Summary” 和 “Description” 后,若告警触发,将会收到告警通知。 diff --git a/examples/JDBC/connectionPools/pom.xml b/examples/JDBC/connectionPools/pom.xml index 61717cf112..855d531f4c 100644 --- a/examples/JDBC/connectionPools/pom.xml +++ b/examples/JDBC/connectionPools/pom.xml @@ -18,7 +18,7 @@ com.taosdata.jdbc taos-jdbcdriver - 3.0.0 + 3.3.0 diff --git a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/DruidDemo.java b/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/DruidDemo.java index c7df4e0dec..dd96f5c632 100644 --- a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/DruidDemo.java +++ b/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/DruidDemo.java @@ -22,7 +22,7 @@ public static void main(String[] args) throws Exception { dataSource.setMinIdle(10); dataSource.setMaxActive(10); dataSource.setMaxWait(30000); - dataSource.setValidationQuery("SELECT SERVER_STATUS()"); + dataSource.setValidationQuery("SELECT SERVER_VERSION()"); Connection connection = dataSource.getConnection(); // get connection Statement statement = connection.createStatement(); // get statement diff --git a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/HikariDemo.java b/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/HikariDemo.java index 79f636c428..4480cbc7c4 100644 --- a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/HikariDemo.java +++ b/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/HikariDemo.java @@ -21,7 +21,7 @@ public static void main(String[] args) throws SQLException { config.setConnectionTimeout(30000); //maximum wait milliseconds for get connection from pool config.setMaxLifetime(0); // maximum life time for each connection config.setIdleTimeout(0); // max idle time for recycle idle connection - config.setConnectionTestQuery("SELECT SERVER_STATUS()"); //validation query + config.setConnectionTestQuery("SELECT SERVER_VERSION()"); //validation query HikariDataSource ds = new HikariDataSource(config); //create datasource diff --git a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/DruidPoolBuilder.java b/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/DruidPoolBuilder.java index 500f0e9e97..a4581ac4b6 100644 --- a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/DruidPoolBuilder.java +++ b/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/DruidPoolBuilder.java @@ -20,7 +20,7 @@ public class DruidPoolBuilder { dataSource.setMinIdle(poolSize); dataSource.setMaxActive(poolSize); dataSource.setMaxWait(30000); - dataSource.setValidationQuery("select server_status()"); + dataSource.setValidationQuery("select SERVER_VERSION()"); return dataSource; } diff --git a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/HikariCpBuilder.java b/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/HikariCpBuilder.java index 7e151de3e0..ffd43cc3ea 100644 --- a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/HikariCpBuilder.java +++ b/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/HikariCpBuilder.java @@ -20,7 +20,7 @@ public class HikariCpBuilder { config.setConnectionTimeout(30000); //maximum wait milliseconds for get connection from pool config.setMaxLifetime(0); // maximum life time for each connection config.setIdleTimeout(0); // max idle time for recycle idle connection - config.setConnectionTestQuery("select server_status()"); //validation query + config.setConnectionTestQuery("select SERVER_VERSION()"); //validation query HikariDataSource ds = new HikariDataSource(config); return ds; diff --git a/examples/JDBC/connectionPools/src/main/resources/proxool.xml b/examples/JDBC/connectionPools/src/main/resources/proxool.xml index 67baa1c393..0e2ac6368a 100644 --- a/examples/JDBC/connectionPools/src/main/resources/proxool.xml +++ b/examples/JDBC/connectionPools/src/main/resources/proxool.xml @@ -22,6 +22,6 @@ 30000 - select server_status() + select server_version() \ No newline at end of file