Skip to content

Commit 28baa58

Browse files
authored
openai: don't set attributes if they are NotGiven (elastic#67)
1 parent 6cf2a02 commit 28baa58

File tree

5 files changed

+421
-13
lines changed

5 files changed

+421
-13
lines changed

instrumentation/elastic-opentelemetry-instrumentation-openai/src/opentelemetry/instrumentation/openai/helpers.py

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -118,39 +118,51 @@ def _attributes_from_client(client) -> Attributes:
118118

119119

120120
def _get_attributes_from_wrapper(instance, kwargs) -> Attributes:
121+
# we import this here to avoid races with other instrumentations
122+
try:
123+
# available since 1.13.4
124+
from openai import NotGiven
125+
except ImportError:
126+
NotGiven = None
127+
128+
def _is_set(value):
129+
if NotGiven is not None:
130+
return value is not None and not isinstance(value, NotGiven)
131+
return value is not None
132+
121133
span_attributes = {
122134
GEN_AI_OPERATION_NAME: "chat",
123135
GEN_AI_SYSTEM: "openai",
124136
}
125137

126-
if (request_model := kwargs.get("model")) is not None:
138+
if _is_set(request_model := kwargs.get("model")):
127139
span_attributes[GEN_AI_REQUEST_MODEL] = request_model
128140

129141
if client := getattr(instance, "_client", None):
130142
span_attributes.update(_attributes_from_client(client))
131143

132-
if (frequency_penalty := kwargs.get("frequency_penalty")) is not None:
144+
if _is_set(frequency_penalty := kwargs.get("frequency_penalty")):
133145
span_attributes[GEN_AI_REQUEST_FREQUENCY_PENALTY] = frequency_penalty
134-
if (max_tokens := kwargs.get("max_completion_tokens", kwargs.get("max_tokens"))) is not None:
146+
if _is_set(max_tokens := kwargs.get("max_completion_tokens", kwargs.get("max_tokens"))):
135147
span_attributes[GEN_AI_REQUEST_MAX_TOKENS] = max_tokens
136-
if (presence_penalty := kwargs.get("presence_penalty")) is not None:
148+
if _is_set(presence_penalty := kwargs.get("presence_penalty")):
137149
span_attributes[GEN_AI_REQUEST_PRESENCE_PENALTY] = presence_penalty
138-
if (temperature := kwargs.get("temperature")) is not None:
150+
if _is_set(temperature := kwargs.get("temperature")):
139151
span_attributes[GEN_AI_REQUEST_TEMPERATURE] = temperature
140-
if (top_p := kwargs.get("top_p")) is not None:
152+
if _is_set(top_p := kwargs.get("top_p")):
141153
span_attributes[GEN_AI_REQUEST_TOP_P] = top_p
142-
if (stop_sequences := kwargs.get("stop")) is not None:
154+
if _is_set(stop_sequences := kwargs.get("stop")):
143155
if isinstance(stop_sequences, str):
144156
stop_sequences = [stop_sequences]
145157
span_attributes[GEN_AI_REQUEST_STOP_SEQUENCES] = stop_sequences
146-
if (seed := kwargs.get("seed")) is not None:
158+
if _is_set(seed := kwargs.get("seed")):
147159
span_attributes[GEN_AI_OPENAI_REQUEST_SEED] = seed
148-
if (service_tier := kwargs.get("service_tier")) is not None:
160+
if _is_set(service_tier := kwargs.get("service_tier")):
149161
span_attributes[GEN_AI_OPENAI_REQUEST_SERVICE_TIER] = service_tier
150-
if (response_format := kwargs.get("response_format")) is not None:
162+
if _is_set(response_format := kwargs.get("response_format")):
151163
# response_format may be string or object with a string in the `type` key
152164
if isinstance(response_format, Mapping):
153-
if (response_format_type := response_format.get("type")) is not None:
165+
if _is_set(response_format_type := response_format.get("type")):
154166
span_attributes[GEN_AI_OPENAI_REQUEST_RESPONSE_FORMAT] = response_format_type
155167
else:
156168
span_attributes[GEN_AI_OPENAI_REQUEST_RESPONSE_FORMAT] = response_format
@@ -168,18 +180,30 @@ def _span_name_from_attributes(attributes: Attributes) -> str:
168180

169181

170182
def _get_embeddings_attributes_from_wrapper(instance, kwargs) -> Attributes:
183+
# we import this here to avoid races with other instrumentations
184+
try:
185+
# available since 1.13.4
186+
from openai import NotGiven
187+
except ImportError:
188+
NotGiven = None
189+
190+
def _is_set(value):
191+
if NotGiven is not None:
192+
return value is not None and not isinstance(value, NotGiven)
193+
return value is not None
194+
171195
span_attributes = {
172196
GEN_AI_OPERATION_NAME: "embeddings",
173197
GEN_AI_SYSTEM: "openai",
174198
}
175199

176-
if (request_model := kwargs.get("model")) is not None:
200+
if _is_set(request_model := kwargs.get("model")):
177201
span_attributes[GEN_AI_REQUEST_MODEL] = request_model
178202

179203
if client := getattr(instance, "_client", None):
180204
span_attributes.update(_attributes_from_client(client))
181205

182-
if (encoding_format := kwargs.get("encoding_format")) is not None:
206+
if _is_set(encoding_format := kwargs.get("encoding_format")):
183207
span_attributes[GEN_AI_REQUEST_ENCODING_FORMATS] = [encoding_format]
184208

185209
return span_attributes
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
interactions:
2+
- request:
3+
body: |-
4+
{
5+
"messages": [
6+
{
7+
"role": "user",
8+
"content": "Answer in up to 3 words: Which ocean contains Bouvet Island?"
9+
}
10+
],
11+
"model": "gpt-4o-mini"
12+
}
13+
headers:
14+
accept:
15+
- application/json
16+
accept-encoding:
17+
- gzip, deflate
18+
authorization:
19+
- Bearer test_openai_api_key
20+
connection:
21+
- keep-alive
22+
content-length:
23+
- '131'
24+
content-type:
25+
- application/json
26+
host:
27+
- api.openai.com
28+
user-agent:
29+
- OpenAI/Python 1.54.4
30+
x-stainless-arch:
31+
- x64
32+
x-stainless-async:
33+
- 'false'
34+
x-stainless-lang:
35+
- python
36+
x-stainless-os:
37+
- Linux
38+
x-stainless-package-version:
39+
- 1.54.4
40+
x-stainless-retry-count:
41+
- '0'
42+
x-stainless-runtime:
43+
- CPython
44+
x-stainless-runtime-version:
45+
- 3.12.9
46+
method: POST
47+
uri: https://api.openai.com/v1/chat/completions
48+
response:
49+
body:
50+
string: |-
51+
{
52+
"id": "chatcmpl-BCOdmGkOZ511LwlA800bJkFWf528Z",
53+
"object": "chat.completion",
54+
"created": 1742294354,
55+
"model": "gpt-4o-mini-2024-07-18",
56+
"choices": [
57+
{
58+
"index": 0,
59+
"message": {
60+
"role": "assistant",
61+
"content": "Atlantic Ocean",
62+
"refusal": null,
63+
"annotations": []
64+
},
65+
"logprobs": null,
66+
"finish_reason": "stop"
67+
}
68+
],
69+
"usage": {
70+
"prompt_tokens": 22,
71+
"completion_tokens": 3,
72+
"total_tokens": 25,
73+
"prompt_tokens_details": {
74+
"cached_tokens": 0,
75+
"audio_tokens": 0
76+
},
77+
"completion_tokens_details": {
78+
"reasoning_tokens": 0,
79+
"audio_tokens": 0,
80+
"accepted_prediction_tokens": 0,
81+
"rejected_prediction_tokens": 0
82+
}
83+
},
84+
"service_tier": "default",
85+
"system_fingerprint": "fp_06737a9306"
86+
}
87+
headers:
88+
CF-RAY:
89+
- 92241ade0c745271-MXP
90+
Connection:
91+
- keep-alive
92+
Content-Type:
93+
- application/json
94+
Date:
95+
- Tue, 18 Mar 2025 10:39:14 GMT
96+
Server:
97+
- cloudflare
98+
Set-Cookie: test_set_cookie
99+
Transfer-Encoding:
100+
- chunked
101+
X-Content-Type-Options:
102+
- nosniff
103+
access-control-expose-headers:
104+
- X-Request-ID
105+
alt-svc:
106+
- h3=":443"; ma=86400
107+
cf-cache-status:
108+
- DYNAMIC
109+
content-length:
110+
- '820'
111+
openai-organization: test_openai_org_id
112+
openai-processing-ms:
113+
- '360'
114+
openai-version:
115+
- '2020-10-01'
116+
strict-transport-security:
117+
- max-age=31536000; includeSubDomains; preload
118+
x-ratelimit-limit-requests:
119+
- '10000'
120+
x-ratelimit-limit-tokens:
121+
- '200000'
122+
x-ratelimit-remaining-requests:
123+
- '9524'
124+
x-ratelimit-remaining-tokens:
125+
- '199967'
126+
x-ratelimit-reset-requests:
127+
- 1h8m25.745s
128+
x-ratelimit-reset-tokens:
129+
- 9ms
130+
x-request-id:
131+
- req_7de69997ff644c621165daf62abeb297
132+
status:
133+
code: 200
134+
message: OK
135+
version: 1
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
interactions:
2+
- request:
3+
body: |-
4+
{
5+
"input": [
6+
"South Atlantic Ocean."
7+
],
8+
"model": "text-embedding-3-small",
9+
"encoding_format": "base64"
10+
}
11+
headers:
12+
accept:
13+
- application/json
14+
accept-encoding:
15+
- gzip, deflate
16+
authorization:
17+
- Bearer test_openai_api_key
18+
connection:
19+
- keep-alive
20+
content-length:
21+
- '100'
22+
content-type:
23+
- application/json
24+
host:
25+
- api.openai.com
26+
user-agent:
27+
- OpenAI/Python 1.54.4
28+
x-stainless-arch:
29+
- x64
30+
x-stainless-async:
31+
- 'false'
32+
x-stainless-lang:
33+
- python
34+
x-stainless-os:
35+
- Linux
36+
x-stainless-package-version:
37+
- 1.54.4
38+
x-stainless-retry-count:
39+
- '0'
40+
x-stainless-runtime:
41+
- CPython
42+
x-stainless-runtime-version:
43+
- 3.12.9
44+
method: POST
45+
uri: https://api.openai.com/v1/embeddings
46+
response:
47+
body:
48+
string: |-
49+
{
50+
"object": "list",
51+
"data": [
52+
{
53+
"object": "embedding",
54+
"index": 0,
55+
"embedding": "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"
56+
}
57+
],
58+
"model": "text-embedding-3-small",
59+
"usage": {
60+
"prompt_tokens": 4,
61+
"total_tokens": 4
62+
}
63+
}
64+
headers:
65+
CF-RAY:
66+
- 9224215459774c4a-MXP
67+
Connection:
68+
- keep-alive
69+
Content-Type:
70+
- application/json
71+
Date:
72+
- Tue, 18 Mar 2025 10:43:38 GMT
73+
Server:
74+
- cloudflare
75+
Set-Cookie: test_set_cookie
76+
Transfer-Encoding:
77+
- chunked
78+
X-Content-Type-Options:
79+
- nosniff
80+
access-control-allow-origin:
81+
- '*'
82+
access-control-expose-headers:
83+
- X-Request-ID
84+
alt-svc:
85+
- h3=":443"; ma=86400
86+
cf-cache-status:
87+
- DYNAMIC
88+
content-length:
89+
- '8414'
90+
openai-model:
91+
- text-embedding-3-small
92+
openai-organization: test_openai_org_id
93+
openai-processing-ms:
94+
- '78'
95+
openai-version:
96+
- '2020-10-01'
97+
strict-transport-security:
98+
- max-age=31536000; includeSubDomains; preload
99+
via:
100+
- envoy-router-5fb49678db-zjg2l
101+
x-envoy-upstream-service-time:
102+
- '66'
103+
x-ratelimit-limit-requests:
104+
- '3000'
105+
x-ratelimit-limit-tokens:
106+
- '1000000'
107+
x-ratelimit-remaining-requests:
108+
- '2999'
109+
x-ratelimit-remaining-tokens:
110+
- '999994'
111+
x-ratelimit-reset-requests:
112+
- 20ms
113+
x-ratelimit-reset-tokens:
114+
- 0s
115+
x-request-id:
116+
- req_29a99f27172e85885e948f8ce1bc5d2c
117+
status:
118+
code: 200
119+
message: OK
120+
version: 1

0 commit comments

Comments
 (0)