<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Apache SkyWalking – Agent</title>
    <link>/zh_tags/agent/</link>
    <description>Recent content in Agent on Apache SkyWalking</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Mon, 23 Mar 2020 00:00:00 +0000</lastBuildDate>
    
	  <atom:link href="/zh_tags/agent/feed.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Zh: 在线代码级性能剖析，补全分布式追踪的最后一块“短板”</title>
      <link>/zh/2020-03-23-using-profiling-to-fix-the-blind-spot-of-distributed-tracing/</link>
      <pubDate>Mon, 23 Mar 2020 00:00:00 +0000</pubDate>
      <guid>/zh/2020-03-23-using-profiling-to-fix-the-blind-spot-of-distributed-tracing/</guid>
      <description>
        
        
        &lt;ul&gt;
&lt;li&gt;作者：&lt;a href=&#34;https://github.com/wu-sheng&#34;&gt;吴晟&lt;/a&gt;，&lt;a href=&#34;https://github.com/mrproliu&#34;&gt;刘晗&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.infoq.cn/article/CWUOl1JA0EyXw0CxQ4Zm&#34;&gt;原文地址&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在本文中，我们详细介绍了代码级的性能剖析方法，以及我们在 Apache SkyWalking 中的实践。希望能够帮助大家在线定位系统性能短板，缓解系统压力。&lt;/p&gt;
&lt;h2 id=&#34;分布式链路追踪的局限性&#34;&gt;分布式链路追踪的局限性&lt;/h2&gt;
&lt;p&gt;在传统的监控系统中，我们如果想要得知系统中的业务是否正常，会采用进程监控、日志收集分析等方式来对系统进行监控。当机器或者服务出现问题时，则会触发告警及时通知负责人。通过这种方式，我们可以得知具体哪些服务出现了问题。但是这时我们并不能得知具体的错误原因出在了哪里，开发人员或者运维人员需要到日志系统里面查看错误日志，甚至需要到真实的业务服务器上查看执行情况来解决问题。&lt;/p&gt;
&lt;p&gt;如此一来，仅仅是发现问题的阶段，可能就会耗费相当长的时间；另外，发现问题但是并不能追溯到问题产生具体原因的情况，也常有发生。这样反反复复极其耗费时间和精力，为此我们便有了基于分布式追踪的 APM 系统。&lt;/p&gt;
&lt;p&gt;通过将业务系统接入分布式追踪中，我们就像是给程序增加了一个放大镜功能，可以清晰看到真实业务请求的整体链路，包括请求时间、请求路径，甚至是操作数据库的语句都可以看得一清二楚。通过这种方式，我们结合告警便可以快速追踪到真实用户请求的完整链路信息，并且这些数据信息完全是持久化的，可以随时进行查询，复盘错误的原因。&lt;/p&gt;
&lt;p&gt;然而随着我们对服务监控理解的加深，我们发现事情并没有那么简单。在分布式链路追踪中我们有这样的两个流派：代码埋点和字节码增强。无论使用哪种方式，底层逻辑一定都逃不过面向切面这个基础逻辑。因为只有这样才可以做到大面积的使用。这也就决定了它只能做到框架级别和 RPC 粒度的监控。这时我们可能依旧会遇到程序执行缓慢或者响应时间不稳定等情况，但无法具体查询到原因。这时候，大家很自然的会考虑到增加埋点粒度，比如对所有的 Spring Bean 方法、甚至主要的业务层方法都加上埋点。但是这种思路会遇到不小的挑战：&lt;/p&gt;
&lt;p&gt;第一，增加埋点时系统开销大，埋点覆盖不够全面。通过这种方式我们确实可以做到具体业务场景具体分析。但随着业务不断迭代上线，弊端也很明显：大量的埋点无疑会加大系统资源的开销，造成 CPU、内存使用率增加，更有可能拖慢整个链路的执行效率。虽然每个埋点消耗的性能很小，在微秒级别，但是因为数量的增加，甚至因为业务代码重用造成重复埋点或者循环使用，此时的性能开销已经无法忽略。&lt;/p&gt;
&lt;p&gt;第二，动态埋点作为一项埋点技术，和手动埋点的性能消耗上十分类似，只是减少的代码修改量，但是因为通用技术的特别，上一个挑战中提到的循环埋点和重复使用的场景甚至更为严重。比如选择所有方法或者特定包下的所有方法埋点，很可能造成系统性能彻底崩溃。&lt;/p&gt;
&lt;p&gt;第三，即使我们通过合理设计和埋点，解决了上述问题，但是 JDK 函数是广泛使用的，我们很难限制对 JDK API 的使用场景。对 JDK 过多方法、特别是非 RPC 方法的监控会造成系统的巨大延迟风险。而且有一些基础类型和底层工具类，是很难通过字节码进行增强的。当我们的 SDK 使用不当或者出现 bug 时，我们无法具体得知真实的错误原因。&lt;/p&gt;
&lt;h2 id=&#34;代码级性能剖析方法&#34;&gt;代码级性能剖析方法&lt;/h2&gt;
&lt;h3 id=&#34;方法介绍&#34;&gt;方法介绍&lt;/h3&gt;
&lt;p&gt;基于以上问题，在系统性能监控方法上，我们提出了&lt;strong&gt;代码级性能剖析&lt;/strong&gt;这种在线诊断方法。这种方法基于一个高级语言编程模型共性，即使再复杂的系统，再复杂的业务逻辑，都是基于线程去进行执行的，而且多数逻辑是在单个线程状态下执行的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码级性能剖析&lt;/strong&gt;就是利用方法栈快照，并对方法执行情况进行分析和汇总。并结合有限的分布式追踪 span 上下文，对代码执行速度进行估算。&lt;/p&gt;
&lt;p&gt;性能剖析激活时，会对指定线程周期性的进行线程栈快照，并将所有的快照进行汇总分析，如果两个连续的快照含有同样的方法栈，则说明此栈中的方法大概率在这个时间间隔内都处于执行状态。从而，通过这种连续快照的时间间隔累加成为估算的方法执行时间。时间估算方法如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;0081Kckwly1gkl527tsgwj30us0cwwet.jpg&#34; alt=&#34;Profile Time estimation&#34;&gt;&lt;/p&gt;
&lt;p&gt;在上图中，d0-d10 代表 10 次连续的内存栈快照，实际方法执行时间在 d3-d4 区间，结束时间在 d8-d9 之间。性能剖析无法告诉你方法的准确执行时间，但是他会估算出方法执行时间为 d4-d8 的 4 个快照采集间隔时间之和，这已经是非常的精确的时间估算了。&lt;/p&gt;
&lt;p&gt;而这个过程因为不涉及代码埋点，所以自然性能消耗是稳定和可控的，也无需担心是否被埋点，是否是 JDK 方法等问题。同时，由于上层已经在分布式追踪之下，性能剖析方法可以明确地确定分析开始和结束时间，减少不必要的性能开销。&lt;/p&gt;
&lt;p&gt;性能剖析可以很好的对线程的堆栈信息进行监控，主要有以下几点优势：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;精确的问题定位，直接到代码方法和代码行；&lt;/li&gt;
&lt;li&gt;无需反复的增删埋点，大大减少了人力开发成本；&lt;/li&gt;
&lt;li&gt;不用承担过多埋点对目标系统和监控系统的压力和性能风险；&lt;/li&gt;
&lt;li&gt;按需使用，平时对系统无消耗，使用时的消耗稳定可能。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;skywalking-实践实例&#34;&gt;SkyWalking 实践实例&lt;/h3&gt;
&lt;p&gt;我们首先在 Apache SkyWalking APM 中实现此技术方法，下面我们就以一个真实的例子来说明此方法的执行效果。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;final&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;CountDownLatchcountDownLatch&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;new&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;CountDownLatch&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;2&lt;span style=&#34;color:#1f2328&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;threadPool&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;submit&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;new&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;Task1&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;countDownLatch&lt;span style=&#34;color:#1f2328&#34;&gt;));&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;threadPool&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;submit&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;new&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;Task2&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;countDownLatch&lt;span style=&#34;color:#1f2328&#34;&gt;));&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;try&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;   &lt;/span&gt;countDownLatch&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;await&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;500&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;TimeUnit&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;MILLISECONDS&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;catch&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;InterruptedExceptione&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这是我们故意加入的问题代码，我们使用 CountDownLanth 设置了两个任务完成后方法执行结束，Task1 和 Task2 是两个执行时间不稳定的任务，所以主任务也会执行速度不稳定。但对于运维和监控团队来说，很难定位到这个方法片段。&lt;/p&gt;
&lt;p&gt;针对于这种情况，我们看看性能剖析会怎样直接定位此问题。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;0081Kckwly1gkl527i9fsj30l403j0tf.jpg&#34; alt=&#34;Profile Trace&#34;&gt;&lt;/p&gt;
&lt;p&gt;上图所示的就是我们在进行链路追踪时所看到的真实执行情况，其中我们可以看到在 service/processWithThreadPool 执行速度缓慢，这正是我们植入问题代码的方法。此时在这个调用中没有后续链路了，所以并没有更细致的原因，我们也不打算去 review 代码，从而增加新埋点。这时，我们可以对 HelloService 进行性能剖析，并执行只剖析响应速度大于 500 毫秒的请求。&lt;/p&gt;
&lt;p&gt;注意，指定特定响应时间的剖析是保证剖析有效性的重要特性，如果方法在平均响应时间上已经出现问题，往往通过分布式链路可以快速定位，因为此时链路总时间长，新埋点带来的性能影响相对可控。但是方法性能抖动是不容易用新增埋点来解决的，而且往往只发生在生产环境。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;0081Kckwly1gkl528dv3cj30u010vdj1.jpg&#34; alt=&#34;Profile Thread Stack&#34;&gt;&lt;/p&gt;
&lt;p&gt;上图就是我们进行性能剖析后的真实结果图。从左到右分别表示：栈帧名称、该栈帧总计耗时（包含其下面所有自栈帧）、当前栈帧自身耗时和监控次数。我们可以在最后一行看到，线程卡在了 sun.misc.Unsafe.park 中了。如果你熟悉 Java 就可以知道此时进行了锁等待，我们继续按照树的结构向上推，便可以看到线程真正是卡在了 CountDownLatch.await 方法中。&lt;/p&gt;
&lt;h3 id=&#34;方法局限性&#34;&gt;方法局限性&lt;/h3&gt;
&lt;p&gt;当然任何的方法都不是万能的，性能剖析也有一些局限性。&lt;/p&gt;
&lt;p&gt;第一， 对于高频反复执行的方法，如循环调用，可能会误报为缓慢方法。但这并不是大问题，因为如果反复执行的耗时较长，必然是系统需要关注的性能瓶颈。&lt;/p&gt;
&lt;p&gt;第二， 由于性能栈快照有一定的性能消耗，所以采集周期不宜过密，如 SkyWalking 实践中，不支持小于 10ms 的采集间隔。所以如果问题方法执行时间过小（比如在 10 毫秒内波动），此方法并不适用。我们也再此强调，&lt;strong&gt;方法论和工具的强大，始终不能代替程序员&lt;/strong&gt;。&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Zh: SkyWalking的远程调试</title>
      <link>/zh/2019-01-24-skywalking-remote-debug/</link>
      <pubDate>Thu, 24 Jan 2019 00:00:00 +0000</pubDate>
      <guid>/zh/2019-01-24-skywalking-remote-debug/</guid>
      <description>
        
        
        &lt;p&gt;ps:本文仅写给菜鸟，以及不知道如何远程调试的程序员，并且仅仅适用skywalking的远程调试&lt;/p&gt;
&lt;h2 id=&#34;概述&#34;&gt;概述&lt;/h2&gt;
&lt;p&gt;远程调试的目的是为了解决代码或者说程序包部署在服务器上运行，只能通过log来查看问题，以及不能跟在本地IDE运行debug那样查找问题，观看程序运行流程&amp;hellip;
想想当你的程序运行在服务器上，你在本地的IDE随时debug，是不是很爽的感觉。&lt;/p&gt;
&lt;p&gt;好了不废话，切入正题。&lt;/p&gt;
&lt;h2 id=&#34;环境篇&#34;&gt;环境篇&lt;/h2&gt;
&lt;p&gt;IDE：推荐 &lt;a href=&#34;https://www.jetbrains.com/idea/&#34;&gt;IntelliJ IDEA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;开发语言: 本文仅限于java，其他语言请自行询问google爸爸或者baidu娘娘&lt;/p&gt;
&lt;p&gt;源代码：自行从github下载，并且确保你运行的skywalking包也源代码的一致，（也就是说你自己从源代码编译打包运行，虽然不一样也可以调试，但是你想想你在本地开发，更改完代码，没有重新运行，debug出现的诡异情况）&lt;/p&gt;
&lt;h2 id=&#34;场景篇&#34;&gt;场景篇&lt;/h2&gt;
&lt;p&gt;假定有如下三台机器&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;IP&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;用途&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;备注&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;10.193.78.1&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;oap-server&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;skywalking 的oap服务（或者说collector所在的服务器）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;10.193.78.2&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;agent&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;skywalking agent运行所在的服务器&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;10.193.78.0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;IDE&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;你自己装IDE也就是IntelliJ IDEA的机器&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;以上环境，场景请自行安装好，并确认正常运行。本文不在赘述&lt;/p&gt;
&lt;p&gt;废话终于说完了&lt;/p&gt;
&lt;h2 id=&#34;操作篇&#34;&gt;操作篇&lt;/h2&gt;
&lt;p&gt;首要条件，下载源码后，先用maven 打包编译。然后使用Idea打开源码的父目录，整体结构大致如下图
&lt;img src=&#34;0081Kckwly1gkl4h16jepj30u00ui0wk.jpg&#34; alt=&#34;IMAGE&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;1-agent调试&#34;&gt;1 :agent调试&lt;/h3&gt;
&lt;h4 id=&#34;1idea-配置部分&#34;&gt;1)Idea 配置部分&lt;/h4&gt;
&lt;p&gt;&lt;img src=&#34;0081Kckwly1gkl4gsba9dj32m803k40w.jpg&#34; alt=&#34;IMAGE&#34;&gt;
点击Edit Configurations
在弹出窗口中依次找到（红色线框的部分）并点击
&lt;img src=&#34;0081Kckwly1gkl4gxw1u0j319s0c8mzm.jpg&#34; alt=&#34;IMAGE&#34;&gt;
&lt;img src=&#34;0081Kckwly1gkl4gsox3jj30ek10gadm.jpg&#34; alt=&#34;IMAGE&#34;&gt;
打开的界面如下
&lt;img src=&#34;0081Kckwly1gkl4gt601gj31cp0u0gsh.jpg&#34; alt=&#34;IMAGE&#34;&gt;&lt;/p&gt;
&lt;p&gt;修改Name值，自己随意，好记即可
然后Host输入10.193.78.2 Port默认或者其他的，重要的是这个端口在10.193.78.2上没有被占用&lt;/p&gt;
&lt;p&gt;然后找到Use module classpath 选择 apm-agent
最终的结果如下：
&lt;img src=&#34;0081Kckwly1gkl4h0pw50j30yu0u0jxk.jpg&#34; alt=&#34;IMAGE&#34;&gt;&lt;/p&gt;
&lt;p&gt;注意选择目标agent运行的jdk版本，很重要&lt;/p&gt;
&lt;p&gt;然后点击Apply，并找到如下内容，并且复制待用
&lt;img src=&#34;0081Kckwly1gkl4gytahmj30y50u0wka.jpg&#34; alt=&#34;IMAGE&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;2agent配置部分&#34;&gt;2）agent配置部分&lt;/h4&gt;
&lt;p&gt;找到agent配置的脚本，并打开，找到配置agent的地方，
&lt;img src=&#34;0081Kckwly1gkl4h05q0uj30ji016q3a.jpg&#34; alt=&#34;IMAGE&#34;&gt;
就这个地方，在这个后边加上刚才复制的内容
最终的结果如下
&lt;img src=&#34;0081Kckwly1gkl4gz8kowj31e000uaav.jpg&#34; alt=&#34;IMAGE&#34;&gt;
提供一个我配置的weblogic的配置（仅供参考）
&lt;img src=&#34;0081Kckwly1gkl4gyfw8lj31r6020abk.jpg&#34; alt=&#34;IMAGE&#34;&gt;
然后重启应用（agent）&lt;/p&gt;
&lt;h4 id=&#34;3调试&#34;&gt;3）调试&lt;/h4&gt;
&lt;p&gt;回到Idea中找到这个地方，并点击debug按钮，你没看错，就是红色圈住的地方
&lt;img src=&#34;0081Kckwly1gkl4gun36lj30ew01mmxa.jpg&#34; alt=&#34;IMAGE&#34;&gt;
然后控制台如果出现以下字样：
&lt;img src=&#34;0081Kckwly1gkl4gzq0t3j30y40123z2.jpg&#34; alt=&#34;IMAGE&#34;&gt;
那么恭喜你，可以愉快的加断点调试了。
ps:需要注意的是agent的、
service instance的注册可能不能那么愉快的调试。因为这个注册比较快，而且是在agent启动的时候就发生的，
而远程调试也需要agent打开后才可以调试，所以，如果你手快当我没说这句话。&lt;/p&gt;
&lt;h3 id=&#34;2-oap-server的调试也就是collector的调试&#34;&gt;2 :oap-server的调试（也就是collector的调试）&lt;/h3&gt;
&lt;p&gt;具体过程不在赘述，和上一步的agent调试大同小异，不同的是
Use module classpath需要选择oap-server&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;0081Kckwly1gkl4gxeoh7j319g03amxr.jpg&#34; alt=&#34;IMAGE&#34;&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Zh: Apache SkyWalking 为.NET Core带来开箱即用的分布式追踪和应用性能监控</title>
      <link>/zh/2018-05-24-skywalking-net/</link>
      <pubDate>Thu, 24 May 2018 00:00:00 +0000</pubDate>
      <guid>/zh/2018-05-24-skywalking-net/</guid>
      <description>
        
        
        &lt;p&gt;在大型网站系统设计中，随着分布式架构，特别是微服务架构的流行，我们将系统解耦成更小的单元，通过不断的添加新的、小的模块或者重用已经有的模块来构建复杂的系统。随着模块的不断增多，一次请求可能会涉及到十几个甚至几十个服务的协同处理，那么如何准确快速的定位到线上故障和性能瓶颈，便成为我们不得不面对的棘手问题。&lt;/p&gt;
&lt;p&gt;为解决分布式架构中复杂的服务定位和性能问题，Google 在论文&lt;a href=&#34;http://research.google.com/pubs/pub36356.html&#34;&gt;《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》&lt;/a&gt;中提出了分布式跟踪系统的设计和构建思路。在这样的背景下，&lt;a href=&#34;https://github.com/apache/incubator-skywalking&#34;&gt;Apache SkyWalking&lt;/a&gt; 创建于 2015 年，参考 Dapper 论文实现分布式追踪功能，并逐渐进化为一个完整功能的 &lt;a href=&#34;https://en.wikipedia.org/wiki/Application_performance_management&#34;&gt;Application Performance Management&lt;/a&gt; 系统，用于追踪、监控和诊断大型分布式系统，尤其是容器和云原生下的微服务系统。&lt;/p&gt;
&lt;p&gt;今年初我在尝试使用.NET Core 构建分布式追踪系统 &lt;a href=&#34;https://github.com/liuhaoyang/butterfly&#34;&gt;Butterfly&lt;/a&gt; 时接触到 SkyWalking 团队，开始和 SkyWalking 团队合作探索 SkyWalking 对.NET Core 的支持，并于 4 月发布 SkyWalking .NET Core 探针的 &lt;a href=&#34;https://www.oschina.net/news/95324/apache-skywalking-apm-support-dot-net-core&#34;&gt;第一个版本&lt;/a&gt;，同时我也有幸加入 SkyWalking 团队共同进行 SkyWalking 在多语言生态的推动。在.NET Core 探针 v0.1 版本发布之后，得到了一些同学的&lt;a href=&#34;https://www.jianshu.com/p/3ddd986c7581&#34;&gt;尝鲜使用&lt;/a&gt;，也得到诸多改进的建议。经过几周的迭代，SkyWalking .NET Core 探针于今天发布 v0.2 release，在 v0.1 的基础上增加了稳定性和 HttpClient 及数据库驱动的追踪支持。&lt;/p&gt;
&lt;p&gt;在使用 SkyWalking 对.NET Core 应用追踪之前，我们需要先部署 SkyWalking Collector 收集分析 Trace 和 Elasticsearch 作为 Trace 数据存储。SkyWalking 支持 5.x 的 ES，所以我们需要下载安装对应版本的 ES，并配置 ES 的 &lt;code&gt;cluster.name&lt;/code&gt; 为 &lt;code&gt;CollectorDBCluster&lt;/code&gt;。然后部署 SkyWalking 5.0 beta 或更高版本 (下载地址:http://skywalking.apache.org/downloads/)。更详细的 Collector 部署文档，请参考 &lt;a href=&#34;https://github.com/apache/incubator-skywalking/blob/master/docs/en/Deploy-backend-in-standalone-mode.md&#34;&gt;Deploy-backend-in-standalone-mode&lt;/a&gt; 和 &lt;a href=&#34;https://github.com/apache/incubator-skywalking/blob/master/docs/en/Deploy-backend-in-cluster-mode.md&#34;&gt;Deploy-backend-in-cluster-mode&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;最后我们使用示例项目来演示在.NET Core 应用中使用 SkyWalking 进行追踪和监控，克隆 SkyWalking-NetCore 项目到本地：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/OpenSkywalking/skywalking-netcore.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;进入 skywalking-netcore 目录：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;cd&lt;/span&gt; skywalking-netcore
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;还原 nuget package：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dotnet restore
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动示例项目：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dotnet run -p sample/SkyWalking.Sample.Backend
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dotnet run -p sample/SkyWalking.Sample.Frontend
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;访问示例应用：&lt;/p&gt;
&lt;p&gt;打开 SkyWalking WebUI 即可看到我们的应用监控面板 &lt;a href=&#34;http://localhost:8080/&#34;&gt;http://localhost:8080&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dashboard 视图&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;0081Kckwly1gkkethvv8nj31kt0u0gpc.jpg&#34; alt=&#34;dashboard&#34;&gt;&lt;/p&gt;
&lt;p&gt;TopologyMap 视图&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;0081Kckwly1gkketialrej31ku0u0761.jpg&#34; alt=&#34;topology_map&#34;&gt;&lt;/p&gt;
&lt;p&gt;Application 视图&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;0081Kckwly1gkketj8amrj31ky0u0dii.jpg&#34; alt=&#34;application&#34;&gt;&lt;/p&gt;
&lt;p&gt;Trace 视图&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;0081Kckwly1gkketir5ahj31kr0u0mzx.jpg&#34; alt=&#34;trace.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;TraceDetails 视图&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;0081Kckwly1gkketh1e85j31kl0u0wi4.jpg&#34; alt=&#34;trace_details.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;github&#34;&gt;GitHub&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;SkyWalking Github Repo：&lt;a href=&#34;https://github.com/apache/incubator-skywalking/&#34;&gt;https://github.com/apache/incubator-skywalking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SkyWalking-NetCore Github Repo：https://github.com/OpenSkywalking/skywalking-netcore&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
  </channel>
</rss>
