【APM】Pinpoint 监控告警(三)
本例介绍Pinpoint告警的相关内容,Pinpoint参考【APM】Pinpoint 安装部署(一)
Pinpoint Web会定期检查应用程序的状态,并在满足某些预配置条件(规则)的情况下触发警报。
这些条件(默认情况下)由Web模块中的后台批处理过程每3分钟检查一次(默认情况下),使用的是最后5分钟的数据。一旦满足条件,批处理过程就会向注册到用户组的用户发送短信/电子邮件。
本例Pinpoint版本是:1.8.5,下载地址:https://github.com/naver/pinpoint/releases/tag/1.8.5
参考git文档:https://naver.github.io/pinpoint/alarm.html
参考博客:https://skyao.gitbooks.io/learning-pinpoint/content/alarm/code_implementation.html
Pinpoint告警原理
1、下载源码,通过源码解析:
Pinpoint中有一个匹处理类,BatchConfiguration.java,此类会进行批任务处理
@Configuration
@Conditional(BatchConfiguration.Condition.class)
@ImportResource("classpath:/batch/applicationContext-batch-schedule.xml")
public class BatchConfiguration{
static class Condition implements ConfigurationCondition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
......
Resource resource = context.getResourceLoader().getResource("classpath:/batch.properties")
......
final String enable = properties.getProperty("batch.enable");
......
}
}
}
Condition中会读取配置文件batch.properties中的配置项batch.enable,默认是false。因此如果要开启批处理功能,必须设置batch.enable=true。
2、在Pinpoint中,在批处理任务配置文件(applicationContext-batch-schedule.xml)中,文件路径为:pinpoint/web/src/main/resources/batch/applicationContext-batch-schedule.xml,可以找到定义的任务
<task:scheduled-tasks scheduler="scheduler">
<task:scheduled ref="batchJobLauncher" method="alarmJob" cron="0 0/3 * * * *" />
<task:scheduled ref="batchJobLauncher" method="agentCountJob" cron="0 0 2 * * *" />
<task:scheduled ref="batchJobLauncher" method="flinkCheckJob" cron="0 0/10 * * * *" />
</task:scheduled-tasks> <task:scheduler id="scheduler" pool-size="1"/>
配置文件中,定义了执行告警Job的时间。定义了一个线程池大小为1的调度器scheduler
3、在Pinpoint中,在告警任务配置文件(applicationContext-alarmJob.xml)中,文件路径为:pinpoint/web/src/main/resources/batch/applicationContext-alarmJob.xml,
reader:读取数据 => 通过用户配置的规则提供Checker,即异常校验器。
processor:处理数据 => 用Checker进行校验,标记异常状态。
writer:回写数据 => 判断Checker是否有异常情况,有则报警。
<batch:job id="alarmJob">
<batch:step id="alarmPartitionStep">
<batch:partition step="alarmStep" partitioner="alarmPartitioner">
<batch:handler task-executor="alarmPoolTaskExecutorForPartition" />
</batch:partition>
</batch:step>
<batch:listeners>
<batch:listener ref="jobFailListener"/>
</batch:listeners>
</batch:job> <batch:step id="alarmStep">
<batch:tasklet>
<batch:chunk reader="reader" processor="processor" writer="writer" commit-interval="1"/>
</batch:tasklet>
</batch:step> <bean id="alarmPartitioner" class="com.navercorp.pinpoint.web.alarm.AlarmPartitioner"/>
<bean id="reader" class="com.navercorp.pinpoint.web.alarm.AlarmReader" scope="step"/>
<bean id="processor" class="com.navercorp.pinpoint.web.alarm.AlarmProcessor" scope="step"/>
<bean id="writer" class="com.navercorp.pinpoint.web.alarm.AlarmWriter" scope="step"/> <task:executor id="alarmPoolTaskExecutorForPartition" pool-size="1" />
4、在回写数据类中AlarmWriter.java中发现,是通过注入AlarmMessageSender来发送消息
public class AlarmWriter implements ItemWriter<AlarmChecker> { @Autowired(required = false)
private AlarmMessageSender alarmMessageSender = new EmptyMessageSender(); @Autowired
private AlarmService alarmService; ...... // 发送消息
private void sendAlarmMessage(CheckerResult beforeCheckerResult, AlarmChecker checker) {
if (isTurnToSendAlarm(beforeCheckerResult)) {
if (checker.isSMSSend()) {
alarmMessageSender.sendSms(checker, beforeCheckerResult.getSequenceCount() + 1);
}
if (checker.isEmailSend()) {
alarmMessageSender.sendEmail(checker, beforeCheckerResult.getSequenceCount() + 1);
}
} } ......
}
5、在AlarmMessageSender初始化的值是EmptyMessageSender,通过查看EmptyMessageSender发现此类只是一个空的实现,所有这里只要我们自己实现AlarmMessageSender就能发送告警消息
public class EmptyMessageSender implements AlarmMessageSender { @Override
public void sendSms(AlarmChecker checker, int sequenceCount) {
} @Override
public void sendEmail(AlarmChecker checker, int sequenceCount) {
} }
Pinpoint告警开发
1、下载源码,导入Idea中。
2、由于查看pom文件,发现源码编译构建需要用到Maven3.5,JDK1.8,Java6,Java7,Java8,Java9,在开发环境中安装好对应的Maven版本,以及配置好JDK版本
下面是pom.xml文件中的内容,需要Maven 3.5,Maven不是3.5可以进行修改
<requireMavenVersion>
<version>3.5</version>
</requireMavenVersion>
<requireJavaVersion>
<version>1.8</version>
</requireJavaVersion>
<requireEnvironmentVariable>
<variableName>JAVA_HOME</variableName>
</requireEnvironmentVariable>
<requireEnvironmentVariable>
<variableName>JAVA_6_HOME</variableName>
</requireEnvironmentVariable>
<requireEnvironmentVariable>
<variableName>JAVA_7_HOME</variableName>
</requireEnvironmentVariable>
<requireEnvironmentVariable>
<variableName>JAVA_8_HOME</variableName>
</requireEnvironmentVariable>
<requireEnvironmentVariable>
<variableName>JAVA_9_HOME</variableName>
</requireEnvironmentVariable>
3、查看依赖,下载依赖jar包(部分依赖可以用相似版本替代),且对pinpoint/pom.xml文件进行修改,是项目能运行打包。
a、修改spotbugs-exclude.xml,位子,此内容有2个地方要替换
<!--<excludeFilterFile>${maven.multiModuleProjectDirectory}/spotbugs-exclude.xml</excludeFilterFile>-->
<!-- 改为 -->
<excludeFilterFile>${basedir}/spotbugs-exclude.xml</excludeFilterFile>
b、插件注释掉
<!--<plugin>-->
<!--<groupId>org.apache.maven.plugins</groupId>-->
<!--<artifactId>maven-jxr-plugin</artifactId>-->
<!--<version>2.5</version>-->
<!--<inherited>false</inherited>-->
<!--<configuration>-->
<!--<aggregate>true</aggregate>-->
<!--<inputEncoding>${encoding}</inputEncoding>-->
<!--<outputEncoding>${encoding}</outputEncoding>-->
<!--<windowTitle>Pinpoint ${project.version} Cross Reference</windowTitle>-->
<!--<docTitle>Pinpoint ${project.version} Cross Reference</docTitle>-->
<!--</configuration>-->
<!--</plugin>-->
c、下载不下来直接注释掉
<!-- 注释 -->
<!--<profile>-->
<!--<id>klocwork</id>-->
<!--<build>-->
<!--<plugins>-->
<!--<plugin>-->
<!--<groupId>com.klocwork.ps</groupId>-->
<!--<artifactId>kwmaven</artifactId>-->
<!--<version>2.1.1</version>-->
<!--<configuration>-->
<!--<buildspec_filename>${KWINJECT_OUT_PATH}</buildspec_filename>-->
<!--</configuration>-->
<!--<executions>-->
<!--<execution>-->
<!--<phase>validate</phase>-->
<!--<goals>-->
<!--<goal>run</goal>-->
<!--</goals>-->
<!--</execution>-->
<!--</executions>-->
<!--</plugin>--> <!--</plugins>-->
<!--</build>-->
<!--</profile>-->
d、修改bootsrap-java9.pom文件
<!-- <jdk.version>9</jdk.version> -->
<!-- 修改为 -->
<jdk.version>1.9</jdk.version>
4、实现和配置告警发消息类
为了使用告警功能,必须通过实现 com.navercorp.pinpoint.web.alarm.AlarmMessageSender并注册为spring managed bean 来实现自己的逻辑以便发送短信和邮件。当告警被触发时, AlarmMessageSender#sendEmail, 和 AlarmMessageSender#sendSms 方法将被调用。
AlarmMessageSenderImple.java 如下:
public class AlarmMessageSenderImple implements AlarmMessageSender { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired
UserGroupService userGroupService; @Override
public void sendSms(AlarmChecker checker, int sequenceCount) { List<String> receivers = userGroupService.selectPhoneNumberOfMember(checker.getuserGroupId());
logger.info(" =============准备发送消息=============== " + receivers.size()); if (receivers.size() == 0) {
return;
}
List<String> smsList = checker.getSmsMessage();
for (String message : smsList) {
logger.info("send SMS : {}", message);
// TODO Implement logic for sending SMS
for (String receiver : receivers) {
logger.info("send email receiver : {}", receiver);
}
}
} @Override
public void sendEmail(AlarmChecker checker, int sequenceCount) { List<String> receivers = userGroupService.selectEmailOfMember(checker.getuserGroupId());
logger.info(" ==============准备发送邮件=============== " + receivers.size()); if (receivers.size() == 0) {
return;
} String message = checker.getEmailMessage();
logger.info("send email : {}", message); // TODO Implement logic for sending email
for (String receiver : receivers) {
logger.info("send email receiver : {}", receiver);
}
}
}
发邮件方法,可以参考:【Mail】JavaMail介绍及发送邮件(一)
发短信需要对接第三方运营商。
注册AlarmMessageSenderImple,在applicationContext-batch.xml文件中注册
<bean id="alarmMessageSenderImple" class="com.navercorp.pinpoint.web.alarm.AlarmMessageSenderImple"/>
还在可以发邮件信息做成可配置形式,在batch.properties文件中提供smtp服务器信息和发送者的地址。在AlarmMessageSenderImple中进行使用
pinpoint.url= #pinpoint-web server url
alarm.mail.server.url= #smtp server address
alarm.mail.server.port= #smtp server port
alarm.mail.server.username= #username for smtp server authentication
alarm.mail.server.password= #password for smtp server authentication
alarm.mail.sender.address= #sender's email address ex)
pinpoint.url=http://pinpoint.com
alarm.mail.server.url=stmp.server.com
alarm.mail.server.port=587
alarm.mail.server.username=pinpoint
alarm.mail.server.password=pinpoint
alarm.mail.sender.address=pinpoint_operator@pinpoint.com
在AlarmMessageSenderImple时,注入相关参数
@Value("#{batchProps['alarm.mail.server.url'] ?: ''}")
String host;
@Value("#{batchProps['alarm.mail.server.port'] ?: 587}")
String port;
@Value("#{batchProps['alarm.mail.server.username'] ?: ''}")
String username;
@Value("#{batchProps['alarm.mail.server.password'] ?: ''}")
String password;
@Value("#{batchProps['alarm.mail.sender.address'] ?: ''}")
String mailfrom;
5、修改配置文件batch.properties
在batch.properties中将batch.enable
标志设置为true,开启批处理功能
batch.enable=true
batch.server.ip
当有多个精确的Web服务器时,可以进行配置以防止并发批处理操作。仅当服务器的IP地址与中设置的值相同时,才执行批处理batch.server.ip
。(将此设置为127.0.0.1将在所有Web服务器中启动批处理)
batch.server.ip=X.X.X.X
6、配置mysql,需要用到MYSQL来存储用户信息以告警规则等,设置MYSQL服务器并在jdbc.properties文件中配置连接信息。
在resources/sql中有2个文件,CreateTableStatement-mysql.sql和SpringBatchJobRepositorySchema-mysql.sql,用来创建表。
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:13306/pinpoint?characterEncoding=UTF-8
jdbc.username=admin
jdbc.password=admin
7、其他
a、可以在单独的过程中启动警报批处理 -只需使用Pinpoint-web模块内的applicationContext-alarmJob.xml文件启动弹簧批处理作业即可。
b、可以通过修改applicationContext-batch-schedule.xml文件中的cron表达式来更改批处理执行时间
<task:scheduled-tasks scheduler="scheduler">
<task:scheduled ref="batchJobLauncher" method="alarmJob" cron="0 0/3 * * * *" />
</task:scheduled-tasks>
c、改善警报批处理性能的方法 -警报批处理设计为可同时运行。如果您有许多注册了警报的应用程序,则可以通过pool-size
在applicationContext-batch.xml文件中进行修改来增加执行程序的线程池的大小。
<task:executor id="poolTaskExecutorForPartition" pool-size="1" />
8、修改配置文件信息,配置Hbase及Zookeeper,参考:【APM】Pinpoint 安装部署(一),然后使用Maven打包项目,打包后,将pinpoint-web-1.8.5.war,放入tomcat中运行
Pinpoint告警使用
1、打开pinpoint网页,打开pinpoint配置
2、新增用户信息
3、新增用户组
4、添加用户到用户组
5、设置告警规则,测试可以使用TOTAL COUNT / 请求总数量超过多少就报警
6、页面上发起请求,超过请求次数
7、通过后台查看日志,或者是邮箱,可以发现告警已经实现
告警规则
SLOW COUNT / 慢请求数
当应用发出的慢请求数量超过配置阈值时触发。
SLOW RATE / 慢请求比例
当应用发出的慢请求百分比超过配置阈值时触发。
ERROR COUNT / 请求失败数
当应用发出的失败请求数量超过配置阈值时触发。
ERROR RATE / 请求失败率
当应用发出的失败请求百分比超过配置阈值时触发。
TOTAL COUNT / 总数量
当应用发出的所有请求数量超过配置阈值时触发。
以上规则中,请求是当前应用发送出去的,当前应用是请求的发起者。 以下规则中,请求是发送给当前应用的,当前应用是请求的接收者。
SLOW COUNT TO CALLEE / 被调用的慢请求数量
当发送给应用的慢请求数量超过配置阈值时触发。
SLOW RATE TO CALLEE / 被调用的慢请求比例
当发送给应用的慢请求百分比超过配置阈值时触发。
ERROR COUNT TO CALLEE / 被调用的请求错误数
当发送给应用的请求失败数量超过配置阈值时触发。
ERROR RATE TO CALLEE / 被调用的请求错误率
当发送给应用的请求失败百分比超过配置阈值时触发。
TOTAL COUNT TO CALLEE / 被调用的总数量
当发送给应用的所有请求数量超过配置阈值时触发。
下面两条规则和请求无关,只涉及到应用的状态
HEAP USAGE RATE / 堆内存使用率
当应用的堆内存使用率超过配置阈值时触发。
JVM CPU USAGE RATE / JVM CPU使用率
当应用的CPU使用率超过配置阈值时触发。
【APM】Pinpoint 监控告警(三)的更多相关文章
- 详解Linux运维工具:运维流程管理、运维发布变更、运维监控告警
概述 应用上线后,运维工作才刚开始,具体工作可能包括:升级版本上线工作.服务监控.应用状态统计.日常服务状态巡检.突发故障处理.服务日常变更调整.集群管理.服务性能评估优化.数据库管理优化.随着应用 ...
- zookeeper监控告警
一.ZooKeeper简介 ZooKeeper作为分布式系统中重要的组件,目前在业界使用越来越广泛,ZooKeeper的使用场景非常多,以下是几种典型的应用场景: l 数据发布与订阅(配置中心) l ...
- SQL Server Alwayson架构下 服务器 各虚拟IP漂移监控告警的功能实现 -2(虚拟IP视角)
1.需求描述 我们知道Windows Cluster 都是多节点的,当虚拟IP漂移的时候,一般都是从一个节点漂移到另外一个节点.如果可以及时捕捉到旧节点信息是什么.新节点信息是什么对我们提供高可用的数 ...
- 分布式监控告警平台Centreon快速使用
一. Centreon概述 Centreon是一款功能强大的分布式IT监控系统,它通过第三方组件可以实现对网络.操作系统和应用程序的监控:首先,它是开源的,我们可以免费使用它:其次,它的底层采用nag ...
- 第1节 storm日志告警:1、 - 5、日志监控告警业务需求、代码、集群运行、总结
如何解决短信或者邮件频繁发送的问题:每次发送的时候都先查询数据库记录,看一下有没有给这个人发送消息,上一次发送消息的时间是什么时候,如果发送时间间隔小于半个小时,就不要再发了 ============ ...
- 第七模块 :微服务监控告警Prometheus架构和实践
119.监控模式分类~1.mp4 logging:日志监控,Logging 的特点是,它描述一些离散的(不连续的)事件. 例如:应用通过一个滚动的文件输出 Debug 或 Error 信息,并通过日志 ...
- Prometheus监控告警浅析
前言 最近有个新项目需要搞一套完整的监控告警系统,我们使用了开源监控告警系统Prometheus:其功能强大,可以很方便对其进行扩展,并且可以安装和使用简单:本文首先介绍Prometheus的整个监控 ...
- Spark 应用监控告警-Graphite_exporter
Spark 应用监控告警-Graphite_exporter Spark监控和工具 Web界面 事后查看 REST API 度量 高级工具 一.下载graphite_exporter 1.1 修改gr ...
- jmx_prometheus_javaagent+prometheus+alertmanager+grafana完成容器化java监控告警(二)
一.拓扑图 二.收集数据 2.1前期准备 创建共享目录,即为了各节点都创建该目录,有两个文件,做数据共享 /home/target/prom-jvm-demo 1.下载文件 jmx_prometheu ...
随机推荐
- 项目Beta冲刺--2/7
项目Beta冲刺--2/7 作业要求 这个作业属于哪个课程 软件工程1916-W(福州大学) 这个作业要求在哪里 项目Beta冲刺 团队名称 基于云的胜利冲锋队 项目名称 云评:高校学生成绩综合评估及 ...
- python应用-综合应用题解决
题目: A,B,C,D,E五个人捕鱼,不计其数,然后休息, 早上A第一个醒来,将鱼均分成五份,把多余的一条鱼扔掉,拿走自己的一份, B第二个醒来,也将鱼均分为五份,把多余的一条鱼扔掉,拿走自己的一份. ...
- 修改linux环境变量导致系统命令不可用,-bash: xx: command not found
QQ群里发现有群友对jmeter分布式环境搭建有困惑,于是决定写一篇. 首先我在安装好的linux虚拟机里面安装jdk,在修改环境变量(vim /etc/profile)后,导致系统命令不可用,-ba ...
- Helm 安装部署Kubernetes的dashboard
Kubernetes Dashboard 是 k8s集群的一个 WEB UI管理工具,代码托管在 github 上,地址:https://github.com/kubernetes/dashboard ...
- solr根据id删除索引
删除solr索引数据,使用XML有两种写法: 1) <delete><id>1</id></delete> <commit/> 2) < ...
- 【转】Fiddler抓包指南:结合Proxifier工具
本文转自:https://blog.csdn.net/china_jeffery/article/details/93000824 本文介绍如何使用Fiddler抓取HTTP和HTTPS协议的包,同时 ...
- benchmarkdotnet dotnet 基准测试类库试用(一)
使用基准测试对于我们应用的性能优化是比较好的方式,可以快速看出优化的结果同时可以给出报告结果 benchmarkdotnet 是dotnet 版本的一个工具,以下是一个简单的试用 环境准备 我使用的是 ...
- To ssh://xxx.com:8022/test/project.git ! [remote rejected] master -> master (pre-receive hook declined) error: failed to push some refs to 'ssh://xxx.com:8022/test/project.git'
To ssh://xxx.com:8022/test/project.git ! [remote rejected] master -> master (pre-receive hook dec ...
- linux 系统添加jdk环境变量
export JAVA_HOME=/usr/local/jdk1..0_79 export JAVA_BIN=$JAVA_HOME/bin export PATH=$PATH:$JAVA_BIN ex ...
- Linux expect详解
随处可见的expect第一次见expect这个命令还是我第一次参加全量上线的时候,那是公司的一个牛人用Shell脚本写的一套自动部署.MD5 比对.发布的全量上线工具,没事的时候,看了下其中的几个脚本 ...