@@ -8,7 +8,7 @@ use futures::stream::StreamExt;
88use hyper:: { Body , Request } ;
99use metrics:: { counter, describe_histogram, histogram, Unit } ;
1010use serde:: { Deserialize , Serialize } ;
11- use tracing:: instrument;
11+ use tracing:: { error , instrument} ;
1212use url:: Url ;
1313
1414use crate :: addresses:: Address ;
@@ -160,11 +160,49 @@ async fn street_addresses_impl(
160160 Ok ( unpack_vec ( resps, requests. len ( ) , |resp| resp. input_index ) ?)
161161 } else {
162162 // This error was reported by the remote server.
163+
164+ // Add error to metrics.
163165 counter ! ( "geocodecsv.selected_errors.count" , 1 , "component" => "smarty" , "cause" => status. to_string( ) ) ;
166+
167+ // Log information about bad street fields, if we can.
168+ if status == 422 {
169+ if let Ok ( error_response) =
170+ serde_json:: from_slice :: < SmartyErrorResponse > ( & body_data)
171+ {
172+ let mut missing_street = false ;
173+ for error in error_response. errors {
174+ if error. name == "us-street-api:query-missing-street" {
175+ missing_street = true ;
176+ break ;
177+ }
178+ }
179+ if missing_street {
180+ let streets = requests
181+ . iter ( )
182+ . map ( |req| req. address . street . to_owned ( ) )
183+ . collect :: < Vec < _ > > ( ) ;
184+ error ! ( "At least one missing street in: {:?}" , streets) ;
185+ }
186+ }
187+ }
188+
189+ // Convert to a Rust error.
164190 Err ( format_err ! (
165191 "geocoding error: {}\n {}" ,
166192 status,
167193 String :: from_utf8_lossy( & body_data) ,
168194 ) )
169195 }
170196}
197+
198+ /// Smarty error response body.
199+ #[ derive( Debug , Deserialize ) ]
200+ struct SmartyErrorResponse {
201+ errors : Vec < SmartyError > ,
202+ }
203+
204+ /// Smarty error.
205+ #[ derive( Debug , Deserialize ) ]
206+ struct SmartyError {
207+ name : String ,
208+ }
0 commit comments