Skywalking链路追踪

    微服务的出现,的确解决了一些业务痛点,但是也造成了新的问题比如随着调用链的拉长,如果想要知道请求为什么这么慢,这个请求到底经历了哪些环节,又依赖了哪些东西,在微服务架构中定位这些问题并且解决是比较麻烦的。

什么是调用链呢?

    A服务调用B服务也可以说是一个调用链,即使是同一个服务中的一个方法调用到另一个方法,也可以说是一个调用链。

    以前单体应用中,排查问题往往只需要到这台应用的服务,查看日志基本就能把问题解决了。但是在微服务系统中,一般是分布式部署的,这也就给排查增加了难度,如果把一台台服务器登录上找问题,既麻烦又耗时。

    为了解决这些问题,业内已经有了分布式链路追踪的解决方案,比如使用ZipKin、SkyWalking等。

SkyWalking介绍

    SkyWalking是基于OpenTracing实现的开源项目,2017年12月8日已进入Apache孵化器。

    是一个APM(应用性能监控)系统,专为微服务、云原生架构和基于容器(Docker、k8s、Mesos)架构而设计。通过探针收集应用的指针,并进行分布式链路追踪。SkyWalking会感知服务之间的调用链路关系,形成相应的统计数据。它的特性如下:

  • 支持警告
  • 采用探针技术,对业务代码零侵入
  • 支持自动及手动探针
  • 轻量高效,不需要大数据平台
  • 多种监控手段,多语言自动探针
  • 可视化后台
  • 模块化

SkyWalking的整体架构:

  • 探针(agent):负责数据收集,包含了Tracing和Metrics的数据
  • 可观测性能分析平台(OAP):接收探针发送的数据,并使用分析引擎进行数据整合、运算,然后把数据存储到对应的存储介质(可用H2或Elasticsearch等)上,还为UI后台提供接口
  • UI:调用OAP的接口,提供可视化界面展示

Elasticsearch下载安装

    那么SkyWalking的存储介质,笔者这s选择使用Elasticsearch,先到Elasticsearch的官网下载。

windows版本下载地址,选择下载了一个7.0.0版本的。

这里笔者就使用windows版本了,需要linux版本或其他可以自行查阅资料。

下载解压后,到config/elasticsearch.yml中修改下集群名:

cluster.name: my-application

后直接到bin目录下,执行elasticsearch.bat即可执行es服务,默认端口9200

Skywalking链路追踪

启动完毕后,访问下localhost:9200,得到如下信息即是安装成功

Skywalking链路追踪

完成后,再去安装SkyWalking。注意这里cluster.name是my-application。后面skywalking需要用。

SkyWalking下载安装

下载地址:https://skywalking.apache.org/downloads/

Skywalking链路追踪

下载过慢或者下载无反应的,可以尝试使用国内镜像地址去下载,https://mirrors.cloud.tencent.com/apache/skywalking

Skywalking链路追踪

笔者使用7.0.0版本的,地址在这里:https://www.apache.org/dyn/closer.cgi/skywalking/7.0.0/apache-skywalking-apm-es7-7.0.0.tar.gz

这里提供下网盘资源:

链接:https://pan.baidu.com/s/1lQoMDFIH3PYGCla3PtIIRg提取码:2a96

下载解压后,得到如下目录:

Skywalking链路追踪

  • agent:探针相关,代理模块
  • bin:oapService和webappService的启动脚本,也有两个脚本合并的脚本start.bat,linux系统启动.sh的文件
  • config:数据收集器、存储、告警等配置信息
  • logs:collector和web-ui的日志
  • webapp:SkyWalking展示的UIjar文件和配置文件

config/application.yml中修改配置

storage:
  selector: ${SW_STORAGE:elasticsearch7}

修改elsticsearch的nameSpace和ClusterNodes,这里nameSpace是前面配置的es的集群名称

storage:
  selector: ${SW_STORAGE:elasticsearch7}
  elasticsearch7:
    nameSpace: ${SW_NAMESPACE:"my-application"}
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}

注意:SkyWalking默认使用的端口是8080、11800、12800,如有占有,可去config/application.ymlwebapp/application.yml中修改

启动

执行startup.bat启动

访问localhost:8080即可进入skywalking的可视化界面

Skywalking链路追踪

IDEA使用agent

    IDEA使用agent主要使用于本地开发环境,需要又agent文件夹,然后加上启动参数即可。

找到两个springboot微服务项目,然后在它们的IDEA启动配置中,增加参数:

transaction的

-javaagent:D:envenvirskywalking7agentskywalking-agent.jar
-Dskywalking.agent.service_name=transaction-distribution
-Dskywalking.collector.backend_service=localhost:11800

order的

-javaagent:D:envenvirskywalking7agentskywalking-agent.jar
-Dskywalking.agent.service_name=transaction-order
-Dskywalking.collector.backend_service=localhost:11800
  • D:envenvirskywalking7agentskywalking-agent.jar`是agent的目录路径
  • service_name:服务名称
  • backend_service:skywalking的服务地址(端口是11800)

完事儿后,启动它们。

调用一个接口,执行它们。

拓扑图

到skywalking的拓扑图页面

Skywalking链路追踪

可以看到真题的技术架构及调用关系。

追踪

到skywalking的追踪页面

Skywalking链路追踪

可以看到所有的执行记录,并且将这些详细到:发生在哪个类哪个方法中,如执行sql查询的那条,点击后,我们甚至可以看到sql的执行信息。

Skywalking链路追踪

还可知接口的执行时间分布,以及采用的技术

Skywalking链路追踪

如上图:/createOrder接口总执行2.4s,/distribution是使用feign调用的,且执行了1s左右。

忽略端点

    有时可能不需要采集某个端点的数据,如心跳之类的请求,不是那么重要。可以设置忽略它们,意味着包含这些路径的追踪信息不会被agent发送到collector中。

  1. 将skywalking中的agent/optional-pluginsapm-trace-ignore-plugin-7.0.0.jar拷贝至我们的agent/plugins

  2. 在IDEA中做启动配置,我们模拟将/createOrder/distribution接口忽略

    -javaagent:D:envenvirskywalking7agentskywalking-agent.jar
    -Dskywalking.agent.service_name=transaction-distribution
    -Dskywalking.collector.backend_service=localhost:11800
    -Dskywalking.trace.ignore_path=/createOrder
    -javaagent:D:envenvirskywalking7agentskywalking-agent.jar
    -Dskywalking.agent.service_name=transaction-order
    -Dskywalking.collector.backend_service=localhost:11800
    -Dskywalking.trace.ignore_path=/distribution

ignore_path这个参数可以支持表达式:

/path/*path/**/path/?

?表示匹配任意单字符,*表示匹配0个或任意数量字符,**表示匹配0或更多的目录

配置后,在调用匹配规则的接口路径时,agent就不会再采集这些接口的数据了。

除此外还有另一种方式

同样是需要先将skywalking中的agent/optional-pluginsapm-trace-ignore-plugin-7.0.0.jar拷贝至我们的agent/plugins

然后去配置agent/config/agent.config文件忽略端点,服务每次启动都会去读取这个配置文件。

trace.ignore_path==${SW_AGENT_TRACE_IGNORE_PATH:/createOrder, /distribution}

告警

    告警功能是skywalking的一大特色。Skywalking会定时把采集到的数据和配置的告警规则进行对比,如果满足阈值条件,则会出发警告。

    Skywalking允许用户基于webhook(网络钩子)的规范,自定义触发告警之后的逻辑,如发短信、发邮件、电话、公众号通知等。

Skywalking程序路径下的config/alarm-settings.yml文件就是告警的规则。

rules:
  service_resp_time_rule: # 服务响应时间规则
    metrics-name: endpoint_percent # 名称
    threshold: 75 # 阈值
    op: <  # 小于
    period: 10 # 间隔时间
    count: 3 # 次数
    silence-period: 10 # 告警发送多少分钟内警告不会重复发送
    message: Successful rate of endpoint {name} is lower than 75%
#webhooks:
#  - http://127.0.0.1/notify/
#  - http://127.0.0.1/go-wechat/

webhooks中就是触发警告后,需要执行的操作。

我们可以自己做个触发钩子后的执行操作接口

  • 来个告警信息类
public class AlarmMessage {
    
    private Integer scopeId;    // 作用域
    private String name;        // 目标作用域下的实体名称
    private Integer id0;        // 作用域下的实体ID,与名称相匹配
    private Integer id1;
    private String ruleName;    // alarm-setting.yml中的配置规则
    private String alarmMessage;   // 告警信息
    private Long startTime;     // 告警产生时间
    
    // get.set.toString()方法省略
    
}
  • 做个接口
@RequestMapping("/notify")
public void alarm(@RequestBody List<AlarmMessage> alarmMessages) {
    alarmMessages.forEach(value -> System.out.println(value.toString()));
}
  • 修改config/alarm-settings.yml配置文件,增加钩子的后续执行。
webhooks:
  - http://127.0.0.1:9002/notify

    重启skywalking及两个微服务项目,多次调用/createOrder接口(模拟的超时报错),这里记得把忽略的端点给放开,否则skywalking是发不了告警的。

可看到告警一栏中的

Skywalking链路追踪

看到控制台打印的数据:

Skywalking链路追踪

性能分析

    Skywalking的性能分析能帮助用户很容易找到性能问题,并且不需要代码埋点等操作。Skywalking的性能分析是对业务周期性保存快照操作,资源消耗小。

    到Skywalking UI的性能剖析窗口,点击新建任务,如创建/createOrder接口的任务。

Skywalking链路追踪

    然后可以调用几次/createOrder接口,刷新页面,选中刚刚创建的任务,右侧出现createOrder的信息,选中,点击分析按钮。

Skywalking链路追踪

调用/createOrder的流程,使用的技术,服务名,耗时,栈信息等一览无余。

点击查看能看到这个步骤的详细信息,执行的具体操作,抛出的异常。

Tomcat或Jar包使用agent

    IDEA中使用agent一般用于本地开发环境,若正式环境,一般使用Tomcat或jar包的方式启动应用。

Linux系统Tomcat使用agent

linux系统中修改tomcat的bin/catalina.sh文件,加入代码

CATALINA_OPTS="$CATALINA_OPTS -javaagent:/root/agent/skywalking-agent.jar -Dskywalking.agent.service_name=transaction-distribution -Dskywalking.collector.backend_service=localhost:11800";
export CATALINA_OPTS

Windows系统Tomcat使用agent

windows系统中修改tomcat的bin/catalina.bat文件setlocal下,加入代码

set CATALINA_OPTS="-javaagent:D:envenvirskywalking7agentskywalking-agent.jar -Dskywalking.agent.service_name=transaction-distribution -Dskywalking.collector.backend_service=localhost:11800";

jar包使用agent

启动时的命令

java -javaagent:D:envenvirskywalking7agentskywalking-agent.jar -Dskywalking.agent.service_name=transaction-distribution -Dskywalking.collector.backend_service=localhost:11800 -jar transaction-distribution.jar

配置账号密码登录

    Skywalking的功能很强大,能看到项目中的很多隐私信息(项目架构、调用链路、sql语句等),自然不希望其他无关人员能看到。那么通常设置账号密码的方式。

    在skywalking6.x版本中能配置,但是在7.x版本中被移除了,作者提出可以使用nginx配置账号和密码:

使用nginx配置账号密码登录主要是依靠ngx_http_auth_basic_module模块。

    下面是用nginx的增强版,OpenResty配置账号和密码登录。OpenResty的安装可以自行查阅资料。

安装和配置

  • 安装hptpasswd工具
yum install -y httpd-tools
  • 使用htpasswd生成用户名和密码
htpasswd -b -c /usr/local/openresty/passwd wlh wlh

-b参数:用户创建passwdfile,如果passwdfile存在,那么它会重写

-c参数:允许命令行中一起输入账号和密码

  • 到OpenResty的安装目录,修改nginx/conf/nginx.conf配置文件,修改server中的内容就行了
server{
listen 80;
server_name localhost;
location / {
auth_basic "Please input password"; # 提示信息
auth_basic_user_file /user/local/openrestry/passwd; # 存放账号密码的文件
proxy_pass http://localhost:8080; # 代理到8080端口
}

}

    最后linux系统记得放开需要的端口。重启OpenResty然后访问主机http://192.168.1.41(默认80端口),就会弹框提示需要输入账号和密码了。


原文始发于微信公众号(小路同学ovo):Skywalking链路追踪

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/267739.html

(0)
码上实战的头像码上实战

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!