From 8b97d0a2ca9ec6a736e8cfba6df539cea83c1da7 Mon Sep 17 00:00:00 2001 From: tomsun28 Date: Tue, 8 Mar 2022 17:17:24 +0800 Subject: [PATCH] =?UTF-8?q?[collector,manager]feature=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?postgresql=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9A=84=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=20(#16)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- collector/pom.xml | 6 + .../collect/database/JdbcCommonCollect.java | 16 ++- .../collector/util/CollectorConstants.java | 5 + .../main/resources/define/app/postgresql.yml | 121 ++++++++++++++++++ .../resources/define/param/postgresql.yml | 30 +++++ 5 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 manager/src/main/resources/define/app/postgresql.yml create mode 100644 manager/src/main/resources/define/param/postgresql.yml diff --git a/collector/pom.xml b/collector/pom.xml index 5b1eacb..7ffd674 100644 --- a/collector/pom.xml +++ b/collector/pom.xml @@ -91,6 +91,12 @@ mysql-connector-java 8.0.27 + + + org.postgresql + postgresql + 42.3.3 + \ No newline at end of file diff --git a/collector/src/main/java/com/usthe/collector/collect/database/JdbcCommonCollect.java b/collector/src/main/java/com/usthe/collector/collect/database/JdbcCommonCollect.java index 12adee5..1331b26 100644 --- a/collector/src/main/java/com/usthe/collector/collect/database/JdbcCommonCollect.java +++ b/collector/src/main/java/com/usthe/collector/collect/database/JdbcCommonCollect.java @@ -11,6 +11,7 @@ import com.usthe.common.entity.job.protocol.JdbcProtocol; import com.usthe.common.entity.message.CollectRep; import com.usthe.common.util.CommonConstants; import lombok.extern.slf4j.Slf4j; +import org.postgresql.util.PSQLException; import java.sql.Connection; import java.sql.DriverManager; @@ -72,7 +73,16 @@ public class JdbcCommonCollect extends AbstractCollect { } catch (CommunicationsException communicationsException) { log.warn("Jdbc sql error: {}, code: {}.", communicationsException.getMessage(), communicationsException.getErrorCode()); builder.setCode(CollectRep.Code.UN_REACHABLE); - builder.setMsg("Query Error: " + communicationsException.getMessage() + " Code: " + communicationsException.getErrorCode()); + builder.setMsg("Error: " + communicationsException.getMessage() + " Code: " + communicationsException.getErrorCode()); + } catch (PSQLException psqlException) { + // for PostgreSQL 08001 + if (CollectorConstants.POSTGRESQL_UN_REACHABLE_CODE.equals(psqlException.getSQLState())) { + // 对端链接失败 不可达 + builder.setCode(CollectRep.Code.UN_REACHABLE); + } else { + builder.setCode(CollectRep.Code.FAIL); + } + builder.setMsg("Error: " + psqlException.getMessage() + " Code: " + psqlException.getSQLState()); } catch (SQLException sqlException) { log.warn("Jdbc sql error: {}, code: {}.", sqlException.getMessage(), sqlException.getErrorCode()); builder.setCode(CollectRep.Code.FAIL); @@ -253,6 +263,10 @@ public class JdbcCommonCollect extends AbstractCollect { + "/" + (jdbcProtocol.getDatabase() == null ? "" : jdbcProtocol.getDatabase()) + "?useUnicode=true&characterEncoding=utf-8&useSSL=false"; break; + case "postgresql": + url = "jdbc:postgresql://" + jdbcProtocol.getHost() + ":" + jdbcProtocol.getPort() + + "/" + (jdbcProtocol.getDatabase() == null ? "" : jdbcProtocol.getDatabase()); + break; default: throw new IllegalArgumentException("Not support database platform: " + jdbcProtocol.getPlatform()); diff --git a/collector/src/main/java/com/usthe/collector/util/CollectorConstants.java b/collector/src/main/java/com/usthe/collector/util/CollectorConstants.java index 3f3edbb..689532d 100644 --- a/collector/src/main/java/com/usthe/collector/util/CollectorConstants.java +++ b/collector/src/main/java/com/usthe/collector/util/CollectorConstants.java @@ -14,4 +14,9 @@ public interface CollectorConstants { String ERROR_MSG = "errorMsg"; String URL = "url"; + + /** + * POSTGRESQL状态码 不可达 + */ + String POSTGRESQL_UN_REACHABLE_CODE = "08001"; } diff --git a/manager/src/main/resources/define/app/postgresql.yml b/manager/src/main/resources/define/app/postgresql.yml new file mode 100644 index 0000000..d7cc334 --- /dev/null +++ b/manager/src/main/resources/define/app/postgresql.yml @@ -0,0 +1,121 @@ +category: db +app: postgresql +name: + zh-CN: PostgreSQL数据库 + en-US: PostgreSQL DB +# 参数映射map. type是参数类型: 0-number数字, 1-string明文字符串, 2-secret加密字符串 +# 强制固定必须参数 - host +configmap: + - key: host + type: 1 + - key: port + type: 0 + - key: username + type: 1 + - key: password + type: 2 + - key: database + type: 1 + - key: url + type: 1 +# 指标组列表 +metrics: + - name: basic + # 指标组调度优先级(0-127)越小优先级越高,优先级低的指标组会等优先级高的指标组采集完成后才会被调度,相同优先级的指标组会并行调度采集 + # 优先级为0的指标组为可用性指标组,即它会被首先调度,采集成功才会继续调度其它指标组,采集失败则中断调度 + priority: 0 + # 指标组中的具体监控指标 + fields: + # 指标信息 包括 field名称 type字段类型:0-number数字,1-string字符串 instance是否为实例主键 unit:指标单位 + - field: server_version + type: 1 + instance: true + - field: port + type: 1 + - field: server_encoding + type: 1 + - field: data_directory + type: 1 + - field: max_connections + type: 0 + unit: 连接数 + protocol: jdbc + jdbc: + # 主机host: ipv4 ipv6 域名 + host: ^_^host^_^ + # 端口 + port: ^_^port^_^ + platform: postgresql + username: ^_^username^_^ + password: ^_^password^_^ + database: ^_^database^_^ + # SQL查询方式: oneRow, multiRow, columns + queryType: columns + # sql + sql: select name, setting as value from pg_settings where name = 'max_connections' or name = 'server_version' or name = 'server_encoding' or name = 'port' or name = 'data_directory'; + url: ^_^url^_^ + + - name: state + priority: 1 + fields: + # 指标信息 包括 field名称 type字段类型:0-number数字,1-string字符串 instance是否为实例主键 unit:指标单位 + - field: name + type: 1 + - field: conflicts + type: 0 + unit: 次数 + - field: deadlocks + type: 0 + unit: 个数 + - field: blks_read + type: 0 + unit: 次数 + - field: blks_hit + type: 0 + unit: 次数 + - field: blk_read_time + type: 0 + unit: ms + - field: blk_write_time + type: 0 + unit: ms + - field: stats_reset + type: 1 + protocol: jdbc + jdbc: + # 主机host: ipv4 ipv6 域名 + host: ^_^host^_^ + # 端口 + port: ^_^port^_^ + platform: postgresql + username: ^_^username^_^ + password: ^_^password^_^ + database: ^_^database^_^ + # SQL查询方式: oneRow, multiRow, columns + queryType: multiRow + # sql + sql: SELECT COALESCE(datname,'shared-object') as name, conflicts, deadlocks, blks_read, blks_hit, blk_read_time, blk_write_time, stats_reset from pg_stat_database where (datname != 'template1' and datname != 'template0') or datname is null; + url: ^_^url^_^ + + - name: activity + priority: 2 + fields: + # 指标信息 包括 field名称 type字段类型:0-number数字,1-string字符串 instance是否为实例主键 unit:指标单位 + - field: running + type: 0 + unit: 连接数 + protocol: jdbc + jdbc: + # 主机host: ipv4 ipv6 域名 + host: ^_^host^_^ + # 端口 + port: ^_^port^_^ + platform: postgresql + username: ^_^username^_^ + password: ^_^password^_^ + database: ^_^database^_^ + # SQL查询方式: oneRow, multiRow, columns + queryType: oneRow + # sql + sql: SELECT count(*) as running FROM pg_stat_activity WHERE NOT pid=pg_backend_pid(); + url: ^_^url^_^ \ No newline at end of file diff --git a/manager/src/main/resources/define/param/postgresql.yml b/manager/src/main/resources/define/param/postgresql.yml new file mode 100644 index 0000000..df52e2f --- /dev/null +++ b/manager/src/main/resources/define/param/postgresql.yml @@ -0,0 +1,30 @@ +app: postgresql +param: + - field: host + name: 主机Host + type: host + required: true + - field: port + name: 端口 + type: number + range: '[0,65535]' + required: true + defaultValue: 5432 + placeholder: '请输入端口' + - field: database + name: 数据库名称 + type: text + required: false + - field: username + name: 用户名 + type: text + limit: 20 + required: false + - field: password + name: 密码 + type: password + required: false + - field: url + name: URL + type: text + required: false \ No newline at end of file