#ifdef PROXYSQLGENAI #include "proxysql.h" #include "../deps/json/json.hpp" using json = nlohmann::json; #define PROXYJSON #include "Observe_Tool_Handler.h" #include "MCP_Thread.h" #include "proxysql_debug.h" Observe_Tool_Handler::Observe_Tool_Handler(MCP_Threads_Handler* handler) : mcp_handler(handler) { pthread_mutex_init(&handler_lock, NULL); proxy_debug(PROXY_DEBUG_GENERIC, 3, "Observe_Tool_Handler created\n"); } Observe_Tool_Handler::~Observe_Tool_Handler() { close(); pthread_mutex_destroy(&handler_lock); proxy_debug(PROXY_DEBUG_GENERIC, 3, "Observe_Tool_Handler destroyed\n"); } int Observe_Tool_Handler::init() { proxy_info("Observe_Tool_Handler initialized\n"); return 0; } void Observe_Tool_Handler::close() { proxy_debug(PROXY_DEBUG_GENERIC, 2, "Observe_Tool_Handler closed\n"); } json Observe_Tool_Handler::get_tool_list() { json tools = json::array(); // Stub tools for observability tools.push_back(create_tool_description( "list_stats", "List all available ProxySQL statistics", { {"type", "object"}, {"properties", { {"filter", { {"type", "string"}, {"description", "Filter pattern for stat names"} }} }} } )); tools.push_back(create_tool_description( "get_stats", "Get specific statistics by name", { {"type", "object"}, {"properties", { {"stat_names", { {"type", "array"}, {"description", "Array of stat names to retrieve"} }} }}, {"required", {"stat_names"}} } )); tools.push_back(create_tool_description( "show_connections", "Show active connection information", { {"type", "object"}, {"properties", {}} } )); tools.push_back(create_tool_description( "show_queries", "Show query execution statistics", { {"type", "object"}, {"properties", { {"limit", { {"type", "integer"}, {"description", "Maximum number of queries to return"} }} }} } )); tools.push_back(create_tool_description( "get_health", "Get ProxySQL health check status", { {"type", "object"}, {"properties", {}} } )); tools.push_back(create_tool_description( "show_metrics", "Show performance metrics", { {"type", "object"}, {"properties", { {"category", { {"type", "string"}, {"enum", {"query", "connection", "cache", "all"}}, {"description", "Metrics category to show"} }} }} } )); json result; result["tools"] = tools; return result; } json Observe_Tool_Handler::get_tool_description(const std::string& tool_name) { json tools_list = get_tool_list(); for (const auto& tool : tools_list["tools"]) { if (tool["name"] == tool_name) { return tool; } } return create_error_response("Tool not found: " + tool_name); } json Observe_Tool_Handler::execute_tool(const std::string& tool_name, const json& arguments) { pthread_mutex_lock(&handler_lock); json result; // Stub implementation - returns placeholder responses if (tool_name == "list_stats") { std::string filter = arguments.value("filter", ""); result = create_success_response(json{ {"message", "list_stats functionality to be implemented"}, {"filter", filter}, {"stats", json::array()} }); } else if (tool_name == "get_stats") { json stat_names = arguments.value("stat_names", json::array()); result = create_success_response(json{ {"message", "get_stats functionality to be implemented"}, {"stats", json::object()} }); } else if (tool_name == "show_connections") { result = create_success_response(json{ {"message", "show_connections functionality to be implemented"}, {"connections", json::array()} }); } else if (tool_name == "show_queries") { int limit = arguments.value("limit", 100); result = create_success_response(json{ {"message", "show_queries functionality to be implemented"}, {"queries", json::array()}, {"limit", limit} }); } else if (tool_name == "get_health") { result = create_success_response(json{ {"message", "get_health functionality to be implemented"}, {"health", "unknown"} }); } else if (tool_name == "show_metrics") { std::string category = arguments.value("category", "all"); result = create_success_response(json{ {"message", "show_metrics functionality to be implemented"}, {"category", category}, {"metrics", json::object()} }); } else { result = create_error_response("Unknown tool: " + tool_name); } pthread_mutex_unlock(&handler_lock); return result; } #endif /* PROXYSQLGENAI */