skywalking 5.X 分散式鏈路跟蹤 使用筆記
skywalking 簡介(鏈路跟蹤與分析)
隨著業務越來越複雜,企業應用也進入了分散式服務化的階段,隨著模組的不斷增多,一次請求可能會涉及到十幾個甚至幾十個服務的協同處理,那麼如何準確快速的定位到線上故障和效能瓶頸,便成為我們不得不面對的棘手問題,傳統的日誌監控等方式無法很好達到跟蹤呼叫,排查問題等需求。在谷歌論文《 Dapper,大規模分散式系統的跟蹤系統》的指導下,許多優秀的APM應運而生。
分散式追蹤系統發展很快,種類繁多,給我們帶來很大的方便。但在資料採集過程中,有時需要侵入使用者程式碼,並且不同系統的 API 並不相容,這就導致瞭如果您希望切換追蹤系統,往往會帶來較大改動。OpenTracing為了解決不同的分散式追蹤系統 API 不相容的問題,誕生了 OpenTracing 規範。OpenTracing 是一個輕量級的標準化層,它位於應用程式/類庫和追蹤或日誌分析程式之間。詳細介紹見
opentracing文件中文版。
Skywalking是一款APM(應用程式效能監視器),尤其適用於微服務,Cloud Native和基於容器的架構系統。也稱為分散式跟蹤系統。它提供了一種自動檢測應用程式的方法:無需更改目標應用程式的任何原始碼; 以及具有高效流媒體模組的收集器。
針對分散式系統的APM(應用效能監控)系統,特別針對微服務、cloud native和容器化(Docker, Kubernetes, Mesos)架構, 其核心是個分散式追蹤系統。
該專案由國人吳晟基於OpenTracking實現的開源專案skywalking(碼雲、github)
2017年12月8日,Apache軟體基金會孵化器專案管理委員會 ASF IPMC宣佈“SkyWalking全票通過,進入Apache孵化器”
skywalking 特點
效能好,針對單例項5000tps的應用,在全量採集的情況下,只增加 10% 的CPU開銷。詳細評測見《skywalking agent performance test》。
支援多語言探針
支援自動及手動探針;自動探針:Java支援的中介軟體、框架與類庫列表; 手動探針:OpenTrackingApi、@Trace註解、trackId整合到日誌中。
採用探針技術,在使用過程中,完全是0程式碼,無侵入,分散式自動採集與監控系統執行;
skywalking 下載
官方網站:
github專案地址:
下載
可以從上述地址下載,也可以直接到github上下載,選擇最新版本,執行環境:jdk7,jdk8,tomcat7,tomcat8(tomcat針對web專案),建議安裝使用過程,多看github上的doc文件;
部署 java agent
拷貝agent目錄到所需位置. 日誌,外掛和配置都包含在包中,請不要改變目錄結構.建議將該agent目錄與客戶端應用放在同一臺伺服器,多臺伺服器需要監控則都部署agent目錄,每臺伺服器上的應用配置本機的agent引數;
增加JVM啟動引數, -javaagent:/path/to/skywalking-agent/skywalking-agent.jar. 引數值為skywalking-agent.jar的絕對路徑。
新的 agent package 目錄結構如下:
+-- skywalking-agent
+-- activations
apm-toolkit-log4j-1.x-activation.jar
apm-toolkit-log4j-2.x-activation.jar
apm-toolkit-logback-1.x-activation.jar
...
+-- config
agent.config
+-- plugins
apm-dubbo-plugin.jar
apm-feign-default-http-9.x.jar
apm-httpClient-4.x-plugin.jar
.....
skywalking-agent.jar
啟動被監控應用.
高階特性
外掛全部放置在 /plugins 目錄中.新的外掛,也只需要在啟動階段,放在目錄中,就自動生效,刪除則失效.
Log預設使用檔案輸出到 /logs目錄中.
部署 java agent FAQs
Linux Tomcat 7, Tomcat 8
修改 tomcat/bin/catalina.sh,在首行加入如下資訊:
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/path/to/skywalking-agent/skywalking-agent.jar"; export CATALINA_OPTS
Windows Tomcat 7, Tomcat 8
修改 tomcat/bin/catalina.bat,在首行加入如下資訊:
set "CATALINA_OPTS=-javaagent:/path/to/skywalking-agent/skywalking-agent.jar"
JAR file
在啟動你的應用程式的命令列中新增 -javaagent 引數. 並確保在-jar引數之前新增它. 例如:
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -jar yourApp.jar
更改agent配置
在agent\config目錄中的agent.config內修改如下:
agent.application_code=CollectorDBCluster #對應elasticsearch中的clusterName,表示資料儲存的集合名稱
collector.servers=10.176.16.39:10800 #對應collector配置中的 naming
collector安裝與配置
所需的第三方軟體
JDK6+(被監控的應用程式執行在jdk6及以上版本)
JDK8+(SkyWalking collector和WebUI部署在jdk8及以上版本)
Elasticsearch 5.x(叢集模式或不使用)
Zookeeper 3.4.10(單機可不使用)
被監控應用的宿主伺服器系統時間(包含時區)與collectors,UIs部署的宿主伺服器時間設定正確且相同
部署 Zookeeper(叢集需要)
Zookeeper用於collector協作,僅在需要多個collector例項時才需要.
在每個collector例項的application.yml中新增Zookeeper叢集配置
cluster:
# zk用於管理collector叢集協作.
zookeeper:
# 多個zk連線地址用逗號分隔.
hostPort: localhost:2181
sessionTimeout: 100000
部署Elasticsearch
修改elasticsearch.yml檔案
設定 cluster.name: CollectorDBCluster。此名稱需要和collector配置檔案一致。
設定 node.name: anyname,可以設定為任意名字,如Elasticsearch為叢集模式,則每個節點名稱需要不同。
增加如下配置
# ES監聽的ip地址
network.host: 0.0.0.0
thread_pool.bulk.queue_size: 1000
請參閱ElasticSearch官方文件以瞭解如何部署叢集(推薦)
啟動 Elasticsearch
配置 collector
下面是關於collector連線配置的5種類型方式
naming :agent使用HTTP協議連線collectors
agent_gRPC :agent使用gRPC協議連線collectors
remote :Collector使用gRPC協議連線collector
ui :使用HTTP協議連線collector,(大多數情況不需要修改)
agent_jetty:agent使用HTTP協議連線collectors(可選連線)
以下是 application.yml的詳細的配置
config/application.yml
cluster:
# The Zookeeper cluster for collector cluster management.
zookeeper:
hostPort: localhost:2181
sessionTimeout: 100000
naming:
# Host and port used for agent config
jetty:
# 配置agent發現collector叢集,host必須要系統真實網路ip地址. agent --(HTTP)--> collector
host: localhost
port: 10800
contextPath: /
remote:
gRPC:
# 配置collector節點在叢集中相互通訊,host必須要系統真實網路ip地址. collectorN --(gRPC) --> collectorM
host: localhost
port: 11800
agent_gRPC:
gRPC:
# 配置agent上傳(鏈路跟蹤和指標)資料到collector,host必須要系統真實網路ip地址. agent--(gRPC)--> collector
host: localhost
port: 11800
agent_jetty:
jetty:
# 配置agent上傳(鏈路跟蹤和指標)資料到collector,host必須要系統真實網路ip地址. agent--(HTTP)--> collector
# SkyWalking native Java/.Net/node.js agents don't use this.
# Open this for other implementor.
host: localhost
port: 12800
contextPath: /
analysis_register:
default:
analysis_jvm:
default:
analysis_segment_parser:
default:
bufferFilePath: ../buffer/
bufferOffsetMaxFileSize: 10M
bufferSegmentMaxFileSize: 500M
ui:
jetty:
# 配置UI訪問collector,host必須要系統真實網路ip地址.
host: localhost
port: 12800
contextPath: /
# 配置Elasticsearch 叢集連線資訊
storage:
elasticsearch:
clusterName: CollectorDBCluster
clusterTransportSniffer: true
clusterNodes: localhost:9300
indexShardsNumber: 2
indexReplicasNumber: 0
highPerformanceMode: true
# 設定統計指標資料的失效時間,當指標資料失效時系統將資料自動刪除.
traceDataTTL: 90 # 單位為分
minuteMetricDataTTL: 45 # 單位為分
hourMetricDataTTL: 36 # 單位為小時
dayMetricDataTTL: 45 # 單位為天
monthMetricDataTTL: 18 # 單位為月
configuration:
default:
# namespace: xxxxx
# 告警閥值
applicationApdexThreshold: 2000
serviceErrorRateThreshold: 10.00
serviceAverageResponseTimeThreshold: 2000
instanceErrorRateThreshold: 10.00
instanceAverageResponseTimeThreshold: 2000
applicationErrorRateThreshold: 10.00
applicationAverageResponseTimeThreshold: 2000
# 熱力圖配置,修改配置後需要刪除熱力指標統計表,由系統重建
thermodynamicResponseTimeStep: 50
thermodynamicCountOfResponseTimeSteps: 40
參見下圖示例配置:
預設zk是註釋的;
1表示的naming,是agent代理連線collector的連線,配置配置0.0.0.0或localhsot,表示對當前collector所在的伺服器埠進行監聽;
2表示的agent_gRPC,是指通過naming連線到collertor之後,由collertor返回和告知agent傳送監控資料的gRPC連線,通常這個是配置,當前collector所在伺服器,埠預設;
3.表示當前的elasticsearch的連線配置,只需要配置clusterName和clusterNodes就行,如果有多個節點,則IP:prot之後用逗號隔開;clusterName必需agnet和collector一致;
配置 UI
UI的配置項儲存在webapp/webapp.yml中. 參考下面描述,更改 collector.ribbon.listOfServers並且與 naming.jetty引數值對應.
Config Description
server.port 預設監聽8080埠,修改該埠不能生效,則在skywalking-webapp.jar包application.yml中更改
collector.ribbon.listOfServers collector的訪問服務名稱(與config/application.yml中naming.jetty配置保持相同) 且若是多個 collector 服務名稱用','分隔
collector.path Collector 查詢uri地址. 預設是/graphql
collector.ribbon.ReadTimeout 查詢超時時間,預設是10秒
security.user.* 登入使用者名稱/密碼. 預設是 admin/admin
啟動 collector 節點
使用 bin/startup.sh同時啟動collector和UI,若不使用1啟動,需要單獨啟動,參考2,3
單獨啟動collector,執行 bin/collectorService.sh
單獨啟動UI,執行 bin/webappService.sh
自定義配置路徑過濾
提供了一個可選外掛 apm-trace-ignore-plugin
這個外掛的作用是對追蹤的個性化服務過濾.
你可以設定多個需要忽略的URL路徑, 意味著包含這些路徑的追蹤資訊不會被agent傳送到 collector.
當前的路徑匹配規則是 Ant Path匹配風格 , 例如 /path/*, /path/**, /path/?.
將apm-trace-ignore-plugin-x.jar拷貝到agent/plugins後,重啟探針即可生效
Skywalking-使用可選外掛 apm-trace-ignore-plugin 有詳細使用介紹
如何配置路徑
有兩種配置方式,可使用任意一種,配置生效的優先順序從高到低:
第一種:
在系統環境變數中配置,你需要在系統變數中新增skywalking.trace.ignore_path, 值是你需要忽略的路徑,多個以,號分隔
如:在啟動引數設定,新增-Dskywalking.trace.ignore_path=/your/path/**
第二種:
將/agent/optional-plugins/apm-trace-ignore-plugin/apm-trace-ignore-plugin.config 複製或剪下到 /agent/config/ 目錄下,加上配置
trace.ignore_path=/your/path/1/**,/your/path/2/**
支援Mysql資料庫分片儲存
除了預設的Elasticsearch儲存外,使用者可以用shardingJDBC結合MySQL作為儲存實現。 注意:目前僅支援MYSQL資料庫的分片儲存,且由於license限制,需要使用者手動引入mysql驅動包。
配置要求
手工匯入MYSQL的驅動包mysql-connector-java-5.1.36.jar到collector libs目錄下。
config/application.yml中,刪除Elasticsearch配置,新增shardingjdbc配置如下。
storage:
shardingjdbc:
driverClass: com.mysql.jdbc.Driver
# JDBC Datasource connections for ShardingJDBC, multiple should be separated by comma
url: jdbc:mysql://ip1:port1/skywalking,jdbc:mysql://ip2:port2/skywalking
# Usernames, which match the sequence of Datasource URLs
userName: admin,admin
# Passwords, which match the sequence of Datasource URLs
password: 123456,123456
使用SkyWalking手動追蹤API
使用 maven 和 gradle 依賴相應的工具包,該工具包通過mavne有可能無法下載,可手動下載jar匯入到maven
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>${skywalking.version}</version>
</dependency>
隨時使用 TraceContext.traceId() API,在應用程式的任何地方獲取traceId.
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
...
modelAndView.addObject("traceId", TraceContext.traceId());
示例程式碼,僅供參考
import org.apache.skywalking.apm.toolkit.trace.Trace;
對任何需要追蹤的方法,使用 @Trace 標註,則此方法會被加入到追蹤鏈中。
在被追蹤的方法中自定義 tag.
ActiveSpan.tag("my_tag", "my_value");
/**
* 對任何需要追蹤的方法,使用 @Trace 標註,則此方法會被加入到追蹤鏈中。
* 在被追蹤的方法中自定義 tag.
*/
@RequestMapping("/login")
@Trace
public String login(@RequestParam("userName") String userName, @RequestParam("passwrod") String passwrod){
logger.info("login to system1, user: " + userName);
//TraceContext.traceId() API,在應用程式的任何地方獲取traceId.
System.out.println(userName + "======" + passwrod + "========"+ TraceContext.traceId());
ActiveSpan.tag("login_tag", "login to system, user: " + userName);
return userService.login(userName,passwrod);
}
增加log4j2日誌元件整合
使用 maven 和 gradle 依賴相應的工具包
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-log4j-2.x</artifactId>
<version>{project.release.version}</version>
</dependency>
在log4j2.xml中的pattern 配置節,配置[%traceId]
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d [%traceId] %-5p %c{1}:%L - %m%n"/>
</Console>
</Appenders>
當你使用-javaagent引數啟用sky-walking的探針, 如果當前上下文中存在traceid,log4j2將在輸出traceId。如果探針沒有被啟用,將輸出TID: N/A.
監控介面
問題:
18-Jul-2018 18:55:26.296 嚴重 [SkywalkingAgent-2-GRPCChannelManager-0] org.apache.skywalking.apm.dependencies.io.grpc.internal.ManagedChannelImpl$ManagedChannelReference.cleanQueue *~*~*~ Channel org.apache.skywalking.apm.dependencies.io.grpc.internal.ManagedChannelImpl-83 for target localhost:11800 was not shutdown properly!!! ~*~*~*
Make sure to call shutdown()/shutdownNow() and awaitTermination().
答:將application.yml配置中的agent_gRPC下的host改成當前部署伺服器的IP,埠根據需要更改;
參考: