grafana-mcp-analyzer
Version:
让AI助手直接分析你的Grafana监控数据 - A Model Context Protocol server for Grafana data analysis
2 lines (1 loc) • 2.96 kB
JavaScript
import l from"axios";import{parseCurlCommand as f}from"./curl-parser.js";const m=3e4;async function h(a,e){try{let t;if("curl"in a?t=f(a.curl):t=a,!t.url)throw new Error("\u7F3A\u5C11URL\u914D\u7F6E");const s=t.url.startsWith("http")?t.url:`${e}/${t.url}`,r=await l({url:s,method:t.method||"POST",headers:t.headers||{"Content-Type":"application/json"},data:t.data,params:t.params,timeout:t.timeout||m,...t.axiosConfig});return{success:!0,status:r.status,statusText:r.statusText,headers:Object.fromEntries(Object.entries(r.headers).map(([c,u])=>[c,String(u)])),data:r.data}}catch(t){return t.response?{success:!1,status:t.response.status,statusText:t.response.statusText,headers:Object.fromEntries(Object.entries(t.response.headers||{}).map(([s,r])=>[s,String(r)])),data:t.response.data,error:`HTTP\u9519\u8BEF: ${t.response.status} ${t.response.statusText}`}:t.request?{success:!1,error:`\u65E0\u54CD\u5E94: ${t.message||"\u8BF7\u6C42\u8D85\u65F6\u6216\u7F51\u7EDC\u9519\u8BEF"}`}:{success:!1,error:`\u8BF7\u6C42\u9519\u8BEF: ${t.message||"\u672A\u77E5\u9519\u8BEF"}`}}}function x(a){if(!a.success)return{hasData:!1,type:"error",status:String(a.status||"error"),timestamp:new Date().toISOString(),data:{error:a.error},metadata:{error:a.error,status:a.status}};let e="unknown",t=!1;return a.data&&(a.data.results?(e="grafana-query",t=!0):a.data.series?(e="timeseries",t=Array.isArray(a.data.series)&&a.data.series.length>0):a.data.tables?(e="tables",t=Array.isArray(a.data.tables)&&a.data.tables.length>0):a.data.responses?(e="elasticsearch",t=Array.isArray(a.data.responses)&&a.data.responses.length>0):Array.isArray(a.data)?(e="array",t=a.data.length>0):typeof a.data=="object"?(e="object",t=Object.keys(a.data).length>0):(e=typeof a.data,t=a.data!==null&&a.data!==void 0)),{hasData:t,type:e,status:String(a.status||200),timestamp:new Date().toISOString(),data:a.data,metadata:{contentType:a.headers?.["content-type"],responseSize:JSON.stringify(a.data).length}}}async function T(a,e){try{const t=await l.get(a,{timeout:e?.timeout||5e3}),s=e?.expectedStatus||200;return{status:t.status===s?"healthy":"warning",timestamp:new Date().toISOString(),message:`\u72B6\u6001\u7801: ${t.status}`,details:{status:t.status,statusText:t.statusText,expectedStatus:s}}}catch(t){return{status:"unhealthy",timestamp:new Date().toISOString(),message:t.code==="ECONNABORTED"?"\u5065\u5EB7\u68C0\u67E5\u8D85\u65F6":t.message,details:{code:t.code,isTimeout:t.code==="ECONNABORTED"}}}}async function p(a,e="",t={}){const{concurrency:s=5,failFast:r=!1}=t;if(a.length===0)return[];const c=[];for(let u=0;u<a.length;u+=s){const o=a.slice(u,u+s),d=o.map(i=>h(i,e));try{const i=await Promise.all(d);if(c.push(...i),r&&i.some(n=>!n.success))break}catch(i){const n=o.map(()=>({success:!1,error:`\u6279\u91CF\u67E5\u8BE2\u5931\u8D25: ${i}`,status:void 0,data:void 0}));if(c.push(...n),r)break}}return c}export{T as checkHealth,p as executeBatchQueries,h as executeQuery,x as extractData};