腾讯mini项目-【指标监控服务重构】2023-07-29

今日已办

根据导师代码评审的 comment 改进

  1. 修改命名 otelclient.otelExporterOtlpEndpoint to otelclient.endpoint
  2. 禁用 TLS 加密,移除 otelclient.insecureMode
  3. 避免命名缩写影响代码的阅读理解
  4. 把两个函数(createTraceExpcreateTraceProvider)合并
  5. 移除没有太大意义的封装handleErr
  6. 将 otel 初始化逻辑放到 consume 子命令中进行
  7. 还原 README.md 的内容
  8. 经过组员 郑兆隆 对 Log 逻辑的修改,Log 可以在 docker容器内部 和 SigNoz Web 都生效

调研

整个链路都要带上backend_id,调研是否有让trace带attribute的方法,而不是每个span都手动加上

Trace 下的所有 span

在使用 OpenTelemetry SDK 进行分布式追踪时,可以通过在 span 上设置属性(attribute)来添加自定义信息,以便更好地理解和调试应用程序的行为。要让一个 trace 下的所有 span 都带上 attribute,可以使用 OpenTelemetry SDK 提供的 Span Processor。

下面是一个示例代码,展示了如何使用 Span Processor 将指定的 attribute 添加到 trace 下的所有 span 中:

package mainimport ("context""go.opentelemetry.io/otel""go.opentelemetry.io/otel/attribute""go.opentelemetry.io/otel/exporters/stdout"sdktrace "go.opentelemetry.io/otel/sdk/trace"
)func main() {// 创建一个 stdout exporter,将 span 输出到控制台exporter, err := stdout.NewExporter(stdout.WithPrettyPrint())if err != nil {panic(err)}// 创建一个 trace provider,使用 stdout exporter 输出 spanprovider := sdktrace.NewTracerProvider(sdktrace.WithBatcher(exporter))// 设置全局 trace providerotel.SetTracerProvider(provider)// 创建一个 span processor,将指定的 attribute 添加到所有 span 中processor := sdktrace.NewSimpleSpanProcessor(func(span sdktrace.ReadOnlySpan) {span.SetAttributes(attribute.String("my_attribute", "my_value"))})// 将 span processor 添加到 trace provider 中provider.RegisterSpanProcessor(processor)// 创建一个新的 spantracer := otel.Tracer("example")ctx, span := tracer.Start(context.Background(), "my_span")defer span.End()// 在 span 上设置其他 attributespan.SetAttributes(attribute.String("another_attribute", "another_value"))// 执行其他操作...
}

在上面的示例代码中,使用 sdktrace.NewSimpleSpanProcessor 创建了一个简单的 Span Processor,该处理器会调用指定的函数,并将当前 span 作为参数传递给该函数。在该函数中,可以使用 span.SetAttributes 方法添加需要的 attribute。然后,将该 Span Processor 添加到 trace provider 中,即可让所有的 span 都带上该 attribute。

需要注意的是,Span Processor 对所有 span 生效,因此要谨慎使用,以避免影响性能和数据质量。如果只想让某些 span 带上 attribute,可以在创建 span 时手动设置。

特点 Trace 下的所有 span

如果只想在一个特定的 trace 的所有 span 中加上某个 attribute,可以使用 OpenTelemetry SDK 提供的 Span Processor,并且在创建 Span Processor 时指定一个 filter 函数,该函数可以根据 span 的 trace ID 或其他属性来判断是否需要对该 span 添加指定的 attribute。

下面是一个示例代码,展示了如何使用 Span Processor 和 filter 函数来只在特定 trace 的所有 span 中添加指定的 attribute:

package mainimport ("context""go.opentelemetry.io/otel""go.opentelemetry.io/otel/attribute""go.opentelemetry.io/otel/exporters/stdout"sdktrace "go.opentelemetry.io/otel/sdk/trace"
)func main() {// 创建一个 stdout exporter,将 span 输出到控制台exporter, err := stdout.NewExporter(stdout.WithPrettyPrint())if err != nil {panic(err)}// 创建一个 trace provider,使用 stdout exporter 输出 spanprovider := sdktrace.NewTracerProvider(sdktrace.WithBatcher(exporter))// 设置全局 trace providerotel.SetTracerProvider(provider)// 创建一个 span processor,将指定的 attribute 添加到指定 trace 下的所有 span 中processor := sdktrace.NewSimpleSpanProcessor(func(span sdktrace.ReadOnlySpan) {// 判断当前 span 是否属于指定的 traceif span.SpanContext().TraceID().String() == "my_trace_id" {// 如果是,将指定的 attribute 添加到该 span 上span.SetAttributes(attribute.String("my_attribute", "my_value"))}})// 将 span processor 添加到 trace provider 中provider.RegisterSpanProcessor(processor)// 创建一个新的 trace 和 spantracer := otel.Tracer("example")ctx, span := tracer.Start(context.Background(), "my_span")defer span.End()// 在 span 上设置其他 attributespan.SetAttributes(attribute.String("another_attribute", "another_value"))// 执行其他操作...
}

在上面的示例代码中,使用 sdktrace.NewSimpleSpanProcessor 创建了一个简单的 Span Processor,该处理器会调用指定的函数,并将当前 span 作为参数传递给该函数。在该函数中,可以使用 span.SpanContext().TraceID().String() 方法获取当前 span 的 trace ID,并根据需要判断是否需要对该 span 添加指定的 attribute。然后,将该 Span Processor 添加到 trace provider 中,即可让指定 trace 的所有 span 都带上该 attribute。

子 Span 继承父 Span 的属性

当一个 span 手动添加了属性后,它的子 span 并不会自动继承这些属性。但是,可以通过 OpenTelemetry SDK 提供的 Tracer.Start 方法的第二个参数来指定一个 trace.WithAttributes 选项,该选项可以让子 span 继承父 span 的属性。

下面是一个示例代码,展示了如何让子 span 集成父 span 的属性:

package mainimport ("context""go.opentelemetry.io/otel""go.opentelemetry.io/otel/attribute""go.opentelemetry.io/otel/exporters/stdout"sdktrace "go.opentelemetry.io/otel/sdk/trace"
)func main() {// 创建一个 stdout exporter,将 span 输出到控制台exporter, err := stdout.NewExporter(stdout.WithPrettyPrint())if err != nil {panic(err)}// 创建一个 trace provider,使用 stdout exporter 输出 spanprovider := sdktrace.NewTracerProvider(sdktrace.WithBatcher(exporter))// 设置全局 trace providerotel.SetTracerProvider(provider)// 创建一个新的 spantracer := otel.Tracer("example")ctx, parentSpan := tracer.Start(context.Background(), "parent_span",otel.WithAttributes(attribute.String("parent_attribute", "parent_value")),)defer parentSpan.End()// 创建一个子 span,并让其继承父 span 的属性ctx, childSpan := tracer.Start(ctx, "child_span",otel.WithAttributes(parentSpan.Attributes()...),)defer childSpan.End()// 在子 span 上设置其他属性childSpan.SetAttributes(attribute.String("child_attribute", "child_value"))// 执行其他操作...
}

在上面的示例代码中,首先在父 span 上设置了一个属性,然后在创建子 span 时,使用 trace.WithAttributes(span.Attributes()...) 选项将父 span 的属性传递给子 span,这样子 span 就可以继承父 span 的属性了。在子 span 上也可以继续添加其他属性。

如果当前的代码块是在一个 span 中执行的,那么可以使用 trace.SpanFromContext(ctx) 获取当前 span,然后将其作为父 span。

结合项目

  1. 由于 backend_id 是有 venus 产生,可以由 venus 服务在 trace 中设置属性

  2. 目前 profile 消费的4个阶段,只有在第一个阶段UnpackKafkaMessage,才能解析到 backend_id,而初始化Tracer的代码位于全局,且经组员反馈在 SigNoz Web 的 Trace 无法观测到该属性

    consumerTracer = otel.Tracer("profile-consumer",trace.WithInstrumentationAttributes(attribute.String("profile.work", "consumer")))
    

    trace.WithInstrumentationAttributesspan.SetAttributes 都是用于添加属性(attribute)到 span 中的方法,但它们的作用和使用方式略有不同。

    trace.WithInstrumentationAttributes 是用于在创建 Tracer 时添加一些与仪表化相关的属性,这些属性会自动添加到由该 Tracer 创建的所有 span 中。它通常用于标识当前 Tracer 所使用的仪表化代码库、版本号、语言等信息。

    span.SetAttributes 则是用于在创建 span 后手动添加属性,这些属性通常用于标识该 span 所对应的操作、请求、响应等信息。它可以在任何时候添加,可以添加多个属性,也可以添加自定义的属性。

总上考虑,暂时使用 在第一个阶段 UnpackKafkaMessage 的 Span 手动添加属性后,它的子 Span 去继承 父 Span 的属性

问题:

Span 没有 Attributes(),只有 ReadOnlySpan有 Attributes()

image-20230729185333347

明日待办

  • 组会讨论
    • 移除关于 Prometheus 的相关配置
    • 。。。

导师建议:让服务自己监控自己CPU、内存等指标然后上报是否合适。
我建议调研一下:

  1. 参考uptrace看看他们怎么做服务cpu、内存监控的
  2. 调研下独立服务监控指标,比如hostmetricsreceiver

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/80614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode 远程开发,再也不用带电脑回家了~

VS Code几乎是所有的程序员必备的工具之一,据说全球一般的开发者都使用过VS Code这款工具。 今天为大家介绍一下 VS Code 实现远程办公的方法。 1、概 述 通常,我们都是每天到工作的办公室进行办公,但是,如果下班回家&…

保密技术基础--北交大实验靶场2

由于第2、第3章的内部章节较少,所以我将其的体验感受一起写在这篇文章当中。 2.1 保密专用网络知识学习 这一小节也是一节的理论知识学习,学习过后有一个小测试,和第一章一样,学的知识和给的题目可以说是毫无关系。这一节的知识更…

shell 流程控制

流程控制 if条件判断 可以使用if来实现多路跳转,条件通常使用test命令 #if语句的语法if condition1then command1elif condition2 then command2else commandNfi 如果then需要和if放在同一行的话,使用;分隔 fi用来结束if语句,相当于…

Nginx部署前后端分离项目(Linux)

Nginx代理前端页面、后端接口 一、前端打包二、后端打包三、Linux部署Nginx启动、暂停、重启服务器部署文件地址: 一、前端打包 npm run build二、后端打包 通过Maven 使用package打包 三、Linux部署 安装Nginx 安装环境 yum -y install gcc pcre pcre-devel z…

【C语言】用冒泡排序实现my_qsort

大家好,我是苏貝,本篇博客带大家了解如何用冒泡排序实现my_qsort,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一. 前言二. 冒泡排序三. 4个参数3.1 第一个参数void* base3.2 第二个参数…

AOSP源码中Android.mk文件中的反斜杠符号(\)的作用和使用

简介 在AOSP(Android Open Source Project)源码中的Android.mk文件中,反斜杠符号(\)的主要作用是将一行代码拆分成多行,以提高可读性并帮助组织较长的代码块。这对于定义复杂的构建规则和变量时特别有用。…

前后端分离--Vue的入门基础版

目录 一.前后端分离 二.Vue的简介 三.Vue的入门案例 四.Vue的生命周期 一.前后端分离 前后端分离是一种软件架构模式,将应用程序的前端(用户界面)和后端(数据处理和业务逻辑)独立开发、独立部署。在前后端分离的架…

【计算机网络】75 张图详解:网络设备、网络地址规划、静态路由(万字长文)

75 张图详解:网络设备、网络地址规划、静态路由 1.网络设备1.1 交换机1.2 路由器 2.网络地址规划2.1 IP 地址2.2 分类地址2.3 子网掩码2.4 无类地址2.5 子网划分2.5.1 示例一2.5.2 示例二 2.6 超网合并 3.静态路由3.1 路由表3.2 直连路由3.3 静态路由3.4 默认路由3.…

Ansible 自动化运维工具部署主从数据库+读写分离

文章目录 Ansible 自动化运维工具部署主从数据库读写分离一、主从复制和读写分离介绍二、准备工作(1)节点规划(2)修改主机名(3)免密(4)配置IP映射(5)安装ansi…

【案例】--EasyExcel解析文件案例

目录 一、前言二、EasyExcel解析文件2.1、EasyExcel选型2.2、如何存储excel解析的文件2.3、解析格式规则的excel文件2.4、解析未知格式规则的excel文件一、前言 最近项目中,需要对excel、csv等文件进行解析,并做相关的业务功能。在实际业务中,遇到不少难题: (1)、excel、c…

Postman应用——下载注册和登录

文章目录 下载安装注册登录注册账号登录账号 下载安装 Postman下载:https://www.postman.com/ 访问链接后,进入首页,根据自己的操作系统下载对应的版本。 找到下载到的目录直接双击.exe文件,会默认安装在C盘,安装完会…

系统架构设计师(第二版)学习笔记----信息系统基础

【原文链接】系统架构设计师(第二版)学习笔记----信息系统基础 文章目录 一、信息系统概述1.1 信息系统的5个基本功能1.2 信息系统发展阶段1.3 初始阶段的主要特点1.4 传播阶段的主要特点1.5 控制阶段的主要特点1.6 集成阶段的主要特点1.7 信息系统的种类…

【Unity3D】UI Toolkit数据动态绑定

1 前言 本文将实现 cvs 表格数据与 UI Toolkit 元素的动态绑定。 如果读者对 UI Toolkit 不是太了解,可以参考以下内容。 UI Toolkit简介UI Toolkit容器UI Toolkit元素UI Toolkit样式选择器UI Toolkit自定义元素 本文完整资源见→UI Toolkit数据动态绑定。 2 数据…

无涯教程-JavaScript - COMBINA函数

描述 COMBINA函数返回给定数量的项目的组合数量(重复)。 语法 COMBINA (number, number_chosen)争论 Argument描述Required/OptionalNumber 必须大于或等于0,并且大于或等于Number_chosen。 非整数值将被截断。 RequiredNumber_chosen 必须大于或等于0。 非整数值将被截断。…

脚本:python绘制七夕爱心

文章目录 效果脚本Reference 效果 脚本 import random from math import sin, cos, pi, log from tkinter import *CANVAS_WIDTH 640 # 画布的宽 CANVAS_HEIGHT 640 # 画布的高 CANVAS_CENTER_X CANVAS_WIDTH / 2 # 画布中心的X轴坐标 CANVAS_CENTER_Y CANVAS_HEIGHT /…

搭建Android自动化python+appium环境

一. 需要软件 JDK:JAVA安装后配置JDK环境 SDK:SDK下载后配置adb环境 Python:pyhton语言 Pycharm:python脚本编译工具 Appium-python-client:pyhton中的库 Appium客户端 二. 搭建步骤 1.配置JDK环境 ①. 下载安装java: https://www.oracle.com/java/technologies/java…

SEO优化排名的技巧与注意点(百度SEO排名的五大注意点)

关键词排名是指在搜索引擎中,用户搜索相关关键词时,网站出现的顺序。SEO优化是提高网站排名的一种方法。优化关键词排名的目的是提高网站流量和知名度。但是要注意遵循百度SEO排名的规则。 下面介绍一下百度SEO排名的五大注意点和优化关键词的六种方式。…

本地事务与分布式事务

目录 一、本地事务 1、事务的基本性质 2、事务的隔离级别 3、事务的传播行为 4、SpringBoot 事务关键点 二、分布式事务 1、为什么有分布式事务 2、CAP 定理与 BASE 理论 3、分布式事务几种方案 一、本地事务 1、事务的基本性质 数据库事务的几个特性:原…

管理类联考——数学——汇总篇——知识点突破——代数——等差数列

⛲️ 一、考点讲解 1.定义 如果在数列{ a n a_n an​}中, a n 1 − a n d a_{n1}-a_nd an1​−an​d(常数) ( n ∈ N + ) (n∈N_+) (n∈N+​&a…

欧科云链研究院:锚定金融市场,香港从STO再出发

作者|Hedy Bi 昨日,据大公报报道,太极资本宣布推出香港首个面向「专业投资者」的房地产基金证券型代币发行(STO)。集资目标为1亿元。“牌照,醉翁之意不在酒。BTC、ETH等加密资产只是第一步,而背…