Skip to content

Commit a7a2745

Browse files
fix(traceloop-sdk): include telemetry SDK attributes in tracing (#3359)
Co-authored-by: Nir Gazit <[email protected]>
1 parent c5b98bd commit a7a2745

File tree

3 files changed

+226
-1
lines changed

3 files changed

+226
-1
lines changed
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
interactions:
2+
- request:
3+
body: '{"messages": [{"role": "user", "content": "Tell me a joke about opentelemetry"}],
4+
"model": "gpt-3.5-turbo"}'
5+
headers:
6+
accept:
7+
- application/json
8+
accept-encoding:
9+
- gzip, deflate
10+
connection:
11+
- keep-alive
12+
content-length:
13+
- '107'
14+
content-type:
15+
- application/json
16+
host:
17+
- api.openai.com
18+
user-agent:
19+
- OpenAI/Python 1.12.0
20+
x-stainless-arch:
21+
- arm64
22+
x-stainless-async:
23+
- 'false'
24+
x-stainless-lang:
25+
- python
26+
x-stainless-os:
27+
- MacOS
28+
x-stainless-package-version:
29+
- 1.12.0
30+
x-stainless-runtime:
31+
- CPython
32+
x-stainless-runtime-version:
33+
- 3.9.5
34+
method: POST
35+
uri: https://api.openai.com/v1/chat/completions
36+
response:
37+
body:
38+
string: !!binary |
39+
H4sIAAAAAAAAA1RRTUsDMRC9768Yc/HSyrbrWu1FVLQKfoKgIFLS7OxubJKJySxapP9d0tYWL3N4
40+
L+/Nm5efDEDoSoxBqFayst70j78+n267x9Hrw81DPRnd39QXd9dXz5PPb3t2KXpJQbMPVPynOlBk
41+
vUHW5Na0CigZk+tglJ/kRTksihVhqUKTZI3nfnFQ9rkLM+rng2G5UbakFUYxhrcMAOBnNVNGV+G3
42+
GEPe+0MsxigbFOPtIwARyCREyBh1ZOlY9HakIsfoVrFf2gVUugJuEXygJkhrMcAsoJxD5+FLcwvk
43+
0TEatMhhcQrnqGQXETSDos5Ubp8hIlpgAg5SIUhoiCpQ5ByqVMee2GxfbmMbanygWTrRdcZs8Vo7
44+
HdtpQBnJpYiRya/lywzgfVVP9+9i4QNZz1OmObpkOCjXdmL3ITtyONyQTCzNDi9G2SafiIvIaKe1
45+
dg0GH/S6q9pPj48G5ZE8OZS5yJbZLwAAAP//AwAUd8GRNQIAAA==
46+
headers:
47+
CF-Cache-Status:
48+
- DYNAMIC
49+
CF-RAY:
50+
- 85c044a25bdc0d6e-MXP
51+
Cache-Control:
52+
- no-cache, must-revalidate
53+
Connection:
54+
- keep-alive
55+
Content-Encoding:
56+
- gzip
57+
Content-Type:
58+
- application/json
59+
Date:
60+
- Tue, 27 Feb 2024 12:00:34 GMT
61+
Server:
62+
- cloudflare
63+
Set-Cookie:
64+
- __cf_bm=J7CW3gXyUth9bXxP62KOXJBT9fqPtQCn6rOtIOYSOms-1709035234-1.0-Af3zRwkM02ElV8pGlA2ndZpn9K5kxgF0BOjGNlpNg3Dv/qKUKDqX5KjIeb/o2pyy3ZD0WS15+EM040L1eN/yQ4s=;
65+
path=/; expires=Tue, 27-Feb-24 12:30:34 GMT; domain=.api.openai.com; HttpOnly;
66+
Secure; SameSite=None
67+
- _cfuvid=tr0R1O18cmcX2Q2PFjB12pv_1Mu4R.MQAHgSyTr7lfY-1709035234516-0.0-604800000;
68+
path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None
69+
Transfer-Encoding:
70+
- chunked
71+
access-control-allow-origin:
72+
- '*'
73+
alt-svc:
74+
- h3=":443"; ma=86400
75+
openai-model:
76+
- gpt-3.5-turbo-0125
77+
openai-organization:
78+
- traceloop
79+
openai-processing-ms:
80+
- '410'
81+
openai-version:
82+
- '2020-10-01'
83+
strict-transport-security:
84+
- max-age=15724800; includeSubDomains
85+
x-ratelimit-limit-requests:
86+
- '5000'
87+
x-ratelimit-limit-tokens:
88+
- '160000'
89+
x-ratelimit-remaining-requests:
90+
- '4999'
91+
x-ratelimit-remaining-tokens:
92+
- '159974'
93+
x-ratelimit-reset-requests:
94+
- 12ms
95+
x-ratelimit-reset-tokens:
96+
- 9ms
97+
x-request-id:
98+
- req_008b3333db5c78b9ded9415f11929844
99+
status:
100+
code: 200
101+
message: OK
102+
- request:
103+
body: '{"messages": [{"role": "user", "content": "Tell me a joke about opentelemetry"}],
104+
"model": "gpt-3.5-turbo"}'
105+
headers:
106+
accept:
107+
- application/json
108+
accept-encoding:
109+
- gzip, deflate
110+
connection:
111+
- keep-alive
112+
content-length:
113+
- '107'
114+
content-type:
115+
- application/json
116+
cookie:
117+
- __cf_bm=J7CW3gXyUth9bXxP62KOXJBT9fqPtQCn6rOtIOYSOms-1709035234-1.0-Af3zRwkM02ElV8pGlA2ndZpn9K5kxgF0BOjGNlpNg3Dv/qKUKDqX5KjIeb/o2pyy3ZD0WS15+EM040L1eN/yQ4s=;
118+
_cfuvid=tr0R1O18cmcX2Q2PFjB12pv_1Mu4R.MQAHgSyTr7lfY-1709035234516-0.0-604800000
119+
host:
120+
- api.openai.com
121+
user-agent:
122+
- OpenAI/Python 1.12.0
123+
x-stainless-arch:
124+
- arm64
125+
x-stainless-async:
126+
- 'false'
127+
x-stainless-lang:
128+
- python
129+
x-stainless-os:
130+
- MacOS
131+
x-stainless-package-version:
132+
- 1.12.0
133+
x-stainless-runtime:
134+
- CPython
135+
x-stainless-runtime-version:
136+
- 3.9.5
137+
method: POST
138+
uri: https://api.openai.com/v1/chat/completions
139+
response:
140+
body:
141+
string: !!binary |
142+
H4sIAAAAAAAAA1RRXWsbMRB8v1+x1bMdzj5favslEEpo6DcEUmiLkaX1nWKdVl2t45jg/15059j0
143+
RYiZnWFm97UAUM6qJSjTajFd9OP5/u+PL3d384eX5uHD/fb7x2f++s192n9uqsefapQVtH5CI2+q
144+
K0Nd9CiOwkAbRi2YXSfvy0VZ1dNq1hMdWfRZ1kQZV1f1WHa8pnE5mdYnZUvOYFJL+FUAALz2b84Y
145+
LL6oJZSjN6TDlHSDankeAlBMPiNKp+SS6CBqdCENBcHQx35sD2CdBWkRKGIQ9Nih8AEsPqOniAxr
146+
dqEBDV5biwxCsCfe3sDvcItG7xJm9QFa1GyHb0C0aPOksDY97xiSYEzv1CnH8VzAUxOZ1rls2Hl/
147+
xjcuuNSuGHWikMMmoTjIjwXAn35Ru/+6q8jURVkJbTFkw0k92KnLaS7kdHYihUT7C14tilM+lQ5J
148+
sFttXGiQI7tha5u4ml9P6mu9mOlSFcfiHwAAAP//AwB+6qFIPwIAAA==
149+
headers:
150+
CF-Cache-Status:
151+
- DYNAMIC
152+
CF-RAY:
153+
- 85c044a7edf50d6e-MXP
154+
Cache-Control:
155+
- no-cache, must-revalidate
156+
Connection:
157+
- keep-alive
158+
Content-Encoding:
159+
- gzip
160+
Content-Type:
161+
- application/json
162+
Date:
163+
- Tue, 27 Feb 2024 12:00:35 GMT
164+
Server:
165+
- cloudflare
166+
Transfer-Encoding:
167+
- chunked
168+
access-control-allow-origin:
169+
- '*'
170+
alt-svc:
171+
- h3=":443"; ma=86400
172+
openai-model:
173+
- gpt-3.5-turbo-0125
174+
openai-organization:
175+
- traceloop
176+
openai-processing-ms:
177+
- '750'
178+
openai-version:
179+
- '2020-10-01'
180+
strict-transport-security:
181+
- max-age=15724800; includeSubDomains
182+
x-ratelimit-limit-requests:
183+
- '5000'
184+
x-ratelimit-limit-tokens:
185+
- '160000'
186+
x-ratelimit-remaining-requests:
187+
- '4999'
188+
x-ratelimit-remaining-tokens:
189+
- '159974'
190+
x-ratelimit-reset-requests:
191+
- 12ms
192+
x-ratelimit-reset-tokens:
193+
- 9ms
194+
x-request-id:
195+
- req_bf1ec13b40c7a03dd17dcca80cbd9031
196+
status:
197+
code: 200
198+
message: OK
199+
version: 1

packages/traceloop-sdk/tests/test_sdk_initialization.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,32 @@ def test_resource_attributes(exporter, openai_client):
2121
assert open_ai_span.resource.attributes["service.name"] == "test"
2222

2323

24+
@pytest.mark.vcr
25+
def test_resource_includes_sdk_attributes(exporter, openai_client):
26+
"""Test that resource attributes include OpenTelemetry SDK default attributes."""
27+
openai_client.chat.completions.create(
28+
model="gpt-3.5-turbo",
29+
messages=[{"role": "user", "content": "Tell me a joke about opentelemetry"}],
30+
)
31+
32+
spans = exporter.get_finished_spans()
33+
span = spans[0]
34+
resource_attrs = span.resource.attributes
35+
36+
assert resource_attrs["something"] == "yes"
37+
assert resource_attrs["service.name"] == "test"
38+
39+
assert "telemetry.sdk.language" in resource_attrs
40+
assert "telemetry.sdk.name" in resource_attrs
41+
assert "telemetry.sdk.version" in resource_attrs
42+
43+
# Verify the actual values
44+
assert resource_attrs["telemetry.sdk.language"] == "python"
45+
assert resource_attrs["telemetry.sdk.name"] == "opentelemetry"
46+
assert isinstance(resource_attrs["telemetry.sdk.version"], str)
47+
assert len(resource_attrs["telemetry.sdk.version"]) > 0
48+
49+
2450
def test_custom_span_processor(exporter_with_custom_span_processor):
2551
@workflow()
2652
def run_workflow():

packages/traceloop-sdk/traceloop/sdk/tracing/tracing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def __new__(
8585
return obj
8686

8787
obj.__image_uploader = image_uploader
88-
obj.__resource = Resource(attributes=TracerWrapper.resource_attributes)
88+
obj.__resource = Resource.create(TracerWrapper.resource_attributes)
8989
obj.__tracer_provider = init_tracer_provider(resource=obj.__resource, sampler=sampler)
9090

9191
# Handle multiple processors case

0 commit comments

Comments
 (0)