From 7a828f9ad945aadb4373a6c84ede38c5955f6315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Fri, 30 Aug 2024 00:32:18 -0300 Subject: [PATCH] updating deployment cli with --- docs/telemetry/Telemetry.md | 1 + src/crewai/cli/deploy/main.py | 14 ++++++++ src/crewai/telemetry/telemetry.py | 59 ++++++++++++++++++++++++++++++- 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/docs/telemetry/Telemetry.md b/docs/telemetry/Telemetry.md index 9588c3cb0..51b1ad8e9 100644 --- a/docs/telemetry/Telemetry.md +++ b/docs/telemetry/Telemetry.md @@ -27,6 +27,7 @@ When the `share_crew` feature is enabled, detailed data including task descripti | Yes | Test Execution Data | Includes: crew's randomly generated key and ID, number of iterations, model name used, quality score (float), execution time (in seconds). All non-personal. | | Yes | Task Lifecycle Data | Includes: creation and execution start/end times, crew and task identifiers. Stored as spans with timestamps. No personal data. | | Yes | LLM Attributes | Includes: name, model_name, model, top_k, temperature, and class name of the LLM. All technical, non-personal data. | +| Yes | Crew Deployment attempt using crewAI CLI | Includes: The fact a deploy is being made and crew id, and if it's trying to pull logs, no other data. | | No | Agent's Expanded Data | Includes: goal description, backstory text, i18n prompt file identifier. Users should ensure no personal info is included in text fields. | | No | Detailed Task Information | Includes: task description, expected output description, context references. Users should ensure no personal info is included in these fields. | | No | Environment Information | Includes: platform, release, system, version, and CPU count. Example: 'Windows 10', 'x86_64'. No personal data. | diff --git a/src/crewai/cli/deploy/main.py b/src/crewai/cli/deploy/main.py index d67e1cdc8..67b69a0ee 100644 --- a/src/crewai/cli/deploy/main.py +++ b/src/crewai/cli/deploy/main.py @@ -2,6 +2,7 @@ from typing import Any, Dict, List, Optional from rich.console import Console +from crewai.telemetry import Telemetry from .api import CrewAPI from .utils import ( fetch_and_json_env_file, @@ -23,8 +24,13 @@ class DeployCommand: Initialize the DeployCommand with project name and API client. """ try: + self._telemetry = Telemetry() + self._telemetry.set_tracer() access_token = get_auth_token() except Exception: + self._deploy_signup_error_span = self._telemetry.deploy_signup_error_span( + self + ) console.print( "Please sign up/login to CrewAI+ before using the CLI.", style="bold red", @@ -90,6 +96,7 @@ class DeployCommand: Args: uuid (Optional[str]): The UUID of the crew to deploy. """ + self._start_deployment_span = self._telemetry.start_deployment_span(self, uuid) console.print("Starting deployment...", style="bold blue") if uuid: response = self.client.deploy_by_uuid(uuid) @@ -109,6 +116,9 @@ class DeployCommand: """ Create a new crew deployment. """ + self._create_crew_deployment_span = self._telemetry.create_crew_deployment_span( + self + ) console.print("Creating deployment...", style="bold blue") env_vars = fetch_and_json_env_file() remote_repo_url = get_git_remote_url() @@ -247,6 +257,9 @@ class DeployCommand: uuid (Optional[str]): The UUID of the crew to get logs for. log_type (str): The type of logs to retrieve (default: "deployment"). """ + self._get_crew_logs_span = self._telemetry.get_crew_logs_span( + self, uuid, log_type + ) console.print(f"Fetching {log_type} logs...", style="bold blue") if uuid: @@ -269,6 +282,7 @@ class DeployCommand: Args: uuid (Optional[str]): The UUID of the crew to remove. """ + self._remove_crew_span = self._telemetry.remove_crew_span(self, uuid) console.print("Removing deployment...", style="bold blue") if uuid: diff --git a/src/crewai/telemetry/telemetry.py b/src/crewai/telemetry/telemetry.py index 88cb560d9..21d629ad3 100644 --- a/src/crewai/telemetry/telemetry.py +++ b/src/crewai/telemetry/telemetry.py @@ -4,7 +4,7 @@ import asyncio import json import os import platform -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, Optional import pkg_resources from opentelemetry import trace @@ -399,6 +399,63 @@ class Telemetry: except Exception: pass + def deploy_signup_error_span(self): + if self.ready: + try: + tracer = trace.get_tracer("crewai.telemetry") + span = tracer.start_span("Deploy Signup Error") + span.set_status(Status(StatusCode.OK)) + span.end() + except Exception: + pass + + def start_deployment_span(self, uuid: Optional[str] = None): + if self.ready: + try: + tracer = trace.get_tracer("crewai.telemetry") + span = tracer.start_span("Start Deployment") + if uuid: + self._add_attribute(span, "uuid", uuid) + span.set_status(Status(StatusCode.OK)) + span.end() + except Exception: + pass + + def create_crew_deployment_span(self): + if self.ready: + try: + tracer = trace.get_tracer("crewai.telemetry") + span = tracer.start_span("Create Crew Deployment") + span.set_status(Status(StatusCode.OK)) + span.end() + except Exception: + pass + + def get_crew_logs_span(self, uuid: Optional[str], log_type: str = "deployment"): + if self.ready: + try: + tracer = trace.get_tracer("crewai.telemetry") + span = tracer.start_span("Get Crew Logs") + self._add_attribute(span, "log_type", log_type) + if uuid: + self._add_attribute(span, "uuid", uuid) + span.set_status(Status(StatusCode.OK)) + span.end() + except Exception: + pass + + def remove_crew_span(self, uuid: Optional[str] = None): + if self.ready: + try: + tracer = trace.get_tracer("crewai.telemetry") + span = tracer.start_span("Remove Crew") + if uuid: + self._add_attribute(span, "uuid", uuid) + span.set_status(Status(StatusCode.OK)) + span.end() + except Exception: + pass + def crew_execution_span(self, crew: Crew, inputs: dict[str, Any] | None): """Records the complete execution of a crew. This is only collected if the user has opted-in to share the crew.