def test_batch_log_processor_fork(self): # pylint: disable=invalid-name exporter = InMemoryLogExporter() log_processor = BatchLogProcessor( exporter, max_export_batch_size=64, schedule_delay_millis=10, ) provider = LogEmitterProvider() provider.add_log_processor(log_processor) emitter = provider.get_log_emitter(__name__) logger = logging.getLogger("test-fork") logger.addHandler(OTLPHandler(log_emitter=emitter)) logger.critical("yolo") time.sleep(0.5) # give some time for the exporter to upload self.assertTrue(log_processor.force_flush()) self.assertEqual(len(exporter.get_finished_logs()), 1) exporter.clear() multiprocessing.set_start_method("fork") def child(conn): def _target(): logger.critical("Critical message child") self.run_with_many_threads(_target, 100) time.sleep(0.5) logs = exporter.get_finished_logs() conn.send(len(logs) == 100) conn.close() parent_conn, child_conn = multiprocessing.Pipe() p = multiprocessing.Process(target=child, args=(child_conn,)) p.start() self.assertTrue(parent_conn.recv()) p.join() log_processor.shutdown()
def test_simple_log_processor_trace_correlation(self): exporter = InMemoryLogExporter() log_emitter_provider = LogEmitterProvider() log_emitter = log_emitter_provider.get_log_emitter("name", "version") log_emitter_provider.add_log_processor(SimpleLogProcessor(exporter)) logger = logging.getLogger("trace_correlation") logger.addHandler(OTLPHandler(log_emitter=log_emitter)) logger.warning("Warning message") finished_logs = exporter.get_finished_logs() self.assertEqual(len(finished_logs), 1) log_record = finished_logs[0].log_record self.assertEqual(log_record.body, "Warning message") self.assertEqual(log_record.severity_text, "WARNING") self.assertEqual(log_record.severity_number, SeverityNumber.WARN) self.assertEqual(log_record.trace_id, INVALID_SPAN_CONTEXT.trace_id) self.assertEqual(log_record.span_id, INVALID_SPAN_CONTEXT.span_id) self.assertEqual( log_record.trace_flags, INVALID_SPAN_CONTEXT.trace_flags ) exporter.clear() tracer = trace.TracerProvider().get_tracer(__name__) with tracer.start_as_current_span("test") as span: logger.critical("Critical message within span") finished_logs = exporter.get_finished_logs() log_record = finished_logs[0].log_record self.assertEqual(log_record.body, "Critical message within span") self.assertEqual(log_record.severity_text, "CRITICAL") self.assertEqual(log_record.severity_number, SeverityNumber.FATAL) span_context = span.get_span_context() self.assertEqual(log_record.trace_id, span_context.trace_id) self.assertEqual(log_record.span_id, span_context.span_id) self.assertEqual(log_record.trace_flags, span_context.trace_flags)
def test_simple_log_processor_shutdown(self): exporter = InMemoryLogExporter() log_emitter_provider = LogEmitterProvider() log_emitter = log_emitter_provider.get_log_emitter(__name__) log_emitter_provider.add_log_processor(SimpleLogProcessor(exporter)) logger = logging.getLogger("shutdown") logger.addHandler(OTLPHandler(log_emitter=log_emitter)) logger.warning("Something is wrong") finished_logs = exporter.get_finished_logs() self.assertEqual(len(finished_logs), 1) warning_log_record = finished_logs[0].log_record self.assertEqual(warning_log_record.body, "Something is wrong") self.assertEqual(warning_log_record.severity_text, "WARNING") self.assertEqual( warning_log_record.severity_number, SeverityNumber.WARN ) exporter.clear() log_emitter_provider.shutdown() logger.warning("Log after shutdown") finished_logs = exporter.get_finished_logs() self.assertEqual(len(finished_logs), 0)