演进式设计——链路告警

举报
用户已注销 发表于 2021/11/19 04:29:27 2021/11/19
【摘要】 一,需求 对于一条链路来说,它有几个基本属性:链路类型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可以相同
 

二,实现

头文件


  
  1. #include "mylist.h"
  2. #include "stdlib.h"
  3. #include "stdio.h"
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7. #define LINKTYPENUM 3
  8. typedef enum LinkType{
  9. SCCP,
  10. M3UA,
  11. M2UA
  12. }LinkType;
  13. typedef struct Link{
  14. LinkType linkType;
  15. int chanId;
  16. int linkstatus;
  17. int dropRate;
  18. int errorRate;
  19. int shake;
  20. }Link;
  21. typedef struct Alert{
  22. int alertId;
  23. int chanId;
  24. }Alert;
  25. typedef struct Checker{
  26. int (*checkFunc)(Link link);
  27. int alertId[LINKTYPENUM];
  28. }Checker;
  29. void Init();
  30. void CheckLinks();
  31. int getAlertNum();
  32. #ifdef __cplusplus
  33. }
  34. #endif

源文件


  
  1. //
  2. // Created by w00371255 on 2020/11/17.
  3. //
  4. #include "unitest.h"
  5. #define MAXLINK 400
  6. #define N 100
  7. #define MAXLALERT (MAXLINK*2)
  8. static Link links[MAXLINK];
  9. static int linkNum;
  10. static Alert alerts[MAXLALERT];
  11. static int alertNum;
  12. void Init()
  13. {
  14. memset((void *)links, 0, sizeof(links));
  15. linkNum = N*3;
  16. alertNum = 0;
  17. for(int i=1; i<=linkNum; i++){
  18. links[i].linkType = i/N;
  19. links[i].chanId = i%N;
  20. links[i].linkstatus = i%2;
  21. links[i].dropRate = i%20;
  22. links[i].errorRate = i%20;
  23. links[i].shake = i%40;
  24. }
  25. }
  26. static int IsBadLink(Link link)
  27. {
  28. return link.linkstatus==0;
  29. }
  30. int overDropDeadLine[]={5,13,100};
  31. static int IsOverDropLink(Link link)
  32. {
  33. return link.dropRate>overDropDeadLine[link.linkType];
  34. }
  35. int overShakeDeadLine[]={20,19,11};
  36. static int IsOverShake(Link link)
  37. {
  38. return link.shake>overShakeDeadLine[link.linkType];
  39. }
  40. int overErrDeadLine[]={10,100,15};
  41. static int IsOverError(Link link)
  42. {
  43. return link.errorRate>overErrDeadLine[link.linkType];
  44. }
  45. static void Alertlink(Alert alert)
  46. {
  47. printf("alertId: %d, chanId: %d \n", alert.alertId, alert.chanId);
  48. if(alertNum<MAXLALERT) {
  49. alerts[alertNum++] = alert;
  50. }else{
  51. printf("too much alert!");
  52. }
  53. }
  54. Checker checker[]={
  55. {IsBadLink,{1,100,200}},
  56. {IsOverDropLink,{2,101,-1}},
  57. {IsOverShake,{3,102,201}},
  58. {IsOverError,{4,-1,202}}
  59. };
  60. static void CheckALink(Link link)
  61. {
  62. Alert alert;
  63. alert.chanId=link.chanId;
  64. int checkerNum=sizeof(checker)/sizeof(checker[0]);
  65. for(int i=0;i<checkerNum;i++) {
  66. if (checker[i].checkFunc(link)) {
  67. alert.alertId = checker[i].alertId[link.linkType];
  68. Alertlink(alert);
  69. }
  70. }
  71. }
  72. void CheckLinks()
  73. {
  74. int len=N*LINKTYPENUM/5;
  75. for(int i=0;i<len;i++){
  76. CheckALink(links[i*5+1]);
  77. }
  78. }
  79. int getAlertNum()
  80. {
  81. return alertNum;
  82. }

测试


  
  1. TEST(MockCppTest, checkLinks) {
  2. Init();
  3. CheckLinks();
  4. ASSERT_EQ(getAlertNum(),96);
  5. }

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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