使用skywalking監控java項目


官方教程

官方教程文檔地址:https://skyapm.github.io/document-cn-translation-of-skywalking/zh/8.0.0/setup/service-agent/java-agent/

從官方文檔中可以知道以下幾點
1.需要jdk環境 (7.x版本中代理支持 JDK 8 - 14, 6.x版本支持JDK 1.6 - JDK 12)
2.需要修改兩處配置 (config/agent.config中的agent.service_name和config/agent.config中的collector.backend_service。默認指向127.0.0.1:11800,表示僅作用於本地后端)
3.需要在項目jar包前面加上skywalking-agent.jar,並且確保這個參數在-jar參數之前。
比如:java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -jar yourApp.jar

當前項目情況介紹

java項目都是封裝成docker鏡像后運行容器的,其Dockerfile文件如下:

FROM jdd.io/jre:1.8.0_275
MAINTAINER 1103324414@qq.com
EXPOSE 8088
ADD target/demo-0.0.1-SNAPSHOT.jar demo-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-jar","demo-0.0.1-SNAPSHOT.jar"]
CMD ["--spring.profiles.active=test"]

其中基礎鏡像:jdd.io/jre:1.8.0_275是使用如下Dockerfile進行封裝生成的,里面安裝的有jre8環境

FROM jeanblanchard/alpine-glibc:latest
MAINTAINER sandu <1103324414@qq.com>
COPY localtime /etc/localtime
COPY timezone /etc/timezone
RUN echo "https://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories
RUN echo "https://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories
RUN ["apk","update"]
RUN ["apk","add","curl"]
RUN ["apk","add","openjdk8-jre"]

有關skywalking-agent的延申

如上有三種方式
首先排除第三種方式,因為不太熟悉
然后是排除第二種方式,需要在每個項目使用的Dockerfile文件中進行修改,新增加jar包以及重新編寫ENTRYPOINT命令,有點費事費力,暫不考慮
最后就先使用第一種方式 (若此方式行不通,再考慮第二種方式)

官方文檔中提供的有現成的鏡像,地址是:https://hub.docker.com/r/apache/skywalking-java-agent

打開網址后可以發現有如下信息

根據描述,只需要修改項目使用的基礎鏡像就可以直接使用了,不用做其他的操作

結合項目情況,也就是把FROM jdd.io/jre:1.8.0_275換成:FROM apache/skywalking-java-agent:8.5.0-jdk8

點擊查看官方鏡像apache/skywalking-java-agent:8.5.0-jdk8對應的Dockerfile文件,其內容如下:

地址:https://github.com/apache/skywalking-docker/tree/master/java-agent

ARG version
ARG BASE_IMAGE='adoptopenjdk/openjdk8:alpine'
FROM apache/skywalking-base:${version}-es6 AS build

FROM $BASE_IMAGE
LABEL maintainer="kezhenxu94@apache.org"
ENV JAVA_TOOL_OPTIONS=-javaagent:/skywalking/agent/skywalking-agent.jar
WORKDIR /skywalking
COPY --from=build /skywalking/agent /skywalking/agent
COPY --from=build /skywalking/bin/swctl /skywalking/bin/swctl

分析該文件內容可知如下幾點:
1.有jdk8環境,使用的鏡像是:adoptopenjdk/openjdk8:alpine
2.使用分階段構建方式:apache/skywalking-base:${version}-es6 AS build, ${version}的值有構建時傳遞過來的變量version獲取得到
3.關鍵值這一句:ENV JAVA_TOOL_OPTIONS=-javaagent:/skywalking/agent/skywalking-agent.jar

環境變量JAVA_TOOL_OPTIONS是會被所有虛擬機都能識別和應用的 (這個直接決定了項目使用的Dockerfile文件中的ENTRYPOINT命令不用做任何修改,使用的時候會把這個環境變量加在java 命令后面,也就是項目jar包前面)

拓展
保險起見,以后說不明這中間還會再加其他參數配置,屆時還是需要得修改ENTRYPOINT命令
倒不如有時間的話逐個修改項目中的Dockerfile文件的ENTRYPOINT命令,參考文件地址:https://www.cnblogs.com/sanduzxcvbnm/p/15830845.html
ENTRYPOINT ["sh", "-c", "java PARAMSPARAMS{JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar demo-0.0.1-SNAPSHOT.jar"]

根據官方鏡像使用的Dockerfile文件以及項目使用的Dockerfile文件,可以把兩者內容結合起來:

項目使用的Dockerfile文件內容有進一步優化,不進行此優化也可以,仍使用原來的內容

FROM apache/skywalking-base:8.7.0-es7 AS build

FROM jeanblanchard/alpine-glibc:latest
MAINTAINER sandu <1103324414@qq.com>
COPY localtime /etc/localtime
COPY timezone /etc/timezone
RUN echo "https://mirrors.aliyun.com/alpine/v3.10/main/" > /etc/apk/repositories &&  echo "https://mirrors.aliyun.com/alpine/v3.10/community/" >> /etc/apk/repositories
RUN ["apk","update"]
RUN ["apk","add","curl"]
RUN ["apk","add","openjdk8-jre"]

ENV JAVA_TOOL_OPTIONS=-javaagent:/skywalking/agent/skywalking-agent.jar
COPY --from=build /skywalking/agent /skywalking/agent
COPY --from=build /skywalking/bin/swctl /skywalking/bin/swctl

說明:
1.首先采用多階段構建方式,FROM apache/skywalking-base:8.7.0-es7 AS build使用的變量直接根據最新的信息寫死
2.項目使用的基礎鏡像優化內容
3.最后增加上skywalking-agent有關內容 (對官方鏡像使用的Dockerfile文件內容進一步精簡優化)

項目使用的基礎鏡像是FROM jdd.io/jre:1.8.0_275,這里可以直接根據上述Dockerfile文件構建同名的基礎鏡像(構建后的名稱仍是:jdd.io/jre:1.8.0_275)

這樣一來,項目引用的基礎鏡像就是最新構建的這個(里面含有skywalking-agent內容),又因為環境變量JAVA_TOOL_OPTIONS的存在,因此不用再修改其他任何配置就能直接使用 (這也就是官方鏡像頁面所說的信息)

然后處理需要使用的倆參數:config/agent.config中的agent.service_nameconfig/agent.config中的collector.backend_service

Agent的可配置屬性列表

屬性名 描述 默認值
agent.namespace 命名空間,用於隔離跨進程傳播的header。如果進行了配置,header將為HeaderName:Namespace. 未設置
agent.service_name 在SkyWalking UI中展示的服務名。5.x版本對應Application,6.x版本對應Service。 建議:為每個服務設置個唯一的名字,服務的多個服務實例為同樣的服務名 Your_ApplicationName
agent.sample_n_per_3_secs 負數或0表示不采樣,默認不采樣。SAMPLE_N_PER_3_SECS表示每3秒采樣N條。 未設置
agent.authentication 鑒權是否開啟取決於后端的配置,可查看application.yml的詳細描述。對於大多數的場景,需要后端對鑒權進行擴展。目前僅實現了基本的鑒權功能。 未設置
agent.span_limit_per_segment 單個segment中的span的最大個數。通過這個配置項,Skywalking可評估應用程序內存使用量。 未設置
agent.ignore_suffix 如果這個集合中包含了第一個span的操作名,這個segment將會被忽略掉。 未設置
agent.is_open_debugging_class 如果為true,skywalking會將所有經Instrument轉換過的類文件保存到/debugging文件夾下。Skywalking團隊會要求你提供這些類文件以解決兼容性問題。 未設置
agent.cause_exception_depth 在記錄異常信息的時候, 探針需要記錄的堆棧深度. 5
agent.force_reconnection_period grpc的強制重連周期,基於grpc_channel_check_interval. 1
agent.operation_name_threshold 設置操作名不建議超過最大長度(190). 150
agent.keep_tracing 如果該值為 true,即使后台不可用,也要保持跟蹤. false
osinfo.ipv4_list_size 限制ipv4列表的長度. 10
collector.grpc_channel_check_interval 檢查grpc的channel狀態的時間間隔。 30`
collector.backend_service 接收skywalking trace數據的后端地址 127.0.0.1:11800
collector.heartbeat_period 探針心跳報告時間. 單位秒. 30
collector.grpc_upstream_timeout grpc客戶端向上游發送數據時超時多長時間. 單位秒. 30 秒
collector.get_profile_task_interval 嗅探器獲取配置文件任務列表間隔. 20
logging.level 日志級別。默認為debug。 DEBUG
logging.file_name 日志文件名 skywalking-api.log
logging.output 日志輸出. 默認是文件. 使用控制台意味着輸出到標准輸出. FILE
logging.dir 日志目錄。默認為空串,表示使用"system.out"輸出日志。 ""
logging.pattern 日志格式. 所有的轉換說明符:  
* %level means log level.    
* %timestamp 表示現在的時間格式 yyyy-MM-dd HH:mm:ss:SSS.    
* %thread 表示當前線程的名稱.    
* %msg 表示用戶記錄的某些消息.    
* %class 表示TargetClass的SimpleName.    
* %throwable 表示用戶拋出的異常.    
* %agent_name 表示 agent.service_name %level %timestamp %thread %class : %msg %throwable  
logging.max_file_size 日志文件的最大大小。當日志文件大小超過這個數,歸檔當前的日志文件,將日志寫入到新文件。 300 * 1024 * 1024
logging.max_history_files The max history log files. When rollover happened, if log files exceed this number,then the oldest file will be delete. Negative or zero means off, by default. -1
jvm.buffer_size 收集JVM信息的buffer的大小。 60 * 10
buffer.channel_size buffer的channel大小。 5
buffer.buffer_size buffer的大小 300
profile.active 如果為true,SkyWalking代理將在用戶創建新的配置文件任務時啟用配置文件. 否則禁用概要. true
profile.max_parallel 並行監控段計數 5
profile.duration 監控段最大時間(分鍾),如果當前監控段時間超出限制,則停止. 10
profile.dump_max_stack_depth 最大線程轉儲的堆棧深度 500
profile.snapshot_transport_buffer_size 快照傳輸到后端緩沖區的大小 50
plugin.mongodb.trace_param 如果為true,記錄所有訪問MongoDB的參數信息。默認為false,表示僅記錄操作名,不記錄參數信息。 false
plugin.elasticsearch.trace_dsl 如果為true,記錄所有訪問ElasticSearch的DSL信息。默認為false。 false
plugin.springmvc.use_qualified_name_as_endpoint_name 如果為true,endpoint的name為方法的全限定名,而不是請求的URL。默認為false。 false
plugin.toolit.use_qualified_name_as_operation_name 如果為true,operation的name為方法的全限定名,而不是給定的operation name。默認為false。 false
plugin.mysql.trace_sql_parameters 如果設置為 true, SQL 查詢 (典型的是 java.sql.PreparedStatement) 的參數也會被采集. false
plugin.mysql.sql_parameters_max_length 如果設置為正整數, 收集的 SQL 參數 db.sql.parameters 會被截斷到這個長度, 否則會被完整保存, 這可能會導致性能問題. 512
plugin.solrj.trace_statement 如果為 true, 追蹤 Solr 查詢請求中的所有查詢參數(包括 deleteByIds 和 deleteByQuery) 默認為 false. false
plugin.solrj.trace_ops_params 如果為 true, 追蹤 Solr 查詢中所有操作參數, 默認為 false. false
plugin.peer_max_length Peer 描述最大限制. 200
plugin.mongodb.filter_length_limit 如果設置為正數, WriteRequest.params 將被截短到這個長度, 否則它將被完全保存,這可能會導致性能問題. 256
plugin.postgresql.trace_sql_parameters 如果設置為true,將收集sql的參數(通常是 java.sql.PreparedStatement). false
plugin.postgresql.sql_parameters_max_length 如果設置為正數, db.sql.parameters 將被截斷到這個長度,否則它將被完全保存,這可能會導致性能問題. 512
plugin.mariadb.trace_sql_parameters 如果設置為true,將收集sql的參數(通常是 java.sql.PreparedStatement). false
plugin.mariadb.sql_parameters_max_length 如果設置為正數,db.sql 將被截斷到這個長度,否則它將被完全保存,這可能會導致性能問題. 512
plugin.light4j.trace_handler_chain 如果為true,請跟蹤屬於請求的Light4J處理程序鏈的所有中間件/業務處理程序. false
plugin.opgroup.* 支持在不同插件中自定義組規則的操作名. 請閱讀 Group rule supported plugins Not set
plugin.springtransaction.simplify_transaction_definition_name 如果為true,事務定義名稱將被簡化. false
plugin.jdkthreading.threading_class_prefixes 線程類 (java.lang.Runnable and java.util.concurrent.Callable) 及其子類(包括任何名稱匹配 THREADING_CLASS_PREFIXES (以 , 分隔)的匿名內部類) 將被檢測, 確保只指定短小的前綴,就像您預期要測試的一樣, (java. 和 javax. 會因安全問題而被忽略) Not set
plugin.tomcat.collect_http_params 這個配置項控制Tomcat插件是否應該收集請求的參數. 同樣,在概要追蹤中隱式激活. false
plugin.springmvc.collect_http_params 這個配置項控制SpringMVC插件是否應該收集請求的參數, 當您的Spring應用程序基於Tomcat時, 只需要設置 plugin.tomcat.collect_http_params 或 plugin.springmvc.collect_http_params 之一. 同樣,在概要追蹤中隱式激活. false
plugin.http.http_params_length_threshold 當啟用 COLLECT_HTTP_PARAMS時,要保留多少字符並將其發送到OAP后端,請使用負值來保留和發送完整的參數. 添加這個配置項是為了提高性能. 1024
correlation.element_max_number 關聯上下文的最大元素數. 3
correlation.value_max_length 關聯上下文元素的最大值長度. 128

通過查看配置文件:config/agent.config的內容可知,里面的倆參數:config/agent.config中的agent.service_nameconfig/agent.config中的collector.backend_service`除了手動編輯該配置文件設置外,還能從環境變量中獲取

因此,在這里就不手動修改配置文件了,采用向docker鏡像中傳遞環境變量參數的形式給上述倆參數傳值 (若還需要其他參數的值也可以采取這個辦法,具體對應的環境變量名從agent.config配置文件中獲取)
agent.service_name對應的環境變量名是SW_AGENT_NAME
collector.backend_service對應的環境變量名是SW_AGENT_COLLECTOR_BACKEND_SERVICES


java項目部署在k8s中的的話,也是這樣的操作
1.直接修改項目Dockerfile文件使用的基礎鏡像為新構建的鏡像:jdd.io/jre:1.8.0_275
2.在項目使用的deployments中新增加倆環境變量(甚至更多)

系統環境變量
agent.config 文件中默認的大寫值,都可以作為環境變量引用。例如,agent.config 中有如下內容

agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}

這說明Skywalking會讀取名為 SW_AGENT_NAME 的環境變量。

優先級
代理選項 > 系統屬性(-D) > 系統環境變量 > 配置文件

Java 啟動方式

java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=nacos-provider -Dskywalking.collector.backend_service=localhost:11800 -jar yourApp.jar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM