forked from DataDog/dd-trace-py
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_encoding.py
124 lines (88 loc) · 3.75 KB
/
test_encoding.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import msgpack
from msgpack.fallback import Packer
import pytest
from ddtrace.ext.ci import CI_APP_TEST_ORIGIN
from ddtrace.internal.encoding import MSGPACK_ENCODERS
from ddtrace.internal.encoding import MsgpackEncoderV03
from ddtrace.internal.encoding import _EncoderBase
from tests.tracer.test_encoders import REF_MSGPACK_ENCODERS
from tests.tracer.test_encoders import gen_trace
from tests.utils import DummyTracer
def allencodings(f):
return pytest.mark.parametrize("encoding", ["v0.3", "v0.5"])(f)
class PPMsgpackEncoder(_EncoderBase):
content_type = "application/msgpack"
def encode_traces(self, traces):
normalized_traces = [[self._span_to_dict(span) for span in trace] for trace in traces]
return self.encode(normalized_traces)
@staticmethod
def encode(obj):
return Packer().pack(obj)
@staticmethod
def decode(data):
return msgpack.unpackb(data, raw=True)
trace_large = gen_trace(nspans=1000)
trace_small = gen_trace(nspans=50, key_size=10, ntags=5, nmetrics=4)
@allencodings
@pytest.mark.benchmark(group="encoding", min_time=0.005)
def test_encode_1000_span_trace(benchmark, encoding):
benchmark(REF_MSGPACK_ENCODERS[encoding]().encode_traces, [trace_large])
@allencodings
@pytest.mark.benchmark(group="encoding.small", min_time=0.005)
def test_encode_trace_small(benchmark, encoding):
benchmark(REF_MSGPACK_ENCODERS[encoding]().encode_traces, [trace_small])
@allencodings
@pytest.mark.benchmark(group="encoding.small.multi", min_time=0.005)
def test_encode_trace_small_multi(benchmark, encoding):
benchmark(REF_MSGPACK_ENCODERS[encoding]().encode_traces, [trace_small for _ in range(50)])
@pytest.mark.benchmark(group="encoding", min_time=0.005)
def test_encode_1000_span_trace_fallback(benchmark):
encoder = PPMsgpackEncoder()
benchmark(encoder.encode_traces, [trace_large])
@allencodings
@pytest.mark.benchmark(group="encoding", min_time=0.005)
def test_encode_1000_span_trace_custom(benchmark, encoding):
trace_encoder = MSGPACK_ENCODERS[encoding](4 << 20, 4 << 20)
def _():
trace_encoder.put(trace_large)
trace_encoder.encode()
benchmark(_)
@allencodings
@pytest.mark.benchmark(group="encoding.small", min_time=0.005)
def test_encode_trace_small_custom(benchmark, encoding):
trace_encoder = MSGPACK_ENCODERS[encoding](4 << 20, 4 << 20)
def _():
trace_encoder.put(trace_small)
trace_encoder.encode()
benchmark(_)
@allencodings
@pytest.mark.benchmark(group="encoding.small.multi", min_time=0.005)
def test_encode_trace_small_multi_custom(benchmark, encoding):
trace_encoder = MSGPACK_ENCODERS[encoding](4 << 20, 4 << 20)
def _():
for _ in range(50):
trace_encoder.put(trace_small)
trace_encoder.encode()
benchmark(_)
@pytest.mark.parametrize("trace_size", [1, 50, 200, 1000])
@pytest.mark.benchmark(group="encoding.dd_origin", min_time=0.005)
def test_dd_origin_tagging_spans_via_encoder(benchmark, trace_size):
"""Propagate dd_origin tags to all spans in [1, 50, 200, 1000] span trace via Encoder"""
trace_encoder = MsgpackEncoderV03(4 << 20, 4 << 20)
tracer = DummyTracer()
with tracer.trace("pytest-test") as root:
root.context.dd_origin = CI_APP_TEST_ORIGIN
for _ in range(trace_size - 1):
with tracer.trace("") as span:
span.set_tag("tag", "value")
pass
trace = tracer.pop()
def _(trace):
trace_encoder.put(trace)
trace_encoder.encode()
benchmark(_, trace)
# Ensure encoded trace contains dd_origin tag in all spans
trace_encoder.put(trace)
(decoded_trace,) = trace_encoder._decode(trace_encoder.encode())
for span in decoded_trace:
assert span[b"meta"][b"_dd.origin"] == b"ciapp-test"