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

1/// AWS DynamoDB fluent builder instrumentation implementations
2/// Generated by GitHub Copilot with human guidance
3use super::{utils::*, *};
4use crate::semconv;
5
6/// Utility trait to deduplicate elements in an iterator and convert them to owned values.
7///
8/// This trait is used to extract unique table names from batch operations.
9trait ToUniqOwned<'a, T: ToOwned + ?Sized + 'a>: Iterator<Item = &'a T> {
10    /// Consumes the iterator, returning a new iterator over unique owned elements.
11    fn uniq_owned(self) -> impl Iterator<Item = T::Owned>;
12}
13
14impl<'a, T, I> ToUniqOwned<'a, T> for I
15where
16    T: Ord + ToOwned + ?Sized + 'a,
17    I: Iterator<Item = &'a T>,
18{
19    /// An implementation that collects items into a temporary vector,
20    /// which is then sorted and deduped.
21    ///
22    /// This implementation has an `O(n * log(n))` complexity due to [`core::slice::sort::unstable`] being used,
23    /// but for small collections it should be more efficient than using a [`std::collections::HashSet`].
24    fn uniq_owned(self) -> impl Iterator<Item = T::Owned> {
25        let mut input = self.collect::<Vec<_>>();
26        input.sort_unstable();
27        input.dedup();
28        input.into_iter().map(ToOwned::to_owned)
29    }
30}
31
32impl<'a> AwsBuilderInstrument<'a> for GetItemFluentBuilder {
33    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
34        let table_name = self.get_table_name().clone().unwrap_or_default();
35        let attributes = attributes![
36            self.get_consistent_read()
37                .as_attribute(semconv::AWS_DYNAMODB_CONSISTENT_READ),
38            self.get_projection_expression()
39                .as_attribute(semconv::AWS_DYNAMODB_PROJECTION),
40        ];
41        DynamodbSpanBuilder::get_item(table_name).attributes(attributes)
42    }
43}
44impl InstrumentedFluentBuilderOutput for GetItemOutput {}
45instrument_aws_operation!(aws_sdk_dynamodb::operation::get_item);
46
47impl<'a> AwsBuilderInstrument<'a> for GetResourcePolicyFluentBuilder {
48    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
49        let table_name = self.get_resource_arn().clone().unwrap_or_default();
50        DynamodbSpanBuilder::get_resource_policy(table_name)
51    }
52}
53impl InstrumentedFluentBuilderOutput for GetResourcePolicyOutput {}
54instrument_aws_operation!(aws_sdk_dynamodb::operation::get_resource_policy);
55
56impl<'a> AwsBuilderInstrument<'a> for PutItemFluentBuilder {
57    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
58        let table_name = self.get_table_name().clone().unwrap_or_default();
59        DynamodbSpanBuilder::put_item(table_name)
60    }
61}
62impl InstrumentedFluentBuilderOutput for PutItemOutput {}
63instrument_aws_operation!(aws_sdk_dynamodb::operation::put_item);
64
65impl<'a> AwsBuilderInstrument<'a> for PutResourcePolicyFluentBuilder {
66    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
67        let table_name = self.get_resource_arn().clone().unwrap_or_default();
68        DynamodbSpanBuilder::put_resource_policy(table_name)
69    }
70}
71impl InstrumentedFluentBuilderOutput for PutResourcePolicyOutput {}
72instrument_aws_operation!(aws_sdk_dynamodb::operation::put_resource_policy);
73
74impl<'a> AwsBuilderInstrument<'a> for UpdateItemFluentBuilder {
75    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
76        let table_name = self.get_table_name().clone().unwrap_or_default();
77        DynamodbSpanBuilder::update_item(table_name)
78    }
79}
80impl InstrumentedFluentBuilderOutput for UpdateItemOutput {}
81instrument_aws_operation!(aws_sdk_dynamodb::operation::update_item);
82
83impl<'a> AwsBuilderInstrument<'a> for DeleteItemFluentBuilder {
84    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
85        let table_name = self.get_table_name().clone().unwrap_or_default();
86        DynamodbSpanBuilder::delete_item(table_name)
87    }
88}
89impl InstrumentedFluentBuilderOutput for DeleteItemOutput {}
90instrument_aws_operation!(aws_sdk_dynamodb::operation::delete_item);
91
92impl<'a> AwsBuilderInstrument<'a> for DeleteResourcePolicyFluentBuilder {
93    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
94        let table_name = self.get_resource_arn().clone().unwrap_or_default();
95        DynamodbSpanBuilder::delete_resource_policy(table_name)
96    }
97}
98impl InstrumentedFluentBuilderOutput for DeleteResourcePolicyOutput {}
99instrument_aws_operation!(aws_sdk_dynamodb::operation::delete_resource_policy);
100
101impl<'a> AwsBuilderInstrument<'a> for QueryFluentBuilder {
102    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
103        let table_name = self.get_table_name().clone().unwrap_or_default();
104        let attributes = attributes![
105            self.get_attributes_to_get()
106                .as_attribute(semconv::AWS_DYNAMODB_ATTRIBUTES_TO_GET),
107            self.get_consistent_read()
108                .as_attribute(semconv::AWS_DYNAMODB_CONSISTENT_READ),
109            self.get_index_name()
110                .as_attribute(semconv::AWS_DYNAMODB_INDEX_NAME),
111            self.get_limit().as_attribute(semconv::AWS_DYNAMODB_LIMIT),
112            self.get_projection_expression()
113                .as_attribute(semconv::AWS_DYNAMODB_PROJECTION),
114            self.get_scan_index_forward()
115                .as_attribute(semconv::AWS_DYNAMODB_SCAN_FORWARD),
116            self.get_select().as_attribute(semconv::AWS_DYNAMODB_SELECT),
117        ];
118        DynamodbSpanBuilder::query(table_name).attributes(attributes)
119    }
120}
121impl InstrumentedFluentBuilderOutput for QueryOutput {
122    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
123        [
124            KeyValue::new(semconv::AWS_DYNAMODB_COUNT, self.count() as i64),
125            KeyValue::new(
126                semconv::AWS_DYNAMODB_SCANNED_COUNT,
127                self.scanned_count() as i64,
128            ),
129        ]
130    }
131}
132instrument_aws_operation!(aws_sdk_dynamodb::operation::query);
133
134impl<'a> AwsBuilderInstrument<'a> for ScanFluentBuilder {
135    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
136        let table_name = self.get_table_name().clone().unwrap_or_default();
137        let attributes = attributes![
138            self.get_attributes_to_get()
139                .as_attribute(semconv::AWS_DYNAMODB_ATTRIBUTES_TO_GET),
140            self.get_consistent_read()
141                .as_attribute(semconv::AWS_DYNAMODB_CONSISTENT_READ),
142            self.get_index_name()
143                .as_attribute(semconv::AWS_DYNAMODB_INDEX_NAME),
144            self.get_limit().as_attribute(semconv::AWS_DYNAMODB_LIMIT),
145            self.get_projection_expression()
146                .as_attribute(semconv::AWS_DYNAMODB_PROJECTION),
147            self.get_select().as_attribute(semconv::AWS_DYNAMODB_SELECT),
148            self.get_segment()
149                .as_attribute(semconv::AWS_DYNAMODB_SEGMENT),
150            self.get_total_segments()
151                .as_attribute(semconv::AWS_DYNAMODB_TOTAL_SEGMENTS),
152        ];
153        DynamodbSpanBuilder::scan(table_name).attributes(attributes)
154    }
155}
156impl InstrumentedFluentBuilderOutput for ScanOutput {
157    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
158        [
159            KeyValue::new(semconv::AWS_DYNAMODB_COUNT, self.count() as i64),
160            KeyValue::new(
161                semconv::AWS_DYNAMODB_SCANNED_COUNT,
162                self.scanned_count() as i64,
163            ),
164        ]
165    }
166}
167instrument_aws_operation!(aws_sdk_dynamodb::operation::scan);
168
169impl<'a> AwsBuilderInstrument<'a> for BatchGetItemFluentBuilder {
170    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
171        let table_names = self
172            .get_request_items()
173            .iter()
174            .flat_map(|items| items.keys())
175            .map(ToOwned::to_owned);
176        let attributes = attributes![
177            self.get_request_items()
178                .as_ref()
179                .map(|items| items.len())
180                .as_attribute(semconv::DB_OPERATION_BATCH_SIZE)
181        ];
182        DynamodbSpanBuilder::batch_get_item(table_names).attributes(attributes)
183    }
184}
185impl InstrumentedFluentBuilderOutput for BatchGetItemOutput {}
186instrument_aws_operation!(aws_sdk_dynamodb::operation::batch_get_item);
187
188impl<'a> AwsBuilderInstrument<'a> for BatchWriteItemFluentBuilder {
189    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
190        let table_names = self
191            .get_request_items()
192            .iter()
193            .flat_map(|items| items.keys())
194            .map(ToOwned::to_owned);
195        let attributes = attributes![
196            self.get_request_items()
197                .as_ref()
198                .map(|items| items.len())
199                .as_attribute(semconv::DB_OPERATION_BATCH_SIZE)
200        ];
201        DynamodbSpanBuilder::batch_write_item(table_names).attributes(attributes)
202    }
203}
204impl InstrumentedFluentBuilderOutput for BatchWriteItemOutput {}
205instrument_aws_operation!(aws_sdk_dynamodb::operation::batch_write_item);
206
207impl<'a> AwsBuilderInstrument<'a> for TransactGetItemsFluentBuilder {
208    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
209        let table_names = self
210            .get_transact_items()
211            .iter()
212            .flatten()
213            .flat_map(|item| item.get().map(|op| op.table_name()))
214            .uniq_owned();
215        DynamodbSpanBuilder::transact_get_items(table_names)
216    }
217}
218impl InstrumentedFluentBuilderOutput for TransactGetItemsOutput {}
219instrument_aws_operation!(aws_sdk_dynamodb::operation::transact_get_items);
220
221impl<'a> AwsBuilderInstrument<'a> for TransactWriteItemsFluentBuilder {
222    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
223        let table_names = self
224            .get_transact_items()
225            .iter()
226            .flatten()
227            .flat_map(|item| {
228                [
229                    item.condition_check().map(|op| op.table_name()),
230                    item.put().map(|op| op.table_name()),
231                    item.delete().map(|op| op.table_name()),
232                    item.update().map(|op| op.table_name()),
233                ]
234            })
235            .flatten()
236            .uniq_owned();
237        DynamodbSpanBuilder::transact_write_items(table_names)
238    }
239}
240impl InstrumentedFluentBuilderOutput for TransactWriteItemsOutput {}
241instrument_aws_operation!(aws_sdk_dynamodb::operation::transact_write_items);
242
243// Table management operations
244impl<'a> AwsBuilderInstrument<'a> for CreateTableFluentBuilder {
245    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
246        let table_name = self.get_table_name().clone().unwrap_or_default();
247        let throughput = self.get_provisioned_throughput().as_ref();
248        let attributes = attributes![
249            throughput
250                .map(|pt| pt.read_capacity_units())
251                .as_attribute(semconv::AWS_DYNAMODB_PROVISIONED_READ_CAPACITY),
252            throughput
253                .map(|pt| pt.write_capacity_units())
254                .as_attribute(semconv::AWS_DYNAMODB_PROVISIONED_WRITE_CAPACITY),
255        ];
256        DynamodbSpanBuilder::create_table(table_name).attributes(attributes)
257    }
258}
259impl InstrumentedFluentBuilderOutput for CreateTableOutput {}
260instrument_aws_operation!(aws_sdk_dynamodb::operation::create_table);
261
262impl<'a> AwsBuilderInstrument<'a> for DeleteTableFluentBuilder {
263    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
264        let table_name = self.get_table_name().clone().unwrap_or_default();
265        DynamodbSpanBuilder::delete_table(table_name)
266    }
267}
268impl InstrumentedFluentBuilderOutput for DeleteTableOutput {}
269instrument_aws_operation!(aws_sdk_dynamodb::operation::delete_table);
270
271impl<'a> AwsBuilderInstrument<'a> for DescribeTableFluentBuilder {
272    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
273        let table_name = self.get_table_name().clone().unwrap_or_default();
274        DynamodbSpanBuilder::describe_table(table_name)
275    }
276}
277impl InstrumentedFluentBuilderOutput for DescribeTableOutput {}
278instrument_aws_operation!(aws_sdk_dynamodb::operation::describe_table);
279
280impl<'a> AwsBuilderInstrument<'a> for UpdateTableFluentBuilder {
281    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
282        let table_name = self.get_table_name().clone().unwrap_or_default();
283        let throughput = self.get_provisioned_throughput().as_ref();
284        let attributes = attributes![
285            throughput
286                .map(|pt| pt.read_capacity_units())
287                .as_attribute(semconv::AWS_DYNAMODB_PROVISIONED_READ_CAPACITY),
288            throughput
289                .map(|pt| pt.write_capacity_units())
290                .as_attribute(semconv::AWS_DYNAMODB_PROVISIONED_WRITE_CAPACITY),
291        ];
292        DynamodbSpanBuilder::update_table(table_name).attributes(attributes)
293    }
294}
295impl InstrumentedFluentBuilderOutput for UpdateTableOutput {}
296instrument_aws_operation!(aws_sdk_dynamodb::operation::update_table);
297
298impl<'a> AwsBuilderInstrument<'a> for ListTablesFluentBuilder {
299    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
300        let attributes = attributes![
301            self.get_exclusive_start_table_name()
302                .as_attribute(semconv::AWS_DYNAMODB_EXCLUSIVE_START_TABLE),
303            self.get_limit().as_attribute(semconv::AWS_DYNAMODB_LIMIT),
304        ];
305        DynamodbSpanBuilder::list_tables().attributes(attributes)
306    }
307}
308impl InstrumentedFluentBuilderOutput for ListTablesOutput {}
309instrument_aws_operation!(aws_sdk_dynamodb::operation::list_tables);
310
311// Backup operations
312impl<'a> AwsBuilderInstrument<'a> for CreateBackupFluentBuilder {
313    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
314        let table_name = self.get_table_name().clone().unwrap_or_default();
315        DynamodbSpanBuilder::create_backup(table_name)
316    }
317}
318impl InstrumentedFluentBuilderOutput for CreateBackupOutput {}
319instrument_aws_operation!(aws_sdk_dynamodb::operation::create_backup);
320
321impl<'a> AwsBuilderInstrument<'a> for DeleteBackupFluentBuilder {
322    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
323        DynamodbSpanBuilder::delete_backup()
324    }
325}
326impl InstrumentedFluentBuilderOutput for DeleteBackupOutput {}
327instrument_aws_operation!(aws_sdk_dynamodb::operation::delete_backup);
328
329impl<'a> AwsBuilderInstrument<'a> for DescribeBackupFluentBuilder {
330    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
331        DynamodbSpanBuilder::describe_backup()
332    }
333}
334impl InstrumentedFluentBuilderOutput for DescribeBackupOutput {}
335instrument_aws_operation!(aws_sdk_dynamodb::operation::describe_backup);
336
337impl<'a> AwsBuilderInstrument<'a> for ListBackupsFluentBuilder {
338    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
339        let table_name = self.get_table_name().clone().unwrap_or_default();
340        DynamodbSpanBuilder::list_backups(table_name)
341    }
342}
343impl InstrumentedFluentBuilderOutput for ListBackupsOutput {}
344instrument_aws_operation!(aws_sdk_dynamodb::operation::list_backups);
345
346impl<'a> AwsBuilderInstrument<'a> for RestoreTableFromBackupFluentBuilder {
347    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
348        let target_table_name = self.get_target_table_name().clone().unwrap_or_default();
349        DynamodbSpanBuilder::restore_table_from_backup(target_table_name)
350    }
351}
352impl InstrumentedFluentBuilderOutput for RestoreTableFromBackupOutput {}
353instrument_aws_operation!(aws_sdk_dynamodb::operation::restore_table_from_backup);
354
355impl<'a> AwsBuilderInstrument<'a> for RestoreTableToPointInTimeFluentBuilder {
356    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
357        let target_table_name = self.get_target_table_name().clone().unwrap_or_default();
358        DynamodbSpanBuilder::restore_table_to_point_in_time(target_table_name)
359    }
360}
361impl InstrumentedFluentBuilderOutput for RestoreTableToPointInTimeOutput {}
362instrument_aws_operation!(aws_sdk_dynamodb::operation::restore_table_to_point_in_time);
363
364// PartiQL operations
365impl<'a> AwsBuilderInstrument<'a> for ExecuteStatementFluentBuilder {
366    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
367        let table = self
368            .get_statement()
369            .as_deref()
370            .map(TableReference::from)
371            .unwrap_or_default();
372
373        let attributes = attributes![
374            table.index_name(),
375            self.get_consistent_read()
376                .as_attribute(semconv::AWS_DYNAMODB_CONSISTENT_READ),
377            self.get_limit().as_attribute(semconv::AWS_DYNAMODB_LIMIT),
378        ];
379
380        DynamodbSpanBuilder::execute_statement(table.name.to_owned())
381            .attributes(attributes)
382    }
383}
384impl InstrumentedFluentBuilderOutput for ExecuteStatementOutput {
385    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
386        attributes![self.items().len().as_attribute(semconv::AWS_DYNAMODB_COUNT)]
387    }
388}
389instrument_aws_operation!(aws_sdk_dynamodb::operation::execute_statement);
390
391impl<'a> AwsBuilderInstrument<'a> for BatchExecuteStatementFluentBuilder {
392    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
393        let table_names = self
394            .get_statements()
395            .iter()
396            .flatten()
397            .map(|op| TableReference::from(op.statement()).name)
398            .uniq_owned();
399
400        let attributes = attributes![
401            self.get_statements()
402                .as_ref()
403                .map(|statements| statements.len())
404                .as_attribute(semconv::DB_OPERATION_BATCH_SIZE)
405        ];
406
407        DynamodbSpanBuilder::batch_execute_statement(table_names).attributes(attributes)
408    }
409}
410impl InstrumentedFluentBuilderOutput for BatchExecuteStatementOutput {
411    fn extract_attributes(&self) -> impl IntoIterator<Item = KeyValue> {
412        let errors = self
413            .responses()
414            .iter()
415            .filter_map(|resp| resp.error())
416            .count();
417        attributes![errors.as_attribute("db.operation.batch.errors")]
418    }
419}
420instrument_aws_operation!(aws_sdk_dynamodb::operation::batch_execute_statement);
421
422impl<'a> AwsBuilderInstrument<'a> for ExecuteTransactionFluentBuilder {
423    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
424        let table_names = self
425            .get_transact_statements()
426            .iter()
427            .flatten()
428            .map(|t| TableReference::from(t.statement()).name)
429            .uniq_owned();
430
431        let attributes = attributes![
432            self.get_transact_statements()
433                .as_ref()
434                .map(|statements| statements.len())
435                .as_attribute(semconv::DB_OPERATION_BATCH_SIZE)
436        ];
437
438        DynamodbSpanBuilder::execute_transaction(table_names).attributes(attributes)
439    }
440}
441impl InstrumentedFluentBuilderOutput for ExecuteTransactionOutput {}
442instrument_aws_operation!(aws_sdk_dynamodb::operation::execute_transaction);
443
444// Additional global operations
445impl<'a> AwsBuilderInstrument<'a> for DescribeEndpointsFluentBuilder {
446    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
447        DynamodbSpanBuilder::describe_endpoints()
448    }
449}
450impl InstrumentedFluentBuilderOutput for DescribeEndpointsOutput {}
451instrument_aws_operation!(aws_sdk_dynamodb::operation::describe_endpoints);
452
453impl<'a> AwsBuilderInstrument<'a> for DescribeLimitsFluentBuilder {
454    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
455        DynamodbSpanBuilder::describe_limits()
456    }
457}
458impl InstrumentedFluentBuilderOutput for DescribeLimitsOutput {}
459instrument_aws_operation!(aws_sdk_dynamodb::operation::describe_limits);
460
461impl<'a> AwsBuilderInstrument<'a> for ListGlobalTablesFluentBuilder {
462    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
463        let attributes = attributes![
464            self.get_exclusive_start_global_table_name()
465                .as_attribute(semconv::AWS_DYNAMODB_EXCLUSIVE_START_TABLE),
466            self.get_limit().as_attribute(semconv::AWS_DYNAMODB_LIMIT),
467            self.get_region_name().as_attribute(semconv::CLOUD_REGION),
468        ];
469        DynamodbSpanBuilder::list_global_tables().attributes(attributes)
470    }
471}
472impl InstrumentedFluentBuilderOutput for ListGlobalTablesOutput {}
473instrument_aws_operation!(aws_sdk_dynamodb::operation::list_global_tables);
474
475// Import/Export operations
476impl<'a> AwsBuilderInstrument<'a> for DescribeExportFluentBuilder {
477    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
478        DynamodbSpanBuilder::describe_export()
479    }
480}
481impl InstrumentedFluentBuilderOutput for DescribeExportOutput {}
482instrument_aws_operation!(aws_sdk_dynamodb::operation::describe_export);
483
484impl<'a> AwsBuilderInstrument<'a> for DescribeImportFluentBuilder {
485    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
486        DynamodbSpanBuilder::describe_import()
487    }
488}
489impl InstrumentedFluentBuilderOutput for DescribeImportOutput {}
490instrument_aws_operation!(aws_sdk_dynamodb::operation::describe_import);
491
492impl<'a> AwsBuilderInstrument<'a> for ImportTableFluentBuilder {
493    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
494        let table_name = self
495            .get_table_creation_parameters()
496            .as_ref()
497            .map(|p| p.table_name())
498            .map(ToOwned::to_owned)
499            .unwrap_or_default();
500        DynamodbSpanBuilder::import_table(table_name)
501    }
502}
503impl InstrumentedFluentBuilderOutput for ImportTableOutput {}
504instrument_aws_operation!(aws_sdk_dynamodb::operation::import_table);
505
506impl<'a> AwsBuilderInstrument<'a> for ExportTableToPointInTimeFluentBuilder {
507    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
508        let table_arn = self.get_table_arn().clone().unwrap_or_default();
509        DynamodbSpanBuilder::export_table_to_point_in_time(table_arn)
510    }
511}
512impl InstrumentedFluentBuilderOutput for ExportTableToPointInTimeOutput {}
513instrument_aws_operation!(aws_sdk_dynamodb::operation::export_table_to_point_in_time);
514
515impl<'a> AwsBuilderInstrument<'a> for ListExportsFluentBuilder {
516    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
517        let table_arn = self.get_table_arn().clone().unwrap_or_default();
518        let attributes = attributes![
519            self.get_max_results()
520                .as_attribute(semconv::AWS_DYNAMODB_LIMIT)
521        ];
522        DynamodbSpanBuilder::list_exports(table_arn).attributes(attributes)
523    }
524}
525impl InstrumentedFluentBuilderOutput for ListExportsOutput {}
526instrument_aws_operation!(aws_sdk_dynamodb::operation::list_exports);
527
528impl<'a> AwsBuilderInstrument<'a> for ListImportsFluentBuilder {
529    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
530        let table_arn = self.get_table_arn().clone().unwrap_or_default();
531        let attributes = attributes![
532            self.get_page_size()
533                .as_attribute(semconv::AWS_DYNAMODB_LIMIT)
534        ];
535        DynamodbSpanBuilder::list_imports(table_arn).attributes(attributes)
536    }
537}
538impl InstrumentedFluentBuilderOutput for ListImportsOutput {}
539instrument_aws_operation!(aws_sdk_dynamodb::operation::list_imports);
540
541// Global table operations
542impl<'a> AwsBuilderInstrument<'a> for CreateGlobalTableFluentBuilder {
543    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
544        let global_table_name = self.get_global_table_name().clone().unwrap_or_default();
545        DynamodbSpanBuilder::create_global_table(global_table_name)
546    }
547}
548impl InstrumentedFluentBuilderOutput for CreateGlobalTableOutput {}
549instrument_aws_operation!(aws_sdk_dynamodb::operation::create_global_table);
550
551impl<'a> AwsBuilderInstrument<'a> for DescribeGlobalTableFluentBuilder {
552    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
553        let global_table_name = self.get_global_table_name().clone().unwrap_or_default();
554        DynamodbSpanBuilder::describe_global_table(global_table_name)
555    }
556}
557impl InstrumentedFluentBuilderOutput for DescribeGlobalTableOutput {}
558instrument_aws_operation!(aws_sdk_dynamodb::operation::describe_global_table);
559
560impl<'a> AwsBuilderInstrument<'a> for DescribeGlobalTableSettingsFluentBuilder {
561    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
562        let global_table_name = self.get_global_table_name().clone().unwrap_or_default();
563        DynamodbSpanBuilder::describe_global_table_settings(global_table_name)
564    }
565}
566impl InstrumentedFluentBuilderOutput for DescribeGlobalTableSettingsOutput {}
567instrument_aws_operation!(aws_sdk_dynamodb::operation::describe_global_table_settings);
568
569impl<'a> AwsBuilderInstrument<'a> for UpdateGlobalTableFluentBuilder {
570    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
571        let global_table_name = self.get_global_table_name().clone().unwrap_or_default();
572        DynamodbSpanBuilder::update_global_table(global_table_name)
573    }
574}
575impl InstrumentedFluentBuilderOutput for UpdateGlobalTableOutput {}
576instrument_aws_operation!(aws_sdk_dynamodb::operation::update_global_table);
577
578impl<'a> AwsBuilderInstrument<'a> for UpdateGlobalTableSettingsFluentBuilder {
579    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
580        let global_table_name = self.get_global_table_name().clone().unwrap_or_default();
581        DynamodbSpanBuilder::update_global_table_settings(global_table_name)
582    }
583}
584impl InstrumentedFluentBuilderOutput for UpdateGlobalTableSettingsOutput {}
585instrument_aws_operation!(aws_sdk_dynamodb::operation::update_global_table_settings);
586
587// Additional table management operations
588impl<'a> AwsBuilderInstrument<'a> for DescribeContinuousBackupsFluentBuilder {
589    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
590        let table_name = self.get_table_name().clone().unwrap_or_default();
591        DynamodbSpanBuilder::describe_continuous_backups(table_name)
592    }
593}
594impl InstrumentedFluentBuilderOutput for DescribeContinuousBackupsOutput {}
595instrument_aws_operation!(aws_sdk_dynamodb::operation::describe_continuous_backups);
596
597impl<'a> AwsBuilderInstrument<'a> for UpdateContinuousBackupsFluentBuilder {
598    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
599        let table_name = self.get_table_name().clone().unwrap_or_default();
600        DynamodbSpanBuilder::update_continuous_backups(table_name)
601    }
602}
603impl InstrumentedFluentBuilderOutput for UpdateContinuousBackupsOutput {}
604instrument_aws_operation!(aws_sdk_dynamodb::operation::update_continuous_backups);
605
606impl<'a> AwsBuilderInstrument<'a> for DescribeTimeToLiveFluentBuilder {
607    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
608        let table_name = self.get_table_name().clone().unwrap_or_default();
609        DynamodbSpanBuilder::describe_time_to_live(table_name)
610    }
611}
612impl InstrumentedFluentBuilderOutput for DescribeTimeToLiveOutput {}
613instrument_aws_operation!(aws_sdk_dynamodb::operation::describe_time_to_live);
614
615impl<'a> AwsBuilderInstrument<'a> for UpdateTimeToLiveFluentBuilder {
616    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
617        let table_name = self.get_table_name().clone().unwrap_or_default();
618        DynamodbSpanBuilder::update_time_to_live(table_name)
619    }
620}
621impl InstrumentedFluentBuilderOutput for UpdateTimeToLiveOutput {}
622instrument_aws_operation!(aws_sdk_dynamodb::operation::update_time_to_live);
623
624impl<'a> AwsBuilderInstrument<'a> for DescribeTableReplicaAutoScalingFluentBuilder {
625    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
626        let table_name = self.get_table_name().clone().unwrap_or_default();
627        DynamodbSpanBuilder::describe_table_replica_auto_scaling(table_name)
628    }
629}
630impl InstrumentedFluentBuilderOutput for DescribeTableReplicaAutoScalingOutput {}
631instrument_aws_operation!(
632    aws_sdk_dynamodb::operation::describe_table_replica_auto_scaling
633);
634
635impl<'a> AwsBuilderInstrument<'a> for UpdateTableReplicaAutoScalingFluentBuilder {
636    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
637        let table_name = self.get_table_name().clone().unwrap_or_default();
638        DynamodbSpanBuilder::update_table_replica_auto_scaling(table_name)
639    }
640}
641impl InstrumentedFluentBuilderOutput for UpdateTableReplicaAutoScalingOutput {}
642instrument_aws_operation!(aws_sdk_dynamodb::operation::update_table_replica_auto_scaling);
643
644// Kinesis streaming operations
645impl<'a> AwsBuilderInstrument<'a> for DescribeKinesisStreamingDestinationFluentBuilder {
646    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
647        let table_name = self.get_table_name().clone().unwrap_or_default();
648        DynamodbSpanBuilder::describe_kinesis_streaming_destination(table_name)
649    }
650}
651impl InstrumentedFluentBuilderOutput for DescribeKinesisStreamingDestinationOutput {}
652instrument_aws_operation!(
653    aws_sdk_dynamodb::operation::describe_kinesis_streaming_destination
654);
655
656impl<'a> AwsBuilderInstrument<'a> for EnableKinesisStreamingDestinationFluentBuilder {
657    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
658        let table_name = self.get_table_name().clone().unwrap_or_default();
659        DynamodbSpanBuilder::enable_kinesis_streaming_destination(table_name)
660    }
661}
662impl InstrumentedFluentBuilderOutput for EnableKinesisStreamingDestinationOutput {}
663instrument_aws_operation!(
664    aws_sdk_dynamodb::operation::enable_kinesis_streaming_destination
665);
666
667impl<'a> AwsBuilderInstrument<'a> for DisableKinesisStreamingDestinationFluentBuilder {
668    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
669        let table_name = self.get_table_name().clone().unwrap_or_default();
670        DynamodbSpanBuilder::disable_kinesis_streaming_destination(table_name)
671    }
672}
673impl InstrumentedFluentBuilderOutput for DisableKinesisStreamingDestinationOutput {}
674instrument_aws_operation!(
675    aws_sdk_dynamodb::operation::disable_kinesis_streaming_destination
676);
677
678impl<'a> AwsBuilderInstrument<'a> for UpdateKinesisStreamingDestinationFluentBuilder {
679    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
680        let table_name = self.get_table_name().clone().unwrap_or_default();
681        DynamodbSpanBuilder::update_kinesis_streaming_destination(table_name)
682    }
683}
684impl InstrumentedFluentBuilderOutput for UpdateKinesisStreamingDestinationOutput {}
685instrument_aws_operation!(
686    aws_sdk_dynamodb::operation::update_kinesis_streaming_destination
687);
688
689// Contributor insights operations
690impl<'a> AwsBuilderInstrument<'a> for DescribeContributorInsightsFluentBuilder {
691    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
692        let table_name = self.get_table_name().clone().unwrap_or_default();
693        let attributes = attributes![
694            self.get_index_name()
695                .as_attribute(semconv::AWS_DYNAMODB_INDEX_NAME)
696        ];
697        DynamodbSpanBuilder::describe_contributor_insights(table_name)
698            .attributes(attributes)
699    }
700}
701impl InstrumentedFluentBuilderOutput for DescribeContributorInsightsOutput {}
702instrument_aws_operation!(aws_sdk_dynamodb::operation::describe_contributor_insights);
703
704impl<'a> AwsBuilderInstrument<'a> for ListContributorInsightsFluentBuilder {
705    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
706        let table_name = self.get_table_name().clone().unwrap_or_default();
707        let attributes = attributes![
708            self.get_max_results()
709                .as_attribute(semconv::AWS_DYNAMODB_LIMIT)
710        ];
711        DynamodbSpanBuilder::list_contributor_insights(table_name).attributes(attributes)
712    }
713}
714impl InstrumentedFluentBuilderOutput for ListContributorInsightsOutput {}
715instrument_aws_operation!(aws_sdk_dynamodb::operation::list_contributor_insights);
716
717impl<'a> AwsBuilderInstrument<'a> for UpdateContributorInsightsFluentBuilder {
718    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
719        let table_name = self.get_table_name().clone().unwrap_or_default();
720        let attributes = attributes![
721            self.get_index_name()
722                .as_attribute(semconv::AWS_DYNAMODB_INDEX_NAME)
723        ];
724        DynamodbSpanBuilder::update_contributor_insights(table_name)
725            .attributes(attributes)
726    }
727}
728impl InstrumentedFluentBuilderOutput for UpdateContributorInsightsOutput {}
729instrument_aws_operation!(aws_sdk_dynamodb::operation::update_contributor_insights);
730
731// Resource tagging operations
732impl<'a> AwsBuilderInstrument<'a> for ListTagsOfResourceFluentBuilder {
733    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
734        let resource_arn = self.get_resource_arn().clone().unwrap_or_default();
735        DynamodbSpanBuilder::list_tags_of_resource(resource_arn)
736    }
737}
738impl InstrumentedFluentBuilderOutput for ListTagsOfResourceOutput {}
739instrument_aws_operation!(aws_sdk_dynamodb::operation::list_tags_of_resource);
740
741impl<'a> AwsBuilderInstrument<'a> for TagResourceFluentBuilder {
742    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
743        let resource_arn = self.get_resource_arn().clone().unwrap_or_default();
744        DynamodbSpanBuilder::tag_resource(resource_arn)
745    }
746}
747impl InstrumentedFluentBuilderOutput for TagResourceOutput {}
748instrument_aws_operation!(aws_sdk_dynamodb::operation::tag_resource);
749
750impl<'a> AwsBuilderInstrument<'a> for UntagResourceFluentBuilder {
751    fn build_aws_span(&self) -> AwsSpanBuilder<'a> {
752        let resource_arn = self.get_resource_arn().clone().unwrap_or_default();
753        DynamodbSpanBuilder::untag_resource(resource_arn)
754    }
755}
756impl InstrumentedFluentBuilderOutput for UntagResourceOutput {}
757instrument_aws_operation!(aws_sdk_dynamodb::operation::untag_resource);