1. SkyWalking鏈路追蹤系統(tǒng)-接入篇

        共 10045字,需瀏覽 21分鐘

         ·

        2021-03-26 14:33

        目錄

        • 1、介紹

          • 1.1 整體架構(gòu)

          • 1.2 主要概念

        • 2、準備 agent 包

        • 3、打包制作鏡像

        • 4、注入環(huán)境變量

        • 5、部署啟動并查看 ui

        1、介紹

        在前面的文章中講到SkyWalking鏈路追蹤系統(tǒng)-部署篇[1],接下來在正式接入Skywalking探針agent之前,先來接著了解一下Skywalking的整體架構(gòu)和主要概念(內(nèi)容主要匯總自官方文檔或網(wǎng)絡(luò))

        1.1 整體架構(gòu)

        以下是來自Skywalking官方Github庫上的一張架構(gòu)圖

        整體架構(gòu)包含如下三個組成部分:

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

        Skywalking提供TracingMetrics數(shù)據(jù)的獲取和聚合:

        Metric的特點是,它是可累加的:他們具有原子性,每個都是一個邏輯計量單元,或者一個時間 段內(nèi)的柱狀圖。例如:隊列的當前深度可以被定義為一個計量單元,在寫入或讀取時被更新統(tǒng) 計;輸入HTTP請求的數(shù)量可以被定義為一個計數(shù)器,用于簡單累加;請求的執(zhí)行時間可以被定 義為一個柱狀圖,在指定時間片上更新和統(tǒng)計匯總。

        Tracing的最大特點就是,它在單次請求的范圍內(nèi),處理信息。任何的數(shù)據(jù)、元數(shù)據(jù)信息都被綁定 到系統(tǒng)中的單個事務(wù)上。例如:一次調(diào)用遠程服務(wù)的RPC執(zhí)行過程;一次實際的SQL查詢語句;一次HTTP請求的業(yè)務(wù)性ID。

        總結(jié),Metric主要用來進行數(shù)據(jù)的統(tǒng)計,比如HTTP請求數(shù)的計算。Tracing主要包含了某一次請求的鏈路數(shù)據(jù)。

        詳細的內(nèi)容可以查看Skywalking開發(fā)者吳晟翻譯的文章,Metrics , tracing 和 logging 的關(guān)系[2]

        1.2 主要概念

        Skywalking主要概念包含:

        • 服務(wù)(Service) :用戶服務(wù)就是Skywalking的服務(wù)Service,用戶服務(wù)其實就是一個獨立的應(yīng)用Application,在6.0版本之后的Skywalking將應(yīng)用更名為服務(wù)Service
        • 端點(Endpoint) :用戶服務(wù)對外提供的HTTP接口例如/usr/list就是一個端點,端點就是對外提供的接口
        • 實例(Instance):相同服務(wù)部署的節(jié)點就是實例,實例指同一服務(wù)可以部署多個,例如多臺虛擬機或多個容器

        2、準備 agent 包

        Skywalking目前支持很多語言的鏈路追蹤,本文以常見的java應(yīng)用為例進行記錄

        下載官方和server版本相同的發(fā)行版本包,并獲取agent

        我這里對應(yīng)前面安裝的服務(wù)端下載地址:https://www.apache.org/dyn/closer.cgi/skywalking/8.4.0/apache-skywalking-apm-8.4.0.tar.gz

        下載后解壓提取agent目錄,結(jié)構(gòu)如下

        +-- 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目錄下

        最終基于容器環(huán)境配置skywalking agent的方式一種是創(chuàng)建ConfigMap,然后通過 ConfigMap 掛載到容器里進行覆蓋;另一種是在默認配置里引用各種變量,在容器啟動時通過環(huán)境變量注入

        因此這里修改agent的配置文件config/agent.config,打開其中某些配置項的注釋,但不進行具體配置修改,通過環(huán)境變量進行注入以使用

        # 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}

        對應(yīng)配置說明:

        • agent.namespace:命名空間,可通過此參數(shù)實現(xiàn)隔離
        • agent.service_name:在鏈路追蹤 UI 中展示的應(yīng)用名,如果是微服務(wù)架構(gòu),可以和注冊中心中的應(yīng)用名一致
        • agent.is_cache_enhanced_class:如果為true,則SkyWalking代理會將所有檢測到的類文件緩存到內(nèi)存或磁盤文件中(由類緩存模式?jīng)Q定)
        • collector.backend_service:后端Collector收集器的地址
        • logging.file_name:日志文件名
        • logging.level:日志等級
        • logging.max_file_size:日志文件大小控制
        • logging.max_history_files:歷史日志文件個數(shù)控制
        • plugin.mount:掛載插件的文件夾名
        • plugin.mysql.trace_sql_parameters:收集sql的參數(shù)

        除了上面的參數(shù)外,還有一個常用參數(shù)agent.ignore_suffix,表示對請求追蹤進行忽略,多個路徑用逗號分隔,在實際的生產(chǎn)環(huán)境中某些請求是不需要被追蹤的,例如心跳檢查/health,監(jiān)控指標/metrics等等,我們需要將對應(yīng)的插件jarapm-trace-ignore-plugin-8.4.0.jar拷貝到plugins目錄下并進行對應(yīng)的配置,配置文件內(nèi)容部分如下

        # 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]

        3、打包制作鏡像

        官方給出了在java應(yīng)用的不同運行環(huán)境中java agent 配置示例[4]

        • Tomcat

          • Linux 環(huán)境

            修改tomcat/bin/catalina.sh

            CATALINA_OPTS="$CATALINA_OPTS -javaagent:/path/to/skywalking-agent/skywalking-agent.jar"; export CATALINA_OPTS
          • Windows 環(huán)境

            修改tomcat/bin/catalina.bat

            set "CATALINA_OPTS=-javaagent:/path/to/skywalking-agent/skywalking-agent.jar"
        • Jar 包運行

          在啟動參數(shù)中添加-javaagent

          java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -jar yourApp.jar
        • Jetty

          修改jetty.sh,在啟動參數(shù)中添加-javaagent

          export JAVA_OPTIONS="${JAVA_OPTIONS} -javaagent:/path/to/skywalking-agent/skywalking-agent.jar"

        本文以spring boot應(yīng)用jar包運行的方式為例,首先修改基礎(chǔ)java鏡像的Dockerfile,將agent包打入鏡像

        (一個小Tips:踩了很多坑,最終自己做oracle jdk的鏡像,而不是用中央倉庫的openjdk,基礎(chǔ)鏡像基于centos,為了減小鏡像體積這里可以再進行優(yōu)化)

        修改Dockerfile

        FROM centos:7.6.1810
        LABEL maintainer [email protected]

        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

        修改業(yè)務(wù)應(yīng)用的Dockerfile,引用加入了agent包的基礎(chǔ)鏡像并修改啟動參數(shù)

        FROM hub.ssgeek.com/basic_image/jdk_8u191:skywalking_v1.0
        LABEL maintainer [email protected]

        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、注入環(huán)境變量

        這里的java應(yīng)用運行在k8s容器化環(huán)境中,因此對配置變量的注入可以通過在部署清單的yaml中以環(huán)境變量的形式注入,這樣配置更為輕量和靈活

        其中部分參數(shù)的環(huán)境變量取值,通過在Pod中使用環(huán)境變量把自己的信息呈現(xiàn)給Pod中運行的容器,可以參考

        通過環(huán)境變量將 Pod 信息呈現(xiàn)給容器[5]

        ...
            spec:
              imagePullSecrets:
              - name: registry-pull-secret
              containers:
              - name: java
                image: hub.ssgeek.com/java/xxx:tag
                imagePullPolicy: IfNotPresent
                env:
                - name: JAVA_OPTS
                  value: 'JVM參數(shù)'
                - 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

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

        5、部署啟動并查看 ui

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

        當應(yīng)用啟動完成,正常接收流量后,服務(wù)端就可以采集并展示相關(guān)數(shù)據(jù)了,這里我展示一個微服務(wù)項目測試環(huán)境接入Skywalking后的儀表盤頁面

        拓撲圖

        see you ~

        參考資料

        [1]

        SkyWalking鏈路追蹤系統(tǒng)-部署篇: https://www.ssgeek.com/post/skywalking-lian-lu-zhui-zong-xi-tong-bu-shu-pian/

        [2]

        Metrics , tracing 和 logging 的關(guān)系: http://blog.oneapm.com/apm-tech/811.html

        [3]

        官方配置說明: https://github.com/apache/skywalking/tree/master/docs/en/setup/service-agent/java-agent

        [4]

        java agent配置示例: https://github.com/apache/skywalking/tree/master/docs/en/setup/service-agent/java-agent#install-javaagent-faqs

        [5]

        通過環(huán)境變量將 Pod 信息呈現(xiàn)給容器: https://kubernetes.io/zh/docs/tasks/inject-data-application/environment-variable-expose-pod-information/

        瀏覽 64
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 国产三级农村妇女做受 | 99久久婷婷国产综合精品草原 | 人人草网站 | 乱伦无码中文字幕 | 国语对白刺激高潮videos |