SkyWalking入门使用
前情提要
微服务架构图:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
SkyWalking介绍
- Skywalking是一个国产的开源框架,2015年有吴晟个人开源,2017年加入Apache孵化器,国人开源的产品,主要开发人员来自于华为,2019年4月17日Apache董事会批准SkyWalking成为顶级项目,支持Java、.Net、NodeJs等探针,数据存储支持Mysql、Elasticsearch等,跟Pinpoint一样采用字节码注入的方式实现代码的无侵入,探针采集数据粒度粗,但性能表现优秀,且对云原生支持,目前增长势头强劲,社区活跃。
- Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等。
各个APM工具比较
SkyWalking结构介绍
- 探针:基于不同的来源可能是不一样的, 但作用都是收集数据, 将数据格式化为 SkyWalking 适用的格式.
- 平台后端:支持数据聚合, 数据分析以及驱动数据流从探针到用户界面的流程。分析包括 Skywalking 原生追踪和性能指标以及第三方来源,包括 Istio 及 Envoy telemetry , Zipkin 追踪格式化等。 你甚至可以使用 Observability Analysis Language 对原生度量指标 和 用于扩展度量的计量系统 自定义聚合分析。
- 存储:通过开放的插件化的接口存放 SkyWalking 数据. 你可以选择一个既有的存储系统, 如 ElasticSearch, H2 或 MySQL 集群(Sharding-Sphere 管理),也可以选择自己实现一个存储系统. 当然, 我们非常欢迎你贡献新的存储系统实现。
- UI:一个基于接口高度定制化的Web系统,用户可以可视化查看和管理 SkyWalking 数据。
底层技术介绍
-
SkyWalking是使用JAVA agent 探针技术,为目标应用代码植入监控代码,监控代码进行数据统计上报的。
-
JAVA agent探针技术:
- 在JVM运行中,类是通过classLoader加载.class文件进行生成的。在类加载器加载.class文件生成对应的类对象之前时,我们可以通过修改.class文件内容(就是字节码修改技术),达到修改类的目的。
- JAVA 探针技术就是字节码修改技术。
- 本质上是一个jar包。
- 入口:premain 或 agentmain
- 使用方法:
- 静态agent:premain作为agent的入口方法,在Java程序的 main 方法执行之前执行。
- 动态agent:动态agent允许代理的目标程序的JVM先启动,再通过attach机制载入。
- Attach机制实际就是JDK提供的一种JVM进程间通信的能力,能让一个进程传命令给另外一个进程,并让它执行内部的一些操作。
-
-
主要概念:
- 服务(Service):例如用户服务
- 端点(Endpoint):服务对外提供的接口
- 实例(Instance):服务具体部署的某台服务器,服务下可以有多个实例
搭建部署
webapp
- apache-skywalking-apm-9.0.0\apache-skywalking-apm-bin\webapp
- webapp.yml修改端口
oapservice
-
端口:11800和12800,11800收集监控数据,12800接受前端请求
-
第三方程序接入skywalking:第三方程序启动时,添加启动参数
-javaagent:xxx\skywalking-agent.jar # jar包路径需要是oapservice启动项目中的路径 -DSW_AGENT_NAME=test # 指定服务名,用于skywalking中 -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 # oapservice服务地址
-
docker-compose 添加启动参数
services: user-center-service: image: uias/user-center-service:2.0.22.0531 container_name: user-center network_mode: "host" privileged: true volumes: - /var/log/uias/user-center-service/logs:/opt/user-center-service/logs environment: #指定时间 时区 - SET_CONTAINER_TIMEZONE=true - CONTAINER_TIMEZONE=Asia/Shanghai - NACOS_HOST=172.20.0.48 - NACOS_NAMESPACE=uias - SERVER_PORT=16100 # environment加JAVA_OPTS参数 command: java -javaagent:/opt/skywalking/apache-skywalking-apm-bin/skywalking-agent/skywalking-agent.jar -DSW_AGENT_NAME=user-center-service -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=172.16.4.101:11800 -jar user-center-service.jar restart: always
-
注意事项:
- skywalking默认不支持gateway,需要lib库加上gateway的plugins jar包
- 连接mysql,需要加上mysql连接驱动到lib文件夹
- 数据库可以是空,skywalking启动时,会自动建表
- 自定义链路追踪:skywalking默认仅追踪请求级(接口请求和数据库请求),项目需要方法级追踪,需要加上skywalking依赖,在需要追踪的业务方法前加注解@Trace
- 需要追踪到入参和出参,需要@Tags注解,且实体类需要重写toString方法
@Trace @Tags({ @Tag(key="result", value="returnedObj"), @Tag(key="param", value="arg[0]"), // 因为只有一个入参,所以arg[0] } ) public String test(int i){ return "test" + i.toString(); }
性能剖析
- 剖析出接口请求中,各个方法占用总时间的百分比,同时可以定位到方法内哪句代码用的时间最久
集成日志框架
- 服务控制台显示Trace id,然后到skywalking前端页面进行精确查询:添加skywalking的logback依赖,logback-spring.xml日志格式化语句添加[%tid]
告警
- 有一组规则驱动,规则定义在config/alarm-settings.yml文件中
- 规则的定义分为两部分:
- 告警规则:什么条件下触发报警
- webhook:当报警被触发,需要通知那些服务端
- alarm-settings.yml的webhooks里,配置一个接口路径,触发告警时,skywalking会请求这个接口
- 请求方法约定为POST,入参为json,实体类为alarm.AlarmMessage
- skywalking自带支持钉钉、企业微信等webhooks
源码浅析
https://it.cha138.com/android/show-51527.html
GitHub
https://github.com/apache/skywalking