演进式设计——链路告警

举报
用户已注销 发表于 2021/11/19 04:29:27 2021/11/19
1.3k+ 0 0
【摘要】 一,需求 对于一条链路来说,它有几个基本属性:链路类型linktype,通道号ChanId,链路状态linkStatus,丢包率dropRate,错包率errorRate,抖动shake 当前有N条SCCP链路,SCCP链路类型为SCCP,通道ID为1—N 现在需要为该类型的链路实现一个报警系统: 当前某条链路如果有以下异常需要上...

一,需求

对于一条链路来说,它有几个基本属性:链路类型linktype,通道号ChanId,链路状态linkStatus,丢包率dropRate,错包率errorRate,抖动shake

当前有N条SCCP链路,SCCP链路类型为SCCP,通道ID为1—N
现在需要为该类型的链路实现一个报警系统:

当前某条链路如果有以下异常需要上报告警

1.    链路状态故障,告警ID为1:当该链路的linkStatus 为0的时候上报该告警。
2.    上报丢包率过大告警,告警ID为2: 当链路的dropRate大于5时,上报该告警。

由于链路太多,一次全部检查影响性能,因此需要每次轮询1/5的链路。如果该链路有以上异常,则上报对应告警。


3.    上报抖动过大告警,告警ID为3:当该链路的shake大于20的时候上报该告警。
4.    上报错包率过大告警,告警ID为4: 当链路的errorRate大于10时,上报该告警。

新增 M3UA链路类型,当M3UA有以下异常需要上报告警
1.    链路状态故障,告警ID为100:当该链路的linkStatus 为0的时候上报该告警。
2.    上报丢包率过大告警,告警ID为101: 当链路的dropRate大于13时,上报该告警。
3.    上报抖动过大告警,告警ID为102:当该链路的shake大于19的时候上报该告警。


新增 M2UA链路类型,当M2UA有以下异常需要上报告警
1.    链路状态故障,告警ID为200:当该链路的linkStatus 为0的时候上报该告警。
2.    上报抖动过大告警,告警ID为201:当该链路的shake大于11的时候上报该告警。
3.    上报错包率过大告警,告警ID为202: 当链路的errorRate大于15时,上报该告警。

注:类型不一致的链路,通道ID可以相同
 

二,实现

头文件


      #include "mylist.h"
      #include "stdlib.h"
      #include "stdio.h"
      #ifdef __cplusplus
      extern "C" {
      #endif
      #define LINKTYPENUM 3
      typedef enum LinkType{
          SCCP,
          M3UA,
          M2UA
      }LinkType;
      typedef struct Link{
          LinkType linkType;
         int chanId;
         int linkstatus;
         int dropRate;
         int errorRate;
         int shake;
      }Link;
      typedef struct Alert{
         int alertId;
         int chanId;
      }Alert;
      typedef struct Checker{
         int (*checkFunc)(Link link);
         int alertId[LINKTYPENUM];
      }Checker;
      void Init();
      void CheckLinks();
      int getAlertNum();
      #ifdef __cplusplus
      }
      #endif
  
 

源文件


      //
      // Created by w00371255 on 2020/11/17.
      //
      #include "unitest.h"
      #define MAXLINK 400
      #define N 100
      #define MAXLALERT (MAXLINK*2)
      static Link links[MAXLINK];
      static int linkNum;
      static Alert alerts[MAXLALERT];
      static int alertNum;
      void Init()
      {
         memset((void *)links, 0, sizeof(links));
          linkNum = N*3;
          alertNum = 0;
         for(int i=1; i<=linkNum; i++){
              links[i].linkType = i/N;
              links[i].chanId = i%N;
              links[i].linkstatus = i%2;
              links[i].dropRate = i%20;
              links[i].errorRate = i%20;
              links[i].shake = i%40;
          }
      }
      static int IsBadLink(Link link)
      {
         return link.linkstatus==0;
      }
      int overDropDeadLine[]={5,13,100};
      static int IsOverDropLink(Link link)
      {
         return link.dropRate>overDropDeadLine[link.linkType];
      }
      int overShakeDeadLine[]={20,19,11};
      static int IsOverShake(Link link)
      {
         return link.shake>overShakeDeadLine[link.linkType];
      }
      int overErrDeadLine[]={10,100,15};
      static int IsOverError(Link link)
      {
         return link.errorRate>overErrDeadLine[link.linkType];
      }
      static void Alertlink(Alert alert)
      {
         printf("alertId: %d, chanId: %d \n", alert.alertId, alert.chanId);
         if(alertNum<MAXLALERT) {
              alerts[alertNum++] = alert;
          }else{
             printf("too much alert!");
          }
      }
      Checker checker[]={
          {IsBadLink,{1,100,200}},
          {IsOverDropLink,{2,101,-1}},
          {IsOverShake,{3,102,201}},
          {IsOverError,{4,-1,202}}
      };
      static void CheckALink(Link link)
      {
          Alert alert;
          alert.chanId=link.chanId;
         int checkerNum=sizeof(checker)/sizeof(checker[0]);
         for(int i=0;i<checkerNum;i++) {
             if (checker[i].checkFunc(link)) {
                  alert.alertId = checker[i].alertId[link.linkType];
                 Alertlink(alert);
              }
          }
      }
      void CheckLinks()
      {
         int len=N*LINKTYPENUM/5;
         for(int i=0;i<len;i++){
             CheckALink(links[i*5+1]);
          }
      }
      int getAlertNum()
      {
         return alertNum;
      }
  
 

测试


      TEST(MockCppTest, checkLinks) {
         Init();
         CheckLinks();
         ASSERT_EQ(getAlertNum(),96);
      }
  
 

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/112866485

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。