mirror of https://github.com/sysown/proxysql
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.
182 lines
4.4 KiB
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 */
|