@@ -23,7 +23,7 @@ use crate::alerts::Alerts;
2323use crate :: handlers:: TIME_PARTITION_KEY ;
2424use crate :: metadata:: STREAM_INFO ;
2525use crate :: option:: CONFIG ;
26- use crate :: storage:: { retention:: Retention , LogStream , StorageDir } ;
26+ use crate :: storage:: { retention:: Retention , LogStream , StorageDir , StreamInfo } ;
2727use crate :: { catalog, event, stats} ;
2828use crate :: { metadata, validator} ;
2929use actix_web:: http:: StatusCode ;
@@ -288,17 +288,10 @@ pub async fn get_stats(req: HttpRequest) -> Result<impl Responder, StreamError>
288288 let stats = stats:: get_current_stats ( & stream_name, "json" )
289289 . ok_or ( StreamError :: StreamNotFound ( stream_name. clone ( ) ) ) ?;
290290
291- let hash_map = STREAM_INFO . read ( ) . unwrap ( ) ;
292- let stream_meta = & hash_map
293- . get ( & stream_name)
294- . ok_or ( StreamError :: StreamNotFound ( stream_name. clone ( ) ) ) ?;
295-
296291 let time = Utc :: now ( ) ;
297292
298293 let stats = serde_json:: json!( {
299294 "stream" : stream_name,
300- "creation_time" : & stream_meta. created_at,
301- "first_event_at" : Some ( & stream_meta. first_event_at) ,
302295 "time" : time,
303296 "ingestion" : {
304297 "count" : stats. events,
@@ -366,6 +359,41 @@ pub async fn create_stream(
366359 Ok ( ( ) )
367360}
368361
362+ pub async fn get_stream_info ( req : HttpRequest ) -> Result < impl Responder , StreamError > {
363+ let stream_name: String = req. match_info ( ) . get ( "logstream" ) . unwrap ( ) . parse ( ) . unwrap ( ) ;
364+ if !metadata:: STREAM_INFO . stream_exists ( & stream_name) {
365+ return Err ( StreamError :: StreamNotFound ( stream_name) ) ;
366+ }
367+
368+ if first_event_at_empty ( & stream_name) {
369+ let store = CONFIG . storage ( ) . get_object_store ( ) ;
370+ if let Ok ( Some ( first_event_at) ) = catalog:: get_first_event ( store, & stream_name) . await {
371+ if let Err ( err) =
372+ metadata:: STREAM_INFO . set_first_event_at ( & stream_name, Some ( first_event_at) )
373+ {
374+ log:: error!(
375+ "Failed to update first_event_at in streaminfo for stream {:?} {err:?}" ,
376+ stream_name
377+ ) ;
378+ }
379+ }
380+ }
381+
382+ let hash_map = STREAM_INFO . read ( ) . unwrap ( ) ;
383+ let stream_meta = & hash_map
384+ . get ( & stream_name)
385+ . ok_or ( StreamError :: StreamNotFound ( stream_name. clone ( ) ) ) ?;
386+
387+ let stream_info: StreamInfo = StreamInfo {
388+ created_at : stream_meta. created_at . clone ( ) ,
389+ first_event_at : stream_meta. first_event_at . clone ( ) ,
390+ time_partition : stream_meta. time_partition . clone ( ) ,
391+ cache_enabled : stream_meta. cache_enabled ,
392+ } ;
393+
394+ Ok ( ( web:: Json ( stream_info) , StatusCode :: OK ) )
395+ }
396+
369397pub mod error {
370398
371399 use actix_web:: http:: header:: ContentType ;
0 commit comments