{"id":16178846,"url":"https://github.com/wangji92/skywalking-dubbo-example","last_synced_at":"2025-04-07T11:41:08.030Z","repository":{"id":107874995,"uuid":"451848055","full_name":"WangJi92/skywalking-dubbo-example","owner":"WangJi92","description":"skywalking 采样率的探究 安装 \u0026 dubbo demo 记录","archived":false,"fork":false,"pushed_at":"2022-01-26T15:38:40.000Z","size":3280,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-02-13T14:21:44.396Z","etag":null,"topics":["dubbo","skywalking"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/WangJi92.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-01-25T11:22:22.000Z","updated_at":"2022-03-31T07:34:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"49a0186f-4807-49c0-9dc8-986fe19115eb","html_url":"https://github.com/WangJi92/skywalking-dubbo-example","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WangJi92%2Fskywalking-dubbo-example","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WangJi92%2Fskywalking-dubbo-example/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WangJi92%2Fskywalking-dubbo-example/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WangJi92%2Fskywalking-dubbo-example/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WangJi92","download_url":"https://codeload.github.com/WangJi92/skywalking-dubbo-example/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247648813,"owners_count":20972941,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dubbo","skywalking"],"created_at":"2024-10-10T05:24:40.947Z","updated_at":"2025-04-07T11:41:08.009Z","avatar_url":"https://github.com/WangJi92.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"## skywalking 安装\n[skywalking 安装地址](https://skywalking.apache.org/downloads/)\n\n### 1、下载apm 安装包\n* [apache-skywalking-apm-8.9.1.tar.gz](https://www.apache.org/dyn/closer.cgi/skywalking/8.9.1/apache-skywalking-apm-8.9.1.tar.gz)\n\n### 2、启动服务端 oapService \u0026  webappService\n\n```bash \ncd apache-skywalking-apm-bin/bin\n\n# startup.sh  会启动 oapService.sh \u0026 webappService.sh\nbash startup.sh \n```\n修改配置文件地址: apache-skywalking-apm-bin/config/application.yml\n#### 修改webappService 端口\ndefault webappService 界面服务 端口 8080 http://127.0.0.1:8080/trace 需要修改 /apache-skywalking-apm-bin/webapp/webapp.yml 可以进入就行修改\n\n#### 修改oapService 存储\noapService 默认存储使用 SW_STORAGE:h2 ,如果使用mysql or other ，修改一下具体的配置项即可，mysql 会自动创建表结构哦，需要把jdbc的 apache-skywalking-apm-bin/oap-libs/mysql-connector-java-8.0.28.jar 放在这个目录哦。\n\n### 3、客户端agent 设置\n\n* 下载Java agent [apache-skywalking-java-agent-8.8.0.tgz](https://www.apache.org/dyn/closer.cgi/skywalking/java-agent/8.8.0/apache-skywalking-java-agent-8.8.0.tgz)\n\n* 启动vm options 增加配置\n  \n  skywalking.agent.service_name=provider 为应用的名称\n\n```bash\n-javaagent:/Users/wangji/dev/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=provider\n```\n \n![idea 启动配置vm options](pic/vm-config.png)\n\n* 启动 consumer \u0026 provider\n\n\n## 访问\n\n### 访问consumer 接口\n\n```bash\nab -n 100 -c 10  http://127.0.0.1:8081/sayHello?name=123\n```\n\n### 查看trace(webappService) \u0026 本地日志\n\n#### 进入sky 管理界面\n\n[http://127.0.0.1:8080/trace](http://127.0.0.1:8080/trace)\n\n#### 查看客户端日志\n[How To Print trace ID in your logs In Sky](https://skywalking.apache.org/docs/skywalking-java/v8.8.0/en/setup/service-agent/java-agent/application-toolkit-logback-1.x/)\n\n这里处理 Logback tid，这种思路不错,更新layout,使用默认的，然后增加 ClassicConverter，非常简单方便,LogbackPatternConverter 里面获取是通过sky agent 增强返回的非常骚气，分离了实现和客户端代码,方便更新修复bug，减少依赖\n\n```java\npublic class TraceIdPatternLogbackLayout extends PatternLayout {\n    public TraceIdPatternLogbackLayout() {\n    }\n\n    static {\n        defaultConverterMap.put(\"tid\", LogbackPatternConverter.class.getName());\n        defaultConverterMap.put(\"sw_ctx\", LogbackSkyWalkingContextPatternConverter.class.getName());\n    }\n}\n```\n\n```xml\n \u003cappender name=\"CONSOLE\" class=\"ch.qos.logback.core.ConsoleAppender\"\u003e\n        \u003cencoder class=\"ch.qos.logback.core.encoder.LayoutWrappingEncoder\"\u003e\n            \u003clayout class=\"org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout\"\u003e\n                \u003cPattern\u003e%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n\u003c/Pattern\u003e\n            \u003c/layout\u003e\n            \u003ccharset\u003eutf8\u003c/charset\u003e\n        \u003c/encoder\u003e\n    \u003c/appender\u003e\n```\n\n```xml\n2022-01-25 19:17:01.735 [TID:de98a5b85f5e476ba249ed66edc06bd0.73.16431094211580001] [DubboServerHandler-30.11.176.38:12345-thread-2] INFO  c.e.test.provider.DemoServiceImpl -[19:17:01] Hello 13446555, request from consumer: /30.11.176.38:62365\n2022-01-25 19:17:07.009 [TID:de98a5b85f5e476ba249ed66edc06bd0.75.16431094270040001] [DubboServerHandler-30.11.176.38:12345-thread-3] INFO  c.e.test.provider.DemoServiceImpl -[19:17:07] Hello 123, request from consumer: /30.11.176.38:62365\n```\n\n# 关于skywalking 采样率的探究\n\n## Trace Sampling at server side （服务端采样率）\n\n[https://skywalking.apache.org/docs/main/latest/en/setup/backend/trace-sampling/](https://skywalking.apache.org/docs/main/latest/en/setup/backend/trace-sampling/)\n\n默认为 100% ,这里修改为10%\n\u003e 注意这里不同的版本配置地方不一样，有的在application.yml,新版本都在8.8以上 trace-sampling-policy-settings.yml\n\n配置文件地址： apache-skywalking-apm-bin/config/trace-sampling-policy-settings.yml \n\n1000 = 10% ,也可以设置为0 服务端不进行采样，不存储\n\n![服务端采样配置](pic/Sampling-Server.png)\n\n```xml\ndefault:\n  # Default sampling rate that replaces the 'agent-analyzer.default.sampleRate'\n  # The sample rate precision is 1/10000. 10000 means 100% sample in default.\n  rate: 1000\n  # Default trace latency time that replaces the 'agent-analyzer.default.slowTraceSegmentThreshold'\n  # Setting this threshold about the latency would make the slow trace segments sampled if they cost more time, even the sampling mechanism activated. The default value is `-1`, which means would not sample slow traces. Unit, millisecond.\n  duration: -1\n#services:\n#  - name: serverName\n#    rate: 1000 # Sampling rate of this specific service\n#    duration: 10000 # Trace latency threshold for trace sampling for this specific service\n```\n\n### 并发访问1000次\n\n```bash\nab -n 1000 -c 200  http://127.0.0.1:8081/sayHello\\?name\\=13446555\n```\n#### idea 所有日志\n![all client log ](pic/client-all.png)\n\n#### sky 管理界面搜索不到部分\n* 搜索不到  15c4638aa8254352b86838f41263c645.205.16430933407250007\n\n![not search](pic/not-search.png)\n  \n* 搜索到了 15c4638aa8254352b86838f41263c645.202.16430933407260007\n\n![can search](pic/can-search.png)\n\n证明了一个问题，服务端的采样有效了...  分页只有 14 页 1000的访问数据,这样也侧面证明了客户端tid 正常打印，服务端也没有存储所有的日志，\n极大的减少了占用大量存储空间，如果是需要日志里面打印traceId，sky 界面不需要搜索这样可以将rate 设置为0。\n\n![all-search](pic/all-search.png)\n\n## 客户端采样\n3 秒采样1个，默认配置为-1 就是不进行客户端采样过滤，全部都发送到服务端\n\nThe number of sampled traces per 3 seconds, Negative or zero means off, by default  \nagent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:1}\n\n[https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/configurations/](https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/configurations/)\n\nTID:Ignored_Trace 意味着被拒绝采样了..，日志里面打印的traceId 都被吃掉了，这个不是我们想要的效果，客户端的日志都需要出现traceId\n\n![reject-sample](pic/reject-client-sample.png)\n\n## 需求\n\n* 需求是不需要将所有的采样都进行存储,分布式跟踪系统的一个优点是可以从跟踪中获得详细的信息。但是，缺点是这些跟踪会占用大量存储空间。但是客户端的log日志里面可以搜索到 日志的traceId 进行串联起来，这样客户端的就不进行过滤，服务端过滤即可。有点类似tlog的功能 [https://tlog.yomahub.com/](https://tlog.yomahub.com/)\n\n* 这里客户端的日志需要配置logback layout [application-toolkit-logback-1.x/](https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/application-toolkit-logback-1.x/) 即可享受traceId 的秘密\n\n#  skywalking 跨线程处理探究\n\n* 官方文档链接 [trace cross thread link](https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/application-toolkit-trace-cross-thread/)\n\n### 不进行扩线程处理效果\n```java\n /**\n   * 没有包装 CallableWrapper.of 不生效，跨线程失败\n   * \n   * @param name\n   * @return\n   * @throws ExecutionException\n   * @throws InterruptedException\n   */\n  @ResponseBody\n  @GetMapping(\"/sayHelloNotAcrossThread\")\n  public String sayHelloNotAcrossThread(@RequestParam(required = false, defaultValue = \"hello name\") String name) throws ExecutionException,\n                                                                                                                  InterruptedException {\n      log.info(\"get url{}\", httpServletRequest.getRequestURI());\n\n      final Future\u003cString\u003e submit = executorService.submit(new Callable\u003cString\u003e() {\n\n          @Override\n          public String call() throws Exception {\n              return demoService.sayHello(name);\n          }\n      });\n      return submit.get();\n  }\n```\n效果图如下: 调用追踪不连续了，dubbo 独立追踪了，为两个trace\n\n![not-across-thread](pic/not-across-thread.png)\n\n### TraceCrossThread 处理\n\n```java\n@ResponseBody\n@GetMapping(\"/sayHelloAcrossThread\")\npublic String sayHelloAcrossThread(@RequestParam(required = false, defaultValue = \"hello name\") String name) throws ExecutionException,\n                                                                                                             InterruptedException {\n    log.info(\"get url{}\", httpServletRequest.getRequestURI());\n\n    final Future\u003cString\u003e submit = executorService.submit(CallableWrapper.of(new Callable\u003cString\u003e() {\n        // CallableWrapper 本质是重新构造一个CallableWrapper对象，CallableWrapper类上有@TraceCrossThread 注解\n        @Override\n        public String call() throws Exception {\n            return demoService.sayHello(name);\n        }\n    }));\n    return submit.get();\n}\n\n```\n效果图如下，调用连续了\n\n![across-thread](pic/across-thread.png)\n\n\n### @TraceCrossThread 注解\n\n```java\n@TraceCrossThread\npublic class CallableWrapper\u003cV\u003e implements Callable\u003cV\u003e {\n  final Callable\u003cV\u003e callable;\n\n  public static \u003cV\u003e CallableWrapper\u003cV\u003e of(Callable\u003cV\u003e r) {\n    return new CallableWrapper(r);\n  }\n\n  public CallableWrapper(Callable\u003cV\u003e callable) {\n    this.callable = callable;\n  }\n\n  public V call() throws Exception {\n    return this.callable.call();\n  }\n}\n```\n\n* @TraceCrossThread 处理非常的骚气，被标注的class 在构造函数中会进行 trace 信息的复制,注意这里一定是构造函数\n本质是处理 构造函数包装的时候会重新构造一个 CallableWrapper, 官方的 [Bootstrap class plugins agent](https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/bootstrap-plugins/) Plugin of JDK Callable and Runnable. Agent is compatible with JDK 1.8+ 会处理 标注了 @TraceCrossThread 的新的构造进行追踪哦。\n\n* CallableOrRunnableActivation：presents that skywalking intercepts all Class with annotation \"org.skywalking.apm.toolkit.trace.TraceCrossThread\" and method named \"call\" or \"run\". 源码: org.apache.skywalking.apm.toolkit.activation.trace.CallableOrRunnableActivation  org.apache.skywalking.apm.plugin.jdk.threading.define.CallableInstrumentation。 本质还是字节码增强，针对指定的构造函数、方法、且类注解去处理。 [skywalking 异步线程链路源码讲解，这篇文章不错](https://blog.csdn.net/a17816876003/article/details/121444516)\n  更多参考插件开发文档[https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/java-plugin-development-guide/#abstract](https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/java-plugin-development-guide/#abstract)\n\n* [跨线程问题解决使用篇](https://blog.csdn.net/kingtok/article/details/113987328)\n手动增加标签\n```xml\n@GetMapping(\"/task\")\n@ResponseBody\npublic String task() throws Exception {\n  ActiveSpan.tag(\"type\", \"sayHello\");\n  log.info(\"come in : /task\");\n  // 自定义操作名称。\n  ActiveSpan.setOperationName(\"测试任务SayHello Task\");\n  // 在当前范围内添加信息级别日志消息。\n  ActiveSpan.info(\"这个是一个日志信息\");\n  ActiveSpan.tag(\"testTag\",\"sayHello\");\n  return demoService.sayHello(\"sayHello\");\n}\n\n```\n手动标记 增加日志、操作等等信息\n![handler-log](pic/hander-log-tag.png)\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwangji92%2Fskywalking-dubbo-example","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwangji92%2Fskywalking-dubbo-example","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwangji92%2Fskywalking-dubbo-example/lists"}