我们谈到监控,一般设计到两个方面的内容:

  1. 服务器本身的监控。(比如:linux服务器的CPU,内存,磁盘IO等监控)

  2. 业务系统的监控.  (比如:业务系统性能的监控,SQL语句的监控,请求超时 的监控,用户输入的监控,整个请求过程时间的监控,优化等等)

服务器本身的监控

说明:由于Java开源生鲜电商平台采用的是阿里云的linux CentOS服务器,由于阿里云本身是有监控预警的,但是我们不可能时刻去看,最好有集成自己的系统监控,最终在各种系统对比的过程中,选择了netdata这个工具,当然有一些软件比如:zabbix,negios等等都是可以的,但是我们服务器压力不算大,最终采用了更加轻量级的解决方案。

相关的安装与使用,大家自行百度处理,我这边就不列举出来了。

以下是相关的实际运营截图:

业务监控

说明:任何一个业务系统都需要采用业务监控,抛异常,有error日志,短信预警,推送等等

  • Java内存

  • JavaCPU使用情况

  • 用户Session数量

  • JDBC连接数

  • http请求、sql请求、jsp页面与业务接口方法(EJB3、Spring、 Guice)的执行数量,平均执行时间,错误百分比等

最终,业务代码中采用了Spring AOP进行日志拦截,把请求方法超过了1500秒的方法进行了error日志的输出:

业务代码如下:

import org.apache.commons.lang.time.StopWatch;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/*** 声明一个切面,记录每个Action的执行时间*/
@Aspect
@Component
public class LogAspect {private static final Logger logger=LoggerFactory.getLogger(LogAspect.class);/*** 切入点:表示在哪个类的哪个方法进行切入。配置有切入点表达式*/@Pointcut("execution(* com.netcai.admin.controller.*.*.*(..))")public void pointcutExpression() {logger.debug("配置切入点");}/*** 1 前置通知* @param joinPoint*/@Before("pointcutExpression()")public void beforeMethod(JoinPoint joinPoint) {logger.debug("前置通知执行了");}/*** 2 后置通知* 在方法执行之后执行的代码. 无论该方法是否出现异常*/@After("pointcutExpression()") public void afterMethod(JoinPoint joinPoint) {logger.debug("后置通知执行了,有异常也会执行");}/*** 3 返回通知* 在方法法正常结束受执行的代码* 返回通知是可以访问到方法的返回值的!* @param joinPoint* @param returnValue*/@AfterReturning(value = "pointcutExpression()", returning = "returnValue")public void afterRunningMethod(JoinPoint joinPoint, Object returnValue) {logger.debug("返回通知执行,执行结果:" + returnValue);}/*** 4 异常通知* 在目标方法出现异常时会执行的代码.* 可以访问到异常对象; 且可以指定在出现特定异常时在执行通知代码* @param joinPoint* @param e*/@AfterThrowing(value = "pointcutExpression()", throwing = "e")public void afterThrowingMethod(JoinPoint joinPoint, Exception e){logger.debug("异常通知, 出现异常 " + e);}/*** 环绕通知需要携带 ProceedingJoinPoint 类型的参数. * 环绕通知类似于动态代理的全过程: ProceedingJoinPoint 类型的参数可以决定是否执行目标方法.* 且环绕通知必须有返回值, 返回值即为目标方法的返回值*/@Around("pointcutExpression()")public Object aroundMethod(ProceedingJoinPoint pjd){StopWatch clock = new StopWatch();//返回的结果Object result = null;//方法名称String className=pjd.getTarget().getClass().getName();String methodName = pjd.getSignature().getName();try {// 计时开始clock.start(); //前置通知//执行目标方法result = pjd.proceed();//返回通知clock.stop();} catch (Throwable e) {//异常通知e.printStackTrace();}//后置通知if(!methodName.equalsIgnoreCase("initBinder")){long constTime=clock.getTime();logger.info("["+className+"]"+"-" +"["+methodName+"]"+" 花费时间:" +constTime+"ms");if(constTime>500){logger.error("["+className+"]"+"-" +"["+methodName+"]"+" 花费时间过长,请检查: " +constTime+"ms");}}return result;}
}

补充说明:这个方法记录那个类,那个方法执行的时间多少,超过设置的阀值,那么就打印error日志,需要我们每天进行查看与针对性的优化。

javamelody

对于整个业务线的监控,我们采用了另外一种开源的监控:javamelody。

相关的配置与处理如下:

POM文件中设置:

<!-- 系统监控 --><dependency><groupId>net.bull.javamelody</groupId><artifactId>javamelody-core</artifactId><version>1.68.1</version></dependency><dependency><groupId>org.jrobin</groupId><artifactId>jrobin</artifactId><version>1.5.9</version></dependency>

web.xml文件中处理

    <context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:config/applicationContext.xmlclasspath*:net/bull/javamelody/monitoring-spring.xmlclasspath*:net/bull/javamelody/monitoring-spring-datasource.xmlclasspath*:net/bull/javamelody/monitoring-spring-aspectj.xml</param-value></context-param>
    <!--javamelody --><filter><filter-name>monitoring</filter-name><filter-class>net.bull.javamelody.MonitoringFilter</filter-class><async-supported>true</async-supported><init-param><param-name>logEnabled</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>monitoring</filter-name><url-pattern>/*</url-pattern></filter-mapping><listener><listener-class>net.bull.javamelody.SessionListener</listener-class></listener>

最终运营效果如下:

总结

最终可以形成一套基于自己的监控系统,当然还有类似的更加强大的监控系统,比如:连接池方面druid,系统方面zabbix,业务方面可以用cat等等,甚至开发采用自己的监控系统也是可以的。也是支持二次开发的。

来源:https://www.cnblogs.com/jurendage/p/9070442.html

关注微信公众号:互联网架构师,在后台回复:2T,可以获取我整理的教程,都是干货。

猜你喜欢

1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

2、如何才能成为优秀的架构师?

3、从零开始搭建创业公司后台技术栈

4、程序员一般可以从什么平台接私活?

5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6、滴滴业务中台构建实践,首次曝光

7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

8、15张图看懂瞎忙和高效的区别

9、2T架构师学习资料干货分享

厉害!某生鲜电商平台竟然是这样设计监控模块的(已开源)~相关推荐

  1. Java生鲜电商平台-团购模块设计与架构

    Java生鲜电商平台-团购模块设计与架构 说明:任何一个电商系统中,对于促销这块是必不可少的,毕竟这块是最吸引用户的,用户也是最爱的模块之一,理由很简单,便宜. 我的经验是无论是大的餐饮点还是小的餐饮 ...

  2. Java生鲜电商平台-异常模块的设计与架构

    Java生鲜电商平台-异常模块的设计与架构 说明:任何一个软件系统都会出现各式各样的异常与错误,我们需要根据异常的情况进行捕获与分析,改善自己的代码,让其更加的稳定的,快速的运行,那么作为一个 B2B ...

  3. java电商商品基本信息表,Java生鲜电商平台-商品表的设计

    Java生鲜电商平台-商品表的设计 任何一个电商,无论是B2C还是B2B的电商,商品表的设计关系到整个系统架构的核心. 1. 商品基本信息表:用单词:goods做为商品表 2. 商品分类信息表: 说明 ...

  4. Java开源生鲜电商平台-支付模块的设计与架构(源码可下载

    Java开源生鲜电商平台-支付模块的设计与架构(源码可下载) Java开源生鲜电商平台-支付模块的设计与架构(源码可下载) 开源生鲜电商平台支付目前支持支付宝与微信.针对的是APP端(android ...

  5. 6、生鲜电商平台-订单表的设计

    场景分析说明: 买家(餐馆)用户,通过APP进行选菜,放入购物车,然后下单,最终支付的流程,我们称为下单过程. 买家可以在张三家买茄子,李四家买萝卜,王五家买白菜,赵六家买猪肉等 那么买家就应该有个订 ...

  6. java 团购开发_Java生鲜电商平台-团购模块设计与架构

    Java生鲜电商平台-团购模块设计与架构 说明:任何一个电商系统中,对于促销这块是必不可少的,毕竟这块是最吸引用户的,用户也是最爱的模块之一,理由很简单,便宜. 我的经验是无论是大的餐饮点还是小的餐饮 ...

  7. java电商商品搜索_Java生鲜电商平台-搜索模块的设计与架构

    说明:搜索模块针对的是买家用户,在找菜品找的很费劲下的一种查询方面.目前也是快速的检索商品. 对于移动端的APP买家用户而言,要求的速度在3秒内完成.支持模糊查询,由于业务实战表面,整个搜索频率不到1 ...

  8. Java开源生鲜电商平台-支付模块的设计与架构(源码可下载)

    //买家支付宝用户号 String buyerId=this.getNotNull("buyer_id", request); //买家支付宝账号 String buyerLogo ...

  9. Java开源生鲜电商平台-支付模块的设计与架构(源码可下载)(1)

    @param response @return */ @RequestMapping(value="/alipay/invoke",method={RequestMethod.GE ...

  10. Java开源生鲜电商平台-Java分布式以及负载均衡架构与设计详解(源码可下载)

    Java开源生鲜电商平台-Java分布式以及负载均衡架构与设计详解(源码可下载) 说明:主要是针对一些中大型的项目需要进行分布式以及负载均衡的架构提一些思路与建议. 面对大量用户访问.高并发请求,海量 ...

最新文章

  1. JavaScript 慢慢移动的海绵宝宝
  2. 洛谷模拟赛 部落冲突
  3. ActivityIndicator(菊花)的用法
  4. mysql数据库技术方案,MySql数据库优化方案
  5. 联发科Helio P35处理器曝光:10GB运存
  6. 心中一万只草泥马在奔腾是种怎样的体验?| 今日最佳
  7. 计算机用户被锁定如何解除,win10账户被锁定了怎么解除
  8. 网络爬虫ip代理服务器【程序样例】
  9. 解题:ZJOI 2006 书架
  10. python获取最新学术文献_快解锁新姿势,教你如何用Python搞定文献搜索和科研图片!...
  11. 第八章(三)滑动窗口
  12. Unity3D资源分享
  13. 管家婆打印模板设置_B端移动设计 | 打印配置
  14. 机器学习必学十大算法
  15. 单片机蓝桥杯之LED点亮(国信CT107D开发板)
  16. 修改win10更新服务器,修改win10更新服务器地址
  17. 【应用统计学】总体方差的假设检验
  18. Problem A: 小学生的算术题
  19. 田野调查手记·浮山摩崖石刻(二)
  20. 基于Angularjs框架实现HTML5在线查看OFD文件

热门文章

  1. 怎么用EasyRecovery恢复sd卡中的数据
  2. python 装饰器 二
  3. python中的json模块
  4. @SuppressWarnings注解的详解
  5. Mac OS X Tips
  6. 考研复习(8)-图的基本操作
  7. 全局变量的声明和定义 以及dll中全局变量的导出
  8. ​​​​SSH Config Editor Pro :管理您的SSH配置文件
  9. 如何设置 iCloud 云盘?
  10. 在苹果Mac中将 WEBP 图片转成 JPG、PNG 格式的 2 种方法