1. 程式人生 > >微服務之分散式跟蹤系統(springboot+pinpoint)

微服務之分散式跟蹤系統(springboot+pinpoint)

這篇文章介紹一下在微服務(springboot開發)的專案中使用pintpoint監控的過程及效果展示。

背景

隨著專案微服務的進行,微服務數量逐漸增加,服務間的呼叫也越來越複雜,我們急切需要一個APM工具幫我們監控各個服務的效能及對服務間的呼叫進行跟蹤,而通過調研多個開源APM工具後,最終我們選擇了pintpoint。github地址是:pinpoint, 選擇它有4個方面原因:

  1. pinpoint是基於java開發的,利於專案後期對原始碼的修改
  2. 整合pinpoint不需要修改一行程式碼
  3. pinpoint有非常直觀的UI,符合專案的當前需求
  4. pinpoint的社群還是挺活躍,一般提問題第二天就有專案的committer回覆

Pinpoint

簡介

Pinpoint是一個開源的 APM (Application Performance Management/應用效能管理)工具,用於基於java的大規模分散式系統。在使用上力圖簡單高效,通過在啟動時安裝agent,不需要修改哪怕一行程式碼,最小化效能損失(3%).

盜用一張官網上的圖,通過原始碼你也能發現,pinpoint包含3個主要的元件:

  • Collector, 收集應用中agent傳送的資料並存儲到Hbase中
  • Agent,  是和應用一起啟動的和應用共享JVM,定時傳送資料給Collector
  • Web UI, 從hbase中讀取資料並展示給使用者,之後會有demo展示其功能

支援的模組

  • JDK 6+
  • Tomcat 6/7/8, Jetty 8/9
  • Spring, Spring Boot
  • Apache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClient
  • Thrift Client, Thrift Service
  • MySQL, Oracle, MSSQL, CUBRID, DBCP, POSTGRESQL
  • Arcus, Memcached, Redis
  • iBATIS, MyBatis
  • gson, Jackson, Json Lib
  • log4j, Logback

分散式追蹤原理

pinpoint的實現是基於Google Dapper論文,Google dapper提出了一個簡單的解決方案來解決分散式追蹤的問題。這個解決方案通過在傳送訊息時新增應用級別的標籤作為訊息之間的關聯。例如,在HTTP請求中的HTTP header中為訊息新增一個標籤資訊並使用這個標籤跟蹤訊息。

如下圖所示,在微服務之間的一次請求過程,請求經過的每個節點時都會生成一組TxId,SpanId,pSpanId併發送到collector中,TxId體現了三次不同的RPC作為單個事務被相互關聯,同時Pinpoint可以通過SpanId,pSpanId發現關聯的n個Span,並將這n個span排列為繼承樹結構。

簡單效果

實戰整合

打包

專案使用的是pinpoint 1.6.2, 官網已經有更新了,目前功能夠用,不打算更新。

  • 在打包之前你需要將jdk6,jdk7,jdk8在要打包的機器上裝好,通過下面3個命令export出來,我也不知道為什麼打包這個需要裝3個版本的jdk, 確實有點反人類。

export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home

export JAVA_6_HOME=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

export JAVA_7_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home

  • 將程式碼從github中clone下來,開啟agent/src/main/resoucrs-local/pinpoint.config,修改如下幾點,resource-release下的檔案也是一樣
  1. profiler.collector.ip=collector部署的機器ip
  2. profiler.sampling.rate=10 ## 按照10%概率抽樣
  • 開啟web/src/main/resources/hbase.properties, 修改hbase的連線地址:

hbase.client.host=hbase地址
hbase.client.port=hbase埠

  • 開啟collector/src/main/resources/hbase.properties, 修改hbase的連線地址:

hbase.client.host=hbase地址
hbase.client.port=hbase埠

  • 在主目錄下輸入mvn package -DskipTests=true打包, 會生成下面3個重要的檔案,留好它們後面需要用

web/target/pinpoint-web-1.6.2.war

collector/target/pinpoint-collector-1.6.2.war

agent/target/pinpoint-agent-1.6.2.tar.gz

部署collecor和web

下載最新的tomcat,解壓縮將上面的war包部署到webapps目錄下,如下是部署的例子,其中

  • portal部署檔案: ROOT.war, 這個是由build打包過程中的web/target/pinpoint-web-1.6.2.war重新命名而來
  • collector部署檔案:collector.war這個是由build打包過程中的collector/target/pinpoint-collector-1.6.2.war重新命名而來

  • 啟動tomcat, 檢查一下tomcat的log沒有錯誤.

訪問tomcat的地址,如果部署正常,則能看見UI,只是目前沒有資料

部署agent

由於專案是springboot開發,採用內嵌的tomcat容器,打成jar包後,啟動的時候採用如下指令碼:

export APPLICATION_NAME=TEST

tar xvf pinpoint-agent.tar.gz

exec java -jar -Xms768m -Xmx768m -javaagent:./pinpoint-bootstrap-1.6.2.jar -Dspring.profiles.active=dev -Dpinpoint.agentId=myvm -Dpinpoint.applicationName=$APPLICATION_NAME xxx.jar

啟動後再重新整理一下web ui的介面,會發現已經有一個應用的資料顯示的。

功能展示

服務響應時間的分佈:

研究特定請求的呼叫棧:

優缺點總結

優點:

  • 使用位元組碼增強使得pinpoint不需要現有程式碼的修改,可以隨時切換。
  • 直觀的圖形化的介面,支援分散式的叢集監控,能夠對同一個服務不同instance同時記錄。
  • 提供報警機制,可以自由定製。
  • 可開發外掛定製需要的指標,例如rabbitmq外掛。

缺點:

  • 位元組碼增強技術讓應用容易造成風險。如果問題發生在pinpoint中,它會影響應用。
  • 文件目前比較少,社群還沒有很活躍。

總結

這篇文章介紹了專案中pinpoint整合的過程,希望能幫到正在做微服務化並且在尋找監控工具的童鞋們。

歡迎關注我的個人的部落格www.zhijianliu.cn, 虛心求教,有錯誤還請指正輕拍,謝謝