Pinpoint 設定微信或者釘釘預警
阿新 • • 發佈:2020-11-25
> 本文基於 Pinpoint 2.1.0 版本 本文大部分內容來自:[俠夢的開發筆記](https://mp.weixin.qq.com/s/c8NOhRxAaAi_LmnxM9Eysw) ,但是原文的版本和我的不一致,放在2.1.0是跑不起來的,但是大概邏輯和思路基本一致。
[toc]
## 一、接入預警大概思路
> 官方預警相關文件: https://pinpoint-apm.github.io/pinpoint/2.1.0/alarm.html
在pinpoint 2.X中引入了預設的告警實現類`DefaultAlarmMessageSender`。所以我們只需要實現簡訊傳送的介面即可。
![img](https://mmbiz.qpic.cn/mmbiz_png/xicWYTSICzRtXKNOZAcu59nu2xAxD3D2WddvKQx9uanNwOTSsFAK15mRsiaJwh2c7pnpF7jE95dqOX6DWianNXY9A/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
上述類封裝了傳送郵件和簡訊的方法,目前簡訊方法的實現仍是空,不過列印了一句話。
```
logger.info("can not send sms message.");
```
然而,郵件傳送是有一個實現類來幫我們做告警郵件傳送的。他就是:SpringSmtpMailSender。
我們接入預警的大概思路就是實現簡訊傳送,然後當簡訊傳送的時候,呼叫我們寫的模組,然後實現微信/釘釘預警。 微信釘釘預警都是通過一個介面給到我們進行呼叫即可。下面我就說說微信預警(釘釘預警一致)。
我們接入微信預警分為三大塊:
1. 加入 微信預警模組
2. 將呼叫 簡訊傳送改成呼叫 微信預警
3. 增加一個 bean 引入配置
4. 配置檔案增加微信預警URL 配置
## 二、具體實現
### 2.1、加入預警模組
將這個`Pinpoint2DingTalkSmsSender.java` 檔案加入到`/web/src/main/java/com/navercorp/pinpoint/web/alarm`
檔案內容如下所示。
```java
package com.navercorp.pinpoint.web.alarm;
import com.navercorp.pinpoint.web.alarm.checker.AlarmChecker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.StepExecution;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class Pinpoint2DingTalkSmsSender implements SmsSender {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void sendSms(AlarmChecker checker, int sequenceCount, StepExecution stepExecution) {
if(StringUtils.isEmpty(dingTalkUrl)){
logger.warn("web.ding.talk.url is not set!");
return;
}
List smsMessage = checker.getSmsMessage();
String textMsg = String.join("\r\n", smsMessage);
send(textMsg);
}
@Autowired
private RestTemplate restTemplate;
private String dingTalkUrl;
private static String DING_ALARM_PREFIX= "【告警】";
public Pinpoint2DingTalkSmsSender(){
logger.info("init DingTalkSmsSender,{}",dingTalkUrl);
}
public void send(String textMsg){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
Map map = dingMap(textMsg);
HttpEntity