使用opentelemetry搭建全链路追踪系统

news/2024/7/24 2:38:18 标签: golang, trace, opentelemetry, zipkin

背景

由于项目是分布式微服务架构系统,为了实现服务的可观察性,决定搭建一套可观测的系统。 由于我们当前使用的是go,而opentelemetry标准也是目前比较推荐的,并且其支持多语言,于是就想到用otel来搞了。废话不多说,进入主题

架构设计

第一方案: 如下图所示

otel-exporter otel-collector zipkin elasticsearch web send trace push trace store trace web ui view otel-exporter otel-collector zipkin elasticsearch web
  1. otel-exporter:是我们微服里面调用otel/sdk来实现。把数据上传到otel-collector
  2. otel-collector:作为数据收集器,可以收集trace、metric、logs数据。
  3. zipkin:作为trace数据的服务组件,其可以存储trace,可以可视化trace
  4. elasticsearch:数据存储组件。
  5. web:即通过chrome或其他浏览器,通过访问zipkin提供的http服务来查看链路数据。
    (补充说明: zipkin支持多种存储中间件, 默认为内存存储其重启数据就会丢失, 支持elasticsearch存储搜索快捷。 还有其他存储,有兴趣可以到其官网查看)

落地部署

otel-exporter
import (
	"context"
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
	"go.opentelemetry.io/otel/propagation"
	sdktrace "go.opentelemetry.io/otel/sdk/trace"
	"time"
	semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
)

func NewTracerProvider(cAddr string) (func(context.Context)error, error) {
	ctx := context.Background()
	res ,err := resource.New(ctx,
		resource.WithAttributes(
			semconv.ServiceName("service-name"),
			semconv.ServiceInstanceID("service-instance-id"),
			semconv.ContainerName("container"),
			semconv.ServerAddress("ip"),
			semconv.ServerPort(8888),
		),
	)
	if err != nil {
		return nil, err
	}
	traceExporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure(), otlptracegrpc.WithEndpoint(cAddr), otlptracegrpc.WithDialOption(grpc.WithBlock()))
	if err != nil {
		return nil, err
	}

	tracerProvider := sdktrace.NewTracerProvider(
		sdktrace.WithResource(res),
		sdktrace.WithBatcher(traceExporter, sdktrace.WithBatchTimeout(time.Minute)),
	)
	otel.SetTracerProvider(tracerProvider)

	otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
	return tracerProvider.Shutdown, nil
}

以上是初始化一个tracer exporter。
接着就可以使用全局的tracer来记录trace

import(
	"go.opentelemetry.io/otel/attribute"
	"go.opentelemetry.io/otel/trace"
	"go.opentelemetry.io/otel"
	"context"
)

func myFunc(){
	ttrace := otel.Tracer("service-trace")
	ctx, span := ttrace.Start(context.Background(), "parenSpanName", trace.WithAttributes(attribute.String("key","value")))
	defer span.End()

	// do logic
}

当然这里可以支持 配置自己的parent-traceid,支持child-trace-span。 这些都可以通过官网搜索到。

exporter 就到这结束了。

otel-collector

目前组件都是通过docker来安装

 docker run -d --name=otel-collect \
  -p 4317:4317 \
  -p 55679:55679 \
  -v ${pwd}/config.yaml:/etc/otelcol/config.yaml \
  otel/collector:v0.96

配置模版

# To limit exposure to denial of service attacks, change the host in endpoints below from 0.0.0.0 to a specific network interface.
# See https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/security-best-practices.md#safeguards-against-denial-of-service-attacks

extensions:
  health_check:
  pprof:
    endpoint: 0.0.0.0:1777
  zpages:
    endpoint: 0.0.0.0:55679

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
  opencensus:
    endpoint: 0.0.0.0:55678
processors:
  batch:
  memory_limiter:
    check_interval: 3s
    limit_mib: 1024
    spike_limit_mib: 1024

exporters:
  debug:
    verbosity: detailed
  zipkin:
    endpoint: http://127.0.0.1:9411/api/v2/spans
  prometheus:
    endpoint: 0.0.0.0:9190
  prometheusremotewrite:
    endpoint: http://127.0.0.1:9090/api/v1/write
    tls:
      insecure: true
  kafka/exporter:
    encoding: otlp_proto
    protocol_version: 2.7.0
    topic: zipkin
    brokers:
      - 127.0.0.1:9092
  otlp/jaeger:
    endpoint: 127.0.0.1:4317
    tls:
      insecure: true
  otlp/zipkin:
    endpoint: 127.0.0.1:9411
    tls:
      insecure: true    
  otlphttp/jaeger:
    endpoint: http://127.0.0.1:14268/api/traces 
service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [zipkin]

    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [logging,prometheus]

  extensions: [health_check, pprof, zpages]

好了 collector就这样配置完了,启动collector就可以了

zipkin_169">zipkin
docker  run \
--name zipkin-server -d \
-p 9411:9411 \
-e JAVA_OPTS="-Xmx1G -Xms1G" \
-e STORAGE_THROTTLE_MAX_QUEUE_SIZE=8000 \
-e STORAGE_TYPE=elasticsearch \
-e ES_HOSTS=127.0.0.1:9200 \
openzipkin/zipkin-slim

这里配置es作为trace的存储。
好,现在我们就可以通过 http://localhost:9411/zipkin/ 来访问trace数据了。

效果图

我这里还没有数据

当执行开始写的代码时候,数据就会传输给collector,然后collector会把trace数据转到zipkinzipkin把数据保存到es中,最后我们可以通过搜索功能搜索trace数据了。

显然这个框架需要优化的点还有很多,尤其是当并发量高的时候 zipkin经常挂。

优化待下一篇文章讲


http://www.niftyadmin.cn/n/5475604.html

相关文章

C++ 构建太慢的 5 个信号

从我的个人经验来看,我们每天庸庸碌碌,忙于处理各种各样的任务,但却并一定不了解这些处理方式背后的真实原因。与之相应地,我们自然也都不清楚每个决定背后的原因。在工作和个人生活上,大都如此。大家遵循着一种特定的…

蛋白质合成与计算机汇编的相似点

信息传递:在蛋白质合成中,DNA中的基因编码着蛋白质的序列信息,这些信息通过RNA转录成mRNA,然后翻译成氨基酸序列,最终形成蛋白质。类似地,在计算机编码中,源代码编写着程序的逻辑和功能&#xf…

ChatGPT基础(一) GPT的前世今生

文章目录 GPT模型简史GPT系列模型ChatGPT的应用 最近ChatGPT3.5可以免注册使用了,出来刨一波坟 说一说ChatGPT的来源和应用。 GPT模型简史 Generative pre-trained transformers(GPT)生成式预训练转换模型是大语言模型的一种(Large Language Model–>LLM)。它是…

【Spring Security】3.底层原理

文章目录 一、引入二、Filter1)DelegatingFilterProxy2)FilterChainProxy3)SecurityFilterChain4)Multiple SecurityFilterChain 一、引入 官方文档:Spring Security的底层原理 Architecture:整个SpringS…

C++【组合模式】

简单介绍 组合模式是一种结构型设计模式, 只有在可以将对象拆分为【树状结构】的情况下使用。并且像使用独立对象一样使用它们。 常用于表示与图形打交道的用户界面组件或代码的层次结构。 基础理解 Q:为什么要用组合模式 ? A:在…

智能语音机器人ai外呼机器人的运行原理和优势

在销售行业中,销售人员如果想尽可能的多获得客户,就需要不断的联系客户,慢慢孵化,但是效率十分低,尤其是在大量拨打电话的这一过程中,很多都是无效外呼,但是ai外呼机器人的出现完全改变了销售人…

一场关于Linux关键技术的硬核讨论,欢迎围观丨deepin Meetup西安站回顾

2024 年 3 月 30 日,「deepin Meetup 西安站」顺利举办!此次活动,我们聚集了业界专家与优秀开发者,吸引了来自西安及周边地区 60 余名用户的积极参与,从理论方法到应用实践,分享 Linux 最新技术成果及实战…

1.网络编程-网络协议

目录 网络编程是什么 网络编程三要素 OSI七层网络模型 TCP/IP五层模型 SSL/TLS 是哪层协议 网络编程是什么 网络编程是计算机科学中的一个重要领域,它涉及到编写能够在网络环境中进行通信的程序。网络编程的核心目标是使不同的设备能够通过网络交换信息&#…