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
七、路由配置
用户名: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 并访问项目
九、查看监控结果
选择 fwyun-shop-web
自此 我们的前两个疑问已经解决了!
十、邮件告警
1、告警服务端配置
目前先以邮件为例
2、 默认告警人配置
详细告警规则 还需进一步深入研究
3、添加告警
4、测试告警
十一、GC,内存监控
至此,上面的疑问都已经解决了
来源:https://my.oschina.net/fuxingCoder/blog/750639