grafana-mcp-analyzer
Version:
让AI助手直接分析你的Grafana监控数据 - A Model Context Protocol server for Grafana data analysis
2 lines (1 loc) • 2.81 kB
JavaScript
import n from"fs";import o from"path";import p from"os";const u=o.join(p.homedir(),".grafana-mcp-analyzer","data-store"),c=o.join(u,"sessions"),d=o.join(u,"indexes");[c,d].forEach(e=>{n.existsSync(e)||n.mkdirSync(e,{recursive:!0})});async function w(e={}){const r=`session-${Date.now()}-${Math.floor(Math.random()*1e3).toString().padStart(3,"0")}`,t=o.join(c,r);n.mkdirSync(t),n.mkdirSync(o.join(t,"requests")),n.mkdirSync(o.join(t,"responses"));const s={id:r,created:new Date().toISOString(),lastUpdated:new Date().toISOString(),requestCount:0,...e};return await n.promises.writeFile(o.join(t,"metadata.json"),JSON.stringify(s,null,2),"utf-8"),await S(r,s),r}async function S(e,r){const t=o.join(d,"sessions-index.json");let s={};try{if(n.existsSync(t)){const i=await n.promises.readFile(t,"utf-8");s=JSON.parse(i)}}catch(i){console.error("\u8BFB\u53D6\u4F1A\u8BDD\u7D22\u5F15\u5931\u8D25\uFF0C\u521B\u5EFA\u65B0\u7D22\u5F15",i)}s[e]={created:r.created,lastUpdated:r.lastUpdated,requestCount:r.requestCount,description:r.description},await n.promises.writeFile(t,JSON.stringify(s,null,2),"utf-8")}async function y(e){const r=o.join(c,e,"metadata.json");try{const t=await n.promises.readFile(r,"utf-8");return JSON.parse(t)}catch(t){throw new Error(`\u65E0\u6CD5\u83B7\u53D6\u4F1A\u8BDD\u4FE1\u606F: ${t instanceof Error?t.message:String(t)}`)}}async function x(e,r){const t=o.join(c,e,"metadata.json");try{const s=await n.promises.readFile(t,"utf-8"),a={...JSON.parse(s),...r,lastUpdated:new Date().toISOString()};return await n.promises.writeFile(t,JSON.stringify(a,null,2),"utf-8"),await S(e,a),a}catch(s){throw new Error(`\u65E0\u6CD5\u66F4\u65B0\u4F1A\u8BDD\u4FE1\u606F: ${s instanceof Error?s.message:String(s)}`)}}async function j(e=10){const r=o.join(d,"sessions-index.json");try{if(!n.existsSync(r))return[];const t=await n.promises.readFile(r,"utf-8"),s=JSON.parse(t);return Object.entries(s).map(([i,a])=>({id:i,created:a.created||new Date(0).toISOString(),lastUpdated:a.lastUpdated||new Date(0).toISOString(),requestCount:a.requestCount||0,description:a.description})).sort((i,a)=>new Date(a.lastUpdated).getTime()-new Date(i.lastUpdated).getTime()).slice(0,e)}catch(t){return console.error("\u5217\u51FA\u4F1A\u8BDD\u5931\u8D25",t),[]}}async function g(e){const r=o.join(c,e),t=o.join(d,"sessions-index.json");try{if(!n.existsSync(r))throw new Error(`\u4F1A\u8BDD\u4E0D\u5B58\u5728: ${e}`);if(await n.promises.rm(r,{recursive:!0,force:!0}),n.existsSync(t)){const s=await n.promises.readFile(t,"utf-8"),i=JSON.parse(s);i[e]&&(delete i[e],await n.promises.writeFile(t,JSON.stringify(i,null,2),"utf-8"))}return!0}catch(s){return console.error(`\u5220\u9664\u4F1A\u8BDD ${e} \u5931\u8D25:`,s),!1}}export{w as createSession,g as deleteSession,y as getSessionInfo,j as listSessions,x as updateSessionInfo};