作一個系統,若是不作監控,是不完善的。java
若是爲作一個快速系統,花力氣去作監控,是不值得的。(監控系統不是你想作,想作就能作的。)linux
所以,咱們有必要具有一個可以快速創建監控體系的能力。即便你只是一個普通開發人員!(說不定明天就要叫你去領兵大操練呢)git
我的以爲,作監控要有三個核心能力:github
1. 持續收集數據的能力; (時間序列數據庫)
2. 監控結果可視化的能力;
3. 異常監控可報警的能力;
web
只要把這三點作到了,那麼,這個監控基本就成功了。spring
既然本身不方便作監控系統,那就只要作好框架選型就能夠了。數據庫
因grafana的圖表功能我的感受最強大,咱們就以 grafana 做爲監控抓手點,建立本身的監控體系吧!json
監控體系大致實現思路:vim
1. 代碼裏寫入埋點,或者其餘系統經過探針之類的工具實現數據源;
2. 監控數據中心接收埋點數據等指標數據集;
3. 監控中心提供各類維度數據的計算彙總指標;
4. 自定義圖表展示;
5. 根據結果設置報警;api
具體打開方法:
1. 寫代碼添加埋點;
2. 使用jmx採集工具採集數據;
3. 安裝 prometheus, 配置好要調用的客戶端;
4. 安裝grafana;
5. 配置 prometheus 的數據源到 grafana 上;
6. 添加 grafana 監控圖表;
7. 配置監控報警(通常你須要先配置linux郵件設置);
因此,看下具體怎麼作吧,涉及到安裝的部分就順帶過吧,畢竟其餘地方,此類信息已經氾濫了!
1. 擼埋點代碼(jmx)
.1 引入依賴包
<!-- jmx 埋點依賴 --> <dependency> <groupId>io.dropwizard.metrics</groupId> <artifactId>metrics-core</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>io.dropwizard.metrics</groupId> <artifactId>metrics-jmx</artifactId> <version>4.0.0</version> </dependency>
.2 封裝指標上報工具類
import com.codahale.metrics.Meter; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.jmx.JmxReporter; import org.springframework.stereotype.Component; /** * 系統指標管理管理器實現類 * */ @Component public class SystemMetricsManagerImpl implements SystemMetricsManager { private static final MetricRegistry metricsContainer = new MetricRegistry(); static { JmxReporter jmxReporter = JmxReporter.forRegistry(metricsContainer).build(); jmxReporter.start(); } @Override public Meter registerAndGetMetricMeter(String meterName) { return metricsContainer.meter(meterName); } }
.3 在須要的地方添加埋點
// 在必要的地方,進行集中初始化 @Override public void afterPropertiesSet() throws Exception { consumeCounterHolder = new ConsumeCounterHolder(); consumeCounterHolder.initCounter(); } /** * 計數器容器實例 */ private ConsumeCounterHolder consumeCounterHolder; /** * 消費計數器容器,做爲內部封裝,如以爲不爽,也能夠抽離爲獨立對象隔離 */ class ConsumeCounterHolder { /** * 全部消費計數器 */ private Meter totalConsumeCounter; /** * 被拋棄的消費計數器 */ private Meter msgDiscardConsumeCounter; /** * 系統異常消費計數器 */ private Meter systemExceptionConsumeCounter; /** * 業務消費失敗,回滾計數器 (通常不會存在值) */ private Meter processFailedConsumeCounter; /** * 中止消費計數器 */ private Meter listenerStoppedConsumeCounter; /** * 未知類型消費數計數器 */ private Meter unknownTypeConsumeCounter; /** * 初始化計數器 */ public void initCounter() { totalConsumeCounter = systemMetricsManager.registerAndGetMetricMeter( SystemMetricsConstants.MqConsumeCounter.TOTAL_COUNT_METRIC_NAME); msgDiscardConsumeCounter = systemMetricsManager.registerAndGetMetricMeter( SystemMetricsConstants.MqConsumeCounter.DISCARD_COUNT_METRIC_NAME); systemExceptionConsumeCounter = systemMetricsManager.registerAndGetMetricMeter( SystemMetricsConstants.MqConsumeCounter.SYSTEM_EXCEPTION_COUNT_METRIC_NAME); processFailedConsumeCounter = systemMetricsManager.registerAndGetMetricMeter( SystemMetricsConstants.MqConsumeCounter.PROCESS_FAILED_COUNT_METRIC_NAME); listenerStoppedConsumeCounter = systemMetricsManager.registerAndGetMetricMeter( SystemMetricsConstants.MqConsumeCounter.LISTENER_STOPPED_COUNT_METRIC_NAME); unknownTypeConsumeCounter = systemMetricsManager.registerAndGetMetricMeter( SystemMetricsConstants.MqConsumeCounter.UNKNOWN_TYPE_COUNT_METRIC_NAME); } /** * 增長消費計數 */ private void incTotalConsumeCounter() { totalConsumeCounter.mark(); } public void incMsgDiscardConsumeCounter() { msgDiscardConsumeCounter.mark(); } public void incSystemExceptionConsumeCounter() { systemExceptionConsumeCounter.mark(); } public void incProcessFailedConsumeCounter() { processFailedConsumeCounter.mark(); } public void incListenerStoppedConsumeCounter() { listenerStoppedConsumeCounter.mark(); } public void incUnknownTypeConsumeCounter() { unknownTypeConsumeCounter.mark(); } } /** * 業務方法中,調用埋點 * */ public void doSth() { // 添加各類埋點 consumeCounterHolder.incTotalConsumeCounter(); }
2. 使用jmx採集工具採集數據 (prometheus)
prometheus 做爲流行的監控組件,能夠很方便的接入 jmx 數據, 使用 jmxReporter 就能夠了。
prometheus 項目地址: https://github.com/prometheus
jmxReporter 項目地址: https://github.com/prometheus/jmx_exporter
下載 jmxReporter agent: https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.11.0/jmx_prometheus_javaagent-0.11.0.jar
添加最簡單的配置文件,採集全部jmx數據:
# vim config.yaml --- rules: - pattern: ".*"
最後,啓動 jmxReporter, 提供採集依據:
java -javaagent:./jmx_prometheus_javaagent-0.11.0.jar=9088:config.yaml -jar yourJar.jar
注: jmxReporter 的原理實際上是開啓一個http的socket端口,在外部請求進來以後,進行訪問jmx數據進行返回。
3. 安裝prometheus服務端,進行主動數據採集
.1 下載: https://prometheus.io/download/ , 找到對應版本下載便可;
.2 直接啓動驗證下: ./prometheus --config.file=prometheus.yml --web.enable-admin-api
.3 向 prometheus 中添加客戶端機器地址,以便採集,咱們只使用一種簡單的獨立文件的配置方式:
# 1. 直接在文件末尾添加job便可 - job_name: 'jmx' file_sd_configs: - files: - conf.d/test.json # 2. 在 conf.d/test.json 中,添加相應的客戶端機器ip [ { "targets": ["10.1.1.1:9088"] },{ "targets": ["10.1.1.2:9088"] },{ "targets": ["10.1.1.3:9088"] } ]
.4 重啓 prometheus
kill -9 xxx ./prometheus --config.file=prometheus.yml --web.enable-admin-api
如此, prometheus 的數據庫中就已經有 你的埋點數據了!
4. 安裝 grafana
.1 下載地址: https://grafana.com/get
.2 能夠直接使用鏡像源安裝,也可使用源碼包自行編譯;
.3 啓動 grafana 服務: service grafana-server start
.4 你就能夠打開 grafana 後臺進行查看了(默認帳號密碼是 admin/admin);
5. 新增 prometheus 做爲 grafana 的數據源
grafana 支持不少數據源的接入,可是 prometheus 是比較簡單的一種;
在設置 -> DataSources 中,添加 prometheus 的數據,按要求填寫便可,通常只須要填寫一個 prometheus 的請求地址就能夠了。
6. 添加 grafana 監控圖表;
直接點擊 + 號,添加一個大盤;
而後就是各類頁面拖拉拽!
拿幾個須要注意的指標統計說明下:
# case1. 代碼中的埋點爲一個遞增的值,我想知道每段時間的增加趨勢是怎麼樣的?如: 1分鐘 increase(metrics_test_mq_consume_total_Count[1m]) # case2. 在集羣環境中,以上統計將是全部機器的總和,我想查看單個機器的增加趨勢? increase(metrics_test_mq_consume_total_Count{instance=~"$instance_cust"}[1m]) # 其中 instance_cust 是定義在監控大盤上的自定義變量,其做用是 當前監控的實例的標識, 稍後咱們看下實例 # case3. 我想知道下當前機器的cpu負載 avg_over_time(java_lang_OperatingSystem_SystemCpuLoad{instance=~"$instance_cust"}[1m]) * 100 # case4. 我想查看當前機器的物理內存狀況 java_lang_OperatingSystem_FreePhysicalMemorySize{instance=~"$instance_cust"} java_lang_OperatingSystem_TotalPhysicalMemorySize{instance=~"$instance_cust"} # case5. 我想查看jvm的內存狀況 java_lang_Memory_HeapMemoryUsage_max{instance=~"$instance_cust"} java_lang_Memory_HeapMemoryUsage_used{instance=~"$instance_cust"} # 附: 添加大盤 通用變量 label_values(up{job='jmx'}, instance) 將會查詢符合過濾條件的標籤
附: 添加大盤 通用變量
label_values(up{job='jmx'}, instance) 將會查詢符合過濾條件的標籤
7. 配置監控報警(通常你須要先配置linux郵件設置);
以上都配置好以後,還能夠進行報警配置。
alerting -> Notification Channels 中,添加告警通知通道。
而後,在原來的大盤中選擇一個指標進行報警設置;而後就能夠接收告警了。
固然,這裏選擇郵件,須要linux系統直接使用 mail 進行發送郵件才行。
如此,一個完整的監控鏈完成!
老話: 願你戎馬半生,歸來還是少年。