亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中的SkyWalking監(jiān)控告警詳解

 更新時間:2023年11月06日 10:09:04   作者:楊小胖要減肥  
這篇文章主要介紹了Java中的SkyWalking監(jiān)控告警詳解,SkyWalking在6.x版本中新增了告警功能,其核心在于config/alarm-settings.yaml文件中,該文件分為rules和webhooks兩部分,需要的朋友可以參考下

SkyWalking監(jiān)控告警

SkyWalking在6.x版本中新增了告警功能,其核心在于config/alarm-settings.yaml文件中,該文件分為rules和webhooks兩部分。

rules用于定義告警的條件,webhook則用于定于告警觸發(fā)時,需要通知哪些服務。

告警規(guī)則配置項的說明:

  • **Rule name:**規(guī)則名稱,也是在告警信息中顯示的唯一名稱。必須以_rule結(jié)尾,前綴可自定義
  • **Metrics name:**度量名稱,取值為oal腳本中的度量名,目前只支持long、double和int類型。詳見 Official OAL script
  • **Include names:**該規(guī)則作用于哪些實體名稱,比如服務名,終端名(可選,默認為全部)
  • **Exclude names:**該規(guī)則作不用于哪些實體名稱,比如服務名,終端名(可選,默認為空)
  • **Threshold:**閾值
  • OP: 操作符,目前支持 >、<、=
  • **Period:**多久告警規(guī)則需要被核實一下。這是一個時間窗口,與后端部署環(huán)境時間相匹配
  • **Count:**在一個Period窗口中,如果values超過Threshold值(按op),達到Count值,需要發(fā)送警報
  • **Silence period:**在時間N中觸發(fā)報警后,在TN -> TN + period這個階段不告警。 默認情況下,它和Period一樣,這意味著相同的告警(在同一個Metrics name擁有相同的Id)在同一個Period內(nèi)只會觸發(fā)一次
  • **message:**告警消息

webhook會在觸發(fā)告警時,向配置的地址發(fā)送http POST請求,并將Content-Type為application/json,也就是說會發(fā)送json格式的POST請求。

webhooks發(fā)送的字段包含

  • **scopeId、scope
  • **name:**目標 Scope 的實體名稱
  • **id0:**Scope 實體的 ID
  • **id1:**保留字段,目前暫未使用
  • **ruleName:**告警規(guī)則名稱
  • **alarmMessage:**告警消息內(nèi)容
  • **startTime:**告警時間,格式為時間戳
  • **tags:**alarm-settings.yml中配置的tags

具體字段類型可以參考官方定義的AlarmMessage

由于郵件系統(tǒng)之前的通訊方式都是基于MQ進行的,所以需要定義一個Controller,用于接收Skywalking的請求,官方給出的請求數(shù)據(jù)示例為

[{
  "scopeId": 1, 
  "scope": "SERVICE",
  "name": "serviceA", 
  "id0": "12",  
  "id1": "",  
    "ruleName": "service_resp_time_rule",
  "alarmMessage": "alarmMessage xxxx",
  "startTime": 1560524171000,
    "tags": [{
        "key": "level",
        "value": "WARNING"
     }]
}, {
  "scopeId": 1,
  "scope": "SERVICE",
  "name": "serviceB",
  "id0": "23",
  "id1": "",
    "ruleName": "service_resp_time_rule",
  "alarmMessage": "alarmMessage yyy",
  "startTime": 1560524171000,
    "tags": [{
        "key": "level",
        "value": "CRITICAL"
    }]
}]

所以可以定義接口為

@PostMapping("/skywalking/alarm")
public void alarm(@RequestBody List<SkyWalkingAlarmMessage> alarmList) {
  ......
  ......
}

接收到數(shù)據(jù)之后,如果不為空,就可以組裝郵件發(fā)送給配置的相關開發(fā)或運維人員。

定義SkyWalking郵件的相關配置

@Data
@RefreshScope
@Configuration
@ConfigurationProperties(prefix = "alarm")
public class AlarmMailConfig {

    private AlarmMailInfo skyWalking;

    @Data
    public static class AlarmMailInfo{
      	/**
      	 * 發(fā)件昵稱
      	 */
        private String nickName;
      	/**
      	 * 收件地址
      	 */
        private List<String> toAddress;
      	/**
      	 * 是否轉(zhuǎn)義告警字段
      	 */
        private boolean translateField = true;
    }
}

定義告警字段的中文映射

enum Mapping{
    scopeId("scopeId"),
    scope("scope"),
    name("目標Scope的實體名稱"),
    id0("Scope實體的ID"),
    id1("id1"),
    ruleName("警告規(guī)則名稱"),
    alarmMessage("告警消息內(nèi)容"),
    startTime("告警時間"),
    tags("tags")
    ;
     private String fieldName;

    Mapping(String fieldName) {
        this.fieldName = fieldName;
    }
    private static final Map<String,String> cacheMap =
            Arrays.stream(Mapping.values()).collect(Collectors.toMap(Enum::name, e->e.fieldName));

}

定義SkyWalking的處理Controller

@Slf4j
@RestController
public class AlarmMailController {
	 // 時間格式化pattern
   public static final String TIME_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";
   // 發(fā)送郵件Service
   @Autowired
   private SendMailService sendMailService;
   // 告警郵件配置
   @Autowired
   private AlarmMailConfig alarmMailConfig;
   // 通過反射獲取請求字段的字段名
   private final List<String> skyWalkingAlarmMessageFieldName =
         ReflectUtils.getAllNoStaticFieldList(SkyWalkingAlarmMessage.class).stream().map(Field::getName)
               .collect(Collectors.toList());

   @PostMapping("/skywalking/alarm")
   public void alarm(@RequestBody List<SkyWalkingAlarmMessage> alarmList) {
      log.info("接收到skywalking監(jiān)控調(diào)用");
      if (CollectionUtil.isEmpty(alarmList)) {
         log.info("監(jiān)控調(diào)用為空");
         return;
      }
      SendMailRequest sendMailRequest = fillSkyWalkingMailRequest(alarmList);
      sendMailService.sendCustomizeMail(sendMailRequest);
   }

   private SendMailRequest fillSkyWalkingMailRequest(List<SkyWalkingAlarmMessage> alarmList) {
      SendMailRequest sendMailRequest = new SendMailRequest();
     	// 設置主題
      sendMailRequest.setSubject("SkyWalking監(jiān)控郵件");
     	// 定義請求的系統(tǒng)
      sendMailRequest.setSystemMark("SkyWalking");
      sendMailRequest.setRequestTime(LocalDateTime.now());

      AlarmMailConfig.AlarmMailInfo skyWalkingConfig = alarmMailConfig.getSkyWalking();
     	// 發(fā)件人昵稱
      sendMailRequest.setSenderNickname(skyWalkingConfig.getNickName());
     	// 收件人地址
      sendMailRequest.setToAddress(skyWalkingConfig.getToAddress());
     	// 郵件主題是否為html格式
      sendMailRequest.setHtmlText(true);
     	// 添加默認的免責聲明
      sendMailRequest.setAddDefaultDisclaimer(true);
     	// 生成郵件正文
      String mailBody = fillSkyWalkingAlarmMessage(alarmList);
      sendMailRequest.setContentText(mailBody);
      return sendMailRequest;
   }

   private String fillSkyWalkingAlarmMessage(List<SkyWalkingAlarmMessage> alarmList) {
      AlarmMailConfig.AlarmMailInfo skyWalkingConfig = alarmMailConfig.getSkyWalking();
      String mailBody = alarmList.stream().map(message -> skyWalkingAlarmMessageFieldName.stream().map(field -> {
         Object value;
         // 如果參數(shù)是startTime
         if (StringUtils.equals(field, "startTime")) {
            Long startTime = message.getStartTime();
           	// 如果為空
            if (startTime == null) {
               // 展示數(shù)據(jù)為空
               value = StringUtils.EMPTY;
            } else {
               // 否則進行格式化便于展示
               value = DateUtils.format(DateUtils.getDate(startTime), TIME_PATTERN);
            }
          // 如果是tags字段
         } else if (StringUtils.equals(field, "tags")) {
            List<SkyWalkingAlarmMessage.Tag> tags = message.getTags();
            if (CollectionUtil.isEmpty(tags)) {
               value = StringUtils.EMPTY;
            } else {
               // 進行拼接
               value = tags.stream().map(v -> v.getKey() + ":" + v.getValue())
                     .collect(Collectors.joining(";
", "[", "]"));
            }
         } else {
           	// 直接獲取屬性值
            value = ReflectUtils.getFieldValue(message, field);
         }
         // 是否需要翻譯告警字段
         boolean translateField = skyWalkingConfig.isTranslateField();
         if (translateField){
           	// 拼接翻譯字段的和對應的值
            return SkyWalkingAlarmMessage.getFieldName(f) + ":" + value;
         }else {
           // 拼接字段和對應的值
            return f + ":" + value;
         }
      }).collect(Collectors.joining("
"))).collect(Collectors.joining("

<HR>

"));
      return mailBody;
   }
}

到此這篇關于Java中的SkyWalking監(jiān)控告警詳解的文章就介紹到這了,更多相關SkyWalking監(jiān)控告警內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一篇文章帶你了解XGBoost算法

    一篇文章帶你了解XGBoost算法

    XGBoost全名叫(eXtreme Gradient Boosting)極端梯度提升,經(jīng)常被用在一些比賽中,其效果顯著。它是大規(guī)模并行boosted tree的工具,它是目前最快最好的開源boosted tree工具包
    2021-08-08
  • SpringBoot中使用MyBatis-Plus詳細步驟

    SpringBoot中使用MyBatis-Plus詳細步驟

    MyBatis-Plus是MyBatis的增強工具,簡化了MyBatis的使用,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • java迭代器中刪除元素的實例操作詳解

    java迭代器中刪除元素的實例操作詳解

    在本篇內(nèi)容里小編給各位分享了一篇關于java迭代器中刪除元素的實例操作詳解內(nèi)容,有興趣的朋友們可以學習下。
    2021-01-01
  • Springboot深入講解nocos的整合與使用

    Springboot深入講解nocos的整合與使用

    Nacos?是阿里巴巴推出來的一個新開源項目,這是一個更易于構(gòu)建云原生應用的動態(tài)服務發(fā)現(xiàn)、配置管理和服務管理平臺,在項目開發(fā)過程中,我們經(jīng)常使用nacos作為配置中心和注冊中心。本文章我們就從代碼層面研究下springboot是如何整合nacos使用的
    2022-07-07
  • 打開.properties中文顯示unicode編碼問題以及解決

    打開.properties中文顯示unicode編碼問題以及解決

    這篇文章主要介紹了打開.properties中文顯示unicode編碼問題以及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Springboot集成Mybatis-plus、ClickHouse實現(xiàn)增加數(shù)據(jù)、查詢數(shù)據(jù)功能

    Springboot集成Mybatis-plus、ClickHouse實現(xiàn)增加數(shù)據(jù)、查詢數(shù)據(jù)功能

    本文給大家講解Springboot + mybatis-plus 集成ClickHouse,實現(xiàn)增加數(shù)據(jù)、查詢數(shù)據(jù)功能,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Java排序算法之選擇排序代碼實例

    Java排序算法之選擇排序代碼實例

    這篇文章主要介紹了Java排序算法之選擇排序代碼實例,從數(shù)組的第一個元素開始,每次遍歷數(shù)組找出一個最小值放在最左側(cè),第二次從第二個元素開始,依次類推,直到起始元素為數(shù)組的倒數(shù)第二個元素時,直接和最后一個元素比較,較小值放左邊,完成排序,需要的朋友可以參考下
    2023-11-11
  • Java SPI模塊化解耦的技術指南

    Java SPI模塊化解耦的技術指南

    Java 的 Service Provider Interface (SPI) 是一種提供模塊化和擴展性的方法,使得程序能夠通過動態(tài)加載服務實現(xiàn)類來實現(xiàn)解耦,本文將詳細介紹 Java SPI 的機制、應用場景及實現(xiàn)步驟,并通過示例代碼展示如何使用 SPI,需要的朋友可以參考下
    2025-03-03
  • Java線程同步方法實例總結(jié)

    Java線程同步方法實例總結(jié)

    這篇文章主要介紹了Java線程同步方法,結(jié)合實例形式總結(jié)分析了Java線程同步、并發(fā)控制相關實現(xiàn)方法及操作注意事項,需要的朋友可以參考下
    2018-08-08
  • 關于SpringSecurity簡介以及和Shiro的區(qū)別

    關于SpringSecurity簡介以及和Shiro的區(qū)別

    這篇文章主要介紹了關于SpringSecurity簡介以及和Shiro的區(qū)別,在Java應用安全領域,Spring Security會成為被首先推崇的解決方案,就像我們看到服務器就會聯(lián)想到Linux一樣順理成章,需要的朋友可以參考下
    2023-07-07

最新評論