Skip to content

Commit a893e09

Browse files
committed
♻️ Keep span in scope
Signed-off-by: Evaline Ju <69598118+evaline-ju@users.noreply.github.com>
1 parent 86d669d commit a893e09

1 file changed

Lines changed: 36 additions & 37 deletions

File tree

mcp/weather_tool/weather_tool.py

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -112,49 +112,48 @@ async def get_weather(city: str) -> str:
112112
span.set_attribute("mcp.method.name", "tools/call")
113113
span.set_attribute("gen_ai.operation.name", "execute_tool")
114114
span.set_attribute("gen_ai.tool.name", "get_weather")
115-
# Opt-in: include tool arguments per semconv
116115
span.set_attribute("gen_ai.tool.call.arguments", json.dumps({"city": city}))
117116

118117
logger.debug(f"Getting weather info for city '{city}'.")
119118

120-
base_url = "https://geocoding-api.open-meteo.com/v1/search"
121-
async with httpx.AsyncClient() as client:
122-
response = await client.get(base_url, params={"name": city, "count": 1}, timeout=10)
123-
response.raise_for_status()
124-
data = response.json()
125-
126-
if not data or "results" not in data:
127-
result = f"City {city} not found"
128-
span.set_attribute("error.type", "tool_error")
129-
span.set_status(Status(StatusCode.ERROR, result))
119+
try:
120+
base_url = "https://geocoding-api.open-meteo.com/v1/search"
121+
async with httpx.AsyncClient() as client:
122+
response = await client.get(base_url, params={"name": city, "count": 1}, timeout=10)
123+
response.raise_for_status()
124+
data = response.json()
125+
126+
if not data or "results" not in data:
127+
result = f"City {city} not found"
128+
span.set_attribute("error.type", "tool_error")
129+
span.set_status(Status(StatusCode.ERROR, result))
130+
return result
131+
132+
latitude = data["results"][0]["latitude"]
133+
longitude = data["results"][0]["longitude"]
134+
135+
weather_url = "https://api.open-meteo.com/v1/forecast"
136+
weather_params = {
137+
"latitude": latitude,
138+
"longitude": longitude,
139+
"temperature_unit": "fahrenheit",
140+
"current_weather": True,
141+
}
142+
async with httpx.AsyncClient() as client:
143+
weather_response = await client.get(weather_url, params=weather_params, timeout=10)
144+
weather_response.raise_for_status()
145+
weather_data = weather_response.json()
146+
147+
result = json.dumps(weather_data["current_weather"])
148+
span.set_attribute("gen_ai.tool.call.result", result)
149+
span.set_status(Status(StatusCode.OK))
130150
return result
131151

132-
latitude = data["results"][0]["latitude"]
133-
longitude = data["results"][0]["longitude"]
134-
135-
weather_url = "https://api.open-meteo.com/v1/forecast"
136-
weather_params = {
137-
"latitude": latitude,
138-
"longitude": longitude,
139-
"temperature_unit": "fahrenheit",
140-
"current_weather": True,
141-
}
142-
async with httpx.AsyncClient() as client:
143-
weather_response = await client.get(weather_url, params=weather_params, timeout=10)
144-
weather_response.raise_for_status()
145-
weather_data = weather_response.json()
146-
147-
result = json.dumps(weather_data["current_weather"])
148-
# Opt-in: include tool result per semconv
149-
span.set_attribute("gen_ai.tool.call.result", result)
150-
span.set_status(Status(StatusCode.OK))
151-
return result
152-
153-
except Exception as e:
154-
span.set_attribute("error.type", type(e).__name__)
155-
span.set_status(Status(StatusCode.ERROR, str(e)))
156-
span.record_exception(e)
157-
raise
152+
except Exception as e:
153+
span.set_attribute("error.type", type(e).__name__)
154+
span.set_status(Status(StatusCode.ERROR, str(e)))
155+
span.record_exception(e)
156+
raise
158157
finally:
159158
otel_context.detach(token)
160159

0 commit comments

Comments
 (0)