From c4a5c5973fa901fbd16fb0a293c9cd400f28106c Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Tue, 26 Nov 2024 15:30:53 +0530 Subject: [PATCH] fix: tracer error handling --- apiserver/plane/license/bgtasks/tracer.py | 142 ++++++++++++---------- apiserver/plane/utils/telemetry.py | 4 +- 2 files changed, 80 insertions(+), 66 deletions(-) diff --git a/apiserver/plane/license/bgtasks/tracer.py b/apiserver/plane/license/bgtasks/tracer.py index d857aff7e..47e74c83a 100644 --- a/apiserver/plane/license/bgtasks/tracer.py +++ b/apiserver/plane/license/bgtasks/tracer.py @@ -1,5 +1,6 @@ # Third party imports from celery import shared_task +from opentelemetry import trace # Module imports from plane.license.models import Instance @@ -15,76 +16,55 @@ from plane.db.models import ( Page, WorkspaceMember, ) -from plane.utils.telemetry import init_telemetry +from plane.utils.telemetry import init_tracer, shutdown_tracer @shared_task def instance_traces(): - # Check if the instance is registered - instance = Instance.objects.first() + try: + init_tracer() + # Check if the instance is registered + instance = Instance.objects.first() - # If instance is None then return - if instance is None: - return + # If instance is None then return + if instance is None: + return - if instance.is_telemetry_enabled: - # Get the tracer - tracer = init_telemetry() - # Instance details - with tracer.start_as_current_span("instance_details") as span: - # Count of all models - workspace_count = Workspace.objects.count() - user_count = User.objects.count() - project_count = Project.objects.count() - issue_count = Issue.objects.count() - module_count = Module.objects.count() - cycle_count = Cycle.objects.count() - cycle_issue_count = CycleIssue.objects.count() - module_issue_count = ModuleIssue.objects.count() - page_count = Page.objects.count() + if instance.is_telemetry_enabled: + # Get the tracer + tracer = trace.get_tracer(__name__) + # Instance details + with tracer.start_as_current_span("instance_details") as span: + # Count of all models + workspace_count = Workspace.objects.count() + user_count = User.objects.count() + project_count = Project.objects.count() + issue_count = Issue.objects.count() + module_count = Module.objects.count() + cycle_count = Cycle.objects.count() + cycle_issue_count = CycleIssue.objects.count() + module_issue_count = ModuleIssue.objects.count() + page_count = Page.objects.count() - # Set span attributes - span.set_attribute("instance_id", instance.instance_id) - span.set_attribute("instance_name", instance.instance_name) - span.set_attribute("current_version", instance.current_version) - span.set_attribute("latest_version", instance.latest_version) - span.set_attribute("is_telemetry_enabled", instance.is_telemetry_enabled) - span.set_attribute("is_support_required", instance.is_support_required) - span.set_attribute("is_setup_done", instance.is_setup_done) - span.set_attribute( - "is_signup_screen_visited", instance.is_signup_screen_visited - ) - span.set_attribute("is_verified", instance.is_verified) - span.set_attribute("edition", instance.edition) - span.set_attribute("domain", instance.domain) - span.set_attribute("is_test", instance.is_test) - span.set_attribute("user_count", user_count) - span.set_attribute("workspace_count", workspace_count) - span.set_attribute("project_count", project_count) - span.set_attribute("issue_count", issue_count) - span.set_attribute("module_count", module_count) - span.set_attribute("cycle_count", cycle_count) - span.set_attribute("cycle_issue_count", cycle_issue_count) - span.set_attribute("module_issue_count", module_issue_count) - span.set_attribute("page_count", page_count) - - # Workspace details - for workspace in Workspace.objects.all(): - # Count of all models - project_count = Project.objects.filter(workspace=workspace).count() - issue_count = Issue.objects.filter(workspace=workspace).count() - module_count = Module.objects.filter(workspace=workspace).count() - cycle_count = Cycle.objects.filter(workspace=workspace).count() - cycle_issue_count = CycleIssue.objects.filter(workspace=workspace).count() - module_issue_count = ModuleIssue.objects.filter(workspace=workspace).count() - page_count = Page.objects.filter(workspace=workspace).count() - member_count = WorkspaceMember.objects.filter(workspace=workspace).count() - - # Set span attributes - with tracer.start_as_current_span("workspace_details") as span: + # Set span attributes span.set_attribute("instance_id", instance.instance_id) - span.set_attribute("workspace_id", str(workspace.id)) - span.set_attribute("workspace_slug", workspace.slug) + span.set_attribute("instance_name", instance.instance_name) + span.set_attribute("current_version", instance.current_version) + span.set_attribute("latest_version", instance.latest_version) + span.set_attribute( + "is_telemetry_enabled", instance.is_telemetry_enabled + ) + span.set_attribute("is_support_required", instance.is_support_required) + span.set_attribute("is_setup_done", instance.is_setup_done) + span.set_attribute( + "is_signup_screen_visited", instance.is_signup_screen_visited + ) + span.set_attribute("is_verified", instance.is_verified) + span.set_attribute("edition", instance.edition) + span.set_attribute("domain", instance.domain) + span.set_attribute("is_test", instance.is_test) + span.set_attribute("user_count", user_count) + span.set_attribute("workspace_count", workspace_count) span.set_attribute("project_count", project_count) span.set_attribute("issue_count", issue_count) span.set_attribute("module_count", module_count) @@ -92,6 +72,40 @@ def instance_traces(): span.set_attribute("cycle_issue_count", cycle_issue_count) span.set_attribute("module_issue_count", module_issue_count) span.set_attribute("page_count", page_count) - span.set_attribute("member_count", member_count) - return + # Workspace details + for workspace in Workspace.objects.all(): + # Count of all models + project_count = Project.objects.filter(workspace=workspace).count() + issue_count = Issue.objects.filter(workspace=workspace).count() + module_count = Module.objects.filter(workspace=workspace).count() + cycle_count = Cycle.objects.filter(workspace=workspace).count() + cycle_issue_count = CycleIssue.objects.filter( + workspace=workspace + ).count() + module_issue_count = ModuleIssue.objects.filter( + workspace=workspace + ).count() + page_count = Page.objects.filter(workspace=workspace).count() + member_count = WorkspaceMember.objects.filter( + workspace=workspace + ).count() + + # Set span attributes + with tracer.start_as_current_span("workspace_details") as span: + span.set_attribute("instance_id", instance.instance_id) + span.set_attribute("workspace_id", str(workspace.id)) + span.set_attribute("workspace_slug", workspace.slug) + span.set_attribute("project_count", project_count) + span.set_attribute("issue_count", issue_count) + span.set_attribute("module_count", module_count) + span.set_attribute("cycle_count", cycle_count) + span.set_attribute("cycle_issue_count", cycle_issue_count) + span.set_attribute("module_issue_count", module_issue_count) + span.set_attribute("page_count", page_count) + span.set_attribute("member_count", member_count) + + return + finally: + # Shutdown the tracer + shutdown_tracer() diff --git a/apiserver/plane/utils/telemetry.py b/apiserver/plane/utils/telemetry.py index 527bbb1cb..8fb030ac1 100644 --- a/apiserver/plane/utils/telemetry.py +++ b/apiserver/plane/utils/telemetry.py @@ -7,7 +7,7 @@ from opentelemetry.instrumentation.django import DjangoInstrumentor import os -def init_telemetry(): +def init_tracer(): """Initialize OpenTelemetry with proper shutdown handling""" # Check if already initialized to prevent double initialization @@ -32,7 +32,7 @@ def init_telemetry(): return tracer_provider -def shutdown_telemetry(): +def shutdown_tracer(): """Shutdown OpenTelemetry tracers and processors""" provider = trace.get_tracer_provider()