我们想为部署在 Cloud Run 上的服务中使用的方法添加跟踪。
跟踪已提供 Cloud Run 请求:
假设我们有以下 gRPC 方法:
func (s *myServiceService) SyncTable(ctx context.Context, req *pb.SyncTableRequest) (*longrunning.Operation, error) {
//.... some stuff here...
// making a call to the internal method, which has a tracing span
err := dropRequestOnStorage(ctx, ...)
if err != nil {
return nil, err
}
return op, nil
}
这是一个内部方法的示例,我们向其中添加了 Trace span,并由主 gRPC 方法调用:
// dropRequestOnStorage loads the requests on the relevant bucket.
func dropRequestOnStorage(ctx context.Context, filename string, operationID string, req *pb.ExtractDataRequest) error {
// add tracing to this method.
ctx, span := otel.Tracer("").Start(ctx, "dropRequestOnStorage")
defer span.End()
// load json object to storage
reqByte, err := protojson.Marshal(req)
if err != nil {
fmt.Println(err)
}
wc := storageClient.Bucket("my-bucket-with-cool-stuff").Object(filename).NewWriter(ctx)
wc.ContentType = "application/json"
_, err = wc.Write(reqByte)
if err != nil {
fmt.Println(err)
}
wc.Close()
fmt.Println(filename)
return nil
}
查看 Google Cloud Run 的跟踪,我看到了上述方法的跟踪:
尽管context
从主 gRPC 传递到内部方法,但 Tracing 并没有被拉到底层内部。内部方法生成的跟踪不会“接收”主 gRPC 跟踪作为父级。
这是因为 Cloud Run 提供的默认跟踪是由 Cloud Run 内部完成的吗?因此在 gRPC 方法的上下文中不可用?