官方教程
從官方文檔中可以知道以下幾點
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_name
和config/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_name和
config/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