我是靠谱客的博主 犹豫小土豆,最近开发中收集的这篇文章主要介绍ProcessDB实时/时序数据库——数据报警功能目录前言一、报警点的基础属性二、报警点的设置三、监控报警的详细操作,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
目录
前言
一、报警点的基础属性
二、报警点的设置
三、监控报警的详细操作
1.查询所需要的数据
2.查询报警点的报警规则信息
3.校验报警
前言
数据报警是ProcessDB的特色功能之一,这是其它数据库所不具备的功能。从公司业务角度出发,可以更好的监控设备的运行情况,以及便于问题排查。所以在此文章中,我将详细介绍下报警的规则设定和业务中的使用思路。
一、报警点的基础属性
属性 | 描述 |
报警开关 | 报警功能的总开关,控制该点是否参与报警功能 |
响应方式 | 分为manual(手动报警),auto(自动报警) |
告警类别 | 可以根据业务具体需要,设置无告警、死区告警、超时告警 、开启告警、关闭告警 、变化、 低高限 、低低高高限等报警标准 |
告警低限 | 当数据值低于该值时,可以联合告警类别,进行监控报警 |
告警高限 | 当数据值高于该值时,可以联合告警类别,进行监控报警 |
告警低低限 | 增加了更深入的一层限制,当数据值低于该值时,可以联合告警类别,进行监控报警 |
告警高高限 | 增加了更深入的一层限制,当数据值高于该值时,可以联合告警类别,进行监控报警 |
告警分组 | 可以为该数据点设置个告警分组id |
二、报警点的设置
报警点的设置,请根据你操作数据库的方式,进行相应设置即可,详细方法请参考我文章目录里的相应文章。
三、监控报警的详细操作
这里主要是介绍下监控报警的思路,可以根据你操作数据库的方式,进行针对性的操作。下面以JAVA-API的方式为例:
1.查询所需要的数据
我这里查询的是历史采样数据,写了一个定时器,5分钟获取一次,这5分钟内的所有历史数据,获取到我需要的值。
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.Vector;
import com.processdb.connection.DBConnect;
import com.processdb.connection.DBConnectManager;
import com.processdb.driver.common.ConnectInfo;
import com.processdb.driver.common.ConstantValue;
import com.processdb.driver.dao.DBHistoryDataDao;
import com.processdb.driver.record.HistoryRecordSet;
import com.processdb.driver.record.PointHistory;
public class Test {
//每次定时器启动间隔,单位秒
private static int pubTime = 300;
public static void main(String[] args) {
Timer timer = new Timer();
// 在1秒后执行此任务,每次间隔pubTime秒执行一次,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.
timer.schedule(new MyTask(), 1000, pubTime * 1000);
// 这个是用来停止此任务的,否则就一直循环执行此任务
while (true) {
try {
int in = System.in.read();
if (in == 's') {
// 使用这个方法退出任务
timer.cancel();
break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
static class MyTask extends java.util.TimerTask {
int count = 0;
public void run() {
ConnectInfo host = new ConnectInfo();
host.setConnectName("instance01");
host.setHostName("127.0.0.1");
host.setHostPort(8301);
host.setUserName("root");
host.setPassword("root");
host.setCacheable(false);
DBConnect myConn = null;
SimpleDateFormat dateFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date begindate = null; // 开始时间
Date enddate = null; // 结束时间
try {
myConn = DBConnectManager.getInstance().getConnect(host);
Calendar beforeTime = Calendar.getInstance();
enddate = beforeTime.getTime();
beforeTime.add(Calendar.SECOND, -pubTime);// 3分钟之前的时间
begindate = beforeTime.getTime();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String pointNameArray[] = { "D30.T31.P30" };
short pageSize = 10; // 每页显示条数
short pageNum = 0; // 页码,即第pageNum+1页
int interval = 0; // 时间间隔
byte query_type = ConstantValue.HIS_VALUE_SAMPLE; // 采样点
// 查询历史的参数列表
Vector<PointHistory> pointHistoryList = new Vector<PointHistory>();
// 给查询历史的参数列表赋值
for (int i = 0; i < pointNameArray.length; i++) {
PointHistory ph = new PointHistory(pointNameArray[i], begindate, enddate, interval, query_type,
ConstantValue.HISTORY_FILTER_GREATE_THAN, ConstantValue.HISTORY_FILTER_LESS_THAN, (float) 0,
(float) 10000, ConstantValue.HISTORY_FILL_VALUE_TYPE_RAW, (float) 0, (int) 0, (short) 0, pageSize,
pageNum);
pointHistoryList.add(ph);
}
// 查询历史数据
DBHistoryDataDao.requestPointHistoryByName(myConn, pointHistoryList);
for (int ii = 0; ii < pointHistoryList.size(); ii++) { // 遍历所有点
PointHistory ph = pointHistoryList.get(ii);
HistoryRecordSet record = ph.getSampleRecordSet(); // 采样点的历史数据
int count = record.getRecordNum(); // 历史数据个数
for (int i = 0; i < count; i++) {
// 遍历每个历史数据,根据点的不同数据类型,解析出历史数据值
Date t = record.getTime(i); // 读取历史时刻
double value = record.getFloat32(i); // 读取Float32类型历史数据
System.out.println("数据序号" + (i + 1) + ",数据时间:" + dateFmt.format(t) + ",历史数据值:" + value);
}
}
}
}
}
示例运行如下:
数据序号1,数据时间:2022-11-09 13:17:13,历史数据值:328.0
数据序号2,数据时间:2022-11-09 13:18:05,历史数据值:648.0
数据序号3,数据时间:2022-11-09 13:18:08,历史数据值:328.0
数据序号4,数据时间:2022-11-09 13:18:12,历史数据值:998.0
数据序号5,数据时间:2022-11-09 13:18:15,历史数据值:88.0
2.查询报警点的报警规则信息
根据报警点的位置名称,查询出在设置报警点信息时的各种限制条件
import com.processdb.connection.DBConnect;
import com.processdb.connection.DBConnectManager;
import com.processdb.connection.DBPoint;
import com.processdb.connection.DBRoot;
import com.processdb.connection.DBTable;
import com.processdb.connection.DBase;
import com.processdb.driver.common.ConnectInfo;
import com.processdb.driver.common.PointInfo;
public class Test {
public static void main(String[] args) throws Exception
{
ConnectInfo host = new ConnectInfo();
host.setConnectName("instance01");
host.setHostName("127.0.0.1");
host.setHostPort(8301);
host.setUserName("root");
host.setPassword("root");
host.setCacheable(false);
DBConnect myConn = null;
myConn = DBConnectManager.getInstance().getConnect(host);
DBRoot root = DBRoot.getInstance(myConn);
String dbname ="D30";
DBase dBase = root.getCachedDatabaseByName(dbname);
String tableName ="T31";
DBTable dbtable = dBase.getCachedTableByName(tableName);
String pointName = "P30";
DBPoint dbpoint = dbtable.getCachedPointByName(pointName);
PointInfo pointInfo = dbpoint.getPointInfo();
System.out.println(dbname+"库的"+tableName+"表的"+pointName+"点的属性为:");
System.out.println("是否报警:"+pointInfo.getAlarmSwitchStr()+",报警类型:"+pointInfo.getAlarmTypeStr()+",报警高限:"+pointInfo.getAlarmHigh()+",报警低限:"+pointInfo.getAlarmLow());
}}
示例运行如下:
D30库的T31表的P30点的属性为:
是否报警:On,报警类型:LHLimt,报警高限:100.0,报警低限:50.0
3.校验报警
由于上述已经定时查询出采集的数据,并获取报警信息,则接下来进行相关校验,这里以低高限为例
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.Vector;
import com.processdb.connection.DBConnect;
import com.processdb.connection.DBConnectManager;
import com.processdb.connection.DBPoint;
import com.processdb.connection.DBRoot;
import com.processdb.connection.DBTable;
import com.processdb.connection.DBase;
import com.processdb.driver.common.ConnectInfo;
import com.processdb.driver.common.ConstantValue;
import com.processdb.driver.common.PointInfo;
import com.processdb.driver.dao.DBHistoryDataDao;
import com.processdb.driver.record.HistoryRecordSet;
import com.processdb.driver.record.PointHistory;
public class Test {
//每次定时器启动间隔,单位秒
private static int pubTime = 300;
public static void main(String[] args) {
Timer timer = new Timer();
// 在1秒后执行此任务,每次间隔pubTime秒执行一次,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.
timer.schedule(new MyTask(), 1000, pubTime * 1000);
// 这个是用来停止此任务的,否则就一直循环执行此任务
while (true) {
try {
int in = System.in.read();
if (in == 's') {
// 使用这个方法退出任务
timer.cancel();
break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
static class MyTask extends java.util.TimerTask {
int count = 0;
public void run() {
ConnectInfo host = new ConnectInfo();
host.setConnectName("instance01");
host.setHostName("127.0.0.1");
host.setHostPort(8301);
host.setUserName("root");
host.setPassword("root");
host.setCacheable(false);
DBConnect myConn = null;
SimpleDateFormat dateFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date begindate = null; // 开始时间
Date enddate = null; // 结束时间
try {
myConn = DBConnectManager.getInstance().getConnect(host);
Calendar beforeTime = Calendar.getInstance();
enddate = beforeTime.getTime();
beforeTime.add(Calendar.SECOND, -pubTime);// 3分钟之前的时间
begindate = beforeTime.getTime();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String dbname ="D30";
String tableName ="T31";
String pointName = "P30";
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(dbname);
stringBuilder.append(".");
stringBuilder.append(tableName);
stringBuilder.append(".");
stringBuilder.append(pointName);
String pointNameArray[] = {stringBuilder.toString() };
short pageSize = 10; // 每页显示条数
short pageNum = 0; // 页码,即第pageNum+1页
int interval = 0; // 时间间隔
byte query_type = ConstantValue.HIS_VALUE_SAMPLE; // 采样点
// 查询历史的参数列表
Vector<PointHistory> pointHistoryList = new Vector<PointHistory>();
// 给查询历史的参数列表赋值
for (int i = 0; i < pointNameArray.length; i++) {
PointHistory ph = new PointHistory(pointNameArray[i], begindate, enddate, interval, query_type,
ConstantValue.HISTORY_FILTER_GREATE_THAN, ConstantValue.HISTORY_FILTER_LESS_THAN, (float) 0,
(float) 10000, ConstantValue.HISTORY_FILL_VALUE_TYPE_RAW, (float) 0, (int) 0, (short) 0, pageSize,
pageNum);
pointHistoryList.add(ph);
}
// 查询历史数据
DBHistoryDataDao.requestPointHistoryByName(myConn, pointHistoryList);
//获取报警信息
DBRoot root = DBRoot.getInstance(myConn);
DBase dBase = root.getCachedDatabaseByName(dbname);
DBTable dbtable = dBase.getCachedTableByName(tableName);
DBPoint dbpoint = dbtable.getCachedPointByName(pointName);
PointInfo pointInfo = dbpoint.getPointInfo();
byte alarmSwitch = pointInfo.getAlarmSwitch();
String alarmTypeStr = pointInfo.getAlarmTypeStr();
for (int ii = 0; ii < pointHistoryList.size(); ii++) { // 遍历所有点
PointHistory ph = pointHistoryList.get(ii);
HistoryRecordSet record = ph.getSampleRecordSet(); // 采样点的历史数据
int count = record.getRecordNum(); // 历史数据个数
for (int i = 0; i < count; i++) {
// 遍历每个历史数据,根据点的不同数据类型,解析出历史数据值
Date time = record.getTime(i);
double value = record.getFloat32(i); // 读取Float32类型历史数据
//判断是否报警
if(alarmSwitch==1) {
//根据报警规则类型不同,进行不同的校验
if(alarmTypeStr.equals("LHLimt")) {
float alarmHigh = pointInfo.getAlarmHigh();
float alarmLow = pointInfo.getAlarmLow();
if (value>=alarmHigh) {
System.out.println("在时间为"+dateFmt.format(time)+"的时候,数值超出告警高限,超出值为:"+(value-alarmHigh));
}else if (value<=alarmLow) {
System.out.println("在时间为"+dateFmt.format(time)+"的时候,数值低于告警低限,低出值为:"+(value-alarmLow));
}
}
}
}
}
}
}
}
示例运行结果如下:
在时间为2022-11-09 14:05:42的时候,数值超出告警高限,超出值为:88.0
在时间为2022-11-09 14:05:47的时候,数值低于告警低限,低出值为:-18.0
最后
以上就是犹豫小土豆为你收集整理的ProcessDB实时/时序数据库——数据报警功能目录前言一、报警点的基础属性二、报警点的设置三、监控报警的详细操作的全部内容,希望文章能够帮你解决ProcessDB实时/时序数据库——数据报警功能目录前言一、报警点的基础属性二、报警点的设置三、监控报警的详细操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复