首页 文章 精选 留言 我的

精选列表

搜索[天玑9500],共10000篇文章
优秀的个人博客,低调大师

188 天 4369 stars:单作者 Rust 把「AI 防误删」做成事实标准

> GitHub: https://github.com/dicklesworthstone/destructive_command_guard ## 一句话总结 一个独立开发者用 Rust 写的小工具,6 个月内在 GitHub 拿到 4369 stars —— 因为它几乎是为数不多真的能在 Claude Code / Codex / Gemini / Copilot / Hermes / Grok / Antigravity 七大 AI 编码 agent 执行 shell 之前把它们拦下来的护栏,并真实经历过 CVE 级别对抗并同日修复。 ## 值得关注的理由 - **定义了品类:**2026 年 1 月 7 日首 commit 时这个垂直市场是空的,最近的竞品(claude-warden 28⭐、sh-guard 22⭐)比它小 100–200 倍。 - **真打过硬仗:**2026 年 7 月 security researcher 报告 CVE 7.1 级别漏洞,作者当日发 v0.6.6 修复并发布 GHSA 公告 —— GitHub 上几乎唯一有公开 CVE 履历的同类项目。 - **架构可移植:**7 层延迟预算 + drift guard、单 AC 扫描 + u128 candidate-pack bitmask、bounded recursion with `?`-propagation 这三个模式,任何做 latency-sensitive guard 的项目都能直接抄。 ## 项目展示 ![Destructive Command Guard — 阻止 AI agent 执行破坏性命令](https://developer.qcloudimg.com/http-save/yehe-7411420/744850c915f40c3ad5d726c7dc73a14f.jpg) *README hero illustration ——「防止 AI agent 误删你的代码」的核心命题* ## 项目画像 |维度|数据| | --- | --- | |GitHub|https://github.com/dicklesworthstone/destructive_command_guard| |Star / Fork|4369 / 163| |代码行数|165,163(Rust 86.0% / Shell 7.3% / PowerShell 2.3% / 其他 4.4%)| |项目年龄|6.2 个月(首 commit 2026-01-07)| |开发阶段|密集开发(v0.6.x 阶段,每月仍 30+ commits)| |贡献模式|独立开发(99.2% commit 来自 owner Jeff Emanuel)| |热度定位|中等热度(垂直领域第一,~23 stars/day)| |质量评级|代码 优(架构清晰、tests/prod 22.1%)· 文档 优(README+SKILL.md+docs/)· 测试 优(4208 个 #[test],contract test 而非 smoke)| ## 作者视角:为什么存在这个项目 ### **创始人/作者背景** **Jeff Emanuel**(GitHub: `Dicklesworthstone`),NYC 独立开发者,bio 写「Building in NY」,Twitter `doodlestein`。账号 8.5 年,187 个 public repos,其中最有名的项目是这一堆「franken*」:frankenscipy、franken_numpy、frankenpandas、frankensearch、frankenredis、frankenlibc、franken_whisper、frankensim —— 统一主题是「用 Rust 重写主流 C/Python 工具」**。再加上 asupersync(238⭐)和 ntm(392⭐,Go 写的终端复用器)。dcg(4369⭐)是他目前最大、最严肃的项目。 ### **问题判断** 2025–2026 年 AI coding agent 大爆发,每个 agent(Claude Code / Codex / Gemini CLI / Copilot CLI)都有自己的 hook 协议 —— 但**没有任何一个工具能跨所有 agent、在 shell 命令执行前做 destructive command 拦截**。这是一个被所有人踩到、但没人修过的痛点。Emanuel 的判断是:与其让每个 agent 团队自己造轮子,不如做一个中立的「last mile safety layer」,各家 hook 都接进来。 ### **解法哲学** **SKILL.md 里写得很清楚**:「Whitelist-First Architecture」、「Fail-Safe Defaults (Default-Allow)」、「Zero False Negatives Philosophy」。翻译一下: - **宁可多弹几次确认,也不放过一次 `rm -rf /**` - **遇到超时 / 解析失败 → fail-open**(让命令通过),但用 200ms 绝对上限 + 10ms 硬下限封顶,避免 perf 缺陷被武器化为 bypass - **Zero False Negatives**:架构设计围绕「绝不让破坏性命令通过」展开,false positives 是可接受的代价 ### **战略意图** 商业化路径不明显(自定义 source-available 许可,**不是** OSI 批准的开源协议),但从 99.2% 单作者占比、25.8% 周末 commits、49.5% 夜间 commits 看,更像是「认真做的产品级 side project」而非商业项目。**Emanuel 用这一堆 franken* 项目建立 Rust 重写工具的品牌,dcg 是这个品牌下第一个冲到 4000+ stars 的旗舰**。 > 官方文档丰富(README+SKILL.md+docs/),但无独立官网/博客。本文未 WebFetch 作者个人博客 https://www.jeffreyemanuel.com/。 ## 核心价值提炼 ### **创新之处** 1. **声明式预算常量 + drift guard**(novelty 5/5)—— `src/perf.rs:430-481` 的 `budget_documentation_matches_source_of_truth` 测试解析 README、AGENTS.md、ci.yml、bench.yml 四个文件,断言 7 层 Budget 常量的字面量文本一致 —— **从根本上消除了「文档说 5ms、代码写 50ms」的漂移**。 1. **u128 candidate-pack mask + 单 AC 扫描**(novelty 4/5)—— `packs/mod.rs:833-918` 把 91 个 pack 的 keywords 合成一个 Aho-Corasick 自动机,匹配后 OR 一个 u128 位掩码;比 per-pack memmem 扫描快 ~900 倍。 1. **有界递归 + `?`-propagation**(novelty 4/5)—— v0.6.6 修复 #189 的关键:递归上限 + 用 `?` 立即传播 unterminated 嵌套结构,**而不是 advance 一字节然后重新扫描**(重扫本身就是指数行为)。 1. **多 agent wire-format 多态 via serde aliases + per-agent emit struct**(novelty 5/5)—— 单 `HookInput` 通过 `#[serde(alias)]` 接受 7 种 agent 的 JSON,再用区分字段选 7 个 emit struct。**核心洞察:多协议兼容的真正难点是下游输出 parser 的字段严格性(Copilot 丢弃未知字段),不是上游输入的差异**。 1. **Fail-open + MIN_HOOK_TIMEOUT_MS=10 硬下限**(novelty 4/5)—— 200ms 绝对 fail-open 上限让 dcg 永远不会卡住工作流,但 10ms 硬下限防止用户配 `DCG_HOOK_TIMEOUT_MS=0` 来绕过护栏。 ### **可复用的模式与技巧** |模式|适用|代码锚点| | --- | --- | --- | |声明式 Budget 常量 + doc-drift test|任何有 SLO 的延迟敏感服务|src/perf.rs:430-481| |Fail-open deadline + min-budget floor|任何同步 guard|src/perf.rs:277, 321| |AC candidate-set bitmask|50+ 规则的小关键字集规则引擎|src/packs/mod.rs:1916-1997| |有界递归 + 保守触发-on-exhaustion|任何面对不可信输入的递归下降|src/heredoc.rs:142-215| |Serde-alias 多态 + per-protocol emit|任何多上游 + 严格输出下游|src/hook.rs:19-379| |Whitelist-first 两阶段评估|任何误报代价高的分类器|src/packs/mod.rs:492-553| ### **关键设计决策** - **Fail-open on adversarial input:**攻击者构造能 hang 的 payload → dcg 超时后让命令通过。trade-off:✅ 不 brick 用户工作流;❌ 攻击者可构造总超时的命令绕过 → 由 MIN_HOOK_TIMEOUT_MS=10 + graduated_response 缓解。 - **单二进制 + YAML pack(regex-only)vs WASM/Lua 插件:**✅ 极快、极安全、审计友好;❌ 自定义 pack 不能用 ast-grep 结构化模式。 - **手写 rm parser:**replacement of regex-only 解决 `rm -rf` / `rm -r -f` / `rm --recursive --force` 三种 flag 风格的 span attribution。 - **多 agent hook 单 binary vs per-agent binary:**✅ 单安装足迹、单升级路径;❌ 每新 agent 都要新 emit struct。 ## 竞品格局与定位 ### **竞品对比矩阵** |维度|dcg|claude-warden|sh-guard|no-nuke| | --- | --- | --- | --- | --- | |Stars|4369|28|22|2| |语言|Rust|TypeScript|Rust|Python| |Agent 支持|7 个(Claude/Codex/Gemini/Copilot/Hermes/Grok/Antigravity)|仅 Claude Code|通用|Claude+Codex| |Pack 系统|91 pack / 27 类别|单领域|无|无| |AST heredoc 扫描|✅|❌|❌|❌| |路径作用域 allowlist|✅|❌|❌|❌| |公开 CVE 履历|✅(GHSA-4cfr-w3v5-w5j5)|❌|❌|❌| |License|自定义 source-available|MIT|MIT|MIT| |体量|65k LOC|~1k LOC|~1 Rust file|~Python 单文件| ### **差异化护城河** 1. **深度解析** —— 解析嵌入在 heredoc 里的 Python/JS/Ruby/Go/PHP/Perl/TypeScript/PowerShell/Bash,竞品都不做 1. **多 agent wire-format** —— 7 个协议适配,竞品至多 1 个 1. **生产硬化** —— 公开 CVE + 同日修复 + JSON Schema config + 10 个 GitHub Actions workflow + bench regression gate ### **竞争风险** - **claude-warden(TypeScript)**天然契合 Claude Code plugin 生态 —— 如果 Claude Code 团队自己做官方护栏,claude-warden 的部署门槛更低 - **agent 官方支持:**每个 AI coding agent 团队都有动机自建护栏(OpenAI、Anthropic、Google 都有工程资源做这件事);一旦官方做了,dcg 在该 agent 上的护城河就没了 - **License 风险:**自定义 source-available 不是 OSI 批准,企业法务可能拒签 ### **生态定位** **「AI coding agent 的最后一道防线」** —— 位于 agent → shell 之间,是一个垂直但关键的安全层。GitHub 上存在 `jms830/opencode-dcg-plugin`、`matznerd/antigravity-destructive-command-guard-dcg` 等 dcg 包装器,说明**它正在成为新 AI agent 默认对接的事实安全层**。 ## 套利机会分析 - **信息差:**垂直蓝海 —— 最近竞品 100–200x 差距,但**这正是「市场还在演化」的红利期**,再过 6–12 个月可能会有 Anthropic/OpenAI 官方下场 - **技术借鉴:** - 任何 latency-sensitive guard → `src/perf.rs` 的 budget + drift test 整套 - 任何多协议集成工具 → `src/hook.rs` 的 serde-alias + per-agent emit - 任何面对不可信输入的递归下降 → bounded recursion + `?`-propagation - **生态位:**填补「跨 agent shell 拦截」空白;自然延伸方向是 audit trail + 合规报告(企业客户刚需) - **趋势判断:**2026 年 AI coding agent 安全需求爆发期,月 commit 从 1131 降到 21 是「稳定维护」而非「停滞」信号;fix 数量远超 feat 是成熟期特征 ## 风险与不足 - **Bus factor = 1:**99.2% commit 来自 Emanuel 一人;Jeff Emanuel 那 3 个 commit 看着是同一作者的另一个身份 → 任何主作者中断(健康/职业变动)项目立刻停滞 - **Fail-open 哲学本身是绕过向量:**#189 证明 perf 缺陷可被武器化为 security 缺陷;v0.6.6 修了那个具体 bug 但**已知 #191 REPL bypass**(stdin/pipe/subst 到 redis-cli/psql/mysql 尚未追踪) - **License 风险:**自定义 source-available 不是 OSI 批准,企业法务审查可能不过 - **src/cli.rs 17,881 行:**逼近工程实践上限(>10k 行建议拆分),仍是第二大改动文件 → 拆分压力持续累积 - **nightly-2026-06-06 pinned:**rustix 1.1.4 已在 v0.6.3 引发过编译失败;未来 nightly 再次回归若未及时 unpin,发布链路可能再次断裂 - **PR 合并率仅 16%:**72% 的外部 PR 被关闭 → 主作者对路线把控严格,社区贡献吸纳率低 ## 行动建议 - **如果你要用它:** - ✅ 适合:跨多个 AI agent 工作、需要 audit trail、生产环境有合规要求 - ⚠️ 注意:先与法务确认自定义 license;开启 musl 静态构建(GLIBC_2.39 兼容性已知) - ❌ 不适合:只用一个 agent 且愿意等官方护栏、能接受 Python 工具链 - **如果你要学它**(按价值排序): 1. **src/perf.rs**(483 LOC)—— 整个操作哲学的最浓缩文件;doc-drift test 是项目最可复制的 50 行 2. **src/evaluator.rs:1576-1815**(`evaluate_command_with_pack_order_deadline_at_path`)—— 240 行核心流水线,单函数拿下 70% 架构理解 3. **src/packs/mod.rs:833-918 + 2533-2790** —— u128 candidate-pack bitmask + v0.6.6 #189 修复 4. **src/hook.rs:19-379** —— 7 协议 + 7 emit struct,per-vendor interop 最浓缩示例 5. **src/packs/core/filesystem.rs:335-433**(`parse_rm_command`)—— 手写 rm parser - **如果你要 fork 它:** - 加 **multi-agent audit trail + 合规报告**(企业刚需,目前 dcg 没强调) - 加 **AI-driven 解释模式**(explain 命令目前只显示 byte span,可叠加 LLM 解释为什么这条命令危险) - 收紧 **REPL bypass #191**(stdin/pipe/subst 到 redis-cli/psql/mysql 的追踪) - 引入 **官方 Coop-Maintainer 计划**对冲 Bus factor = 1 ### **知识入口** ``` 未收录(HTTP 403) ``` --- **分析时间**:2026-07-14 **分析者**:repo-miner skill **方法**:三阶段分析(Network + Meta + Content)—— 中间产物存于 `tmp/destructive_command_guard-phase-{1,2,3}-analysis.md`

优秀的个人博客,低调大师

从0到1玩转夜莺监控:这篇实战指南我写了三天,建议收藏!

说起监控系统,你脑子里第一个蹦出来的是啥?Zabbix?Prometheus?Grafana?还是云厂商自带的那一套? 说实话,这些年我用过不少监控工具,直到去年在一家公司接手了一个全新的运维项目,需要重新搭建监控体系。当时评估了一大圈,最后选择了夜莺(Nightingale)。用了一年半,体验是真的香,所以今天想把踩过的坑、填过的坑,一股脑儿全倒出来,给正在选型或者刚开始用夜莺的朋友一点参考。 ## **这玩意儿到底是个啥?** 文档地址:https://n9e.github.io/zh/docs/prologue/introduction/ 夜莺监控,听名字挺文艺,其实是个硬核的云原生监控分析工具。它的核心理念是"All-in-One",啥意思呢?就是把数据采集、可视化、监控告警、数据分析这些事儿全给你包圆了,不用东拼西凑。 说起它的出身还挺有来头。最早是滴滴公司开发并开源的,2022年5月11日,滴滴把它捐赠给了中国计算机学会开源发展委员会(CCF ODC),成了CCF ODC成立后接受的第一个开源项目 [3]。研发团队都是Open-Falcon那帮老炮儿,所以在告警引擎这块的功底,你完全可以放心。 那它跟Grafana+Zabbix这套组合拳有啥区别?我个人用下来的感受是:Grafana强在可视化,夜莺强在告警。Grafana的图表是真的漂亮,但告警这块说实话做得一般。夜莺的告警引擎是它的看家本领,规则配置灵活、事件管道处理、告警自愈、20多种通知媒介(电话、短信、邮件、钉钉、飞书、企业微信这些都内置了),用起来是真的顺手 [3]。 而且夜莺的定位很有意思——它可以做两件事: **第一种用法**:你已经有Prometheus+各类Exporter的监控体系了,那直接把Prometheus作为数据源接入夜莺,夜莺就只管告警这件事,可视化你继续用Grafana。 **第二种用法**:用夜莺自带的Categraf采集器采集数据,然后夜莺作为数据转发网关,把数据写入后端时序库(Prometheus、VictoriaMetrics等),同时承担告警和可视化的角色。 我们今天主要讲第二种用法,从零开始搭建一套完整的夜莺监控体系。 ## **架构这块儿,先整明白** ![image-20260714205732798](https://developer.qcloudimg.com/http-save/yehe-3597170/05ed2fe9bf99e9e9258c3591ccc4b06a.png) image-20260714205732798 ![image-20260714205747507](https://developer.qcloudimg.com/http-save/yehe-3597170/35775142e8ceb85df97e8a01918577f8.png) image-20260714205747507 在动手部署之前,必须得把架构搞清楚,不然部署到一半你会懵。 夜莺的核心进程叫n9e,这个名字来源于夜莺的英文Nightingale的前两位字母 [1]。n9e本身依赖两个存储: - **MySQL**:存放用户、监控大盘、告警规则这类配置信息 - **Redis**:存放JWT Token、心跳信息(机器的CPU、内存、时间偏移、核数、操作系统、CPU架构这些) 从v6版本开始,夜莺转型成了统一可观测性平台,不再只支持时序数据源,ES、Loki、Jaeger这些也都能接入了 [1]。 部署架构上有两种典型场景: **场景一:中心机房架构**(适合单机房或者多机房专线稳定的公司) - n9e部署在中心机房 - 所有机器的Categraf直接上报数据给中心n9e - n9e把数据转发给后端时序库(Prometheus或VictoriaMetrics) - 部署多个n9e实例,前面挂Nginx做负载均衡即可实现高可用 **场景二:边缘下沉式混杂架构**(适合多机房、网络链路不好的公司) - 中心机房部署n9e - 边缘机房部署n9e-edge - n9e-edge不依赖MySQL、Redis,只依赖中心端的n9e - Categraf在边缘机房把数据上报给n9e-edge - n9e-edge再把数据写入边缘机房的时序库 - 中心n9e通过配置数据源的方式去查询边缘机房的时序库 我当时公司的情况是中心机房在南京,边缘机房在香港,之间网络时不时抽风,所以两种架构都用上了。下面我会分别讲讲怎么部署。 ## **环境准备** 我这次用的是Rocky Linux 8.5,大家用CentOS 7或者Ubuntu 20.04也都没问题,差别不大。 |服务|版本|说明| | --- | --- | --- | |n9e|6.7.2|夜莺服务端| |Categraf|0.3.45|夜莺客户端| |MySQL|5.7.36|存储配置信息| |Redis|6.2.6|缓存和心跳| |Prometheus|2.37.0|时序数据库| 这里有个坑要提一下,官方其实更推荐VictoriaMetrics作为时序库,性能确实比Prometheus好不少,单机版就能扛住每秒上百万数据点 [2]。但考虑到我们公司已经有一套Prometheus体系了,为了节省成本就直接用了Prometheus。如果你是新环境,强烈建议直接上VictoriaMetrics。 ## **中心机房架构部署实战** ### **MySQL和Redis先跑起来** 这两个我直接用Docker部署了,方便快捷。MySQL和Redis的具体部署过程我就不展开了,网上教程一大堆。重点是要建好库和授权。 部署完成后,导入夜莺的初始化SQL: ``` mysql -h 10.206.0.17 -u root -p'YourPassword' /etc/systemd/system/prometheus.service [Unit] Description="prometheus" Documentation=https://prometheus.io/ After=network.target [Service] Type=simple ExecStart=/data/prometheus-2.45.2.linux-amd64/prometheus \ --config.file=/data/prometheus-2.45.2.linux-amd64/prometheus.yml \ --storage.tsdb.path=/data/prometheus-2.45.2.linux-amd64/data \ --web.enable-lifecycle \ --enable-feature=remote-write-receiver \ --query.lookback-delta=2m Restart=on-failure SuccessExitStatus=0 LimitNOFILE=65536 StandardOutput=syslog StandardError=syslog SyslogIdentifier=prometheus [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable prometheus systemctl restart prometheus ``` 注意这里有个`--web.enable-lifecycle`参数,是为了支持热加载配置用的。`--query.lookback-delta=2m`则是查询时向前看的时间窗口,太小会查不到数据。 访问`http://yourIP:9090/`能看到Prometheus的Web界面就说明启动成功了。 ### **部署夜莺核心n9e** n9e建议用二进制方式部署,systemd托管,后面升级维护也方便 [2]。Docker compose方式虽然简单,但社区里很多坑其实都是对Docker compose不熟导致的。Helm方式适合大规模K8s环境,但官方其实不太建议把夜莺服务端部署到K8s里——K8s挂了监控就挂了,监控系统作为P0级服务,依赖其他组件越少越好 [2]。 下载安装包(去flashcat.cloud/download/nightingale/找最新版本): ``` mkdir /data/n9e tar xzf n9e-v6.7.2-linux-amd64.tar.gz -C /data/n9e/ ``` 修改配置文件,主要是DB部分: ``` cp etc/config.toml etc/config.toml.bak vim etc/config.toml ``` 找到`[DB]`部分,配置MySQL连接信息。然后找到`[Pushgw.Writers]`,配置时序库的地址: ``` [Pushgw] LabelRewrite = true [[Pushgw.Writers]] Url = "http://127.0.0.1:9090/api/v1/write" ``` 这个配置的意思是:夜莺接收到Categraf上报的监控数据后,会转发给这个URL。如果你想把数据写入多个时序库,配置多个`[[Pushgw.Writers]]`就行。 配置systemd: ``` cat /etc/systemd/system/n9e.service [Unit] Description="n9e.service" After=network.target [Service] Type=simple ExecStart=/data/n9e/n9e WorkingDirectory=/data/n9e Restart=on-failure SuccessExitStatus=0 LimitNOFILE=65536 StandardOutput=syslog StandardError=syslog SyslogIdentifier=n9e.service [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl start n9e.service systemctl enable n9e.service ``` ![image-20260714210722432](https://developer.qcloudimg.com/http-save/yehe-3597170/e13a367ffaf5a98b5913cf2b5b2f7ce6.png) image-20260714210722432 n9e默认监听17000端口,启动成功后`netstat -lntp | grep 17000`应该能看到。 ![image-20260714210835426](https://developer.qcloudimg.com/http-save/yehe-3597170/6c994661bc2325b5d5f42643256e06f7.png) image-20260714210835426 还有一点很重要:安装完成后一定要改默认密码!默认账号是`root`,密码是`root.2020` [2]。我看到有公开数据显示,网上有上千个夜莺的公网站点,很多都没改默认密码,这不是明摆着让人白嫖吗?另外`config.toml`里的`SigningKey`也建议改成随机字符串,用来加密JWT token。 ### **部署采集器Categraf** 夜莺本身不负责数据采集,这事儿得交给agent。官方推荐的是Categraf,当然用telegraf、grafana-agent这些也都能对接 [1]。 Categraf的安装包可以从GitHub的flashcatcloud/categraf仓库下载: ``` tar xzf categraf-v0.3.45-linux-amd64.tar.gz -C /data/ ``` 修改主配置`conf/config.toml`: ``` [global] hostname = "" [n9e] url = "http://10.206.0.17:17000" # n9e服务端地址 [heartbeat] enable = true url = "http://10.206.0.17:17000/v1/n9e/heartbeat" ``` Categraf的目录结构是这样的 [1]: ``` conf/ ├── config.toml # 主配置 ├── logs.toml # logs-agent配置 ├── prometheus.toml # prometheus agent配置 ├── traces.yaml # trace-agent配置 └── input.*/ # 各种采集插件的配置目录 ``` Categraf的精妙之处在于它"约定优于配置"的设计——以`input.`开头的目录就是各种采集插件的目录,运行时自动加载。如果某个采集器不想用,把`input.xx`改成`bak.input.xx`就行,Categraf会自动忽略 [1]。 基本采集项(CPU、内存、磁盘、磁盘IO、网络)默认就启用了,不用我们额外配置。 systemd管理Categraf: ``` cat /etc/systemd/system/categraf.service [Unit] Description="categraf.service" After=network.target [Service] Type=simple ExecStart=/data/categraf-v0.3.45-linux-amd64/categraf WorkingDirectory=/data/categraf-v0.3.45-linux-amd64 Restart=on-failure SuccessExitStatus=0 LimitNOFILE=65536 StandardOutput=syslog StandardError=syslog SyslogIdentifier=categraf.service [Install] WantedBy=multi-user.target EOF ``` ![image-20260714231048930](https://developer.qcloudimg.com/http-save/yehe-3597170/7c2f243aa2072423f8a77517e529267a.png) image-20260714231048930 ## **登录夜莺,第一眼该看啥** ![image-20260714234437635](https://developer.qcloudimg.com/http-save/yehe-3597170/27cac93144a4fb0f5753fbe500b1dc35.png) image-20260714234437635 服务都起来后,浏览器打开`http://yourIP:17000`,用默认账号`root`/`root.2020`登录。**注意,登录后第一件事就是改密码!** 登录进去后你会发现,主机列表是空的——别慌,因为虽然Categraf已经在上报数据了,但主机还没有归组 [1]。 这里就得理解夜莺的"业务组"概念了。业务组可以理解为资源的逻辑分组,比如你可以创建"web业务组"、"db业务组"、"中间件业务组",然后把对应的主机放进去。不同业务组的用户只能看到自己业务组内的资源,权限隔离做得挺细。 操作流程是这样的: 1. **创建用户:在系统管理-用户管理里创建用户** 1. **创建团队:在权限管理-团队管理里创建团队,团队命名有讲究,像`rab-dev`这种带横线的写法是有层级关系的(`rab`是父团队,`dev`是子团队)** 1. **创建业务组:在业务组管理里创建业务组** 1. **把主机归到业务组:在主机列表里勾选主机,分配业务组** 1. **把团队绑定到业务组:这样团队成员就能看到业务组内的主机了** 这套权限体系设计得挺合理,比直接给用户授权机器要灵活得多。 ## **配置数据源,让告警能跑起来** 到这里监控数据已经在采集了,但夜莺默认情况下还不知道Prometheus在哪。要让告警引擎能从时序库查询数据,需要配置数据源 [1]。 操作路径:集成中心-数据源管理-新增数据源,类型选择Prometheus,URL填`http://127.0.0.1:9090`,测试通过后保存。 配置完成后,告警规则才能查询到对应的指标数据。 ## **边缘机房部署:跨地域监控的救星** 说到这里就得提一下我们公司当时的情况了——南京中心机房和香港边缘机房之间网络时不时抽风。如果所有Categraf都直接上报到南京的n9e,香港那边网络一抖,数据就丢了,告警也漏了。 边缘下沉式架构就是为了解决这个问题的。核心思想是:把时序库下沉部署到边缘机房,避免大量时序数据传输到中心机房带来的网络压力 [1]。 ### **n9e-edge的配置要点** n9e-edge的安装包其实和n9e是同一个,解压后里面有n9e-edge这个二进制文件 [1]。 ``` mkdir -p /data/n9e-edge tar xzf n9e-v6.7.2-linux-amd64.tar.gz -C /data/n9e-edge/ ``` 修改`/data/n9e-edge/etc/edge/edge.toml`,关键是配置中心端n9e的地址: ``` [CenterApi] Addrs = ["http://119.45.140.59:17000"] BasicAuthUser = "user001" BasicAuthPass = "ccc26da7b9aba533cbb263a36c07dcc5" Timeout = 9000 ``` BasicAuthUser和BasicAuthPass对应的是中心端n9e的`[HTTP.APIForService.BasicAuth]`配置段 [1]。 n9e-edge不依赖MySQL和Redis,只依赖中心端的n9e,所以即使边缘机房和中心机房的网络断了,边缘机房的告警功能还是能正常运转——这个特性在生产环境中是救命级别的。 ### **边缘Categraf的配置区别** 边缘机房的Categraf配置和中心机房有两个不同点 [1]: 1. **数据上报地址改为n9e-edge的地址(默认端口19000)** 1. **心跳URL要改成`/v1/n9e/edge/heartbeat`,不能写`/v1/n9e/heartbeat**` ``` [n9e] url = "http://172.xx.xx.15:19000" [heartbeat] enable = true url = "http://172.xx.xx.15:19000/v1/n9e/edge/heartbeat" ``` ### **引擎名的坑** n9e-edge默认的引擎名叫`edge`,中心端n9e的引擎名叫`default`,两个要区分开 [1]。 如果你有多个边缘机房,每个边缘机房的n9e-edge的引擎名要不一样,不然会冲突。修改方法: ``` [Alert.Heartbeat] IP = "" Interval = 1000 EngineName = "edge-hk" # 改成你自己的引擎名 ``` ### **中心n9e添加边缘数据源** 在中心n9e的集成中心里,添加边缘机房的Prometheus作为数据源,**选择告警引擎的时候要选对应边缘机房的引擎名**(比如`edge-hk`),不能选default [1]。 到这里边缘机房的数据就接入完成了,中心n9e可以直接查询边缘机房的时序库,告警规则也能正常触发。 ## **高可用怎么做?** 监控系统要是挂了,那就跟没监控一样糟糕。n9e的高可用其实很简单——多部署几个实例,前面挂Nginx或者LVS做负载均衡就行 [1]。 边缘的n9e-edge同理,同一个edge集群的edge.toml里`EngineName`要一样,前面搞个负载均衡给agent上报数据用,高可用就完成了。 ## **几个我踩过的坑** 1. **时间不同步:社区反馈的很多问题都是机器时间没校准导致的,监控系统对时间很敏感,服务端、时序库、被监控目标、浏览器所在机器的时间都要保持一致 [2]。我曾经因为一台机器时间快了5分钟,看不到监控数据,排错排了一晚上。** 1. **Prometheus忘加参数:`--enable-feature=remote-write-receiver`这个参数一定要加上,不然数据写不进去。** 1. **业务组权限:建好用户和团队后一定要把团队关联到业务组,不然用户看不到主机。** 1. **公网暴露:夜莺千万别暴露在公网上,特别是没改默认密码的情况下 [2]。** 1. **K8s部署需谨慎:不推荐把夜莺服务端部署到K8s里,K8s挂了监控就挂了 [2]。** ## **写在最后** 写到这里差不多4000字了,从夜莺是什么、怎么部署、怎么用、踩过哪些坑,都过了一遍。夜莺这套体系用起来是真的省心,特别是告警引擎这一块,比我用过的其他监控工具都要顺手。 当然,工具好不好用,最终还是看适不适合你的业务场景。如果你只是在用云厂商的监控,夜莺可能不是必需品;如果你要自建监控体系,又希望告警能力强大、配置灵活,夜莺是个不错的选择。 --- 如果你觉得这篇文章对你有帮助,欢迎**点赞、在看、转发**三连,让更多运维兄弟看到!有任何问题欢迎评论区留言交流~

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册