1、版本

名称版本
skywalking-oap-server8.9.1
skywalking-ui8.9.1
elasticsearch7.14.2
java-agent8.8.0

注意:

        不建议直接下载latest版本,因为latest版本号不明显,需要进一步查看,后面会导致奇奇怪怪的问题【亲身经历】。

2、skywalking单机部署

docker-compose.yml

version: '3.3'
services:
  elasticsearch:
    image: elasticsearch:7.14.2
    container_name: elasticsearch
    restart: always
    ports:
      - 9200:9200
    environment:
      - "TAKE_FILE_OWNERSHIP=true" #volumes 挂载权限 如果不想要挂载es文件改配置可以删除
      - "discovery.type=single-node" #单机模式启动
      - "TZ=Asia/Shanghai" # 设置时区
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 设置jvm内存大小
    volumes:
      - ./elasticsearch/logs:/usr/share/elasticsearch/logs
      - ./elasticsearch/data:/usr/share/elasticsearch/data
      - ./elasticsearch/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ulimits:
      memlock:
        soft: -1
        hard: -1
  skywalking-oap-server:
    image: apache/skywalking-oap-server:8.9.1
    container_name: skywalking-oap-server
    depends_on:
      - elasticsearch
    links:
      - elasticsearch
    restart: always
    ports:
      - 11800:11800
      - 12800:12800
    environment:
      SW_STORAGE: elasticsearch  # 指定ES版本
      SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
      TZ: Asia/Shanghai
    volumes:
     - ./oap/conf/alarm-settings.yml:/skywalking/config/alarm-settings.yml
  skywalking-ui:
    image: apache/skywalking-ui:8.9.1
    container_name: skywalking-ui
    depends_on:
      - skywalking-oap-server
    links:
      - skywalking-oap-server
    restart: always
    ports:
      - 8080:8080
    environment:
      SW_OAP_ADDRESS: http://skywalking-oap-server:12800
      TZ: Asia/Shanghai

具体配置可以skywalking官方github

执行命令

docker-compose up -d

等待大约2~3min,在浏览器中输入一下地址进行访问:

http://192.168.28.130:8080/

注意:

        1、端口为 skywalking-ui中配置的端口

        2、skywalking首次启动后,在浏览器中访问,有可能会出现加载页面不完整的情况,此时只需要耐心等待2~3min后在刷新页面即可。

3、skywalking使用

agent代理使用【下载地址】(agent的使用需要将其拷贝至目标服务器,多少项目在一台服务器可以共用一个agent)

agent目录简介

如果想要使用可选插件将其复制到plugins目录即可【需要重启应用程序生效】,不想用只需冲plugins目录中将插件删除【需要重启应用后生效(有的文章说可以不重启生效)】

idea 配置

在VM参数中增加如下配置

-javaagent:/Users/admin/software/skywalking-agent/skywalking-agent.jar=agent.service_name=${APPLICATION_NAME},collector.backend_service=192.168.28.130:11800

${APPLICATION_NAME}    应用程序名称

192.168.28.130:11800        skywalking服务器采集地址,端口是docker-compose.yml 中  skywalking-oap-server 配置的端口(默认为11800)

 java -jar配置

java -javaagent:/Users/admin/software/skywalking-agent/skywalking-agent.jar=agent.service_name=${APPLICATION_NAME},collector.backend_service=192.168.28.130:11800 -jar SpringBoot-0.0.1-SNAPSHOT.jar

注意:javaagent 需配置在 -jar前面

详细使用请看官网介绍:java-agent使用教程

一切准备就绪后,启动项目

1)仪表盘

可以APM 处看见当前服务

注意:

  1. 如果此处没有出现服务,可以尝试访问项目中的任意接口或者多刷新几次页面) 
  2. 如果还是没有可以查看agent目录下的日志看是否存在报错

访问项目中任意接口

2)拓扑图

点击服务本身可以展示各种指标

 

 3)追踪

 

可以在此处看见刚刚访问的接口以及耗时情况(如果此时搜索不出来,需注意时间范围是否正确

4、性能剖析 

如果在追踪中发现了访问异常慢的接口可以通过性能剖析对其进行分析

操作步骤

  1. 新建任务
  2. 选择服务(如果此处未出现服务名称选择,需要刷新时间)
  3. 配置端点名称(注意此处最好是从追踪里面获取端点名称,需要加上请求方式,之前由于没有添加请求方式,搞了好几天都不行,刚开始以为是部署的问题,反反复复搞了很久都没有解决,最后加上了请求方式,才搞定主要网上的资料都没有添加请求方式,此处还有一点需要注意的是,接口的请求路径是全路径,需要加上项目的contex-path才行
  4. 设置监控时间
  5. 采样数
  6. 点击新建任务请求配置的接口

 

 出现如下页面(如果Sampled Traces未出现注意刷新时间【这是skywalking唯一一个不友好的地方,不管访问任务页面都要注意时间的影响】

 

 点击分析按钮出现堆栈信息

 可以看见耗时最下最长的信息。

5、日志采集

日志采集需要配合TraceId一起做,有一定的侵入性

在项目中引入jar包

注意此处由于我使用的日志框架是logback,如果使用其他日志框架需引入对应的jar包

目前支持的日志框架有:log4jlog4j2和 logback

<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <version>${apm-toolkit.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>${apm-toolkit.version}</version>
</dependency>

日志数据格式化

<!--日志文件输出格式-->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
    <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
        <pattern>
            %d{yyyy-MM-dd HH:mm:ss.SSS} [%ip] [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - [%tid] - %msg%n
        </pattern>
    </layout>
    <charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>

日志采集

<!-- skywalking日志收集 -->
    <appender name="skywalking-log" 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}  [%ip] %thread %logger %level - [%tid] %msg %n</pattern>
            </layout>
        </encoder>
    </appender>

完整配置文件

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">
    <!-- 定义日志的根目录 -->
    <property name="LOG_HOME" value="logs"/>
    <!-- 定义日志文件名称 -->
    <!--    <property name="appName" value="${}"/>-->
    <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} - [%tid] - %clr(:){faint}  %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            </layout>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件输出格式-->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>
                    %d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - [%tid] - %msg%n
                </pattern>
            </layout>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--
            滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动
            %i:当文件大小超过maxFileSize时,按照i进行文件滚动
            -->
            <fileNamePattern>${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!--
            可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,
            且maxHistory是365,则只保存最近365天的文件,删除之前的旧文件。注意,删除旧文件是,
            那些为了归档而创建的目录也会被删除。
            -->
            <MaxHistory>31</MaxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>30MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!-- skywalking日志收集 -->
    <appender name="skywalking-log" 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}  %thread %logger %level - [%tid] %msg %n</pattern>
            </layout>
        </encoder>
    </appender>
    <!--
    root与logger是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,
    要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的appender和level。
    -->
    <springProfile name="dev,local,test">
        <root level="info">
            <appender-ref ref="stdout"/>
            <appender-ref ref="appLogAppender"/>
            <appender-ref ref="skywalking-log"/>
        </root>
    </springProfile>
    <springProfile name="prod">
        <root level="info">
            <appender-ref ref="appLogAppender"/>
        </root>
    </springProfile>
</configuration>

待一切配置好后(重启项目)需要等待3~5min就可以看见日志信息了


注意时间范围 

TraceId获取

配置了一个全局异常处理器,如果发生异常则返回TraceId,然后用该TraceId去查找相应的日志与链路信息

@ExceptionHandler(value = Exception.class)
@Trace
public ResponseModel handleException(Exception e) {
    log.error("异常堆栈=>", e);
    return ResponseModel.errorMsg(RepCodeEnum.BLANK_ERROR, TraceContext.traceId());
}

 定位链路

点击相关日志进入日志详情

 注意:日志的上传需要时间,不能立马获取到实时日志

参考

Skywalking官方文档

Skywalking UI介绍

Skywalking GitHub

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐