<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>开发手册 on HUATUO 文档中心</title>
    <link>https://docs.huatuo.tech/zh/v2.3.0/development/</link>
    <description>Recent content in 开发手册 on HUATUO 文档中心</description>
    <generator>Hugo</generator>
    <language>zh</language>
    <lastBuildDate>Thu, 13 Aug 2026 21:53:16 +0800</lastBuildDate>
    <atom:link href="https://docs.huatuo.tech/zh/v2.3.0/development/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>扩展观测能力</title>
      <link>https://docs.huatuo.tech/zh/v2.3.0/development/custom-observability/</link>
      <pubDate>Sat, 18 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://docs.huatuo.tech/zh/v2.3.0/development/custom-observability/</guid>
      <description>&lt;p&gt;HUATUO 支持 Metrics、Event 和 AutoTracing 三种观测扩展。三者共享注册机制，&#xA;但触发方式、运行开销和数据输出不同。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;类型&lt;/th&gt;&#xA;          &lt;th&gt;触发方式&lt;/th&gt;&#xA;          &lt;th&gt;数据输出&lt;/th&gt;&#xA;          &lt;th&gt;适用场景&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Metrics&lt;/td&gt;&#xA;          &lt;td&gt;周期采集&lt;/td&gt;&#xA;          &lt;td&gt;Prometheus&lt;/td&gt;&#xA;          &lt;td&gt;持续观测系统性能和长期趋势&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Event&lt;/td&gt;&#xA;          &lt;td&gt;内核事件或阈值触发&lt;/td&gt;&#xA;          &lt;td&gt;ES、本地文件，可选 Prometheus&lt;/td&gt;&#xA;          &lt;td&gt;常态运行并捕获异常现场&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;AutoTracing&lt;/td&gt;&#xA;          &lt;td&gt;系统异常触发&lt;/td&gt;&#xA;          &lt;td&gt;ES、本地文件，可选 Prometheus&lt;/td&gt;&#xA;          &lt;td&gt;按需执行开销较高的上下文采集&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;模式说明&#34;&gt;模式说明&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e6%a8%a1%e5%bc%8f%e8%af%b4%e6%98%8e&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;metrics&#34;&gt;Metrics&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#metrics&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Metrics 通过 procfs、sysfs 或 eBPF 周期采集系统状态，以 Prometheus 格式输出，&#xA;适合实时监控和长期趋势分析。内置采集能力包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;CPU：sys、usr、util、load、nr_running 等。&lt;/li&gt;&#xA;&lt;li&gt;内存：vmstat、memory_stat、directreclaim、asyncreclaim 等。&lt;/li&gt;&#xA;&lt;li&gt;IO：d2c、q2c、freeze、flush 等。&lt;/li&gt;&#xA;&lt;li&gt;网络：ARP、socket memory、qdisc、netstat、netdev、sockstat 等。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;event&#34;&gt;Event&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#event&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Event 常态监听内核事件或阈值条件，在异常发生时保存内核运行上下文。该模式&#xA;面向需要持续开启的低开销观测，数据写入 Elasticsearch 和本地文件，也可以&#xA;同步生成 Prometheus 指标。内置事件包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;软中断异常 &lt;code&gt;softirq_tracing&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;内存异常分配 &lt;code&gt;oom&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;软锁定 &lt;code&gt;softlockup&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;D 状态进程 &lt;code&gt;hungtask&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;内存回收 &lt;code&gt;memory_reclaim_events&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;异常丢包 &lt;code&gt;dropwatch&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;网络接收延迟 &lt;code&gt;net_rx_latency&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;autotracing&#34;&gt;AutoTracing&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#autotracing&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;AutoTracing 在检测到系统异常后自动调用诊断工具，采集火焰图或上下文快照等&#xA;现场信息。它适合采集成本较高、无法持续运行的诊断数据。结果写入&#xA;Elasticsearch 和本地文件，也可以转换为 Prometheus 指标。内置能力包括：&lt;/p&gt;</description>
    </item>
    <item>
      <title>开发调试</title>
      <link>https://docs.huatuo.tech/zh/v2.3.0/development/debugging/</link>
      <pubDate>Sat, 18 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://docs.huatuo.tech/zh/v2.3.0/development/debugging/</guid>
      <description>&lt;h2 id=&#34;全组件联调&#34;&gt;全组件联调&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%85%a8%e7%bb%84%e4%bb%b6%e8%81%94%e8%b0%83&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;开发 Compose 使用当前工作区源码构建开发镜像，并启动采集器、API Server、&#xA;Elasticsearch、Prometheus 和 Grafana。采集器需要访问宿主机内核和 cgroup，&#xA;因此应在 Linux 主机的项目根目录使用 root 权限运行：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo make compose-dev-up&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Compose 在前台聚合所有组件日志。修改源码后，按 &lt;code&gt;Ctrl+C&lt;/code&gt; 停止环境并重新执行&#xA;命令；Docker 会复用工具链和 Go 编译缓存。&lt;/p&gt;&#xA;&lt;p&gt;调试结束后删除容器、数据卷和开发镜像：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo make compose-dev-down&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;该命令会删除 Elasticsearch 数据卷。需要保留联调数据时，不要执行该命令。&lt;/p&gt;&#xA;&lt;h2 id=&#34;bpf-调试&#34;&gt;BPF 调试&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#bpf-%e8%b0%83%e8%af%95&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;BPF 代码可以使用 &lt;code&gt;bpf_dbg()&lt;/code&gt; 和 &lt;code&gt;bpf_dbg_msg()&lt;/code&gt; 宏在内核态输出调试信息。&#xA;宏定义位于 &lt;code&gt;bpf/include/bpf_dbg.h&lt;/code&gt;。调试功能包含编译时和运行时两级开关，&#xA;默认完全关闭。&lt;/p&gt;&#xA;&lt;h3 id=&#34;添加调试埋点&#34;&gt;添加调试埋点&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e6%b7%bb%e5%8a%a0%e8%b0%83%e8%af%95%e5%9f%8b%e7%82%b9&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;每个使用调试宏的 BPF 源文件都需要声明独立的调试 map：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;#34;bpf_dbg.h&amp;#34;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;BPF_DBG_MAP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;native_cpu&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;SEC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;perf_event&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;prog&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nf&#34;&gt;bpf_dbg_msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;native_cpu&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;enter prog&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nf&#34;&gt;bpf_dbg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;native_cpu&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;pid and addr&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;bpf_dbg_msg()&lt;/code&gt; 只输出消息；&lt;code&gt;bpf_dbg()&lt;/code&gt; 还可以携带最多三个 &lt;code&gt;u64&lt;/code&gt; 参数。&lt;/p&gt;</description>
    </item>
    <item>
      <title>集成测试</title>
      <link>https://docs.huatuo.tech/zh/v2.3.0/development/integration/</link>
      <pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://docs.huatuo.tech/zh/v2.3.0/development/integration/</guid>
      <description>&lt;p&gt;集成测试用于验证 &lt;code&gt;huatuo-bamai&lt;/code&gt;在使用模拟的 &lt;code&gt;/proc&lt;/code&gt; 和 &lt;code&gt;/sys&lt;/code&gt; 文件系统时，能够正确启动并对外暴露符合预期的&lt;code&gt;Prometheus&lt;/code&gt;指标。&lt;/p&gt;&#xA;&lt;p&gt;测试运行的是真实的可执行文件，并通过校验 &lt;code&gt;/metrics&lt;/code&gt; 接口的输出结果，确保指标采集与暴露逻辑正确，而不依赖宿主机的内核或硬件环境。&lt;/p&gt;&#xA;&lt;h3 id=&#34;脚本执行流程&#34;&gt;脚本执行流程&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e8%84%9a%e6%9c%ac%e6%89%a7%e8%a1%8c%e6%b5%81%e7%a8%8b&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;该集成测试脚本主要包含以下步骤：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;生成临时的&lt;code&gt;bamai.conf&lt;/code&gt;配置文件&lt;/li&gt;&#xA;&lt;li&gt;使用模拟的 &lt;code&gt;procfs&lt;/code&gt; 和 &lt;code&gt;sysfs&lt;/code&gt; 启动 &lt;code&gt;huatuo-bamai&lt;/code&gt; 服务&lt;/li&gt;&#xA;&lt;li&gt;等待 &lt;code&gt;/metrics&lt;/code&gt; 接口可访问&lt;/li&gt;&#xA;&lt;li&gt;从 &lt;code&gt;/metrics&lt;/code&gt; 接口拉取所有指标数据&lt;/li&gt;&#xA;&lt;li&gt;校验所有预期指标是否存在且内容匹配&lt;/li&gt;&#xA;&lt;li&gt;停止服务并清理相关资源&lt;/li&gt;&#xA;&lt;li&gt;若任意一个预期指标缺失或不匹配，测试将直接失败&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;运行方式&#34;&gt;运行方式&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e8%bf%90%e8%a1%8c%e6%96%b9%e5%bc%8f&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;请在项目根目录下执行集成测试：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bash integration/run.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;指定文件名可以只运行一个集成测试，第二个参数指定循环次数，默认为 1：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bash integration/run.sh test_metrics_exclude_filter.sh &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或通过 Makefile 执行：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make integration&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;失败时的行为&#34;&gt;失败时的行为&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%a4%b1%e8%b4%a5%e6%97%b6%e7%9a%84%e8%a1%8c%e4%b8%ba&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;huatuo-bamai&lt;/code&gt; 服务指标和日志将直接输出到标准输出，便于问题定位&lt;/li&gt;&#xA;&lt;li&gt;临时工作目录将被保留，用于后续调试分析&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;成功时的行为&#34;&gt;成功时的行为&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e6%88%90%e5%8a%9f%e6%97%b6%e7%9a%84%e8%a1%8c%e4%b8%ba&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;显示验证成功的&lt;code&gt;metrics&lt;/code&gt; 列表&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;如何新增指标测试&#34;&gt;如何新增指标测试&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%a6%82%e4%bd%95%e6%96%b0%e5%a2%9e%e6%8c%87%e6%a0%87%e6%b5%8b%e8%af%95&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;h4 id=&#34;第一步新增或更新模拟数据&#34;&gt;第一步：新增或更新模拟数据&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e7%ac%ac%e4%b8%80%e6%ad%a5%e6%96%b0%e5%a2%9e%e6%88%96%e6%9b%b4%e6%96%b0%e6%a8%a1%e6%8b%9f%e6%95%b0%e6%8d%ae&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;如果新增的指标依赖 &lt;code&gt;/proc&lt;/code&gt; 或 &lt;code&gt;/sys&lt;/code&gt; 文件内容，请在以下目录中新增或修改模拟数据：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;integration/fixtures/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;目录结构需与真实内核文件系统保持一致。&lt;/p&gt;</description>
    </item>
    <item>
      <title>BPF ABI 指南</title>
      <link>https://docs.huatuo.tech/zh/v2.3.0/development/bpf_abi_codegen/</link>
      <pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://docs.huatuo.tech/zh/v2.3.0/development/bpf_abi_codegen/</guid>
      <description>&lt;p&gt;BPF 侧 C 结构体是 perf event ABI 的唯一来源。Go 类型由 BPF 对象中的 BTF&#xA;自动生成，禁止手工维护同构结构体。&lt;/p&gt;&#xA;&lt;h2 id=&#34;约定&#34;&gt;约定&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e7%ba%a6%e5%ae%9a&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;一个 ABI 域对应一个 C 头文件和一个 Go 生成文件：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;项目&lt;/th&gt;&#xA;          &lt;th&gt;约定&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;域名&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;&amp;lt;domain&amp;gt;&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;C 头文件&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;bpf/include/abi/&amp;lt;domain&amp;gt;_types.h&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;C 结构体前缀&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;&amp;lt;domain&amp;gt;_&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Go 生成文件&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;internal/bpf/abi/&amp;lt;domain&amp;gt;_types_generated.go&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;code&gt;&amp;lt;domain&amp;gt;&lt;/code&gt; 必须以小写字母开头，只能包含小写字母、数字和下划线。避免使用&#xA;前缀重叠的域，例如 &lt;code&gt;net&lt;/code&gt; 和 &lt;code&gt;net_rx&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;实现&#34;&gt;实现&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%ae%9e%e7%8e%b0&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;以下示例创建 &lt;code&gt;sample&lt;/code&gt; 域。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-定义-abi-头文件&#34;&gt;1. 定义 ABI 头文件&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#1-%e5%ae%9a%e4%b9%89-abi-%e5%a4%b4%e6%96%87%e4%bb%b6&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;新建 &lt;code&gt;bpf/include/abi/sample_types.h&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Copyright 2026 The HuaTuo Authors&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;//&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Licensed under the Apache License, Version 2.0 (the &amp;#34;License&amp;#34;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// you may not use this file except in compliance with the License.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// You may obtain a copy of the License at&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;//&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// http://www.apache.org/licenses/LICENSE-2.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;//&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Unless required by applicable law or agreed to in writing, software&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// distributed under the License is distributed on an &amp;#34;AS IS&amp;#34; BASIS,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// See the License for the specific language governing permissions and&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// limitations under the License.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#ifndef __BPF_ABI_SAMPLE_H__&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#define __BPF_ABI_SAMPLE_H__&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;#34;bpf_abi.h&amp;#34;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#define SAMPLE_DATA_LEN 4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sample_detail&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;n&#34;&gt;u32&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;n&#34;&gt;u8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SAMPLE_DATA_LEN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sample_event&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;n&#34;&gt;u64&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timestamp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sample_detail&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;detail&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;n&#34;&gt;u32&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;n&#34;&gt;u8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;n&#34;&gt;u8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pad&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;BPF_ABI_EXPORT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sample_detail&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;BPF_ABI_EXPORT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sample_event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#endif &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/* __BPF_ABI_SAMPLE_H__ */&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;要求：&lt;/p&gt;</description>
    </item>
    <item>
      <title>时间格式约定</title>
      <link>https://docs.huatuo.tech/zh/v2.3.0/development/time-format/</link>
      <pubDate>Wed, 22 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://docs.huatuo.tech/zh/v2.3.0/development/time-format/</guid>
      <description>&lt;h1 id=&#34;时间格式约定&#34;&gt;时间格式约定&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e6%97%b6%e9%97%b4%e6%a0%bc%e5%bc%8f%e7%ba%a6%e5%ae%9a&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;HUATUO 统一以 UTC 和固定九位纳秒精度序列化时间戳：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2006-01-02T15:04:05.000000000Z&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例如，2026 年 7 月 22 日 00:30:00.123456789 的事件会写为：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2026-07-22T00:30:00.123456789Z&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;为什么使用固定-utc-精度&#34;&gt;为什么使用固定 UTC 精度&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e4%b8%ba%e4%bb%80%e4%b9%88%e4%bd%bf%e7%94%a8%e5%9b%ba%e5%ae%9a-utc-%e7%b2%be%e5%ba%a6&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;所有主机都使用 &lt;code&gt;Z&lt;/code&gt; 时区，分布式查询无需处理不同的本地时区。&lt;/li&gt;&#xA;&lt;li&gt;九位小数使字符串宽度固定，因此字典序与时间序一致，便于日志文件和关键字索引存储排序。&lt;/li&gt;&#xA;&lt;li&gt;纳秒精度能够保留 Go &lt;code&gt;time.Time&lt;/code&gt; 与事件追踪流水线提供的时间信息。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;集成建议&#34;&gt;集成建议&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e9%9b%86%e6%88%90%e5%bb%ba%e8%ae%ae&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;向 HUATUO 写入数据时，请使用统一辅助函数：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;timestamp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;timeutil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;FormatUTC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;读取时间戳时使用 &lt;code&gt;timeutil.Parse&lt;/code&gt;。它既支持统一格式，也支持包含 0 到 9 位小数的 RFC 3339 旧数据；返回值始终会规范化为 UTC。&lt;/p&gt;&#xA;&lt;p&gt;只有在两侧均由 &lt;code&gt;FormatUTC&lt;/code&gt; 生成字符串时，才应直接按字符串比较时间。第三方 RFC 3339 值可能使用可变小数精度或非 UTC 偏移。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
