UNPKG

grafana-mcp-analyzer

Version:

让AI助手直接分析你的Grafana监控数据 - A Model Context Protocol server for Grafana data analysis

4 lines (2 loc) 7.27 kB
import n from"fs";import s from"path";import{createRequire as p}from"module";import C from"axios";import S from"os";import g from"crypto";const c=s.join(S.homedir(),".grafana-mcp-analyzer","config-cache");function d(){n.existsSync(c)||n.mkdirSync(c,{recursive:!0})}function u(){return parseInt(process.env.CONFIG_MAX_AGE||"300",10)*1e3}function h(){return u()===0}function x(){if(!n.existsSync(c))return;const r=u();if(r===0){n.readdirSync(c).forEach(i=>{const a=s.join(c,i);n.statSync(a).isFile()&&n.unlinkSync(a)}),console.error("\u{1F5D1}\uFE0F \u7F13\u5B58\u5DF2\u7981\u7528\uFF0C\u6E05\u7A7A\u6240\u6709\u7F13\u5B58\u6587\u4EF6");return}const e=n.readdirSync(c);let t=0;e.forEach(o=>{const i=s.join(c,o);if(n.statSync(i).isFile()){const a=n.statSync(i);Date.now()-a.mtime.getTime()>r&&(n.unlinkSync(i),t++)}}),t>0&&console.error(`\u{1F5D1}\uFE0F \u6E05\u7406\u4E86 ${t} \u4E2A\u8FC7\u671F\u7F13\u5B58\u6587\u4EF6`)}function G(){try{const r=parseInt(process.env.CONFIG_MAX_AGE||"300",10);console.error(r===0?"\u26A0\uFE0F \u914D\u7F6E\u7F13\u5B58\u5DF2\u7981\u7528 (CONFIG_MAX_AGE=0)":`\u23F0 \u914D\u7F6E\u7F13\u5B58\u65F6\u95F4: ${r}\u79D2`),x()}catch(r){console.error("\u274C \u7F13\u5B58\u6E05\u7406\u5931\u8D25:",r)}}function y(r){return r.startsWith("http://")||r.startsWith("https://")}function A(r){if(!r.startsWith("https://"))throw new Error("\u8FDC\u7A0B\u914D\u7F6E\u53EA\u652F\u6301HTTPS URL\uFF0C\u8BF7\u4F7F\u7528https://\u534F\u8BAE");try{new URL(r)}catch{throw new Error(`\u65E0\u6548\u7684URL\u683C\u5F0F: ${r}`)}}function m(r){let e;if(y(r))e=g.createHash("md5").update(r).digest("hex");else{const t=s.resolve(r);e=g.createHash("md5").update(t).digest("hex")}return s.join(c,`config-${e}.js`)}function w(r){if(h()||!n.existsSync(r))return!1;const e=n.statSync(r),t=Date.now()-e.mtime.getTime(),o=u();return t<o}function E(r,e){if(!n.existsSync(r)||!n.existsSync(e))return!0;const t=n.statSync(r),o=n.statSync(e);return t.mtime.getTime()>o.mtime.getTime()}async function v(r){A(r);const e=m(r);if(w(e))return console.error("\u{1F4E6} \u4F7F\u7528\u7F13\u5B58\u7684\u8FDC\u7A0B\u914D\u7F6E"),f(e);try{console.error("\u{1F310} \u6B63\u5728\u4ECE\u8FDC\u7A0BURL\u83B7\u53D6\u914D\u7F6E...");const t=await C.get(r,{timeout:3e4,headers:{"User-Agent":"grafana-mcp-analyzer",Accept:"application/javascript, text/javascript, */*"},maxContentLength:10*1024*1024,maxBodyLength:10*1024*1024});if(t.status!==200)throw new Error(`HTTP\u8BF7\u6C42\u5931\u8D25: ${t.status} ${t.statusText}`);const o=t.data;if(typeof o!="string")throw new Error("\u8FDC\u7A0B\u914D\u7F6E\u5FC5\u987B\u662FJavaScript\u6587\u672C\u683C\u5F0F");if(!o.includes("module.exports")&&!o.includes("export"))throw new Error("\u8FDC\u7A0B\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u65E0\u6548\uFF0C\u5FC5\u987B\u662F\u6709\u6548\u7684JavaScript\u6587\u4EF6");return h()?console.error("\u2705 \u8FDC\u7A0B\u914D\u7F6E\u83B7\u53D6\u6210\u529F\uFF08\u7F13\u5B58\u5DF2\u7981\u7528\uFF09"):(d(),n.writeFileSync(e,o,"utf-8"),console.error("\u2705 \u8FDC\u7A0B\u914D\u7F6E\u83B7\u53D6\u6210\u529F\uFF0C\u5DF2\u7F13\u5B58")),f(e)}catch(t){if(n.existsSync(e))return console.warn("\u26A0\uFE0F \u8FDC\u7A0B\u914D\u7F6E\u83B7\u53D6\u5931\u8D25\uFF0C\u4F7F\u7528\u8FC7\u671F\u7F13\u5B58:",t.message),f(e);throw new Error(`\u8FDC\u7A0B\u914D\u7F6E\u83B7\u53D6\u5931\u8D25: ${t.message}`)}}async function F(r){const e=s.resolve(process.cwd(),r);if(!n.existsSync(e))throw new Error(`\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`);const t=m(r);if(w(t)&&!E(e,t))return console.error("\u{1F4E6} \u4F7F\u7528\u7F13\u5B58\u7684\u672C\u5730\u914D\u7F6E"),f(t);try{console.error("\u{1F4C1} \u6B63\u5728\u4ECE\u672C\u5730\u8DEF\u5F84\u52A0\u8F7D\u914D\u7F6E...");const o=n.readFileSync(e,"utf-8");return h()?(console.error("\u2705 \u672C\u5730\u914D\u7F6E\u52A0\u8F7D\u6210\u529F\uFF08\u7F13\u5B58\u5DF2\u7981\u7528\uFF09"),T(e)):(d(),n.writeFileSync(t,o,"utf-8"),console.error("\u2705 \u672C\u5730\u914D\u7F6E\u52A0\u8F7D\u6210\u529F\uFF0C\u5DF2\u7F13\u5B58"),f(t))}catch(o){throw new Error(`\u672C\u5730\u914D\u7F6E\u52A0\u8F7D\u5931\u8D25: ${o.message}`)}}async function T(r){const e=p(import.meta.url);delete e.cache[r];let t;try{t=e(r)}catch(o){throw new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF: ${o.message}\u3002\u8BF7\u786E\u4FDD\u914D\u7F6E\u6587\u4EF6\u4F7F\u7528 CommonJS \u683C\u5F0F (module.exports = config)`)}if(!t||typeof t!="object")throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u65E0\u6548");return t}async function f(r){const e=p(import.meta.url);delete e.cache[r];let t;try{t=e(r)}catch(o){throw new Error(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF: ${o.message}\u3002\u8BF7\u786E\u4FDD\u914D\u7F6E\u6587\u4EF6\u4F7F\u7528 CommonJS \u683C\u5F0F (module.exports = config)`)}if(!t||typeof t!="object")throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u65E0\u6548");return t}async function N(r){try{const e=r||process.env.CONFIG_PATH;if(!e)throw new Error("\u8BF7\u6307\u5B9A\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u3002\u4F7F\u7528\u53C2\u6570\u4F20\u5165\u6216\u8BBE\u7F6E CONFIG_PATH \u73AF\u5883\u53D8\u91CF");let t;return y(e)?t=await v(e):t=await F(e),console.error("\u2705 \u914D\u7F6E\u52A0\u8F7D\u6210\u529F\uFF0C\u5305\u542B\u67E5\u8BE2:",Object.keys(t.queries||{}).length,"\u4E2A"),t}catch(e){if(e.message.includes("\u8BF7\u6307\u5B9A\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84")||e.message.includes("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728")||e.message.includes("\u8FDC\u7A0B\u914D\u7F6E\u83B7\u53D6\u5931\u8D25")||e.message.includes("\u672C\u5730\u914D\u7F6E\u52A0\u8F7D\u5931\u8D25")||e.message.includes("\u8FDC\u7A0B\u914D\u7F6E\u53EA\u652F\u6301HTTPS"))throw e;return console.warn("\u26A0\uFE0F \u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E:",e.message),{baseUrl:"https://your-grafana-instance.com",defaultHeaders:{"Content-Type":"application/json"},queries:{}}}}async function O(r,e){try{const t=e||process.env.CONFIG_PATH;if(!t)throw new Error("\u8BF7\u6307\u5B9A\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u3002\u4F7F\u7528\u53C2\u6570\u4F20\u5165\u6216\u8BBE\u7F6E CONFIG_PATH \u73AF\u5883\u53D8\u91CF");const o=s.resolve(process.cwd(),t),i=`const config = ${JSON.stringify(r,null,2)}; module.exports = config;`,a=s.dirname(o);n.existsSync(a)||n.mkdirSync(a,{recursive:!0}),await n.promises.writeFile(o,i,"utf-8");const l=m(t);return n.existsSync(l)&&n.unlinkSync(l),console.error(`\u2705 \u914D\u7F6E\u5DF2\u4FDD\u5B58\u81F3: ${o}`),!0}catch(t){return console.error("\u274C \u4FDD\u5B58\u914D\u7F6E\u5931\u8D25:",t),!1}}function U(){return parseInt(process.env.MAX_CHUNK_SIZE||"100",10)*1024}function b(){const r=process.env.CONFIG_PATH;if(!r)throw new Error("\u8BF7\u8BBE\u7F6E CONFIG_PATH \u73AF\u5883\u53D8\u91CF\u6307\u5B9A\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84");return r}function k(r){const e=[];return r?(r.baseUrl||e.push("\u7F3A\u5C11baseUrl\u914D\u7F6E"),r.queries&&Object.entries(r.queries).forEach(([t,o])=>{o.url||e.push(`\u67E5\u8BE2 "${t}" \u7F3A\u5C11url\u914D\u7F6E`)}),{valid:e.length===0,errors:e}):(e.push("\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A"),{valid:!1,errors:e})}export{b as getConfigPath,U as getMaxChunkSize,G as initializeCacheCleanup,N as loadConfig,O as saveConfig,k as validateConfig};