最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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ā)時,需要通知哪些服務(wù)。

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

  • **Rule name:**規(guī)則名稱,也是在告警信息中顯示的唯一名稱。必須以_rule結(jié)尾,前綴可自定義
  • **Metrics name:**度量名稱,取值為oal腳本中的度量名,目前只支持long、double和int類型。詳見 Official OAL script
  • **Include names:**該規(guī)則作用于哪些實體名稱,比如服務(wù)名,終端名(可選,默認為全部)
  • **Exclude names:**該規(guī)則作不用于哪些實體名稱,比如服務(wù)名,終端名(可選,默認為空)
  • **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ā)送給配置的相關(guān)開發(fā)或運維人員。

定義SkyWalking郵件的相關(guān)配置

@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();
     	// 設(shè)置主題
      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){
           	// 拼接翻譯字段的和對應(yīng)的值
            return SkyWalkingAlarmMessage.getFieldName(f) + ":" + value;
         }else {
           // 拼接字段和對應(yīng)的值
            return f + ":" + value;
         }
      }).collect(Collectors.joining("
"))).collect(Collectors.joining("

<HR>

"));
      return mailBody;
   }
}

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

相關(guān)文章

  • JAVA獲取本地MAC地址的方法

    JAVA獲取本地MAC地址的方法

    這篇文章主要介紹了JAVA獲取本地MAC地址的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 一文詳解Spring Security的基本用法

    一文詳解Spring Security的基本用法

    Spring Security是一個功能強大且高度可定制的身份驗證和訪問控制框架, 提供了完善的認證機制和方法級的授權(quán)功能。本文將通過一個簡單的案例了解一下Spring Security的基本用法,需要的可以參考一下
    2022-05-05
  • java?讀寫?ini?配置文件的示例代碼

    java?讀寫?ini?配置文件的示例代碼

    這篇文章主要介紹了java?讀寫?ini?配置文件,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • Java中的@PreAuthorize注解使用詳解

    Java中的@PreAuthorize注解使用詳解

    這篇文章主要介紹了Java中的@PreAuthorize注解使用詳解,@PreAuthorize注解會在方法執(zhí)行前進行權(quán)限驗證,支持Spring EL表達式,它是基于方法注解的權(quán)限解決方案,需要的朋友可以參考下
    2023-10-10
  • Java設(shè)計模式之裝飾模式原理與用法實例詳解

    Java設(shè)計模式之裝飾模式原理與用法實例詳解

    這篇文章主要介紹了Java設(shè)計模式之裝飾模式原理與用法,結(jié)合實例形式詳細分析了裝飾模式的概念、原理、定義與使用方法,并總結(jié)分析了裝飾模式的優(yōu)缺點,具有一定參考借鑒價值,需要的朋友可以參考下
    2018-04-04
  • Java實現(xiàn)簡易購物系統(tǒng)

    Java實現(xiàn)簡易購物系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡易購物系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 一起來學習Java的棧和隊列

    一起來學習Java的棧和隊列

    這篇文章主要為大家詳細介紹了Java的棧和隊列,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • IDEA無法識別相關(guān)module模塊問題的解決過程

    IDEA無法識別相關(guān)module模塊問題的解決過程

    這篇文章主要給大家介紹了關(guān)于IDEA無法識別相關(guān)module模塊問題的解決過程,文中通過圖文介紹的非常詳細,對大家學習或者使用IDEA具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Java 8中Stream API的這些奇技淫巧!你Get了嗎?

    Java 8中Stream API的這些奇技淫巧!你Get了嗎?

    這篇文章主要介紹了Java 8中Stream API的這些奇技淫巧!你Get了嗎?文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • MybatisPlusPro讓CURD開發(fā)效率直接拉滿

    MybatisPlusPro讓CURD開發(fā)效率直接拉滿

    MybatisPlusPro 的出現(xiàn),徹底改變了我對 CURD 開發(fā)的認知,它不僅讓代碼量大幅減少,還通過各種高級特性和性能優(yōu)化,讓開發(fā)變得更加優(yōu)雅和高效
    2026-06-06

最新評論

越西县| 长兴县| 犍为县| 正安县| 高邑县| 山阴县| 安达市| 承德县| 宣化县| 阜新市| 伊宁县| 宕昌县| 河源市| 浦江县| 彰化市| 射洪县| 南阳市| 壶关县| 绿春县| 建阳市| 新闻| 临沧市| 深圳市| 阿荣旗| 玛沁县| 菏泽市| 灌南县| 江川县| 繁峙县| 泸州市| 天津市| 新干县| 绵竹市| 伊宁市| 太湖县| 兴文县| 中阳县| 青岛市| 墨竹工卡县| 如皋市| 临湘市|