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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Prometheus时序数据库提供了强大的Promql查询语言来满足我们的查询需求。在查询数据之前,我们需要先插入数据到Prometheus中。在之前的博客中,详细介绍了Prometheus数据的插入过程\[1\]。而在查询数据时,我们可以使用Promql来进行查询。Promql是一种灵活的查询语言,可以根据我们的需求进行千变万化的查询\[2\]。 在进行查询时,Prometheus会根据指定的时间窗口来过滤数据,默认的时间窗口是5分钟,可以通过启动参数来进行设置\[3\]。这样可以确保我们只获取到指定时间范围内的数据,而不会包含过去或未来的数据。 总结来说,Prometheus时序数据库通过Promql查询语言来满足我们的查询需求,并通过时间窗口来过滤数据,确保我们获取到的数据符合我们的要求。 #### 引用[.reference_title] - *1* [Prometheus时序数据库-数据的查询](https://blog.csdn.net/weixin_55416758/article/details/115350199)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Prometheus时序数据库-报警的计算 及 Prometheus时序数据库-数据的查询](https://blog.csdn.net/m0_67322837/article/details/125004715)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值