基於docker部署的項目如何和skywalking agent進行整合


skywalking簡介

skywalking是一款開源的應用性能監控系統,包括指標監控,分布式追蹤,分布式系統性能診斷

skywalking官方中文翻譯文檔

https://skyapm.github.io/document-cn-translation-of-skywalking/

如何快速搭建skywalking

https://github.com/apache/skywalking-docker

項目如何集成skywalking

1、下載skywalking agent

https://archive.apache.org/dist/skywalking/

解壓后的目錄形如下
image.png

2、為我們項目配置skywalking探針

形如下

java -javaagent:D:apache-skywalking-apm-es7-8.4.0/apache-skywalking-apm-bin-es7/agentskywalking-agent.jar -Dskywalking.agent.service_name=當前項目在skywalking顯示的名稱 -Dskywalking.collector.backend_service=xxxx:11800 -jar spring-demo-0.0.1-SNAPSHOT.jar

官方其實也提供了文檔,告訴我們如何配置,如下圖
image.png
更詳細配置信息,可以查看如下鏈接
https://github.com/apache/skywalking/blob/master/docs/en/setup/service-agent/java-agent/README.md

通過以上幾步就項目就可以和skywalking整合了。然而有些小伙伴反饋在docker環境中,就不懂要怎么使用skywalking的agent進行埋點了。那下面就介紹一下,基於docker部署的項目如何和skywalking agent進行整合

思考點:docker中的項目中要如何才能使用到skywalking agent?

道理可能大家都懂,就是把skywalking agent與項目都塞到到同個docker容器中,基於這個理論,就衍生出一下2種方案

方案一:把skywalking agent的整個agent文件夾都集成進行要埋點的項目中

形如下圖:

image.png
然后修改一下項目的dockerfile文件,修改后的內容如下

FROM adoptopenjdk/openjdk8
VOLUME /tmp
COPY localtime /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
COPY target/spring-demo-*.jar app.jar
COPY agent /usr/local/agent
ENTRYPOINT [ "sh", "-c", "java  -javaagent:/usr/local/agent/skywalking-agent.jar -Dskywalking.agent.service_name=spring-demo -Dskywalking.collector.backend_service=192.168.1.2:11800 -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

核心的主要以下這兩句

COPY agent /usr/local/agent
ENTRYPOINT [ "sh", "-c", "java  -javaagent:/usr/local/agent/skywalking-agent.jar -Dskywalking.agent.service_name=spring-demo -Dskywalking.collector.backend_service=192.168.1.2:11800 -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

把項目中的agent文件夾拷貝進行容器中的/usr/local/agent文件夾中,然后就后面操作就跟在普通環境使用skwalking agent的操作一樣了

整合后如下圖
image.png

方案二:在我們構建基礎鏡像時,把skywalking agent也加進去

比如我們構建java運行的jdk基礎鏡像時,加入skywalking agent
image.png
其dockerfile內容形如下

FROM adoptopenjdk/openjdk8
VOLUME /tmp
#ENV JAVA_OPTS="-Dcom.sun.management.jmxremote.port=39083 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
ENV JAVA_OPTS=""
ENV SKYWALKING_AGENT_SERVICE_NAME=""
ENV SKYWALKING_COLLECTOR_BACKEND_SERVICE=""
COPY localtime /etc/localtime
COPY agent /usr/local/agent
RUN echo "Asia/Shanghai" > /etc/timezone

ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -javaagent:/usr/local/agent/skywalking-agent.jar -Dskywalking.agent.service_name=$SKYWALKING_AGENT_SERVICE_NAME -Dskywalking.collector.backend_service=$SKYWALKING_COLLECTOR_BACKEND_SERVICE -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

然后通過docker build -t 鏡像名 . 或者通過docker-compose build 把基礎鏡像構建出來

本例構建出來的基礎鏡像為openjdk8-trace-agent。

這邊有幾個參數說明下:SKYWALKING_AGENT_SERVICE_NAME和SKYWALKING_COLLECTOR_BACKEND_SERVICE是作為環境變量,可以在docker-compose.yml文件或者k8s文件中指定具體環境變量值。以在docker-compose.yml為例

配置形如下

version: '3.1'
services:
  spring-demo:
    restart: always
    image: 192.168.1.3:5002/demo/spring-demo:dev
    container_name: spring-demo
    network_mode: bridge
    ports:
     - "8085:8080"
    environment:
     - SKYWALKING_AGENT_SERVICE_NAME=spring-demo-test
     - SKYWALKING_COLLECTOR_BACKEND_SERVICE=192.168.1.2:11800

其次

ONBUILD COPY app.jar app.jar

我們在maven構建時,把業務的jar統一命名成app.jar,因此第一個app.jar 是我們業務項目的jar,第二個jar是運行在docker容器的jar。這樣我們在業務的dockerfile中,只需這么寫就行

FROM 192.168.1.3:5002/dev/openjdk8-trace-agent

整合后示例如下圖
在這里插入圖片描述

總結

分布式鏈路追蹤在微服務基本上是屬於一個必選項了,目前市面上開源的鏈路追蹤除了skywalking,還有pinpoint、jaeger、zipkin、cat等,大家如果感興趣可以去了解下。另外本文提供在docker容器中使用skywalking agent可能並不是最優方案,大家就當個參考


免責聲明!

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



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