Skip to main content

telemetry_rust/middleware/aws/instrumentation/fluent_builder/
s3.rs

1/// AWS S3 fluent builder instrumentation implementations
2use super::{utils::*, *};
3use crate::semconv;
4
5// Object data operations
6impl<'a> AwsBuilderInstrument<'a> for GetObjectFluentBuilder {
7    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
8        let bucket = self.get_bucket().clone().unwrap_or_default();
9        let key = self.get_key().clone().unwrap_or_default();
10        let attributes = attributes![
11            self.get_part_number()
12                .as_attribute(semconv::AWS_S3_PART_NUMBER),
13            self.get_version_id().as_attribute("aws.s3.version_id"),
14        ];
15        S3SpanBuilder::get_object(bucket, key).attributes(attributes)
16    }
17}
18impl InstrumentedFluentBuilderOutput for GetObjectOutput {
19    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
20        attributes![
21            self.content_length().as_attribute("aws.s3.content_length"),
22            self.content_type().as_attribute("aws.s3.content_type"),
23            self.e_tag().as_attribute("aws.s3.etag"),
24            self.version_id().as_attribute("aws.s3.version_id"),
25            self.last_modified()
26                .map(|lm| KeyValue::new("aws.s3.last_modified", lm.to_string())),
27            self.server_side_encryption().map(|sse| KeyValue::new(
28                "aws.s3.server_side_encryption",
29                sse.as_str().to_owned()
30            )),
31        ]
32    }
33}
34instrument_aws_operation!(aws_sdk_s3::operation::get_object);
35
36impl<'a> AwsBuilderInstrument<'a> for PutObjectFluentBuilder {
37    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
38        let bucket = self.get_bucket().clone().unwrap_or_default();
39        let key = self.get_key().clone().unwrap_or_default();
40        let attributes = attributes![
41            self.get_content_length()
42                .as_attribute("aws.s3.content_length"),
43        ];
44        S3SpanBuilder::put_object(bucket, key).attributes(attributes)
45    }
46}
47impl InstrumentedFluentBuilderOutput for PutObjectOutput {
48    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
49        attributes![
50            self.e_tag().as_attribute("aws.s3.etag"),
51            self.version_id().as_attribute("aws.s3.version_id"),
52            self.server_side_encryption().map(|sse| KeyValue::new(
53                "aws.s3.server_side_encryption",
54                sse.as_str().to_owned()
55            )),
56        ]
57    }
58}
59instrument_aws_operation!(aws_sdk_s3::operation::put_object);
60
61impl<'a> AwsBuilderInstrument<'a> for HeadObjectFluentBuilder {
62    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
63        let bucket = self.get_bucket().clone().unwrap_or_default();
64        let key = self.get_key().clone().unwrap_or_default();
65        let attributes = attributes![
66            self.get_part_number()
67                .as_attribute(semconv::AWS_S3_PART_NUMBER),
68            self.get_version_id().as_attribute("aws.s3.version_id"),
69        ];
70        S3SpanBuilder::head_object(bucket, key).attributes(attributes)
71    }
72}
73impl InstrumentedFluentBuilderOutput for HeadObjectOutput {
74    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
75        attributes![
76            self.content_length().as_attribute("aws.s3.content_length"),
77            self.content_type().as_attribute("aws.s3.content_type"),
78            self.e_tag().as_attribute("aws.s3.etag"),
79            self.version_id().as_attribute("aws.s3.version_id"),
80            self.last_modified()
81                .map(|lm| KeyValue::new("aws.s3.last_modified", lm.to_string())),
82            self.server_side_encryption().map(|sse| KeyValue::new(
83                "aws.s3.server_side_encryption",
84                sse.as_str().to_owned()
85            )),
86        ]
87    }
88}
89instrument_aws_operation!(aws_sdk_s3::operation::head_object);
90
91impl<'a> AwsBuilderInstrument<'a> for CopyObjectFluentBuilder {
92    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
93        let bucket = self.get_bucket().clone().unwrap_or_default();
94        let key = self.get_key().clone().unwrap_or_default();
95        let attributes = attributes![
96            self.get_copy_source()
97                .as_attribute(semconv::AWS_S3_COPY_SOURCE),
98        ];
99        S3SpanBuilder::copy_object(bucket, key).attributes(attributes)
100    }
101}
102impl InstrumentedFluentBuilderOutput for CopyObjectOutput {
103    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
104        attributes![
105            self.copy_object_result()
106                .and_then(|r| r.e_tag())
107                .as_attribute("aws.s3.etag"),
108            self.version_id().as_attribute("aws.s3.version_id"),
109            self.server_side_encryption().map(|sse| KeyValue::new(
110                "aws.s3.server_side_encryption",
111                sse.as_str().to_owned()
112            )),
113        ]
114    }
115}
116instrument_aws_operation!(aws_sdk_s3::operation::copy_object);
117
118impl<'a> AwsBuilderInstrument<'a> for DeleteObjectFluentBuilder {
119    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
120        let bucket = self.get_bucket().clone().unwrap_or_default();
121        let key = self.get_key().clone().unwrap_or_default();
122        let attributes =
123            attributes![self.get_version_id().as_attribute("aws.s3.version_id"),];
124        S3SpanBuilder::delete_object(bucket, key).attributes(attributes)
125    }
126}
127impl InstrumentedFluentBuilderOutput for DeleteObjectOutput {
128    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
129        attributes![
130            self.delete_marker().as_attribute(semconv::AWS_S3_DELETE),
131            self.version_id().as_attribute("aws.s3.version_id"),
132        ]
133    }
134}
135instrument_aws_operation!(aws_sdk_s3::operation::delete_object);
136
137impl<'a> AwsBuilderInstrument<'a> for DeleteObjectsFluentBuilder {
138    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
139        let bucket = self.get_bucket().clone().unwrap_or_default();
140        let attributes =
141            attributes![self.get_delete().as_ref().map(|del| KeyValue::new(
142                "aws.s3.delete_objects.request_count",
143                del.objects().len() as i64
144            )),];
145        S3SpanBuilder::delete_objects(bucket).attributes(attributes)
146    }
147}
148impl InstrumentedFluentBuilderOutput for DeleteObjectsOutput {
149    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
150        attributes![
151            self.deleted()
152                .len()
153                .as_attribute("aws.s3.delete_objects.deleted_count"),
154            self.errors()
155                .len()
156                .as_attribute("aws.s3.delete_objects.error_count"),
157        ]
158    }
159}
160instrument_aws_operation!(aws_sdk_s3::operation::delete_objects);
161
162impl<'a> AwsBuilderInstrument<'a> for RenameObjectFluentBuilder {
163    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
164        let bucket = self.get_bucket().clone().unwrap_or_default();
165        let key = self.get_key().clone().unwrap_or_default();
166        S3SpanBuilder::rename_object(bucket, key)
167    }
168}
169impl InstrumentedFluentBuilderOutput for RenameObjectOutput {}
170instrument_aws_operation!(aws_sdk_s3::operation::rename_object);
171
172impl<'a> AwsBuilderInstrument<'a> for RestoreObjectFluentBuilder {
173    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
174        let bucket = self.get_bucket().clone().unwrap_or_default();
175        let key = self.get_key().clone().unwrap_or_default();
176        let attributes =
177            attributes![self.get_version_id().as_attribute("aws.s3.version_id"),];
178        S3SpanBuilder::restore_object(bucket, key).attributes(attributes)
179    }
180}
181impl InstrumentedFluentBuilderOutput for RestoreObjectOutput {}
182instrument_aws_operation!(aws_sdk_s3::operation::restore_object);
183
184impl<'a> AwsBuilderInstrument<'a> for SelectObjectContentFluentBuilder {
185    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
186        let bucket = self.get_bucket().clone().unwrap_or_default();
187        let key = self.get_key().clone().unwrap_or_default();
188        S3SpanBuilder::select_object_content(bucket, key)
189    }
190}
191impl InstrumentedFluentBuilderOutput for SelectObjectContentOutput {}
192instrument_aws_operation!(aws_sdk_s3::operation::select_object_content);
193
194impl<'a> AwsBuilderInstrument<'a> for GetObjectTorrentFluentBuilder {
195    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
196        let bucket = self.get_bucket().clone().unwrap_or_default();
197        let key = self.get_key().clone().unwrap_or_default();
198        S3SpanBuilder::get_object_torrent(bucket, key)
199    }
200}
201impl InstrumentedFluentBuilderOutput for GetObjectTorrentOutput {}
202instrument_aws_operation!(aws_sdk_s3::operation::get_object_torrent);
203
204// Object listing operations
205impl<'a> AwsBuilderInstrument<'a> for ListObjectsFluentBuilder {
206    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
207        let bucket = self.get_bucket().clone().unwrap_or_default();
208        let attributes = attributes![
209            self.get_prefix().as_attribute("aws.s3.prefix"),
210            self.get_max_keys().as_attribute("aws.s3.max_keys"),
211        ];
212        S3SpanBuilder::list_objects(bucket).attributes(attributes)
213    }
214}
215impl InstrumentedFluentBuilderOutput for ListObjectsOutput {
216    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
217        attributes![self.is_truncated().as_attribute("aws.s3.is_truncated"),]
218    }
219}
220instrument_aws_operation!(aws_sdk_s3::operation::list_objects);
221
222impl<'a> AwsBuilderInstrument<'a> for ListObjectsV2FluentBuilder {
223    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
224        let bucket = self.get_bucket().clone().unwrap_or_default();
225        let attributes = attributes![
226            self.get_prefix().as_attribute("aws.s3.prefix"),
227            self.get_max_keys().as_attribute("aws.s3.max_keys"),
228        ];
229        S3SpanBuilder::list_objects_v2(bucket).attributes(attributes)
230    }
231}
232impl InstrumentedFluentBuilderOutput for ListObjectsV2Output {
233    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
234        attributes![
235            self.key_count().as_attribute("aws.s3.key_count"),
236            self.is_truncated().as_attribute("aws.s3.is_truncated"),
237        ]
238    }
239}
240instrument_aws_operation!(aws_sdk_s3::operation::list_objects_v2);
241
242impl<'a> AwsBuilderInstrument<'a> for ListObjectVersionsFluentBuilder {
243    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
244        let bucket = self.get_bucket().clone().unwrap_or_default();
245        let attributes = attributes![
246            self.get_prefix().as_attribute("aws.s3.prefix"),
247            self.get_max_keys().as_attribute("aws.s3.max_keys"),
248        ];
249        S3SpanBuilder::list_object_versions(bucket).attributes(attributes)
250    }
251}
252impl InstrumentedFluentBuilderOutput for ListObjectVersionsOutput {
253    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
254        attributes![self.is_truncated().as_attribute("aws.s3.is_truncated"),]
255    }
256}
257instrument_aws_operation!(aws_sdk_s3::operation::list_object_versions);
258
259// Multipart upload operations
260impl<'a> AwsBuilderInstrument<'a> for CreateMultipartUploadFluentBuilder {
261    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
262        let bucket = self.get_bucket().clone().unwrap_or_default();
263        let key = self.get_key().clone().unwrap_or_default();
264        S3SpanBuilder::create_multipart_upload(bucket, key)
265    }
266}
267impl InstrumentedFluentBuilderOutput for CreateMultipartUploadOutput {
268    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
269        attributes![
270            self.upload_id().as_attribute(semconv::AWS_S3_UPLOAD_ID),
271            self.server_side_encryption().map(|sse| KeyValue::new(
272                "aws.s3.server_side_encryption",
273                sse.as_str().to_owned()
274            )),
275        ]
276    }
277}
278instrument_aws_operation!(aws_sdk_s3::operation::create_multipart_upload);
279
280impl<'a> AwsBuilderInstrument<'a> for UploadPartFluentBuilder {
281    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
282        let bucket = self.get_bucket().clone().unwrap_or_default();
283        let key = self.get_key().clone().unwrap_or_default();
284        let attributes = attributes![
285            self.get_upload_id().as_attribute(semconv::AWS_S3_UPLOAD_ID),
286            self.get_part_number()
287                .as_attribute(semconv::AWS_S3_PART_NUMBER),
288            self.get_content_length()
289                .as_attribute("aws.s3.content_length"),
290        ];
291        S3SpanBuilder::upload_part(bucket, key).attributes(attributes)
292    }
293}
294impl InstrumentedFluentBuilderOutput for UploadPartOutput {
295    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
296        attributes![
297            self.e_tag().as_attribute("aws.s3.etag"),
298            self.server_side_encryption().map(|sse| KeyValue::new(
299                "aws.s3.server_side_encryption",
300                sse.as_str().to_owned()
301            )),
302        ]
303    }
304}
305instrument_aws_operation!(aws_sdk_s3::operation::upload_part);
306
307impl<'a> AwsBuilderInstrument<'a> for UploadPartCopyFluentBuilder {
308    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
309        let bucket = self.get_bucket().clone().unwrap_or_default();
310        let key = self.get_key().clone().unwrap_or_default();
311        let attributes = attributes![
312            self.get_upload_id().as_attribute(semconv::AWS_S3_UPLOAD_ID),
313            self.get_part_number()
314                .as_attribute(semconv::AWS_S3_PART_NUMBER),
315            self.get_copy_source()
316                .as_attribute(semconv::AWS_S3_COPY_SOURCE),
317        ];
318        S3SpanBuilder::upload_part_copy(bucket, key).attributes(attributes)
319    }
320}
321impl InstrumentedFluentBuilderOutput for UploadPartCopyOutput {
322    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
323        attributes![
324            self.copy_part_result()
325                .and_then(|r| r.e_tag())
326                .as_attribute("aws.s3.etag"),
327            self.server_side_encryption().map(|sse| KeyValue::new(
328                "aws.s3.server_side_encryption",
329                sse.as_str().to_owned()
330            )),
331        ]
332    }
333}
334instrument_aws_operation!(aws_sdk_s3::operation::upload_part_copy);
335
336impl<'a> AwsBuilderInstrument<'a> for CompleteMultipartUploadFluentBuilder {
337    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
338        let bucket = self.get_bucket().clone().unwrap_or_default();
339        let key = self.get_key().clone().unwrap_or_default();
340        let attributes = attributes![
341            self.get_upload_id().as_attribute(semconv::AWS_S3_UPLOAD_ID),
342            self.get_multipart_upload().as_ref().map(|mu| KeyValue::new(
343                "aws.s3.multipart.parts_count",
344                mu.parts().len() as i64
345            )),
346        ];
347        S3SpanBuilder::complete_multipart_upload(bucket, key).attributes(attributes)
348    }
349}
350impl InstrumentedFluentBuilderOutput for CompleteMultipartUploadOutput {
351    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
352        attributes![
353            self.e_tag().as_attribute("aws.s3.etag"),
354            self.version_id().as_attribute("aws.s3.version_id"),
355            self.location().as_attribute("aws.s3.location"),
356            self.server_side_encryption().map(|sse| KeyValue::new(
357                "aws.s3.server_side_encryption",
358                sse.as_str().to_owned()
359            )),
360        ]
361    }
362}
363instrument_aws_operation!(aws_sdk_s3::operation::complete_multipart_upload);
364
365impl<'a> AwsBuilderInstrument<'a> for AbortMultipartUploadFluentBuilder {
366    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
367        let bucket = self.get_bucket().clone().unwrap_or_default();
368        let key = self.get_key().clone().unwrap_or_default();
369        let attributes =
370            attributes![self.get_upload_id().as_attribute(semconv::AWS_S3_UPLOAD_ID),];
371        S3SpanBuilder::abort_multipart_upload(bucket, key).attributes(attributes)
372    }
373}
374impl InstrumentedFluentBuilderOutput for AbortMultipartUploadOutput {}
375instrument_aws_operation!(aws_sdk_s3::operation::abort_multipart_upload);
376
377impl<'a> AwsBuilderInstrument<'a> for ListMultipartUploadsFluentBuilder {
378    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
379        let bucket = self.get_bucket().clone().unwrap_or_default();
380        let attributes = attributes![
381            self.get_prefix().as_attribute("aws.s3.prefix"),
382            self.get_max_uploads().as_attribute("aws.s3.max_uploads"),
383        ];
384        S3SpanBuilder::list_multipart_uploads(bucket).attributes(attributes)
385    }
386}
387impl InstrumentedFluentBuilderOutput for ListMultipartUploadsOutput {
388    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
389        attributes![self.is_truncated().as_attribute("aws.s3.is_truncated"),]
390    }
391}
392instrument_aws_operation!(aws_sdk_s3::operation::list_multipart_uploads);
393
394impl<'a> AwsBuilderInstrument<'a> for ListPartsFluentBuilder {
395    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
396        let bucket = self.get_bucket().clone().unwrap_or_default();
397        let key = self.get_key().clone().unwrap_or_default();
398        let attributes = attributes![
399            self.get_upload_id().as_attribute(semconv::AWS_S3_UPLOAD_ID),
400            self.get_max_parts().as_attribute("aws.s3.max_parts"),
401        ];
402        S3SpanBuilder::list_parts(bucket, key).attributes(attributes)
403    }
404}
405impl InstrumentedFluentBuilderOutput for ListPartsOutput {
406    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
407        attributes![
408            self.parts()
409                .len()
410                .as_attribute("aws.s3.multipart.parts_count"),
411            self.is_truncated().as_attribute("aws.s3.is_truncated"),
412        ]
413    }
414}
415instrument_aws_operation!(aws_sdk_s3::operation::list_parts);
416
417// Bucket management operations
418impl<'a> AwsBuilderInstrument<'a> for CreateBucketFluentBuilder {
419    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
420        let bucket = self.get_bucket().clone().unwrap_or_default();
421        S3SpanBuilder::create_bucket(bucket)
422    }
423}
424impl InstrumentedFluentBuilderOutput for CreateBucketOutput {
425    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
426        attributes![self.location().as_attribute("aws.s3.bucket.location"),]
427    }
428}
429instrument_aws_operation!(aws_sdk_s3::operation::create_bucket);
430
431impl<'a> AwsBuilderInstrument<'a> for DeleteBucketFluentBuilder {
432    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
433        let bucket = self.get_bucket().clone().unwrap_or_default();
434        S3SpanBuilder::delete_bucket(bucket)
435    }
436}
437impl InstrumentedFluentBuilderOutput for DeleteBucketOutput {}
438instrument_aws_operation!(aws_sdk_s3::operation::delete_bucket);
439
440impl<'a> AwsBuilderInstrument<'a> for HeadBucketFluentBuilder {
441    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
442        let bucket = self.get_bucket().clone().unwrap_or_default();
443        S3SpanBuilder::head_bucket(bucket)
444    }
445}
446impl InstrumentedFluentBuilderOutput for HeadBucketOutput {
447    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
448        attributes![self.bucket_region().as_attribute("aws.s3.bucket.region"),]
449    }
450}
451instrument_aws_operation!(aws_sdk_s3::operation::head_bucket);
452
453impl<'a> AwsBuilderInstrument<'a> for CreateSessionFluentBuilder {
454    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
455        let bucket = self.get_bucket().clone().unwrap_or_default();
456        S3SpanBuilder::create_session(bucket)
457    }
458}
459impl InstrumentedFluentBuilderOutput for CreateSessionOutput {
460    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
461        attributes![self.server_side_encryption().map(|sse| KeyValue::new(
462            "aws.s3.server_side_encryption",
463            sse.as_str().to_owned()
464        )),]
465    }
466}
467instrument_aws_operation!(aws_sdk_s3::operation::create_session);
468
469// Global operations
470impl<'a> AwsBuilderInstrument<'a> for ListBucketsFluentBuilder {
471    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
472        S3SpanBuilder::list_buckets()
473    }
474}
475impl InstrumentedFluentBuilderOutput for ListBucketsOutput {
476    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
477        attributes![self.buckets().len().as_attribute("aws.s3.bucket.count"),]
478    }
479}
480instrument_aws_operation!(aws_sdk_s3::operation::list_buckets);
481
482impl<'a> AwsBuilderInstrument<'a> for ListDirectoryBucketsFluentBuilder {
483    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
484        S3SpanBuilder::list_directory_buckets()
485    }
486}
487impl InstrumentedFluentBuilderOutput for ListDirectoryBucketsOutput {}
488instrument_aws_operation!(aws_sdk_s3::operation::list_directory_buckets);
489
490impl<'a> AwsBuilderInstrument<'a> for WriteGetObjectResponseFluentBuilder {
491    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
492        let attributes = attributes![
493            self.get_content_length()
494                .as_attribute("aws.s3.content_length"),
495            self.get_version_id().as_attribute("aws.s3.version_id"),
496        ];
497        S3SpanBuilder::write_get_object_response().attributes(attributes)
498    }
499}
500impl InstrumentedFluentBuilderOutput for WriteGetObjectResponseOutput {}
501instrument_aws_operation!(aws_sdk_s3::operation::write_get_object_response);
502
503// Object ACL operations
504impl<'a> AwsBuilderInstrument<'a> for GetObjectAclFluentBuilder {
505    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
506        let bucket = self.get_bucket().clone().unwrap_or_default();
507        let key = self.get_key().clone().unwrap_or_default();
508        let attributes =
509            attributes![self.get_version_id().as_attribute("aws.s3.version_id"),];
510        S3SpanBuilder::get_object_acl(bucket, key).attributes(attributes)
511    }
512}
513impl InstrumentedFluentBuilderOutput for GetObjectAclOutput {}
514instrument_aws_operation!(aws_sdk_s3::operation::get_object_acl);
515
516impl<'a> AwsBuilderInstrument<'a> for PutObjectAclFluentBuilder {
517    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
518        let bucket = self.get_bucket().clone().unwrap_or_default();
519        let key = self.get_key().clone().unwrap_or_default();
520        let attributes =
521            attributes![self.get_version_id().as_attribute("aws.s3.version_id"),];
522        S3SpanBuilder::put_object_acl(bucket, key).attributes(attributes)
523    }
524}
525impl InstrumentedFluentBuilderOutput for PutObjectAclOutput {}
526instrument_aws_operation!(aws_sdk_s3::operation::put_object_acl);
527
528impl<'a> AwsBuilderInstrument<'a> for GetObjectAttributesFluentBuilder {
529    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
530        let bucket = self.get_bucket().clone().unwrap_or_default();
531        let key = self.get_key().clone().unwrap_or_default();
532        let attributes =
533            attributes![self.get_version_id().as_attribute("aws.s3.version_id"),];
534        S3SpanBuilder::get_object_attributes(bucket, key).attributes(attributes)
535    }
536}
537impl InstrumentedFluentBuilderOutput for GetObjectAttributesOutput {
538    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
539        attributes![
540            self.e_tag().as_attribute("aws.s3.etag"),
541            self.version_id().as_attribute("aws.s3.version_id"),
542            self.last_modified()
543                .map(|lm| KeyValue::new("aws.s3.last_modified", lm.to_string())),
544        ]
545    }
546}
547instrument_aws_operation!(aws_sdk_s3::operation::get_object_attributes);
548
549// Object tagging operations
550impl<'a> AwsBuilderInstrument<'a> for GetObjectTaggingFluentBuilder {
551    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
552        let bucket = self.get_bucket().clone().unwrap_or_default();
553        let key = self.get_key().clone().unwrap_or_default();
554        let attributes =
555            attributes![self.get_version_id().as_attribute("aws.s3.version_id"),];
556        S3SpanBuilder::get_object_tagging(bucket, key).attributes(attributes)
557    }
558}
559impl InstrumentedFluentBuilderOutput for GetObjectTaggingOutput {
560    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
561        attributes![self.version_id().as_attribute("aws.s3.version_id"),]
562    }
563}
564instrument_aws_operation!(aws_sdk_s3::operation::get_object_tagging);
565
566impl<'a> AwsBuilderInstrument<'a> for PutObjectTaggingFluentBuilder {
567    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
568        let bucket = self.get_bucket().clone().unwrap_or_default();
569        let key = self.get_key().clone().unwrap_or_default();
570        let attributes =
571            attributes![self.get_version_id().as_attribute("aws.s3.version_id"),];
572        S3SpanBuilder::put_object_tagging(bucket, key).attributes(attributes)
573    }
574}
575impl InstrumentedFluentBuilderOutput for PutObjectTaggingOutput {
576    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
577        attributes![self.version_id().as_attribute("aws.s3.version_id"),]
578    }
579}
580instrument_aws_operation!(aws_sdk_s3::operation::put_object_tagging);
581
582impl<'a> AwsBuilderInstrument<'a> for DeleteObjectTaggingFluentBuilder {
583    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
584        let bucket = self.get_bucket().clone().unwrap_or_default();
585        let key = self.get_key().clone().unwrap_or_default();
586        let attributes =
587            attributes![self.get_version_id().as_attribute("aws.s3.version_id"),];
588        S3SpanBuilder::delete_object_tagging(bucket, key).attributes(attributes)
589    }
590}
591impl InstrumentedFluentBuilderOutput for DeleteObjectTaggingOutput {
592    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
593        attributes![self.version_id().as_attribute("aws.s3.version_id"),]
594    }
595}
596instrument_aws_operation!(aws_sdk_s3::operation::delete_object_tagging);
597
598// Object lock and retention operations
599impl<'a> AwsBuilderInstrument<'a> for GetObjectLegalHoldFluentBuilder {
600    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
601        let bucket = self.get_bucket().clone().unwrap_or_default();
602        let key = self.get_key().clone().unwrap_or_default();
603        let attributes =
604            attributes![self.get_version_id().as_attribute("aws.s3.version_id"),];
605        S3SpanBuilder::get_object_legal_hold(bucket, key).attributes(attributes)
606    }
607}
608impl InstrumentedFluentBuilderOutput for GetObjectLegalHoldOutput {}
609instrument_aws_operation!(aws_sdk_s3::operation::get_object_legal_hold);
610
611impl<'a> AwsBuilderInstrument<'a> for PutObjectLegalHoldFluentBuilder {
612    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
613        let bucket = self.get_bucket().clone().unwrap_or_default();
614        let key = self.get_key().clone().unwrap_or_default();
615        let attributes =
616            attributes![self.get_version_id().as_attribute("aws.s3.version_id"),];
617        S3SpanBuilder::put_object_legal_hold(bucket, key).attributes(attributes)
618    }
619}
620impl InstrumentedFluentBuilderOutput for PutObjectLegalHoldOutput {}
621instrument_aws_operation!(aws_sdk_s3::operation::put_object_legal_hold);
622
623impl<'a> AwsBuilderInstrument<'a> for GetObjectRetentionFluentBuilder {
624    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
625        let bucket = self.get_bucket().clone().unwrap_or_default();
626        let key = self.get_key().clone().unwrap_or_default();
627        let attributes =
628            attributes![self.get_version_id().as_attribute("aws.s3.version_id"),];
629        S3SpanBuilder::get_object_retention(bucket, key).attributes(attributes)
630    }
631}
632impl InstrumentedFluentBuilderOutput for GetObjectRetentionOutput {}
633instrument_aws_operation!(aws_sdk_s3::operation::get_object_retention);
634
635impl<'a> AwsBuilderInstrument<'a> for PutObjectRetentionFluentBuilder {
636    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
637        let bucket = self.get_bucket().clone().unwrap_or_default();
638        let key = self.get_key().clone().unwrap_or_default();
639        let attributes =
640            attributes![self.get_version_id().as_attribute("aws.s3.version_id"),];
641        S3SpanBuilder::put_object_retention(bucket, key).attributes(attributes)
642    }
643}
644impl InstrumentedFluentBuilderOutput for PutObjectRetentionOutput {}
645instrument_aws_operation!(aws_sdk_s3::operation::put_object_retention);
646
647impl<'a> AwsBuilderInstrument<'a> for GetObjectLockConfigurationFluentBuilder {
648    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
649        let bucket = self.get_bucket().clone().unwrap_or_default();
650        S3SpanBuilder::get_object_lock_configuration(bucket)
651    }
652}
653impl InstrumentedFluentBuilderOutput for GetObjectLockConfigurationOutput {}
654instrument_aws_operation!(aws_sdk_s3::operation::get_object_lock_configuration);
655
656impl<'a> AwsBuilderInstrument<'a> for PutObjectLockConfigurationFluentBuilder {
657    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
658        let bucket = self.get_bucket().clone().unwrap_or_default();
659        S3SpanBuilder::put_object_lock_configuration(bucket)
660    }
661}
662impl InstrumentedFluentBuilderOutput for PutObjectLockConfigurationOutput {}
663instrument_aws_operation!(aws_sdk_s3::operation::put_object_lock_configuration);
664
665// Bucket ACL and policy operations
666impl<'a> AwsBuilderInstrument<'a> for GetBucketAclFluentBuilder {
667    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
668        let bucket = self.get_bucket().clone().unwrap_or_default();
669        S3SpanBuilder::get_bucket_acl(bucket)
670    }
671}
672impl InstrumentedFluentBuilderOutput for GetBucketAclOutput {}
673instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_acl);
674
675impl<'a> AwsBuilderInstrument<'a> for PutBucketAclFluentBuilder {
676    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
677        let bucket = self.get_bucket().clone().unwrap_or_default();
678        S3SpanBuilder::put_bucket_acl(bucket)
679    }
680}
681impl InstrumentedFluentBuilderOutput for PutBucketAclOutput {}
682instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_acl);
683
684impl<'a> AwsBuilderInstrument<'a> for GetBucketPolicyFluentBuilder {
685    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
686        let bucket = self.get_bucket().clone().unwrap_or_default();
687        S3SpanBuilder::get_bucket_policy(bucket)
688    }
689}
690impl InstrumentedFluentBuilderOutput for GetBucketPolicyOutput {}
691instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_policy);
692
693impl<'a> AwsBuilderInstrument<'a> for PutBucketPolicyFluentBuilder {
694    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
695        let bucket = self.get_bucket().clone().unwrap_or_default();
696        S3SpanBuilder::put_bucket_policy(bucket)
697    }
698}
699impl InstrumentedFluentBuilderOutput for PutBucketPolicyOutput {}
700instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_policy);
701
702impl<'a> AwsBuilderInstrument<'a> for DeleteBucketPolicyFluentBuilder {
703    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
704        let bucket = self.get_bucket().clone().unwrap_or_default();
705        S3SpanBuilder::delete_bucket_policy(bucket)
706    }
707}
708impl InstrumentedFluentBuilderOutput for DeleteBucketPolicyOutput {}
709instrument_aws_operation!(aws_sdk_s3::operation::delete_bucket_policy);
710
711impl<'a> AwsBuilderInstrument<'a> for GetBucketPolicyStatusFluentBuilder {
712    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
713        let bucket = self.get_bucket().clone().unwrap_or_default();
714        S3SpanBuilder::get_bucket_policy_status(bucket)
715    }
716}
717impl InstrumentedFluentBuilderOutput for GetBucketPolicyStatusOutput {}
718instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_policy_status);
719
720// Bucket CORS operations
721impl<'a> AwsBuilderInstrument<'a> for GetBucketCorsFluentBuilder {
722    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
723        let bucket = self.get_bucket().clone().unwrap_or_default();
724        S3SpanBuilder::get_bucket_cors(bucket)
725    }
726}
727impl InstrumentedFluentBuilderOutput for GetBucketCorsOutput {}
728instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_cors);
729
730impl<'a> AwsBuilderInstrument<'a> for PutBucketCorsFluentBuilder {
731    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
732        let bucket = self.get_bucket().clone().unwrap_or_default();
733        S3SpanBuilder::put_bucket_cors(bucket)
734    }
735}
736impl InstrumentedFluentBuilderOutput for PutBucketCorsOutput {}
737instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_cors);
738
739impl<'a> AwsBuilderInstrument<'a> for DeleteBucketCorsFluentBuilder {
740    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
741        let bucket = self.get_bucket().clone().unwrap_or_default();
742        S3SpanBuilder::delete_bucket_cors(bucket)
743    }
744}
745impl InstrumentedFluentBuilderOutput for DeleteBucketCorsOutput {}
746instrument_aws_operation!(aws_sdk_s3::operation::delete_bucket_cors);
747
748// Bucket encryption operations
749impl<'a> AwsBuilderInstrument<'a> for GetBucketEncryptionFluentBuilder {
750    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
751        let bucket = self.get_bucket().clone().unwrap_or_default();
752        S3SpanBuilder::get_bucket_encryption(bucket)
753    }
754}
755impl InstrumentedFluentBuilderOutput for GetBucketEncryptionOutput {}
756instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_encryption);
757
758impl<'a> AwsBuilderInstrument<'a> for PutBucketEncryptionFluentBuilder {
759    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
760        let bucket = self.get_bucket().clone().unwrap_or_default();
761        S3SpanBuilder::put_bucket_encryption(bucket)
762    }
763}
764impl InstrumentedFluentBuilderOutput for PutBucketEncryptionOutput {}
765instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_encryption);
766
767impl<'a> AwsBuilderInstrument<'a> for DeleteBucketEncryptionFluentBuilder {
768    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
769        let bucket = self.get_bucket().clone().unwrap_or_default();
770        S3SpanBuilder::delete_bucket_encryption(bucket)
771    }
772}
773impl InstrumentedFluentBuilderOutput for DeleteBucketEncryptionOutput {}
774instrument_aws_operation!(aws_sdk_s3::operation::delete_bucket_encryption);
775
776// Bucket lifecycle operations
777impl<'a> AwsBuilderInstrument<'a> for GetBucketLifecycleConfigurationFluentBuilder {
778    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
779        let bucket = self.get_bucket().clone().unwrap_or_default();
780        S3SpanBuilder::get_bucket_lifecycle_configuration(bucket)
781    }
782}
783impl InstrumentedFluentBuilderOutput for GetBucketLifecycleConfigurationOutput {}
784instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_lifecycle_configuration);
785
786impl<'a> AwsBuilderInstrument<'a> for PutBucketLifecycleConfigurationFluentBuilder {
787    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
788        let bucket = self.get_bucket().clone().unwrap_or_default();
789        S3SpanBuilder::put_bucket_lifecycle_configuration(bucket)
790    }
791}
792impl InstrumentedFluentBuilderOutput for PutBucketLifecycleConfigurationOutput {}
793instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_lifecycle_configuration);
794
795impl<'a> AwsBuilderInstrument<'a> for DeleteBucketLifecycleFluentBuilder {
796    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
797        let bucket = self.get_bucket().clone().unwrap_or_default();
798        S3SpanBuilder::delete_bucket_lifecycle(bucket)
799    }
800}
801impl InstrumentedFluentBuilderOutput for DeleteBucketLifecycleOutput {}
802instrument_aws_operation!(aws_sdk_s3::operation::delete_bucket_lifecycle);
803
804// Bucket replication operations
805impl<'a> AwsBuilderInstrument<'a> for GetBucketReplicationFluentBuilder {
806    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
807        let bucket = self.get_bucket().clone().unwrap_or_default();
808        S3SpanBuilder::get_bucket_replication(bucket)
809    }
810}
811impl InstrumentedFluentBuilderOutput for GetBucketReplicationOutput {}
812instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_replication);
813
814impl<'a> AwsBuilderInstrument<'a> for PutBucketReplicationFluentBuilder {
815    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
816        let bucket = self.get_bucket().clone().unwrap_or_default();
817        S3SpanBuilder::put_bucket_replication(bucket)
818    }
819}
820impl InstrumentedFluentBuilderOutput for PutBucketReplicationOutput {}
821instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_replication);
822
823impl<'a> AwsBuilderInstrument<'a> for DeleteBucketReplicationFluentBuilder {
824    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
825        let bucket = self.get_bucket().clone().unwrap_or_default();
826        S3SpanBuilder::delete_bucket_replication(bucket)
827    }
828}
829impl InstrumentedFluentBuilderOutput for DeleteBucketReplicationOutput {}
830instrument_aws_operation!(aws_sdk_s3::operation::delete_bucket_replication);
831
832// Bucket tagging operations
833impl<'a> AwsBuilderInstrument<'a> for GetBucketTaggingFluentBuilder {
834    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
835        let bucket = self.get_bucket().clone().unwrap_or_default();
836        S3SpanBuilder::get_bucket_tagging(bucket)
837    }
838}
839impl InstrumentedFluentBuilderOutput for GetBucketTaggingOutput {}
840instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_tagging);
841
842impl<'a> AwsBuilderInstrument<'a> for PutBucketTaggingFluentBuilder {
843    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
844        let bucket = self.get_bucket().clone().unwrap_or_default();
845        S3SpanBuilder::put_bucket_tagging(bucket)
846    }
847}
848impl InstrumentedFluentBuilderOutput for PutBucketTaggingOutput {}
849instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_tagging);
850
851impl<'a> AwsBuilderInstrument<'a> for DeleteBucketTaggingFluentBuilder {
852    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
853        let bucket = self.get_bucket().clone().unwrap_or_default();
854        S3SpanBuilder::delete_bucket_tagging(bucket)
855    }
856}
857impl InstrumentedFluentBuilderOutput for DeleteBucketTaggingOutput {}
858instrument_aws_operation!(aws_sdk_s3::operation::delete_bucket_tagging);
859
860// Bucket versioning operations
861impl<'a> AwsBuilderInstrument<'a> for GetBucketVersioningFluentBuilder {
862    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
863        let bucket = self.get_bucket().clone().unwrap_or_default();
864        S3SpanBuilder::get_bucket_versioning(bucket)
865    }
866}
867impl InstrumentedFluentBuilderOutput for GetBucketVersioningOutput {}
868instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_versioning);
869
870impl<'a> AwsBuilderInstrument<'a> for PutBucketVersioningFluentBuilder {
871    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
872        let bucket = self.get_bucket().clone().unwrap_or_default();
873        S3SpanBuilder::put_bucket_versioning(bucket)
874    }
875}
876impl InstrumentedFluentBuilderOutput for PutBucketVersioningOutput {}
877instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_versioning);
878
879// Bucket website operations
880impl<'a> AwsBuilderInstrument<'a> for GetBucketWebsiteFluentBuilder {
881    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
882        let bucket = self.get_bucket().clone().unwrap_or_default();
883        S3SpanBuilder::get_bucket_website(bucket)
884    }
885}
886impl InstrumentedFluentBuilderOutput for GetBucketWebsiteOutput {}
887instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_website);
888
889impl<'a> AwsBuilderInstrument<'a> for PutBucketWebsiteFluentBuilder {
890    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
891        let bucket = self.get_bucket().clone().unwrap_or_default();
892        S3SpanBuilder::put_bucket_website(bucket)
893    }
894}
895impl InstrumentedFluentBuilderOutput for PutBucketWebsiteOutput {}
896instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_website);
897
898impl<'a> AwsBuilderInstrument<'a> for DeleteBucketWebsiteFluentBuilder {
899    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
900        let bucket = self.get_bucket().clone().unwrap_or_default();
901        S3SpanBuilder::delete_bucket_website(bucket)
902    }
903}
904impl InstrumentedFluentBuilderOutput for DeleteBucketWebsiteOutput {}
905instrument_aws_operation!(aws_sdk_s3::operation::delete_bucket_website);
906
907// Bucket logging operations
908impl<'a> AwsBuilderInstrument<'a> for GetBucketLoggingFluentBuilder {
909    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
910        let bucket = self.get_bucket().clone().unwrap_or_default();
911        S3SpanBuilder::get_bucket_logging(bucket)
912    }
913}
914impl InstrumentedFluentBuilderOutput for GetBucketLoggingOutput {}
915instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_logging);
916
917impl<'a> AwsBuilderInstrument<'a> for PutBucketLoggingFluentBuilder {
918    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
919        let bucket = self.get_bucket().clone().unwrap_or_default();
920        S3SpanBuilder::put_bucket_logging(bucket)
921    }
922}
923impl InstrumentedFluentBuilderOutput for PutBucketLoggingOutput {}
924instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_logging);
925
926// Bucket notification operations
927impl<'a> AwsBuilderInstrument<'a> for GetBucketNotificationConfigurationFluentBuilder {
928    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
929        let bucket = self.get_bucket().clone().unwrap_or_default();
930        S3SpanBuilder::get_bucket_notification_configuration(bucket)
931    }
932}
933impl InstrumentedFluentBuilderOutput for GetBucketNotificationConfigurationOutput {}
934instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_notification_configuration);
935
936impl<'a> AwsBuilderInstrument<'a> for PutBucketNotificationConfigurationFluentBuilder {
937    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
938        let bucket = self.get_bucket().clone().unwrap_or_default();
939        S3SpanBuilder::put_bucket_notification_configuration(bucket)
940    }
941}
942impl InstrumentedFluentBuilderOutput for PutBucketNotificationConfigurationOutput {}
943instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_notification_configuration);
944
945// Bucket location operations
946impl<'a> AwsBuilderInstrument<'a> for GetBucketLocationFluentBuilder {
947    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
948        let bucket = self.get_bucket().clone().unwrap_or_default();
949        S3SpanBuilder::get_bucket_location(bucket)
950    }
951}
952impl InstrumentedFluentBuilderOutput for GetBucketLocationOutput {}
953instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_location);
954
955// Bucket accelerate operations
956impl<'a> AwsBuilderInstrument<'a> for GetBucketAccelerateConfigurationFluentBuilder {
957    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
958        let bucket = self.get_bucket().clone().unwrap_or_default();
959        S3SpanBuilder::get_bucket_accelerate_configuration(bucket)
960    }
961}
962impl InstrumentedFluentBuilderOutput for GetBucketAccelerateConfigurationOutput {}
963instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_accelerate_configuration);
964
965impl<'a> AwsBuilderInstrument<'a> for PutBucketAccelerateConfigurationFluentBuilder {
966    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
967        let bucket = self.get_bucket().clone().unwrap_or_default();
968        S3SpanBuilder::put_bucket_accelerate_configuration(bucket)
969    }
970}
971impl InstrumentedFluentBuilderOutput for PutBucketAccelerateConfigurationOutput {}
972instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_accelerate_configuration);
973
974// Bucket request payment operations
975impl<'a> AwsBuilderInstrument<'a> for GetBucketRequestPaymentFluentBuilder {
976    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
977        let bucket = self.get_bucket().clone().unwrap_or_default();
978        S3SpanBuilder::get_bucket_request_payment(bucket)
979    }
980}
981impl InstrumentedFluentBuilderOutput for GetBucketRequestPaymentOutput {}
982instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_request_payment);
983
984impl<'a> AwsBuilderInstrument<'a> for PutBucketRequestPaymentFluentBuilder {
985    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
986        let bucket = self.get_bucket().clone().unwrap_or_default();
987        S3SpanBuilder::put_bucket_request_payment(bucket)
988    }
989}
990impl InstrumentedFluentBuilderOutput for PutBucketRequestPaymentOutput {}
991instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_request_payment);
992
993// Bucket ownership controls
994impl<'a> AwsBuilderInstrument<'a> for GetBucketOwnershipControlsFluentBuilder {
995    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
996        let bucket = self.get_bucket().clone().unwrap_or_default();
997        S3SpanBuilder::get_bucket_ownership_controls(bucket)
998    }
999}
1000impl InstrumentedFluentBuilderOutput for GetBucketOwnershipControlsOutput {}
1001instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_ownership_controls);
1002
1003impl<'a> AwsBuilderInstrument<'a> for PutBucketOwnershipControlsFluentBuilder {
1004    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1005        let bucket = self.get_bucket().clone().unwrap_or_default();
1006        S3SpanBuilder::put_bucket_ownership_controls(bucket)
1007    }
1008}
1009impl InstrumentedFluentBuilderOutput for PutBucketOwnershipControlsOutput {}
1010instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_ownership_controls);
1011
1012impl<'a> AwsBuilderInstrument<'a> for DeleteBucketOwnershipControlsFluentBuilder {
1013    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1014        let bucket = self.get_bucket().clone().unwrap_or_default();
1015        S3SpanBuilder::delete_bucket_ownership_controls(bucket)
1016    }
1017}
1018impl InstrumentedFluentBuilderOutput for DeleteBucketOwnershipControlsOutput {}
1019instrument_aws_operation!(aws_sdk_s3::operation::delete_bucket_ownership_controls);
1020
1021// Bucket analytics configuration operations
1022impl<'a> AwsBuilderInstrument<'a> for GetBucketAnalyticsConfigurationFluentBuilder {
1023    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1024        let bucket = self.get_bucket().clone().unwrap_or_default();
1025        S3SpanBuilder::get_bucket_analytics_configuration(bucket)
1026    }
1027}
1028impl InstrumentedFluentBuilderOutput for GetBucketAnalyticsConfigurationOutput {}
1029instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_analytics_configuration);
1030
1031impl<'a> AwsBuilderInstrument<'a> for PutBucketAnalyticsConfigurationFluentBuilder {
1032    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1033        let bucket = self.get_bucket().clone().unwrap_or_default();
1034        S3SpanBuilder::put_bucket_analytics_configuration(bucket)
1035    }
1036}
1037impl InstrumentedFluentBuilderOutput for PutBucketAnalyticsConfigurationOutput {}
1038instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_analytics_configuration);
1039
1040impl<'a> AwsBuilderInstrument<'a> for DeleteBucketAnalyticsConfigurationFluentBuilder {
1041    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1042        let bucket = self.get_bucket().clone().unwrap_or_default();
1043        S3SpanBuilder::delete_bucket_analytics_configuration(bucket)
1044    }
1045}
1046impl InstrumentedFluentBuilderOutput for DeleteBucketAnalyticsConfigurationOutput {}
1047instrument_aws_operation!(aws_sdk_s3::operation::delete_bucket_analytics_configuration);
1048
1049impl<'a> AwsBuilderInstrument<'a> for ListBucketAnalyticsConfigurationsFluentBuilder {
1050    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1051        let bucket = self.get_bucket().clone().unwrap_or_default();
1052        S3SpanBuilder::list_bucket_analytics_configurations(bucket)
1053    }
1054}
1055impl InstrumentedFluentBuilderOutput for ListBucketAnalyticsConfigurationsOutput {}
1056instrument_aws_operation!(aws_sdk_s3::operation::list_bucket_analytics_configurations);
1057
1058// Bucket intelligent tiering configuration operations
1059impl<'a> AwsBuilderInstrument<'a>
1060    for GetBucketIntelligentTieringConfigurationFluentBuilder
1061{
1062    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1063        let bucket = self.get_bucket().clone().unwrap_or_default();
1064        S3SpanBuilder::get_bucket_intelligent_tiering_configuration(bucket)
1065    }
1066}
1067impl InstrumentedFluentBuilderOutput for GetBucketIntelligentTieringConfigurationOutput {}
1068instrument_aws_operation!(
1069    aws_sdk_s3::operation::get_bucket_intelligent_tiering_configuration
1070);
1071
1072impl<'a> AwsBuilderInstrument<'a>
1073    for PutBucketIntelligentTieringConfigurationFluentBuilder
1074{
1075    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1076        let bucket = self.get_bucket().clone().unwrap_or_default();
1077        S3SpanBuilder::put_bucket_intelligent_tiering_configuration(bucket)
1078    }
1079}
1080impl InstrumentedFluentBuilderOutput for PutBucketIntelligentTieringConfigurationOutput {}
1081instrument_aws_operation!(
1082    aws_sdk_s3::operation::put_bucket_intelligent_tiering_configuration
1083);
1084
1085impl<'a> AwsBuilderInstrument<'a>
1086    for DeleteBucketIntelligentTieringConfigurationFluentBuilder
1087{
1088    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1089        let bucket = self.get_bucket().clone().unwrap_or_default();
1090        S3SpanBuilder::delete_bucket_intelligent_tiering_configuration(bucket)
1091    }
1092}
1093impl InstrumentedFluentBuilderOutput
1094    for DeleteBucketIntelligentTieringConfigurationOutput
1095{
1096}
1097instrument_aws_operation!(
1098    aws_sdk_s3::operation::delete_bucket_intelligent_tiering_configuration
1099);
1100
1101impl<'a> AwsBuilderInstrument<'a>
1102    for ListBucketIntelligentTieringConfigurationsFluentBuilder
1103{
1104    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1105        let bucket = self.get_bucket().clone().unwrap_or_default();
1106        S3SpanBuilder::list_bucket_intelligent_tiering_configurations(bucket)
1107    }
1108}
1109impl InstrumentedFluentBuilderOutput
1110    for ListBucketIntelligentTieringConfigurationsOutput
1111{
1112}
1113instrument_aws_operation!(
1114    aws_sdk_s3::operation::list_bucket_intelligent_tiering_configurations
1115);
1116
1117// Bucket inventory configuration operations
1118impl<'a> AwsBuilderInstrument<'a> for GetBucketInventoryConfigurationFluentBuilder {
1119    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1120        let bucket = self.get_bucket().clone().unwrap_or_default();
1121        S3SpanBuilder::get_bucket_inventory_configuration(bucket)
1122    }
1123}
1124impl InstrumentedFluentBuilderOutput for GetBucketInventoryConfigurationOutput {}
1125instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_inventory_configuration);
1126
1127impl<'a> AwsBuilderInstrument<'a> for PutBucketInventoryConfigurationFluentBuilder {
1128    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1129        let bucket = self.get_bucket().clone().unwrap_or_default();
1130        S3SpanBuilder::put_bucket_inventory_configuration(bucket)
1131    }
1132}
1133impl InstrumentedFluentBuilderOutput for PutBucketInventoryConfigurationOutput {}
1134instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_inventory_configuration);
1135
1136impl<'a> AwsBuilderInstrument<'a> for DeleteBucketInventoryConfigurationFluentBuilder {
1137    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1138        let bucket = self.get_bucket().clone().unwrap_or_default();
1139        S3SpanBuilder::delete_bucket_inventory_configuration(bucket)
1140    }
1141}
1142impl InstrumentedFluentBuilderOutput for DeleteBucketInventoryConfigurationOutput {}
1143instrument_aws_operation!(aws_sdk_s3::operation::delete_bucket_inventory_configuration);
1144
1145impl<'a> AwsBuilderInstrument<'a> for ListBucketInventoryConfigurationsFluentBuilder {
1146    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1147        let bucket = self.get_bucket().clone().unwrap_or_default();
1148        S3SpanBuilder::list_bucket_inventory_configurations(bucket)
1149    }
1150}
1151impl InstrumentedFluentBuilderOutput for ListBucketInventoryConfigurationsOutput {}
1152instrument_aws_operation!(aws_sdk_s3::operation::list_bucket_inventory_configurations);
1153
1154// Bucket metrics configuration operations
1155impl<'a> AwsBuilderInstrument<'a> for GetBucketMetricsConfigurationFluentBuilder {
1156    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1157        let bucket = self.get_bucket().clone().unwrap_or_default();
1158        S3SpanBuilder::get_bucket_metrics_configuration(bucket)
1159    }
1160}
1161impl InstrumentedFluentBuilderOutput for GetBucketMetricsConfigurationOutput {}
1162instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_metrics_configuration);
1163
1164impl<'a> AwsBuilderInstrument<'a> for PutBucketMetricsConfigurationFluentBuilder {
1165    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1166        let bucket = self.get_bucket().clone().unwrap_or_default();
1167        S3SpanBuilder::put_bucket_metrics_configuration(bucket)
1168    }
1169}
1170impl InstrumentedFluentBuilderOutput for PutBucketMetricsConfigurationOutput {}
1171instrument_aws_operation!(aws_sdk_s3::operation::put_bucket_metrics_configuration);
1172
1173impl<'a> AwsBuilderInstrument<'a> for DeleteBucketMetricsConfigurationFluentBuilder {
1174    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1175        let bucket = self.get_bucket().clone().unwrap_or_default();
1176        S3SpanBuilder::delete_bucket_metrics_configuration(bucket)
1177    }
1178}
1179impl InstrumentedFluentBuilderOutput for DeleteBucketMetricsConfigurationOutput {}
1180instrument_aws_operation!(aws_sdk_s3::operation::delete_bucket_metrics_configuration);
1181
1182impl<'a> AwsBuilderInstrument<'a> for ListBucketMetricsConfigurationsFluentBuilder {
1183    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1184        let bucket = self.get_bucket().clone().unwrap_or_default();
1185        S3SpanBuilder::list_bucket_metrics_configurations(bucket)
1186    }
1187}
1188impl InstrumentedFluentBuilderOutput for ListBucketMetricsConfigurationsOutput {}
1189instrument_aws_operation!(aws_sdk_s3::operation::list_bucket_metrics_configurations);
1190
1191// Public access block operations
1192impl<'a> AwsBuilderInstrument<'a> for GetPublicAccessBlockFluentBuilder {
1193    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1194        let bucket = self.get_bucket().clone().unwrap_or_default();
1195        S3SpanBuilder::get_public_access_block(bucket)
1196    }
1197}
1198impl InstrumentedFluentBuilderOutput for GetPublicAccessBlockOutput {}
1199instrument_aws_operation!(aws_sdk_s3::operation::get_public_access_block);
1200
1201impl<'a> AwsBuilderInstrument<'a> for PutPublicAccessBlockFluentBuilder {
1202    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1203        let bucket = self.get_bucket().clone().unwrap_or_default();
1204        S3SpanBuilder::put_public_access_block(bucket)
1205    }
1206}
1207impl InstrumentedFluentBuilderOutput for PutPublicAccessBlockOutput {}
1208instrument_aws_operation!(aws_sdk_s3::operation::put_public_access_block);
1209
1210impl<'a> AwsBuilderInstrument<'a> for DeletePublicAccessBlockFluentBuilder {
1211    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1212        let bucket = self.get_bucket().clone().unwrap_or_default();
1213        S3SpanBuilder::delete_public_access_block(bucket)
1214    }
1215}
1216impl InstrumentedFluentBuilderOutput for DeletePublicAccessBlockOutput {}
1217instrument_aws_operation!(aws_sdk_s3::operation::delete_public_access_block);
1218
1219// Bucket metadata operations
1220impl<'a> AwsBuilderInstrument<'a> for CreateBucketMetadataConfigurationFluentBuilder {
1221    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1222        let bucket = self.get_bucket().clone().unwrap_or_default();
1223        S3SpanBuilder::create_bucket_metadata_configuration(bucket)
1224    }
1225}
1226impl InstrumentedFluentBuilderOutput for CreateBucketMetadataConfigurationOutput {}
1227instrument_aws_operation!(aws_sdk_s3::operation::create_bucket_metadata_configuration);
1228
1229impl<'a> AwsBuilderInstrument<'a>
1230    for CreateBucketMetadataTableConfigurationFluentBuilder
1231{
1232    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1233        let bucket = self.get_bucket().clone().unwrap_or_default();
1234        S3SpanBuilder::create_bucket_metadata_table_configuration(bucket)
1235    }
1236}
1237impl InstrumentedFluentBuilderOutput for CreateBucketMetadataTableConfigurationOutput {}
1238instrument_aws_operation!(
1239    aws_sdk_s3::operation::create_bucket_metadata_table_configuration
1240);
1241
1242impl<'a> AwsBuilderInstrument<'a> for DeleteBucketMetadataConfigurationFluentBuilder {
1243    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1244        let bucket = self.get_bucket().clone().unwrap_or_default();
1245        S3SpanBuilder::delete_bucket_metadata_configuration(bucket)
1246    }
1247}
1248impl InstrumentedFluentBuilderOutput for DeleteBucketMetadataConfigurationOutput {}
1249instrument_aws_operation!(aws_sdk_s3::operation::delete_bucket_metadata_configuration);
1250
1251impl<'a> AwsBuilderInstrument<'a>
1252    for DeleteBucketMetadataTableConfigurationFluentBuilder
1253{
1254    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1255        let bucket = self.get_bucket().clone().unwrap_or_default();
1256        S3SpanBuilder::delete_bucket_metadata_table_configuration(bucket)
1257    }
1258}
1259impl InstrumentedFluentBuilderOutput for DeleteBucketMetadataTableConfigurationOutput {}
1260instrument_aws_operation!(
1261    aws_sdk_s3::operation::delete_bucket_metadata_table_configuration
1262);
1263
1264impl<'a> AwsBuilderInstrument<'a> for GetBucketMetadataConfigurationFluentBuilder {
1265    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1266        let bucket = self.get_bucket().clone().unwrap_or_default();
1267        S3SpanBuilder::get_bucket_metadata_configuration(bucket)
1268    }
1269}
1270impl InstrumentedFluentBuilderOutput for GetBucketMetadataConfigurationOutput {}
1271instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_metadata_configuration);
1272
1273impl<'a> AwsBuilderInstrument<'a> for GetBucketMetadataTableConfigurationFluentBuilder {
1274    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1275        let bucket = self.get_bucket().clone().unwrap_or_default();
1276        S3SpanBuilder::get_bucket_metadata_table_configuration(bucket)
1277    }
1278}
1279impl InstrumentedFluentBuilderOutput for GetBucketMetadataTableConfigurationOutput {}
1280instrument_aws_operation!(aws_sdk_s3::operation::get_bucket_metadata_table_configuration);
1281
1282impl<'a> AwsBuilderInstrument<'a>
1283    for UpdateBucketMetadataInventoryTableConfigurationFluentBuilder
1284{
1285    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1286        let bucket = self.get_bucket().clone().unwrap_or_default();
1287        S3SpanBuilder::update_bucket_metadata_inventory_table_configuration(bucket)
1288    }
1289}
1290impl InstrumentedFluentBuilderOutput
1291    for UpdateBucketMetadataInventoryTableConfigurationOutput
1292{
1293}
1294instrument_aws_operation!(
1295    aws_sdk_s3::operation::update_bucket_metadata_inventory_table_configuration
1296);
1297
1298impl<'a> AwsBuilderInstrument<'a>
1299    for UpdateBucketMetadataJournalTableConfigurationFluentBuilder
1300{
1301    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
1302        let bucket = self.get_bucket().clone().unwrap_or_default();
1303        S3SpanBuilder::update_bucket_metadata_journal_table_configuration(bucket)
1304    }
1305}
1306impl InstrumentedFluentBuilderOutput
1307    for UpdateBucketMetadataJournalTableConfigurationOutput
1308{
1309}
1310instrument_aws_operation!(
1311    aws_sdk_s3::operation::update_bucket_metadata_journal_table_configuration
1312);