|
20 | 20 |
|
21 | 21 | import requests
|
22 | 22 | import responses
|
| 23 | +from google.protobuf.json_format import MessageToDict |
23 | 24 |
|
24 | 25 | from opentelemetry._logs import SeverityNumber
|
25 | 26 | from opentelemetry.exporter.otlp.proto.http import Compression
|
|
31 | 32 | OTLPLogExporter,
|
32 | 33 | )
|
33 | 34 | from opentelemetry.exporter.otlp.proto.http.version import __version__
|
| 35 | +from opentelemetry.proto.collector.logs.v1.logs_service_pb2 import ( |
| 36 | + ExportLogsServiceRequest, |
| 37 | +) |
34 | 38 | from opentelemetry.sdk._logs import LogData
|
35 | 39 | from opentelemetry.sdk._logs import LogRecord as SDKLogRecord
|
36 | 40 | from opentelemetry.sdk._logs.export import LogExportResult
|
@@ -167,6 +171,76 @@ def test_exporter_env(self):
|
167 | 171 | )
|
168 | 172 | self.assertIsInstance(exporter._session, requests.Session)
|
169 | 173 |
|
| 174 | + @staticmethod |
| 175 | + def export_log_and_deserialize(log): |
| 176 | + with patch("requests.Session.post") as mock_post: |
| 177 | + exporter = OTLPLogExporter() |
| 178 | + exporter.export([log]) |
| 179 | + request_body = mock_post.call_args[1]["data"] |
| 180 | + request = ExportLogsServiceRequest() |
| 181 | + request.ParseFromString(request_body) |
| 182 | + request_dict = MessageToDict(request) |
| 183 | + log_records = ( |
| 184 | + request_dict.get("resourceLogs")[0] |
| 185 | + .get("scopeLogs")[0] |
| 186 | + .get("logRecords") |
| 187 | + ) |
| 188 | + return log_records |
| 189 | + |
| 190 | + def test_exported_log_without_trace_id(self): |
| 191 | + log = LogData( |
| 192 | + log_record=SDKLogRecord( |
| 193 | + timestamp=1644650195189786182, |
| 194 | + trace_id=0, |
| 195 | + span_id=1312458408527513292, |
| 196 | + trace_flags=TraceFlags(0x01), |
| 197 | + severity_text="WARN", |
| 198 | + severity_number=SeverityNumber.WARN, |
| 199 | + body="Invalid trace id check", |
| 200 | + resource=SDKResource({"first_resource": "value"}), |
| 201 | + attributes={"a": 1, "b": "c"}, |
| 202 | + ), |
| 203 | + instrumentation_scope=InstrumentationScope("name", "version"), |
| 204 | + ) |
| 205 | + log_records = TestOTLPHTTPLogExporter.export_log_and_deserialize(log) |
| 206 | + if log_records: |
| 207 | + log_record = log_records[0] |
| 208 | + self.assertIn("spanId", log_record) |
| 209 | + self.assertNotIn( |
| 210 | + "traceId", |
| 211 | + log_record, |
| 212 | + "trace_id should not be present in the log record", |
| 213 | + ) |
| 214 | + else: |
| 215 | + self.fail("No log records found") |
| 216 | + |
| 217 | + def test_exported_log_without_span_id(self): |
| 218 | + log = LogData( |
| 219 | + log_record=SDKLogRecord( |
| 220 | + timestamp=1644650195189786360, |
| 221 | + trace_id=89564621134313219400156819398935297696, |
| 222 | + span_id=0, |
| 223 | + trace_flags=TraceFlags(0x01), |
| 224 | + severity_text="WARN", |
| 225 | + severity_number=SeverityNumber.WARN, |
| 226 | + body="Invalid span id check", |
| 227 | + resource=SDKResource({"first_resource": "value"}), |
| 228 | + attributes={"a": 1, "b": "c"}, |
| 229 | + ), |
| 230 | + instrumentation_scope=InstrumentationScope("name", "version"), |
| 231 | + ) |
| 232 | + log_records = TestOTLPHTTPLogExporter.export_log_and_deserialize(log) |
| 233 | + if log_records: |
| 234 | + log_record = log_records[0] |
| 235 | + self.assertIn("traceId", log_record) |
| 236 | + self.assertNotIn( |
| 237 | + "spanId", |
| 238 | + log_record, |
| 239 | + "spanId should not be present in the log record", |
| 240 | + ) |
| 241 | + else: |
| 242 | + self.fail("No log records found") |
| 243 | + |
170 | 244 | @responses.activate
|
171 | 245 | @patch("opentelemetry.exporter.otlp.proto.http._log_exporter.sleep")
|
172 | 246 | def test_exponential_backoff(self, mock_sleep):
|
|
0 commit comments