From 7ba35f2f14144f92d8bbc109407a0f0214902ad2 Mon Sep 17 00:00:00 2001 From: Boris Date: Tue, 22 Jul 2025 18:20:15 +0200 Subject: [PATCH] fix: add api tracking events (#1128) ## Description ## DCO Affirmation I affirm that all code in every commit of this pull request conforms to the terms of the Topoteretes Developer Certificate of Origin. --- cognee/api/v1/add/routers/get_add_router.py | 19 ++++-- .../v1/cognify/routers/get_cognify_router.py | 9 +++ .../datasets/routers/get_datasets_router.py | 64 +++++++++++++++++++ .../v1/delete/routers/get_delete_router.py | 11 ++++ .../routers/get_permissions_router.py | 51 ++++++++++++++- .../v1/search/routers/get_search_router.py | 22 +++++++ .../v1/users/routers/get_visualize_router.py | 10 +++ 7 files changed, 180 insertions(+), 6 deletions(-) diff --git a/cognee/api/v1/add/routers/get_add_router.py b/cognee/api/v1/add/routers/get_add_router.py index 5162f3b7f..4519af728 100644 --- a/cognee/api/v1/add/routers/get_add_router.py +++ b/cognee/api/v1/add/routers/get_add_router.py @@ -1,16 +1,17 @@ import os +import requests +import subprocess from uuid import UUID -from fastapi import Form, File, UploadFile, Depends -from fastapi.responses import JSONResponse from fastapi import APIRouter +from fastapi.responses import JSONResponse +from fastapi import Form, File, UploadFile, Depends from typing import List, Optional, Union, Literal -import subprocess -from cognee.shared.logging_utils import get_logger -import requests from cognee.modules.users.models import User from cognee.modules.users.methods import get_authenticated_user +from cognee.shared.utils import send_telemetry +from cognee.shared.logging_utils import get_logger logger = get_logger() @@ -60,6 +61,14 @@ def get_add_router() -> APIRouter: - The ALLOW_HTTP_REQUESTS environment variable controls URL processing - datasetId value can only be the UUID of an already existing dataset """ + send_telemetry( + "Add API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": "POST /v1/add", + }, + ) + from cognee.api.v1.add import add as cognee_add if not datasetId and not datasetName: diff --git a/cognee/api/v1/cognify/routers/get_cognify_router.py b/cognee/api/v1/cognify/routers/get_cognify_router.py index 53ce5284a..ecfceec52 100644 --- a/cognee/api/v1/cognify/routers/get_cognify_router.py +++ b/cognee/api/v1/cognify/routers/get_cognify_router.py @@ -23,6 +23,7 @@ from cognee.modules.pipelines.queues.pipeline_run_info_queues import ( remove_queue, ) from cognee.shared.logging_utils import get_logger +from cognee.shared.utils import send_telemetry logger = get_logger("api.cognify") @@ -82,6 +83,14 @@ def get_cognify_router() -> APIRouter: ## Next Steps After successful processing, use the search endpoints to query the generated knowledge graph for insights, relationships, and semantic search. """ + send_telemetry( + "Cognify API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": "POST /v1/cognify", + }, + ) + if not payload.datasets and not payload.dataset_ids: return JSONResponse( status_code=400, content={"error": "No datasets or dataset_ids provided"} diff --git a/cognee/api/v1/datasets/routers/get_datasets_router.py b/cognee/api/v1/datasets/routers/get_datasets_router.py index 6f09fd6d2..d86930137 100644 --- a/cognee/api/v1/datasets/routers/get_datasets_router.py +++ b/cognee/api/v1/datasets/routers/get_datasets_router.py @@ -22,6 +22,7 @@ from cognee.modules.users.permissions.methods import ( ) from cognee.modules.graph.methods import get_formatted_graph_data from cognee.modules.pipelines.models import PipelineRunStatus +from cognee.shared.utils import send_telemetry logger = get_logger() @@ -92,6 +93,14 @@ def get_datasets_router() -> APIRouter: ## Error Codes - **418 I'm a teapot**: Error retrieving datasets """ + send_telemetry( + "Datasets API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": "GET /v1/datasets", + }, + ) + try: datasets = await get_all_user_permission_datasets(user, "read") @@ -130,6 +139,14 @@ def get_datasets_router() -> APIRouter: ## Error Codes - **418 I'm a teapot**: Error creating dataset """ + send_telemetry( + "Datasets API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": "POST /v1/datasets", + }, + ) + try: datasets = await get_datasets_by_name([dataset_data.name], user.id) @@ -175,6 +192,15 @@ def get_datasets_router() -> APIRouter: - **404 Not Found**: Dataset doesn't exist or user doesn't have access - **500 Internal Server Error**: Error during deletion """ + send_telemetry( + "Datasets API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": f"DELETE /v1/datasets/{str(dataset_id)}", + "dataset_id": str(dataset_id), + }, + ) + from cognee.modules.data.methods import get_dataset, delete_dataset dataset = await get_dataset(user.id, dataset_id) @@ -210,6 +236,16 @@ def get_datasets_router() -> APIRouter: - **404 Not Found**: Dataset or data item doesn't exist, or user doesn't have access - **500 Internal Server Error**: Error during deletion """ + send_telemetry( + "Datasets API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": f"DELETE /v1/datasets/{str(dataset_id)}/data/{str(data_id)}", + "dataset_id": str(dataset_id), + "data_id": str(data_id), + }, + ) + from cognee.modules.data.methods import get_data, delete_data from cognee.modules.data.methods import get_dataset @@ -288,6 +324,15 @@ def get_datasets_router() -> APIRouter: - **404 Not Found**: Dataset doesn't exist or user doesn't have access - **500 Internal Server Error**: Error retrieving data """ + send_telemetry( + "Datasets API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": f"GET /v1/datasets/{str(dataset_id)}/data", + "dataset_id": str(dataset_id), + }, + ) + from cognee.modules.data.methods import get_dataset_data, get_dataset # Verify user has permission to read dataset @@ -331,6 +376,15 @@ def get_datasets_router() -> APIRouter: ## Error Codes - **500 Internal Server Error**: Error retrieving status information """ + send_telemetry( + "Datasets API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": "GET /v1/datasets/status", + "datasets": [str(dataset_id) for dataset_id in datasets], + }, + ) + from cognee.api.v1.datasets.datasets import datasets as cognee_datasets try: @@ -367,6 +421,16 @@ def get_datasets_router() -> APIRouter: - **404 Not Found**: Dataset or data item doesn't exist, or user doesn't have access - **500 Internal Server Error**: Error accessing the raw data file """ + send_telemetry( + "Datasets API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": f"GET /v1/datasets/{str(dataset_id)}/data/{str(data_id)}/raw", + "dataset_id": str(dataset_id), + "data_id": str(data_id), + }, + ) + from cognee.modules.data.methods import get_data from cognee.modules.data.methods import get_dataset_data diff --git a/cognee/api/v1/delete/routers/get_delete_router.py b/cognee/api/v1/delete/routers/get_delete_router.py index 4d0958172..9e6aa5799 100644 --- a/cognee/api/v1/delete/routers/get_delete_router.py +++ b/cognee/api/v1/delete/routers/get_delete_router.py @@ -5,6 +5,7 @@ from uuid import UUID from cognee.shared.logging_utils import get_logger from cognee.modules.users.models import User from cognee.modules.users.methods import get_authenticated_user +from cognee.shared.utils import send_telemetry logger = get_logger() @@ -31,6 +32,16 @@ def get_delete_router() -> APIRouter: JSON response indicating success or failure """ + send_telemetry( + "Delete API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": "DELETE /v1/delete", + "dataset_id": str(dataset_id), + "data_id": str(data_id), + }, + ) + from cognee.api.v1.delete import delete as cognee_delete try: diff --git a/cognee/api/v1/permissions/routers/get_permissions_router.py b/cognee/api/v1/permissions/routers/get_permissions_router.py index 365106d4e..89603ac46 100644 --- a/cognee/api/v1/permissions/routers/get_permissions_router.py +++ b/cognee/api/v1/permissions/routers/get_permissions_router.py @@ -6,12 +6,13 @@ from fastapi.responses import JSONResponse from cognee.modules.users.models import User from cognee.modules.users.methods import get_authenticated_user +from cognee.shared.utils import send_telemetry def get_permissions_router() -> APIRouter: permissions_router = APIRouter() - @permissions_router.post("/datasets/{principal_id}/") + @permissions_router.post("/datasets/{principal_id}") async def give_datasets_permission_to_principal( permission_name: str, dataset_ids: List[UUID], @@ -40,6 +41,16 @@ def get_permissions_router() -> APIRouter: - **403 Forbidden**: User doesn't have permission to grant access - **500 Internal Server Error**: Error granting permission """ + send_telemetry( + "Permissions API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": f"POST /v1/permissions/datasets/{str(principal_id)}", + "dataset_ids": str(dataset_ids), + "principal_id": str(principal_id), + }, + ) + from cognee.modules.users.permissions.methods import authorized_give_permission_on_datasets await authorized_give_permission_on_datasets( @@ -72,6 +83,15 @@ def get_permissions_router() -> APIRouter: - **400 Bad Request**: Invalid role name or role already exists - **500 Internal Server Error**: Error creating the role """ + send_telemetry( + "Permissions API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": "POST /v1/permissions/roles", + "role_name": role_name, + }, + ) + from cognee.modules.users.roles.methods import create_role as create_role_method await create_role_method(role_name=role_name, owner_id=user.id) @@ -104,6 +124,16 @@ def get_permissions_router() -> APIRouter: - **404 Not Found**: User or role doesn't exist - **500 Internal Server Error**: Error adding user to role """ + send_telemetry( + "Permissions API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": f"POST /v1/permissions/users/{str(user_id)}/roles", + "user_id": str(user_id), + "role_id": str(role_id), + }, + ) + from cognee.modules.users.roles.methods import add_user_to_role as add_user_to_role_method await add_user_to_role_method(user_id=user_id, role_id=role_id, owner_id=user.id) @@ -136,6 +166,16 @@ def get_permissions_router() -> APIRouter: - **404 Not Found**: User or tenant doesn't exist - **500 Internal Server Error**: Error adding user to tenant """ + send_telemetry( + "Permissions API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": f"POST /v1/permissions/users/{str(user_id)}/tenants", + "user_id": str(user_id), + "tenant_id": str(tenant_id), + }, + ) + from cognee.modules.users.tenants.methods import add_user_to_tenant await add_user_to_tenant(user_id=user_id, tenant_id=tenant_id, owner_id=user.id) @@ -161,6 +201,15 @@ def get_permissions_router() -> APIRouter: - **400 Bad Request**: Invalid tenant name or tenant already exists - **500 Internal Server Error**: Error creating the tenant """ + send_telemetry( + "Permissions API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": "POST /v1/permissions/tenants", + "tenant_name": tenant_name, + }, + ) + from cognee.modules.users.tenants.methods import create_tenant as create_tenant_method await create_tenant_method(tenant_name=tenant_name, user_id=user.id) diff --git a/cognee/api/v1/search/routers/get_search_router.py b/cognee/api/v1/search/routers/get_search_router.py index 6b21b5713..0ceeb1abb 100644 --- a/cognee/api/v1/search/routers/get_search_router.py +++ b/cognee/api/v1/search/routers/get_search_router.py @@ -10,6 +10,7 @@ from cognee.modules.users.exceptions.exceptions import PermissionDeniedError from cognee.modules.users.models import User from cognee.modules.search.operations import get_history from cognee.modules.users.methods import get_authenticated_user +from cognee.shared.utils import send_telemetry # Note: Datasets sent by name will only map to datasets owned by the request sender @@ -49,6 +50,14 @@ def get_search_router() -> APIRouter: ## Error Codes - **500 Internal Server Error**: Error retrieving search history """ + send_telemetry( + "Search API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": "GET /v1/search", + }, + ) + try: history = await get_history(user.id, limit=0) @@ -84,6 +93,19 @@ def get_search_router() -> APIRouter: - To search datasets not owned by the request sender, dataset UUID is needed - If permission is denied, returns empty list instead of error """ + send_telemetry( + "Search API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": "POST /v1/search", + "search_type": str(payload.search_type), + "datasets": payload.datasets, + "dataset_ids": [str(dataset_id) for dataset_id in payload.dataset_ids or []], + "query": payload.query, + "top_k": payload.top_k, + }, + ) + from cognee.api.v1.search import search as cognee_search try: diff --git a/cognee/api/v1/users/routers/get_visualize_router.py b/cognee/api/v1/users/routers/get_visualize_router.py index d0b643f36..95e79d3d5 100644 --- a/cognee/api/v1/users/routers/get_visualize_router.py +++ b/cognee/api/v1/users/routers/get_visualize_router.py @@ -7,6 +7,7 @@ from cognee.modules.data.methods import get_authorized_existing_datasets from cognee.modules.users.models import User from cognee.context_global_variables import set_database_global_context_variables +from cognee.shared.utils import send_telemetry logger = get_logger() @@ -39,6 +40,15 @@ def get_visualize_router() -> APIRouter: - User must have read permissions on the dataset - Visualization is interactive and allows graph exploration """ + send_telemetry( + "Visualize API Endpoint Invoked", + user.id, + additional_properties={ + "endpoint": "GET /v1/visualize", + "dataset_id": str(dataset_id), + }, + ) + from cognee.api.v1.visualize import visualize_graph try: