grafana-mcp-analyzer
Version:
让AI助手直接分析你的Grafana监控数据 - A Model Context Protocol server for Grafana data analysis
110 lines (104 loc) • 3.71 kB
JavaScript
import axios from 'axios';
const DEFAULT_TIMEOUT = 30000;
const MAX_DATA_LENGTH = 2000;
const DEFAULT_SYSTEM_PROMPT = `你是专业的Grafana监控数据分析专家。请基于提供的监控数据进行分析,给出专业洞察和建议。
数据格式说明:
- hasData: 是否有有效数据
- type: 数据类型
- data: 实际响应数据
- status: HTTP状态码
- timestamp: 数据时间戳
请提供:
1. 数据概览和趋势分析
2. 异常检测和告警建议
3. 性能优化建议
4. 具体行动项`;
/**
* 使用AI分析监控数据
*/
export async function analyzeWithAI(prompt, data, globalConfig, queryConfig) {
// 获取AI配置
const aiConfig = queryConfig?.aiService || globalConfig?.aiService;
if (!aiConfig?.url) {
return null; // 无AI配置,使用客户端AI
}
try {
// 获取系统提示词
const systemPrompt = queryConfig?.systemPrompt ||
globalConfig?.systemPrompt ||
DEFAULT_SYSTEM_PROMPT;
const userMessage = `${prompt}\n\n监控数据:\n${JSON.stringify(data, null, 2)}`;
// 构建请求体
let requestBody;
if (aiConfig.bodyTemplate) {
// 使用自定义模板
const template = JSON.stringify(aiConfig.bodyTemplate);
const replaced = template
.replace(/\{\{systemPrompt\}\}/g, systemPrompt.replace(/"/g, '\\"'))
.replace(/\{\{userMessage\}\}/g, userMessage.replace(/"/g, '\\"'));
requestBody = JSON.parse(replaced);
}
else {
// 默认OpenAI格式
requestBody = {
messages: [
{ role: 'system', content: systemPrompt },
{ role: 'user', content: userMessage }
]
};
}
// 发送请求
const response = await axios.post(aiConfig.url, requestBody, {
headers: {
'Content-Type': 'application/json',
...aiConfig.headers
},
timeout: aiConfig.timeout || DEFAULT_TIMEOUT
});
// 解析响应
if (aiConfig.responseParser?.contentPath) {
// 自定义解析路径
const paths = aiConfig.responseParser.contentPath.split('.');
let result = response.data;
for (const path of paths) {
result = result?.[path];
}
return typeof result === 'string' ? result : null;
}
else {
// 默认OpenAI格式
return response.data?.choices?.[0]?.message?.content || null;
}
}
catch (error) {
console.error('外部AI分析失败:', error.message);
return null; // 失败时回退到客户端AI
}
}
/**
* 为客户端AI格式化分析上下文
*/
export function formatDataForClientAI(prompt, data) {
// 截断过长的数据
let formattedData = data.data;
if (typeof formattedData === 'object') {
const jsonStr = JSON.stringify(formattedData, null, 2);
if (jsonStr.length > MAX_DATA_LENGTH) {
formattedData = `${jsonStr.substring(0, MAX_DATA_LENGTH)}...`;
}
else {
formattedData = jsonStr;
}
}
return `请基于以下Grafana监控数据进行专业分析:
用户需求:${prompt}
数据概览:
- 数据类型:${data.type}
- 有效数据:${data.hasData ? '是' : '否'}
- HTTP状态:${data.status}
- 时间戳:${data.timestamp}
原始数据:
${data.hasData ? formattedData : '无有效数据'}
请提供:数据解读、异常检测、趋势分析和优化建议。`;
}
//# sourceMappingURL=monitoring-analyzer.js.map