更新说明文档
大石头 authored at 2022-04-16 15:30:05
10.83 KiB
YuQue
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>链路追踪 Tracer - 新生命团队</title>
  <link rel="stylesheet" href="css/site.css">
</head>
<body>

  <!-- ===== 顶部导航 ===== -->
  <header class="site-header">
    <div class="container">
      <button class="nav-toggle" type="button" aria-label="菜单" aria-expanded="false">
        <span></span><span></span><span></span>
      </button>

      <a class="brand" href="home.html">
        <span class="logo">N</span>
        <span>新生命团队</span>
      </a>

      <nav class="main-nav">
        <a href="home.html">首页</a>
        <div class="nav-dropdown">
          <a class="active" href="list.html">文档 <span class="caret"></span></a>
          <div class="dd-menu">
            <a class="active" href="list.html">核心组件(NewLife全家桶)<span class="dd-desc">/core</span></a>
            <a href="list.html">大数据中间件XCode<span class="dd-desc">/xcode</span></a>
            <a href="list.html">魔方Cube(快速开发平台)<span class="dd-desc">/cube</span></a>
            <a href="list.html">精心匠造(平台级产品)<span class="dd-desc">/blood</span></a>
            <a href="list.html">物联网&nbsp;&amp;&nbsp;嵌入式<span class="dd-desc">/iot</span></a>
            <a href="list.html">计算机技术<span class="dd-desc">/tech</span></a>
            <a href="list.html">事件活动<span class="dd-desc">/events</span></a>
          </div>
        </div>
        <a href="https://github.com/NewLifeX" target="_blank">开源项目</a>
        <a href="https://ai.newlifex.com/" target="_blank">AI问答</a>
        <a href="info.html">关于我们</a>
      </nav>

      <div class="nav-actions">
        <form class="search-box" action="search.html" method="get">
          <span class="icon">
            <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>
          </span>
          <input type="text" name="key" placeholder="搜索文章…" aria-label="搜索">
        </form>
        <a class="btn btn-outline btn-sm" href="/Admin" target="_blank">管理后台</a>
      </div>
    </div>
  </header>

  <!-- ===== 面包屑 ===== -->
  <div class="container">
    <nav class="crumb">
      <a href="home.html">首页</a>
      <span class="sep">/</span>
      <a href="list.html">核心组件(NewLife全家桶)</a>
      <span class="sep">/</span>
      <span class="cur">链路追踪 Tracer</span>
    </nav>
  </div>

  <!-- ===== 详情双栏 ===== -->
  <div class="container">
    <div class="doc-layout">

      <!-- 正文区 -->
      <div class="doc-main">
        <div class="article-header">
          <h1>链路追踪 Tracer:可观测性埋点规范与实践</h1>
          <div class="article-meta">
            <span>作者 <span class="meta-strong">大石头</span></span>
            <span class="sep">·</span>
            <span>发布 <span class="meta-strong">2024-12-16 09:16:28</span></span>
            <span class="sep">·</span>
            <span>浏览 <span class="meta-strong">5,102</span></span>
          </div>
        </div>

        <article class="article-content">
          <p>可观测是衡量现代应用质量的核心指标之一。NewLife 设计了 <code>ITracer</code>/<code>ISpan</code> 这一套链路追踪规范,开发者可以根据该规范编写各种关键性代码埋点,在应用项目注入星尘监控后,实现埋点数据的采集与上报分析。NewLife 全系列项目(大于 30 个)均使用了 <code>ITracer</code> 埋点。</p>

          <h2 id="s1">为什么需要链路追踪</h2>
          <p>在单体时代,排查问题只需要看日志;而进入微服务与分布式时代后,一次用户请求可能跨越多个服务、多个进程,传统日志无法串联整个调用链。链路追踪通过为每次请求生成唯一的 <strong>TraceId</strong>,并在每个节点记录耗时与状态,从而还原出完整的调用拓扑。</p>
          <blockquote>
            一句话总结:链路追踪把"散落各处的日志"串成"一条完整的调用链",让慢请求、错误请求无处遁形。
          </blockquote>

          <h2 id="s2">核心概念</h2>
          <p>NewLife 的追踪体系包含以下核心概念:</p>
          <table>
            <thead>
              <tr><th>概念</th><th>说明</th><th>对应接口</th></tr>
            </thead>
            <tbody>
              <tr><td>追踪器</td><td>全局追踪入口,负责创建 Span</td><td><code>ITracer</code></td></tr>
              <tr><td>链路片段</td><td>一次方法/请求的耗时与状态记录</td><td><code>ISpan</code></td></tr>
              <tr><td>追踪 ID</td><td>整条调用链的唯一标识</td><td><code>TraceId</code></td></tr>
              <tr><td>片段 ID</td><td>单个 Span 的唯一标识</td><td><code>SpanId</code></td></tr>
              <tr><td>父片段</td><td>调用者的 Span,形成树形结构</td><td><code>ParentId</code></td></tr>
            </tbody>
          </table>

          <h2 id="s3">快速开始</h2>
          <p>在任意方法中埋点,只需要两行代码:</p>
          <pre><code>// 全局或依赖注入的追踪器
private readonly ITracer _tracer;

public String GetName(Int32 id)
{
    using var span = _tracer?.NewSpan("GetName", id);
    // ...业务逻辑
    return name;
}</code></pre>
          <p>使用 <code>using</code> 语句块,Span 会在方法结束时自动记录耗时与结果,异常也会被自动捕获并标记为错误。</p>

          <h3 id="s3-1">设置错误与标签</h3>
          <p>当需要标记错误或附加自定义信息时,可以使用以下方式:</p>
          <pre><code>using var span = _tracer?.NewSpan("GetName", id);
try
{
    // ...业务逻辑
}
catch (Exception ex)
{
    span?.SetError(ex, "查询用户失败");
    throw;
}</code></pre>

          <h3 id="s3-2">串联调用链</h3>
          <p>跨进程调用时,将当前 <code>TraceId</code> 随请求透传,下游接收后创建子 Span,即可把整条链路串联起来:</p>
          <pre><code>// 上游:写入请求头
request.Headers["X-Trace-Id"] = DefaultSpan.Current?.TraceId;

// 下游:读取并创建子片段
var traceId = request.Headers["X-Trace-Id"];
using var span = _tracer?.NewSpan("HandleRequest", traceId);</code></pre>

          <h2 id="s4">最佳实践</h2>
          <ul>
            <li><strong>埋点粒度</strong>:对热点路径与外部调用(数据库、HTTP、RPC、MQ)埋点,避免对纯内存计算过度埋点。</li>
            <li><strong>命名规范</strong>:Span 名称使用"动词 + 名词",如 <code>Query-Order</code>、<code>Send-Sms</code>。</li>
            <li><strong>数据最小化</strong>:<code>AppendTag</code> 只附加关键参数,避免写入敏感信息与超长内容。</li>
            <li><strong>零侵入</strong>:优先使用框架内置埋点(如 <code>ApiHttpClient</code>、<code>Db</code>),业务代码只需补充自定义关键路径。</li>
          </ul>
          <blockquote>
            注意:埋点本身也会有性能开销。NewLife 的 <code>ITracer</code> 采用异步采样与批量上报,在关闭采样或未接入上报端时,埋点开销可忽略不计。
          </blockquote>

          <h2 id="s5">与星尘的配合</h2>
          <p>应用项目通过 <code>services.AddStardust()</code> 注入星尘后,星尘会自动挂载 <code>ITracer</code> 实现,将采集到的调用链数据实时上报到星尘 APM 平台,在控制台即可查看调用拓扑、耗时分布与错误详情。</p>

          <h2 id="s6">总结</h2>
          <p><code>ITracer</code>/<code>ISpan</code> 用最小的侵入成本,为应用提供了标准化的可观测能力。无论项目规模大小,建议从一开始就建立埋点习惯,为后续的线上问题排查与性能优化打下坚实基础。</p>
        </article>

        <!-- 上一篇/下一篇 -->
        <div class="article-nav">
          <a class="nav-item" href="info.html">
            <div class="nav-label">← 上一篇</div>
            <div class="nav-title">缓存架构 ICacheProvider</div>
          </a>
          <a class="nav-item next" href="info.html">
            <div class="nav-label">下一篇 →</div>
            <div class="nav-title">插件框架 IPlugin:业务插件化开发指南</div>
          </a>
        </div>
      </div>

      <!-- 目录树(滚动高亮) -->
      <aside class="toc">
        <div class="toc-title">📑 本页目录</div>
        <ul>
          <li><a class="active" href="#s1">为什么需要链路追踪</a></li>
          <li><a href="#s2">核心概念</a></li>
          <li>
            <a href="#s3">快速开始</a>
            <ul>
              <li><a class="toc-level-3" href="#s3-1">设置错误与标签</a></li>
              <li><a class="toc-level-3" href="#s3-2">串联调用链</a></li>
            </ul>
          </li>
          <li><a href="#s4">最佳实践</a></li>
          <li><a href="#s5">与星尘的配合</a></li>
          <li><a href="#s6">总结</a></li>
        </ul>
      </aside>

    </div>
  </div>

  <!-- ===== 页尾 ===== -->
  <footer class="site-footer">
    <div class="container">
      <div class="f-grid">
        <div class="f-brand">
          <div class="f-logo"><span class="logo">N</span>新生命团队</div>
          <p>学无先后达者为师!新生命团队成立于 2002 年,致力于软硬件应用方案咨询、系统架构规划与开发服务。</p>
        </div>
        <div class="f-col">
          <h4>友情链接</h4>
          <a href="home.html">新生命团队</a>
          <a href="https://github.com/NewLifeX" target="_blank">开源项目</a>
          <a href="https://ai.newlifex.com/" target="_blank">AI问答</a>
        </div>
        <div class="f-col">
          <h4>文档</h4>
          <a href="list.html">核心组件</a>
          <a href="list.html">大数据中间件 XCode</a>
          <a href="list.html">魔方 Cube</a>
          <a href="https://sso.newlifex.com/" target="_blank">用户中心</a>
        </div>
        <div class="f-col">
          <h4>关于</h4>
          <a href="info.html">关于我们</a>
          <a href="product.html">核心产品</a>
          <a href="https://github.com/NewLifeX/NewLife.Yuque" target="_blank">本站源码</a>
          <a href="/Admin" target="_blank">管理后台</a>
        </div>
      </div>
      <div class="f-bottom">
        <span>©2002-2026 NewLife · <a href="https://get.dot.net/" target="_blank">.NET 10.0.0</a></span>
        <span><a href="https://beian.miit.gov.cn/" target="_blank">沪ICP备2025143774号-1</a></span>
      </div>
    </div>
  </footer>

  <script src="js/site.js"></script>
</body>
</html>