From 875ff08922eab1d8715dfd98f3f9ccc87e32faa7 Mon Sep 17 00:00:00 2001 From: Leonid Ryzhyk Date: Sun, 18 Jan 2026 14:16:04 -0700 Subject: [PATCH] [adapters] Add `verbose` config setting for delta. The new `verbose` flag can be used to log detailed progress at the INFO level for a specific connector. Currently we only log add/delete actions in follow and cdc modes. Signed-off-by: Leonid Ryzhyk --- .../src/integrated/delta_table/input.rs | 25 +++++++++++++++++++ .../src/transport/delta_table.rs | 13 +++++++++- openapi.json | 6 +++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/crates/adapters/src/integrated/delta_table/input.rs b/crates/adapters/src/integrated/delta_table/input.rs index c16761faaf..7d778a8714 100644 --- a/crates/adapters/src/integrated/delta_table/input.rs +++ b/crates/adapters/src/integrated/delta_table/input.rs @@ -1625,6 +1625,31 @@ impl DeltaTableInputEndpointInner { input_stream: &mut dyn ArrowStream, receiver: &mut Receiver, ) { + if self.config.verbose > 0 { + // Don't log actions we ignore to limit spurious logging. E.g., delta lake + // optimization passes can generate thousand of noop actions. + let data_change_actions = actions + .iter() + .filter(|action| match action { + Action::Add(add) if add.data_change => true, + Action::Remove(remove) if remove.data_change => true, + _ => false, + }) + .collect::>(); + info!( + "delta_table {}: log entry for table version {new_version}: {data_change_actions:?}{}", + &self.endpoint_name, + if actions.len() > data_change_actions.len() { + format!( + " ({} other actions)", + actions.len() - data_change_actions.len() + ) + } else { + "".to_string() + } + ); + } + // Use the time when we _started_ reading transaction data as the ingestion timestamp. let timestamp = Utc::now(); diff --git a/crates/feldera-types/src/transport/delta_table.rs b/crates/feldera-types/src/transport/delta_table.rs index 12cce1e325..20505aaedc 100644 --- a/crates/feldera-types/src/transport/delta_table.rs +++ b/crates/feldera-types/src/transport/delta_table.rs @@ -296,6 +296,17 @@ pub struct DeltaTableReaderConfig { /// The default value is 6. pub max_concurrent_readers: Option, + /// Enable verbose logging. + /// + /// When enabled, the connector will log detailed information at INFO level. + /// + /// Supported values: + /// * 0 - no verbose logging + /// * 1 - log all Delta log entries in follow and cdc modes. + /// * >1 - reserved for future use + #[serde(default)] + pub verbose: u32, + /// Storage options for configuring backend object store. /// /// For specific options available for different storage backends, see: @@ -324,7 +335,7 @@ fn test_delta_reader_config_serde() { let config = serde_json::from_str::(config_str).unwrap(); let serialized_config = serde_json::to_string(&config).unwrap(); - let expected = r#"{"uri":"protocol:/path/to/somewhere","mode":"follow","transaction_mode":"none","timestamp_column":"ts","filter":null,"skip_unused_columns":false,"snapshot_filter":"ts BETWEEN '2005-01-01 00:00:00' AND '2010-12-31 23:59:59'","version":null,"datetime":"2010-12-31 00:00:00Z","end_version":null,"cdc_delete_filter":null,"cdc_order_by":null,"num_parsers":4,"max_concurrent_readers":null,"customoption1":"val1","customoption2":"val2"}"#; + let expected = r#"{"uri":"protocol:/path/to/somewhere","mode":"follow","transaction_mode":"none","timestamp_column":"ts","filter":null,"skip_unused_columns":false,"snapshot_filter":"ts BETWEEN '2005-01-01 00:00:00' AND '2010-12-31 23:59:59'","version":null,"datetime":"2010-12-31 00:00:00Z","end_version":null,"cdc_delete_filter":null,"cdc_order_by":null,"num_parsers":4,"max_concurrent_readers":null,"customoption1":"val1","customoption2":"val2","verbose":0}"#; assert_eq!( serde_json::from_str::(&serialized_config).unwrap(), serde_json::from_str::(expected).unwrap() diff --git a/openapi.json b/openapi.json index df3503dcdd..82ff1d4513 100644 --- a/openapi.json +++ b/openapi.json @@ -7431,6 +7431,12 @@ "type": "string", "description": "Table URI.\n\nExample: \"s3://feldera-fraud-detection-data/demographics_train\"" }, + "verbose": { + "type": "integer", + "format": "int32", + "description": "Enable verbose logging.\n\nWhen enabled, the connector will log detailed information at INFO level.\n\nSupported values:\n* 0 - no verbose logging\n* 1 - log all Delta log entries in follow and cdc modes.\n* >1 - reserved for future use", + "minimum": 0 + }, "version": { "type": "integer", "format": "int64",