這篇文章介紹一下在微服務(springboot開發)的項目中使用pintpoint監控的過程及效果展示。
背景
随着項目微服務的進行,微服務數量逐漸增加,服務間的調用也越來越複雜,我們急切需要一個APM工具幫我們監控各個服務的性能及對服務間的調用進行跟蹤,而通過調研多個開源APM工具後,最終我們選擇了pintpoint。github位址是:pinpoint, 選擇它有4個方面原因:
- pinpoint是基于java開發的,利于項目後期對源代碼的修改
- 內建pinpoint不需要修改一行代碼
- pinpoint有非常直覺的UI,符合項目的目前需求
- 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下的檔案也是一樣
- profiler.collector.ip=collector部署的機器ip
- 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, 虛心求教,有錯誤還請指正輕拍,謝謝
版權聲明:本文出自志健的原創文章,未經部落客允許不得轉載