目录

SkyWalking 分布式追踪系统

SkyWalking 是一个开源可观测平台,用于收集、分析、聚合和可视化来自服务和云原生基础设施的数据。SkyWalking 提供了一种简单的方法来保持分布式系统的清晰视图,甚至跨云。它是一种现代 APM,专为云原生、基于容器的分布式系统而设计。

Apache SkyWalking 分布式系统的应用程序性能监控工具,专为微服务、云原生和基于容器的 (Kubernetes) 架构而设计。

APM, Application Performance Monitoring System

为什么使用 SkyWalking

SkyWalking 为在许多不同场景中观察和监控分布式系统提供解决方案。首先,与传统方法一样,SkyWalking 为 Java、C#、Node.js、Go、PHP 和 Nginx LUA 等服务提供自动仪器代理。

在多语言、持续部署的环境中,云原生基础架构变得更加强大,但也更加复杂。SkyWalking 的服务网格接收器允许 SkyWalking 接收来自 Istio/Envoy 和 Linkerd 等服务网格框架的遥测数据,让用户了解整个分布式系统。

SkyWalking 为服务、服务实例、端点、进程提供可观察性能力。如今,Service、Instance 和 Endpoint 等术语随处可见,因此值得在 SkyWalking 的上下文中定义它们的具体含义:

  • 服务(Service)。表示为传入请求提供相同行为的一组/一组工作负载。您可以在使用仪器代理或 SDK 时定义服务名称。SkyWalking 还可以使用您在 Istio 等平台中定义的名称。
  • 服务实例(Service Instance)。服务组中的每个单独的工作负载都称为一个实例。就像pods在 Kubernetes 中一样,它不需要是单个操作系统进程,但是,如果您使用仪器代理,则实例实际上是一个真正的操作系统进程。
  • 端点(Endpoint)。用于传入请求的服务中的路径,例如 HTTP URI 路径或 gRPC 服务类 + 方法签名。
  • Process(进程)。一个操作系统进程。在某些场景下,一个 Service Instance 不是一个进程,比如一个 Pod Kubernetes 可能包含多个进程。

SkyWalking 允许用户了解Services 和Endpoints 的拓扑关系,查看每个Service/Service Instance/Endpoint 的指标,并设置报警规则。

从 v9 开始,SkyWalking 引入了新的核心概念Layer。层代表计算机科学中的一个抽象框架,例如操作系统(OS_LINUX 层)、Kubernetes(k8s 层)。所有检测到的实例都属于一个层来表示该实例的运行环境,服务将根据其实例具有一个或多个层定义。

Architecture

SkyWalking 在逻辑上分为四个部分:Probes、Platform backend、Storage 和 UI。

/images/skywalking/SkyWalking_Architecture.png

  • 探测器(Probes) 收集数据并根据 SkyWalking 要求重新格式化(不同的探测器支持不同的来源)。
  • 平台后端(Platform backend) 支持数据聚合、分析和流式处理,包括跟踪、度量和日志。
  • 存储(Storage) 通过开放/可插入接口存储 SkyWalking 数据。您可以选择现有的实现,例如 ElasticSearch、H2、MySQL、TiDB、InfluxDB,也可以自己实现。欢迎为新的存储实现者打补丁!
  • UI 是一个高度可定制的基于 Web 的界面,允许 SkyWalking 最终用户可视化和管理 SkyWalking 数据。

SkyWalking’s backend distribution package

  • bin/cmd scripts: 定位到文件夹 /bin。 包括启动后台服务与UI的 linux shell 和 Windows cmd scripts。

  • Backend config: 定位到文件夹 /config。包括后台服务的设置文件:

    • application.yml
    • log4j.xml
    • alarm-settings.yml
  • Libraries of backend: 定位到文件夹 /oap-libs。 包括所有后台服务依赖。

  • Webapp env: 定位到文件夹 webapp。有 UI frontend jar 文件, 还有 webapp.yml 设置文件

/images/skywalking/communication-net.png

SkyWalking 的 OAP 后端

1
2
# 修改存储配置
vim config/application.yml
  • 默认存储 H2
  • 默认监听 0.0.0.0/11800 for gRPC APIs and 0.0.0.0/12800 for HTTP REST APIs.

默认启动脚本是 /bin/oapService.sh

OAP 服务器的地址。默认值为 http://127.0.0.1:12800

UI Setup

SkyWalking UI 分发版已经包含在我们的 Apache 官方版本中。

UI listens on 8080 port and request 127.0.0.1/12800 to run a GraphQL query.

1
vim webapp/webapp.yml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
server:
  port: 8080
spring:
  cloud:
    gateway:
      routes:
        - id: oap-route
          uri: lb://oap-service
          predicates:
            - Path=/graphql/**
    discovery:
      client:
        simple:
          instances:
            oap-service:
              # Point to all backend's restHost:restPort, split by URI arrays.
              - uri: http://127.0.0.1:12800
              - uri: http://instance-2:12800

启动脚本 /bin/webappService.sh

Java agent’s toolkits

https://skywalking.apache.org/docs/main/latest/en/setup/backend/log-analyzer/

输出 trace ID

引入对应pom

1
2
3
4
5
<dependency>
  <groupId>org.apache.skywalking</groupId>
  <artifactId>apm-toolkit-log4j-2.x</artifactId>
  <version>8.3.0</version>
</dependency>

修改 log4j2.xml 文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<Configuration status="WARN">
  <Appenders>
    <!-- Async Loggers will auto-flush in batches, so switch off immediateFlush. -->
    <RandomAccessFile name="RandomAccessFile" fileName="async.log" immediateFlush="false" append="false">
      <PatternLayout>
        <Pattern>%d %p %c{1.} [%t] [%traceId] %m %ex%n</Pattern>
      </PatternLayout>
    </RandomAccessFile>
  </Appenders>
  <Loggers>
    <Root level="info" includeLocation="false">
      <AppenderRef ref="RandomAccessFile"/>
    </Root>
  </Loggers>
</Configuration>

gRPC reporter

1
2
3
<GRPCLogClientAppender name="grpc-log">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</GRPCLogClientAppender>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <GRPCLogClientAppender name="grpc-log">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </GRPCLogClientAppender>
        <RandomAccessFile name="fileAppender" fileName="/tmp/skywalking-logs/log4j2/e2e-service-provider.log" immediateFlush="true" append="true">
            <PatternLayout>
                <Pattern>[%sw_ctx] [%p] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c:%L - %m%n</Pattern>
            </PatternLayout>
        </RandomAccessFile>
    </Appenders>



    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="grpc-log"/>
        </Root>
        <Logger name="fileLogger" level="info" additivity="false">
            <AppenderRef ref="fileAppender"/>
        </Logger>
    </Loggers>
</Configuration>
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:127.0.0.1}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}