通過SkyWalking上報(bào)Java應(yīng)用數(shù)據(jù)
本文中含有需要您注意的重要提示信息,忽略該信息可能對(duì)您的業(yè)務(wù)造成影響,請(qǐng)務(wù)必仔細(xì)閱讀。
通過SkyWalking為應(yīng)用埋點(diǎn)并上報(bào)鏈路數(shù)據(jù)至可觀測(cè)鏈路 OpenTelemetry 版后,可觀測(cè)鏈路 OpenTelemetry 版即可開始監(jiān)控應(yīng)用,您可以查看應(yīng)用拓?fù)洹⒄{(diào)用鏈路、異常事務(wù)、慢事務(wù)和SQL分析等一系列監(jiān)控?cái)?shù)據(jù)。本文介紹如何使用SkyWalking Java Agent進(jìn)行自動(dòng)埋點(diǎn),以及SkyWalking Java Agent可配置屬性的相關(guān)信息。
前提條件
打開SkyWalking下載頁(yè)面,下載SkyWalking 6.X.X或以上版本(建議下載最新穩(wěn)定版本),并將解壓后的Agent文件夾放至Java進(jìn)程有訪問權(quán)限的目錄。
插件均放置在
/plugins
目錄中。在啟動(dòng)階段將新的插件放進(jìn)該目錄,即可令插件生效。將插件從該目錄刪除,即可令其失效。另外,日志文件默認(rèn)輸出到/logs
目錄中。
日志、插件和配置文件都在Agent文件夾中,請(qǐng)不要改變文件夾結(jié)構(gòu)。
新版控制臺(tái)
登錄可觀測(cè)鏈路 OpenTelemetry 版控制臺(tái),在左側(cè)導(dǎo)航欄單擊接入中心。
在開源框架區(qū)域單擊SkyWalking卡片。
在彈出的SkyWalking面板中選擇數(shù)據(jù)需要上報(bào)的地域。
說明初次接入的地域?qū)?huì)自動(dòng)進(jìn)行資源初始化。
選擇連接方式,然后復(fù)制接入點(diǎn)信息。
若您的服務(wù)部署在阿里云上,且所屬地域與選擇的接入地域一致,推薦使用阿里云內(nèi)網(wǎng)方式,否則選擇公網(wǎng)方式。
舊版控制臺(tái)
在左側(cè)導(dǎo)航欄單擊集群配置,然后在右側(cè)頁(yè)面單擊接入點(diǎn)信息頁(yè)簽。
在頁(yè)面頂部選擇需要接入的地域,然后在集群信息區(qū)域打開顯示Token開關(guān)。
在客戶端采集工具區(qū)域單擊SkyWalking。
在相關(guān)信息列中,獲取接入點(diǎn)信息。
說明如果應(yīng)用部署于阿里云生產(chǎn)環(huán)境,則選擇阿里云VPC網(wǎng)絡(luò)接入點(diǎn),否則選擇公網(wǎng)接入點(diǎn)。
背景信息
SkyWalking是一款廣受歡迎的國(guó)產(chǎn)APM(Application Performance Monitoring,應(yīng)用性能監(jiān)控)產(chǎn)品,主要針對(duì)微服務(wù)、Cloud Native和容器化(Docker、Kubernetes、Mesos)架構(gòu)的應(yīng)用。SkyWalking的核心是一個(gè)分布式追蹤系統(tǒng)。
要通過SkyWalking將Java應(yīng)用數(shù)據(jù)上報(bào)至可觀測(cè)鏈路 OpenTelemetry 版控制臺(tái),首先需要完成埋點(diǎn)工作。SkyWalking既支持自動(dòng)探針(Dubbo、gRPC、JDBC、OkHttp、Spring、Tomcat、Struts、Jedis等),也支持手動(dòng)埋點(diǎn)(OpenTracing)。本文介紹自動(dòng)埋點(diǎn)方法。
示例Demo
示例代碼倉(cāng)庫(kù)地址:SkyWalking Demo
用SkyWalking為Java應(yīng)用自動(dòng)埋點(diǎn)
打開
config/agent.config
,配置接入點(diǎn)和令牌。說明請(qǐng)將
<endpoint>
和<auth-token>
分別替換成控制臺(tái) 頁(yè)面上SkyWalking客戶端在相應(yīng)地域的接入點(diǎn)和鑒權(quán)令牌。關(guān)于獲取方法,請(qǐng)參見前提條件。collector.backend_service=<endpoint> agent.authentication=<auth-token>
采用以下方法之一配置應(yīng)用名稱(Service Name)。
重要請(qǐng)將
<ServiceName>
替換為您的應(yīng)用名稱。如果同時(shí)采用以下兩種方法,則僅第二種方法(在啟動(dòng)命令行中添加參數(shù))生效。打開
config/agent.config
,配置應(yīng)用名稱。agent.service_name=<ServiceName>
在應(yīng)用程序的啟動(dòng)命令行中添加-Dskywalking.agent.service_name參數(shù)。
java -javaagent:<skywalking-agent-path> -Dskywalking.agent.service_name=<ServiceName> -jar yourApp.jar
根據(jù)應(yīng)用的運(yùn)行環(huán)境,選擇相應(yīng)的方法來指定SkyWalking Agent的路徑。
說明請(qǐng)將以下示例代碼中的
<skywalking-agent-path>
替換為Agent文件夾中的skywalking-agent.jar的絕對(duì)路徑。Linux Tomcat 7 / Tomcat 8
在
tomcat/bin/catalina.sh
第一行添加以下內(nèi)容:CATALINA_OPTS="$CATALINA_OPTS -javaagent:<skywalking-agent-path>"; export CATALINA_OPTS
Windows Tomcat 7 / Tomcat 8
在
tomcat/bin/catalina.bat
第一行添加以下內(nèi)容:set "CATALINA_OPTS=-javaagent:<skywalking-agent-path>"
JAR File或Spring Boot
在應(yīng)用程序的啟動(dòng)命令行中添加-javaagent參數(shù)。
重要-javaagent參數(shù)一定要在-jar參數(shù)之前。
java -javaagent:<skywalking-agent-path> -jar yourApp.jar
Jetty
在
{JETTY_HOME}/start.ini
配置文件中添加以下內(nèi)容:--exec # 去掉前面的井號(hào)取消注釋。 -javaagent:<skywalking-agent-path>
重新啟動(dòng)應(yīng)用。
Java Agent可配置屬性
SkyWalking Java Agent支持豐富的用戶可配置屬性。完整的屬性配置詳情,請(qǐng)參見示例Demo的config/agent.config文件。
屬性列表(部分)
以下屬性以apache-skywalking-java-agent-8.16.0為準(zhǔn)。
屬性名 | 描述 | 默認(rèn)值 |
agent.namespace | 命名空間,用于隔離跨進(jìn)程傳播的header。如果進(jìn)行了配置,header將為HeaderName:Namespace。 | 未設(shè)置 |
agent.service_name | 在SkyWalking UI中展示的服務(wù)名。5.x版本對(duì)應(yīng)Application,6.x版本對(duì)應(yīng)Service。 建議:為每個(gè)服務(wù)設(shè)置唯一的名字,服務(wù)下的多個(gè)實(shí)例使用相同的服務(wù)名。 | Your_ApplicationName |
agent.sample_n_per_3_secs | 負(fù)數(shù)或0表示不采樣,默認(rèn)不采樣。SAMPLE_N_PER_3_SECS表示每3秒采樣N條。 | 未設(shè)置 |
agent.authentication | 鑒權(quán)是否開啟取決于后端的配置,可查看服務(wù)端接入點(diǎn)的鑒權(quán)Token。對(duì)于大多數(shù)的場(chǎng)景,需要后端對(duì)鑒權(quán)進(jìn)行擴(kuò)展。目前僅實(shí)現(xiàn)了基本的鑒權(quán)功能。 | 未設(shè)置 |
agent.span_limit_per_segment | 單個(gè)segment中span的最大數(shù)量。通過這個(gè)配置項(xiàng),SkyWalking可評(píng)估應(yīng)用程序內(nèi)存使用量。 | 未設(shè)置 |
agent.ignore_suffix | 如果這個(gè)集合中包含了第一個(gè)span的操作名,這個(gè)segment將會(huì)被忽略掉。 | 未設(shè)置 |
agent.is_open_debugging_class | 如果為true,SkyWalking會(huì)將所有經(jīng)Instrument轉(zhuǎn)換過的類文件保存到/debugging文件夾下。SkyWalking團(tuán)隊(duì)會(huì)要求提供這些類文件以解決兼容性問題。 | 未設(shè)置 |
agent.cause_exception_depth | 在記錄異常信息的時(shí)候,探針需要記錄的堆棧深度。 | 5 |
agent.force_reconnection_period | gRPC的強(qiáng)制重連周期,基于grpc_channel_check_interval。 | 1 |
agent.operation_name_threshold | 設(shè)置操作名不建議超過的最大長(zhǎng)度(190)。 | 150 |
agent.keep_tracing | 如果該值為true,即使后臺(tái)不可用,也要保持跟蹤。 | false |
osinfo.ipv4_list_size | 限制IPv4列表的長(zhǎng)度。 | 10 |
collector.grpc_channel_check_interval | 檢查gRPC的Channel狀態(tài)的時(shí)間間隔。 | 30 |
collector.backend_service | 接收SkyWalking Trace數(shù)據(jù)的后端地址。 | 127.0.0.1:11800 |
collector.heartbeat_period | 探針心跳報(bào)告時(shí)間。單位:秒。 | 30 |
collector.grpc_upstream_timeout | gRPC客戶端向上游發(fā)送數(shù)據(jù)時(shí)超時(shí)多長(zhǎng)時(shí)間。單位:秒。 | 30 |
collector.get_profile_task_interval | 嗅探器獲取配置文件任務(wù)列表間隔。 | 20 |
logging.level | 日志級(jí)別。默認(rèn)為debug。 | DEBUG |
logging.file_name | 日志文件名。 | skywalking-api.log |
logging.output | 日志輸出方式,默認(rèn)是文件,使用控制臺(tái)默認(rèn)為標(biāo)準(zhǔn)輸出(命令行直接輸出)。 | FILE |
logging.dir | 日志目錄。默認(rèn)為空串,表示使用 |
|
logging.pattern | 日志格式。所有的轉(zhuǎn)換說明符:
| %level %timestamp %thread %class : %msg %throwable |
logging.max_file_size | 日志文件的最大大小。當(dāng)日志文件大小超過該值,歸檔當(dāng)前的日志文件,并將日志寫入到新文件中。 | 300 * 1024 * 1024 |
logging.max_history_files | 最大歷史日志文件數(shù)量。默認(rèn)情況下,負(fù)數(shù)或0表示關(guān)閉。 | -1 |
配置方式
系統(tǒng)屬性
使用-Dskywalking.
+ agent.config
配置文件的key。例如:
# 通過系統(tǒng)屬性配置agent.service_name
java -javaagent:/path/to/skywalking-agent.jar -Dskywalking.agent.service_name=<your_service_name> -jar your-project.jar
代理選項(xiàng)
在JVM參數(shù)中的代理路徑之后添加屬性即可。
# 模板
-javaagent:/path/to/skywalking-agent.jar=[key1]=[value1],[key2]=[value2]
# 舉例
java -javaagent:/path/to/skywalking-agent.jar=agent.service_name=<your-service-name>,agent.authentication=<your-token> -jar your-project.jar
系統(tǒng)環(huán)境變量
將屬性配置成系統(tǒng)環(huán)境變量,skywalking-agent會(huì)自動(dòng)獲取。可以在config/agent.config文件中查詢具體屬性對(duì)應(yīng)的系統(tǒng)環(huán)境變量,例如agent.service_name的系統(tǒng)環(huán)境變量為SW_AGENT_NAME。
agent.service_name=${SW_AGENT_NAME:default_name}
# 配置環(huán)境變量
export SW_AGENT_NAME=<your_service_name>
優(yōu)先級(jí)
以上配置方式的優(yōu)先級(jí)從高到低依次為代理選項(xiàng)、系統(tǒng)屬性、系統(tǒng)環(huán)境變量、配置文件。
Java Agent插件
SkyWalking Java Agent支持多種中間件、框架和庫(kù)。支持的所有插件可在示例Demo的/plugins文件夾下查看。
激活插件
所有在/plugins文件夾下的插件都是已被激活的插件。若從/plugins中移除某個(gè)插件的jar包,則表示插件不可用。
官方已支持插件
官方支持的插件都已在/plugins文件夾下。
可選插件
Java Agent的插件支持可插拔。在Agent或第三方倉(cāng)庫(kù)的optional-plugins文件夾下提供了可選的插件。 想要使用可選插件,可以將對(duì)應(yīng)插件移動(dòng)到/plugins文件夾下。
Bootstrap類插件
由于意外風(fēng)險(xiǎn),所有Bootstrap插件都是可選的。Bootstrap插件在bootstrap-plugins文件夾中。若需要使用這些插件,可以將目標(biāo)插件的jar文件放入/plugins文件夾下。
支持插件列表
關(guān)于下面的插件,官方認(rèn)為可能存在性能影響或者使用限制,所以只在第三方倉(cāng)庫(kù)發(fā)布。更多信息請(qǐng)參見SkyAPM Java插件擴(kuò)展倉(cāng)庫(kù)。
框架 | 插件版本 | |
HTTP Server | ||
Spring MVC 3.x, 4.x 5.x with servlet 3.x | ||
HTTP Client | ||
Netflix Spring Cloud Feign 1.1.x, 1.2.x, 1.3.x | ||
HTTP Gateway | ||
JDBC | Mysql Driver 5.x, 6.x, 8.x | |
Oracle Driver | ||
H2 Driver 1.3.x -> 1.4.x | ||
PostgreSQL Driver 8.x, 9.x, 42.x | ||
Mariadb Driver 2.x, 1.8 | ||
RPC框架 | ||
MQ | ||
NoSQL | Redis | |
MongoDB | ||
Memcached Client | ||
SolrJ 7.x | ||
服務(wù)發(fā)現(xiàn) | ||
分布式協(xié)調(diào) | ||
Spring生態(tài)系統(tǒng) | Spring Bean annotations(@Bean, @Service, @Component, @Repository) 3.x and 4.x | |
Spring Core Async SuccessCallback/FailureCallback/ListenableFutureCallback 4.x | ||
調(diào)度器 | ||
OpenTracing社區(qū)支持 | ||
JSON | ||
Vert.x 生態(tài) | Vert.x Eventbus 3.2+ | |
Vert.x Web 3.x | ||
線程調(diào)度框架 | ||
緩存 | ||
Kotlin |
插件開發(fā)
您可以參考官方文檔自定義開發(fā)一個(gè)SkyWalking Java Agent Plugin。
可觀測(cè)鏈路 OpenTelemetry 版支持Trace上報(bào),您可以參考官方文檔開發(fā)一個(gè)自定義的Trace Plugin。
常見問題
問:SkyWalking正常連接服務(wù)端后,無法創(chuàng)建應(yīng)用?
答:可能是由于鏈路追蹤的數(shù)據(jù)未上報(bào)。您需要檢查是否有鏈路追蹤的數(shù)據(jù)上報(bào),可以查看{skywalking agent path}/logs/skywalking-api.log內(nèi)容。如果有數(shù)據(jù)上報(bào),則顯示如下圖所示。
如果未產(chǎn)生數(shù)據(jù)上報(bào),則可能原因是:開啟采樣、設(shè)置過濾或未觸發(fā)生成鏈路追蹤的請(qǐng)求。