SkyWalking鏈路追蹤系統-接入篇


1、介紹

在前面的文章中講到SkyWalking鏈路追蹤系統-部署篇,接下來在正式接入Skywalking探針agent之前,先來接着了解一下Skywalking的整體架構和主要概念(內容主要匯總自官方文檔或網絡)

1.1 整體架構

以下是來自Skywalking官方Github庫上的一張架構圖

整體架構包含如下三個組成部分:

  1. 探針(agent)負責進行數據的收集,包含了TracingMetrics的數據,agent會被安裝到服務所在的服務器上,以方便數據的獲取。
  2. 可觀測性分析平台OAP(Observability Analysis Platform),接收探針發送的數據,並在內存中使用分析引擎(Analysis Core)進行數據的整合運算,然后將數據存儲到對應的存儲介質上,比如 ElasticsearchMySQL數據庫、H2數據庫等。同時OAP還使用查詢引擎(Query Core)提供HTTP查詢接口。
  3. Skywalking提供單獨的UI進行數據的查看,此時UI會調用OAP提供的接口,獲取對應的數據然后進行展示。

Skywalking提供TracingMetrics數據的獲取和聚合:

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等等,我們需要將對應的插件jarapm-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中運行的容器,可以參考

通過環境變量將 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

網絡上有文章的操作方式大多都是添加一個initContaineragent拷貝到應用Pod中,我個人認為會浪費系統資源且每次啟動都需要執行,這必然會增加應用的啟動時間,還不如修改基礎java鏡像,一勞永逸。

5、部署啟動並查看ui

按照上面的操作對Pod應用注入了Skywalking agent相關配置,如果應用啟動后會有如下的日志提示,表示agent注入啟動成功了

當應用啟動完成,正常接收流量后,服務端就可以采集並展示相關數據了,這里我展示一個微服務項目測試環境接入Skywalking后的儀表盤頁面

拓撲圖

see you ~


免責聲明!

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



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