| skywalking是一个国产开源框架,2015年由吴晟开源 , 2017年加入Apache孵化器。skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统,提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。
    由于使用微服务以及dubbo,一个请求的日志追踪成为了问题,为了解决这个问题,考虑引入skywalking
    我们这里主要用来做traceid日志检测(也可以做APM分析)

    故事背景
    如图示:一个稍微复杂的微服务架构,如果有用户反馈某个页面很慢,我们知道这个页面的请求调用链是 A ——-> C ——-> B ——-> D,此时如何定位可能是哪个模块引起的问题。每个服务 Service A,B,C,D 都有好几台机器。怎么知道某个请求调用了服务的具体哪台机器呢?
    image.png
    可以明显看到,由于无法准确定位每个请求经过的确切路径,在微服务这种架构下有以下几个痛点
    - 排查问题难度大,周期长
    - 特定场景难复现
    - 系统性能瓶颈分析较难
    分布式调用链就是为了解决以上几个问题而生,它主要的作用如下
    - 自动采取数据
    - 分析数据产生完整调用链:有了请求的完整调用链,问题有很大概率可复现
    - 数据可视化:每个组件的性能可视化,能帮助我们很好地定位系统的瓶颈,及时找出问题所在
    通过分布式追踪系统能很好地定位如下请求的每条具体请求链路,从而轻易地实现请求链路追踪,每个模块的性能瓶颈定位与分析。

    要保证全局唯一 ,我们可以采用分布式或者本地生成的 ID,使用分布式话需要有一个发号器,每次请求都要先请求一下发号器,会有一次网络调用的开销,所以 SkyWalking 最终采用了本地生成 ID 的方式,它采用了大名鼎鼎的 snowflow 算法,性能很高。
    image.png | | —- |

    效果展示

    sky walking主要分为四部分
    - 上部分 Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。我们使用的是 java-agent
    - 下部分 SkyWalking OAP :负责接收 Agent 发送的 Tracing 数据信息,然后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query )功能。
    - 右部分 Storage :Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而我们目前采用的是 ES
    - 左部分 SkyWalking UI :负责提供控台,查看链路等等。

    skywalking quick start - 图3

    1. #docker-compose.yml
    2. #安装es
    3. #安装iap
    4. #安装ui
    5. elasticsearch:
    6. image: docker.io/elasticsearch:7.6.1
    7. environment:
    8. - node.name=elk
    9. - cluster.name=icp-test-es
    10. - bootstrap.memory_lock=true
    11. - "ES_JAVA_OPTS=-Xms8g -Xmx8g"
    12. - discovery.type=single-node
    13. volumes:
    14. - /usr/local/icp/elasticsearch/data:/usr/share/elasticsearch/data
    15. - /usr/local/icp/elasticsearch/plugins:/usr/share/elasticsearch/plugins
    16. - /usr/local/icp/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    17. - /usr/local/icp/elasticsearch/logs:/usr/share/elasticsearch/logs
    18. - /usr/local/icp/elasticsearch/backups:/usr/share/elasticsearch/backups
    19. container_name: elasticsearch
    20. hostname: elasticsearch
    21. restart: always
    22. privileged: true
    23. ports:
    24. - "9200:9200"
    25. - "9300:9300"
    26. ulimits:
    27. memlock:
    28. soft: -1
    29. hard: -1
    30. nofile:
    31. soft: "65536"
    32. hard: "65536"
    33. oap:
    34. image: apache/skywalking-oap-server:8.9.1
    35. container_name: oap
    36. depends_on:
    37. - elasticsearch
    38. links:
    39. - elasticsearch
    40. restart: always
    41. ports:
    42. - 11800:11800
    43. - 12800:12800
    44. healthcheck:
    45. test: ["CMD-SHELL", "/skywalking/bin/swctl"]
    46. interval: 30s
    47. timeout: 10s
    48. retries: 3
    49. start_period: 40s
    50. environment:
    51. TZ: Asia/Shanghai
    52. SW_STORAGE: elasticsearch
    53. SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
    54. SW_ES_USER: elastic
    55. SW_ES_PASSWORD: onehome
    56. ui:
    57. image: apache/skywalking-ui:8.9.1
    58. container_name: ui
    59. depends_on:
    60. - oap
    61. links:
    62. - oap
    63. restart: always
    64. ports:
    65. - 8088:8080
    66. environment:
    67. TZ: Asia/Shanghai
    68. SW_OAP_ADDRESS: http://oap:12800
    69. #下载ui tar
    70. wget https://downloads.apache.org/skywalking/java-agent/8.8.0/apache-skywalking-java-agent-8.8.0.tgz
    71. #解压
    72. tar zxvf apache-skywalking-java-agent-8.8.0.tgz
    73. #采用 logback + agent方式使用
    74. #pom.xml导入lib
    75. <!-- https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-logback-1.x -->
    76. <dependency>
    77. <groupId>org.apache.skywalking</groupId>
    78. <artifactId>apm-toolkit-logback-1.x</artifactId>
    79. <version>${apm.version}</version>
    80. </dependency>
    81. # logback-spring.xml %tid即为tracdId
    82. # grpc_log 打印tid
    83. # 运行测试:
    84. # 方式1 IDE VM options配置
    85. -javaagent:E:\software\skywalking-agent\skywalking-agent.jar
    86. -DSW_AGENT_NAME=flex-consumer
    87. -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=10.8.0.102:11800
    88. # 方式2 jar运行 添加 javaagent:skywalking+backend_service
    89. java -Dspring.profiles.active=test -javaagent:skywalking-agent/skywalking-agent.jar=agent.service_name=flex-consumer -Dskywalking.collector.backend_service=10.8.0.102:11800 -jar -Xmx512M -Xms512M flex-consumer-0.0.1-SNAPSHOT.jar --spring.cloud.nacos.server-addr=10.8.0.101:8848
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <configuration>
    3. <contextName>${APP_NAME}</contextName>
    4. <springProperty name="APP_NAME" scope="context" source="spring.application.name"/>
    5. <springProperty name="LOG_FILE" scope="context" source="logging.file" defaultValue="../logs/application/${APP_NAME}"/>
    6. <springProperty name="LOG_POINT_FILE" scope="context" source="logging.file" defaultValue="../logs/point"/>
    7. <springProperty name="LOG_AUDIT_FILE" scope="context" source="logging.file" defaultValue="../logs/audit"/>
    8. <springProperty name="LOG_MAXFILESIZE" scope="context" source="logback.filesize" defaultValue="50MB"/>
    9. <springProperty name="LOG_FILEMAXDAY" scope="context" source="logback.filemaxday" defaultValue="7"/>
    10. <springProperty name="ServerIP" scope="context" source="spring.cloud.client.ip-address" defaultValue="0.0.0.0"/>
    11. <springProperty name="ServerPort" scope="context" source="server.port" defaultValue="0000"/>
    12. <!-- 彩色日志格式 -->
    13. <!-- 日志格式中添加 %tid 即可输出 trace id -->
    14. <property name="CONSOLE_LOG_PATTERN"
    15. value="[${APP_NAME}:${ServerIP}:${ServerPort}] %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%tid]){yellow} %clr([%thread]){orange} %clr(%logger){cyan} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />
    16. <property name="CONSOLE_LOG_PATTERN_NO_COLOR" value="[${APP_NAME}:${ServerIP}:${ServerPort}] %d{yyyy-MM-dd HH:mm:ss.SSS} %level ${PID} [%X{traceId}] [%thread] %logger %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />
    17. <property name="CONSOLE_LOG_PATTERN_SKY_WALKING" value="[${APP_NAME}:${ServerIP}:${ServerPort}] %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%tid]){yellow} %clr([%thread]){orange} %clr(%logger){cyan} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />
    18. <!-- 控制台日志 -->
    19. <appender name="StdoutAppender" class="ch.qos.logback.core.ConsoleAppender">
    20. <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
    21. <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
    22. <Pattern>${CONSOLE_LOG_PATTERN_SKY_WALKING}</Pattern>
    23. </layout>
    24. </encoder>
    25. </appender>
    26. <appender name="grpc_log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
    27. <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
    28. <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
    29. <Pattern>${CONSOLE_LOG_PATTERN_SKY_WALKING}</Pattern>
    30. </layout>
    31. </encoder>
    32. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    33. <!-- 过滤的级别 -->
    34. <level>INFO</level>
    35. <!-- 匹配时的操作:接收(记录) -->
    36. <onMatch>ACCEPT</onMatch>
    37. <!-- 不匹配时的操作:拒绝(不记录) -->
    38. <onMismatch>DENY</onMismatch>
    39. </filter>
    40. </appender>
    41. 。。。。。。。
    42. <root level="INFO">
    43. <appender-ref ref="StdoutAppender"/>
    44. <appender-ref ref="file_async"/>
    45. <appender-ref ref="grpc_log"/>
    46. </root>
    47. </configuration>

    image.png
    image.png
    image.png