目录
分布式请求链路追踪_SkyWalking网络钩子Webhooks
分布式请求链路追踪_SkyWalking钉钉告警
分布式请求链路追踪_SkyWalking邮件告警
分布式请求链路追踪_SkyWalking网络钩子Webhooks
Wbhooks网络钩子
Webhok可以简单理解为是一种Web层面的回调机制。告警就是一个事件,当事件发生时Skywalking会主动调用一个配置好的接口, 这个接口就是所谓的Webhook;
注意:
Skywalking的告警消息会通过借HTTP请求进行发送,请求方法为 POST (Content-Type 为application/json。其JSON数据实基于List进行序列化的。
JSON数据示例
[{
"scopeId": 1,
"scope": "SERVICE",
"name": "serviceA",
"id0": "12",
"id1": "",
"ruleName": "service_resp_time_rule",
"alarmMessage": "alarmMessage xxxx",
"startTime": 1560524171000
}]
创建项目cloud-alarm9090
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
创建接收实体类AlarmMessageDto
https://github.com/apache/skywalking/blob/v8.5.0/docs/en/set up/backend/backend-alarm.md
import lombok.Data;
@Data
public class AlarmMessageDto {
private int scopeId;
private String scope;
private String name;
private String id0;
private String id1;
private String ruleName;
private String alarmMessage;
private List<Tag> tags;
private long startTime;
private transient int period;
private transient boolean onlyAsCondition;
@Data
public static class Tag{
private String key;
private String value;
}
}
编写钩子接口
/**
* 订单机器人通知的
*/
@PostMapping("dingding")
public void sendDinding(@RequestBody List<AlarmMessageDto> alarmMessageDtoList) {
StringBuilder builder = new StringBuilder();
alarmMessageDtoList.forEach(info ->
{
builder.append("\nscopeId:").append(info.getScopeId())
.append("\nScope实体:").append(info.getScope())
.append("\n告警消息:").append(info.getAlarmMessage())
.append("\n告警规则:").append(info.getRuleName())
.append("\n\n------------------------\n\n");
});
}
配置网络钩子
alarm-settings.yml 增加alarm接口
回调失败
关闭windows防火墙
搜索防火墙
关闭防火墙
实时效果反馈
1.Webhok可以简单理解为是一种Web层面的_____机制。
A 回调
B 请求
C 告警
D 以上都是错误
分布式请求链路追踪_SkyWalking钉钉告警
前言
缺点: 实际项目中,我们不会一直看着告警菜单。希望有告警信息产生时,将告警信息通过邮件或者短信发送给相关负责人。
钉钉告警
创建群聊
添加智能助手
添加机器人
选择机器人
配置加签
POM引入钉钉工具包依赖
<!--钉钉工具包-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
<version>2.0.0</version>
</dependency>
创建application.yml
server:
port: 9090
dingding:
#地址
webhook: https://oapi.dingtalk.com/robot/send?access_token=7915a428336dd933247d019420032bb72e920f459920cc581c42c61d46da7e46
#密钥
secret: SECa38500986415fc1404ad36415d8846f432db49936f9fb7f4d0ab5260e69ca82e
编写发送接口
@Slf4j
@RestController
@RequestMapping("alarm")
public class AlarmController {
@Value("${dingding.webhook}")
private String webhook;
@Value("${dingding.secret}")
private String secret;
/**
* 钉钉机器人通知
* @param alarmMessageList
*/
@PostMapping("pushData")
public void alarm(@RequestBody
List<AlarmMessageDto> alarmMessageList) {
log.info("alarmMessage:{}", alarmMessageList.toString());
alarmMessageList.forEach(info -> {
try {
// 当前时间戳
Long timestamp = System.currentTimeMillis();
String stringToSign = timestamp + "\n" + secret;
/**
* Mac算法是带有密钥的消息摘要算法
* 初始化HmacMD5摘要算法的密钥产生器
*/
Mac mac = Mac.getInstance("HmacSHA256");
// 初始化mac
mac.init(new SecretKeySpec(secret.getBytes("UTF-8"),"HmacSHA256"));
// 执行消息摘要
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
// 拼接签名
String sign = "×tamp=" + timestamp + "&sign=" + URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
// 构建钉钉发送客户端工具
DingTalkClient client = new DefaultDingTalkClient(webhook + sign);
// 设置消息类型
OapiRobotSendRequest request = new OapiRobotSendRequest();
request.setMsgtype("text");
// 设置告警信息
OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
text.setContent("业务告警:\n" + info.getAlarmMessage());
request.setText(text);
// 接受人
OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
at.setAtMobiles(Arrays.asList("所有人"));
request.setAt(at);
OapiRobotSendResponse response = client.execute(request);
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
分布式请求链路追踪_SkyWalking邮件告警
邮件发送原理
SMTP 协议全称为 Simple Mail Transfer Protocol,译作简单邮件传输协议,它定义了邮件客户端软件与 SMTP 服务器之间,以及 SMTP 服务器与 SMTP 服务器之间的通信规则。
授权过程
所以在使用springboot发送邮件之前,要开启POP3和SMTP协议, 需要获得邮件服务器的授权码,这里以qq邮箱为例,展示获取授权码的过程:
成功后会出现
POM引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置邮箱基本信息
spring:
mail:
# 配置 SMTP 服务器地址
host: smtp.qq.com
# 发送者邮箱
username: 877910962@qq.com
# 配置密码,注意不是真正的密码,而是刚刚申请到的授权码
password: izkmheghgpvmbfeg
# 默认的邮件编码为UTF-8
default-encoding: UTF-8
properties:
mail:
smtp:
#需要验证用户名密码
auth: true
starttls:
# 设置为配置SMTP连接的属性。要使用STARTTLS,必须设置以下属性
enable: true
required: true
注意:
1、126邮箱SMTP服务器地址:smtp.126.com,端口号:465或者994
2、163邮箱SMTP服务器地址:smtp.163.com,端口号:465或者994
3、yeah邮箱SMTP服务器地址:smtp.yeah.net,端口号:465或者994
4、qq邮箱SMTP服务器地址:smtp.qq.com,端口号465或587
编写接口
@GetMapping("sendMail")
public void sendEmail(@RequestBody List<AlarmMessage> alarmMessages) {
alarmMessages.forEach(info->{
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
// 发件人
simpleMailMessage.setFrom("877910962@qq.com");
// 收件人
simpleMailMessage.setTo("877910962@qq.com");
// 邮件主题
simpleMailMessage.setSubject(info.getScope());
// 邮件内容
simpleMailMessage.setText(info.getAlarmMessage());
javaMailSender.send(simpleMailMessage);
});
}
实时效果反馈 1.简单的邮件协议_____。
A RPC
B HTTP
C TCP
D SMTP