class DummyWriter(AgentWriter): """ # NB: This is coy fo DummyWriter class from ddtraces tests suite DummyWriter is a small fake writer used for tests. not thread-safe. """ def __init__(self): # original call super(DummyWriter, self).__init__() # dummy components self.spans = [] self.traces = [] self.services = {} self.json_encoder = JSONEncoder() self.msgpack_encoder = MsgpackEncoder() def write(self, spans=None, services=None): if spans: # the traces encoding expect a list of traces so we # put spans in a list like we do in the real execution path # with both encoders trace = [spans] self.json_encoder.encode_traces(trace) self.msgpack_encoder.encode_traces(trace) self.spans += spans self.traces += trace if services: self.json_encoder.encode_services(services) self.msgpack_encoder.encode_services(services) self.services.update(services) def pop(self): # dummy method s = self.spans self.spans = [] return s def pop_traces(self): # dummy method traces = self.traces self.traces = [] return traces def pop_services(self): # dummy method s = self.services self.services = {} return s
class DummyWriter(AgentWriter): """DummyWriter is a small fake writer used for tests. not thread-safe.""" def __init__(self, *args, **kwargs): # original call super(DummyWriter, self).__init__(*args, **kwargs) # dummy components self.spans = [] self.traces = [] self.services = {} self.json_encoder = JSONEncoder() self.msgpack_encoder = MsgpackEncoder() def write(self, spans=None, services=None): if spans: # the traces encoding expect a list of traces so we # put spans in a list like we do in the real execution path # with both encoders trace = [spans] self.json_encoder.encode_traces(trace) self.msgpack_encoder.encode_traces(trace) self.spans += spans self.traces += trace if services: self.json_encoder.encode_services(services) self.msgpack_encoder.encode_services(services) self.services.update(services) def pop(self): # dummy method s = self.spans self.spans = [] return s def pop_traces(self): # dummy method traces = self.traces self.traces = [] return traces def pop_services(self): # dummy method # Setting service info has been deprecated, we want to make sure nothing ever gets written here assert self.services == {} s = self.services self.services = {} return s
class DummyWriter(AgentWriter): """DummyWriter is a small fake writer used for tests. not thread-safe.""" def __init__(self, *args: typing.Any, **kwargs: typing.Any) -> None: super().__init__(*args, **kwargs) # Dummy components. self.spans: typing.List[Span] = [] self.traces: typing.List[Trace] = [] self.services: typing.Dict[str, Service] = {} self.json_encoder = JSONEncoder() self.msgpack_encoder = MsgpackEncoder() def write(self, spans: typing.List[Span] = None, services: typing.List[Service] = None) -> None: if spans: # The traces encoding expect a list of traces so we # put spans in a list like we do in the real execution path # with both encoders. trace = [spans] self.json_encoder.encode_traces(trace) self.msgpack_encoder.encode_traces(trace) self.spans += spans self.traces += trace if services: self.json_encoder.encode_services(services) self.msgpack_encoder.encode_services(services) self.services.update(services) def pop(self) -> typing.List[Span]: # Dummy method. spans = self.spans self.spans = [] return spans def pop_traces(self) -> typing.List[Trace]: # Dummy method. traces = self.traces self.traces = [] return traces def pop_services(self) -> typing.Dict[str, Service]: # Dummy method. # Setting service info has been deprecated, # we want to make sure nothing ever gets written here. assert self.services == {} services = self.services self.services = {} return services
def test_encode_traces_msgpack(self): # test encoding for MsgPack format traces = [] traces.append([ Span(name='client.testing', tracer=None), Span(name='client.testing', tracer=None), ]) traces.append([ Span(name='client.testing', tracer=None), Span(name='client.testing', tracer=None), ]) encoder = MsgpackEncoder() spans = encoder.encode_traces(traces) items = msgpack.unpackb(spans) # test the encoded output that should be a string # and the output must be flatten assert isinstance(spans, msgpack_type) assert len(items) == 2 assert len(items[0]) == 2 assert len(items[1]) == 2 for i in range(2): for j in range(2): assert b'client.testing' == items[i][j][b'name']
def test_custom_msgpack_encode(): encoder = MsgpackEncoder() refencoder = RefMsgpackEncoder() trace = gen_trace(nspans=50) # Note that we assert on the decoded versions because the encoded # can vary due to non-deterministic map key/value positioning assert decode(refencoder.encode_trace(trace)) == decode( encoder.encode_trace(trace)) ref_encoded = refencoder.encode_traces([trace, trace]) encoded = encoder.encode_traces([trace, trace]) assert decode(encoded) == decode(ref_encoded) # Empty trace (not that this should be done in practice) assert decode(refencoder.encode_trace([])) == decode( encoder.encode_trace([])) s = Span(None, None) # Need to .finish() to have a duration since the old implementation will not encode # duration_ns, the new one will encode as None s.finish() assert decode(refencoder.encode_trace([s])) == decode( encoder.encode_trace([s]))
def test_encode_traces_msgpack(self): # test encoding for MsgPack format traces = [] traces.append([ Span(name='client.testing', tracer=None), Span(name='client.testing', tracer=None), ]) traces.append([ Span(name='client.testing', tracer=None), Span(name='client.testing', tracer=None), ]) encoder = MsgpackEncoder() spans = encoder.encode_traces(traces) items = msgpack.unpackb(spans) # test the encoded output that should be a string # and the output must be flatten ok_(isinstance(spans, msgpack_type)) eq_(len(items), 2) eq_(len(items[0]), 2) eq_(len(items[1]), 2) for i in range(2): for j in range(2): eq_(b'client.testing', items[i][j][b'name'])
class DummyWriter(AgentWriter): """ DummyWriter is a small fake writer used for tests. not thread-safe. """ def __init__(self): # original call super(DummyWriter, self).__init__() # dummy components self.spans = [] self.traces = [] self.services = {} self.json_encoder = JSONEncoder() self.msgpack_encoder = MsgpackEncoder() def write(self, spans=None, services=None): if spans: # the traces encoding expect a list of traces so we # put spans in a list like we do in the real execution path # with both encoders trace = [spans] self.json_encoder.encode_traces(trace) self.msgpack_encoder.encode_traces(trace) self.spans += spans self.traces += trace if services: self.json_encoder.encode_services(services) self.msgpack_encoder.encode_services(services) self.services.update(services) def pop(self): # dummy method s = self.spans self.spans = [] return s def pop_traces(self): # dummy method traces = self.traces self.traces = [] return traces def pop_services(self): # dummy method s = self.services self.services = {} return s
def test_encode_traces_msgpack(self): # test encoding for JSON format traces = [] traces.append([ Span(name='client.testing', tracer=None), Span(name='client.testing', tracer=None), ]) traces.append([ Span(name='client.testing', tracer=None), Span(name='client.testing', tracer=None), ]) encoder = MsgpackEncoder() spans = encoder.encode_traces(traces) items = msgpack.unpackb(spans) # test the encoded output that should be a string # and the output must be flatten ok_(isinstance(spans, msgpack_type)) eq_(len(items), 2) eq_(len(items[0]), 2) eq_(len(items[1]), 2)