/flash-dog

monitor with pleasure

Primary LanguageJavaScript

概述
应用通过log4j输出日志到mongodb数据库中,闪电狗定时运行脚本分析日志,生成监控曲线和告警。主要优点是不影响业务代码,只需加入几个jar包和修改log4j配置文件就能接入。配置一些javascript小脚本,几乎就能监控所有你想监控的信息,如cpu内存,错误日志百分比,每日访问人数,收入等等
该项目由杭州斯凯网络开源,目前已经在公司内部支付等关键业务中使用,对创业团队和中小型公司有较大吸引力。目前只支持java的log4j和logback日志输出,通过简单扩展可以支持其他语言。

  1. 安装
  • 安装mongodb,解压出来,配置数据保存路径,即可运行
  • 下载flash-dog-server
  • 修改flash-dog-server文件夹下的log4j.properties文件,修改log4j.appender.MongoDB的hostname和port指向你部署的mongodb地址和端口:
    log4j.appender.MongoDB.hostname=172.16.3.47
    log4j.appender.MongoDB.port=27017
  • 修改conf/develop/app.properties,也指向刚才部署的mongodb
    mongo.uri=mongodb://172.16.3.47:27017/monitor_test
  • 进入bin下,运行start.sh develop或者start-dev.bat
    在浏览器里打开http://localhost:8080/flash-dog/projects 输入用户名:admin 密码 123456 ,你将看到一个叫闪电狗的项目,这是因为闪电狗也会监控自己,wow screenshot
  1. 把你自己的项目加入闪电狗
  • flash-dog-api-log4j下载客户端的lib库,或者从flash-dog-server文件夹lib目录下拷贝log4mongo-java ,flash-dog-api-log4j 和 mongo-java-driver 到项目的lib库下,注意还需要log4j 1.2.15以上的版本
  • 修改您自己的log4j.properties配置文件
  • 重启您的项目
  • 进入http://localhost:8080/flash-dog/projects ,新建项目,如果配置正确,你将在【日志分析】栏目中查询到您的日志,enjoy your self!
  1. log4j配置说明
  • log4j.properties

log4j.appender.MongoDB=org.log4mongo.AsynMongoURILayoutAppender
log4j.appender.MongoDB.layout=org.log4mongo.contrib.HostInfoPatternLayout
#pid表示进程号,ip为当前服务器ip
log4j.appender.MongoDB.layout.ConversionPattern={"timestamp":"%d","level":"%p","className":"%c","message":"%m","pid":"%V","ip":"%I"}
#mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
log4j.appender.MongoDB.mongoURI=mongodb://mongolog:123456@192.168.173.207:5281,192.168.173.238:5281/test?slaveOk=true
log4j.appender.MongoDB.jvmMonitor=true
log4j.appender.MongoDB.collectionName=flash_dog_log
log4j.rootLogger=info,stdout,logfile,MongoDB
  1. 监控示例
  • 在闪电狗里面新建监控项目后,点击[定时任务]->[新建任务]。假设业务会打印出:

  username=jordon pay money=100

点击[指标监控]按钮,自动生成脚本如下:


m=function () { 
     result = this.message.match(".*money=(\\d+)"); 
     if (result) { 
         pricePaied = new NumberLong(result[1]);         
         emit("pricePaied", pricePaied); 
     } 
 }  
 r= function (key, values) { 
     var total = 0; 
     for (var i = 0; i < values.length; i++) { 
         total += values[i]; 
     } 
     return total; 
 }   
 res=db.flash_dog_log.mapReduce(m, r, {out:"flash_dog_log_output", query:{timestamp:{$gt:new Date(new Date - 300000)}}}); 
 pricePaied=db.flash_dog_log_output.findOne({_id:"pricePaied"});
 if(pricePaied) 
    v=pricePaied.value; 
   else 
     v=0;    
 db.flash_dog_metrics.save({name:"5分钟收入",value:v,timeStamp:new Date().getTime()}); 
 return res;   

目的为通过脚本扫描最近5分钟日志,通过正则表示提取 this.message.match(".*money=(\d+)") 金额,加起来即为最近5分钟收入。生成曲线图如下:
screenshot

  • 设置告警 当最近5分钟收入少于100的时候发送邮件,凌晨0点到4点的时候除外。 screenshot
  • 闪电狗目前有4个脚本模板,可以边修改,边调试,非常有趣
  1. 常见问题
  • 是否可以监控业务
    可以,默认是监控jvm性能和错误日志,里面提供了脚步模板,稍作修改便能通过分析业务日志进行业务统计和监控
  • 是否需要连接业务数据库
    不需要,只需要连接mongodb

扩展
如果您的项目没有使用log4j,也可以使用logback.

  • 下载安装 logback-mongodb

    
    mvn clean install
    

  • 增加slf4j 和 logback 的依赖

      <dependency>
      	<groupId>org.slf4j</groupId>
      	<artifactId>slf4j-api</artifactId>
      	<version>1.6.5</version>
      </dependency>
    
      <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-core</artifactId>
          <version>1.0.6</version>
      </dependency>
      <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-classic</artifactId>
          <version>1.0.6</version>
      </dependency>
    
      <dependency>
          <groupId>logback.mongodb</groupId>
          <artifactId>logback.mongodb</artifactId>
          <version>1.0.2</version>
      </dependency>
    
  • logback的配置

      <appender name="MONGO" class="logback.mongodb.MongoDBAppender">
          <connectionSource class="logback.mongodb.MongoDBConnectionSource">
              <uri>mongodb://172.16.3.47:27017</uri>
              <db>ugglog</db>
              <collection>paylog</collection>
          </connectionSource>
      </appender>
    
      <appender name="ASYNCMONGO" class="ch.qos.logback.classic.AsyncAppender">
          <appender-ref ref="MONGO" />
      </appender>
    
      <logger name="currency" additivity="false" level="warn">
          <appender-ref ref="MONGO"/>
      </logger>
    
  • 在logback中可以使用MDC功能输出附加的字段

    
    MDC.clear();
    MDC.put("mob", mob.name());
    MDC.put("value", value + "");
    MDC.put("currency", type.name());
    MDC.put("reason", reason);
    MDC.put("saveAtOnce", saveAtOnce + "");
    mongoLogger.info("{}:{} {} {} {} {}", new Object[]{logPre, mob.name(), value, type, reason, saveAtOnce});
    

  • 这样在mongodb的collection中保存的scheme会增加这些字段:

    
    {
    mob: '',
    value: '',
    currency: '',
    reason: '',
    saveAtOnce: ''
    }