Logger System 0.1.3
High-performance C++20 thread-safe logging system with asynchronous capabilities
Loading...
Searching...
No Matches
monitoring_integration_example.cpp File Reference

Advanced monitoring integration example for Phase 4. More...

#include <kcenon/logger/core/logger_builder.h>
#include <kcenon/common/interfaces/logger_interface.h>
#include <kcenon/common/interfaces/monitoring_interface.h>
#include <iostream>
#include <memory>
#include <vector>
#include <thread>
#include <chrono>
#include <iomanip>
#include <mutex>
#include <unordered_map>
Include dependency graph for monitoring_integration_example.cpp:

Go to the source code of this file.

Classes

class  aggregating_monitor
 Aggregating monitor that collects metrics from multiple sources. More...
 

Functions

void print_metrics_snapshot (const ci::metrics_snapshot &snapshot)
 Print metrics snapshot in formatted way.
 
void print_health_result (const ci::health_check_result &health)
 Print health check result.
 
void example_1_basic_integration ()
 Example 1: Basic monitor integration with logger.
 
void example_2_multiple_loggers ()
 Example 2: Multiple loggers with single monitor.
 
void example_3_imonitorable_interface ()
 Example 3: Demonstrating IMonitorable interface.
 
void example_4_monitoring_system_simulation ()
 Example 4: Simulating monitoring_system integration.
 
int main ()
 

Detailed Description

Advanced monitoring integration example for Phase 4.

Definition in file monitoring_integration_example.cpp.

Function Documentation

◆ example_1_basic_integration()

void example_1_basic_integration ( )

Example 1: Basic monitor integration with logger.

Examples
monitoring_integration_example.cpp.

Definition at line 199 of file monitoring_integration_example.cpp.

199 {
200 std::cout << "\n=== Example 1: Basic Monitor Integration ===" << std::endl;
201
202 auto monitor = std::make_shared<aggregating_monitor>();
203
204 auto logger_result = logger_builder()
205 .with_async(false)
206 .with_monitoring(monitor)
207 .build();
208
209 if (!logger_result) {
210 std::cerr << "Failed to create logger" << std::endl;
211 return;
212 }
213
214 auto logger_instance = std::shared_ptr<logger>(std::move(logger_result.value()));
215
216 // Register logger as monitored component
217 // TODO: Implement IMonitorable interface on logger class (Phase 2.2)
218 // Currently logger doesn't inherit from IMonitorable
219 // monitor->register_component(std::static_pointer_cast<ci::IMonitorable>(logger_instance));
220 std::cout << "[Note: logger IMonitorable integration pending Phase 2.2]" << std::endl;
221
222 // Perform logging operations
223 for (int i = 0; i < 5; ++i) {
224 logger_instance->log(ci::log_level::info,
225 "Log message " + std::to_string(i + 1));
226 }
227
228 // Get aggregated metrics
229 auto metrics = monitor->get_metrics();
230 if (kcenon::common::is_ok(metrics)) {
232 }
233
234 // Check aggregated health
235 auto health = monitor->check_health();
236 if (kcenon::common::is_ok(health)) {
238 }
239}
Builder pattern for logger construction with validation.
logger_builder & with_monitoring(std::shared_ptr< common::interfaces::IMonitor > monitor)
Set monitoring interface (Phase 2.2.4)
logger_builder & with_async(bool async=true)
result< std::unique_ptr< logger > > build()
void print_health_result(const ci::health_check_result &health)
Print health check result.
void print_metrics_snapshot(const ci::metrics_snapshot &snapshot)
Print metrics snapshot in formatted way.
bool is_ok(const Result< T > &result)
T & get_value(Result< T > &result)

References kcenon::logger::logger_builder::build(), kcenon::common::get_value(), kcenon::common::is_ok(), print_health_result(), print_metrics_snapshot(), kcenon::logger::logger_builder::with_async(), and kcenon::logger::logger_builder::with_monitoring().

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ example_2_multiple_loggers()

void example_2_multiple_loggers ( )

Example 2: Multiple loggers with single monitor.

Examples
monitoring_integration_example.cpp.

Definition at line 244 of file monitoring_integration_example.cpp.

244 {
245 std::cout << "\n=== Example 2: Multiple Loggers, Single Monitor ===" << std::endl;
246
247 auto monitor = std::make_shared<aggregating_monitor>();
248
249 // Create multiple logger instances
250 auto logger1_result = logger_builder()
251 .with_async(false)
252 .with_monitoring(monitor)
253 .build();
254
255 auto logger2_result = logger_builder()
256 .with_async(false)
257 .with_monitoring(monitor)
258 .build();
259
260 if (!logger1_result || !logger2_result) {
261 std::cerr << "Failed to create loggers" << std::endl;
262 return;
263 }
264
265 auto logger1 = std::shared_ptr<logger>(std::move(logger1_result.value()));
266 auto logger2 = std::shared_ptr<logger>(std::move(logger2_result.value()));
267
268 // Register both loggers
269 // TODO: Implement IMonitorable interface on logger class (Phase 2.2)
270 // monitor->register_component(std::static_pointer_cast<ci::IMonitorable>(logger1));
271 // monitor->register_component(std::static_pointer_cast<ci::IMonitorable>(logger2));
272 std::cout << "[Note: logger IMonitorable integration pending Phase 2.2]" << std::endl;
273
274 // Both loggers use the same monitor
275 logger1->log(ci::log_level::info, std::string("Message from logger 1"));
276 logger2->log(ci::log_level::warning, std::string("Message from logger 2"));
277 logger1->log(ci::log_level::error, std::string("Error from logger 1"));
278
279 std::cout << "\nMonitor tracks " << monitor->get_component_count()
280 << " components" << std::endl;
281
282 // Get combined metrics
283 auto metrics = monitor->get_metrics();
284 if (kcenon::common::is_ok(metrics)) {
285 std::cout << "Combined metrics from all loggers:" << std::endl;
287 }
288}

References kcenon::logger::logger_builder::build(), kcenon::common::get_value(), kcenon::common::is_ok(), print_metrics_snapshot(), kcenon::logger::logger_builder::with_async(), and kcenon::logger::logger_builder::with_monitoring().

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ example_3_imonitorable_interface()

void example_3_imonitorable_interface ( )

Example 3: Demonstrating IMonitorable interface.

Examples
monitoring_integration_example.cpp.

Definition at line 293 of file monitoring_integration_example.cpp.

293 {
294 std::cout << "\n=== Example 3: IMonitorable Interface ===" << std::endl;
295
296 auto monitor = std::make_shared<aggregating_monitor>();
297
298 auto logger_result = logger_builder()
299 .with_async(false)
300 .with_monitoring(monitor)
301 .build();
302
303 if (!logger_result) return;
304
305 auto logger_instance = std::shared_ptr<logger>(std::move(logger_result.value()));
306
307 // Cast to IMonitorable to demonstrate interface usage
308 if (auto monitorable = std::dynamic_pointer_cast<ci::IMonitorable>(logger_instance)) {
309 std::cout << "Logger component name: "
310 << monitorable->get_component_name() << std::endl;
311
312 // Perform operations
313 logger_instance->log(ci::log_level::info, std::string("Test message 1"));
314 logger_instance->log(ci::log_level::info, std::string("Test message 2"));
315
316 // Get monitoring data directly from logger
317 auto data = monitorable->get_monitoring_data();
318 if (kcenon::common::is_ok(data)) {
319 std::cout << "\nDirect monitoring data from logger:" << std::endl;
321 }
322
323 // Health check directly from logger
324 auto health = monitorable->health_check();
325 if (kcenon::common::is_ok(health)) {
326 std::cout << "\nDirect health check from logger:" << std::endl;
328 }
329 }
330}

References kcenon::logger::logger_builder::build(), kcenon::common::get_value(), kcenon::common::is_ok(), print_health_result(), print_metrics_snapshot(), kcenon::logger::logger_builder::with_async(), and kcenon::logger::logger_builder::with_monitoring().

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ example_4_monitoring_system_simulation()

void example_4_monitoring_system_simulation ( )

Example 4: Simulating monitoring_system integration.

Examples
monitoring_integration_example.cpp.

Definition at line 335 of file monitoring_integration_example.cpp.

335 {
336 std::cout << "\n=== Example 4: Monitoring System Integration Simulation ===" << std::endl;
337 std::cout << "Note: This demonstrates how logger_system and monitoring_system" << std::endl;
338 std::cout << " interact via interfaces without circular dependencies" << std::endl;
339
340 // Simulate monitoring_system providing a monitor
341 std::shared_ptr<ci::IMonitor> monitor = std::make_shared<aggregating_monitor>();
342
343 // Logger receives monitor through DI
344 auto logger_result = logger_builder()
345 .with_async(true) // Async mode for realistic scenario
346 .with_monitoring(monitor)
347 .build();
348
349 if (!logger_result) return;
350
351 auto logger_instance = std::shared_ptr<logger>(std::move(logger_result.value()));
352
353 std::cout << "\nPhase 1: Logger operates and reports to monitor" << std::endl;
354
355 // Simulate application activity
356 for (int i = 0; i < 10; ++i) {
357 logger_instance->log(ci::log_level::info,
358 "Application event " + std::to_string(i + 1));
359 std::this_thread::sleep_for(std::chrono::milliseconds(100));
360 }
361
362 // Give async logger time to flush
363 std::this_thread::sleep_for(std::chrono::milliseconds(500));
364
365 std::cout << "\nPhase 2: Monitoring system queries metrics" << std::endl;
366
367 // Monitoring system can query the monitor
368 auto metrics = monitor->get_metrics();
369 if (kcenon::common::is_ok(metrics)) {
370 std::cout << "Monitoring system received metrics:" << std::endl;
372 }
373
374 // Monitoring system can check logger health through IMonitorable
375 if (auto monitorable = std::dynamic_pointer_cast<ci::IMonitorable>(logger_instance)) {
376 auto health = monitorable->health_check();
377 if (kcenon::common::is_ok(health)) {
378 std::cout << "\nLogger health status:" << std::endl;
380 }
381 }
382
383 std::cout << "\n✓ Integration successful without circular dependencies" << std::endl;
384}

References kcenon::logger::logger_builder::build(), kcenon::common::get_value(), kcenon::common::is_ok(), print_health_result(), print_metrics_snapshot(), kcenon::logger::logger_builder::with_async(), and kcenon::logger::logger_builder::with_monitoring().

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ main()

int main ( )

Definition at line 386 of file monitoring_integration_example.cpp.

386 {
387 std::cout << "============================================================" << std::endl;
388 std::cout << "Logger-Monitor Integration Examples (Phase 4)" << std::endl;
389 std::cout << "Demonstrating loose coupling via common_system interfaces" << std::endl;
390 std::cout << "============================================================" << std::endl;
391
392 try {
397
398 std::cout << "\n============================================================" << std::endl;
399 std::cout << "All integration examples completed successfully!" << std::endl;
400 std::cout << "============================================================" << std::endl;
401
402 } catch (const std::exception& e) {
403 std::cerr << "Error: " << e.what() << std::endl;
404 return 1;
405 }
406
407 return 0;
408}
void example_3_imonitorable_interface()
Example 3: Demonstrating IMonitorable interface.
void example_2_multiple_loggers()
Example 2: Multiple loggers with single monitor.
void example_1_basic_integration()
Example 1: Basic monitor integration with logger.
void example_4_monitoring_system_simulation()
Example 4: Simulating monitoring_system integration.

References example_1_basic_integration(), example_2_multiple_loggers(), example_3_imonitorable_interface(), and example_4_monitoring_system_simulation().

Here is the call graph for this function:

◆ print_health_result()

void print_health_result ( const ci::health_check_result & health)

Print health check result.

Examples
monitoring_integration_example.cpp.

Definition at line 177 of file monitoring_integration_example.cpp.

177 {
178 std::cout << "\n--- Health Check ---" << std::endl;
179 std::cout << "Status: " << ci::to_string(health.status) << std::endl;
180 std::cout << "Message: " << health.message << std::endl;
181
182 if (!health.metadata.empty()) {
183 std::cout << "Component Status:" << std::endl;
184 for (const auto& [key, value] : health.metadata) {
185 if (key.rfind("component_status:", 0) == 0) {
186 std::cout << " - " << key.substr(std::string("component_status:").size())
187 << ": " << value << std::endl;
188 }
189 }
190 }
191
192 std::cout << "Check duration: "
193 << health.check_duration.count() << "ms" << std::endl;
194}
@ size
Rotate based on file size only.

References kcenon::logger::size.

Referenced by example_1_basic_integration(), example_3_imonitorable_interface(), and example_4_monitoring_system_simulation().

Here is the caller graph for this function:

◆ print_metrics_snapshot()

void print_metrics_snapshot ( const ci::metrics_snapshot & snapshot)

Print metrics snapshot in formatted way.

Examples
monitoring_integration_example.cpp.

Definition at line 160 of file monitoring_integration_example.cpp.

160 {
161 std::cout << "\n--- Metrics Snapshot ---" << std::endl;
162 std::cout << "Source: " << snapshot.source_id << std::endl;
163 std::cout << "Captured at: "
164 << std::chrono::system_clock::to_time_t(snapshot.capture_time)
165 << std::endl;
166 std::cout << "Metrics:" << std::endl;
167
168 for (const auto& metric : snapshot.metrics) {
169 std::cout << " " << std::setw(30) << std::left << metric.name
170 << ": " << metric.value << std::endl;
171 }
172}

Referenced by example_1_basic_integration(), example_2_multiple_loggers(), example_3_imonitorable_interface(), and example_4_monitoring_system_simulation().

Here is the caller graph for this function: