目录
3.1更新pinpoint MYSQL的alarm_rule表
3.3 pinpoint-web,pinpoint-batch配置
一、相关说明
1.1 Slack-receiver:
GitHub - doll6777/slack-receiver
1.2 飞书自定义机器人说明(采用的是发送消息卡片):
1.3 pinpoint官方说明:
pinpoint/alarm.md at 2.3.x · pinpoint-apm/pinpoint · GitHub
二、部署pinpoint2.3.3
2.1 pinpoint-web和pinpoint-collector部署可参考网上其他大佬:
https://xdong.blog.youkuaiyun.com/article/details/123180298
2.2 pinpoint-batch带邮件告警通知的部署可看我另篇:
https://blog.youkuaiyun.com/zouzou_888/article/details/130414531
三、 部署监控告警信息飞书推送
3.1更新pinpoint MYSQL的alarm_rule表
在pinpoint MYSQL的alarm_rule表中添加webhook_send列
ALTER TABLE alarm_rule ADD COLUMN webhook_send CHAR(1)DEFAULT NULL;
3.2 部署slack-receiver
Slack-receiver项目环境要求:
Java 1.8
Spring Boot
1)从 GitHub 上将 slack-receiver项目的代码克隆到本地
2)修改application.properties配置
文件目录:slack-receiver/src/main/resources/application.properties
配置信息:
#服务端口
server.port=8085
#飞书的webhook地址
slack.incoming.webhook.url=飞书webhook-url
3)改写SlackNotifier.java实现飞书消息推送
文件目录:slack-receiver/src/main/java/com/webhook/receiver/slack/sender/SlackNotifier.java
package com.webhook.receiver.slack.sender;
import com.webhook.receiver.slack.vo.WebhookPayload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
public class SlackNotifier implements Notifier {
private final Logger logger = LoggerFactory.getLogger(SlackNotifier.class.getName());
private final RestTemplate restTemplate;
private final String incomingWebhookUrl;
@Autowired
public SlackNotifier(RestTemplate restTemplate, @Value("${slack.incoming.webhook.url}") final String incomingWebhookUrl) {
this.restTemplate = restTemplate;
this.incomingWebhookUrl = incomingWebhookUrl;
}
public boolean send(WebhookPayload webhookPayload) {
Date currentDate = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
String formattedDate = dateFormat.format(currentDate);
// 拼接pinpoint当前应用服务的url地址
String pinpoint_url = webhookPayload.getPinpointUrl()+"/main/"+webhookPayload.getApplicationId()+"@SPRING_BOOT/5m/" + formattedDate;
// 推送给飞书自定义机器人的消息卡片json数据
String jsonMessage = "{\"msg_type\":\"interactive\",\"card\":{\"elements\":[{\"tag\":\"div\",\"text\":{\"content\":\""
+ "**["+webhookPayload.getApplicationId()+"]**"
+ " 应用服务:" + webhookPayload.getApplicationId()
+ " 告警规则:" + webhookPayload.getChecker().getName()
+ " 告警阈值:" + webhookPayload.getThreshold().toString()
+ " 告警值(过去5分钟内):" + webhookPayload.getChecker().getDetectedValueString()
+ "\",\"tag\":\"lark_md\"}},{\"actions\":[{\"tag\":\"button\",\"text\":{\"content\":\""
+ "pinpoint链接\",\"tag\":\"lark_md\"},\"url\":\""
+ pinpoint_url + "\",\"type\":\"default\",\"value\":{}}],\"tag\":\"action\"}],\"header\":{\"title\":{\"content\":\""
+ webhookPayload.getNotes() + "\",\"tag\":\"plain_text\"}}}}";
try {
URL obj = new URL(incomingWebhookUrl);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
// 设置 POST 请求头信息
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
// 将请求体写入 HttpURLConnection 对象中
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.write(jsonMessage.getBytes("UTF-8"));
wr.flush();
wr.close();
int responseCode = con.getResponseCode();
System.out.println("Response Code : " + responseCode);
// 获取响应结果
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
// 打印响应结果
//logger.info("Sent slack message to {}", incomingWebhookUrl);
logger.info("Response Body : " + response.toString());
} catch (IOException e) {
logger.error(e.getMessage());
return false;
} catch (Exception e) {
logger.error(e.getMessage());
return false;
}
return true;
}
}
4)项目打包
cd slack-receiver
./mvnw package
或者(查看编译过程)
./mvnw -X package
在编译过程中,会出现测试无法通过,需要注释掉部分test的代码
目录:slack-receiver/src/test/java/com/webhook/receiver/slack/sender/SlackNotifierTest.java
将下面的代码进行注释,然后再进行编译
// @Test
// void sendSuccess() {
// when(restTemplate.postForObject(any(URI.class), any(SlackPayload.class), eq(String.class))).thenReturn("");
// slackNotifier = new SlackNotifier(restTemplate, "http://webhook.send.com");
// WebhookPayload payload = new WebhookPayload("pinpointUrl", "release", "applicationId", "serviceType", new UserGroup("userGroupId", new ArrayList<>()), new LongValueAlarmChecker(1L), "%", 1, "", 1);
// boolean result = slackNotifier.send(payload);
// Assertions.assertTrue(result);
// }
编译成功后,在target目录找到对应的jar包:slack-receiver-0.0.1-SNAPSHOT.jar
5) 启动slack-receiver服务
在需部署的jar包目录新增logs和conf目录
在conf目录新增本地的配置文件:slack.properties
新增配置文件后,在启动时可引用该配置文件中的配置,灵活配置服务的端口和webhook地址
配置文件内容:
#服务端口
server.port=8085
#webhook地址
#slack.incoming.webhook.url=飞书webhook-url
#启动脚本(在jar包的目录下):
nohup java -Dlog.dir=/opt/slack-receiver/logs/ -Dspring.config.additional-location=/opt/slack-receiver/conf/slack.properties -jar slack-receiver-0.0.1-SNAPSHOT.jar >/opt/slack-receiver/logs/slack-receiver.log 2>&1 &
#停服务脚本:
ps -ef | grep slack-receiver | grep -v grep | awk '{print $2}' | xargs kill -9
启动成功后slack-receiver调用链接:
http://localhost:8085/api/send/slack
返回code说明:
description | code |
send success | 200 |
send fail | 500 |
wrong type | 400 |
3.3 pinpoint-web,pinpoint-batch配置
pinpoint-web配置文件新增配置:
webhook.enable=true
pinpoint-batch配置文件新增配置:
webhook.enable=true
3.4 告警消息推送配置
1) 配置每个application的slack-receiver项目地址,用于消息推送。目前一个slack-receiver项目对应一个飞书自定义机器人地址,可部署多个项目来对应多个自定义机器人webhook地址。
2)配置监控告警,Type选项可以选项ALL,也可单独新增一个webhook告警项,配置时需勾选对应的webhook地址,Notes内容为飞书的标题。
3)飞书消息推送效果