和作为JobMachine时相同,当CAT服务器是AlertMachine时,也额外启动了其它的线程。主要有两类,一类是告警,一类是刷新存储的告警信息。
先看第一类:
一、告警线程
if (serverConfigManager.isAlertMachine()) { TransactionAlert transactionAlert = ctx.lookup(TransactionAlert.class); EventAlert eventAlert = ctx.lookup(EventAlert.class); BusinessAlert metricAlert = ctx.lookup(BusinessAlert.class); ExceptionAlert exceptionAlert = ctx.lookup(ExceptionAlert.class); HeartbeatAlert heartbeatAlert = ctx.lookup(HeartbeatAlert.class); Threads.forGroup("cat").start(metricAlert); Threads.forGroup("cat").start(exceptionAlert); Threads.forGroup("cat").start(heartbeatAlert); Threads.forGroup("cat").start(transactionAlert); Threads.forGroup("cat").start(eventAlert); }
复制
可以看到启动了各种类型的告警(注释了的部分已手动去除)。
下面以transactionAlert为例:
public void run() { boolean active = TimeHelper.sleepToNextMinute(); while (active) { Transaction t = Cat.newTransaction("AlertTransaction", TimeHelper.getMinuteStr()); long current = System.currentTimeMillis(); try { MonitorRules monitorRules = m_ruleConfigManager.getMonitorRules(); Map<String, Rule> rules = monitorRules.getRules(); for (Entry<String, Rule> entry : rules.entrySet()) { try { processRule(entry.getValue()); } catch (Exception e) { Cat.logError(e); } } t.setStatus(Transaction.SUCCESS); } catch (Exception e) { t.setStatus(e); Cat.logError(e); } finally { t.complete(); } long duration = System.currentTimeMillis() - current; try { if (duration < DURATION) { Thread.sleep(DURATION - duration); } } catch (InterruptedException e) { active = false; } } }
复制
可以看到,线程每分钟执行一次。先重新获取一下监控规则,然后对新规则进行处理。
规则的配置地址:http://localhost:8080/cat/s/config?op=transactionRule。
处理过程:
private void processRule(Rule rule) { List<String> fields = Splitters.by(";").split(rule.getId()); String domain = fields.get(0); String type = fields.get(1); String name = fields.get(2); String monitor = fields.get(3); List<AlertResultEntity> alertResults = computeAlertForRule(domain, type, name, monitor, rule.getConfigs()); for (AlertResultEntity alertResult : alertResults) { AlertEntity entity = new AlertEntity(); entity.setDate(alertResult.getAlertTime()).setContent(alertResult.getContent()) .setLevel(alertResult.getAlertLevel()); entity.setMetric(type + "-" + name + "-" + monitor).setType(getName()).setGroup(domain); m_sendManager.addAlert(entity); } }
复制
计算出要告警的信息,并将结果添加的告警管理器里面,由告警器统一发送。
二、刷新存储告警信息
public void run() { long current = TimeHelper.getCurrentMinute().getTime(); Date start = new Date(current + (1 - StorageConstants.DEFAULT_MINUTE_COUNT) * TimeHelper.ONE_MINUTE); Date end = new Date(current + TimeHelper.ONE_MINUTE - TimeHelper.ONE_SECOND); Transaction t = Cat.newTransaction("ReloadTask", "StorageAlertRecover"); try { try { buildAlertInfos(start, end, StorageConstants.SQL_TYPE); buildAlertInfos(start, end, StorageConstants.CACHE_TYPE); } catch (DalNotFoundException e) { // ignore } catch (Exception e) { Cat.logError(e); } t.setStatus(Transaction.SUCCESS); } catch (Exception e) { t.setStatus(e); Cat.logError(e); } finally { t.complete(); } }
复制
其实就是简单的启动时从数据库取一下告警信息
文章转载自贰级天災,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
2025年4月中国数据库流行度排行榜:OB高分复登顶,崖山稳驭撼十强
墨天轮编辑部
2460次阅读
2025-04-09 15:33:27
数据库国产化替代深化:DBA的机遇与挑战
代晓磊
1138次阅读
2025-04-27 16:53:22
2025年3月国产数据库中标情况一览:TDSQL大单622万、GaussDB大单581万……
通讯员
818次阅读
2025-04-10 15:35:48
2025年4月国产数据库中标情况一览:4个千万元级项目,GaussDB与OceanBase大放异彩!
通讯员
646次阅读
2025-04-30 15:24:06
数据库,没有关税却有壁垒
多明戈教你玩狼人杀
565次阅读
2025-04-11 09:38:42
天津市政府数据库框采结果公布,7家数据库产品入选!
通讯员
548次阅读
2025-04-10 12:32:35
国产数据库需要扩大场景覆盖面才能在竞争中更有优势
白鳝的洞穴
527次阅读
2025-04-14 09:40:20
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
452次阅读
2025-04-17 17:02:24
一页概览:Oracle GoldenGate
甲骨文云技术
450次阅读
2025-04-30 12:17:56
GoldenDB数据库v7.2焕新发布,助力全行业数据库平滑替代
GoldenDB分布式数据库
438次阅读
2025-04-30 12:17:50