11use crate :: channel:: get_data_channel_map_from_env;
22use crate :: prometheus:: {
3- create_metric_server, InflightMetricLabels , TotalMetricLabels , WebMetrics ,
3+ create_metric_server, InflightMetricLabels , RequestDurationLabels , TotalMetricLabels , WebMetrics ,
44} ;
55use crate :: record_stream:: {
66 get_data_channel_topic_map_from_env, KafkaRecordStream , KafkaRecordStreamConfig , RecordStream ,
77} ;
88use crate :: star:: { parse_message, AppSTARError } ;
99use crate :: util:: parse_env_var;
10- use actix_web:: HttpRequest ;
1110use actix_web:: {
1211 dev:: Service ,
1312 error:: ResponseError ,
@@ -17,6 +16,7 @@ use actix_web::{
1716 web:: { self , Data } ,
1817 App , HttpResponse , HttpServer , Responder ,
1918} ;
19+ use actix_web:: { HttpMessage , HttpRequest } ;
2020use base64:: { engine:: general_purpose as base64_engine, Engine as _} ;
2121use derive_more:: { Display , Error , From } ;
2222use futures:: { future:: try_join, FutureExt } ;
@@ -58,6 +58,8 @@ pub struct ServerState {
5858 pub request_threshold_range : RangeInclusive < usize > ,
5959}
6060
61+ struct EpochExt ( u8 ) ;
62+
6163impl ResponseError for WebError {
6264 fn error_response ( & self ) -> HttpResponse {
6365 HttpResponse :: build ( self . status_code ( ) )
@@ -106,7 +108,7 @@ async fn handle_measurement_submit(
106108 Some ( rec_stream) => {
107109 let body_str = from_utf8 ( & body) ?. trim ( ) ;
108110 let bincode_msg = base64_engine:: STANDARD . decode ( body_str) ?;
109- parse_message ( & bincode_msg) ?;
111+ let message = parse_message ( & bincode_msg) ?;
110112
111113 if let Some ( min_revision) = state. min_revision_map . get ( channel_name) {
112114 let req_revision: usize =
@@ -128,7 +130,11 @@ async fn handle_measurement_submit(
128130 error ! ( "Failed to push message: {}" , e) ;
129131 Err ( WebError :: Internal )
130132 }
131- Ok ( _) => Ok ( HttpResponse :: NoContent ( ) . finish ( ) ) ,
133+ Ok ( _) => {
134+ let mut response = HttpResponse :: NoContent ( ) ;
135+ response. extensions_mut ( ) . insert ( EpochExt ( message. epoch ) ) ;
136+ Ok ( response. finish ( ) )
137+ }
132138 }
133139 }
134140 }
@@ -219,14 +225,24 @@ pub async fn start_server(worker_count: usize, main_channel: String) -> std::io:
219225 let start_time = Instant :: now ( ) ;
220226
221227 srv. call ( request) . map ( move |result| {
222- let status_code = match result. as_ref ( ) {
223- Ok ( response) => response. status ( ) ,
224- Err ( err) => err. as_response_error ( ) . status_code ( ) ,
228+ let ( epoch, status_code) = match result. as_ref ( ) {
229+ Ok ( response) => (
230+ response
231+ . response ( )
232+ . extensions ( )
233+ . get :: < EpochExt > ( )
234+ . map ( |ext| ext. 0 ) ,
235+ response. status ( ) ,
236+ ) ,
237+ Err ( err) => ( None , err. as_response_error ( ) . status_code ( ) ) ,
225238 } ;
226- let total_metric_labels = TotalMetricLabels :: from ( ( & inflight_metric_labels, status_code) ) ;
239+ let total_metric_labels =
240+ TotalMetricLabels :: new ( & inflight_metric_labels, status_code, epoch) ;
241+ let duration_labels = RequestDurationLabels :: new ( & inflight_metric_labels, status_code) ;
227242 web_metrics. request_end (
228243 & inflight_metric_labels,
229244 & total_metric_labels,
245+ & duration_labels,
230246 start_time. elapsed ( ) ,
231247 ) ;
232248
0 commit comments