feat(audit): F1+F2 告警静默规则标记完成 + 审计日志CSV导出实现
F1 告警静默规则 [done]: - 后端 alert_silence.go: CRUD + Toggle (onetime/daily/weekly 三模式) - 告警引擎 isSilenced 集成 (alert_engine.go) - 前端 SilenceRuleTab + SilenceDialog - 路由 /alerts/silences 已注册 F2 审计日志导出 [done]: - 重写 ExportAuditLogs: 真正的 CSV 导出 (encoding/csv + UTF-8 BOM) - 支持 module/action/username/startTime/endTime 筛选 - 导出限制 10000 条防溢出,自动记录审计日志 - JSON 格式向后兼容 (format=json) - 前端 exportLogs 传递查询参数 同时包含累积的前期工作: - 目录重构 internal/ -> controller/model/router (v0.55-v0.57) - 后端分层架构 dto/repository/service/utils - 审计模块全功能 (终端审计/操作审计/登录日志) - asciicast v2 录制格式 - SFTP 文件浏览器 - StatStrip 紧凑统计条 - 在线会话自动刷新 - LiveMonitor WebSocket 诊断修复 验证: go build ✅ | npm run build ✅ | Docker 部署 ✅ | 10 回归端点 ✅ | CSV 导出 ✅ | 静默 CRUD ✅
This commit is contained in:
1 parent
e57718998a
commit
77c234b060
314 files changed
+10050
-4065
No files matched your search
@@ -0,0 +1 @@
|
||||
import{g as he,a as le,r,j as e,B as i,G as L,P as Ce,D as xe,b as pe,c as ge,d as be,e as De,I as u,O as je,t as ve,a4 as F,a5 as ke,T as Se,x as te,E as Me,a3 as Te,f as Ne}from"./index-DfyorCky.js";import{T as Ae,a as ze,b as de,c as me}from"./tabs-CIh_yD4s.js";import{B as v}from"./badge-xNW8x0G1.js";import{C as re,b as Le,c as Fe,a as oe}from"./card-C55cvSHg.js";import{L as c}from"./label-BK0h2apY.js";import{S as l}from"./switch-CGiGgOnh.js";import{S as Y,a as ee,b as ae,c as se,d as A,C as I}from"./select-D5qUzdAs.js";import{t as o}from"./index-a3ybMjbR.js";import{p as k,z}from"./monitor-BAaBXIsC.js";import{R as ce}from"./refresh-cw-DUB_tAG-.js";import{P as H}from"./plus-CUG-9kpu.js";import{S as fe}from"./square-pen-BxUFAe0F.js";import{T as _e}from"./trash-2-Dx32pOzT.js";import{W as Ie}from"./wrench-KfbhOOJm.js";import{C as Pe}from"./circle-x-DK79Dhg2.js";import{C as qe}from"./circle-check-DWcXrx2k.js";import"./index-CWVNW_qu.js";const Ee=[["path",{d:"M12 22v-5",key:"1ega77"}],["path",{d:"M15 8V2",key:"18g5xt"}],["path",{d:"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z",key:"1xoxul"}],["path",{d:"M9 8V2",key:"14iosj"}]],ne=he("plug",Ee);const Oe=[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]],$=he("star",Oe),ie={name:"",url:"",access:"server",http_method:"POST",basic_auth:!1,basic_auth_user:"",basic_auth_pass:"",with_credentials:!1,tls_client_auth:!1,with_ca_cert:!1,ca_cert:"",skip_tls_verify:!1,custom_headers_json:"",enable_alerting:!0,alertmanager_ds:"",scrape_interval:15,query_timeout:60,disable_metrics_lookup:!1,custom_query_params:"",is_default:!1};function Re(){const x=le(),[h,p]=r.useState([]),[B,V]=r.useState(!0),[U,g]=r.useState(!1),[b,q]=r.useState(null),[s,_]=r.useState({...ie}),[P,D]=r.useState([]),[y,E]=r.useState(!1),[,O]=r.useState(!1),[S,R]=r.useState(!1),[T,w]=r.useState(!1),[M,N]=r.useState(!1),[j,Z]=r.useState(null),m=r.useCallback(async()=>{try{const a=await k.list();p(a?.data||a||[])}catch{o.error("获取数据源列表失败")}finally{V(!1)}},[]);r.useEffect(()=>{m()},[m]);const G=()=>{q(null),_({...ie}),D([]),Z(null),E(!1),O(!1),R(!1),w(!1),g(!0)},W=a=>{q(a.id),_({name:a.name,url:a.url,access:a.access||"server",http_method:a.http_method||"POST",basic_auth:a.basic_auth||!1,basic_auth_user:a.basic_auth_user||"",basic_auth_pass:a.basic_auth_pass||"",with_credentials:a.with_credentials||!1,tls_client_auth:a.tls_client_auth||!1,with_ca_cert:a.with_ca_cert||!1,ca_cert:a.ca_cert||"",skip_tls_verify:a.skip_tls_verify||!1,custom_headers_json:a.custom_headers||"",enable_alerting:a.enable_alerting!==!1,alertmanager_ds:a.alertmanager_ds||"",scrape_interval:a.scrape_interval||15,query_timeout:a.query_timeout||60,disable_metrics_lookup:a.disable_metrics_lookup||!1,custom_query_params:a.custom_query_params||"",is_default:a.is_default||!1});try{const d=JSON.parse(a.custom_headers||"[]");D(Array.isArray(d)?d:[])}catch{D([])}Z(null),g(!0)},n=(a,d)=>{_(f=>({...f,[a]:d}))},J=()=>{D(a=>[...a,{header:"",value:""}])},t=a=>{D(d=>d.filter((f,X)=>X!==a))},C=(a,d,f)=>{D(X=>{const K=[...X];return K[a]={...K[a],[d]:f},K})},Q=async()=>{if(!s.name.trim()){o.error("请输入数据源名称");return}if(!s.url.trim()){o.error("请输入 Prometheus URL");return}const a={name:s.name.trim(),url:s.url.trim(),access:s.access,http_method:s.http_method,basic_auth:s.basic_auth,basic_auth_user:s.basic_auth_user,basic_auth_pass:s.basic_auth_pass,with_credentials:s.with_credentials,tls_client_auth:s.tls_client_auth,with_ca_cert:s.with_ca_cert,ca_cert:s.ca_cert,skip_tls_verify:s.skip_tls_verify,custom_headers:JSON.stringify(P),enable_alerting:s.enable_alerting,alertmanager_ds:s.alertmanager_ds,scrape_interval:s.scrape_interval,query_timeout:s.query_timeout,disable_metrics_lookup:s.disable_metrics_lookup,custom_query_params:s.custom_query_params,is_default:s.is_default};try{b?(await k.update(b,a),o.success("数据源更新成功")):(await k.create(a),o.success("数据源创建成功")),g(!1),m()}catch(d){o.error(d?.message||"操作失败")}},ye=async a=>{if(await x({title:"删除数据源",description:`确定删除数据源「${a.name}」吗?此操作不可撤销。`,variant:"destructive"}))try{await k.delete(a.id),o.success("已删除"),m()}catch{o.error("删除失败")}},we=async a=>{try{await k.setDefault(a.id),o.success(`已将「${a.name}」设为默认数据源`),m()}catch{o.error("设置失败")}},Ze=async()=>{if(!s.url.trim()){o.error("请先输入 URL");return}N(!0),Z(null);try{const a=await k.testConnection({url:s.url.trim(),basic_auth:s.basic_auth,basic_auth_user:s.basic_auth_user,basic_auth_pass:s.basic_auth_pass,skip_tls_verify:s.skip_tls_verify}Line truncated
|
||||
Reference in new issue
Block a user