tracer

package module
v0.0.0-...-5166fa7 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 13, 2020 License: MIT Imports: 17 Imported by: 0

README

tracer

使用 opentracing ,封装常见的 golang 库,做全链路追踪

主要用于练习 opentracing 的使用

主要特点

  • 可以开启或关闭 opentracing
  • 详细的例子,演练模拟各种正常、异常下链路追踪情况

例子

模拟以下情景,做下全链路追踪练习

      +--------------------------------+
      |                                |                         +-------------+
      |                                |                         |    Redis    |
      |                                |                         +------+------+
      |                                |                                ^
      v                                |                                |
+-----+-------+     http        +-------------+     gRPC         +-------------+
|   server1   +---------------->+   server2   +----------------->+   server3   +---+
+-------------+                 +-------------+                  +-------------+   |
                                       ^                                |          |
                                       |                                v          |
                                       |                         +------+------+   |
                                       |                         |    MySQL    |   |
                                       |                         +-------------+   |
                                       |                                           |
                                       |                                           |
                                       +-------------------------------------------+

演练以下情景:

  • 正常情况

    server1 --> HTTP --> server2
                            |--> HTTP --> server1 (略,要封装下 http client api 调用即可。封装方法见对 MySQL 的封装)
                            |-->  gRPC --> server3
                                              |--> MySQL
                                              |--> Redis
                                              |--> gRPC --> server2
    
    • 包括 HTTP 嵌套调用正常
    • 包括 gRPC 嵌套调用正常
  • 各种异常

    • HTTP 执行 panic
    • gRPC 执行 panic
    • MySQL 执行失败
    • Redis 执行失败
    • 服务间调用死循环

HTTP

目前 HTTP 使用 github.com/labstack/echo

接入 tracer 代码:

e.Use(tracer.EchoMiddleware(tracerName))

gRPC

包括一元 RPC 调用追踪、流 RPC 调用追踪

接入 tracer 代码:

s := grpc.NewServer(
	tracer.RPCServerOption(tracerName), // server tracer
)
conn, err = grpc.Dial(addr,
	tracer.RPCClientOption(tracerName), // client tracer
)

Redis

var rdb *redis.Client
func f() {
	rclient := tracer.NewRedisClient(ctx, tracerName, rdb)
	rclient.Set("data", "TestRedis", 60*time.Second)
}

Redis Client 产品有不少,实际情况,根据自己使用的 Redis 库做下封装即可

MySQL

MySQL Client 产品有不少,实际情况,根据自己使用的 MySQL 库做下封装即可

这里也懒的封装某个 MySQL 库了,实践了下, span 一段逻辑的例子(连接 MySQL,并 Ping MySQL)

Jaeger

jaeger 安装,参考: https://www.jaegertracing.io/docs/1.18/getting-started/

类似以下命令:

docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
  -p 5775:5775/udp \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 14268:14268 \
  -p 14250:14250 \
  -p 9411:9411 \
  jaegertracing/all-in-one:1.18

UI 界面: http://localhost:16686/

Zipkin

TODO

集成报警

opentracing 接口并没有直接支持 metrics 采集对象。但是具体的追踪器,有支持,比如 jaeger 。

jaeger 内置支持 prometheus ,使用方法参考例子:https://github.com/jaegertracing/jaeger/tree/master/examples/hotrod

jaeger 内部会自动采集一次 trace 的延迟分布、成功率等信息

prometheus 的相关练习参考: https://github.com/fananchong/test/tree/master/prometheus_test

主要用途

  • 开发环境,可以一直开着 tracer ,并通过集成报警,实时通知程序服务异常
  • 压测环境,方便排查内部链路问题
  • 生产环境,排查错误,需要时,打开 tracer ,协助分析问题

TODO

这些是原先计划练习下的,但是发现已经基本掌握,或参考代码模仿下即可。因此这里仅罗列下,不会再去代码实现考察一遍

参考

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Disable

func Disable(name string)

Disable 关闭 tracer

func EchoMiddleware

func EchoMiddleware(tracerName string) echo.MiddlewareFunc

EchoMiddleware echo 的中间件

func Enable

func Enable(name string) (err error)

Enable 打开 tracer

func Get

func Get(name string) opentracing.Tracer

Get 获取 tracer

func MySQLPingWrap

func MySQLPingWrap(ctx context.Context, tracerName string)

MySQLPingWrap ping mysql for test

func RPCStreamClientInterceptorOption

func RPCStreamClientInterceptorOption(tracerName string) grpc.DialOption

RPCStreamClientInterceptorOption 用来设置 gRPC tracer 拦截器

func RPCStreamServerInterceptorOption

func RPCStreamServerInterceptorOption(tracerName string) grpc.ServerOption

RPCStreamServerInterceptorOption 用来设置 gRPC tracer 拦截器

func RPCUnaryClientInterceptorOption

func RPCUnaryClientInterceptorOption(tracerName string) grpc.DialOption

RPCUnaryClientInterceptorOption 用来设置 gRPC tracer 拦截器

func RPCUnaryServerInterceptorOption

func RPCUnaryServerInterceptorOption(tracerName string) grpc.ServerOption

RPCUnaryServerInterceptorOption 用来设置 gRPC tracer 拦截器

func Usejaeger

func Usejaeger()

Usejaeger 使用 jaeger 做为 tracer

Types

type ITracer

type ITracer interface {
	Enable(name string) (err error)
	Disable(name string)
	Get(name string) opentracing.Tracer
}

ITracer tracer 访问接口

var DefaultTracer ITracer

DefaultTracer tracer 具体实例

type RedisClient

type RedisClient struct {
	*redis.Client
	// contains filtered or unexported fields
}

RedisClient Redis 客户端

func NewRedisClient

func NewRedisClient(ctx context.Context, tracerName string, redis *redis.Client) *RedisClient

NewRedisClient RedisClient 构造函数

Directories

Path Synopsis
internal

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL