pinpoint2.5.0环境搭建监控预警钉钉推送
Posted 逗.你玩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pinpoint2.5.0环境搭建监控预警钉钉推送相关的知识,希望对你有一定的参考价值。
1. 环境准备
- jdk :jdk8,JDk11
- hbase: habse-1.7.2 需与hbase-client版本一致,pinpoint-2.5.0使用的hbase-client版本为1.7.2
- hbase初始化脚本:hbase-create.hbase
- pinpoint-collect(监控采集服务-jdk11):pinpoint-collector-boot-2.5.0.jar
- pinpoint-web(监控管理服务-jdk11): pinpoint-web-boot-2.5.0.jar
- pinpoint-agent(监控采集代理-jdk8):pinpoint-agent-2.5.0.tar.gz
- pinpoint-batch(监控Aram管理服务-jdk11):pinpoint-batch-2.5.0.jar
- slack-receiver(监控预警信息推送服务-jdk8):webhook推送服务
- mysql数据库:aram功能需要
2.部署步骤
1.先安装jdk
hbase使用jdk8即可,但pinpoint-collector-2.5.0及pinpoint-web-2.5.0需要jdk11才能运行
2.安装hbase-1.7.2
安装hbase步骤
#解压安装包
tar -zxvf hbase-1.7.2-bin.tar.gz
#进入配置目录
cd /data/hbase/hbase-1.7.2/conf
修改hbase-site.xml 相关配置
#进入命令目录
cd /hbase-1.7.2/bin
#启动hbase
./start-hbase.sh
#初始化hbase
./hbase shell /x/x/hbase-create.hbase
hbase配置文件
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///data/hbase/data</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>false</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>./tmp</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
</configuration>
3.部署pinpoint-collector
- 环境依赖:JDK11
部署文件目录
准备配置文件:/config/collector.properties
spring.profiles.active=release
pinpoint.zookeeper.address=172.16.XX.XX
collector.receiver.grpc.agent.port=9999
collector.receiver.stat.udp.receiveBufferSize=4194304
准备启动脚本:start_collector.sh
#!/bin/bash
appName=$2
param="-Dspring.config.additional-location=./config/collector.properties"
jdkPath=/usr/lib/java-11/jdk-11/bin
# JVM="-XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Xms512m -Xmx1G"
JVM=""
logPath="./logs/app.log"
if [ -z $appName ];then
appName=`ls -t |grep .jar$ |head -n1`
fi
function start()
count=`ps -ef |grep java|grep $appName|wc -l`
if [ $count != 0 ];then
echo "Maybe $appName is running, please check it..."
else
echo "The $appName is starting..."
nohup $jdkPath/java -jar $param $JVM ./$appName > $logPath 2>&1 &
fi
function stop()
appId=`ps -ef |grep java|grep $appName|awk 'print $2'`
if [ -z $appId ];then
echo "Maybe $appName not running, please check it..."
else
echo "The $appName is stopping..."
kill $appId
fi
function restart()
# get release version
releaseApp=`ls -t |grep .jar$ |head -n1`
# get last version
lastVersionApp=`ls -t |grep .jar$ |head -n2 |tail -n1`
appName=$lastVersionApp
stop
for i in 5..1
do
echo -n "$i "
sleep 1
done
echo 0
# backup
appName=$releaseApp
start
function status()
appId=`ps -ef |grep java|grep $appName|awk 'print $2'`
if [ -z $appId ]
then
echo -e "\\033[31m Not running \\033[0m"
else
echo -e "\\033[32m Running [$appId] \\033[0m"
fi
function usage()
echo "Usage: $0 start|stop|restart|status|stop -f"
echo "Example: $0 start"
exit 1
case $1 in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
usage;;
esac
启动服务
./start_collector.sh start
#停止服务
./start_collector.sh stop
4.部署pinpoint-web
- 环境依赖:JDK11
- 服务说明:监控管理服务,监控信息展示,监控预警规则管理等
- mysql数据库执行脚本:CreateTableStatement-mysql.sql,SpringBatchJobRepositorySchema-mysql.sql
部署文件目录
准备配置文件:config/web.properties
spring.profiles.active=release
pinpoint.zookeeper.address=172.16.xx.xx
cluster.zookeeper.sessiontimeout=10000
准备配置文件:config/jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/pinpoint?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456
准备服务启动脚本:start_web.sh
#!/bin/bash
appName=$2
param="-Dspring.config.additional-location=./config/web.properties,./config/jdbc.properties"
jdkPath=/usr/lib/java-11/jdk-11/bin
# JVM="-XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Xms512m -Xmx1G"
JVM=""
logPath="./logs/app.log"
if [ -z $appName ];then
appName=`ls -t |grep .jar$ |head -n1`
fi
function start()
count=`ps -ef |grep java|grep $appName|wc -l`
if [ $count != 0 ];then
echo "Maybe $appName is running, please check it..."
else
echo "The $appName is starting..."
nohup $jdkPath/java -jar $param $JVM ./$appName > $logPath 2>&1 &
fi
function stop()
appId=`ps -ef |grep java|grep $appName|awk 'print $2'`
if [ -z $appId ];then
echo "Maybe $appName not running, please check it..."
else
echo "The $appName is stopping..."
kill $appId
fi
function restart()
# get release version
releaseApp=`ls -t |grep .jar$ |head -n1`
# get last version
lastVersionApp=`ls -t |grep .jar$ |head -n2 |tail -n1`
appName=$lastVersionApp
stop
for i in 5..1
do
echo -n "$i "
sleep 1
done
echo 0
# backup
appName=$releaseApp
start
function status()
appId=`ps -ef |grep java|grep $appName|awk 'print $2'`
if [ -z $appId ]
then
echo -e "\\033[31m Not running \\033[0m"
else
echo -e "\\033[32m Running [$appId] \\033[0m"
fi
function usage()
echo "Usage: $0 start|stop|restart|status|stop -f"
echo "Example: $0 start"
exit 1
case $1 in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
usage;;
esac
启动服务
./start_web.sh start
#停止服务
./start_web.sh stop
5.部署pinpoint-agent
- 环境依赖:jdk8即可
- 将pinpoint-agent-2.5.0.tar.gz 解压至目标服务器
- 修改配置:pinpoint-agent-2.5.0/pinpoint-root.config
profiler.transport.module=GRPC
###########################################################
# gRPC Configuration #
###########################################################
profiler.transport.grpc.collector.ip=172.16.xx.xx
3.tomcat配置agent
编辑tomcat/bin/catalina.sh文件(linux)
#配置agent路径
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/temp/app/pinpoint-new/pinpoint-agent-2.5.0/pinpoint-bootstrap-2.5.0.jar"
#配置服务节点名称(注意同一服务底下不要重复)
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=demo-1"
#配置服务名称
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=demo-web"
#配置采样频率,1-100%,100-1%,区间1-100
CATALINA_OPTS="$CATALINA_OPTS -Dprofiler.sampling.percent.sampling-rate=1"
编辑tomcat/bin/catalina.bat文件(windows)
set CATALINA_OPTS=%CATALINA_OPTS% -javaagent:E:/ewell/pinpoint-agent-2.5.0/pinpoint-bootstrap-2.5.0.jar
set CATALINA_OPTS=%CATALINA_OPTS% -Dpinpoint.agentId=demoo-2
set CATALINA_OPTS=%CATALINA_OPTS% -Dpinpoint.applicationName=demo-web
set CATALINA_OPTS=%CATALINA_OPTS% -Dprofiler.sampling.percent.sampling-rate=1
正常启动tomcat即可
- springboot项目配置agent
#!/bin/bash
appName=$2
param="-Dspring.config.additional-location=./config/application.properties -javaagent:/app/pinpoint-agent-2.5.0/pinpoint-bootstrap-2.5.0.jar -Dpinpoint.agentId=demo-1 -Dpinpoint.applicationName=demo-web -Dprofiler.sampling.percent.sampling-rate=1"
# JVM="-XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Xms512m -Xmx1G"
JVM="-XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError -Xms2048m -Xmx2048m"
logPath="./logs/app.log"
if [ -z $appName ];then
appName=`ls -t |grep .jar$ |head -n1`
fi
function start()
count=`ps -ef |grep java|grep $appName|wc -l`
if [ $count != 0 ];then
echo "Maybe $appName is running, please check it..."
else
echo "The $appName is starting..."
nohup java -jar $param $JVM ./$appName > $logPath 2>&1 &
fi
function stop()
appId=`ps -ef |grep java|grep $appName|awk 'print $2'`
if [ -z $appId ];then
echo "Maybe $appName not running, please check it..."
else
echo "The $appName is stopping..."
kill $appId
fi
function restart()
# get release version
releaseApp=`ls -t |grep .jar$ |head -n1`
# get last version
lastVersionApp=`ls -t |grep .jar$ |head -n2 |tail -n1`
appName=$lastVersionApp
stop
for i in 5..1
do
echo -n "$i "
sleep 1
done
echo 0
# backup
appName=$releaseApp
start
function status()
appId=`ps -ef |grep java|grep $appName|awk 'print $2'`
if [ -z $appId ]
then
echo -e "\\033[31m Not running \\033[0m"
else
echo -e "\\033[32m Running [$appId] \\033[0m"
fi
function usage()
echo "Usage: $0 start|stop|restart|status|stop -f"
echo "Example: $0 start"
exit 1
case $1 in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
usage;;
esac
6. 部署pinpoint-batch
- 环境依赖:JDK11
- 服务说明:监控Aram管理服务,若需要自动推送监控预警信息则需要部署该服务
- 功能说明:该服务已内置邮件推送服务,以及标准webhook推送服务(具体webhook服务对接需自己拓展)
部署文件目录
准备配置文件:config/batch.properties
batch.server.env=release
pinpoint.zookeeper.address=172.16.xx.xx
#smtp config\\
#pinpoint-web服务地址(推送消息时需要)
pinpoint.url=http://172.16.xx.xx:8080
#邮箱服务地址
alarm.mail.server.url=smtp.xx.xx.com
#邮箱端口
alarm.mail.server.port=465
#邮箱账户名
alarm.mail.server.username=xxx@xxx.xx
#邮箱账户密码
alarm.mail.server.password=xxxx
#邮箱地址
alarm.mail.sender.address=xxx@xxx.xx
alarm.mail.transport.protocol=smtp
alarm.mail.smtp.port=25
alarm.mail.smtp.auth=true
alarm.mail.smtp.starttls.enable=false
alarm.mail.smtp.starttls.required=false
#邮箱SSl认证开关
alarm.mail.smtp.ssl.enable=true
alarm.mail.debug=true
# webhook开关,需要开启
webhook.enable=true
#flink server list
batch.flink.server=
batch.flink.rest.port=8081
#cleanup inactive agents job
job.cleanup.inactive.agents=false
# "0 0 3 * * WED" = 3:00 AM on every Wednesday.
# "0 0 0 10 * *" = 0:00 AM on the 10th of every month.
# "0 0 16 * * MON-FRI" = 4:00 PM on every weekdays.
# There is no default value.
job.cleanup.inactive.agents.cron=
# Default value is 30 (minimum value is 30)
#job.cleanup.inactive.agents.duration.days=
###########################################################
# BANNER #
###########################################################
# Pinpoint Banner Settings
# Pinpoint banner mode : OFF, CONSOLE, LOG
pinpoint.banner.mode=console
pinpoint.banner.configs=batch.server.env,\\
pinpoint.url,\\
alarm.mail.server.url,\\
jdbc.url,\\
meta.jdbc.url,\\
batch.flink.server,\\
job.cleanup.inactive.agents,\\
job.cleanup.inactive.agents.cron,\\
pinpoint.zookeeper.address,\\
hbase.client.host,\\
hbase.client.port,\\
hbase.zookeeper.znode.parent,\\
hbase.namespace
准备配置文件:config/jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/pinpoint?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456
准备启动脚本:start_batch.sh
#!/bin/bash
appName=$2
param="-Dspring.config.additional-location=./config/batch.properties,./config/jdbc.properties"
jdkPath=/usr/lib/java-11/jdk-11/bin
# JVM="-XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Xms512m -Xmx1G"
JVM=""
logPath="./logs/app.log"
if [ -z $appName ];then
appName=`ls -t |grep .jar$ |head -n1`
fi
function start()
count=`ps -ef |grep java|grep $appName|wc -l`
if [ $count != 0 ];then
echo "Maybe $appName is running, please check it..."
else
echo "The $appName is starting..."
nohup $jdkPath/java -jar $param $JVM ./$appName > $logPath 2>&1 &
fi
function stop()
appId=`ps -ef |grep java|grep $appName|awk 'print $2'`
if [ -z $appId ];then
echo "Maybe $appName not running, please check it..."
else
echo "The $appName is stopping..."
kill $appId
fi
function restart()
# get release version
releaseApp=`ls -t |grep .jar$ |head -n1`
# get last version
lastVersionApp=`ls -t |grep .jar$ |head -n2 |tail -n1`
appName=$lastVersionApp
stop
for i in 5..1
do
echo -n "$i "
sleep 1
done
echo 0
# backup
appName=$releaseApp
start
function status()
appId=`ps -ef |grep java|grep $appName|awk 'print $2'`
if [ -z $appId ]
then
echo -e "\\033[31m Not running \\033[0m"
else
echo -e "\\033[32m Running [$appId] \\033[0m"
fi
function usage()
echo "Usage: $0 start|stop|restart|status|stop -f"
echo "Example: $0 start"
exit 1
case $1 in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
usage;;
esac
启动服务
./start_batch.sh start
./start_batch.sh stop
7.监控预警自动推送钉钉消息
pinpoint 官方提供了标准的webhook推送demo项目(slack-receiver),可基于该项目拓展对接钉钉机器人、短信、企业微信等其他需要推送消息的渠道,下面以钉钉为例展开介绍。
7.1 接入钉钉机器人
详见钉钉自定义机器人接入文档
引入钉钉SDK:maven配置
<!--钉钉SDK-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
<version>2.0.0</version>
</dependency>
slack-receiver 项目拓展实现钉钉推送
package com.webhook.receiver.slack.sender;
import com.webhook.receiver.slack.vo.WebhookPayload;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiRobotSendRequest;
前言
在前面的文章中,我们学习了如何通过java实现将消息发送到钉钉、和将消息发送到微信群聊。
基于上述基础,我们今天来接入pinpoint的告警,发送到钉钉群。
实操前准备
开始之前,推荐阅读一下,官方的告警说明文档。
阅读官方文档后,我们实际的来操作一遍。
按照官方说明,首先需要创建对应的用户组和用户,但是我们这里打开有异常:
通过后台,pinpoint-web的日志可以发现,这是由于没有配置mysql表的原因。
步骤1-配置mysql表
首先,我们创建一个名为pinpoint的数据库。
然后,导入官方的脚本,配置好需要的表。
导入的所有表显示如下:
导入15张数据表后,我们需要修改pinpoint-web的jdbc.properties配置文件。
配置好正确的数据库和账号密码后,重启pinpoint-web。
步骤2-界面配置用户组和用户
首先配置一个用户组,然后在这个组下面新建一个用户。
用户这里输入id、用户名、手机号、邮箱等信息添加即可。
步骤3-添加应用的告警规则
配置完用户后,接着我们配置对应应用的告警规则
这里我针对testboot这个服务,配置了一个慢 请求告警,当慢请求大于5个时,就会触发。
这里的type选项指定告警的方式,可以是短信、邮件,或者两者。
然后包含具体的告警指标,这里我单纯选择的是Slow count,慢请求个数。
具体每个指标的含义,考虑后续再出一篇文章来作详细解释。
这篇主要以实现告警功能为目的,就不再深入了。
至此,告警规则就配置好了。
步骤4-改造源码思路分析
冷静分析
pinpoint 采用Spring Batch框架来运行job,其中
一个Job有多个Step,每个step又包含一系列规定动作(read,process,write)。
界面上所有的可配置指标都是通过Checker计算出来的,我们的Slow Count的也不例外。
AlarmMessageSender是我们需要关注的告警接口,它有一个空的实现类,EmptyMessageSender。
本来打算直接在这个类里面写代码的,但转念一想,还是算了,因为他没有被spring管理,是直接new出来的,我们后面可能需要依赖spring的一些bean,避免用着不方便,所以还是自己写一个类来实现把。
默认情况下,我们都只是使用不带任何参数的@Autowired。
设置required参数为false,表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错。
步骤5-进行源码改造
新建一个类,实现告警接口,源码我上传到了github,需要的小伙伴,公众号回复钉钉,即可获取。
写完代码后,我们上传编译后的class文件到WEB-INF/classes/com/navercorp/pinpoint/web/alarm目录下:
由于我使用了一个内部类,所以一共有两个class文件。
改一下文件权限
chmod 777 ./DingTalkAndWechatMessageSender.class
chmod 777 ./DingTalkAndWechatMessageSender$DingResponse.class
在/WEB-INF/classes/pinpoint-web.properties配置中新增
web.ding.talk.url属性配置,这个属性就是钉钉的webhok地址。
当然你也可以写具体的微服务地址,来进行更多的逻辑处理,这里为了让大家开箱即用,我将消息直接推送给钉钉。
有了推送的url后,我们在applicationContext-web.xml中添加一个bean配置。
<bean id="dingTalkAndWechatMessageSender" class="com.navercorp.pinpoint.web.alarm.DingTalkAndWechatMessageSender" >
<property name="dingTalkUrl" value="#{pinpointWebProps[\'web.ding.talk.url\'] ?: \'\'}"/>
</bean>
步骤6-测试验证
查看是否赋值成功:
调用业务接口,我伪造了一个慢请求接口
验证日志:
验证钉钉消息:
总结
如上,就是将pinpoint告警接入钉钉群的全部过程,若有任何疑问,欢迎来交流讨论。
通过这篇文章,来复测以下,是否掌握了以下知识呢:
1、如何发送消息接入钉钉群聊。
2、如何编译class增量发布。(虽然并不是很推荐这种方式,但是为了提高效率所以这样用了)
3、如何实现pinpoint的告警接口。
4、pinpoint告警类读取配置文件方式。
推送告警到微信群,就不再文章讲述了,有需求的小伙伴可以自行研究实现。希望大家多多总结,提高自己。
欢迎来公众号【侠梦的开发笔记】,回复干货,领取精选学习视频一份