微服務之分佈式跟蹤系統(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, 虛心求教,有錯誤還請指正輕拍,謝謝

版權聲明:本文出自志健的原創文章,未經博主允許不得轉載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章