diff --git a/03-integrations/observability/dynatrace/README.md b/03-integrations/observability/dynatrace/README.md index 91dd47596..39545ca95 100644 --- a/03-integrations/observability/dynatrace/README.md +++ b/03-integrations/observability/dynatrace/README.md @@ -1,7 +1,47 @@ -# Amazon Bedrock Agent Integration with Dynatrace +# Travel Agent Deployed on Amazon Bedrock AgentCore with Dynatrace Observability -This example contains a demo of a Personal Assistant Agent built on top of [Bedrock AgentCore Agents](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/what-is-bedrock-agentcore.html). +This example demonstrates a Travel Agent built on top of [Bedrock AgentCore](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/what-is-bedrock-agentcore.html) with full observability through Dynatrace. +## Architecture + +The following diagram illustrates the architecture of the Travel Agent deployed via Bedrock Agentcore with Dynatrace observability integration: + +![Architecture Diagram](./dynatrace-agentcore.png) + +The architecture consists of: +- **Travel Agent**: Built using Strands framework and deployed on Bedrock AgentCore runtime +- **Agent Tools**: web search and get_weather +- **Amazon Bedrock**: Provides the foundation model of choice +- **OpenTelemetry**: Captures traces, logs, and metrics from the agent +- **Dynatrace**: Receives and visualizes observability data via OTLP + +## What is the Travel Agent? + +The Travel Agent is an intelligent assistant designed to help users plan trips, check weather conditions and search for travel information. It leverages multiple tools to provide comprehensive travel assistance. + +### Agent Capabilities + +The Travel Agent is equipped with the following tools: + +1. **Web Search** (`web_search`) + - Searches the web using DuckDuckGo to find current travel information + - Retrieves information about destinations, flights, hotels, attractions, and travel tips + - Returns formatted results with titles, URLs, and descriptions + - Parameters: `query` (search string), `max_results` (default: 5) + +2. **Weather Information** (`get_weather`) + - Provides real-time weather data for any location worldwide + - Uses the Open-Meteo API for accurate weather forecasts + - Returns temperature (actual and feels-like), weather conditions, humidity, wind speed, and precipitation + - Parameters: `location` (city name or location) + +### Example Use Cases + +- "Give me suggestions for a 7 day trip to Italy in August based on what the weather is going to be like each day" +- "I'm planning a 5-day trip to Japan in spring. What's the weather forecast and what are the must-see cherry blossom spots?" +- "Help me plan a weekend getaway to Barcelona. Check the weather and recommend outdoor activities if it's sunny" +- "I have a 10-day vacation budget of $3000. Suggest destinations in Southeast Asia with good weather in December and calculate daily spending" +- "What is the weather like in Iceland right now? Should I visit the Blue Lagoon today or wait for better conditions?" ## Prerequisites @@ -11,7 +51,6 @@ This example contains a demo of a Personal Assistant Agent built on top of [Bedr - Access to the following AWS services: - Amazon Bedrock - ## Dynatrace Instrumentation > [!TIP] @@ -23,32 +62,49 @@ Hence, we just need to register an [OpenTelemetry SDK](https://github.com/open-t We simplified this process, hiding all the complexity inside [dynatrace.py](./dynatrace.py). For sending data to your Dynatrace tenant, you can configure the `OTEL_ENDPOINT` env var with your Dynatrace URL for ingesting [OTLP](https://docs.dynatrace.com/docs/shortlink/otel-getstarted-otlpexport), for example: `https://wkf10640.live.dynatrace.com/api/v2/otlp`. -The API access token will be read from your filesystem under `/etc/secrets/dynatrace_otel` or from the environment variable `DT_TOKEN`. - +The API access token will be read from your filesystem under `/etc/secrets/dynatrace_otel` or from the environment variable `DT_TOKEN`. ## How to use -### Setting your AWS keys +### Setting your AWS Credentials + +#### Step 1: Create AWS Access Keys + +1. Sign in to the [AWS Management Console](https://console.aws.amazon.com/) +2. Navigate to **IAM** (Identity and Access Management) +3. In the left navigation pane, select **Users** +4. Select your IAM user name (or [create a new user](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html) if needed) +5. Select the **Security credentials** tab +6. Under **Access keys**, select **Create access key** +7. Choose **Command Line Interface (CLI)** as the use case +8. Check the confirmation box and select **Next** +9. (Optional) Add a description tag for the access key +10. Select **Create access key** +11. **Important**: Copy both the **Access key ID** and **Secret access key** immediately - you won't be able to see the secret key again -Follow the [Amazon Bedrock AgentCore documentation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime-permissions.html) to configure your AWS Role with the correct policies. -Afterwards, you can set your AWS keys in your environment variables by running the following command in your terminal: +#### Step 2: Configure AWS Credentials +Run the following command: ```bash -export AWS_ACCESS_KEY_ID==your_api_key -export AWS_SECRET_ACCESS_KEY==your_secret_key -export AWS_REGION=your_region +aws configure ``` -Ensure your account has access to the model `eu.anthropic.claude-3-7-sonnet-20250219-v1:0` used in this example. Please, refer to the -[Amazon Bedrock documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access-permissions.html) to see how to enable access to the model. -You can change the model used by configuring the environment variable `BEDROCK_MODEL_ID`. +When prompted, enter: +- AWS Access Key ID: `your_access_key_id` +- AWS Secret Access Key: `your_secret_access_key` +- Default region name: `us-east-1` (or your preferred region) +- Default output format: (press enter and leave it default or set it per your perference) + +#### Step 3: Configure IAM Permissions + +Ensure your IAM user has the necessary permissions. Follow the [Amazon Bedrock AgentCore documentation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime-permissions.html) to attach the required policies. ### Setting your Dynatrace Token Create a [Free Dynatrace Trial](https://www.dynatrace.com/signup/) for 15 days. After a few minutes, you will get redirected to your tenant. The URL will look like `https://wkf10640.apps.dynatrace.com/`. -The value `wkf10640` is your environment id which will be needed later. +The value in your URL in place of `wkf10640` is your environment id which will be needed later. After that, you can create an Access Token: @@ -63,31 +119,78 @@ After that, you can create an Access Token: 6. Select **Generate token**. 7. Copy the generated token to the clipboard. Store the token in a password manager for future use. - Afterwards, you can set your Dynatrace information in your environment variables by running the following command in your terminal: ```bash -export DT_TOKEN==your_access_token -export OTEL_ENDPOINT==https://{your-environment-id}.live.dynatrace.com/api/v2/otlp +export DT_TOKEN=your_access_token +export OTEL_ENDPOINT=https://{your-environment-id}.live.dynatrace.com/api/v2/otlp ``` +Replace `{your-environment-id}` with your actual Dynatrace environment ID (e.g., `wkf10640`). + +### Install Dependencies + +Install the required dependencies using uv: + +```bash +uv sync +``` ### Run the app -You can start the example with the following command: `uv run main.py` -This will create an HTTP server that listens on the port `8080` that implements the required `/invocations` endpoint for processing the agent's requirements. +Start the Travel Agent with the following command: -The Agent is now ready to be deployed. The best practice is to package code as container and push to ECR using CI/CD pipelines and IaC. -You can follow the guide -[here](https://github.com/awslabs/amazon-bedrock-agentcore-samples/blob/main/01-tutorials/01-AgentCore-runtime/01-hosting-agent/01-strands-with-bedrock-model/runtime_with_strands_and_bedrock_models.ipynb) -to have a full step-by-step tutorial. +```bash +uv run main.py +``` + +This will create an HTTP server that listens on port `8080` and implements the required `/invocations` endpoint for processing the agent's requests. + +### Interact with the Travel Agent + +You can interact with your Travel Agent using curl commands: -You can interact with your agent with the following command: +**Plan a multi-day trip with weather considerations:** +```bash +curl -X POST http://127.0.0.1:8080/invocations \ + --data '{"prompt": "Give me suggestions for a 7 day trip to Italy in August based on what the weather is going to be like each day"}' +``` + +**Get weather-based activity recommendations:** +```bash +curl -X POST http://127.0.0.1:8080/invocations \ + --data '{"prompt": "Help me plan a weekend in Barcelona. Check the weather and recommend outdoor activities if it is sunny"}' +``` +**Plan a trip with budget calculations:** ```bash -curl -X POST http://127.0.0.1:8080/invocations --data '{"prompt": "What is the weather now?"}' +curl -X POST http://127.0.0.1:8080/invocations \ + --data '{"prompt": "I have a 10-day vacation budget of $3000. Suggest destinations in Southeast Asia with good weather in December and calculate daily spending"}' ``` -Now you have full observability of your Bedrock AgentCore Agents in Dynatrace 🚀 +**Check current weather for travel decisions:** +```bash +curl -X POST http://127.0.0.1:8080/invocations \ + --data '{"prompt": "What is the weather like in Iceland right now? Should I visit the Blue Lagoon today or wait for better conditions?"}' +``` + +**Seasonal trip planning:** +```bash +curl -X POST http://127.0.0.1:8080/invocations \ + --data '{"prompt": "I am planning a 5-day trip to Japan in spring. What is the weather forecast and what are the must-see cherry blossom spots?"}' +``` + +### Deployment + +The Agent is now ready to be deployed. The best practice is to package the code as a container and push to ECR using CI/CD pipelines and IaC. +You can follow the guide +[here](https://github.com/awslabs/amazon-bedrock-agentcore-samples/blob/main/01-tutorials/01-AgentCore-runtime/01-hosting-agent/01-strands-with-bedrock-model/runtime_with_strands_and_bedrock_models.ipynb) +for a full step-by-step tutorial. + +## Observability in Dynatrace + +Now you have full observability of your Bedrock AgentCore Agents in Dynatrace! + +You can view detailed traces, metrics, and logs for your Travel Agent: -![Tracing](./dynatrace.png) \ No newline at end of file +![Dynatrace Tracing](./dynatrace.png) \ No newline at end of file diff --git a/03-integrations/observability/dynatrace/dynatrace-agentcore.png b/03-integrations/observability/dynatrace/dynatrace-agentcore.png new file mode 100644 index 000000000..320394970 Binary files /dev/null and b/03-integrations/observability/dynatrace/dynatrace-agentcore.png differ diff --git a/03-integrations/observability/dynatrace/dynatrace.png b/03-integrations/observability/dynatrace/dynatrace.png index 3c42a0598..d39b95448 100644 Binary files a/03-integrations/observability/dynatrace/dynatrace.png and b/03-integrations/observability/dynatrace/dynatrace.png differ diff --git a/03-integrations/observability/dynatrace/pyproject.toml b/03-integrations/observability/dynatrace/pyproject.toml index 3fc42f526..3e339de7b 100644 --- a/03-integrations/observability/dynatrace/pyproject.toml +++ b/03-integrations/observability/dynatrace/pyproject.toml @@ -12,4 +12,7 @@ dependencies = [ "strands-agents-tools", "strands-agents", "opentelemetry-sdk", + "opentelemetry-exporter-otlp-proto-http", + "duckduckgo-search", + "requests", ] diff --git a/03-integrations/observability/dynatrace/travel_agent.py b/03-integrations/observability/dynatrace/travel_agent.py index 1600a24ed..554cb4710 100644 --- a/03-integrations/observability/dynatrace/travel_agent.py +++ b/03-integrations/observability/dynatrace/travel_agent.py @@ -1,26 +1,132 @@ import os +import requests from strands import Agent, tool -from strands_tools import calculator # Import the calculator tool from strands.models import BedrockModel from bedrock_agentcore.runtime import BedrockAgentCoreApp +from duckduckgo_search import DDGS app = BedrockAgentCoreApp() -# Create a custom tool + +@tool +def get_weather(location: str): + """ + Get current weather information for a specific location. + + Args: + location: City name or location (e.g., "London", "New York", "Tokyo") + + Returns: + Current weather information including temperature, conditions, and wind speed + """ + try: + # First, get coordinates for the location using geocoding + geocoding_url = "https://geocoding-api.open-meteo.com/v1/search" + geocoding_params = { + "name": location, + "count": 1, + "language": "en", + "format": "json" + } + + geo_response = requests.get(geocoding_url, params=geocoding_params, timeout=10) + geo_response.raise_for_status() + geo_data = geo_response.json() + + if not geo_data.get("results"): + return f"Location '{location}' not found. Please provide a valid city name." + + result = geo_data["results"][0] + latitude = result["latitude"] + longitude = result["longitude"] + location_name = result["name"] + country = result.get("country", "") + + # Get weather data + weather_url = "https://api.open-meteo.com/v1/forecast" + weather_params = { + "latitude": latitude, + "longitude": longitude, + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m", + "temperature_unit": "celsius", + "wind_speed_unit": "kmh" + } + + weather_response = requests.get(weather_url, params=weather_params, timeout=10) + weather_response.raise_for_status() + weather_data = weather_response.json() + + current = weather_data["current"] + + # Weather code interpretation + weather_codes = { + 0: "Clear sky", + 1: "Mainly clear", 2: "Partly cloudy", 3: "Overcast", + 45: "Foggy", 48: "Depositing rime fog", + 51: "Light drizzle", 53: "Moderate drizzle", 55: "Dense drizzle", + 61: "Slight rain", 63: "Moderate rain", 65: "Heavy rain", + 71: "Slight snow", 73: "Moderate snow", 75: "Heavy snow", + 77: "Snow grains", + 80: "Slight rain showers", 81: "Moderate rain showers", 82: "Violent rain showers", + 85: "Slight snow showers", 86: "Heavy snow showers", + 95: "Thunderstorm", 96: "Thunderstorm with slight hail", 99: "Thunderstorm with heavy hail" + } + + weather_description = weather_codes.get(current["weather_code"], "Unknown") + + return ( + f"Weather in {location_name}, {country}:\n" + f"Temperature: {current['temperature_2m']}°C (feels like {current['apparent_temperature']}°C)\n" + f"Conditions: {weather_description}\n" + f"Humidity: {current['relative_humidity_2m']}%\n" + f"Wind Speed: {current['wind_speed_10m']} km/h\n" + f"Precipitation: {current['precipitation']} mm" + ) + + except requests.exceptions.RequestException as e: + return f"Error fetching weather data: {str(e)}" + except Exception as e: + return f"Error processing weather request: {str(e)}" + + @tool -def weather(): - """Get weather""" # Dummy implementation - return "sunny" +def web_search(query: str, max_results: int = 5): + """ + Search the web using DuckDuckGo. + + Args: + query: The search query string + max_results: Maximum number of results to return (default: 5) + + Returns: + A list of search results with title, link, and snippet + """ + try: + with DDGS() as ddgs: + results = list(ddgs.text(query, max_results=max_results)) + if not results: + return "No results found." + + formatted_results = [] + for i, result in enumerate(results, 1): + formatted_results.append( + f"{i}. {result.get('title', 'No title')}\n" + f" URL: {result.get('href', 'No URL')}\n" + f" {result.get('body', 'No description')}" + ) + return "\n\n".join(formatted_results) + except Exception as e: + return f"Error performing web search: {str(e)}" -model_id = os.getenv("BEDROCK_MODEL_ID", "eu.anthropic.claude-3-7-sonnet-20250219-v1:0") +model_id = os.getenv("BEDROCK_MODEL_ID", "us.anthropic.claude-3-7-sonnet-20250219-v1:0") model = BedrockModel( model_id=model_id, ) agent = Agent( model=model, - tools=[calculator, weather], - system_prompt="You're a helpful assistant. You can do simple math calculation, and tell the weather.", + tools=[get_weather, web_search], + system_prompt="You're a helpful travel assistant. You can search the web for travel information, check current weather conditions for any location, and do simple math calculations. Use web search to find current information about destinations, flights, hotels, attractions, and travel tips. Use get_weather to provide accurate, real-time weather information for travelers.", ) @app.entrypoint @@ -30,4 +136,4 @@ def strands_agent_bedrock(payload): """ user_input = payload.get("prompt") response = agent(user_input) - return response.message["content"][0]["text"] + return response.message["content"][0]["text"] \ No newline at end of file diff --git a/03-integrations/observability/dynatrace/uv.lock b/03-integrations/observability/dynatrace/uv.lock index 330145a7c..03977c1e2 100644 --- a/03-integrations/observability/dynatrace/uv.lock +++ b/03-integrations/observability/dynatrace/uv.lock @@ -15,7 +15,10 @@ dependencies = [ { name = "bedrock-agentcore" }, { name = "bedrock-agentcore-starter-toolkit" }, { name = "boto3" }, + { name = "duckduckgo-search" }, + { name = "opentelemetry-exporter-otlp-proto-http" }, { name = "opentelemetry-sdk" }, + { name = "requests" }, { name = "strands-agents" }, { name = "strands-agents-tools" }, { name = "uv" }, @@ -26,7 +29,10 @@ requires-dist = [ { name = "bedrock-agentcore" }, { name = "bedrock-agentcore-starter-toolkit" }, { name = "boto3" }, + { name = "duckduckgo-search" }, + { name = "opentelemetry-exporter-otlp-proto-http" }, { name = "opentelemetry-sdk" }, + { name = "requests" }, { name = "strands-agents" }, { name = "strands-agents-tools" }, { name = "uv" }, @@ -380,6 +386,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, ] +[[package]] +name = "duckduckgo-search" +version = "8.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "lxml" }, + { name = "primp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/10/ef/07791a05751e6cc9de1dd49fb12730259ee109b18e6d097e25e6c32d5617/duckduckgo_search-8.1.1.tar.gz", hash = "sha256:9da91c9eb26a17e016ea1da26235d40404b46b0565ea86d75a9f78cc9441f935", size = 22868, upload-time = "2025-07-06T15:30:59.73Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/72/c027b3b488b1010cf71670032fcf7e681d44b81829d484bb04e31a949a8d/duckduckgo_search-8.1.1-py3-none-any.whl", hash = "sha256:f48adbb06626ee05918f7e0cef3a45639e9939805c4fc179e68c48a12f1b5062", size = 18932, upload-time = "2025-07-06T15:30:58.339Z" }, +] + [[package]] name = "frozenlist" version = "1.7.0" @@ -457,6 +477,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ee/45/b82e3c16be2182bff01179db177fe144d58b5dc787a7d4492c6ed8b9317f/frozenlist-1.7.0-py3-none-any.whl", hash = "sha256:9a5af342e34f7e97caf8c995864c7a396418ae2859cc6fdf1b1073020d516a7e", size = 13106, upload-time = "2025-06-09T23:02:34.204Z" }, ] +[[package]] +name = "googleapis-common-protos" +version = "1.72.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e5/7b/adfd75544c415c487b33061fe7ae526165241c1ea133f9a9125a56b39fd8/googleapis_common_protos-1.72.0.tar.gz", hash = "sha256:e55a601c1b32b52d7a3e65f43563e2aa61bcd737998ee672ac9b951cd49319f5", size = 147433, upload-time = "2025-11-06T18:29:24.087Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/ab/09169d5a4612a5f92490806649ac8d41e3ec9129c636754575b3553f4ea4/googleapis_common_protos-1.72.0-py3-none-any.whl", hash = "sha256:4299c5a82d5ae1a9702ada957347726b167f9f8d1fc352477702a1e851ff4038", size = 297515, upload-time = "2025-11-06T18:29:13.14Z" }, +] + [[package]] name = "h11" version = "0.16.0" @@ -918,20 +950,50 @@ wheels = [ [[package]] name = "opentelemetry-api" -version = "1.34.1" +version = "1.38.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "importlib-metadata" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4d/5e/94a8cb759e4e409022229418294e098ca7feca00eb3c467bb20cbd329bda/opentelemetry_api-1.34.1.tar.gz", hash = "sha256:64f0bd06d42824843731d05beea88d4d4b6ae59f9fe347ff7dfa2cc14233bbb3", size = 64987, upload-time = "2025-06-10T08:55:19.818Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/d8/0f354c375628e048bd0570645b310797299754730079853095bf000fba69/opentelemetry_api-1.38.0.tar.gz", hash = "sha256:f4c193b5e8acb0912b06ac5b16321908dd0843d75049c091487322284a3eea12", size = 65242, upload-time = "2025-10-16T08:35:50.25Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/3a/2ba85557e8dc024c0842ad22c570418dc02c36cbd1ab4b832a93edf071b8/opentelemetry_api-1.34.1-py3-none-any.whl", hash = "sha256:b7df4cb0830d5a6c29ad0c0691dbae874d8daefa934b8b1d642de48323d32a8c", size = 65767, upload-time = "2025-06-10T08:54:56.717Z" }, + { url = "https://files.pythonhosted.org/packages/ae/a2/d86e01c28300bd41bab8f18afd613676e2bd63515417b77636fc1add426f/opentelemetry_api-1.38.0-py3-none-any.whl", hash = "sha256:2891b0197f47124454ab9f0cf58f3be33faca394457ac3e09daba13ff50aa582", size = 65947, upload-time = "2025-10-16T08:35:30.23Z" }, +] + +[[package]] +name = "opentelemetry-exporter-otlp-proto-common" +version = "1.38.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-proto" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/83/dd4660f2956ff88ed071e9e0e36e830df14b8c5dc06722dbde1841accbe8/opentelemetry_exporter_otlp_proto_common-1.38.0.tar.gz", hash = "sha256:e333278afab4695aa8114eeb7bf4e44e65c6607d54968271a249c180b2cb605c", size = 20431, upload-time = "2025-10-16T08:35:53.285Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/9e/55a41c9601191e8cd8eb626b54ee6827b9c9d4a46d736f32abc80d8039fc/opentelemetry_exporter_otlp_proto_common-1.38.0-py3-none-any.whl", hash = "sha256:03cb76ab213300fe4f4c62b7d8f17d97fcfd21b89f0b5ce38ea156327ddda74a", size = 18359, upload-time = "2025-10-16T08:35:34.099Z" }, +] + +[[package]] +name = "opentelemetry-exporter-otlp-proto-http" +version = "1.38.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "googleapis-common-protos" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-exporter-otlp-proto-common" }, + { name = "opentelemetry-proto" }, + { name = "opentelemetry-sdk" }, + { name = "requests" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/0a/debcdfb029fbd1ccd1563f7c287b89a6f7bef3b2902ade56797bfd020854/opentelemetry_exporter_otlp_proto_http-1.38.0.tar.gz", hash = "sha256:f16bd44baf15cbe07633c5112ffc68229d0edbeac7b37610be0b2def4e21e90b", size = 17282, upload-time = "2025-10-16T08:35:54.422Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/77/154004c99fb9f291f74aa0822a2f5bbf565a72d8126b3a1b63ed8e5f83c7/opentelemetry_exporter_otlp_proto_http-1.38.0-py3-none-any.whl", hash = "sha256:84b937305edfc563f08ec69b9cb2298be8188371217e867c1854d77198d0825b", size = 19579, upload-time = "2025-10-16T08:35:36.269Z" }, ] [[package]] name = "opentelemetry-instrumentation" -version = "0.55b1" +version = "0.59b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -939,50 +1001,62 @@ dependencies = [ { name = "packaging" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cb/69/d8995f229ddf4d98b9c85dd126aeca03dd1742f6dc5d3bc0d2f6dae1535c/opentelemetry_instrumentation-0.55b1.tar.gz", hash = "sha256:2dc50aa207b9bfa16f70a1a0571e011e737a9917408934675b89ef4d5718c87b", size = 28552, upload-time = "2025-06-10T08:58:15.312Z" } +sdist = { url = "https://files.pythonhosted.org/packages/04/ed/9c65cd209407fd807fa05be03ee30f159bdac8d59e7ea16a8fe5a1601222/opentelemetry_instrumentation-0.59b0.tar.gz", hash = "sha256:6010f0faaacdaf7c4dff8aac84e226d23437b331dcda7e70367f6d73a7db1adc", size = 31544, upload-time = "2025-10-16T08:39:31.959Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/7d/8ddfda1506c2fcca137924d5688ccabffa1aed9ec0955b7d0772de02cec3/opentelemetry_instrumentation-0.55b1-py3-none-any.whl", hash = "sha256:cbb1496b42bc394e01bc63701b10e69094e8564e281de063e4328d122cc7a97e", size = 31108, upload-time = "2025-06-10T08:57:14.355Z" }, + { url = "https://files.pythonhosted.org/packages/10/f5/7a40ff3f62bfe715dad2f633d7f1174ba1a7dd74254c15b2558b3401262a/opentelemetry_instrumentation-0.59b0-py3-none-any.whl", hash = "sha256:44082cc8fe56b0186e87ee8f7c17c327c4c2ce93bdbe86496e600985d74368ee", size = 33020, upload-time = "2025-10-16T08:38:31.463Z" }, ] [[package]] name = "opentelemetry-instrumentation-threading" -version = "0.55b1" +version = "0.59b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-instrumentation" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e6/a2/470bbc9b7060372d6b183d999080c12a63fb459fc77b9be0ca15694ecabe/opentelemetry_instrumentation_threading-0.55b1.tar.gz", hash = "sha256:4ed68502e7ed017bfc10b1f9e508cc5ccaea0e46ac1010f7f2541ab9c6eacd92", size = 8767, upload-time = "2025-06-10T08:58:46.873Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/7a/84e97d8992808197006e607ae410c2219bdbbc23d1289ba0c244d3220741/opentelemetry_instrumentation_threading-0.59b0.tar.gz", hash = "sha256:ce5658730b697dcbc0e0d6d13643a69fd8aeb1b32fa8db3bade8ce114c7975f3", size = 8770, upload-time = "2025-10-16T08:40:03.587Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/50/32d29076aaa1c91983cdd3ca8c6bb4d344830cd7d87a7c0fdc2d98c58509/opentelemetry_instrumentation_threading-0.59b0-py3-none-any.whl", hash = "sha256:76da2fc01fe1dccebff6581080cff9e42ac7b27cc61eb563f3c4435c727e8eca", size = 9313, upload-time = "2025-10-16T08:39:15.876Z" }, +] + +[[package]] +name = "opentelemetry-proto" +version = "1.38.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/51/14/f0c4f0f6371b9cb7f9fa9ee8918bfd59ac7040c7791f1e6da32a1839780d/opentelemetry_proto-1.38.0.tar.gz", hash = "sha256:88b161e89d9d372ce723da289b7da74c3a8354a8e5359992be813942969ed468", size = 46152, upload-time = "2025-10-16T08:36:01.612Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/c9/183ad41a7ba0374030b3eab335ec6f3eff6acca057aba2b393183e18639e/opentelemetry_instrumentation_threading-0.55b1-py3-none-any.whl", hash = "sha256:f865542b32b219c8fd01deb03b8c3c9ba2eb3f0501ae303338403fd2242962c7", size = 9313, upload-time = "2025-06-10T08:58:02.884Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6a/82b68b14efca5150b2632f3692d627afa76b77378c4999f2648979409528/opentelemetry_proto-1.38.0-py3-none-any.whl", hash = "sha256:b6ebe54d3217c42e45462e2a1ae28c3e2bf2ec5a5645236a490f55f45f1a0a18", size = 72535, upload-time = "2025-10-16T08:35:45.749Z" }, ] [[package]] name = "opentelemetry-sdk" -version = "1.34.1" +version = "1.38.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-semantic-conventions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6f/41/fe20f9036433da8e0fcef568984da4c1d1c771fa072ecd1a4d98779dccdd/opentelemetry_sdk-1.34.1.tar.gz", hash = "sha256:8091db0d763fcd6098d4781bbc80ff0971f94e260739aa6afe6fd379cdf3aa4d", size = 159441, upload-time = "2025-06-10T08:55:33.028Z" } +sdist = { url = "https://files.pythonhosted.org/packages/85/cb/f0eee1445161faf4c9af3ba7b848cc22a50a3d3e2515051ad8628c35ff80/opentelemetry_sdk-1.38.0.tar.gz", hash = "sha256:93df5d4d871ed09cb4272305be4d996236eedb232253e3ab864c8620f051cebe", size = 171942, upload-time = "2025-10-16T08:36:02.257Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/1b/def4fe6aa73f483cabf4c748f4c25070d5f7604dcc8b52e962983491b29e/opentelemetry_sdk-1.34.1-py3-none-any.whl", hash = "sha256:308effad4059562f1d92163c61c8141df649da24ce361827812c40abb2a1e96e", size = 118477, upload-time = "2025-06-10T08:55:16.02Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/e93777a95d7d9c40d270a371392b6d6f1ff170c2a3cb32d6176741b5b723/opentelemetry_sdk-1.38.0-py3-none-any.whl", hash = "sha256:1c66af6564ecc1553d72d811a01df063ff097cdc82ce188da9951f93b8d10f6b", size = 132349, upload-time = "2025-10-16T08:35:46.995Z" }, ] [[package]] name = "opentelemetry-semantic-conventions" -version = "0.55b1" +version = "0.59b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5d/f0/f33458486da911f47c4aa6db9bda308bb80f3236c111bf848bd870c16b16/opentelemetry_semantic_conventions-0.55b1.tar.gz", hash = "sha256:ef95b1f009159c28d7a7849f5cbc71c4c34c845bb514d66adfdf1b3fff3598b3", size = 119829, upload-time = "2025-06-10T08:55:33.881Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/bc/8b9ad3802cd8ac6583a4eb7de7e5d7db004e89cb7efe7008f9c8a537ee75/opentelemetry_semantic_conventions-0.59b0.tar.gz", hash = "sha256:7a6db3f30d70202d5bf9fa4b69bc866ca6a30437287de6c510fb594878aed6b0", size = 129861, upload-time = "2025-10-16T08:36:03.346Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/89/267b0af1b1d0ba828f0e60642b6a5116ac1fd917cde7fc02821627029bd1/opentelemetry_semantic_conventions-0.55b1-py3-none-any.whl", hash = "sha256:5da81dfdf7d52e3d37f8fe88d5e771e191de924cfff5f550ab0b8f7b2409baed", size = 196223, upload-time = "2025-06-10T08:55:17.638Z" }, + { url = "https://files.pythonhosted.org/packages/24/7d/c88d7b15ba8fe5c6b8f93be50fc11795e9fc05386c44afaf6b76fe191f9b/opentelemetry_semantic_conventions-0.59b0-py3-none-any.whl", hash = "sha256:35d3b8833ef97d614136e253c1da9342b4c3c083bbaf29ce31d572a1c3825eed", size = 207954, upload-time = "2025-10-16T08:35:48.054Z" }, ] [[package]] @@ -1102,6 +1176,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a9/a8/fc509e514c708f43102542cdcbc2f42dc49f7a159f90f56d072371629731/prance-25.4.8.0-py3-none-any.whl", hash = "sha256:d3c362036d625b12aeee495621cb1555fd50b2af3632af3d825176bfb50e073b", size = 36386, upload-time = "2025-04-07T22:22:35.183Z" }, ] +[[package]] +name = "primp" +version = "0.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/56/0b/a87556189da4de1fc6360ca1aa05e8335509633f836cdd06dd17f0743300/primp-0.15.0.tar.gz", hash = "sha256:1af8ea4b15f57571ff7fc5e282a82c5eb69bc695e19b8ddeeda324397965b30a", size = 113022, upload-time = "2025-04-17T11:41:05.315Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/5a/146ac964b99ea7657ad67eb66f770be6577dfe9200cb28f9a95baffd6c3f/primp-0.15.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1b281f4ca41a0c6612d4c6e68b96e28acfe786d226a427cd944baa8d7acd644f", size = 3178914, upload-time = "2025-04-17T11:40:59.558Z" }, + { url = "https://files.pythonhosted.org/packages/bc/8a/cc2321e32db3ce64d6e32950d5bcbea01861db97bfb20b5394affc45b387/primp-0.15.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:489cbab55cd793ceb8f90bb7423c6ea64ebb53208ffcf7a044138e3c66d77299", size = 2955079, upload-time = "2025-04-17T11:40:57.398Z" }, + { url = "https://files.pythonhosted.org/packages/c3/7b/cbd5d999a07ff2a21465975d4eb477ae6f69765e8fe8c9087dab250180d8/primp-0.15.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c18b45c23f94016215f62d2334552224236217aaeb716871ce0e4dcfa08eb161", size = 3281018, upload-time = "2025-04-17T11:40:55.308Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6e/a6221c612e61303aec2bcac3f0a02e8b67aee8c0db7bdc174aeb8010f975/primp-0.15.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e985a9cba2e3f96a323722e5440aa9eccaac3178e74b884778e926b5249df080", size = 3255229, upload-time = "2025-04-17T11:40:47.811Z" }, + { url = "https://files.pythonhosted.org/packages/3b/54/bfeef5aca613dc660a69d0760a26c6b8747d8fdb5a7f20cb2cee53c9862f/primp-0.15.0-cp38-abi3-manylinux_2_34_armv7l.whl", hash = "sha256:6b84a6ffa083e34668ff0037221d399c24d939b5629cd38223af860de9e17a83", size = 3014522, upload-time = "2025-04-17T11:40:50.191Z" }, + { url = "https://files.pythonhosted.org/packages/ac/96/84078e09f16a1dad208f2fe0f8a81be2cf36e024675b0f9eec0c2f6e2182/primp-0.15.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:592f6079646bdf5abbbfc3b0a28dac8de943f8907a250ce09398cda5eaebd260", size = 3418567, upload-time = "2025-04-17T11:41:01.595Z" }, + { url = "https://files.pythonhosted.org/packages/6c/80/8a7a9587d3eb85be3d0b64319f2f690c90eb7953e3f73a9ddd9e46c8dc42/primp-0.15.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5a728e5a05f37db6189eb413d22c78bd143fa59dd6a8a26dacd43332b3971fe8", size = 3606279, upload-time = "2025-04-17T11:41:03.61Z" }, + { url = "https://files.pythonhosted.org/packages/0c/dd/f0183ed0145e58cf9d286c1b2c14f63ccee987a4ff79ac85acc31b5d86bd/primp-0.15.0-cp38-abi3-win_amd64.whl", hash = "sha256:aeb6bd20b06dfc92cfe4436939c18de88a58c640752cf7f30d9e4ae893cdec32", size = 3149967, upload-time = "2025-04-17T11:41:07.067Z" }, +] + [[package]] name = "prompt-toolkit" version = "3.0.52" @@ -1187,6 +1277,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cc/35/cc0aaecf278bb4575b8555f2b137de5ab821595ddae9da9d3cd1da4072c7/propcache-0.3.2-py3-none-any.whl", hash = "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f", size = 12663, upload-time = "2025-06-09T22:56:04.484Z" }, ] +[[package]] +name = "protobuf" +version = "6.33.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/03/a1440979a3f74f16cab3b75b0da1a1a7f922d56a8ddea96092391998edc0/protobuf-6.33.1.tar.gz", hash = "sha256:97f65757e8d09870de6fd973aeddb92f85435607235d20b2dfed93405d00c85b", size = 443432, upload-time = "2025-11-13T16:44:18.895Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/f1/446a9bbd2c60772ca36556bac8bfde40eceb28d9cc7838755bc41e001d8f/protobuf-6.33.1-cp310-abi3-win32.whl", hash = "sha256:f8d3fdbc966aaab1d05046d0240dd94d40f2a8c62856d41eaa141ff64a79de6b", size = 425593, upload-time = "2025-11-13T16:44:06.275Z" }, + { url = "https://files.pythonhosted.org/packages/a6/79/8780a378c650e3df849b73de8b13cf5412f521ca2ff9b78a45c247029440/protobuf-6.33.1-cp310-abi3-win_amd64.whl", hash = "sha256:923aa6d27a92bf44394f6abf7ea0500f38769d4b07f4be41cb52bd8b1123b9ed", size = 436883, upload-time = "2025-11-13T16:44:09.222Z" }, + { url = "https://files.pythonhosted.org/packages/cd/93/26213ff72b103ae55bb0d73e7fb91ea570ef407c3ab4fd2f1f27cac16044/protobuf-6.33.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:fe34575f2bdde76ac429ec7b570235bf0c788883e70aee90068e9981806f2490", size = 427522, upload-time = "2025-11-13T16:44:10.475Z" }, + { url = "https://files.pythonhosted.org/packages/c2/32/df4a35247923393aa6b887c3b3244a8c941c32a25681775f96e2b418f90e/protobuf-6.33.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:f8adba2e44cde2d7618996b3fc02341f03f5bc3f2748be72dc7b063319276178", size = 324445, upload-time = "2025-11-13T16:44:11.869Z" }, + { url = "https://files.pythonhosted.org/packages/8e/d0/d796e419e2ec93d2f3fa44888861c3f88f722cde02b7c3488fcc6a166820/protobuf-6.33.1-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:0f4cf01222c0d959c2b399142deb526de420be8236f22c71356e2a544e153c53", size = 339161, upload-time = "2025-11-13T16:44:12.778Z" }, + { url = "https://files.pythonhosted.org/packages/1d/2a/3c5f05a4af06649547027d288747f68525755de692a26a7720dced3652c0/protobuf-6.33.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:8fd7d5e0eb08cd5b87fd3df49bc193f5cfd778701f47e11d127d0afc6c39f1d1", size = 323171, upload-time = "2025-11-13T16:44:14.035Z" }, + { url = "https://files.pythonhosted.org/packages/08/b4/46310463b4f6ceef310f8348786f3cff181cea671578e3d9743ba61a459e/protobuf-6.33.1-py3-none-any.whl", hash = "sha256:d595a9fd694fdeb061a62fbe10eb039cc1e444df81ec9bb70c7fc59ebcb1eafa", size = 170477, upload-time = "2025-11-13T16:44:17.633Z" }, +] + [[package]] name = "py-openapi-schema-to-json-schema" version = "0.0.3"