@@ -82,6 +82,7 @@ struct MetricIds {
8282 verification_success : u32 ,
8383 verification_failure : u32 ,
8484 sidecar_call_total : u32 ,
85+ sidecar_latency_ms : u32 ,
8586}
8687
8788impl Default for PluginConfig {
@@ -177,7 +178,15 @@ impl RootContext for SensorVerificationRoot {
177178 MetricType :: Counter ,
178179 "wasm_filter_sidecar_call_total"
179180 ) . unwrap_or ( 0 ) ;
180- proxy_wasm:: hostcalls:: log ( LogLevel :: Info , "WASM metrics defined" ) ;
181+ self . metrics . sidecar_latency_ms = proxy_wasm:: hostcalls:: define_metric (
182+ MetricType :: Histogram ,
183+ "wasm_filter_sidecar_latency_ms"
184+ ) . unwrap_or ( 0 ) ;
185+ proxy_wasm:: hostcalls:: log ( LogLevel :: Info , & format ! (
186+ "WASM metrics defined: request_total={}, success={}, failure={}, sidecar_call={}, latency={}" ,
187+ self . metrics. request_total, self . metrics. verification_success, self . metrics. verification_failure,
188+ self . metrics. sidecar_call_total, self . metrics. sidecar_latency_ms
189+ ) ) ;
181190
182191 true
183192 }
@@ -195,6 +204,7 @@ impl RootContext for SensorVerificationRoot {
195204 sensor_latitude : None ,
196205 sensor_longitude : None ,
197206 sensor_accuracy : None ,
207+ sidecar_call_start_ms : None ,
198208 } ) )
199209 }
200210
@@ -215,6 +225,7 @@ struct SensorVerificationFilter {
215225 sensor_latitude : Option < f64 > ,
216226 sensor_longitude : Option < f64 > ,
217227 sensor_accuracy : Option < f64 > ,
228+ sidecar_call_start_ms : Option < u64 > ,
218229}
219230
220231impl Context for SensorVerificationFilter {
@@ -227,6 +238,15 @@ impl Context for SensorVerificationFilter {
227238
228239 // Get response body
229240 let body_result = self . get_http_call_response_body ( 0 , body_size) ;
241+
242+ // Record latency (Task 18: Observability)
243+ if let Some ( start_time) = self . sidecar_call_start_ms {
244+ let now = self . get_current_time ( ) . duration_since ( std:: time:: UNIX_EPOCH ) . unwrap_or_default ( ) . as_millis ( ) as u64 ;
245+ let latency = now. saturating_sub ( start_time) ;
246+ let _ = proxy_wasm:: hostcalls:: record_metric ( self . metrics . sidecar_latency_ms , latency) ;
247+ proxy_wasm:: hostcalls:: log ( LogLevel :: Debug , & format ! ( "Recorded sidecar latency: {}ms" , latency) ) ;
248+ }
249+
230250 let body = match body_result {
231251 Some ( b) => b,
232252 None => {
@@ -317,6 +337,10 @@ impl Context for SensorVerificationFilter {
317337
318338impl HttpContext for SensorVerificationFilter {
319339 fn on_http_request_headers ( & mut self , _num_headers : usize , _end_of_stream : bool ) -> Action {
340+ // Increment request total (Task 18: Observability)
341+ let _ = proxy_wasm:: hostcalls:: increment_metric ( self . metrics . request_total , 1 ) ;
342+ proxy_wasm:: hostcalls:: log ( LogLevel :: Debug , & format ! ( "Incremented request_total (ID: {})" , self . metrics. request_total) ) ;
343+
320344 // Get certificate chain from x-forwarded-client-cert header (set by forward_client_cert_details in Envoy)
321345 // Format: "By=...;Cert=\"...\";Chain=\"...\";Subject=...;URI=..."
322346 // The Unified Identity extension is in the agent SVID (second certificate in chain)
@@ -485,6 +509,10 @@ impl HttpContext for SensorVerificationFilter {
485509 Duration :: from_secs ( 5 ) ,
486510 ) {
487511 Ok ( _) => {
512+ // Record start time and increment sidecar call count (Task 18: Observability)
513+ self . sidecar_call_start_ms = Some ( self . get_current_time ( ) . duration_since ( std:: time:: UNIX_EPOCH ) . unwrap_or_default ( ) . as_millis ( ) as u64 ) ;
514+ let _ = proxy_wasm:: hostcalls:: increment_metric ( self . metrics . sidecar_call_total , 1 ) ;
515+
488516 proxy_wasm:: hostcalls:: log ( LogLevel :: Info , & format ! (
489517 "Mobile sensor (sensor_id={}): verification_mode={}, skip_cache={} - dispatched sidecar call" ,
490518 sensor_id, mode_str, skip_cache
0 commit comments