Skywalking安装以及使用
展开代码sudo curl -SL https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose # 验证安装 docker-compose --version
展开代码mkdir -p /opt/skywalking/{es-data,skywalking-data} cd /opt/skywalking # 递归授权(-R 应用到子目录,777 表示读/写/执行权限)不然es会有权限问题 sudo chmod 777 -R ./es-data
包含 ES、SkyWalking OAP(后端)、SkyWalking UI(前端)三个服务:
展开代码version: '3.8' services: # Elasticsearch:保持不变(9.7.0 兼容 ES 7.17.9) elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.17.9 container_name: skywalking-es restart: always environment: - discovery.type=single-node - ES_JAVA_OPTS=-Xms2g -Xmx2g - xpack.security.enabled=false - xpack.monitoring.enabled=false ports: - "9200:9200" - "9300:9300" volumes: - ./es-data:/usr/share/elasticsearch/data networks: - skywalking-net healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9200/_cluster/health"] interval: 10s timeout: 10s retries: 3 # SkyWalking OAP Server:使用本地 9.7.0 镜像(修改镜像地址和版本) skywalking-oap: image: skywalking.docker.scarf.sh/apache/skywalking-oap-server:9.7.0 # 本地已有的镜像地址+版本 container_name: skywalking-oap restart: always depends_on: elasticsearch: condition: service_healthy environment: - SW_STORAGE=elasticsearch # 9.7.0 环境变量与 10.x 一致,无需修改 - SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 - SW_HEALTH_CHECKER=default - SW_TELEMETRY=prometheus - JAVA_OPTS=-Xms1g -Xmx1g ports: - "11800:11800" # 左边是宿主机端口,右边是容器内端口 - "12800:12800" # 左边是宿主机端口,右边是容器内端口 networks: - skywalking-net # SkyWalking UI:使用本地 9.7.0 镜像(修改镜像地址和版本) skywalking-ui: image: skywalking.docker.scarf.sh/apache/skywalking-ui:9.7.0 # 本地已有的镜像地址+版本 container_name: skywalking-ui restart: always depends_on: - skywalking-oap environment: - SW_OAP_ADDRESS=http://skywalking-oap:12800 # 9.7.0 UI 连接 OAP 的变量不变 - SW_UI_PORT=8080 ports: - "8080:8080" # 左边是宿主机端口,右边是容器内端口(默认 8080) networks: - skywalking-net # 自定义网络:让三个服务在同一网络,避免端口冲图,这里可以自定义网段,避免网段冲突 networks: skywalking-net: driver: bridge ipam: config: - subnet: 172.15.0.0/16 # 自定义网段(解决冲突) gateway: 172.15.0.1 # 网关地址(网段的第一个IP,默认即可)
因为拉不到镜像,所以搞了两个国内镜像,拉取命令分别为:
展开代码docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/skywalking.docker.scarf.sh/apache/skywalking-oap-server:9.7.0 docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/skywalking.docker.scarf.sh/apache/skywalking-ui:9.7.0 docker.io/skywalking.docker.scarf.sh/apache/skywalking-ui:9.7.0 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/skywalking.docker.scarf.sh/apache/skywalking-ui:9.7.0 docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/skywalking.docker.scarf.sh/apache/skywalking-ui:9.7.0 docker.io/skywalking.docker.scarf.sh/apache/skywalking-ui:9.7.0
在 /opt/skywalking 目录下执行:
docker-compose up -d
展开代码java -javaagent:/home/sky/skywalking-agent.jar -Dskywalking.agent.service_name=app -Dskywalking.collector.backend_service={sky_ip}:{oap_port11800} -Dspring.profiles.active=dev -jar ./app.jar
其中skywalking-agent生成方式如下: https://skywalking.apache.org/downloads/

pom引入以下包
展开代码<!--skywalking日志集成--> <dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-logback-1.x</artifactId> <version>${skywalking.version}</version> </dependency> <!-- 该引用用于代码获取tranceId --> <dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-trace</artifactId> <version>${skywalking.version}</version> </dependency>
logback.xml
展开代码<configuration> <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, --> <!-- appender是configuration的子节点,是负责写日志的组件。 --> <!-- ConsoleAppender:把日志输出到控制台 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d [%t] ${LOG_LEVEL_PATTERN:-%5p} (%file:%line\)- %m%n</pattern> <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 --> <charset>UTF-8</charset> </encoder> </appender> <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 --> <!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是sys.log --> <!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过1KB时,对当前日志进行分割 重命名--> <appender name="syslog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>logs/log</File> <!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 --> <!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 --> <fileNamePattern>logs/history/log_%d.%i.log</fileNamePattern> <!-- 每产生一个日志文件,该日志文件的保存期限为7天 --> <maxHistory>7</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- maxFileSize:这是活动文件的大小,默认值是10MB --> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <!-- pattern节点,用来设置日志的输入格式 --> <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} - %file:%line [%t] ${LOG_LEVEL_PATTERN:-%5p} - %m%n </pattern> <!-- 记录日志的编码 --> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> </appender> <appender name="grpc" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"> <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] - %file:%line [%t] ${LOG_LEVEL_PATTERN:-%5p} - %m%n</Pattern> </layout> </encoder> </appender> <logger name="com.alibaba.nacos.client.naming" level="ERROR"> <appender-ref ref="STDOUT"/> <appender-ref ref="syslog"/> </logger> <root level="INFO"> <appender-ref ref="STDOUT"/> <appender-ref ref="syslog"/> <appender-ref ref="grpc"/> </root> <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 --> <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE --> </configuration>
核心问题是把agent包映射到docker容器内部,我试过把agent包直接打到jar包内,但是一直会读不到文件,问题是 -javaagent 的底层机制限制导致的:它只认 “独立物理文件”,不认 “嵌套 Jar 内的资源”。解压后 Agent 变成独立文件,自然能正常加载;而嵌套打包时 Agent 是外层 Jar 的资源项,JVM 无法解析。
打包docker的时候加上这样一行命令:
COPY ./src/main/resources/skywalking-agent /home/skywalking-agent
把agent打包到镜像内,启动命令再指定为对应路径即可
本文作者:刘涛
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!