文章首發(fā)于微信公眾號《程序員果果》
地址:https://mp.weixin.qq.com/s/G15cw9yXpq4cOFB2C29JYw
簡介
CAT 是一個實時和接近全量的監(jiān)控系統(tǒng),它側(cè)重于對Java應(yīng)用的監(jiān)控,基本接入了美團上海所有核心應(yīng)用。目前在中間件(MVC、RPC免钻、數(shù)據(jù)庫、緩存等)框架中得到廣泛應(yīng)用酸员,為美團各業(yè)務(wù)線提供系統(tǒng)的性能指標(biāo)滞造、健康狀況、監(jiān)控告警等。
優(yōu)勢
- 實時處理:信息的價值會隨時間銳減波材,尤其是事故處理過程中股淡。
- 全量數(shù)據(jù):全量采集指標(biāo)數(shù)據(jù),便于深度分析故障案例廷区。
- 高可用:故障的還原與問題定位唯灵,需要高可用監(jiān)控來支撐。
- 故障容忍:故障不影響業(yè)務(wù)正常運轉(zhuǎn)隙轻、對業(yè)務(wù)透明埠帕。
- 高吞吐:海量監(jiān)控數(shù)據(jù)的收集,需要高吞吐能力做保證玖绿。
- 可擴展:支持分布式敛瓷、跨 IDC 部署,橫向擴展的監(jiān)控系統(tǒng)斑匪。
開源產(chǎn)品比較
快速上手
本地部署
步驟1:部署tomcat
準(zhǔn)備一個tomcat呐籽,修改 tomcat conf 目錄下 server.xml,防中文亂碼蚀瘸。
Connector port="8080" protocol="HTTP/1.1"
URIEncoding="utf-8" connectionTimeout="20000"
redirectPort="8443" /> <!-- 增加 URIEncoding="utf-8" -->
步驟2:程序?qū)τ?data/目錄具體讀寫權(quán)限(重要)
Linux
要求/data/目錄能進行讀寫操作狡蝶,如果/data/目錄不能寫,建議使用linux的軟鏈接鏈接到一個固定可寫的目錄贮勃。
此目錄會存一些CAT必要的配置文件以及運行時候的數(shù)據(jù)存儲目錄贪惹。
CAT支持CAT_HOME環(huán)境變量,可以通過JVM參數(shù)修改默認(rèn)的路徑寂嘉。
mkdir /data
chmod -R 777 /data/
- Windows
對程序運行盤下的/data/appdatas/cat和/data/applogs/cat有讀寫權(quán)限奏瞬。例如cat服務(wù)運行在e盤的tomcat中,則需要對e:/data/appdatas/cat和e:/data/applogs/cat有讀寫權(quán)限垫释。
步驟3: 配置/data/appdatas/cat/client.xml ($CAT_HOME/client.xml)
<?xml version="1.0" encoding="utf-8"?>
<config mode="client">
<servers>
<server ip="127.0.0.1" port="2280" http-port="8080"/>
</servers>
</config>
此配置文件的作用是所有的客戶端都需要一個地址指向CAT的服務(wù)端丝格。
步驟4: 安裝CAT的數(shù)據(jù)庫
下載cat源碼包:https://codeload.github.com/dianping/cat/
解壓后,數(shù)據(jù)庫的腳本文件為 script/CatApplication.sql
mysql -uroot -Dcat < CatApplication.sql
步驟5: 配置/data/appdatas/cat/datasources.xml($CAT_HOME/datasources.xml)
<?xml version="1.0" encoding="utf-8"?>
<data-sources>
<data-source id="cat">
<maximum-pool-size>3</maximum-pool-size>
<connection-timeout>1s</connection-timeout>
<idle-timeout>10m</idle-timeout>
<statement-cache-size>1000</statement-cache-size>
<properties>
<driver>com.mysql.jdbc.Driver</driver>
<url><![CDATA[jdbc:mysql://127.0.0.1:3306/cat]]></url> <!-- 請?zhí)鎿Q為真實數(shù)據(jù)庫URL及Port -->
<user>root</user> <!-- 請?zhí)鎿Q為真實數(shù)據(jù)庫用戶名 -->
<password>root</password> <!-- 請?zhí)鎿Q為真實數(shù)據(jù)庫密碼 -->
<connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000]]></connectionProperties>
</properties>
</data-source>
</data-sources>
步驟6: war打包
重命名為cat.war進行部署棵譬,注意此war是用jdk8显蝌,服務(wù)端請使用jdk8版本
步驟7: war部署
- 將上一步打包的war包部署到本機tomcat的webapps下。
- 啟動tomcat订咸,打開控制臺的URL曼尊,http://127.0.0.1:8080/cat/s/config?op=routerConfigUpdate 默認(rèn)用戶名:admin 默認(rèn)密碼:admin 。
- 配置客戶端路由脏嚷。
<?xml version="1.0" encoding="utf-8"?>
<router-config backup-server="你的本機ip(不要用127.0.0.1)" backup-server-port="2280">
<default-server id="你的本機ip(不要用127.0.0.1)" weight="1.0" port="2280" enable="true"/>
<network-policy id="default" title="默認(rèn)" block="false" server-group="default_group">
</network-policy>
<server-group id="default_group" title="default-group">
<group-server id="你的本機ip(不要用127.0.0.1)"/>
</server-group>
<domain id="cat">
<group id="default">
<server id="你的本機ip(不要用127.0.0.1)" port="2280" weight="1.0"/>
</group>
</domain>
</router-config>
提交后骆撇,重啟tomcat,訪問http://127.0.0.1:8080/cat父叙,出現(xiàn)如下界面神郊,說明搭建成功肴裙。
測試
安裝jar包
進入cat源碼包的 lib/java/jar ,將cat-client-3.0.0.jar 包 安裝到本地maven倉庫涌乳。
mvn install:install-file -DgroupId=com.dianping.cat -DartifactId=cat-client Dversion=3.0.0 -Dpackaging=jar -Dfile=cat-client-3.0.0.jar
創(chuàng)建工程
創(chuàng)建一個springboot 工程蜻懦,關(guān)鍵代碼如下。
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.dianping.cat</groupId>
<artifactId>cat-client</artifactId>
<version>3.0.0</version>
</dependency>
app.properties
需要在你的項目中創(chuàng)建 src/main/resources/META-INF/app.properties 文件, 并添加如下內(nèi)容:
app.name={appkey}
appkey 只能包含英文字母 (a-z, A-Z)夕晓、數(shù)字 (0-9)宛乃、下劃線 (_) 和中劃線 (-)
application.yml
server:
port: 8760
spring:
application:
name: cat-simple
啟動類
@SpringBootApplication
@RestController
public class CatSimpleApplication {
public static void main(String[] args) {
SpringApplication.run( CatSimpleApplication.class, args );
}
@PostMapping("/hi")
public String hi(HttpServletRequest request){
String url = request.getRequestURL().toString();
// 創(chuàng)建一個 Transaction
Transaction transaction = Cat.newTransaction( "URL", url );
try {
// 處理業(yè)務(wù)
myBusiness();
// 設(shè)置狀態(tài)
transaction.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
// 設(shè)置錯誤狀態(tài)
transaction.setStatus(e);
// 記錄錯誤信息
Cat.logError(e);
} finally {
// 結(jié)束 Transaction
transaction.complete();
}
return "hello";
}
@PostMapping("/error")
public String error(HttpServletRequest request){
String url = request.getRequestURL().toString();
// 創(chuàng)建一個 Transaction
Transaction transaction = Cat.newTransaction( "URL", url );
try {
// 處理業(yè)務(wù)
int i = 1 / 0;
// 設(shè)置狀態(tài)
transaction.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
// 設(shè)置錯誤狀態(tài)
transaction.setStatus(e);
// 記錄錯誤信息
Cat.logError(e);
} finally {
// 結(jié)束 Transaction
transaction.complete();
}
return "500";
}
private void myBusiness() {
//模擬業(yè)務(wù)處理的時間
try {
Thread.sleep( 500 );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
curl -X POST http://localhost:8760/hi
請求 http://localhost:8760/error
curl -X POST http://localhost:8760/error
查看監(jiān)控信息
進入 cat 控制臺,點擊 Transaction 按鈕 蒸辆,之后點擊全部征炼,會看到有哪些客戶端,如圖:
點擊客戶端 cat-simple 躬贡,出現(xiàn)如圖:
如上圖谆奥,可以清晰的看到 請求的 總個數(shù)(tatal)、均值(avg)逗宜、最大/最行塾摇(max/min)、標(biāo)準(zhǔn)差(std)等纺讲,其他都比較直觀擂仍,標(biāo)準(zhǔn)差稍微復(fù)雜一點,大家自己可以推演一下怎么做增量計算熬甚。那集合運算逢渔,比如95線(表示95%請求的完成時間)、999線(表示99.9%請求的完成時間)
點擊 “l(fā)og View” 可以查看 錯誤信息乡括,如圖:
源碼
https://github.com/gf-huanchupk/SpringCloudLearning/tree/master/chapter14