You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
proxysql/lib/Observe_Tool_Handler.cpp

182 lines
4.4 KiB

#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 */