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

news2024/11/28 2:45:22

今日已办

根据导师代码评审的 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 main

import (
	"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 输出 span
	provider := sdktrace.NewTracerProvider(sdktrace.WithBatcher(exporter))

	// 设置全局 trace provider
	otel.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)

	// 创建一个新的 span
	tracer := otel.Tracer("example")
	ctx, span := tracer.Start(context.Background(), "my_span")
	defer span.End()

	// 在 span 上设置其他 attribute
	span.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 main

import (
	"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 输出 span
	provider := sdktrace.NewTracerProvider(sdktrace.WithBatcher(exporter))

	// 设置全局 trace provider
	otel.SetTracerProvider(provider)

	// 创建一个 span processor,将指定的 attribute 添加到指定 trace 下的所有 span 中
	processor := sdktrace.NewSimpleSpanProcessor(func(span sdktrace.ReadOnlySpan) {
		// 判断当前 span 是否属于指定的 trace
		if 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 和 span
	tracer := otel.Tracer("example")
	ctx, span := tracer.Start(context.Background(), "my_span")
	defer span.End()

	// 在 span 上设置其他 attribute
	span.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 main

import (
	"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 输出 span
	provider := sdktrace.NewTracerProvider(sdktrace.WithBatcher(exporter))

	// 设置全局 trace provider
	otel.SetTracerProvider(provider)

	// 创建一个新的 span
	tracer := 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.coloradmin.cn/o/1028598.html

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

相关文章

Softing物联网(IoT)方案之OT/IT数据集成

一 利用数据提高效率和绩效 多年以来数据集成和工业物联网一直在推动着市场的发展,目前我们已经能够集成并成功使用先进的技术、大量的传感器和复杂的数据格式等。而在工业物联网或工业4.0中,还有运营技术(OT)和信息技术&#xf…

会C++还需要再去学Python吗?

提到的C、数据结构与算法、操作系统、计算机网络和数据库技术等确实是计算机科学中非常重要的基础知识领域,对于软件开发和计算机工程师来说,它们是必备的核心知识。掌握这些知识对于开发高性能、可靠和安全的应用程序非常重要。Python作为一种脚本语言&…

Spring Authorization Server入门 (十八) Vue项目使用PKCE模式对接认证服务

Vue单页面项目使用授权码模式对接流程说明 以下流程摘抄自官网 在本例中为授权代码流程。 授权码流程的步骤如下: 客户端通过重定向到授权端点来发起 OAuth2 请求。 对于公共客户端,此步骤包括生成code_verifier 并计算code_challenge,然后…

实验5 跨交换机实现VLAN

交换机端口隔离(access模式) 实验目的实验拓扑实验步骤(1)在未划分vlan前,配置pc1、pc2、pc3、pc4的地址,如图所示(2)测试两台pc机的连通性(3)在S1中创建vlan…

必看!S3File Sink Connector 使用文档

S3File 是一个用于管理 Amazon S3(Simple Storage Service)的 Python 模块。当前,Apache SeaTunnel 已经支持 S3File Sink Connector,为了更好地使用这个 Connector,有必要看一下这篇使用文档指南。 描述 将数据输出…

springboot druid多数据源配置,及druid监控

基础配置&#xff1a; springboot2.x版本 jdk1.8 依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version> </dependency> &…

分享一个基于微信小程序的高校图书馆预约座位小程序 图书馆占座小程序源码 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

Linux高性能服务器编程 学习笔记 第五章 Linux网络编程基础API

我们将从以下3方面讨论Linux网络API&#xff1a; 1.socket地址API。socket最开始的含义是一个IP地址和端口对&#xff08;ip&#xff0c;port&#xff09;&#xff0c;它唯一表示了使用TCP通信的一端&#xff0c;本书称其为socket地址。 2.socket基础API。socket的主要API都定…

打开泰坦陨落提示msvcp120.dll丢失怎么办?三个解决方法快速解决

首先&#xff0c;我们来了解一下msvcr120.dll是什么文件。msvcr120.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2013 Redistributable中的一个组件。这个文件对于一些软件的运行是非常重要的&#xff0c;如果缺失或损坏&#xff0c;就会导致软件无法正常运行。…

从淘宝数据分析产品需求(商品销量总销量精准月销)

淘宝数据分析总体来说可以分为商品分析、客户分析、地区分析、时间分析四大维度(参考数据雷达的分析思路)。在这里我重点说商品分析。 在淘宝上开店的竞争还是非常激烈的&#xff0c;随便拿出一个单品就有很多竞品存在&#xff0c;所以做起来还是很难的&#xff0c;而想要在众…

Git:利用Git模拟企业级项目管理

文章目录 基础知识Git分支设计规范master分支release分支develop分支feature分支hotfix分支 模拟进行企业级项目管理 本篇主要总结的是企业级开发模型以及利用Git模拟企业级别的项目管理方式 基础知识 前面已经进行了全部的关于Git的各项操作&#xff0c;那么Git是作用于企业…

<Altium Designer>向PCB导入网表(.NET)

目录 01 AD PCB导入网表(.NET) 添加.NET文件到AD工程 通过show Differences操作导入器件 02 文章总结 大家好&#xff0c;这里是程序员杰克。一名平平无奇的嵌入式软件工程师。 硬件工程师使用的是Cadence的OrCAD画原理图&#xff0c;输出的是.NET网表&#xff0c;而杰克使…

自动化测试---选择框

radio框选择选项&#xff0c;直接用WebElement的click方法&#xff0c;模拟用户点击就可以了。 比如, 我们要在下面的html中&#xff1a; 1.先打印当前选中的老师名字 2.再选择 小雷老师 <div id"s_radio"><input type"radio" name"teach…

在静态方法中访问@Value注入的静态变量!!

一、 静态变量 static修饰的成员变量&#xff0c;称为静态成员变量&#xff0c;静态成员变量最大的特性&#xff1a;不属于某个具体的对象&#xff0c;是所有对象所共享的 简单来说&#xff1a;在某些类的对象中存在一些相同的成员变量&#xff0c;那么这种成员变量就可以设置…

解决VSCode下载速度很慢

这是VSCode的官网&#xff1a; Visual Studio Code - Code Editing. Redefined 按照官网的下载链接&#xff0c;速度实在是感人&#xff01; 解决办法也很简单&#xff0c;把链接换为CDN加速的链接 把下载链接中的az764295.vo.msecnd.net 替换为&#x1f449; vscode.cdn.azu…

MySQL数据库入门到精通1--基础篇(MySQL概述,SQL)

1. MySQL概述 1.1 数据库相关概念 目前主流的关系型数据库管理系统&#xff1a; Oracle&#xff1a;大型的收费数据库&#xff0c;Oracle公司产品&#xff0c;价格昂贵。 MySQL&#xff1a;开源免费的中小型数据库&#xff0c;后来Sun公司收购了MySQL&#xff0c;而Oracle又收…

压电换能器的工作原理和应用(功率放大器)

在日常生活中&#xff0c;可能会遇到很难测量的物理量&#xff0c;例如施加在金属上的机械应力、温度、压力水平等……对于所有这些应用&#xff0c;需要一种能够以我们熟悉的单位和校准来测量这些未知量的设备&#xff0c;而比较常用的设备是换能器。 换能器是一种电气设备&am…

华为OD机试 - 计算面积 - 逻辑分析(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

491. 递增子序列

题目链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 思路&#xff1a; 注意的点&#xff1a;1.是在原有的序列里找递增的子序列 示例 2&#xff1a; 输入&#xff1a;nums [4,4,3,2,1] 输出&#xff1a;[[4,4]] 记一…

业务上云的容器排障与思考

1 前言 此前我们部门已经完成了业务上云的目标&#xff0c;而随着业务请求量的激增&#xff0c;上云应用系统也面临着一些复杂的故障和挑战。 下文我就结合最近的容器排障工作&#xff0c;跟大家一起探讨如何优化系统的性能、扩展性和容错能力&#xff0c;为读者提供参考和借鉴…