diff --git a/nameko_tracer/formatters.py b/nameko_tracer/formatters.py index a2fb1c8..86e4c47 100644 --- a/nameko_tracer/formatters.py +++ b/nameko_tracer/formatters.py @@ -28,12 +28,21 @@ class ElasticsearchDocumentFormatter(JSONFormatter): """ + extra_serialise_keys = ( + constants.CONTEXT_DATA_KEY, + constants.REQUEST_KEY, + constants.RESPONSE_KEY) + def format(self, record): + trace = getattr(record, constants.TRACE_KEY) - trace[constants.CONTEXT_DATA_KEY] = serialise( - trace[constants.CONTEXT_DATA_KEY]) - trace[constants.REQUEST_KEY] = serialise( - trace[constants.REQUEST_KEY]) - trace[constants.RESPONSE_KEY] = serialise( - trace[constants.RESPONSE_KEY]) + + for key in self.extra_serialise_keys: + if key in trace: + trace[key] = serialise(trace[key]) + + if constants.ERROR_KEY in trace: + trace[constants.ERROR_KEY]['exc_args'] = serialise( + trace[constants.ERROR_KEY]['exc_args']) + return serialise(trace) diff --git a/tests/test_formatters.py b/tests/test_formatters.py index d33bcd9..b1f2f6f 100644 --- a/tests/test_formatters.py +++ b/tests/test_formatters.py @@ -26,14 +26,45 @@ def test_json_serialiser_will_deal_with_datetime(input_, expected_output): formatters.JSONFormatter().format(log_record) == expected_output) -def test_elasticsearch_document_serialiser(): +@pytest.mark.parametrize( + ('key', 'value_in', 'expected_value_out'), + ( + ( + constants.CONTEXT_DATA_KEY, + {'should': ('be', 'serialised')}, + '{"should": ["be", "serialised"]}', + ), + ( + constants.REQUEST_KEY, + ('should', 'be', 'serialised'), + '["should", "be", "serialised"]', + ), + ( + constants.RESPONSE_KEY, + {'should': ('be', 'serialised')}, + '{"should": ["be", "serialised"]}', + ), + ( + constants.ERROR_KEY, + { + 'exc_args': {'should': ('be', 'serialised')}, + 'spam': {'should': ['NOT', 'be', 'serialised']}, + }, + { + 'exc_args': '{"should": ["be", "serialised"]}', + 'spam': {'should': ['NOT', 'be', 'serialised']}, + } + ), + ( + 'some-other-key', + {'should': ['NOT', 'be', 'serialised']}, + {'should': ['NOT', 'be', 'serialised']}, + ), + ) +) +def test_elasticsearch_document_serialiser(key, value_in, expected_value_out): - trace = { - constants.CONTEXT_DATA_KEY: {'should': ('be', 'serialised')}, - constants.REQUEST_KEY: ('should', 'be', 'serialised'), - constants.RESPONSE_KEY: {'should': ('be', 'serialised')}, - 'some-other-key': {'should': ['NOT', 'be', 'serialised']}, - } + trace = {key: value_in} log_record = Mock() setattr(log_record, constants.TRACE_KEY, trace) @@ -42,15 +73,4 @@ def test_elasticsearch_document_serialiser(): document = json.loads(document) - assert ( - document[constants.CONTEXT_DATA_KEY] == - '{"should": ["be", "serialised"]}') - assert ( - document[constants.REQUEST_KEY] == - '["should", "be", "serialised"]') - assert ( - document[constants.RESPONSE_KEY] == - '{"should": ["be", "serialised"]}') - assert ( - document['some-other-key'] == - {'should': ['NOT', 'be', 'serialised']}) + assert document[key] == expected_value_out