热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Golang使用zipkin进行链路监控

准备工作docker运行zipkin服务dockerrun-d-p9411:9411openzipkinzipkin一、对grpc服务进行监控关于Golang使用grpc的内

准备工作


  • docker运行zipkin服务

docker run -d -p 9411:9411 openzipkin/zipkin

一、对grpc服务进行监控

关于Golang使用grpc的内容请转移到这边文章Golang使用grpc实战

代码改造


需要注意对grpc进行监控的zipkin版本需要0.3.5,访问zipkin的v1版本,使用最新版本会出现问题


服务端

const (serviceName = "simple_zipkin_server"zipkinAddr = "http://127.0.0.1:9411/api/v1/spans"zipkinRecorderAddr = "127.0.0.1:9000"
)/*获取zipkin的tracer对象,并把tracer封装成ServerInterceptor注入到grpc.ServerOption中
*/

func NewZipkinTracer(opts []grpc.ServerOption) (opentracing.Tracer, []grpc.ServerOption, error) {collector, err := zipkin.NewHTTPCollector(zipkinAddr)if err != nil {log.Fatal(err.Error())return nil, opts, err}recorder := zipkin.NewRecorder(collector, true, zipkinRecorderAddr, serviceName)tracer, err := zipkin.NewTracer(recorder, zipkin.ClientServerSameSpan(true), zipkin.TraceID128Bit(true))if err != nil {log.Fatal(err.Error())return nil, opts, err}opts = append(opts, grpc_middleware.WithUnaryServerChain(otgrpc.OpenTracingServerInterceptor(tracer, otgrpc.LogPayloads()),))return tracer, opts, nil
}func main() {//...go func() {//...var opts = []grpc.ServerOption{grpc.Creds(cred)}_, opts, err = NewZipkinTracer(opts)if err != nil {log.Fatal(err.Error())return}rpcserver := grpc.NewServer(opts...)//...}//...
}

客户端

const (serviceName = "simple_zipkin_server"zipkinAddr = "http://127.0.0.1:9411/api/v1/spans"zipkinRecorderAddr = "127.0.0.1:9000"
)/*获取zipkin的tracer对象,并把tracer封装成ClientInterceptor注入到grpc.DialOption中
*/

func NewZipkinTracer(opts []grpc.DialOption) (opentracing.Tracer, []grpc.DialOption, error) {collector, err := zipkin.NewHTTPCollector(zipkinAddr)if err != nil {log.Fatal(err.Error())return nil, opts, err}recorder := zipkin.NewRecorder(collector, true, zipkinRecorderAddr, serviceName)tracer, err := zipkin.NewTracer(recorder, zipkin.ClientServerSameSpan(true), zipkin.TraceID128Bit(true))if err != nil {log.Fatal(err.Error())return nil, opts, err}opts = append(opts, grpc.WithUnaryInterceptor(otgrpc.OpenTracingClientInterceptor(tracer, otgrpc.LogPayloads()),))return tracer, opts, nil
}func main() {//...var opts = []grpc.DialOption{grpc.WithTransportCredentials(creds)}_, opts, err = NewZipkinTracer(opts)if err != nil {log.Fatal(err.Error())return}conn, err := grpc.Dial(fmt.Sprintf("%v:%d", addr.Service.Address, addr.Service.Port), opts...)if err != nil {log.Fatal(err)}defer conn.Close()//...
}

测试


  • 先后运行server.go和client.go,进行一次grpc的调用;

  • 访问http://localhost:9411/zipkin,选择"serviceName"为"simple_zipkin_server",然后点击右边的搜索按钮,即可看到如下图的调用链监控信息;

在这里插入图片描述

二、对Gin框架的Web服务进行监控

关于Golang使用gin框架构建Web服务的内容请转移到这边文章Go语言Web知识(一) 认识Gin框架

代码改造

var (zkReporter reporter.ReporterzkTracer opentracing.Tracer
)const (serviceName = "zipkin_gin_server"serviceEndpoint = "localhost:8080"zipkinAddr = "http://127.0.0.1:9411/api/v2/spans"
)func initZipkinTracer(engine *gin.Engine) error {zkReporter = zkHttp.NewReporter(zipkinAddr)endpoint, err := zipkin.NewEndpoint(serviceName, serviceEndpoint)if err != nil {log.Fatalf("unable to create local endpoint: %+v\n", err)return err}nativeTracer, err := zipkin.NewTracer(zkReporter, zipkin.WithTraceID128Bit(true), zipkin.WithLocalEndpoint(endpoint))if err != nil {log.Fatalf("unable to create tracer: %+v\n", err)return err}zkTracer = zkOt.Wrap(nativeTracer)opentracing.SetGlobalTracer(zkTracer)// 将tracer注入到gin的中间件中engine.Use(func(c *gin.Context) {span := zkTracer.StartSpan(c.FullPath())defer span.Finish()c.Next()})return nil
}func main() {engine := gin.Default()err := initZipkinTracer(engine)if err != nil {panic(err)}defer zkReporter.Close()engine.GET("/ping", func(c *gin.Context) {c.JSON(http.StatusOK, "pong")})//...engine.Run(":8080")
}

测试


  • 访问http://localhost:8080/ping,返回"pong",进行一次http请求;
  • 访问http://localhost:9411/zipkin,选择"serviceName"为"zipkin_gin_server",然后点击右边的搜索按钮,即可看到如下图的调用链监控信息;

在这里插入图片描述


推荐阅读
  • 本文详细介绍了如何在Java Web服务器上部署音视频服务,并提供了完整的验证流程。以AnyChat为例,这是一款跨平台的音视频解决方案,广泛应用于需要实时音视频交互的项目中。通过具体的部署步骤和测试方法,确保了音视频服务的稳定性和可靠性。 ... [详细]
  • 基于Dubbo与Zipkin的微服务调用链路监控解决方案
    本文提出了一种基于Dubbo与Zipkin的微服务调用链路监控解决方案。通过抽象配置层,支持HTTP和Kafka两种数据上报方式,实现了灵活且高效的调用链路追踪。该方案不仅提升了系统的可维护性和扩展性,还为故障排查提供了强大的支持。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 深入解析HTTP网络请求API:从基础到进阶的全面指南
    本文全面解析了HTTP网络请求API,从基础到进阶,详细介绍了Android平台上的两种原生API——HttpUrlConnection和HttpClient。这两种API通过对底层Socket的封装,提供了高效、灵活的网络通信功能。文章不仅涵盖了基本的使用方法,还深入探讨了性能优化、错误处理和安全性等方面的高级主题,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 在拉斯维加斯举行的Interop 2011大会上,Bitcurrent的Alistair Croll发表了一场主题为“如何以云计算的视角进行思考”的演讲。该演讲深入探讨了传统IT思维与云计算思维之间的差异,并提出了在云计算环境下应具备的新思维方式。Croll强调了灵活性、可扩展性和成本效益等关键要素,以及如何通过这些要素来优化企业IT架构和运营。 ... [详细]
  • 动态壁纸 LiveWallPaper:让您的桌面栩栩如生(第二篇)
    在本文中,我们将继续探讨如何开发动态壁纸 LiveWallPaper,使您的桌面更加生动有趣。作为 2010 年 Google 暑期大学生博客分享大赛 Android 篇的一部分,我们将详细介绍 Ed Burnette 的《Hello, Android》第三版中的相关内容,并分享一些实用的开发技巧和经验。通过本篇文章,您将了解到如何利用 Android SDK 创建引人入胜的动态壁纸,提升用户体验。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
author-avatar
手机用户2602922857
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有