def setUp(self): self.exporter = OTLPLogExporter() self.server = server(ThreadPoolExecutor(max_workers=10)) self.server.add_insecure_port("[::]:4317") self.server.start() self.log_data_1 = LogData( log_record=LogRecord( timestamp=int(time.time() * 1e9), trace_id=2604504634922341076776623263868986797, span_id=5213367945872657620, trace_flags=TraceFlags(0x01), severity_text="WARNING", severity_number=SDKSeverityNumber.WARN, name="name", body="Zhengzhou, We have a heaviest rains in 1000 years", resource=SDKResource({"key": "value"}), attributes={ "a": 1, "b": "c" }, ), instrumentation_info=InstrumentationInfo("first_name", "first_version"), ) self.log_data_2 = LogData( log_record=LogRecord( timestamp=int(time.time() * 1e9), trace_id=2604504634922341076776623263868986799, span_id=5213367945872657623, trace_flags=TraceFlags(0x01), severity_text="INFO", severity_number=SDKSeverityNumber.INFO2, name="info name", body="Sydney, Opera House is closed", resource=SDKResource({"key": "value"}), attributes={"custom_attr": [1, 2, 3]}, ), instrumentation_info=InstrumentationInfo("second_name", "second_version"), ) self.log_data_3 = LogData( log_record=LogRecord( timestamp=int(time.time() * 1e9), trace_id=2604504634922341076776623263868986800, span_id=5213367945872657628, trace_flags=TraceFlags(0x01), severity_text="ERROR", severity_number=SDKSeverityNumber.WARN, name="error name", body="Mumbai, Boil water before drinking", resource=SDKResource({"service": "myapp"}), ), instrumentation_info=InstrumentationInfo("third_name", "third_version"), )
def test_otlp_exporter_endpoint(self, mock_secure, mock_insecure): expected_endpoint = "localhost:4317" endpoints = [ ( "http://localhost:4317", None, mock_insecure, ), ( "localhost:4317", None, mock_insecure, ), ( "localhost:4317", False, mock_secure, ), ( "https://localhost:4317", None, mock_secure, ), ( "https://localhost:4317", True, mock_insecure, ), ] # pylint: disable=C0209 for endpoint, insecure, mock_method in endpoints: OTLPLogExporter(endpoint=endpoint, insecure=insecure) self.assertEqual( 1, mock_method.call_count, "expected {} to be called for {} {}".format( mock_method, endpoint, insecure), ) self.assertEqual( expected_endpoint, mock_method.call_args[0][0], "expected {} got {} {}".format(expected_endpoint, mock_method.call_args[0][0], endpoint), ) mock_method.reset_mock()
class TestOTLPLogExporter(TestCase): def setUp(self): self.exporter = OTLPLogExporter() self.server = server(ThreadPoolExecutor(max_workers=10)) self.server.add_insecure_port("[::]:4317") self.server.start() self.log_data_1 = LogData( log_record=LogRecord( timestamp=int(time.time() * 1e9), trace_id=2604504634922341076776623263868986797, span_id=5213367945872657620, trace_flags=TraceFlags(0x01), severity_text="WARNING", severity_number=SDKSeverityNumber.WARN, name="name", body="Zhengzhou, We have a heaviest rains in 1000 years", resource=SDKResource({"key": "value"}), attributes={ "a": 1, "b": "c" }, ), instrumentation_info=InstrumentationInfo("first_name", "first_version"), ) self.log_data_2 = LogData( log_record=LogRecord( timestamp=int(time.time() * 1e9), trace_id=2604504634922341076776623263868986799, span_id=5213367945872657623, trace_flags=TraceFlags(0x01), severity_text="INFO", severity_number=SDKSeverityNumber.INFO2, name="info name", body="Sydney, Opera House is closed", resource=SDKResource({"key": "value"}), attributes={"custom_attr": [1, 2, 3]}, ), instrumentation_info=InstrumentationInfo("second_name", "second_version"), ) self.log_data_3 = LogData( log_record=LogRecord( timestamp=int(time.time() * 1e9), trace_id=2604504634922341076776623263868986800, span_id=5213367945872657628, trace_flags=TraceFlags(0x01), severity_text="ERROR", severity_number=SDKSeverityNumber.WARN, name="error name", body="Mumbai, Boil water before drinking", resource=SDKResource({"service": "myapp"}), ), instrumentation_info=InstrumentationInfo("third_name", "third_version"), ) def tearDown(self): self.server.stop(None) @patch( "opentelemetry.exporter.otlp.proto.grpc.exporter.ssl_channel_credentials" ) @patch("opentelemetry.exporter.otlp.proto.grpc.exporter.secure_channel") @patch( "opentelemetry.exporter.otlp.proto.grpc._log_exporter.OTLPLogExporter._stub" ) # pylint: disable=unused-argument def test_no_credentials_error(self, mock_ssl_channel, mock_secure, mock_stub): OTLPLogExporter(insecure=False) self.assertTrue(mock_ssl_channel.called) # pylint: disable=no-self-use @patch("opentelemetry.exporter.otlp.proto.grpc.exporter.insecure_channel") @patch("opentelemetry.exporter.otlp.proto.grpc.exporter.secure_channel") def test_otlp_exporter_endpoint(self, mock_secure, mock_insecure): expected_endpoint = "localhost:4317" endpoints = [ ( "http://*****:*****@patch("opentelemetry.exporter.otlp.proto.grpc.exporter.expo") @patch("opentelemetry.exporter.otlp.proto.grpc.exporter.sleep") def test_unavailable(self, mock_sleep, mock_expo): mock_expo.configure_mock(**{"return_value": [1]}) add_LogsServiceServicer_to_server(LogsServiceServicerUNAVAILABLE(), self.server) self.assertEqual(self.exporter.export([self.log_data_1]), LogExportResult.FAILURE) mock_sleep.assert_called_with(1) @patch("opentelemetry.exporter.otlp.proto.grpc.exporter.expo") @patch("opentelemetry.exporter.otlp.proto.grpc.exporter.sleep") def test_unavailable_delay(self, mock_sleep, mock_expo): mock_expo.configure_mock(**{"return_value": [1]}) add_LogsServiceServicer_to_server( LogsServiceServicerUNAVAILABLEDelay(), self.server) self.assertEqual(self.exporter.export([self.log_data_1]), LogExportResult.FAILURE) mock_sleep.assert_called_with(4) def test_success(self): add_LogsServiceServicer_to_server(LogsServiceServicerSUCCESS(), self.server) self.assertEqual(self.exporter.export([self.log_data_1]), LogExportResult.SUCCESS) def test_failure(self): add_LogsServiceServicer_to_server(LogsServiceServicerALREADY_EXISTS(), self.server) self.assertEqual(self.exporter.export([self.log_data_1]), LogExportResult.FAILURE) def test_translate_log_data(self): expected = ExportLogsServiceRequest(resource_logs=[ ResourceLogs( resource=OTLPResource(attributes=[ KeyValue(key="key", value=AnyValue(string_value="value")), ]), instrumentation_library_logs=[ InstrumentationLibraryLogs( instrumentation_library=InstrumentationLibrary( name="first_name", version="first_version"), logs=[ PB2LogRecord( # pylint: disable=no-member name="name", time_unix_nano=self.log_data_1.log_record. timestamp, severity_number=self.log_data_1.log_record. severity_number.value, severity_text="WARNING", span_id=int.to_bytes(5213367945872657620, 8, "big"), trace_id=int.to_bytes( 2604504634922341076776623263868986797, 16, "big", ), body=_translate_value( "Zhengzhou, We have a heaviest rains in 1000 years" ), attributes=[ KeyValue( key="a", value=AnyValue(int_value=1), ), KeyValue( key="b", value=AnyValue(string_value="c"), ), ], flags=int( self.log_data_1.log_record.trace_flags), ) ], ) ], ), ]) # pylint: disable=protected-access self.assertEqual(expected, self.exporter._translate_data([self.log_data_1])) def test_translate_multiple_logs(self): expected = ExportLogsServiceRequest(resource_logs=[ ResourceLogs( resource=OTLPResource(attributes=[ KeyValue(key="key", value=AnyValue(string_value="value")), ]), instrumentation_library_logs=[ InstrumentationLibraryLogs( instrumentation_library=InstrumentationLibrary( name="first_name", version="first_version"), logs=[ PB2LogRecord( # pylint: disable=no-member name="name", time_unix_nano=self.log_data_1.log_record. timestamp, severity_number=self.log_data_1.log_record. severity_number.value, severity_text="WARNING", span_id=int.to_bytes(5213367945872657620, 8, "big"), trace_id=int.to_bytes( 2604504634922341076776623263868986797, 16, "big", ), body=_translate_value( "Zhengzhou, We have a heaviest rains in 1000 years" ), attributes=[ KeyValue( key="a", value=AnyValue(int_value=1), ), KeyValue( key="b", value=AnyValue(string_value="c"), ), ], flags=int( self.log_data_1.log_record.trace_flags), ) ], ), InstrumentationLibraryLogs( instrumentation_library=InstrumentationLibrary( name="second_name", version="second_version"), logs=[ PB2LogRecord( # pylint: disable=no-member name="info name", time_unix_nano=self.log_data_2.log_record. timestamp, severity_number=self.log_data_2.log_record. severity_number.value, severity_text="INFO", span_id=int.to_bytes(5213367945872657623, 8, "big"), trace_id=int.to_bytes( 2604504634922341076776623263868986799, 16, "big", ), body=_translate_value( "Sydney, Opera House is closed"), attributes=[ KeyValue( key="custom_attr", value=_translate_value([1, 2, 3]), ), ], flags=int( self.log_data_2.log_record.trace_flags), ) ], ), ], ), ResourceLogs( resource=OTLPResource(attributes=[ KeyValue( key="service", value=AnyValue(string_value="myapp"), ), ]), instrumentation_library_logs=[ InstrumentationLibraryLogs( instrumentation_library=InstrumentationLibrary( name="third_name", version="third_version"), logs=[ PB2LogRecord( # pylint: disable=no-member name="error name", time_unix_nano=self.log_data_3.log_record. timestamp, severity_number=self.log_data_3.log_record. severity_number.value, severity_text="ERROR", span_id=int.to_bytes(5213367945872657628, 8, "big"), trace_id=int.to_bytes( 2604504634922341076776623263868986800, 16, "big", ), body=_translate_value( "Mumbai, Boil water before drinking"), attributes=[], flags=int( self.log_data_3.log_record.trace_flags), ) ], ) ], ), ]) # pylint: disable=protected-access self.assertEqual( expected, self.exporter._translate_data( [self.log_data_1, self.log_data_2, self.log_data_3]), )
def test_no_credentials_error(self, mock_ssl_channel, mock_secure, mock_stub): OTLPLogExporter(insecure=False) self.assertTrue(mock_ssl_channel.called)
ConsoleSpanExporter, ) trace.set_tracer_provider(TracerProvider()) trace.get_tracer_provider().add_span_processor( BatchSpanProcessor(ConsoleSpanExporter())) log_emitter_provider = LogEmitterProvider(resource=Resource.create({ "service.name": "shoppingcart", "service.instance.id": "instance-12", }), ) set_log_emitter_provider(log_emitter_provider) exporter = OTLPLogExporter(insecure=True) log_emitter_provider.add_log_processor(BatchLogProcessor(exporter)) log_emitter = log_emitter_provider.get_log_emitter(__name__, "0.1") handler = OTLPHandler(level=logging.NOTSET, log_emitter=log_emitter) # Attach OTLP handler to root logger logging.getLogger().addHandler(handler) # Log directly logging.info("Jackdaws love my big sphinx of quartz.") # Create different namespaced loggers logger1 = logging.getLogger("myapp.area1") logger2 = logging.getLogger("myapp.area2") logger1.debug("Quick zephyrs blow, vexing daft Jim.")