pinpoint2.5.0环境搭建监控预警钉钉推送

Posted 逗.你玩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pinpoint2.5.0环境搭建监控预警钉钉推送相关的知识,希望对你有一定的参考价值。

1. 环境准备

  1. jdk :jdk8,JDk11
  2. hbase: habse-1.7.2 需与hbase-client版本一致,pinpoint-2.5.0使用的hbase-client版本为1.7.2
  3. hbase初始化脚本:hbase-create.hbase
  4. pinpoint-collect(监控采集服务-jdk11):pinpoint-collector-boot-2.5.0.jar
  5. pinpoint-web(监控管理服务-jdk11): pinpoint-web-boot-2.5.0.jar
  6. pinpoint-agent(监控采集代理-jdk8):pinpoint-agent-2.5.0.tar.gz
  7. pinpoint-batch(监控Aram管理服务-jdk11):pinpoint-batch-2.5.0.jar
  8. slack-receiver(监控预警信息推送服务-jdk8):webhook推送服务
  9. 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

部署文件目录

准备配置文件: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即可
  1. 将pinpoint-agent-2.5.0.tar.gz 解压至目标服务器
  2. 修改配置: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即可

  1. 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的告警,发送到钉钉群。

实操前准备

开始之前,推荐阅读一下,官方的告警说明文档。

阅读官方文档后,我们实际的来操作一遍。

按照官方说明,首先需要创建对应的用户组和用户,但是我们这里打开有异常:

file

通过后台,pinpoint-web的日志可以发现,这是由于没有配置mysql表的原因。

file

步骤1-配置mysql表

首先,我们创建一个名为pinpoint的数据库。

file

然后,导入官方的脚本,配置好需要的表。

file

导入的所有表显示如下:

file

导入15张数据表后,我们需要修改pinpoint-web的jdbc.properties配置文件。

配置好正确的数据库和账号密码后,重启pinpoint-web。

步骤2-界面配置用户组和用户

首先配置一个用户组,然后在这个组下面新建一个用户。

用户这里输入id、用户名、手机号、邮箱等信息添加即可。
file

步骤3-添加应用的告警规则

配置完用户后,接着我们配置对应应用的告警规则

file

这里我针对testboot这个服务,配置了一个慢 请求告警,当慢请求大于5个时,就会触发。

这里的type选项指定告警的方式,可以是短信、邮件,或者两者。
file

然后包含具体的告警指标,这里我单纯选择的是Slow count,慢请求个数。

file

具体每个指标的含义,考虑后续再出一篇文章来作详细解释。

这篇主要以实现告警功能为目的,就不再深入了。

至此,告警规则就配置好了。

步骤4-改造源码思路分析

冷静分析

pinpoint 采用Spring Batch框架来运行job,其中
一个Job有多个Step,每个step又包含一系列规定动作(read,process,write)。

界面上所有的可配置指标都是通过Checker计算出来的,我们的Slow Count的也不例外。

file

AlarmMessageSender是我们需要关注的告警接口,它有一个空的实现类,EmptyMessageSender。

本来打算直接在这个类里面写代码的,但转念一想,还是算了,因为他没有被spring管理,是直接new出来的,我们后面可能需要依赖spring的一些bean,避免用着不方便,所以还是自己写一个类来实现把。

file

默认情况下,我们都只是使用不带任何参数的@Autowired。
设置required参数为false,表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错。

步骤5-进行源码改造

新建一个类,实现告警接口,源码我上传到了github,需要的小伙伴,公众号回复钉钉,即可获取。

file

写完代码后,我们上传编译后的class文件到WEB-INF/classes/com/navercorp/pinpoint/web/alarm目录下:

file

由于我使用了一个内部类,所以一共有两个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-测试验证

查看是否赋值成功:
file

调用业务接口,我伪造了一个慢请求接口

file

验证日志:

file

验证钉钉消息:

file

总结

如上,就是将pinpoint告警接入钉钉群的全部过程,若有任何疑问,欢迎来交流讨论。
通过这篇文章,来复测以下,是否掌握了以下知识呢:
1、如何发送消息接入钉钉群聊。

2、如何编译class增量发布。(虽然并不是很推荐这种方式,但是为了提高效率所以这样用了)

3、如何实现pinpoint的告警接口。

4、pinpoint告警类读取配置文件方式。

推送告警到微信群,就不再文章讲述了,有需求的小伙伴可以自行研究实现。希望大家多多总结,提高自己。

欢迎来公众号【侠梦的开发笔记】,回复干货,领取精选学习视频一份

以上是关于pinpoint2.5.0环境搭建监控预警钉钉推送的主要内容,如果未能解决你的问题,请参考以下文章

数据监控预警系统,实现不同端信息推送

监控系统之预警

从零开始搭建ELK+GPE监控预警系统

比较全的前端监控体系搭建篇(长文预警)

超详细配置Zabbix监控通过钉钉实现报警(3.4和4.0版本)

旧手机搭建服务器,创建JDKTomcat环境,运行Python,启动钉钉机器人和企业微信机器人