@@ -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 ;
@@ -271,34 +271,13 @@ pub async fn get_stats(req: HttpRequest) -> Result<impl Responder, StreamError>
271271 return Err ( StreamError :: StreamNotFound ( stream_name) ) ;
272272 }
273273
274- if first_event_at_empty ( & stream_name) {
275- let store = CONFIG . storage ( ) . get_object_store ( ) ;
276- if let Ok ( Some ( first_event_at) ) = catalog:: get_first_event ( store, & stream_name) . await {
277- if let Err ( err) =
278- metadata:: STREAM_INFO . set_first_event_at ( & stream_name, Some ( first_event_at) )
279- {
280- log:: error!(
281- "Failed to update first_event_at in streaminfo for stream {:?} {err:?}" ,
282- stream_name
283- ) ;
284- }
285- }
286- }
287-
288274 let stats = stats:: get_current_stats ( & stream_name, "json" )
289275 . ok_or ( StreamError :: StreamNotFound ( stream_name. clone ( ) ) ) ?;
290276
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-
296277 let time = Utc :: now ( ) ;
297278
298279 let stats = serde_json:: json!( {
299280 "stream" : stream_name,
300- "creation_time" : & stream_meta. created_at,
301- "first_event_at" : Some ( & stream_meta. first_event_at) ,
302281 "time" : time,
303282 "ingestion" : {
304283 "count" : stats. events,
@@ -366,6 +345,41 @@ pub async fn create_stream(
366345 Ok ( ( ) )
367346}
368347
348+ pub async fn get_stream_info ( req : HttpRequest ) -> Result < impl Responder , StreamError > {
349+ let stream_name: String = req. match_info ( ) . get ( "logstream" ) . unwrap ( ) . parse ( ) . unwrap ( ) ;
350+ if !metadata:: STREAM_INFO . stream_exists ( & stream_name) {
351+ return Err ( StreamError :: StreamNotFound ( stream_name) ) ;
352+ }
353+
354+ if first_event_at_empty ( & stream_name) {
355+ let store = CONFIG . storage ( ) . get_object_store ( ) ;
356+ if let Ok ( Some ( first_event_at) ) = catalog:: get_first_event ( store, & stream_name) . await {
357+ if let Err ( err) =
358+ metadata:: STREAM_INFO . set_first_event_at ( & stream_name, Some ( first_event_at) )
359+ {
360+ log:: error!(
361+ "Failed to update first_event_at in streaminfo for stream {:?} {err:?}" ,
362+ stream_name
363+ ) ;
364+ }
365+ }
366+ }
367+
368+ let hash_map = STREAM_INFO . read ( ) . unwrap ( ) ;
369+ let stream_meta = & hash_map
370+ . get ( & stream_name)
371+ . ok_or ( StreamError :: StreamNotFound ( stream_name. clone ( ) ) ) ?;
372+
373+ let stream_info: StreamInfo = StreamInfo {
374+ created_at : stream_meta. created_at . clone ( ) ,
375+ first_event_at : stream_meta. first_event_at . clone ( ) ,
376+ time_partition : stream_meta. time_partition . clone ( ) ,
377+ cache_enabled : stream_meta. cache_enabled ,
378+ } ;
379+
380+ Ok ( ( web:: Json ( stream_info) , StatusCode :: OK ) )
381+ }
382+
369383pub mod error {
370384
371385 use actix_web:: http:: header:: ContentType ;
0 commit comments