Skip to content

Commit 19f0fd4

Browse files
authored
feat(sidekick/rust): integrate explicit resource name extraction (#4496)
Integrate `google.api.resource_reference` explicit extraction into tracing telemetry. When explicit resource annotations are available (`HasResourceNameFields`), the templates now extract the value directly from the generated request object and pass it via `options::internal::set_resource_name`, without having to fall back on the heuristic. Depends on: googleapis/google-cloud-rust#3771 googleapis/google-cloud-rust#4035 Fixes #4440
1 parent 6e85547 commit 19f0fd4

File tree

6 files changed

+45
-5
lines changed

6 files changed

+45
-5
lines changed

internal/sidekick/api/resource_identification.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ func identifyTargetResourceForBinding(method *Method, binding *PathBinding, voca
5252
return nil
5353
}
5454

55-
// Priority 1: Explicit Identification
56-
// Matches google.api.resource_reference annotations.
5755
target, err := identifyExplicitTarget(method, binding)
5856
if err != nil {
5957
return err
@@ -63,10 +61,9 @@ func identifyTargetResourceForBinding(method *Method, binding *PathBinding, voca
6361
return nil
6462
}
6563

66-
// Priority 2: Heuristic Identification
6764
// Uses path segment patterns to guess the resource.
6865
if enableHeuristics {
69-
target, err = identifyHeuristicTarget(method, binding, vocabulary)
66+
target, err := identifyHeuristicTarget(method, binding, vocabulary)
7067
if err != nil {
7168
return err
7269
}

internal/sidekick/api/resource_identification_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ func TestIdentifyTargetResources_Heuristic(t *testing.T) {
384384
PathInfo: &PathInfo{
385385
Bindings: []*PathBinding{{PathTemplate: p}},
386386
},
387+
Service: model.Services[0],
387388
}
388389
model.Services[0].Methods = append(model.Services[0].Methods, m)
389390
}

internal/sidekick/rust/annotate.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ type pathBindingAnnotation struct {
419419
HasResourceNameGeneration bool
420420
ResourceNameTemplate string
421421
ResourceNameArgs []string
422+
HasResourceNameArgs bool
422423
}
423424

424425
// QueryParamsCanFail returns true if we serialize certain query parameters, which can fail. The code we generate
@@ -1635,9 +1636,11 @@ func (c *codec) annotateResourceNameGeneration(m *api.Method, annotation *method
16351636
}
16361637
bAnn.ResourceNameTemplate = tmpl
16371638
bAnn.ResourceNameArgs = formatResourceNameArgs(b.TargetResource.FieldPaths)
1639+
bAnn.HasResourceNameArgs = len(bAnn.ResourceNameArgs) > 0
16381640
} else {
16391641
bAnn.ResourceNameTemplate = ""
16401642
bAnn.ResourceNameArgs = nil
1643+
bAnn.HasResourceNameArgs = false
16411644
}
16421645
}
16431646
}

internal/sidekick/rust/annotate_method_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,16 +387,19 @@ func TestAnnotateMethodResourceNameTemplate(t *testing.T) {
387387
HasResourceNameGeneration: true,
388388
ResourceNameTemplate: "//Test.googleapis.com/projects/{}/locations/{}/clusters/{}",
389389
ResourceNameArgs: []string{"var_name"},
390+
HasResourceNameArgs: true,
390391
},
391392
{
392393
HasResourceNameGeneration: true,
393394
ResourceNameTemplate: "//Test.googleapis.com/projects/{}/locations/{}/clusters/{}",
394395
ResourceNameArgs: []string{"var_project", "var_location", "var_cluster"},
396+
HasResourceNameArgs: true,
395397
},
396398
{
397399
HasResourceNameGeneration: true,
398400
ResourceNameTemplate: "",
399401
ResourceNameArgs: nil,
402+
HasResourceNameArgs: false,
400403
},
401404
},
402405
},

internal/sidekick/rust/templates/crate/src/transport.rs.mustache

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,10 @@ impl super::stub::{{Codec.Name}} for {{Codec.Name}} {
122122
{{^Codec.HasVariablePath}}
123123
let path = "{{Codec.PathFmt}}".to_string();
124124
{{/Codec.HasVariablePath}}
125+
125126
{{#Codec.DetailedTracingAttributes}}
126127
let path_template = "{{Codec.PathTemplate}}";
127128
{{/Codec.DetailedTracingAttributes}}
128-
129129
{{#Codec.HasResourceNameGeneration}}
130130
let resource_name = format!(
131131
"{{{Codec.ResourceNameTemplate}}}",
@@ -183,6 +183,21 @@ impl super::stub::{{Codec.Name}} for {{Codec.Name}} {
183183
#[cfg(google_cloud_unstable_tracing)]
184184
let options = {
185185
use google_cloud_gax::options::internal::{RequestOptionsExt, PathTemplate};
186+
{{#Codec.HasResourceNameFields}}
187+
let options = {
188+
let resource_name = Option::<&String>::None
189+
{{#Codec.ResourceNameFields}}
190+
.or({{{Accessor}}})
191+
{{/Codec.ResourceNameFields}};
192+
if let Some(rn) = resource_name {
193+
use google_cloud_gax::options::internal::ResourceName;
194+
let full_resource_name = format!("//{{DefaultHost}}/{}", rn);
195+
options.insert_extension(ResourceName(full_resource_name))
196+
} else {
197+
options
198+
}
199+
};
200+
{{/Codec.HasResourceNameFields}}
186201
options.insert_extension(PathTemplate(_path_template))
187202
};
188203
{{/Codec.DetailedTracingAttributes}}

internal/sidekick/rust/templates/grpc-client/transport.rs.mustache

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,27 @@ impl super::stub::{{Codec.Name}} for {{Codec.Name}} {
122122
{{PathInfo.Codec.IsIdempotent}},
123123
{{/HasAutoPopulatedFields}}
124124
);
125+
{{#Codec.DetailedTracingAttributes}}
126+
#[cfg(google_cloud_unstable_tracing)]
127+
let options = {
128+
{{#Codec.HasResourceNameFields}}
129+
let resource_name = Option::<&String>::None
130+
{{#Codec.ResourceNameFields}}
131+
.or({{{Accessor}}})
132+
{{/Codec.ResourceNameFields}};
133+
if let Some(rn) = resource_name {
134+
use google_cloud_gax::options::internal::ResourceName;
135+
let full_resource_name = format!("//{{DefaultHost}}/{}", rn);
136+
options.insert_extension(ResourceName(full_resource_name))
137+
} else {
138+
options
139+
}
140+
{{/Codec.HasResourceNameFields}}
141+
{{^Codec.HasResourceNameFields}}
142+
options
143+
{{/Codec.HasResourceNameFields}}
144+
};
145+
{{/Codec.DetailedTracingAttributes}}
125146
let extensions = {
126147
let mut e = Extensions::new();
127148
e.insert(GrpcMethod::new("{{SourceService.Package}}.{{SourceService.Name}}", "{{Name}}"));

0 commit comments

Comments
 (0)