Skip to content

Latest commit

 

History

History
158 lines (132 loc) · 11.4 KB

APM-SkyWalking.md

File metadata and controls

158 lines (132 loc) · 11.4 KB

APM框架系列:


SkyWalking架构

相关概念:

  • 数据模型:参考SkyWalking Cross Process Propagation Headers ProtocolTrace Data Protocol v2
    • TraceId:标记一个调用链,全局唯一,对应Google DapperTraceId
    • Span:标记一次方法调用。对每个监控方法调用生成一个Span,用父子关系记录方法调用层次关系:
      • EntrySpan:服务提供者(如Dubbo provider、MQ consumer等)的入口方法(endpoint)生成EntrySpan
      • ExitSpan:服务消费者(如Dubbo consumer、MQ producer等)对服务的调用生成ExitSpan
      • LocalSpan:除了EntrySpanExitSpan情况,对其它方法的调用,生成LocalSpan
    • Segment:标记一次RPC调用。Span中包含了LocalSpan,与Google Dapper的Span有差异,而Segment在概念上对应Google Dapper Span;
  • 统计视图:
    • Service层面:在应用或服务层面提供性能汇总统计分析,通过agent的service_name参数来标记;
    • Endpoint层面:在方法层面提供性能汇总统计分析;
    • Instance层面:对应用或服务的单个实例层面提供性能汇总统计分析,通过进程ID(或IP+端口号)来标记;
    • Database层面:针对数据库的性能汇总统计(基于JDBC数据库操作采集的数据,比数据库层面的统计粒度更细);

部署SkyWalking

Apache SkyWalking版本6.5.0,Windows环境单机部署,使用my-demo作为演示项目。

存储:

  • 演示环境简单起见存储到MySQL,生产环境可以用ElasticSearch、TiDB,存储方案上比PinPoint多;
  • 用到了300多个表,主要信息存储在service_inventoryservice_instance_inventoryendpoint_inventorysegment等表中;
  1. 下载SkyWalking 6.5.0 Windows包,解压;
  2. 下载MySQL Connector/J放入oap-libs,本文使用8.0.18版本;
  3. 配置:
    1. config/application.yml:Backend启动时检查并自动创建MySQL表,无需手工创建;
      • storage注释掉h2改用mysql,设置JDBC连接、用户密码,添加dataSource.useSSL: false
      • receiver-traceservice-mesh下面的bufferPath指定一个绝对路径;

      使用默认配置时Mac和Windows环境都发现实际路径有点乱,Mac下两个路径都在skywalking父目录,Windows下一个在父目录一个在skywalking目录;

    2. webapp/webapp.yml:Web UI配置,全部采用默认值;
  4. 启动:oapService.bat启动Backend,webappService.bat启动Web UI,startup.bat启动所有;

    SkyWalking使用start批处理命令新开cmd窗口启动Backend和Web UI,使用cmd的默认代码页(Win10下为936),导致Console异常和日志信息的中文显示为乱码,本文通过注册表修改cmd默认代码页,可能需要重启才能生效,临时解决办法修改oapService.bat

    @REM start "%OAP_PROCESS_TITLE%" %_EXECJAVA% "%OAP_OPTS%" -cp "%CLASSPATH%" org.apache.skywalking.oap.server.starter.OAPServerStartUp
    %_EXECJAVA% "%OAP_OPTS%" -cp "%CLASSPATH%" org.apache.skywalking.oap.server.starter.OAPServerStartUp
    

Mac环境下载apache-skywalking-apm-6.5.0.tar.gz即可,部署上没有其它特别之处。


客户端应用使用

  • PinPoint:采用javaagent方式,对应用完全无侵入,项目无需添加任何额外依赖项,无需修改代码,这点做得最好;
  • SkyWalking:采用javaagent方式,普通功能对应用无侵入,以下两项功能需要应用稍作修改:
    • 中添加自定义Tag项:应用代码在SkyWalking Span中添加自定义Tag,可以按需输出方法参数值等关键信息,辅助应用排错和性能分析,PinPointZipKin都不支持(可自行实现);
    • 日志中输出全局跟踪ID,需要添加SkyWalking依赖项;
  • ZipKin:没有采用javaagent方式,应用强依赖ZipKin,必须打包到应用中与应用一起运行,每个项目需要添加依赖项、配置,不同探针有不同的bean配置需求;

支持情况参考Supported middleware, framework and library,对支持框架的关键方法进行跟踪,例如Dubbo服务的consumer调用入口和provider服务方法入口,JDBC的PrepareStatement数据库操作等。

使用SkyWalking agent启动应用

配置agent\config\agent.config

agent.service_name=${SW_AGENT_NAME:unknown}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.31.108:11800}
# 其它保留默认配置

启动应用时通过-javaagent指定SkyWalking代理,-Dskywalking.agent.service_name指定应用名称:

my-demo运行SkyWalking演示:

  1. 使用skywalking参数编译打包:
    sh $PROJECT_HOME/package.sh -skywalking
  2. 按下面脚本顺序启动服务和应用:
    java -javaagent:F:\workspace\skywalking\agent\skywalking-agent.jar -Dskywalking.agent.service_name=item-service -jar item-service\target\item-service-0.0.1-SNAPSHOT.jar
    java -javaagent:F:\workspace\skywalking\agent\skywalking-agent.jar -Dskywalking.agent.service_name=stock-service -jar stock-service\target\stock-service-0.0.1-SNAPSHOT.jar
    java -javaagent:F:\workspace\skywalking\agent\skywalking-agent.jar -Dskywalking.agent.service_name=user-service -jar user-service\target\user-service-0.0.1-SNAPSHOT.jar
    java -javaagent:F:\workspace\skywalking\agent\skywalking-agent.jar -Dskywalking.agent.service_name=order-service -jar order-service\target\order-service-0.0.1-SNAPSHOT.jar
    java -javaagent:F:\workspace\skywalking\agent\skywalking-agent.jar -Dskywalking.agent.service_name=shop-web -jar shop-web\target\shop-web-0.0.1-SNAPSHOT.jar
  3. 访问http://localhost:8090/shop执行一些操作,即可在PinPoint界面查看结果;
将方法加入链路跟踪

业务代码中未被跟踪的方法,如果需要跟踪,则:

  1. pom添加依赖项:
    <dependency>
        <groupId>org.apache.skywalking</groupId>
        <artifactId>apm-toolkit-trace</artifactId>
        <version>6.5.0</version>
    </dependency>
  2. 在方法上添加@Trace注解;

    SkyWalking通过AOP实现跟踪,静态方法添加@Trace无效,只能用于实例方法;

Span中添加自定义Tag

链路跟踪只记录方法名,不记录参数值,可通过代码添加,在当前span上添加tag(必须是被SkyWalking跟踪的方法):

ActiveSpan.tag("account", account);
ActiveSpan.tag("userId", String.valueOf(userId));

链路跟踪中即查看tag名称和值:

记录SQL语句参数值,可以在agent\config\agent.config文件中将plugin.mysql.trace_sql_parameters设为true。

应用日志中输出全局TraceId
  1. pom添加依赖项:
    <dependency>
        <groupId>org.apache.skywalking</groupId>
        <artifactId>apm-toolkit-logback-1.x</artifactId>
        <version>6.5.0</version>
    </dependency>
  2. logback日志layout使用org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout,通过%tid输出trace-id%tid必须小写):
    <appender name="APP" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <charset>UTF-8</charset>
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>${CONSOLE_LOG_PATTERN:-%clr([%d{${LOG_DATEFORMAT_PATTERN:-yyMMdd HH:mm:ss.SSS}}]){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(%tid){yellow}%clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}</pattern>
            </layout>
        </encoder>
    </appender>


未被跟踪的方法trace-id输出TID:N/A


界面功能

SkyWalking和PinPoint界面功能相差不大:

  • PinPoint界面稍微细腻些,Agent Inspector、Application Inspector界面信息集中度更高,适合大屏监控;
  • SkyWalking提供数据库访问统计界面,基于服务/应用、实例层级的汇总统计,比基于数据库的整体统计粒度更新更精准,PinPoint没有;

[Service Dashboard] -> [Service]:针对服务的性能汇总统计:平均响应时间吞吐率服务实例清单及吞吐率

[Service Dashboard] -> [Endpoint]:针对服务方法的性能汇总统计:平均响应时间吞吐率依赖关系图慢方法排行(平均响应时间)慢方法排行(单次调用)

[Service Dashboard] -> [Instance]:针对服务实例的性能汇总统计,服务实例所在JVM、CLR的性能监控情况:平均响应时间吞吐率JVM堆内存JVM非堆内存JVM GCCPU

[Database Dashboard] -> [Database]:针对数据库的性能汇总统计(基于JDBC数据库操作采集的数据,比数据库层面的统计粒度更细):响应时间吞吐率慢查询排行

全链路跟踪、性能分析:

表格方式展示:

树状方式展示: