Jaeger插件开发及背后的思考

简介: 本文主要介绍Jaeger最新的插件化后端的接口以及开发方法,让大家能够一步步的根据文章完成一个Jaeger插件的开发。此外SLS也推出了对于Jaeger的支持,欢迎大家试用。

随着云原生 + 微服务的推广和落地,服务监控也变得越来越重要了。中等规模的微服务场景下,运维同学已经无法通过日志还原请求的调用轨迹和请求所经过服务的执行耗时,更不用说去定位和分析服务异常根因,研发运维同学需要一个服务监控工具,它可以还原每次请求的服务调用轨迹以及服务执行时间,并以图的形式展现出来。分布式链路追踪系统孕育而生。

近些年市面上有大量优秀的商业产品,这些商业产品通常也叫APM(应用性能监控);比如国内商业公司有阿里云ARMS,听云,博瑞,云智慧等等,国外优秀的商业公司有AppDynamic,DynaTrace等等,它们在产品方面做非常完善,能够适配各种场景。同样地,开源也有非常优秀的解决方案。比如说 CNCF Jaeger,Apache SkyWalking,Cat, Pinpoint等。Jaeger作为CNCF毕业的顶级项目, 在云原生场景下,通常会成为运维同学首选监控解决方案。

Jaeger项目是Uber 在 2015 年开发的。2017 年,Jaeger 纳入云原生计算基金会(CNCF)的孵化项目,2019 年,Jaeger 正式毕业。下图是Jaeger架构图。图中包含两中架构模式,两种架构上大体一样,区别在于添加了Kafka作为缓冲,以解决峰值流量过载的问题。Jaeger Jaeger组件包括 :Client,Agent,Collector,DB,UI等组件,另外Jaeger支持还多种后端存储,其中包括:内存,Badger,Cassandra,ElasticSearch,gRPC插件。

今天我们就来说一说gRPC插件,这个强大且容易被人遗忘的功能。简单点来说,gRPC插件提供了一种能够将Trace数据从Jaeger系统中导出的能力。通过这个能力,开发同学可以很轻松的将Trace对接到一个具备Trace存储和分析的后端服务,这些服务可以对Trace进行二次分析加工,比如说异常根因分析,异常检测和告警等,帮助运维和开发同学更好的发现和定位系统潜在的问题

jaeger插件开发流程

为了更好的了解jaeger插件开发,需要先补充gRPC插件的底层实现原理,Jaeger gRPC插件是使用HashiCorp/go-plugin框架实现的。接下我们将介绍Go Plugin以及插件的开发流程。

Go Plugin由HashiCorp公司开源,它遵循设计模式中的开闭原则,通过接口固定上层业务逻辑,通过改变调用不同的RPC服务接口来改实现对业务的扩展。 目前Go Plugin包含两类插件:RPC Plugin和 GRPCPlugin,两类插件Client的底层调用不一样。一个通过net/rpc调用,一个是grpc服务调用,两个插件都提供了两个方法,Server和Client方法。Service方法的完成的功能是充当服务端的stub,服务端接受到请求后,调用接口服务端接口的实现。Client方法充当了一个工厂方法,为客户端生成接口的实现对象。

Go Plugin在启动过程中会启动一个子进程,让子进程开启RPC/gRPC服务,主进程直接通过RPC/gRPC接口达到插件的方式,它支持多版本服务(后面会讲到)并存,它本身并不提供服务的高可用相关的解决方案,这块需要用户自己去提供。讲了这么多,接下来简单的介绍Go Plugin的开发的过程

插件开发

下面介绍Go Plugin中的Example下的KV例子,KV例子定义了两个方法,Put和 Get方法,KV例子包含多个协议版本,本文以gRPC为例。

定义服务接口

type KV interface {// KV接口是KV插件定义的接口Put(key string, value []byte) errorGet(key string) ([]byte, error)
}

实现接口客户端

// KV接口客户端实现,
type GRPCClient struct{ // 接口的客户端封装了gRPC服务client proto.KVClient 
}func (m *GRPCClient) Put(key string, value []byte) error {// 调用gRPC服务接口_, err := m.client.Put(context.Background(), &proto.PutRequest{...})return err
}func (m *GRPCClient) Get(key string) ([]byte, error) {// 本身调用KV的gRPC服务resp, err := m.client.Get(context.Background(), &proto.GetRequest{...})....return resp.Value, nil

实现接口服务端

type GRPCServer struct {Impl KV
}// 实现KV gRPC服务
func (m *GRPCServer) Put(ctx context.Context,req *proto.PutRequest) (*proto.Empty, error) {// 接受到请求后,便会调用接口的服务端实现return &proto.Empty{}, m.Impl.Put(req.Key, req.Value)
}func (m *GRPCServer) Get(ctx context.Context, req *proto.GetRequest) (*proto.GetResponse, error) {// 接受到请求后,便会调用接口的服务端实现v, err := m.Impl.Get(req.Key)return &proto.GetResponse{Value: v}, err
}type KV struct{}func (KV) Put(key string, value []byte) error {// 具体业务实现
}func (KV) Get(key string) ([]byte, error) {// 具体业务实现
}

实现go plugin插件接口

// 实现GrpcPlugin接口
type KVGRPCPlugin struct {plugin.Plugin  Impl KV         //KV接口的实现, 
}func (p KVGRPCPlugin) GRPCClient(ctx context.Context, broker plugin.GRPCBroker, c *grpc.ClientConn) (interface{}, error) {// 注意返回为接口客户端实现return &GRPCClient{client: proto.NewKVClient(c)}, nil
}func (p KVGRPCPlugin) GRPCServer(broker plugin.GRPCBroker, s *grpc.Server) error {// 注册gRpc服务proto.RegisterKVServer(s, &GRPCServer{Impl: p.Impl})return nil
}

插件使用

上面介绍了插件的开发,这部分将介绍插件是如何使用的,插件使用分为两个部分,插件服务端和插件的客户端部分

插件服务端

上面部分提到,go plugin启动时会启动在本地一个子进程,这里的子进程指的就是插件的服务端,插件服务端需要是一个包含main方法的可执行文件。下面介绍开始简单介绍插件服务端使用

  1. 编写一个main函数,并将插件的客户端实现注册到go-plugin中,如下:
plugin.Serve(&plugin.ServeConfig{// shakeConfig包含查件版本和认证信息HandshakeConfig: shared.Handshake,Plugins: map[string]plugin.Plugin{// 插件名字"kv_grpc": &shared.KVGRPCPlugin{Impl: &KV{}},},GRPCServer: plugin.DefaultGRPCServer,
})
  1. 使用go build 编译成可执行文件

插件客户端

插件客户端流程主要包括,创建插件的Client,启动插件服务端,获取插件的接口实现,调用服务接口

client := plugin.NewClient(&plugin.ClientConfig{// shakeConfig包含查件版本和认证信息HandshakeConfig: shared.Handshake,//插件名字和插件的实例的映射关系Plugins:         shared.PluginMap,// 这里填写插件可执行文件的路径Cmd:             exec.Command("sh", "-c", os.Getenv("KV_PLUGIN")),// 插件支持的协议。AllowedProtocols: []plugin.Protocol{plugin.ProtocolGRPC, plugin.ProtocolNetRPC},
}),
// 获取插件的client端,在这步,go plugin通过Cmd穿过来的参数启动子进程,同时做插件版本和认证信息的校验
rpcClient, err := client.Client()
// 获取接口客户端的对象
raw, err := rpcClient.Dispense("kv_grpc")
kv := raw.(shared.KV)
// 执行命令
result, err := kv.Get(os.Args[1])

jaeger插件接口规范

通过上面的介绍,我们已经可以了解到,Jaeger已经帮我们实现了插件的客户端&服务端和接口的客户端,我们只需完成接口的服务端开发,一个gRPC插件的开发完成了。Jaeger在gRPC插件预留了2个插件接口,StorePlugin和ArchiveStorePlugin,两者区别在于StorePlugin比ArchiveStorePlugin多了DependencyReader接口的定义,DependencyReader接口用来查询服务间依赖关系。同时这两个插件接口都暴露了SpanReader和SpanWriter接口,用于Trace/Span的读写操作。

SpanReader

// 读取所有的operation Name
func GetOperations(ctx context.Context, query spanstore.OperationQueryParameters) ([]spanstore.Operation, error)
// 读取所有的应用名称
func GetServices(ctx context.Context) ([]string, error) 
// 通过符合条件的Trace
func FindTraces(ctx context.Context, query *spanstore.TraceQueryParameters) ([]*model.Trace, error) 
// 通过符合条件的Trace ID
func FindTraceIDs(ctx context.Context, query *spanstore.TraceQueryParameters) ([]model.TraceID, error) 
// 通过Trace ID获取具体Trace详情
func GetTrace(ctx context.Context, traceID model.TraceID) (*model.Trace, error)

SpanWriter

// 写入Trace
func WriteSpan(ctx context.Context, span *model.Span) error

DependencyReader

// 读取应用之间的依赖关系,用于绘应用拓扑图和DAG图
func  GetDependencies(ctx context.Context, endTs time.Time, lookback time.Duration) ([]model.DependencyLink, error)

开发SLS Jaeger插件

SLS现已推出分布式链路追踪(Trace)的统一存储和分析方案,目前支持接入Jaeger,Apache SkyWalking,OpenTelemetry,Zipkin等多种追踪数据接入。感兴趣的可以点击查看Demo。

SLS的Jaeger插件里的代码逻辑这里就不赘述。目前插件代码现在已经开源,GitHub地址:https://github.com/aliyun/aliyun-log-jaeger 欢迎大家加⭐️拍砖,仓库也提供了一个一键Run的Demo示例,欢迎使用,使用方面的文档已经在Github上提供,下面给大家演示一下效果以及开发Jaeger插件开发背后的意义。

插件背后的思考

整个插件至此开发完成,同时,我们也需要思考一下插件的背后给我们带来了什么。用户利用trace所带来的信息价值,Trace数据采集上来仅仅只是系统监控的开始,挖掘Trace隐藏的信息是构建监控系统最重要的能力。同样的,再利用Trace所带来的的信息价值同时,如何持续地保障这种能力也是我们思考的重心

“海恩法则”指出:每一起严重事故的背后,必然有29次轻微事故和300起未遂先兆以及1000起事故隐患。 “海恩法则”告诉我们这样一个道理:每一起安全事故的背后看似偶然,其实都是各种因素积累到一定程度的必然结果, 业务系统每天都再生产大量的Trace数据,这些Trace数据用人的肉眼是无法了解系统运行的状态的信息,更别去发现系统一些隐藏起来的问题。这时就需要系统提供大数据场景下的分析的能力。SLS做日志起家,每天处理数PB级别的日志量,另外也提供一堆的日志分析的算子,加工处理的工具,为用户分析系统背后的故事。Trace我们可以理解为是一种特定的日志,只是这个日志带了关联的上下文(TraceID,parentSpanID,SpanID),相信SLS在处理Trace日志的也会游刃有余,

作为Jaeger作为一个可观察性/监控系统的组成部分,是定位和发现业务系统问题的重要数据来源,我们需要保证监控系统比业务系统活的更久。一旦监控系统先于业务系统down掉,此时的监控可以说是完全没有意义。而Jaeger作为一个开源项目,它本身只提供解决方案,并不会提供部署规模的评估方案和服务如何保证高可用的方案,这种情况下怎么去提供高可用和高性能的后端服务?谁去为监控系统提供最后一层保障? SLS作为一个云服务,其最大的一个特点就是高性能、弹性和免运维,让用户轻松应对激增流量或者规模评估不准确的问题,SLS服务本身提供99.9%的可用性以及11个9的数据可靠性。

总结

构建完备的监控体系体系,不仅要保证监控系统的可用性,还需要强大的分析能力。分析能力帮助运维同学快速的定位和发现故障,提高系统的可用性。而Jaeger插件为我们提供接入多种分析系统的扩展能力,这样的扩展能力能够让专业的分析团队提供专业的分析能力,让运维和开发团队的更加专注业务运维。

原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 MySQL + Tablestore 分层存储架构的大规模订单系统实践-架构篇

简介: 本文简要介绍了基于 MySQL 结合 Tablestore 的大规模订单系统方案。这种方案支持大数据存储、高性能数据检索、SQL搜索、实时与全量数据分析,且部署简单、运维成本低。 作者 | 弘楠 来源 | 阿里技术公众号 一 背景 订单系统存在于各行各业&#…

ajax返回来总是html,ajax返回类型

基于arcgis的webgis开发中目前是否还直接用ajax技本人是arcgis刚接触者,以前有听说过ajax这个技术,用于浏览器和web服务ajax技术现在依然是客户端浏览器和服务器交互的重要手段。 如果你用arcgis api for js技术,同样会使用ajax技术。这是良好…

三分钟教你用 Scarlet 写一个 WebSocket App

作者 | Eason来源 | 程序员巴士在移动应用程序中,数据层是屏幕上显示内容的真实来源。然而,在今年早些时候在 Tinder 中集成了 WebSocket API 时,维护它成为了一个令人头疼的问题。为了在 Android 上更轻松地集成 WebSocket,Scarl…

重磅发布|新一代云原生数据仓库AnalyticDB「SQL智能诊断」功能详解

简介: AnalyticDB For MySQL为用户提供了高效、实时、功能丰富并且智能化的「SQL智能诊断」和「SQL智能调优」功能,提供用户SQL性能调优的思路、方向和具体的方法,降低用户使用成本,提高用户使用ADB的效率 SQL是一种简单易用的业…

技术干货|基于Apache Hudi 的CDC数据入湖「内附干货PPT下载渠道」

简介: 阿里云技术专家李少锋(风泽)在Apache Hudi 与 Apache Pulsar 联合 Meetup 杭州站上的演讲整理稿件,本议题将介绍典型 CDC 入湖场景,以及如何使用 Pulsar/Hudi 来构建数据湖,同时将会分享 Hudi 内核设计、新愿景以及社区最新…

探究 Java 应用的启动速度优化

简介: 在高性能的背后,Java 的启动性能差也令人印象深刻,大家印象中的 Java 笨重缓慢的印象也大多来源于此。高性能和快启动速度似乎有一些相悖,本文将和大家一起探究两者是否可以兼得。 作者 | 梁希 高性能和快启动速度&#x…

阿里云刘伟光:金融核心系统将步入分布式智能化的时代

1月18日,阿里云在京发布金融核心系统转型“红宝书”,并推出“金融级云原生工场”,通过新的建设理念和相应的全链路平台技术,以及先进的部署体系,支撑金融机构建设面向未来的新一代分布式智能化核心系统。 阿里云智能新…

5分钟搞定Loki告警多渠道接入

简介: Loki是受Prometheus启发的水平可扩展、高可用、多租户日志聚合系统。用户既可以将Loki告警直接接入SLS开放告警,也可以先将Loki接入Grafana或Alert Manager,再借助Grafana或Alert Manager实现Loki间接接入SLS开放告警。 直接接入 您可…

当微服务遇上 Serverless | 微服务容器化最短路径,微服务 on Serverless 最佳实践

简介: 阿里云Serverless应用引擎(SAE)初衷是让客户不改任何代码,不改变应用部署方式,就可以享受到微服务K8sServerless的完整体验,开箱即用免运维。 前言 微服务作为一种更灵活、可靠、开放的架构&#x…

学计算机就业靠谱吗,2018年计算机专业就业怎么样?

由孙中山先生创办的至今已有一百多年办学传统,已经成为一所国内一流、国际知名的现代综合性大学。涉足的领域较广,有法律、医学等领域,每个领域都取得不俗的成绩。该校的计算机专业自开设以来也颇受学生欢迎,2018年计算机专业就业…

Serverless 工程实践 | 细数 Serverless 的配套服务

简介: 上文说到云计算的十余年发展让整个互联网行业发生了翻天覆地的变化,Serverless 作为云计算的产物,或者说是云计算在某个时代的表现,被很多人认为是真正意义上的云计算,关于“Serverless 是什么”这个问题&#x…

程序员在想些什么?拒绝盲猜,CSDN帮你精准洞察 Ta 们的心

CSDN 推出《开发者研究与洞察》服务。基于3200万开发者的资源,从开发者视角出发,聚焦开发者“关注”、“使用”、“体验”三方面,帮助技术推广者打造技术品牌、优化技术产品的市场投放策略、提升技术产品的开发者使用体验,直接聆听…

伴鱼:借助 Flink 完成机器学习特征系统的升级

简介: Flink 用于机器学习特征工程,解决了特征上线难的问题;以及 SQL Python UDF 如何用于生产实践。 本文作者陈易生,介绍了伴鱼平台机器学习特征系统的升级,在架构上,从 Spark 转为 Flink,解…

小型微型计算机系统退回修改,小型微型计算机系统

基本信息期刊名称小型微型计算机系统《中国计算机系统杂志》的英文名称出版周期每月发布了ISSN 1000-1220发布CN 21-1106 / TP邮政编码8-108组织者中国科学院沉阳计算技术研究所出版地: 辽宁省沉阳市期刊首页网址提交URL包含在中/荣誉CSCD核心期刊中国科学引文Pж(AJ)摘要杂志C…

Flink 1.14 新特性预览

简介: 一文了解 Flink 1.14 版本新特性及最新进展 本文由社区志愿者陈政羽整理,内容源自阿里巴巴技术专家宋辛童 (五藏) 在 8 月 7 日线上 Flink Meetup 分享的《Flink 1.14 新特性预览》。主要内容为: 简介流批一体Checkpoint 机制性能与效率…

2021 年云原生技术发展现状及未来趋势

简介: 作者于雨担任了 2021 年 GIAC 会议云原生专场的出品人兼讲师,组织了前后四个场子的演讲,在这个过程中作者同时作为听众从这些同行的演讲中学到了很多非常有用的知识。本文算是对 2021 GIAC 云原生专场的侧记,管中窥豹&#…

像搭“乐高”一样实现整合式网络安全体系

部署多种防护产品,却无法形成防御合力,是当前很多企业网络安全建设都面临的挑战。网络安全能力整合是企业的刚需,也是行业发展的大势所趋。虽然Gartner 提出的网络安全网格架构(CSMA,Cybersecurity Mesh Architecture …

合规安全大考核:移动应用安全策略全盘点

简介: 移动应用涵盖用户大量个人数据,一旦发生泄漏可能对个人、社会造成重大影响,同时对移动应用产业长远的发展来说也是毁灭性打击。移动应用开发者,也应注意开发过程中的规范性、安全性,敬畏安全问题,防范…

禁用计算机f1-f12,win10禁用F1至F12热键转为功能键的技巧

win10禁用F1至F12热键转为功能键的技巧介绍。有网友询问:Win10系统笔记本电脑上的F1-F12键上都变成了开关系统功能开关的快捷键,而失去了F1-F12键本身的快捷键的功能。因为编写程序运行的许多软件都需要使用Fn快捷功能键运行,还有制作Word文档…

Quick BI电子表格: 新手亦可表格自由

简介: 随着企业业务快速增长,单纯的表或交叉表展现的数据模式相对固定,已不能满足企业中不同角色用户、不同业务场景数据可视化分析展现的诉求。在满足业务人员可视化需求层面,Quick BI不仅提供了丰富的图表组件,也提供…