分布式追踪

分布式追踪

Logging、Metrics、Logging

logging_metrics_tracing.png

如图所属的韦恩图描述了三个核心概念:

  • Logging:即日志描述,用于记录一系列的离散事件。
  • Metrics:即指标,具有原子性。每个指标是一个逻辑计量单位。用于记录一段时间内的相关指标的状态。
  • Tracing:即追踪。用于记录单次请求范围以内的信息。常用于微服务中分析服务调用路径和排查系统性能问题。

这三者之间并不是相互独立的,会有一定程度的重叠,完善的监控系统一般是包含多个维度的。

分布式追踪的原理:

分布式追踪的概念可以看看谷歌的论文《Dapper, a large-scale distributed systems tracing infrastructure》

Dapper的核心思想是在分布式请求的上下文中记录 span id 和 parent id,用于记录上下级关系。
在这里插入图片描述

分布式日志追踪的作用:

  • 追踪单体服务中的执行逻辑,如函数的监控。由于单体服务中可能存在异步执行,直接输出日志不便于分析执行逻辑,而分布式日志追踪系统可以提供可视化页面,方便分析、发现问题。
  • 追踪分布式环境中微服务的调用、执行情况。
OpenTracing

OpenTracing是CNCF托管的分布式追踪项目,官方定位是针对分布式系统的追踪的API标准库,旨在为不同的分布式追踪系统提供统一的对外API接入层。它位于应用程序/类库追踪或日志分析程序之间。
在这里插入图片描述

OpenTracing 数据模型

OpenTracing 中的 Trace(调用链)通过归属于此调用链的 Span 来隐性的定义。
特别说明,一条 Trace(调用链)可以被认为是一个由多个 Span 组成的有向无环图(DAG图),SpanSpan 的关系被命名为 References。Trace调用链可以用树形结构或者基于时间轴的时序图表示。下图为树形结构表示调用关系:

在这里插入图片描述

每个 Span 包含以下的状态:(译者注:由于这些状态会反映在 OpenTracing API 中,所以会保留部分英文说明)

  • An operation name,操作名称
  • A start timestamp,起始时间
  • A finish timestamp,结束时间
  • Span Tag,一组键值对构成的 Span 标签集合。键值对中,键必须为 string,值可以是字符串,布尔,或者数字类型。
  • Span Log,一组 span 的日志集合。
    每次 log 操作包含一个键值对,以及一个时间戳。

键值对中,键必须为 string,值可以是任意类型。
但是需要注意,不是所有的支持 OpenTracing 的 Tracer,都需要支持所有的值类型。

  • SpanContext,Span 上下文对象 (下面会详细说明)
  • References(Span间关系),相关的零个或者多个 Span(Span 间通过 SpanContext 建立这种关系)

每一个 SpanContext 包含以下状态:

  • 任何一个 OpenTracing 的实现,都需要将当前调用链的状态(例如:trace 和 span 的 id),依赖一个独特的 Span 去跨进程边界传输
  • Baggage Items,Trace 的随行数据,是一个键值对集合,它存在于 trace 中,也需要跨进程边界传输

更多关于 OpenTracing 数据模型的知识,请参考 OpenTracing语义标准

Jaeger

Jeager架构介绍

img

jaeger组件介绍:

  • jaeger-client:jaeger 的客户端,实现了opentracing协议;
  • jaeger-agent:jaeger client的一个代理程序,client将收集到的调用链数据发给agent,然后由agent发给collector;
  • jaeger-collector:负责接收jaeger client或者jaeger agent上报上来的调用链数据,然后做一些校验,比如时间范围是否合法等,最终会经过内部的处理存储到后端存储;
  • jaeger-query:专门负责调用链查询的一个服务,有自己独立的UI;
  • spark-job:基于spark的运算任务,可以计算服务的依赖关系,调用次数等;
基础编程接口
config配置
cfg := &config.Configuration{
   
    Sampler: &config.SamplerConfig{
    //采样类型设置
        Type:  samplerType, 
        Param: samplerParam,
    },
    Reporter: &config.ReporterConfig{
    
        LogSpans: true,
        LocalAgentHostPort:"${your_agent_ip}:6831",
    },
}

其中SamplerConfig用于设置采样类型,Type分为:

  • const,全量采集。param采样率设置0,1 分别对应打开和关闭
  • probabilistic ,概率采集。param默认万份之一,0~1之间取值,
  • rateLimiting ,限速采集。param每秒采样的个数
  • remote 动态采集策略。param值于probabilistic的参数一样。在收到实际值之前的初始采样率。改值可以通过环境变量的JAEGER_SAMPLER_PARAM设定
生成jaeger tracer
func (c Configuration) NewTracer(options ...Option) (opentracing.Tracer, io.Closer, error)
设置为全局的单例tracer
func SetGlobalTracer(tracer Tracer)
生成开始一个Span
StartSpan(operationName string, opts ...StartSpanOption) Span
获得span的上下文
func ContextWithSpan(ctx context
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值