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

Jaeger链路追踪

[toc]文章介绍这里将来介绍什么是链路追踪,为什么需要链路追踪,用jaeger做服务链路追踪什么是链路追踪链路这里的链路指的是客户端向服务发起一个请求,该请求所经过的路线,也可以






[toc]


文章介绍

这里将来介绍什么是链路追踪,为什么需要链路追踪, 用jaeger做服务链路追踪


什么是链路追踪


链路

这里的链路指的是客户端向服务发起一个请求,该请求所经过的路线,也可以说是该请求经过的流量

例如: 客户端发起一个下订单的请求其流量过程:

request—>service—>order-web—>order_srv—>mysql—>order_srv—>order-web—>service—>response

这就一个请求的完整链路


链路追踪

指我们通过一些手段将链路进行监控, 对于系统调试和维护链路追踪是非常重要的,尤其微服务中,我们知道各

个微服务部署在不同的服务器上,并且每一个微服务可能是不同的人开发的,如果我们不做链路追踪,微服务之

间相互调用,假如有的微服务出问题了,整个系统都会受影响,那么我们怎么知道是哪一个微服务出的问题,找

谁维护等一系列问题。


Jaeger的安装(docker)

docker run \
--rm \
--name jaeger \
-p6831:6831/udp \
-p16686:16686 \
jaegertracing/all-in-one:latest

启动成功后可以访问:localhost:16686

架构:

mxshop-files.oss-cn-hangzhou.aliyu...


Jaeger的快速使用

使用jaeger就行链路追踪

package main
import (
"time"
"github.com/opentracing/opentracing-go"
"github.com/uber/jaeger-client-go"
jaegercfg "github.com/uber/jaeger-client-go/config"
)
func main() {
//初始化配置
cfg := jaegercfg.Configuration{
Sampler: &jaegercfg.SamplerConfig{
Type: jaeger.SamplerTypeConst,
Param: 1,
},
Reporter: &jaegercfg.ReporterConfig{
LogSpans: true,
LocalAgentHostPort: "127.0.0.1:6831",
},
ServiceName: "mxshop",
}
//初始化跟踪链
Tracer, Closer, err := cfg.NewTracer(jaegercfg.Logger(jaeger.StdLogger))
if err != nil {
panic(err)
}
//将跟踪连设置为项目全局变量
opentracing.SetGlobalTracer(Tracer)
//span1 := opentracing.StartSpan("funcA")
//time.Sleep(time.Second * 1)
//span1.Finish()
defer Closer.Close()
span1 := Tracer.StartSpan("funcA") //开始追踪
time.Sleep(time.Second * 1)
span1.Finish() //完成追踪
span2 := Tracer.StartSpan("funcC") //开始追踪
time.Sleep(time.Second * 2)
span2.Finish() //完成追踪
}

我们在ui界面可以看到

两个Traces即:funcC和funcA,里面有运行的时间等信息


截屏2022-11-13 下午8.36.40

funcC:


截屏2022-11-13 下午8.36.53

层级关系:

package main
import (
"time"
"github.com/opentracing/opentracing-go"
"github.com/uber/jaeger-client-go"
jaegercfg "github.com/uber/jaeger-client-go/config"
)
func main() {
//初始化配置
cfg := jaegercfg.Configuration{
Sampler: &jaegercfg.SamplerConfig{
Type: jaeger.SamplerTypeConst,
Param: 1,
},
Reporter: &jaegercfg.ReporterConfig{
LogSpans: true,
LocalAgentHostPort: "10.2.118.0:6831",
},
ServiceName: "test",
}
//初始化跟踪连
Tracer, Closer, err := cfg.NewTracer(jaegercfg.Logger(jaeger.StdLogger))
if err != nil {
panic(err)
}
defer Closer.Close()
Parents := Tracer.StartSpan("main")
span1 := Tracer.StartSpan("funcD", opentracing.ChildOf(Parents.Context()))
time.Sleep(time.Second * 1)
span1.Finish()
span2 := Tracer.StartSpan("funcE", opentracing.ChildOf(Parents.Context()))
time.Sleep(time.Second * 2)
span2.Finish()
}

可以看到

main:

​ funcD:———1s———

​ funcE —————————-2s———————

![截屏2022-11-13 下午8.55.53](/Users/feng/Desktop/截屏2022-11-13 下午8.55.53.png)


将jaeger集成到grpc服务中

我们需要向获取Jaeger-grpc的代码:github.com/iceymoss/Learning-notes 的jaeger_test中

这里我们对Grpc不做介绍了,如果您不了解Grpc您需要先了解Grpc详解

Server:

package main
import (
"context"
"fmt"
"log"
"net"
"StudyGin/jaeger_test/proto"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
)
type HelloSerivce struct{}
func (h *HelloSerivce) SayHello(c context.Context, req *proto.HelloRequest) (*proto.HelloReply, error) {
//接收context中的内容
md, ok := metadata.FromIncomingContext(c)
if !ok {
fmt.Println("get metadata err", ok)
}
for key, value := range md {
fmt.Printf("%v: %v\n", key, value)
}
return &proto.HelloReply{
Id: "123456789",
Request: req,
}, nil
}
func (h *HelloSerivce) Ping(context.Context, *proto.IsEmpty) (*proto.Pong, error) {
return nil, nil
}
func main() {
//实例化server
lit, err := net.Listen("tcp", ":50051")
if err != nil {
log.Panicln("监听失败", err)
}
//注册处理逻辑
//NewServer创建一个未注册服务且尚未开始接受请求的 gRPC 服务器。
s := grpc.NewServer()
proto.RegisterGreeterServer(s, &HelloSerivce{})
log.Println(s.Serve(lit))
}

Client:

package main
import (
"context"
"fmt"
"log"
"time"
"StudyGin/jaeger_test/otgrpc"
"StudyGin/jaeger_test/proto"
"github.com/opentracing/opentracing-go"
"github.com/uber/jaeger-client-go"
jaegercfg "github.com/uber/jaeger-client-go/config"
"google.golang.org/grpc"
timepb "google.golang.org/protobuf/types/known/timestamppb"
)
func main() {
//日志追踪初始化配置
cfg := jaegercfg.Configuration{
Sampler: &jaegercfg.SamplerConfig{
Type: jaeger.SamplerTypeConst,
Param: 1,
},
Reporter: &jaegercfg.ReporterConfig{
LogSpans: true,
LocalAgentHostPort: "127.0.0.1:6831",
},
ServiceName: "mxshop",
}
//初始化跟踪连
Tracer, Closer, err := cfg.NewTracer(jaegercfg.Logger(jaeger.StdLogger))
if err != nil {
panic(err)
}
//将tracer设置为全局
opentracing.SetGlobalTracer(Tracer)
defer Closer.Close()
clientConn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithUnaryInterceptor(otgrpc.OpenTracingClientInterceptor(opentracing.GlobalTracer())))
if err != nil {
log.Panicln("连接失败", err)
}
defer clientConn.Close()
client := proto.NewGreeterClient(clientConn)
res, err := client.SayHello(context.Background(), &proto.HelloRequest{
Name: "kuangyang",
Url: "learinku.com",
Gender: proto.Gender_MALE,
M: map[string]string{
"来自": "无锡",
"现居": "无锡",
},
AddTime: timepb.New(time.Now()),
})
if err != nil {
panic(err)
}
//pong, err := client.Ping(context.Background(), &proto.IsEmpty{})
//if err != nil {
// panic(err)
//}
fmt.Printf("返回结果: %v", res)
}

我们可以到jaeger的ui界面查看本次调用的链路数据




golang
后端
rpc


推荐阅读
  • 有意向可以发简历到邮箱内推.简历直达组内Leader.能做同事的话,内推奖励全给你. ... [详细]
  • 1Docker简介1.1什么是虚拟化在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转 ... [详细]
  • golang 解析磁力链为 torrent 相关的信息
    其实通过http请求已经获得了种子的信息了,但是传播存储种子好像是违法的,所以就存储些描述信息吧。之前python跑的太慢了。这个go并发不知道写的有没有问题?!packag ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • DockerDataCenter系列(四)-离线安装UCP和DTR,Go语言社区,Golang程序员人脉社 ... [详细]
  • 这也太简单了!轻松操作Feign 服务调用使用 Zipkin 链路追踪!
    0、介绍分布式微服务时代,方便了业务的快速增长和服务的稳定,但是系统出现问题后,面对同业务多服务排查起来令人头大。这时候领导就想着集成分布式追踪系统。Zipkin是T ... [详细]
  • 集成第三方库,自检测读取配置文件。文件读取,结构体定义,接口实现,错误返回,库解析,适合新同学练手。思路文件读取获取字节流文件类型分析,确定解析api集成第三方解析api管理器定义 ... [详细]
  • TiDB | TiDB在5A级物流企业核心系统的应用与实践
    TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最 ... [详细]
  • 前后端分离的企业级微服务架构microservices-platformzlt-microservices-platformgit地址:https:gitee.co ... [详细]
  • 提供:ZStack云计算原创2016-12-26张鑫讲师介绍张鑫ZStack总架构师、联合创始人《系统虚拟化》主要作者,曾任职Intel开源软件技术中心 ... [详细]
  • 说出来你可能不信,我用三天做了一个完整的项目
    Java在人工智能中能起到什么作用?作为编程语言中的扛把子,Java20多年稳定不倒,就在于它的稳定性,维护成本极低。这使得 ... [详细]
  • Go冒泡排序练习
    package main要求:随机生成5个元素的数组,并使用冒泡排序对其排序  从小到大思路分析:随机数用mathrand生成为了更好 ... [详细]
  • Go 快速入门指南命令行参数
    命令行参数个数调用os包即可。获取参数个数,遍历参数packagemainimport(fmtos)funcmain(){fmt.Printf(Numberofargsi ... [详细]
  • 小编给大家分享一下Golang端口复用测试的实现方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有 ... [详细]
  • Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。类型T表示任意的一种类型双向:chan ... [详细]
author-avatar
上帝的爱神_413_645
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有