Skip to content

Commit 1844e89

Browse files
committed
Align observability labs with standard Azure env vars
1 parent 3588c1e commit 1844e89

File tree

4 files changed

+105
-117
lines changed

4 files changed

+105
-117
lines changed

lab/5-Observability/1-OpenAIAgents/weekend_planner.ipynb

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,38 @@
77
"# Weekend Planner with Azure OpenAI Agents Telemetry\n",
88
"\n",
99
"Capture GenAI-compliant spans while orchestrating an Azure OpenAI Agents workflow. This notebook mirrors the sample script but keeps everything inline so you can tweak the code and immediately inspect telemetry."
10-
]
11-
},
12-
{
13-
"cell_type": "markdown",
14-
"metadata": {},
15-
"source": [
10+
]
11+
},
12+
{
13+
"cell_type": "markdown",
14+
"metadata": {},
15+
"source": [
1616
"## Requirements\n",
1717
"Install the supporting packages before running the cells below.\n",
1818
"\n",
1919
"```bash\n",
20-
"pip install openai openai-agents azure-identity rich python-dotenv\n",
20+
"pip install openai openai-agents rich python-dotenv\n",
2121
"pip install opentelemetry-instrumentation-openai-agents-v2\n",
2222
"# Optional Azure Monitor exporter\n",
2323
"pip install azure-monitor-opentelemetry-exporter\n",
2424
"```\n",
2525
"\n",
26-
"Set the Azure OpenAI environment variables (`AZURE_OPENAI_ENDPOINT`, `AZURE_OPENAI_VERSION`, `AZURE_OPENAI_CHAT_DEPLOYMENT`, and optionally `AZURE_OPENAI_API_KEY`) and, if needed, `APPLICATION_INSIGHTS_CONNECTION_STRING`."
27-
]
28-
},
26+
"Export the following environment variables before executing the notebook (set unused values to an empty string):\n",
27+
"- `AZURE_OPENAI_API_KEY`\n",
28+
"- `AZURE_OPENAI_ENDPOINT`\n",
29+
"- `AZURE_OPENAI_API_VERSION`\n",
30+
"- `AZURE_AI_FOUNDRY_NAME`\n",
31+
"- `AZURE_AOAI_ACCOUNT`\n",
32+
"- `AZURE_SUBSCRIPTION_ID`\n",
33+
"- `AZURE_RESOURCE_GROUP`\n",
34+
"- `AZURE_AISEARCH_ENDPOINT`\n",
35+
"- `AZURE_AISEARCH_INDEX`\n",
36+
"- `AZURE_AISEARCH_RESOURCE_GROUP`\n",
37+
"- `APPLICATION_INSIGHTS_CONNECTION_STRING`\n",
38+
"\n",
39+
"These labs do not assume any other configuration variables are defined.\n"
40+
]
41+
},
2942
{
3043
"cell_type": "markdown",
3144
"metadata": {},
@@ -51,7 +64,6 @@
5164
"from typing import Callable\n",
5265
"from urllib.parse import urlparse\n",
5366
"\n",
54-
"import azure.identity\n",
5567
"import openai\n",
5668
"from agents import Agent, OpenAIChatCompletionsModel, Runner, function_tool, set_tracing_disabled\n",
5769
"from dotenv import load_dotenv\n",
@@ -72,7 +84,10 @@
7284
"\n",
7385
"logging.basicConfig(level=logging.WARNING, format=\"%(message)s\", datefmt=\"[%X]\", handlers=[RichHandler()])\n",
7486
"LOGGER = logging.getLogger(\"weekend_planner\")\n",
75-
"LOGGER.setLevel(logging.INFO)"
87+
"LOGGER.setLevel(logging.INFO)\n",
88+
"\n",
89+
"MODEL_NAME = os.environ.get(\"AZURE_AI_FOUNDRY_NAME\") or \"gpt-4o-mini\"\n",
90+
"SERVICE_VERSION = \"1.0.0\"\n"
7691
]
7792
},
7893
{
@@ -81,8 +96,8 @@
8196
"source": [
8297
"### Step 2: Define helpers for capture configuration\n",
8398
"These utilities resolve the Azure OpenAI configuration, set the GenAI capture environment variables, and prepare the tracer provider used throughout the notebook.\n"
84-
]
85-
},
99+
]
100+
},
86101
{
87102
"cell_type": "code",
88103
"execution_count": null,
@@ -109,9 +124,9 @@
109124
" \"OTEL_GENAI_CAPTURE_SYSTEM_INSTRUCTIONS\": \"true\",\n",
110125
" \"OTEL_GENAI_CAPTURE_TOOL_DEFINITIONS\": \"true\",\n",
111126
" \"OTEL_GENAI_EMIT_OPERATION_DETAILS\": \"true\",\n",
112-
" \"OTEL_GENAI_AGENT_NAME\": os.getenv(\"OTEL_GENAI_AGENT_NAME\", \"Weekend Planner Agent\"),\n",
113-
" \"OTEL_GENAI_AGENT_DESCRIPTION\": os.getenv(\"OTEL_GENAI_AGENT_DESCRIPTION\", \"Assistant that plans weekend activities using weather and events data\"),\n",
114-
" \"OTEL_GENAI_AGENT_ID\": os.getenv(\"OTEL_GENAI_AGENT_ID\", \"weekend-planner\"),\n",
127+
" \"OTEL_GENAI_AGENT_NAME\": \"Weekend Planner Agent\",\n",
128+
" \"OTEL_GENAI_AGENT_DESCRIPTION\": \"Assistant that plans weekend activities using weather and events data\",\n",
129+
" \"OTEL_GENAI_AGENT_ID\": \"weekend-planner\",\n",
115130
" \"OTEL_GENAI_PROVIDER_NAME\": provider,\n",
116131
" }\n",
117132
" for key, value in capture_defaults.items():\n",
@@ -128,36 +143,19 @@
128143
" \"\"\"Return the client configuration for Azure OpenAI.\"\"\"\n",
129144
"\n",
130145
" endpoint = os.environ[\"AZURE_OPENAI_ENDPOINT\"].rstrip(\"/\")\n",
131-
" api_version = os.getenv(\"AZURE_OPENAI_VERSION\", \"2024-05-01-preview\")\n",
132-
" deployment = os.environ[\"AZURE_OPENAI_CHAT_DEPLOYMENT\"]\n",
133-
"\n",
134-
" api_key = os.getenv(\"AZURE_OPENAI_API_KEY\")\n",
135-
" if api_key:\n",
136-
"\n",
137-
" def _build_client() -> openai.AsyncAzureOpenAI:\n",
138-
" return openai.AsyncAzureOpenAI(\n",
139-
" api_version=api_version,\n",
140-
" azure_endpoint=endpoint,\n",
141-
" api_key=api_key,\n",
142-
" )\n",
143-
"\n",
144-
" else:\n",
145-
" credential = azure.identity.DefaultAzureCredential()\n",
146-
" token_provider = azure.identity.get_bearer_token_provider(\n",
147-
" credential,\n",
148-
" \"https://cognitiveservices.azure.com/.default\",\n",
146+
" api_version = os.environ.get(\"AZURE_OPENAI_API_VERSION\", \"2024-05-01-preview\")\n",
147+
" api_key = os.environ[\"AZURE_OPENAI_API_KEY\"]\n",
148+
"\n",
149+
" def _build_client() -> openai.AsyncAzureOpenAI:\n",
150+
" return openai.AsyncAzureOpenAI(\n",
151+
" api_version=api_version,\n",
152+
" azure_endpoint=endpoint,\n",
153+
" api_key=api_key,\n",
149154
" )\n",
150155
"\n",
151-
" def _build_client() -> openai.AsyncAzureOpenAI:\n",
152-
" return openai.AsyncAzureOpenAI(\n",
153-
" api_version=api_version,\n",
154-
" azure_endpoint=endpoint,\n",
155-
" azure_ad_token_provider=token_provider,\n",
156-
" )\n",
157-
"\n",
158156
" return _ApiConfig(\n",
159157
" build_client=_build_client,\n",
160-
" model_name=deployment,\n",
158+
" model_name=MODEL_NAME,\n",
161159
" base_url=endpoint,\n",
162160
" provider=\"azure.ai.openai\",\n",
163161
" )\n",
@@ -166,9 +164,13 @@
166164
"def _configure_tracer() -> None:\n",
167165
" \"\"\"Configure tracer provider and exporter.\"\"\"\n",
168166
"\n",
169-
" resource = Resource.create({\"service.name\": \"weekend-planner-service\", \"service.namespace\": \"ignite25\", \"service.version\": os.getenv(\"SERVICE_VERSION\", \"1.0.0\")})\n",
167+
" resource = Resource.create({\n",
168+
" \"service.name\": \"weekend-planner-service\",\n",
169+
" \"service.namespace\": \"ignite25\",\n",
170+
" \"service.version\": SERVICE_VERSION,\n",
171+
" })\n",
170172
" provider = TracerProvider(resource=resource)\n",
171-
" connection_string = os.getenv(\"APPLICATION_INSIGHTS_CONNECTION_STRING\")\n",
173+
" connection_string = os.environ.get(\"APPLICATION_INSIGHTS_CONNECTION_STRING\")\n",
172174
"\n",
173175
" if connection_string and AzureMonitorTraceExporter is not None:\n",
174176
" exporter = AzureMonitorTraceExporter.from_connection_string(connection_string)\n",
@@ -181,7 +183,7 @@
181183
" else:\n",
182184
" print(\"[otel] Console span exporter configured\")\n",
183185
"\n",
184-
" trace.set_tracer_provider(provider)"
186+
" trace.set_tracer_provider(provider)\n"
185187
]
186188
},
187189
{
@@ -313,4 +315,4 @@
313315
},
314316
"nbformat": 4,
315317
"nbformat_minor": 5
316-
}
318+
}

lab/5-Observability/2-LangChain/weekend_planner.ipynb

Lines changed: 27 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,22 @@
1818
"\n",
1919
"```bash\n",
2020
"pip install langchain langchain-openai \"langchain-azure-ai[opentelemetry]\" rich python-dotenv\n",
21-
"pip install azure-identity # required when API_HOST=azure\n",
2221
"```\n",
2322
"\n",
24-
"Configure environment variables for your model provider (GitHub Models by default) and optionally `APPLICATION_INSIGHTS_CONNECTION_STRING` to export to Azure Monitor."
23+
"Export the following environment variables (unused entries can remain empty) before running the cells:\n",
24+
"- `AZURE_OPENAI_API_KEY`\n",
25+
"- `AZURE_OPENAI_ENDPOINT`\n",
26+
"- `AZURE_OPENAI_API_VERSION`\n",
27+
"- `AZURE_AI_FOUNDRY_NAME`\n",
28+
"- `AZURE_AOAI_ACCOUNT`\n",
29+
"- `AZURE_SUBSCRIPTION_ID`\n",
30+
"- `AZURE_RESOURCE_GROUP`\n",
31+
"- `AZURE_AISEARCH_ENDPOINT`\n",
32+
"- `AZURE_AISEARCH_INDEX`\n",
33+
"- `AZURE_AISEARCH_RESOURCE_GROUP`\n",
34+
"- `APPLICATION_INSIGHTS_CONNECTION_STRING`\n",
35+
"\n",
36+
"The labs rely solely on this set of variables.\n"
2537
]
2638
},
2739
{
@@ -45,11 +57,10 @@
4557
"import random\n",
4658
"from datetime import datetime\n",
4759
"\n",
48-
"import azure.identity\n",
4960
"from dotenv import load_dotenv\n",
5061
"from langchain.agents import create_agent\n",
5162
"from langchain_core.tools import tool\n",
52-
"from langchain_openai import AzureChatOpenAI, ChatOpenAI\n",
63+
"from langchain_openai import AzureChatOpenAI\n",
5364
"from rich import print\n",
5465
"from rich.logging import RichHandler\n",
5566
"\n",
@@ -59,7 +70,9 @@
5970
"\n",
6071
"logging.basicConfig(level=logging.WARNING, format=\"%(message)s\", datefmt=\"[%X]\", handlers=[RichHandler()])\n",
6172
"LOGGER = logging.getLogger(\"weekend_planner\")\n",
62-
"LOGGER.setLevel(logging.INFO)"
73+
"LOGGER.setLevel(logging.INFO)\n",
74+
"\n",
75+
"MODEL_DEPLOYMENT = os.environ.get(\"AZURE_AI_FOUNDRY_NAME\") or \"gpt-4o-mini\"\n"
6376
]
6477
},
6578
{
@@ -76,39 +89,19 @@
7689
"metadata": {},
7790
"outputs": [],
7891
"source": [
79-
"def _build_model():\n",
80-
" host = os.getenv(\"API_HOST\", \"github\").lower()\n",
81-
"\n",
82-
" if host == \"azure\":\n",
83-
" token_provider = azure.identity.get_bearer_token_provider(\n",
84-
" azure.identity.DefaultAzureCredential(),\n",
85-
" \"https://cognitiveservices.azure.com/.default\",\n",
86-
" )\n",
87-
" return AzureChatOpenAI(\n",
88-
" azure_endpoint=os.environ.get(\"AZURE_OPENAI_ENDPOINT\"),\n",
89-
" azure_deployment=os.environ.get(\"AZURE_OPENAI_CHAT_DEPLOYMENT\"),\n",
90-
" openai_api_version=os.environ.get(\"AZURE_OPENAI_VERSION\"),\n",
91-
" azure_ad_token_provider=token_provider,\n",
92-
" )\n",
93-
"\n",
94-
" if host == \"github\":\n",
95-
" return ChatOpenAI(\n",
96-
" model=os.getenv(\"GITHUB_MODEL\", \"gpt-4o\"),\n",
97-
" base_url=os.getenv(\"GITHUB_OPENAI_BASE_URL\", \"https://models.inference.ai.azure.com\"),\n",
98-
" api_key=os.environ.get(\"GITHUB_TOKEN\"),\n",
99-
" )\n",
100-
"\n",
101-
" raise ValueError(\"API_HOST must be 'github' or 'azure'\")\n",
102-
"\n",
103-
"\n",
10492
"TRACER = AzureAIOpenTelemetryTracer(\n",
10593
" connection_string=os.environ.get(\"APPLICATION_INSIGHTS_CONNECTION_STRING\"),\n",
106-
" enable_content_recording=os.getenv(\"OTEL_RECORD_CONTENT\", \"true\").lower() == \"true\",\n",
94+
" enable_content_recording=True,\n",
10795
" name=\"Weekend Planner Agent\",\n",
10896
")\n",
10997
"\n",
110-
"MODEL = _build_model()\n",
111-
"print(\"Model configured:\", MODEL.model_name if hasattr(MODEL, \"model_name\") else \"custom\")"
98+
"MODEL = AzureChatOpenAI(\n",
99+
" azure_endpoint=os.environ[\"AZURE_OPENAI_ENDPOINT\"],\n",
100+
" api_key=os.environ[\"AZURE_OPENAI_API_KEY\"],\n",
101+
" api_version=os.environ.get(\"AZURE_OPENAI_API_VERSION\", \"2024-05-01-preview\"),\n",
102+
" azure_deployment=MODEL_DEPLOYMENT,\n",
103+
")\n",
104+
"print(\"Model configured with deployment:\", MODEL_DEPLOYMENT)\n"
112105
]
113106
},
114107
{
@@ -203,4 +196,4 @@
203196
},
204197
"nbformat": 4,
205198
"nbformat_minor": 5
206-
}
199+
}

lab/5-Observability/3-LangGraph/music_router.ipynb

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,22 @@
1818
"\n",
1919
"```bash\n",
2020
"pip install langchain langgraph langchain-openai \"langchain-azure-ai[opentelemetry]\" python-dotenv\n",
21-
"pip install azure-identity # required when API_HOST=azure\n",
2221
"```\n",
2322
"\n",
24-
"Set `API_HOST` to `github` (default) or `azure`, provide the corresponding credentials, and optionally `APPLICATION_INSIGHTS_CONNECTION_STRING` for Azure Monitor export."
23+
"Export the following environment variables (values may be blank if not used in this sample):\n",
24+
"- `AZURE_OPENAI_API_KEY`\n",
25+
"- `AZURE_OPENAI_ENDPOINT`\n",
26+
"- `AZURE_OPENAI_API_VERSION`\n",
27+
"- `AZURE_AI_FOUNDRY_NAME`\n",
28+
"- `AZURE_AOAI_ACCOUNT`\n",
29+
"- `AZURE_SUBSCRIPTION_ID`\n",
30+
"- `AZURE_RESOURCE_GROUP`\n",
31+
"- `AZURE_AISEARCH_ENDPOINT`\n",
32+
"- `AZURE_AISEARCH_INDEX`\n",
33+
"- `AZURE_AISEARCH_RESOURCE_GROUP`\n",
34+
"- `APPLICATION_INSIGHTS_CONNECTION_STRING`\n",
35+
"\n",
36+
"The observability labs only reference this list of variables.\n"
2537
]
2638
},
2739
{
@@ -42,18 +54,19 @@
4254
"\n",
4355
"import os\n",
4456
"\n",
45-
"import azure.identity\n",
4657
"from dotenv import load_dotenv\n",
4758
"from langchain_core.messages import HumanMessage\n",
4859
"from langchain_core.tools import tool\n",
49-
"from langchain_openai import AzureChatOpenAI, ChatOpenAI\n",
60+
"from langchain_openai import AzureChatOpenAI\n",
5061
"from langgraph.checkpoint.memory import MemorySaver\n",
5162
"from langgraph.graph import END, START, MessagesState, StateGraph\n",
5263
"from langgraph.prebuilt import ToolNode\n",
5364
"\n",
5465
"from langchain_azure_ai.callbacks.tracers import AzureAIOpenTelemetryTracer\n",
5566
"\n",
56-
"load_dotenv(override=True)"
67+
"load_dotenv(override=True)\n",
68+
"\n",
69+
"MODEL_DEPLOYMENT = os.environ.get(\"AZURE_AI_FOUNDRY_NAME\") or \"gpt-4o-mini\"\n"
5770
]
5871
},
5972
{
@@ -70,39 +83,19 @@
7083
"metadata": {},
7184
"outputs": [],
7285
"source": [
73-
"def _build_model():\n",
74-
" host = os.getenv(\"API_HOST\", \"github\").lower()\n",
75-
"\n",
76-
" if host == \"azure\":\n",
77-
" token_provider = azure.identity.get_bearer_token_provider(\n",
78-
" azure.identity.DefaultAzureCredential(),\n",
79-
" \"https://cognitiveservices.azure.com/.default\",\n",
80-
" )\n",
81-
" return AzureChatOpenAI(\n",
82-
" azure_endpoint=os.environ.get(\"AZURE_OPENAI_ENDPOINT\"),\n",
83-
" azure_deployment=os.environ.get(\"AZURE_OPENAI_CHAT_DEPLOYMENT\"),\n",
84-
" openai_api_version=os.environ.get(\"AZURE_OPENAI_VERSION\"),\n",
85-
" azure_ad_token_provider=token_provider,\n",
86-
" )\n",
87-
"\n",
88-
" if host == \"github\":\n",
89-
" return ChatOpenAI(\n",
90-
" model=os.getenv(\"GITHUB_MODEL\", \"gpt-4o\"),\n",
91-
" base_url=os.getenv(\"GITHUB_OPENAI_BASE_URL\", \"https://models.inference.ai.azure.com\"),\n",
92-
" api_key=os.environ.get(\"GITHUB_TOKEN\"),\n",
93-
" )\n",
94-
"\n",
95-
" raise ValueError(\"API_HOST must be 'github' or 'azure'\")\n",
96-
"\n",
97-
"\n",
9886
"TRACER = AzureAIOpenTelemetryTracer(\n",
9987
" connection_string=os.environ.get(\"APPLICATION_INSIGHTS_CONNECTION_STRING\"),\n",
100-
" enable_content_recording=os.getenv(\"OTEL_RECORD_CONTENT\", \"true\").lower() == \"true\",\n",
101-
" name=\"Music Player Agent\",\n",
88+
" enable_content_recording=True,\n",
89+
" name=\"Music Router Agent\",\n",
10290
")\n",
10391
"\n",
104-
"MODEL = _build_model()\n",
105-
"print(\"Model ready:\", MODEL.model_name if hasattr(MODEL, \"model_name\") else \"custom\")"
92+
"MODEL = AzureChatOpenAI(\n",
93+
" azure_endpoint=os.environ[\"AZURE_OPENAI_ENDPOINT\"],\n",
94+
" api_key=os.environ[\"AZURE_OPENAI_API_KEY\"],\n",
95+
" api_version=os.environ.get(\"AZURE_OPENAI_API_VERSION\", \"2024-05-01-preview\"),\n",
96+
" azure_deployment=MODEL_DEPLOYMENT,\n",
97+
")\n",
98+
"print(\"Model ready with deployment:\", MODEL_DEPLOYMENT)\n"
10699
]
107100
},
108101
{
@@ -211,4 +204,4 @@
211204
},
212205
"nbformat": 4,
213206
"nbformat_minor": 5
214-
}
207+
}

lab/5-Observability/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ Both packages automatically apply the GenAI semantic conventions and expose togg
3232

3333
## Running the Samples
3434

35-
1. Set the environment variables for your preferred model host (GitHub Models or Azure OpenAI). Each sample documents the required variables at the top of the file.
35+
1. Export the following environment variables before running any notebook (set unused values to an empty string): `AZURE_OPENAI_API_KEY`, `AZURE_OPENAI_ENDPOINT`, `AZURE_OPENAI_API_VERSION`, `AZURE_AI_FOUNDRY_NAME`, `AZURE_AOAI_ACCOUNT`, `AZURE_SUBSCRIPTION_ID`, `AZURE_RESOURCE_GROUP`, `AZURE_AISEARCH_ENDPOINT`, `AZURE_AISEARCH_INDEX`, `AZURE_AISEARCH_RESOURCE_GROUP`, and `APPLICATION_INSIGHTS_CONNECTION_STRING`.
3636
1. Export an `APPLICATION_INSIGHTS_CONNECTION_STRING` if you want spans to flow into Azure Monitor; otherwise the scripts fall back to console exporters so you can inspect payloads locally.
3737
1. Open any notebook (for example, `lab/5-Observability/1-OpenAIAgents/weekend_planner.ipynb`) and run the cells in order. Observe the emitted spans and confirm that the GenAI attributes align with the semantic conventions.
3838

0 commit comments

Comments
 (0)