文章目录
一、简介
skywalking是一个优秀的国产开源框架,2015年由个人吴晟(华为开发者)开源 , 2017年加入Apache孵化器。短短两年就被Apache收入麾下,实力可见一斑。 skywalking支持dubbo,SpringCloud,SpringBoot集成,代码无侵入,通信方式采用GRPC,性能较好,实现方式是java探针,支持告警,支持JVM监控,支持全局调用统计等等,功能较完善。
官网:https://skywalking.apache.org/
Skywalking架构
SkyWalking 逻辑上分为四部分: 探针, 平台后端, 存储和用户界面。
- 探针 基于不同的来源可能是不一样的, 但作用都是收集数据, 将数据格式化为 SkyWalking 适用的格式;
- 平台后端 支持数据聚合, 数据分析以及驱动数据流从探针到用户界面的流程。分析包括 Skywalking 原生追踪和性能指标以及第三方来源,包括 Istio 及 Envoy telemetry , Zipkin 追踪格式化等;
- 存储 通过开放的插件化的接口存放 SkyWalking 数据. 你可以选择一个既有的存储系统, 如 ElasticSearch, H2 或 MySQL 集群(Sharding-Sphere 管理),也可以选择自己实现一个存储系统. 当然, 我们非常欢迎你贡献新的存储系统实现;
- UI 一个基于接口高度定制化的Web系统,用户可以可视化查看和管理 SkyWalking 数据。
二、docker-compose部署skywalking
docker-compose使用方法请自行学习,这里不做赘述。docker-compose.yml文件如下:
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.6
container_name: elasticsearch
restart: always
ports:
- 9200:9200
- 9300:9300
environment:
- discovery.type=single-node
- TZ=Asia/Shanghai
- bootstrap.memory_lock=true
-"ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
volumes:
-/skywalking/elasticsearch/data:/usr/share/elasticsearch/data
ulimits:
memlock:
soft: -1
hard: -1
oap:
image: docker.io/apache/skywalking-oap-server:9.4.0
container_name: oap
depends_on:
- elasticsearch
restart: always
ports:
- 11800:11800
- 12800:12800
environment:
SW_CORE_RECORD_DATA_TTL: 15
SW_CORE_METRICS_DATA_TTL: 15
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
SW_ENABLE_UPDATE_UI_TEMPLATE: true
TZ: Asia/Shanghai
JAVA_OPTS: "-Xms2048m -Xmx2048m"
ui:
image: docker.io/apache/skywalking-ui:9.4.0
container_name: ui
depends_on:
- oap
links:
- oap
restart: always
ports:
- 8080:8080
environment:
SW_OAP_ADDRESS: http://oap:12800
SW_ZIPKIN_ADDRESS: http://oap:9412
正常执行之后,大概需要1分钟左右的时间等待,在浏览器端输入 http://IP:8080,即可看到如下的界面,刚启动没有数据的(不需要登录)。整个过程没有坑点,一次就好。
UI的使用在后文中介绍。
三、springboot集成skywalking
准备一个简单的springboot web工程。
1、下载解压 agent
注意:agent版本和oap版本需要适配,版本不适配可能会出现页面无法访问、agent上报不到页面等问题。
下载地址: https://skywalking.apache.org/downloads/
作者用的skywalking版本为9.4.0,下载v8.16.0版本的client没有问题,亲测可用。
代码结构如下图所示:
需要配置skywalking-agent文件夹下,config/agent.config配置文件,列出最关键的两个配置,其他配置大家可以自行摸索。
agent.service_name=${SW_AGENT_NAME:HS}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.54.53:11800}
2、日志对接
在skywalking的UI端有一个日志的模块,用于收集客户端的日志,默认是没有数据的,那么需要如何将日志数据传输到skywalking中呢?
skywalking支持如下方式的的日志接入方式
下来使用springboot默认的logback为例子介绍一下如何配置,
(1)引入依赖
<!--打印skywalking的TraceId到日志--><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.12.0</version></dependency><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>8.12.0</version></dependency>
(2)添加配置文件
新建一个logback-spring.xml放在resource目录下,配置如下:
<configurationdebug="false"scan="false"><springPropertyscop="context"name="spring.application.name"source="spring.application.name"defaultValue=""/><propertyname="log.path"value="logs/${spring.application.name}"/><!-- 彩色日志格式 --><propertyname="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} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/><!-- 彩色日志依赖的渲染类 --><conversionRuleconversionWord="clr"converterClass="org.springframework.boot.logging.logback.ColorConverter"/><conversionRuleconversionWord="wex"converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/><conversionRuleconversionWord="wEx"converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/><!-- Console log output --><appendername="console"class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern></encoder></appender><!-- Log file debug output --><appendername="debug"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/debug.log</file><rollingPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>50MB</maxFileSize><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern></encoder></appender><!-- Log file error output --><appendername="error"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/error.log</file><rollingPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>50MB</maxFileSize><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern></encoder><filterclass="ch.qos.logback.classic.filter.ThresholdFilter"><level>ERROR</level></filter></appender><appendername="stdout"class="ch.qos.logback.core.ConsoleAppender"><encoderclass="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layoutclass="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><appendername="grpc"class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"><encoderclass="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layoutclass="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><!--nacos 心跳 INFO 屏蔽--><loggername="com.alibaba.nacos"level="OFF"><appender-refref="error"/></logger><!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 --><rootlevel="INFO"><!-- <appender-ref ref="console"/>--><appender-refref="debug"/><appender-refref="error"/><appender-refref="stdout"/><appender-refref="grpc"/></root></configuration>
(3)代码中添加日志
@RequestMapping(value ="/test", method =RequestMethod.GET)@ApiOperation(value ="测试")publicModelMaptest(){ModelMap modelMap =newModelMap();
modelMap.addAttribute("code","success");
log.info(modelMap.toString());return modelMap;}
3、使用探针方式启动
(1)使用idea启动
配置VM options
javaagent配置的参数即skywalking-agent的绝对路径。
-javaagent:D:\code\test\HS\src\main\skywalking-agent\skywalking-agent.jar
启动工程
会发现Skywalking里已经有了日志,与idea控制台的日志一致。
(2)使用jar启动
与idea一样,启动时配置VM options即可
java -javaagent:D:\code\test\HS\src\main\skywalking-agent\skywalking-agent.jar -Dskywalking.agent.service_name=HS-Dskywalking.collector.backend_service=192.168.54.53:11800-jar app.jar
(3)接口验证
调用web接口
四、总结
skywalking上手与springboot集成过程中,基本没遇到啥坑点,整个过程比较顺利,不亏是Apache的顶级项目。过程记录下来,希望能帮到各位,下一篇主要介绍skywalking与Apisix的集成,敬请期待!
打完手工。
版权归原作者 bacawa 所有, 如有侵权,请联系我们删除。