函数中传递span的context

本文介绍了如何在Go程序中使用OpenTelemetry和Jaeger进行分布式追踪,包括创建TracerProvider、设置资源属性、创建Span以及记录日志和事件。
部署运行你感兴趣的模型镜像
package main

import (
	"context"
	"encoding/json"
	"fmt"
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/attribute"
	"go.opentelemetry.io/otel/exporters/jaeger"
	"go.opentelemetry.io/otel/sdk/resource"
	"go.opentelemetry.io/otel/sdk/trace"
	semconv "go.opentelemetry.io/otel/semconv/v1.12.0"
	"sync"
	"time"
)

const (
	TRACE_NAME = "mxshop-otel"
)

func funcA(ctx context.Context, wg *sync.WaitGroup) {
	defer wg.Done()
	tr := otel.Tracer(TRACE_NAME)
	_, span := tr.Start(ctx, "func-a")
	span.SetAttributes(attribute.String("name", "funA"))

	type _LogStruct struct {
		CurrentTime time.Time `json:"current_time"`
		PassWho     string    `json:"pass_who"`
		Name        string    `json:"name"`
	}
	logTest := _LogStruct{
		CurrentTime: time.Now(),
		PassWho:     "bobby",
		Name:        "func-a",
	}
	b, _ := json.Marshal(logTest)
	span.SetAttributes(attribute.Key("这是测试日志的key").String(string(b)))
	time.Sleep(time.Second)
	span.End()
}

func funcB(ctx context.Context, wg *sync.WaitGroup) {
	defer wg.Done()
	tr := otel.Tracer("traceName")
	_, span := tr.Start(ctx, "func-b")
	fmt.Println("trace:", span.SpanContext().TraceID(), span.SpanContext().SpanID())
	time.Sleep(time.Second)
	span.End()
}

func main() {
	url := "http://192.168.66.130:14268/api/traces"
	jexp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))
	if err != nil {
		panic(err)
	}
	tp := trace.NewTracerProvider(
		trace.WithBatcher(jexp),
		trace.WithResource(
			resource.NewWithAttributes(
				semconv.SchemaURL,
				semconv.ServiceNameKey.String("mxshop-user"),
				attribute.String("environment", "dev"),
				attribute.Int("ID", 1),
			),
		),
	)
	otel.SetTracerProvider(tp)

	ctx, cancel := context.WithCancel(context.Background())
	defer func(ctx context.Context) {
		ctx, cancel = context.WithTimeout(ctx, time.Second*5)
		defer cancel()
		if err := tp.Shutdown(ctx); err != nil {
			panic(err)
		}
	}(ctx)

	tr := otel.Tracer(TRACE_NAME)
	spanCtx, span := tr.Start(ctx, "func-main")

	wg := &sync.WaitGroup{}
	wg.Add(2)
	go funcA(spanCtx, wg)
	go funcB(spanCtx, wg)

	span.AddEvent("this is an event")

	time.Sleep(time.Second)
	wg.Wait()
	span.End()
}


您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

在C语言中,传感器回调函数通常用于接收传感器数据并进行处理。传感器回调函数是一个普通的函数,可以通过函数指针传递给其他函数,在需要的时候被调用。传感器回调函数的定义和使用方法如下所示: 首先,在定义传感器类时,需要定义一个静态成员函数作为回调函数。回调函数的定义方式可以参考以下示例代码: ```c class Sensor{ public: Sensor(){} ~Sensor(){} // 定义回调函数onHeight static void onHeight(double height, void* context) { cout << "current height is " << height << endl; } // 定义注册回调函数 void registCallback() { registHeightCallback(onHeight, this); } }; ``` 然后,在需要使用传感器回调函数的地方,可以通过函数指针的方式将回调函数传递给其他函数,以便在合适的时机调用该回调函数。具体的使用方式可以参考以下示例代码: ```c // 主函数 int main() { Sensor sens; sens.registCallback(); // 其他函数中调用回调函数的地方 // ... return 0; } ``` 需要注意的是,传感器回调函数通常是静态成员函数,因为静态成员函数可以直接访问非静态成员函数。这样可以确保回调函数能够正确地操作传感器类的实例。 总之,在C语言中,传感器回调函数是用于接收传感器数据并进行处理的普通函数。通过函数指针的方式将回调函数传递给其他函数,在适当的时机调用该回调函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值