SkyWalking是一个开源可观测平台,用于收集、分析、聚合和可视化来自服务和云原生基础设施的数据。SkyWalking 提供了一种简单的方法来保持分布式系统的清晰视图,甚至跨云。它是一种现代APM,专为云原生、基于容器的分布式系统而设计。
文档版本8.9.1,当前最新版本9.10
图片
SkyWalking 是一个应用性能监控系统(APM)
为微服务、云原生和基于容器(Docker, Kubernetes, Mesos)体系结构而设计,主要实现功能包括分布式追踪,性能指标分析和服务依赖分析等
类似功能的组件还有:Zipkin、Pinpoint 、CAT、Dapper等
Cat | Zipkin | Pinpoint | skywalking | |
依赖 | Java 6,7,8 Maven 3.2.3+ mysql5.6 Linux 2.6以及之上(2.6内核才可以支持epoll) | Java 6,7,8 Maven3.2+ rabbitMQ | Java 6,7,8 maven3+ Hbase0.94+ | Java 6,7,8 maven3.0+ nodejs zookeeper elasticsearch |
实现方式 | 代码埋点(拦截器,注解,过滤器等) | 拦截请求,发送(http,mq)数据至zipkin服务 | java探针,字节码增强 | java探针,字节码增强 |
颗粒度 | 代码级 | 接口级 | 方法级 | 方法级 |
页面UI | ***** | ** | ***** | **** |
存储选择 | Mysql,hdfs | In-memory,mysql,cassandra,elasticsearch | Hbase | Elasticsearch,h2 |
通信方式 | - | http,mq | Thrift | GRPC |
MQ监控 | 不支持 | 不支持 | 不支持 | RocketMq,kafka |
全局调用 统计 | 支持 | 不支持 | 支持 | 支持 |
Trace查询 | 不持支 | 支持 | 不支持 | 支持 |
报警 | 支持 | 不支持 | 支持 | 支持 |
Jvm监控 | 不支持 | 不支持 | 支持 | 支持 |
优点 | 功能完善 | spring-cloud-sleuth可以很好的集成zipkin , 代码无侵入,集成非常简单 , 社区更加活跃。对外提供有query接口,更加容易二次开发 | 完全无侵入, 仅需修改启动方式,界面完善,功能细致。 | 完全无侵入,界面完善,支持应用拓扑图及单个调用链查询。功能比较完善(zipkin + pinpoint) |
缺点 | 代码侵入性较强,需要埋点文档比较混乱,文档与发布版本的符合性较低,需要依赖点评私服 (或者需要把他私服上的jar手动下载下来,然后上传到我们的私服上去)。 | 默认使用的是http请求向zipkin上报信息,耗性能。跟sleuth结合可以使用rabbitMQ的方式异步来做,增加了复杂度,需要引入rabbitMQ 。数据分析比较简单。 | 不支持查询单个调用链, 对外表现的是整个应用的调用生态。二次开发难度较高 | 3.2版本之前BUG较多 ,网上反映兼容性较差 . 3.2新版本的反映情况较少依赖较多。 |
文档 | 网上资料较少,仅官网提供的文档,比较乱 | 文档完善 | 文档完善 | 文档完善 |
开发者 | 大众点评 | Twiter | Naver | 吴晟(华为开发者) ,目前已经加入Apache孵化器 |
使用公司 | 大众点评,携程,陆金所,同程旅游,猎聘网,拼多多 | Twiter | Naver | 华为,alibaba cloud,天源迪科,当当网,京东金融 |
开源监控平台,用于从服务和云原生基础设施收集、分析、聚合和可视化数据。SkyWalking提供了一种简单的方法来维护分布式系统的清晰视图,甚至可以跨云查看。它是一种现代APM,专门为云原生、基于容器的分布式系统设计
监测对象包括:service(服务), service instance(实例), endpoint(端点)
功能描述:
SkyWalking 在逻辑上分为四个部分:Probes、Platform backend、Storage 和 UI。
图片
采集tracing(调用链数据)和metric(指标)信息并上报,上报通过HTTP或者gRPC方式按要求重新格式化数据发送数据到Skywalking Collector
支持数据聚合、分析和流式处理,包括跟踪、度量和日志。
基于gRpc、Http 链路数据收集器,对agent传过来的tracing和metric数据进行整合分析通过Analysis Core模块处理并落入相关的数据存储中,同时会通过Query Core模块进行二次统计和监控告警
通过开放/可插入接口存储 SkyWalking 数据,支持多种方式存储数据 H2,ElasticSearch,MySQL, TiDB, InfluxDB或自定义
基于GraphQL Http 高度可定制的基于 Web 的界面的可视化平台,允许 SkyWalking 最终用户可视化和管理。
官方下载地址:https://skywalking.apache.org/downloads/
历史版本下载:https://archive.apache.org/dist/skywalking/
Rocketbot-UI 8.x:https://github.com/apache/skywalking-rocketbot-ui
Booster UI 9.x:https://github.com/apache/skywalking-booster-ui
注:APM已经集成UI,不需要单独下载与部署
图片
下载镜像
docker pull apache/skywalking-oap-server:8.9.1
启动容器
docker run --name oap -p 12800:12800 -p 11800:11800 -p 1234:1234 --restart always -d apache/skywalking-oap-server:8.9.1
下载镜像
docker pull apache/skywalking-ui
启动容器
docker run --name oap-ui -p 18080:8080 --restart always -d -e SW_OAP_ADDRESS=http://localhost:12800 apache/skywalking-ui
访问http://localhost:18080
负责进行数据的收集,包含了Tracing和Metrics的数据,agent会被安装到服务所在的服务器上,以方便数据的获取。探针使用gRPC协议与OAP平台通信并上报数据。
接收探针发送的数据,并在内存中使用分析引擎(Analysis Core)进行数据的整合运算,然后将数据存储到对应的存储介质上,比如 Elasticsearch、MySQL等存储服务。同时OAP还使用查询引擎(Query Core)提供HTTP查询接口。OAP默认监听两个端口gRPC协议端口11800、HTTP端口12800,gRPC用于探针上报数据,HTTP端口用于UI连接OAP平台获取数据。
Skywalking 提供单独的UI进行数据的查看,UI调用OAP提供的接口,获取对应的数据根据UI模板的配置进行展示。Skywalking UI与OAP之间使用Http协议进行通信。Skywalking UI默认监听8080端口提供Web服务。
Java Agent
activations # 工具包,默认加载。
bootstrap-plugins # 启动插件,默认加载。
config # 配置文件
logs # 日志
optional-plugins # 可选扩展插件,启动不加载,如需加载将其移到到plugins目录下。
optional-reporter-plugins # 可选统计类插件,启动不加载。
plugins # 服务类插件
skywalking-agent.jar # 客户端主程序,需要被服务启动是引用。
java -javaagent:/path/skywalking-agent/skywalking-agent.jar -jar your-app.jar
// todo//服务名称agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}// OAP服务地址collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}
代理选项 > System.Properties(-D) > 系统环境变量 > 配置文件
Client JavaScript
npm install skywalking-client-js --save
import ClientMonitor from 'skywalking-client-js'; // Report collected data to `http:// + window.location.host + /browser/perfData` in default ClientMonitor.register({ collector: 'http://127.0.0.1:8080', service: 'test-ui', pagePath: '/current/page/name', serviceVersion: 'v1.0.0', });
// options { // 参考方法文档 }
register时设置autoTracePerf:false
import ClientMonitor from 'skywalking-client-js'; ClientMonitor.setPerformance({ collector: 'http://127.0.0.1:8080', service: 'browser-app', serviceVersion: '1.0.0', pagePath: location.href, useFmp: true });
register时设置enableSPA:true,开启单页面应用基于hashchange event触发指标采集行为
或者通过以下方法手动处理,在上报数据时手动更新页面名称,当调用该方法时,默认情况下将重新报告页面PV
app.on('routeChange', function (next) { ClientMonitor.setPerformance({ collector: 'http://127.0.0.1:8080', service: 'browser-app', serviceVersion: '1.0.0', pagePath: location.href, useFmp: true }); });
// Angular import { ErrorHandler } from '@angular/core'; import ClientMonitor from 'skywalking-client-js'; export class AppGlobalErrorhandler implements ErrorHandler { handleError(error) { ClientMonitor.reportFrameErrors({ collector: 'http://127.0.0.1', service: 'angular-demo', pagePath: '/app', serviceVersion: 'v1.0.0', }, error); } } @NgModule({ ... providers: [{provide: ErrorHandler, useClass: AppGlobalErrorhandler}] }) class AppModule {} ``` ```js // React class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError(error) { // Update state so the next render will show the fallback UI. return { hasError: true }; } componentDidCatch(error, errorInfo) { // You can also log the error to an error reporting service ClientMonitor.reportFrameErrors({ collector: 'http://127.0.0.1', service: 'react-demo', pagePath: '/app', serviceVersion: 'v1.0.0', }, error); } render() { if (this.state.hasError) { // You can render any custom fallback UI return <h1>Something went wrong.</h1>; } return this.props.children; } } <ErrorBoundary> <MyWidget /> </ErrorBoundary> ``` ```js // Vue Vue.config.errorHandler = (error) => { ClientMonitor.reportFrameErrors({ collector: 'http://127.0.0.1', service: 'vue-demo', pagePath: '/app', serviceVersion: 'v1.0.0', }, error); } ```
skywalking-client-js
对请求提供端点的单个应用或负载,在使用埋点、代理或 SDK 的时候,你可以定义服务的名字。如果不定义的话,SkyWalking 会使用在agent.conf中配置的默认服务名称。
服务组中的每个单独的工作负载都称为一个实例。就像pods在 Kubernetes 中一样,它不需要是单个操作系统进程,但是,如果您使用仪器代理,则实例实际上是一个真正的操作系统进程。
用于传入请求的服务中的路径,例如 HTTP URI 路径或 gRPC 服务类 + 方法签名。
通过配置文件定义需要关注的指标 通过特定的分析语言计算指标
UI包括以下几个部分:
仪表盘
Services Load(CPM / PPM):服务每分钟请求数
Slow Services(ms):慢响应服务(按照响应时间排序)
Un-Health Services (Apdex):Apdex分数(1为满分)
Slow Endpoints (ms):慢Endpoint的平均响应时间
Global Response Latency(percentile in ms):响应时间百分比
Global Heatmap:服务响应时间热力分布图,根据时间段内不同响应时间的数量显示颜色深度颜色越深,请求越多。
自监控,OAP服务端的各项指标
# 将-修改为default prometheus-fetcher: selector: ${SW_PROMETHEUS_FETCHER:default} #default: # active: ${SW_PROMETHEUS_FETCHER_ACTIVE:true} # 改none为prometheus telemetry: selector: ${SW_TELEMETRY:prometheus} prometheus: host: ${SW_TELEMETRY_PROMETHEUS_HOST:0.0.0.0} port: ${SW_TELEMETRY_PROMETHEUS_PORT:1234}
fetcherInterval: PT15S fetcherTimeout: PT10S metricsPath: /metrics staticConfig: # 改为上步中telemetry配置的ip targets: - url: http://localhost:1234 sslCaFilePath: labels: service: oap-server
对前端也有一定的监控,通过Skywalking-Client-js组件来操作,包括Web App、Pages两个指标。
拓扑图
追踪
看每个接口的调用链,每个链路耗时、状态。如果为失败展示错误信息,如果是数据库,会展示查询语句。另外可以根据追踪tid(trace id)和标记(tag)进行筛选。
性能剖析
日志
告警
事件
调试
支持logback、log4j、log4j2日志框架集成,基于gRpc通信协议实现日志采集。
以logback为例:
<dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-logback-1.x</artifactId> <version>8.9.0</version> </dependency>
<!-- ... --> <appender name="grpc-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} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern> </layout> </encoder> </appender> <root level="INFO"> <!-- ... --> <appender-ref ref="grpc-log"/> </root>
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:0.0.0.0} plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800} plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760} plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}
https://skywalking.apache.org/docs/skywalking-java/v8.11.0/en/setup/service-agent/java-agent/application-toolkit-logback-1.x/
通过@Trace注解标记需要追踪的方法调用情况
<dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-trace</artifactId> <version>8.9.0</version> </dependency>
@Trace @GetMapping("/printLog") public String printLog() { Logger.info("traceId:{}",TraceContext.traceId()) return "ok"; }
一个服务的 TBS 的正确率、成功率、流量等,这是我们常见的针对单个指标或者某一个数据库的,这就是 Metrics 单指标分析
一次请求的范围,也就是我们从浏览器或者手机端发起任何的一次调用,甚至我们可以再推广一点,是一次业务交易,比如说一次订购的过程,从浏览商品到最后下定单、支付、物流、最后交到我们的手上。这是一个流程化的东西,我们需要轨迹,需要去追踪。
我们程序在执行的过程中间发生了一些日志,会一帧一帧地跳出来给大家去记录这个东西,这是日志记录。
Apache SkyWalking是一款功能强大的APM系统,可以帮助开发人员和运维人员更好地了解分布式系统的性能状况。通过使用SkyWalking,可以提高应用程序的稳定性和性能,降低运维成本。
本文链接:http://www.28at.com/showinfo-26-17160-0.html一文带你了解SkyWalking
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com