Cat统一监控平台简单使用

问题:

1、如何实时查看线上接口的性能,包括压测,接口太慢如何定位?

2、如何实时统计线上流量以及接口调用量?

3、线上接口可用率达不到100%,如何进行告警?

4、线上服务器 缓存,jvm内存,GC 如何进行实时监控?

.....

带着这些疑问,我们找到了大众点评的Cat,有了Cat这些问题都可以迎刃而解!接下来我们将介绍Cat的简单使用

环境:jdk7,git,maven,mysql

一、下载源码

git clone https://github.com/dianping/cat

二、maven打包安装

mvn clean install -DskipTests
#此步骤将动态生成java代码提供给项目使用

三、数据库环境配置

mvn cat:install
#中间提示输入数据库连接地址 数据库连接用户名和密码
#eg:jdbc:mysql://192.168.0.149:3306
#用户名 root 密码 root
#若提示 /data/appdatas/cat 目录不存在 手动添加即可 mkdir -p /data/appdatas/cat

四、修改配置

cd /data/appdatas/cat
#可以看到生成的3个xml文件 client.xml server.xml dataSource.xml
#顾名思义 分别为客户端配置 服务端配置 数据库配置 因为cat本身既是服务端也是客户端 所以需要两个文件都配置
#client.xml
<?xml version="1.0" encoding="utf-8"?>

<config mode="client" xmlns:xsi="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="config.xsd">
        <servers>
           <server ip="192.168.0.130" port="2280" http-port="8080" />
        </servers>
</config>
#server.xml

<?xml version="1.0" encoding="utf-8"?>
<config local-mode="true" hdfs-machine="false" job-machine="false" alert-machine="true">
        <storage  local-base-dir="/data/appdatas/cat/bucket/" max-hdfs-storage-time="15" local-report-storage-time="7" local-logivew-storage-time="7">
        </storage>
        <console default-domain="Cat" show-cat-domain="true">
                <remote-servers>192.168.0.130:8080</remote-servers>
        </console>
</config>
#Local-mode为本地模式,设置为false,否则将不会使用数据库和hdfs存储
#Hdfs-machine是否启用hdfs存储,设为false
#Job-machine当前服务为报告工作机,当有多台服务器时,开启一台即可
#Alert-machine定义为报警机,同样开启一台即可,如没有一台开启,告警功能将不能够正常使用。
#Storage定义数据存储相关信息,这里定义了本地目录/data/appdatas/cat/buket/为存储目录,本地报告及本地日志保存时间均为7天。
#Console控制台信息,定义默认的domain为Cat(每个cat应用要求都需要有一个domain,Cat本身的domain为Cat),并显示cat的domain
#Remote-servers定义http服务列表,我这里就一台机器

五、启动cat

cd cat-home && mvn jetty:run
#这种为jetty中启动cat
#tomcat中启动cat
#将cat-home 项目下的target中的 cat-alpha-1.3.6.war 重命名为 cat.war
#将cat.war 复制到tomcat webapps目录下 启动tomcat
####注意####
#tomcat中设置使用jdk7 配置
#编辑catalina.sh首行添加
export JAVA_HOME="/usr/work/cat/jdk7"
#编辑setclasspath.sh首行添加
export JAVA_HOME="/usr/work/cat/jdk7"
###########

六、访问cat

jetty 访问:http://cat服务器IP:2281/cat
tomcat 访问:http://cat服务器IP:tomcat配置端口/cat

1

七、路由配置

用户名:catadmin 密码:catadmin

配置中找到 全局告警配置 全局路由

<?xml version="1.0" encoding="utf-8"?>
<router-config backup-server="192.168.0.130" backup-server-port="2280">
   <default-server id="192.168.0.130" weight="1.0" port="2280" enable="true"/>
</router-config>

修改完成后提交即可生效

八、客户端接入

<!--客户端引入pom-->
<dependency>
 <groupId>com.dianping.cat</groupId>
 <artifactId>cat-client</artifactId>   
 <version>1.3.6</version>
</dependency>
<!--如果线上使用需要将cat的依赖包添加到私服中使用-->

resouces目录下新建META-INF 新建cat目录和app.properties

app.properties内容为:

app.name=fwyun-shop-web

cat目录下新建client.xml,内容如下

<?xml version="1.0" encoding="UTF-8"?>
<config mode="client">
         <domain id="fwyun-shop-web"/>
</config>
<!--此处domain id 必须和app.name一致-->

spring-mvc.xml中配置CatInterceptor

<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/**"/>
			<bean class="com.fwyun.shop.web.controller.interceptor.CatInterceptor"></bean>
		</mvc:interceptor>
</mvc:interceptors>

CatInterceptor.java

public class CatInterceptor implements HandlerInterceptor {

  private static final Logger logger = LoggerFactory.getLogger(CatInterceptor.class);

  private ThreadLocal<Transaction> tranLocal = new ThreadLocal<Transaction>();
  private ThreadLocal<Transaction> pageLocal = new ThreadLocal<Transaction>();

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    try {
      String uri = request.getRequestURI();
      Transaction t = Cat.newTransaction("URL", uri);
      Cat.logEvent("URL.Method", request.getMethod(), Message.SUCCESS, request.getRequestURL()
          .toString());
      Cat.logEvent("URL.Host", request.getMethod(), Message.SUCCESS, request.getRemoteHost());
      tranLocal.set(t);
    } catch (Exception e) {
      logger.error("preHandle error,", e);
    }
    return true;
  }

  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
      ModelAndView modelAndView) throws Exception {
    try {
      String viewName = modelAndView != null ? modelAndView.getViewName() : "无";
      Transaction t = Cat.newTransaction("View", viewName);
      pageLocal.set(t);
    } catch (Exception e) {
      logger.error("postHandle error,", e);
    }
  }

  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
      Object handler, Exception ex) throws Exception {
    try {
      // 请求-页面渲染前
      Transaction pt = pageLocal.get();
      pt.setStatus(Transaction.SUCCESS);
      pt.complete();

      // 总计
      Transaction t = tranLocal.get();
      t.setStatus(Transaction.SUCCESS);
      t.complete();
    } catch (Exception e) {
      logger.error("afterCompletion error,", e);
    }
  }

}

自此客户端接入基本已经完成了,可是我们的客户端是怎么和我们的服务端(192.168.0.130)进行通讯的呢?

接入客户端

 mkdir -p /data/appdatas/cat

如果是windows 和项目根目录相同下 创建 /data/appdatas/cat 目录 复制服务端的client.xml到该目录下

这样客户端拦截有了,通讯有了,服务端起来了

自此客户端接入真的完成了

启动tomcat 并访问项目

九、查看监控结果

2

选择 fwyun-shop-web

3

自此 我们的前两个疑问已经解决了!

十、邮件告警

1、告警服务端配置

5

目前先以邮件为例

2、 默认告警人配置

6

详细告警规则 还需进一步深入研究

3、添加告警

8

4、测试告警

9

十一、GC,内存监控

10

至此,上面的疑问都已经解决了

来源:https://my.oschina.net/fuxingCoder/blog/750639