skywalking 簡介(鏈路跟蹤與分析)html
隨着業務愈來愈複雜,企業應用也進入了分佈式服務化的階段,隨着模塊的不斷增多,一次請求可能會涉及到十幾個甚至幾十個服務的協同處理,那麼如何準確快速的定位到線上故障和性能瓶頸,便成爲咱們不得不面對的棘手問題,傳統的日誌監控等方式沒法很好達到跟蹤調用,排查問題等需求。在谷歌論文《 Dapper,大規模分佈式系統的跟蹤系統》的指導下,許多優秀的APM應運而生。java
分佈式追蹤系統發展很快,種類繁多,給咱們帶來很大的方便。但在數據採集過程當中,有時須要侵入用戶代碼,而且不一樣系統的 API 並不兼容,這就致使了若是您但願切換追蹤系統,每每會帶來較大改動。OpenTracing爲了解決不一樣的分佈式追蹤系統 API 不兼容的問題,誕生了 OpenTracing 規範。OpenTracing 是一個輕量級的標準化層,它位於應用程序/類庫和追蹤或日誌分析程序之間。詳細介紹見node
opentracing文檔中文版。python
Skywalking是一款APM(應用程序性能監視器),尤爲適用於微服務,Cloud Native和基於容器的架構系統。也稱爲分佈式跟蹤系統。它提供了一種自動檢測應用程序的方法:無需更改目標應用程序的任何源代碼; 以及具備高效流媒體模塊的收集器。mysql
針對分佈式系統的APM(應用性能監控)系統,特別針對微服務、cloud native和容器化(Docker, Kubernetes, Mesos)架構, 其核心是個分佈式追蹤系統。git
該項目由國人吳晟基於OpenTracking實現的開源項目skywalking(碼雲、github)github
2017年12月8日,Apache軟件基金會孵化器項目管理委員會 ASF IPMC宣佈「SkyWalking全票經過,進入Apache孵化器」web
skywalking 特色sql
性能好,針對單實例5000tps的應用,在全量採集的狀況下,只增長 10% 的CPU開銷。詳細評測見《skywalking agent performance test》。數據庫
支持多語言探針
支持自動及手動探針;自動探針:Java支持的中間件、框架與類庫列表; 手動探針:OpenTrackingApi、@Trace註解、trackId集成到日誌中。
採用探針技術,在使用過程當中,徹底是0代碼,無侵入,分佈式自動採集與監控系統運行;
skywalking 下載
官方網站:
http://incubator.apache.org/projects/skywalking.html
github項目地址:
https://github.com/OpenSkywalking/skywalking-netcore
下載
http://skywalking.apache.org/downloads/
能夠從上述地址下載,也能夠直接到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,端口根據須要更改;
參考:
https://www.oschina.net/news/95324/apache-skywalking-apm-support-dot-net-core