diff --git a/apiserver/plane/app/views/workspace/member.py b/apiserver/plane/app/views/workspace/member.py index 528ac40b9c..0a2f1539f4 100644 --- a/apiserver/plane/app/views/workspace/member.py +++ b/apiserver/plane/app/views/workspace/member.py @@ -36,7 +36,6 @@ from plane.db.models import ( WorkspaceMember, ) from plane.utils.cache import cache_response, invalidate_cache -from plane.utils.tracer import trace_operation from .. import BaseViewSet @@ -66,7 +65,6 @@ class WorkSpaceMemberViewSet(BaseViewSet): @allow_permission( allowed_roles=[ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE" ) - @trace_operation("workspace_member_list", custom_attribute="value") def list(self, request, slug): workspace_member = WorkspaceMember.objects.get( member=request.user, @@ -76,7 +74,6 @@ class WorkSpaceMemberViewSet(BaseViewSet): # Get all active workspace members workspace_members = self.get_queryset() - if workspace_member.role > 5: serializer = WorkspaceMemberAdminSerializer( workspace_members, diff --git a/apiserver/plane/license/management/commands/register_instance.py b/apiserver/plane/license/management/commands/register_instance.py index 42676bb728..314d475200 100644 --- a/apiserver/plane/license/management/commands/register_instance.py +++ b/apiserver/plane/license/management/commands/register_instance.py @@ -9,7 +9,21 @@ from django.conf import settings # Module imports from plane.license.models import Instance -from plane.db.models import User +from plane.db.models import ( + User, + Workspace, + Project, + Issue, + Module, + Cycle, + CycleIssue, + ModuleIssue, + Page, +) + +from opentelemetry import trace + +tracer = trace.get_tracer(__name__) class Command(BaseCommand): @@ -60,4 +74,32 @@ class Command(BaseCommand): self.stdout.write( self.style.SUCCESS("Instance already registered") ) - return + + if instance.is_telemetry_enabled: + with tracer.start_as_current_span("instance_details") as span: + 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() + + 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("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) diff --git a/apiserver/plane/settings/common.py b/apiserver/plane/settings/common.py index d9164431dc..2504cc3e36 100644 --- a/apiserver/plane/settings/common.py +++ b/apiserver/plane/settings/common.py @@ -24,6 +24,8 @@ from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import ( from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor from opentelemetry.sdk.resources import Resource +from opentelemetry.instrumentation.django import DjangoInstrumentor + BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -33,24 +35,18 @@ SECRET_KEY = os.environ.get("SECRET_KEY", get_random_secret_key()) # SECURITY WARNING: don't run with debug turned on in production! DEBUG = int(os.environ.get("DEBUG", "0")) -# Check if telemetry should be enabled -TELEMETRY_ENABLED = ( - os.environ.get("ENABLE_TELEMETRY", "True").lower() == "true" -) +# Initialize Django instrumentation +DjangoInstrumentor().instrument() +# Configure the tracer provider +service_name = os.environ.get("SERVICE_NAME", "plane-ce-api") +resource = Resource.create({"service.name": service_name}) +trace.set_tracer_provider(TracerProvider(resource=resource)) +# Configure the OTLP exporter +otel_endpoint = os.environ.get("OTLP_ENDPOINT", "https://telemetry.plane.so") +otlp_exporter = OTLPSpanExporter(endpoint=otel_endpoint) +span_processor = BatchSpanProcessor(otlp_exporter) +trace.get_tracer_provider().add_span_processor(span_processor) -if TELEMETRY_ENABLED: - # Configure the tracer provider - service_name = os.environ.get("SERVICE_NAME", "plane-ce") - resource = Resource.create({"service.name": service_name}) - trace.set_tracer_provider(TracerProvider(resource=resource)) - # Configure the OTLP exporter - otel_endpoint = os.environ.get("OTLP_ENDPOINT", "https://ingest.plane.so") - otlp_exporter = OTLPSpanExporter(endpoint=otel_endpoint) - span_processor = BatchSpanProcessor(otlp_exporter) - trace.get_tracer_provider().add_span_processor(span_processor) -else: - # Set up a no-op tracer when telemetry is disabled - trace.set_tracer_provider(TracerProvider()) # Allowed Hosts ALLOWED_HOSTS = ["*"] @@ -81,7 +77,6 @@ INSTALLED_APPS = [ # Middlewares MIDDLEWARE = [ - "opentelemetry.instrumentation.django.middleware.OpenTelemetryMiddleware", "corsheaders.middleware.CorsMiddleware", "django.middleware.security.SecurityMiddleware", "plane.authentication.middleware.session.SessionMiddleware", @@ -93,11 +88,6 @@ MIDDLEWARE = [ "django.middleware.gzip.GZipMiddleware", "plane.middleware.api_log_middleware.APITokenLogMiddleware", ] -if TELEMETRY_ENABLED: - MIDDLEWARE.insert( - 0, - "opentelemetry.instrumentation.django.middleware.OpenTelemetryMiddleware", - ) # Rest Framework settings REST_FRAMEWORK = {