• 关于Metrics和Tracing介绍


    前言

    Metrics和Tracing属于开箱即用的一套API,其目的是为了监控跟踪程序调用。本身使用起来很简单,但希望通过这篇文章,让使用者能明白其工作原理和更好的使用。

    Metrics、Tracing和Logging

    logging应该是我们最熟悉的一个组成,其目的是在于记录程序运行的状态,便于我们Debug。

    我们可以在日志中记录例如 API被调用的次数
    但对于观测者非常不方便,因为我们需要在大量的日志中去寻找这个值,而且如果我们想对这些值进行采集,则需要去解析日志,而对于不同的人写的程序来说,日志输出的格式都是不同的,这就导致了重复且无意义的工作,这时Metrics和Tracing便应运而生。

    Metrics

    Metrics即度量指标。其原理是,将要监测的值记录在特定的全局变量中,然后通过HTTP的形式向外提供查询这些指标的接口,即Exporter。Prometheus会通过Exporter拉取这些数据,并存放在时序数据库中,可通过PromQL进行查询。

    View

    View定义了Metrics展示的形式,例如 某一metrics在代码中最近的值(LastValue)、某一metrics的值在某一范围的分布(Distribution)

    Exporter

    Exporter即View向外展示的一个httpHandler。

    opencensus使用步骤

    // 1.定义Metrics
    var MCounter = stats.Int64("api/counter", "The counter of request", "by")
    
    
    // 2.定义View视图
    MCountView = &view.View{
    		Name:        "api/counter",
    		Measure:     MCounter,
    		Description: "The counter of request",
    		Aggregation: view.Count(),
    }
    
    // 3.注册View试图
    view.Register(MCountView)
    
    // 4.开启http端口
    pe, err := prometheus.NewExporter(prometheus.Options{
    		Namespace: "ocmetricstutorial",
    })
    mux := http.NewServeMux()
    mux.Handle("/metrics", pe)
    if err := http.ListenAndServe(":8888", mux); err != nil {
    	log.Fatalf("Failed to run Prometheus scrape endpoint: %v", err)
    }
    

    官方文档-快速上手(强烈建议按文档操作一遍)

    https://opencensus.io/quickstart/go/metrics/

    Tracing

    Tracing即链路跟踪。其目的是在分布式系统中,完成一个用户请求可能需要多个子系统之间的相互调用,而子系统为了实现高可用都会有多个节点,导致排查问题非常困难。Tracing相对于Metrics来说,实现会更复杂,我们先了解一些概念。

    Trace

    Trace表示一个调用链路,由全局唯一的TraceID标识。Trace由Span组成。

    Span

    Span(一般)表示一个函数调用,由全局唯一的SpanID标识。Span组成的Trace实际上是一颗树结构,除了根Span外,每个Span都会有一个父Span。

    Context

    Context表示Tracing的上下文,用于生成Trace和Span。当我们使用sdk生成一个span时需要传入ctx,如果ctx中不存在trace和span的相关信息,则会生成trace和一个根span,并记录在ctx中。如果ctx中已经存在了trace和span的相关信息,则生成的span会指向这个父span,通过在代码中传递ctx来实现span的生成。

    在进程间的rpc通信,需要将ctx序列化后,例如作为http的请求头参数进行传递。

    Opentelemetry + Jaeger使用步骤总结

    // 1.通过ctx生成span
    _, span := otel.Tracer(name).Start(ctx, "Poll")
    defer span.End()
    
    
    // 2.生成JaegerExporter
    exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))
    
    
    // 3.生成Provider
    tp := tracesdk.NewTracerProvider(
    	// Always be sure to batch in production.
    	tracesdk.WithBatcher(exp),
    	// Record information about this application in an Resource.
    	tracesdk.WithResource(resource.NewWithAttributes(
    		semconv.SchemaURL,
    		semconv.ServiceNameKey.String(service),
    		attribute.Int64("ID", id),
    	)),
    )	
    
    

    官方文档-快速上手(强烈建议按文档操作一遍)

    https://opentelemetry.io/docs/go/getting-started/

    名词概念

    Prometheus

    采集并存储各类Exporter数据的服务,采用pull模型。

    Zabbix

    采集并存储各类Exporter数据的服务,采用push模型。

    Opencensus

    metrics实现的第三方库

    Opentracing

    tracing实现的第三方库,已暂停维护,合并入Opentelemetry

    Opentelemetry

    谷歌定义的一套tracing、metrics标准和第三方库,合并了opencensus和opentracing。

    由于其中metrics版本尚未稳定,所以londobell中仍然使用opencensus。

    Jaeger

    Uber对tracing数据采集的服务,符合Opentelemetry的定义标准。

    Opentelemetry-Collector

    官方对tracing数据采集的服务,符合Opentelemetry的定义标准。

  • 相关阅读:
    ImageView 设置图片
    Android中GridView拖拽的效果【android进化三十六】
    Android 用户界面---拖放(Drag and Drop)(三)
    Android 用户界面---拖放(Drag and Drop)(二)
    Android 用户界面---拖放(Drag and Drop)(一)
    PHP中刷新输出缓冲
    php判断是否为json格式的方法
    php安全模式
    PHP json_encode() 函数介绍
    PHP mysql_real_escape_string() 函数防SQL注入
  • 原文地址:https://www.cnblogs.com/Ghostant/p/15560792.html
Copyright © 2020-2023  润新知