1、介紹
在前面的文章中講到SkyWalking鏈路追蹤系統-部署篇,接下來在正式接入Skywalking
探針agent
之前,先來接着了解一下Skywalking
的整體架構和主要概念(內容主要匯總自官方文檔或網絡)
1.1 整體架構
以下是來自Skywalking
官方Github
庫上的一張架構圖
整體架構包含如下三個組成部分:
- 探針(
agent
)負責進行數據的收集,包含了Tracing
和Metrics
的數據,agent
會被安裝到服務所在的服務器上,以方便數據的獲取。 - 可觀測性分析平台
OAP
(Observability Analysis Platform),接收探針發送的數據,並在內存中使用分析引擎(Analysis Core
)進行數據的整合運算,然后將數據存儲到對應的存儲介質上,比如Elasticsearch
、MySQL
數據庫、H2
數據庫等。同時OAP
還使用查詢引擎(Query Core
)提供HTTP
查詢接口。 Skywalking
提供單獨的UI
進行數據的查看,此時UI
會調用OAP
提供的接口,獲取對應的數據然后進行展示。
Skywalking
提供Tracing
和Metrics
數據的獲取和聚合:
Metric
的特點是,它是可累加的:他們具有原子性,每個都是一個邏輯計量單元,或者一個時間 段內的柱狀圖。 例如:隊列的當前深度可以被定義為一個計量單元,在寫入或讀取時被更新統 計; 輸入HTTP
請求的數量可以被定義為一個計數器,用於簡單累加; 請求的執行時間可以被定 義為一個柱狀圖,在指定時間片上更新和統計匯總。
Tracing
的最大特點就是,它在單次請求的范圍內,處理信息。 任何的數據、元數據信息都被綁定 到系統中的單個事務上。 例如:一次調用遠程服務的RPC
執行過程;一次實際的SQL
查詢語句; 一次HTTP
請求的業務性ID
。
總結,Metric
主要用來進行數據的統計,比如HTTP
請求數的計算。Tracing
主要包含了某一次請求的鏈路數據。
詳細的內容可以查看Skywalking
開發者吳晟翻譯的文章,Metrics , tracing 和 logging 的關系
1.2 主要概念
Skywalking
主要概念包含:
- 服務(Service) :用戶服務就是
Skywalking
的服務Service
,用戶服務其實就是一個獨立的應用Application
,在6.0
版本之后的Skywalking
將應用更名為服務Service
- 端點(Endpoint) :用戶服務對外提供的
HTTP
接口例如/usr/list
就是一個端點,端點就是對外提供的接口 - 實例(Instance):相同服務部署的節點就是實例,實例指同一服務可以部署多個,例如多台虛擬機或多個容器
2、准備agent包
Skywalking
目前支持很多語言的鏈路追蹤,本文以常見的java
應用為例進行記錄
下載官方和server
版本相同的發行版本包,並獲取agent
我這里對應前面安裝的服務端下載地址:https://www.apache.org/dyn/closer.cgi/skywalking/8.4.0/apache-skywalking-apm-8.4.0.tar.gz
下載后解壓提取agent
目錄,結構如下
+-- 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
.....
+-- optional-plugins # 可選插件目錄
apm-gson-2.x-plugin.jar
.....
+-- bootstrap-plugins
jdk-http-plugin.jar
.....
+-- logs # 默認日志目錄
skywalking-agent.jar
整個agent
目錄大概是30MB
左右,很多插件都是可選的,在啟動時啟用了插件的話,具有更為強大的功能。部分插件在使用上會影響整體的性能或者由於其他原因放置於可選插件包中,不會直接加載,如果需要使用,將可選插件中的jar
包拷貝到plugins
目錄下
最終基於容器環境配置skywalking agent
的方式一種是創建ConfigMap
,然后通過 ConfigMap
掛載到容器里進行覆蓋;另一種是在默認配置里引用各種變量,在容器啟動時通過環境變量注入
因此這里修改agent
的配置文件config/agent.config
,打開其中某些配置項的注釋,但不進行具體配置修改,通過環境變量進行注入以使用
# grep -Ev '^$|#' agent/config/agent.config
agent.namespace=${SW_AGENT_NAMESPACE:default-namespace}
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
agent.is_cache_enhanced_class = ${SW_AGENT_CACHE_CLASS:false}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}
logging.file_name=${SW_LOGGING_FILE_NAME:skywalking-api.log}
logging.level=${SW_LOGGING_LEVEL:INFO}
logging.max_file_size=${SW_LOGGING_MAX_FILE_SIZE:314572800}
logging.max_history_files=${SW_LOGGING_MAX_HISTORY_FILES:-1}
plugin.mount=${SW_MOUNT_FOLDERS:plugins,activations}
plugin.mysql.trace_sql_parameters=${SW_MYSQL_TRACE_SQL_PARAMETERS:false}
對應配置說明:
agent.namespace
:命名空間,可通過此參數實現隔離agent.service_name
:在鏈路追蹤UI
中展示的應用名,如果是微服務架構,可以和注冊中心中的應用名一致agent.is_cache_enhanced_class
:如果為true
,則SkyWalking
代理會將所有檢測到的類文件緩存到內存或磁盤文件中(由類緩存模式決定)collector.backend_service
:后端Collector
收集器的地址logging.file_name
:日志文件名logging.level
:日志等級logging.max_file_size
:日志文件大小控制logging.max_history_files
:歷史日志文件個數控制plugin.mount
:掛載插件的文件夾名plugin.mysql.trace_sql_parameters
:收集sql
的參數
除了上面的參數外,還有一個常用參數agent.ignore_suffix
,表示對請求追蹤進行忽略,多個路徑用逗號分隔,在實際的生產環境中某些請求是不需要被追蹤的,例如心跳檢查/health
,監控指標/metrics
等等,我們需要將對應的插件jar
包apm-trace-ignore-plugin-8.4.0.jar
拷貝到plugins
目錄下並進行對應的配置,配置文件內容部分如下
# If the operation name of the first span is included in this set, this segment should be ignored. Multiple values should be separated by `,`.
# agent.ignore_suffix=${SW_AGENT_IGNORE_SUFFIX:.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg}
更多的配置項可以參考官方配置說明
3、打包制作鏡像
官方給出了在java
應用的不同運行環境中java agent配置示例:
-
Tomcat
-
Linux環境
修改
tomcat/bin/catalina.sh
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/path/to/skywalking-agent/skywalking-agent.jar"; export CATALINA_OPTS
-
Windows環境
修改
tomcat/bin/catalina.bat
set "CATALINA_OPTS=-javaagent:/path/to/skywalking-agent/skywalking-agent.jar"
-
-
Jar包運行
在啟動參數中添加
-javaagent
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -jar yourApp.jar
-
Jetty
修改
jetty.sh
,在啟動參數中添加-javaagent
export JAVA_OPTIONS="${JAVA_OPTIONS} -javaagent:/path/to/skywalking-agent/skywalking-agent.jar"
本文以spring boot
應用jar
包運行的方式為例,首先修改基礎java
鏡像的Dockerfile
,將agent
包打入鏡像
(一個小Tips
:踩了很多坑,最終自己做oracle jdk
的鏡像,而不是用中央倉庫的openjdk
,基礎鏡像基於centos
,為了減小鏡像體積這里可以再進行優化)
修改Dockerfile
FROM centos:7.6.1810
LABEL maintainer ssgeek@ssgeek.com
ENV LANG "en_US.UTF-8"
ENV JDK_VERSION 1.8.0_191
ENV SW_VERSION 8.4.0
ADD jdk-8u191-linux-x64.tar.gz /usr/local
ADD agent /skywalking/agent
ENV JAVA_HOME /usr/local/jdk1.8.0_191
ENV CLASSPATH $JAVA_HOME/lib;$JAVA_HOME/jre/lib
ENV PATH $PATH:$JAVA_HOME/bin
RUN set -x && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
打包鏡像並上傳到倉庫
# docker build -t hub.ssgeek.com/basic_image/jdk_8u191:skywalking_v1.0
# docker push hub.ssgeek.com/basic_image/jdk_8u191:skywalking_v1.0
修改業務應用的Dockerfile
,引用加入了agent
包的基礎鏡像並修改啟動參數
FROM hub.ssgeek.com/basic_image/jdk_8u191:skywalking_v1.0
LABEL maintainer ssgeek@ssgeek.com
RUN mkdir /app
WORKDIR /app
COPY target/*.jar /app/app.jar
EXPOSE 8080
CMD java -Djava.security.egd=file:/dev/./urandom -javaagent:/skywalking/agent/skywalking-agent.jar -jar ${JAVA_OPTS} /app/app.jar
4、注入環境變量
這里的java
應用運行在k8s
容器化環境中,因此對配置變量的注入可以通過在部署清單的yaml
中以環境變量的形式注入,這樣配置更為輕量和靈活
其中部分參數的環境變量取值,通過在Pod
中使用環境變量把自己的信息呈現給Pod
中運行的容器,可以參考
...
spec:
imagePullSecrets:
- name: registry-pull-secret
containers:
- name: java
image: hub.ssgeek.com/java/xxx:tag
imagePullPolicy: IfNotPresent
env:
- name: JAVA_OPTS
value: 'JVM參數'
- name: SW_AGENT_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: SW_AGENT_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: SW_AGENT_CACHE_CLASS
value: 'true'
- name: SW_MYSQL_TRACE_SQL_PARAMETERS
value: 'true'
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: 'skywalking-oap.monitoring.svc:11800'
ports:
- containerPort: 8080
name: AppName
protocol: TCP
網絡上有文章的操作方式大多都是添加一個initContainer
將agent
拷貝到應用Pod
中,我個人認為會浪費系統資源且每次啟動都需要執行,這必然會增加應用的啟動時間,還不如修改基礎java
鏡像,一勞永逸。
5、部署啟動並查看ui
按照上面的操作對Pod
應用注入了Skywalking agent
相關配置,如果應用啟動后會有如下的日志提示,表示agent
注入啟動成功了
當應用啟動完成,正常接收流量后,服務端就可以采集並展示相關數據了,這里我展示一個微服務項目測試環境接入Skywalking
后的儀表盤頁面
拓撲圖
see you ~