总体主要分为三个部分:html
1.skywalking-collector:链路数据归集器,数据能够保存在H2或ElasticSearchjava
2.skywalking-web:web的可视化管理后台,能够查看归集的数据git
3.skywalking-agent:探针,用来收集和推送数据到归集器github
经过在应用程序中添加 SkyWalking Agent,就能够将接口、服务、数据库、MQ等进行追踪,将追踪结果经过 HTTP 或 gRPC 发送到 SkyWalking Collecter,SkyWalking Collecter 通过分析和聚合,将结果存储到 Elasticsearch 或 H2,SkyWalking 同时提供了一个 SkyWalking UI 的可视化界面,UI 以 GraphQL + HTTP 方式获取存储数据进行展现。web
只需在项目目录下增长skywalking目录,而后再启动参数中增长jvm参数便可:
-javaagent:/path/to/skywalking-agent/skywalking-agent.jar
同时,咱们也能够修改config文件夹中agent.config的相关配置数据库
skywalking是一个开放源码的,用于收集、分析,聚合,可视化来自于不一样服务和本地基础服务的数据的可观察的平台, skywalking提供了一个简单的方法来让你对你的分布式系统甚至是跨云的服务有清晰的了解。 它更像是一个现代的系统性能管理,特别为分布式系统而设计。
skywalking提供了在不少不一样的场景下用于观察和监控分布式系统的方式。 首先,像传统的方法,skywalking为java,c#,Node.js等提供了自动探针代理. 同时,它为Go,C++提供了手工探针。 随着本地服务愈来愈多,须要愈来愈多的语言,掌控代码的风险也在增长, Skywalking可使用网状服务探针收集数据,以了解整个分布式系统。 一般,skywalking提供了观察service,service instance,endpoint的能力。 service: 一个服务 Service Instance: 服务的实例(1个服务会启动多个节点) Endpoint: 一个服务中的其中一个接口
第二步:启动skywalking收集器服务,启动脚本是E:\apache-skywalking-apm-bin\bin\startup.sh,启动以后咱们就能够访问http://localhost:8080/就能够看到skywalking的ui界面了。apache
第三步:启动项目: 拷贝skywalking-agent目录到所需位置,探针包含整个目录,请不要改变目录结构,可修改agent.config配置agent.application_code=xxl-job为本身的应用名c#
增长JVM启动参数,-javaagent:/path/to/skywalking-agent/skywalking-agent.jar。参数值为skywalking-agent.jar的绝对路径。后端
经过以上几步以后,咱们就能够直接访问咱们的项目的接口,看skywalking界面上可否收集到咱们的调用信息了。服务器
下图为skywalking的首页,主要展现全局的性能信息。
3.skywalking的traceId与日志组件(log4j,logback,elk等)的集成:
以logback为例,只要在日志配置xml中增长如下配置,则在打印日志的时候,自动把当前上下文中的traceId加入到日志中去。
4.skywalking告警模块的使用:
下图为告警页面的ui界面,能够看到能够从三个维度来监控,分别为服务(service)、服务实例(service instance),端点(endpoint/接口)。
告警规则能够在安装包下的配置文件-(apache-skywalking-apm-bin/config/alarm-settings.yml)中,自由定义。
默认配置监控服务和服务实例,不监控端点,由于 # Active endpoint related metrics alarm will cost more memory than service and service instance metrics alarm.# Because the number of endpoint is much more than service and instance.
5.skywalking的原理:
skywalaking整体架构分为三部分:
skywalking的核心在于agent部分,下图展现了一次调用跨多个进程里agent的详细的运行过程:
以拦截dubbo请求为例,skywalking的dubbo拦截插件实现的代码实现:
源码使用的是拦截dubbo中的MonitorFilter
这个类中的invoke
方法。具体如DubboInterceptor所示,经过获取dubbo的上下文RpcContext
先对消费者调用以前加入sky walking的跨进程协议header信息sw:traceId
,而后到生产者取出。
在调用结束后结束,把span的详情信息发送给collector(数据收集器).具体实如今类org.apache.skywalking.apm.agent.core.context.TracingContext的stopSpan(AbstractSpan span)方法,
下面是stopSpan的具体实现方法:
5.skywalking的限制
1.只支持已知的代理,若是使用的中间件还未被支持,须要本身写插件。
2.跨线程的场景不支持自动代理,好比任务分配,任务池,批处理的场景。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
对于APM来讲,自动探针和手动探针,只是关于如何实现监控的技术细节。这些和架构设计无关。所以在本文档中,咱们将它们仅视为客户端库。
SkyWalking架构的基本设计原则包括易于维护、可控和流式处理。
为了实现这些目标,SkyWalking后端采用如下设计。
SkyWalking后端基于纯模块化设计。用户能够根据本身的需求切换或组装后端功能。
模块定义了一组特性,这些特性能够包括技术库(如:gRPC/Jetty服务器管理)、跟踪分析(如:跟踪段或zipkin span解析器)或聚合特性。 这些彻底由模块定义及其模块实现来决定。
每一个模块均可以在Java接口中定义它们的服务,每一个模块的提供者都必须为这些服务提供实现者。 提供者应该基于本身的实现定义依赖模块。这意味着,即便两个不一样的模块实现者,也能够依赖不一样的模块。
此外,后端模块化core还检查启动序列,若是没有发现周期依赖或依赖,后端应该被core终止。
后端启动全部模块,这些模块的配置在application.yml
中是分离的。在这个yaml文件中:
cluster
、naming
等。zookeeper
是cluster
等模块。hostPort
和sessionTimeout
是zookepper
的必需属性。yaml文件的一部分举例
cluster: zookeeper: hostPort: localhost:2181 sessionTimeout: 100000 naming: jetty: #OS real network IP(binding required), for agent to find collector cluster host: localhost port: 10800 contextPath: /
首先,后端提供两种类型的链接,也即提供两种协议(HTTP和gRPC):
好比在SkyWalking Java探针中
collector.servers
表示命名服务,将naming/jetty/ip:port
映射为HTTP请求地址。collector.direct_servers
表示直接设置上行服务,并使用gRPC发送监控数据。客户端库和后端集群之间的流程图
Client lib Collector1 Collector2 Collector3 (Set collector.servers=Collector2) (Collector 1,2,3 constitute the cluster) | +-----------> naming service ---------------------------->| | |<------- receive gRPC IP:Port(s) of Collector 1,2,3---<--| | |Select a random gRPC service |For example collector 3 | |------------------------->Uplink gRPC service----------------------------------->|
当Collector以群集模式运行时,后端必须以某种方式相互发现。默认状况下,SkyWalking使用Zookeeper进行协调,并做为实例发现的注册中心。
经过以上部分(多个链接方式),客户端库将不会使用Zookeeper来查找集群。咱们建议客户不要这么作。由于集群发现机制是可切换的,由模块化核心提供。依赖它会破坏可切换能力。 咱们但愿社区提供更多的实现者来进行集群发现,例如Eureka,Consul,Kubernate等。
流模式相似轻量级storm/spark的实现,它容许使用API构建流处理图(DAG)以及每一个节点的输入/输出数据协定。
新模块能够查找和扩展示有的流程图。
处理中有三种状况
经过具有的这些功能,collector集群像流式网络同样运行着去聚合、度量标准监控信息,而且不依赖于存储模块的实现来支持并发地编写相同的度量id。
因为流模式负责并发,所以存储模块的实现的职责是提供高速写入和组合查询。
目前,咱们支持ElasticSearch做为主要实现模块,H2用于预览版本,以及由Sharding Shpere项目管理的MySQL关系数据库集群。
除了后端设计的原则,UI是SkyWalking的另外一个核心组件。它基于React,Antd和Zuul代理实现,提供后端集群发现、查询调度和可视化的功能。
Web UI以多链接方式中的类似的流程机制做为客户端的1.naming
、2.uplink
。惟一的区别是,在ui/jetty/yaml
定义下的主机和端口上(默认值:localhost:12800)用HTTP绑定中的GraphQL查询协议替换上行。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
目前Skywalking已经支持从6个可视化维度剖析分布式系统的运行状况。
Dubbo实例程序已上传到Github仓库中。方便你们下载使用。
服务接口:
package org.apache.skywalking.demo.interfaces; public interface HelloService { String sayHello(String name); } |
package org.apache.skywalking.demo.provider; @Service(version = "${demo.service.version}", application = "${dubbo.application.id}", protocol = "${dubbo.protocol.id}", registry = "${dubbo.registry.id}", timeout = 60000) public class HelloServiceImpl implements HelloService { public String sayHello(String name) { LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1)); return "Hello, " + name; } } |
package org.apache.skywalking.demo.consumer; @RestController public class ConsumerController { private static int COUNT = 0; @Reference(version = "${demo.service.version}", application = "${dubbo.application.id}", url = "dubbo://localhost:20880", timeout = 60000) private HelloService helloService; @GetMapping("/sayHello/{name}") public String sayHello(@PathVariable(name = "name") String name) { if ((COUNT++) % 3 == 0){ throw new RuntimeException(); } LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2)); return helloService.sayHello(name); } } |
Apache Skywalking(Incubator)共提供两种部署模式:单节点模式和集群模式,如下为单节点模式部署步骤,集群模式部署详情参考文档。
cluster.name
设置成CollectorDBCluster
。此名称须要和collector配置文件一致。network.host
值,将network.host
的值修改为0.0.0.0
。bin/startup.sh
命令便可启动Skywalking Collector在启动示例程序以前,执行编译打包的命令:
./mvnw clean package |
java -jar -javaagent:$AGENT_PATH/skywalking-agent.jar -Dskywalking.agent.application_code=dubbo-provider -Dskywalking.collector.servers=localhost:10800 dubbo-provider/target/dubbo-provider.jar |
java -jar -javaagent:$AGENT_PATH/skywalking-agent.jar -Dskywalking.agent.application_code=dubbo-consumer -Dskywalking.collector.servers=localhost:10800 dubbo-consumer/target/dubbo-consumer.jar |
curl http://localhost:8080/sayHello/test |
JVM信息
服务消费端:
服务提供端:
Span信息: