原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。java
了解xjjdog的都知道,在微服务trace方面,我在两家公司实施了uber的jaeger。可是,jaeger虽然能够搜集调用链信息并查询,但统计图表相对欠缺,尤为对于服务间调用关系部分,不够直观。mysql
今天,咱们来看一下skywalking,以及和它很像的pinpoint。说它们是近亲,是由于它们都是基于agent探针技术进行实施的。git
若是你不了解探针是何方神圣,xjjdog之前也普及过一篇文章。程序员
《冷门instrument包,功能吊炸天》github
引入微服务虽然解决了一部分问题,但大大增长了系统维护难度及复杂度。而调用链监控正是解决微服务复杂性所带来的一系列问题的强效手段。redis
那么问题来了:调用链有啥用?为何上调用链?不上隔壁产品会不会来打我?sql
答:mongodb
1.解决出现问题后,难以定位。——对整个调用链路有个完善的监控chrome
2.解决链路复杂。——清晰的链路图谱反映服务之间的依赖、调用关系apache
3.总体系统性能及运行状况,须要明确的体现,才能根据实际状况调整资源
目前市面面上主流的调用链有:jaeger,pinpoint,Zipkin,CAT,skywalking等等,本次仅针对需求进行介绍。
以上提到的调用链监控功能都大差不差,那关键就在于咱们想要的——服务拓扑,以及更加直观的展现。
因而其余选手被一波带走,这样场上就只剩两位参赛者了。到底谁nb,且听我慢慢道来。
PinPoint | Skywalking | |
---|---|---|
项目发起人 | Woonduk Kang (韩囯) | 吴晟(中囯) |
性能损耗 | 高 | 低 |
用户 | 很是多 | 很是多 |
社区 | 非 apache + —般 | apache孵化+ QQ官方交流群+活跃 |
文档 | 详细 | 详细 |
跟踪粒度 | 细 | 通常 |
代码侵入性 | 无 | 无 |
告警 | 支持 | 支持 |
JVM监控 | 支持 | 支持 |
UI丰富度 | 很高 | 通常 |
实现方式 | 字节码注入 | 字节码注入 |
兼容 OpenTracing | 否 | 是 |
扩展性 | 低 | 高 |
Traceld 查词 | 不支持 | 支持 |
发布包 | war | jar |
协议 | thrift | gRPC |
支持语言 | Java, PHP | Java, C#, PHP, Node.js |
存储 | HBase+MySQL | ES, H2, MySQL, TiDB, Sharding-Sphere |
过滤追踪 | filter配置 | agent.config + apm-trace-ignore-plugin |
组件 | collector+Web+agent+存储 | OAP+Web+agent+存储+zk |
GitHub Star | 9.4k | 10.8k+ |
当看到Hbase……唔……嗯。走好……不送……告辞…… 胜者——skywalking! 这么草率固然有人不服,放出pinpoint的ui,诸位感觉一下。
不要问为啥是它,问就是信仰!就像装机用asus同样。但姑且仍是介绍一下……
skywalking是一个开源的观测平台, 用于从服务和云原生基础设施收集, 分析, 聚合以及可视化数据,它提供了一种简便的方式来清晰地观测分布式系统, 甚至能够观测横跨不一样云的系统.
服务(Service): 表示对请求提供相同行为的一系列或一组工做负载. 在使用打点代理或 SDK 的时候, 你能够定义服务的名字. 若是不定义的话, SkyWalking 将会使用你平台上定义的名字
服务实例(Service Instance): 上述的一组工做负载中的每个工做负载称为一个实例. 就像 Kubernetes 中的 pods 同样, 服务实例未必就是操做系统上的一个进程. 但当你在使用打点代理的时候, 一个服务实例实际就是操做系统上的一个真实进程
端点(Endpoint): 对于特定服务所接收的请求路径, 如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名.
SkyWalking 逻辑上分为四部分: 探针, 平台后端, 存储和用户界面。
平台后端是一个支持集群模式运行的后台, 用于数据聚合, 数据分析以及驱动数据流从探针到用户界面的流程. 平台后端还提供了各类可插拔的能力, 如不一样来源数据(如来自 Zipkin)格式化, 不一样存储系统以及集群管理. 你甚至还可使用观测分析语言来进行自定义聚合分析
存储是开放式的. 你能够选择一个既有的存储系统, 如 ElasticSearch, H2 或 MySQL 集群(Sharding-Sphere 管理), 也能够选择本身实现一个存储系统. 固然, 咱们很是欢迎你贡献新的存储系统实现
用户界面对于 SkyWalking 的最终用户来讲很是炫酷且强大. 一样它也是可定制以匹配你已存在的后端的
那么skywalking是否真的就天下无敌呢?成也探针,败也探针,限制就在它身上。
进程内传播在大多数状况下成为可能。 许多高级编程语言(如 Java, .NET)都是用于构建业务系统. 大部分业务逻辑代码对于每个请求来讲都运行在同一个线程内, 这使得传播是基于线程 ID 的, 以确保上下文是安全的.
仅仅对某些框架和库奏效。 由于是代理来在运行时修改代码的, 这也意味着代理插件开发者事先就要知道 所要修改的代码是怎么样的. 所以, 在这种探针下一般会有一个已支持的列表清单.支持服务列表:
跨线程可能并不是老是奏效 如上所述, 每一个请求的代码大都运行在一个线程以内, 对于业务代码来讲尤为如此. 可是在其余一些场景下, 它们也会在不一样线程下工做, 好比指派任务到其余线程, 任务池, 以及批处理. 对于一些语言, 可能还提供了协程或相似的概念如 Goroutine, 使得开发者能够低开销地来执行异步操做, 在这些场景下, 自动打点可能会遇到一些问题。
除一些图表、top榜以外。还可查看全局 或 某个服务 或某个节点的详细信息。(如 请求、JVM等)
以下图所示,为当前服务调用关系拓扑。但存在必定局限性,具体说明以下:
1.服务间必需要存在流量关系才会显示
2.默认显示10分钟内,最大显示1小时内服务调用。(后期可能会有优化)
3.需使用chrome,firefox等正经浏览器。搜狗/360等浏览器,没法显示拓扑
4.点击某个服务节点,将显示依赖关系
5.点击连线中点将显示请求信息
6.刷新按钮 将显示最近10分钟拓扑,并重置当前全部查询 及 操做
7.根据线条流向,可获知调用 <-> 被调用关系
8.因探针没法支持,部分服务显示为ip。如mysql,postgresql,memcached,redis,mongodb,kafka,xxl-job(显示图标)
9.红色节点表示最近存在请求失败的状况
10.显示的服务名,与发布系统名一致。若eureka服务名 & 发布系统名不一样可能难以检索服务
若想看order-rpc服务的调用关系,可进行搜索,结果以下图【不要开自动刷新,会被无限重置】
经过【追踪】进入调用链查看界面,可经过服务、实例、请求状态等进行查询。具体说明以下:
1.查询默认按持续时间倒序
2.可按追踪id查询相关接口
3.可切换调用链展示形式以进行不一样分析
4.可单机某个节点查看具体信息,如sql、堆栈信息等
以上就是skywalking的经常使用功能,更多方式各位大佬可自由探索。嗯嗯,如今我手里,除了jaeger,又多了一个推荐选项。任何东西,仍是要试一试,才知道它究竟是不是美妙呀。
做者简介:小姐姐味道 (xjjdog),一个不容许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不同的味道。个人我的微信xjjdog0,欢迎添加好友,进一步交流。