1818#include < components/manager.hpp>
1919#include < components/manager_config.hpp>
2020#include < engine/task/task_processor.hpp>
21+ #include < logging/tp_logger_utils.hpp>
2122
2223USERVER_NAMESPACE_BEGIN
2324
@@ -96,6 +97,21 @@ ComponentContextImpl::ComponentContextImpl(const Manager& manager, std::vector<s
9697 UINVARIANT (success, " Duplicate component names" );
9798 }
9899
100+ if (!manager_.GetConfig ().boot_log_path .empty ()) {
101+ logging::LoggerConfig config;
102+ config.logger_name = " boot" ;
103+ config.file_path = manager_.GetConfig ().boot_log_path ;
104+ config.level = logging::Level::kTrace ;
105+ config.format = logging::Format::kJson ;
106+ config.truncate_on_start = true ;
107+ config.queue_overflow_behavior = logging::QueueOverflowBehavior::kBlock ;
108+
109+ boot_logger_ = logging::impl::MakeTpLogger (config);
110+ }
111+
112+ LOG_DEBUG () << " Starting component system" ;
113+ EmitBootEvent (Event::kComponentSystemIsStarting );
114+
99115 StartPrintAddingComponentsTask ();
100116}
101117
@@ -104,6 +120,9 @@ RawComponentBase* ComponentContextImpl::AddComponent(
104120 const ComponentConfig& config,
105121 const ComponentAdderBase& adder
106122) {
123+ LOG_DEBUG () << " Starting component " << name;
124+ EmitBootEvent (Event::kStarting , {{" component_name" , name}});
125+
107126 auto & component_info = GetComponentInfo (*this , name);
108127 const LoadingComponentScope loading_component_scope (*this , component_info);
109128
@@ -125,6 +144,10 @@ RawComponentBase* ComponentContextImpl::AddComponent(
125144 << fmt::format (" \" {0}\" [label=\" {0}\n {1}\" ]; " , name, compiler::GetTypeName (typeid (*component)))
126145 << component_info.GetDependencies ();
127146 }
147+
148+ LOG_DEBUG () << " Started component " << name;
149+ EmitBootEvent (Event::kStarted , {{" component_name" , name}});
150+
128151 return component;
129152}
130153
@@ -143,6 +166,9 @@ void ComponentContextImpl::OnAllComponentsLoaded() {
143166
144167 // In case no exception flies out, the service is fully loaded at this point.
145168 service_lifetime_stage_ = ServiceLifetimeStage::kRunning ;
169+
170+ LOG_INFO () << " All components loaded" ;
171+ EmitBootEvent (Event::kComponentSystemIsStarted );
146172}
147173
148174void ComponentContextImpl::OnGracefulShutdownStarted () {
@@ -372,6 +398,14 @@ void ComponentContextImpl::ProcessSingleComponentLifetimeStageSwitching(
372398 }
373399
374400 LOG_DEBUG () << " Call " << params.stage_switch_handler_name << " for component '" << name << " '" ;
401+ EmitBootEvent (
402+ Event::kSwitching ,
403+ {
404+ {" component_name" , name},
405+ {" stage_switch_handler_name" , params.stage_switch_handler_name },
406+ }
407+ );
408+
375409 (component_info.*params.stage_switch_handler )();
376410 } catch (const impl::StageSwitchingCancelledException& ex) {
377411 LOG_WARNING () << params.stage_switch_handler_name << " failed for component '" << name << " ': " << ex;
@@ -442,6 +476,13 @@ RawComponentBase* ComponentContextImpl::DoFindComponent(std::string_view name, C
442476 LOG_DEBUG ()
443477 << " Component '" << name << " ' is not loaded yet, component '" << current_component.GetName ()
444478 << " ' is waiting for it to load" ;
479+ EmitBootEvent (
480+ Event::kWaitingForComponent ,
481+ {
482+ {" component_name" , current_component.GetName ()},
483+ {" dependency_name" , name},
484+ }
485+ );
445486
446487 const SearchingComponentScope finder (*this , current_component);
447488
@@ -456,6 +497,14 @@ void ComponentContextImpl::AddDependency(ComponentInfo& dependency, ComponentInf
456497 }
457498
458499 LOG_DEBUG () << " Resolving dependency " << current_component.GetName () << " -> " << dependency.GetName ();
500+ EmitBootEvent (
501+ Event::kFindComponent ,
502+ {
503+ {" component_name" , current_component.GetName ()},
504+ {" dependency_name" , dependency.GetName ()},
505+ }
506+ );
507+
459508 CheckForDependencyCycle (current_component, dependency, *data);
460509
461510 current_component.AddItDependsOn (dependency);
@@ -522,6 +571,7 @@ void ComponentContextImpl::PrepareComponentLifetimeStageSwitching() {
522571}
523572
524573void ComponentContextImpl::CancelComponentLifetimeStageSwitching () {
574+ EmitBootEvent (Event::kLoadingIsCancelled );
525575 for (auto & component_item : components_) {
526576 component_item->SetStageSwitchingCancelled (true );
527577 }
@@ -580,6 +630,41 @@ void ComponentContextImpl::PrintAddingComponents() const {
580630 trace_plugin_.PrintStacksByComponentNames (ExtractNamesFromInfo (busy_components));
581631}
582632
633+ std::string_view ComponentContextImpl::ToString (Event event)
634+ {
635+ switch (event) {
636+ case Event::kComponentSystemIsStarting :
637+ return " component_system_is_starting" ;
638+ case Event::kStarting :
639+ return " component_is_starting" ;
640+ case Event::kStarted :
641+ return " component_is_created" ;
642+ case Event::kComponentSystemIsStarted :
643+ return " component_system_is_started" ;
644+ case Event::kLoadingIsCancelled :
645+ return " loading_is_cancelled" ;
646+ case Event::kSwitching :
647+ return " component_is_switching_stage" ;
648+ case Event::kWaitingForComponent :
649+ return " waiting_for_component" ;
650+ case Event::kFindComponent :
651+ return " find_component" ;
652+ }
653+ }
654+
655+ void ComponentContextImpl::EmitBootEvent (Event event, logging::LogExtra log_extra) const {
656+ if (!boot_logger_) {
657+ return ;
658+ }
659+
660+ log_extra.Extend (" event_type" , std::string{ToString (event)});
661+ LOG_INFO_TO (*boot_logger_) << log_extra;
662+
663+ if (event == Event::kComponentSystemIsStarted ) {
664+ boot_logger_->Flush ();
665+ }
666+ }
667+
583668} // namespace components::impl
584669
585670USERVER_NAMESPACE_END
0 commit comments