From 59dfb4c0a0fbdf3463281eb3f22b61e6e880f007 Mon Sep 17 00:00:00 2001 From: ievgenii vdovenko Date: Thu, 4 Sep 2025 12:30:51 +0200 Subject: [PATCH] poc: adds audit logs --- rhodecode/lib/audit_logger.py | 5 ++++ rhodecode/lib/celerylib/tasks.py | 40 +++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/rhodecode/lib/audit_logger.py b/rhodecode/lib/audit_logger.py index c503f6c0..51f928a7 100644 --- a/rhodecode/lib/audit_logger.py +++ b/rhodecode/lib/audit_logger.py @@ -29,9 +29,14 @@ log = logging.getLogger(__name__) PR_IDS_REVIEWER_ROLE = "pull_request_ids_reviewer_role" PR_IDS_OBSERVER_ROLE = "pull_request_ids_observer_role" +PR_ID = "pull_request_id" +AI_MODEL = "ai_model" +AI_MODEL_VERSION = "ai_model_version" # action as key, and expected action_data as value ACTIONS_V1 = { + "ai.code-review.start": {PR_ID: 0, AI_MODEL: "", AI_MODEL_VERSION: ""}, + "ai.code-review.finish": {PR_ID: 0, AI_MODEL: "", "error": False, "error_message": ""}, "user.login.success": {"user_agent": ""}, "user.login.failure": {"user_agent": ""}, "user.logout": {"user_agent": ""}, diff --git a/rhodecode/lib/celerylib/tasks.py b/rhodecode/lib/celerylib/tasks.py index ed30ce7f..2f1e1d7d 100644 --- a/rhodecode/lib/celerylib/tasks.py +++ b/rhodecode/lib/celerylib/tasks.py @@ -502,6 +502,8 @@ def start_ai_code_review(pull_request_id): if not settings_valid: return + ai_user = User.get_ai_user() + diffset = _get_diffset(pull_request) ai_model = rc_settings.get_setting_by_name("ai_model").app_settings_value ai_model_version = rc_settings.get_setting_by_name("ai_model_version").app_settings_value @@ -520,11 +522,39 @@ def start_ai_code_review(pull_request_id): if instructions: instructions = instructions.app_settings_value.split("\r\n") + audit_logger.store( + "ai.code-review.start", + user=ai_user, + action_data={ + audit_logger.PR_ID: pull_request_id, + audit_logger.AI_MODEL: ai_model, + audit_logger.AI_MODEL_VERSION: ai_model_version, + }, + repo=pull_request.target_repo, + ) + response = service.code_review(diffset, instructions=instructions) - _add_comments(response, pull_request, log) + + error_msg = "" + if response.error: + error_msg = response.message + + audit_logger.store( + "ai.code-review.finish", + user=ai_user, + action_data={ + audit_logger.PR_ID: pull_request_id, + audit_logger.AI_MODEL: response.model, + "error": response.error, + "error_message": error_msg, + }, + repo=pull_request.target_repo, + ) + + _add_comments(response, pull_request, log, ai_user) -def _add_comments(response: Response, pull_request: PullRequest, log: Logger | Any): +def _add_comments(response: Response, pull_request: PullRequest, log: Logger | Any, ai_user: User): log.debug( "Response from AI service: %s", response.message, @@ -538,16 +568,14 @@ def _add_comments(response: Response, pull_request: PullRequest, log: Logger | A line_code = review_line.get("line_code") suggestion = review_line.get("suggestion") log.debug("%s | %s | %s", line_number, line_code, suggestion) - insert_comment(line_number, suggestion, file_name, pull_request) + insert_comment(line_number, suggestion, file_name, pull_request, ai_user) -def insert_comment(line_number: int, text: str, f_path: str, pull_request): +def insert_comment(line_number: int, text: str, f_path: str, pull_request: PullRequest, ai_user: User): target_repo: Repository = pull_request.target_repo repo_id = target_repo.repo_id line_number_formatted = "n%s" % line_number - ai_user = User.get_ai_user() - comment_type = "note" CommentsModel().create(