查看原文
其他

初识apache skywalking

阿飞的博客 阿飞的博客 2023-03-27

概览

首先大概了解一下skywalking。然后会介绍安装skywalking+elasticsearch组合环境,最后介绍微服务集成skywalking。

skywalking是什么?

分布式追踪系统,也是APM(Application Performance Monitoring),即应用性能监控系统。尤其是为服务,云原生,以及基于容器(k8s, Mesos)架构而设计,skywalking就是这样一个为了观察和监控分布式系统的解决方案

skywalking是一个收集,分析,聚合和可视化来自服务和云原生架构数据的开源观察平台,它提供了一个非常简单的方法,让你清晰认识你的分布式系统。

skywalking完全由中国人开发,项目发起人是吴晟(https://github.com/wu-sheng),并已经进入apache孵化。Github地址:https://github.com/apache/incubator-skywalking。

skywalking logo

skywalking的主要特性有:

  • 服务,实例和端点的metrics分析;

  • 根因分析;

  • 服务拓扑图分析;

  • 服务,实例和端点的依赖分析;

  • 慢服务和接口探测;

  • 性能优化;

  • 分布式追踪以及上下文广播;

  • 告警;

概念说明

  • 服务(service):表示提供相同行为请求的一个服务集合服务组工作负载,例如用户服务,评论服务等。当你用语言探针或SDK时,你可以定义服务名称。或是SkyWalking使用你在Istio这类平台中定义的名字。

  • 服务实例(service instance):服务组中的每个工作负载都称作服务实例,例如部署的若干用户服务中的某个JVM实例。就像pods在Kubernetes(k8s)中一样,它不需要是OS中的单个进程。然而,如果您正在使用语言探针,一个服务实例则实际上是OS中的单个进程。

  • 端点(endpoint):表示某个服务传入请求的路径,例如HTTP URI路径(/user/api/userinfo)或gRPC服务类+方法签名。


架构图

skywalking架构图如下所示:

skywalking architecture

架构图解读:

  1. 架构图左边部分就是skywalking的UI,即提供给相关人员操作使用的界面。在UI上可以看到服务拓扑图,接口调用链路信息等。并且skywaling6.x通过新的GraphQL查询协议,不再与UI强绑定;

  2. 架构图的右边是skywalking支持的底层存储。由图可知,skywalking支持es,mysql, TiDB, H2, ShardingSphere这些存储方式,用户可以根据自己的能力选择适合自己的存储(其中,H2仅限调研阶段使用,禁止使用在生产环境)。同时存储是开放的,用户可以自定义实现,例如使用HBase作为底层存储(如果你的自定义实现经过生产环境的考验,还可以将源码贡献给skywalking,成为apache顶级项目skywalking的contributor甚至committer)。

  3. 架构图的上面部分,表示skywalking的探针(probe)。由图可知,skywalking支持采集zipkin(v1/v2)格式,skywalking自己的格式,Istio遥测格式等。 skywalking通过探针收集tracing和metrics数据并格式化,然后通过协议(gRPC或者HTTP)发送给skywalking核心部分即OAP观察分析平台。

  4. 架构图中间部分就是skywalking的核心,称为skywalking可观测分析平台。并且由图可知,skywalking支持通过gRPC和http两种协议接收数据。且收集的数据主要分为两部分:tracing和metrics。

设计目标

skywalking核心设计目标如下:

  • 保持可观察性,无论待监控的目标系统如何部署,skywalking都能提供一个解决方案,或者集成方案保持对目标系统的观察。基于这个原因,skywalking提供了几个运行时形态和探针。

  • 拓扑图,Metric和Trace,了解分布式系统的第一步,应该是从拓扑图开始。它把整个复杂的系统可视化为一个简单的拓扑图。在拓扑图之下,我们需要更多关于服务,实例,端点和调用的metrics信息。例如当端点延迟变长,你需要查看最慢的地方从而找出延迟原因。正如你所见,它们是从一个大的图片到细节,这些都是必须的。SkyWalking整合并提供了许多特性,从而让其成为可能,并易于理解。

  • 轻量级. 主要有两个部分需要轻量级。 (1) 在探针上,我们仅依赖网络通信框架,优先gRPC。如此依赖,探针能尽可能的小,从而避免包冲突,和对VM的压力。 (2)作为一个可观察性平台,它在你的工程环境中是二级和三级系统。因此,skywalking用它们自己的轻量级框架构建后端核心,这样的话用户不需要部署大数据技术平台并维护它们,skywalking在技术栈上应该是简单的。

  • 可插拔,skywalking核心团队提供了很多默认实现,但是肯定还不够,也不可能覆盖每一种场景。所以,许多特性支持可插拔,例如底层存储。

  • 可移植性,skywalking能够运行在许多环境上,包括(1)使用传统的注册中心,比如Eureka。(2)用RPC框架包括服务发现,例如SpringCloud,dubbo。(3)使用ServiceMesh这样的现代基础架构。(4)使用云服务。(5)跨云部署。在这些环境下skywalking都应该能运行良好。

  • 互操作,可观察性是一个很大的landscape,skywalking不可能支持所有,即使通过它的社区也不行。所以,skywalking支持和其他的OSS系统相互协作。比如Zipkin,Jaeger,OpenTracing, OpenCensus。skywalking要能够接收并理解它们的数据格式。

安装

如果你准备部署skywalking5.x,那么es也请安装5.x;如果你准备部署skywalking6.x,那么es也请安装6.x。官方文档有说明:Required ElasticSearch 6.3.0 or higher. HTTP RestHighLevelClient is used to connect server.,参考链接:https://github.com/apache/incubator-skywalking/blob/master/docs/en/setup/backend/backend-storage.md#elasticsearch-6。

如果你部署skywalking6.x,但是却想要使用es5.x,那么,github上也有一个这样的分支:https://github.com/SkyAPM/SkyWalking-With-Es5x-Storage。当然,还是建议skywalking6.x搭配es6.x。

本文以部署刚出来的skywalking 6.0.0-GA为例(2019-01-29全球发布),如果你准备部署skywalking6.x,但是es是5.x(也没有使用SkyWalking-With-Es5x-Storage分支),那么在访问skywalking UI时会碰到下面的异常信息:

"root_cause": [{
    "type""aggregation_execution_exception",
    "reason""Invalid term-aggregator order path [_key]. Unknown aggregation [_key]"
}]

安装es

skywalking底层存储支持很多方式:es, H2, mysql,sharding-sphere,TiDB等,本文以es为例。需要说明的是,如果只是初步了解和演示skywalking,那么skywalking6.x默认配置的存储H2即可,都不需要安装es或者其他存储。

  • es安装

安装es非常简单,只需要如下几步即可:

  1. 下载Elasticsearch安装包然后解压 (https://www.elastic.co/downloads/past-releases);

  2. 修改配置文件, 参考下面的推荐配置

  3. 执行命令nohup bin/elasticsearch &;

  4. 执行curl http://172.29.0.1:9200/ ;

执行curl命令返回如下json信息:

{
  "name" : "es-1",
  "cluster_name" : "es-afei",
  "cluster_uuid" : "rsXnHljaR_OWXm16MIDp0A",
  "version" : {
    "number" : "6.5.4",
    ... ...
  },
  "tagline" : "You Know, for Search"
}

推荐配置如下:

cluster.name: jaws-afei
node.name: es-sw-1
path.data: /data/es
path.logs: /log/es
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
network.host: 172.29.0.1
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"

  • head插件

github地址:https://github.com/mobz/elasticsearch-head,head插件安装也非常简单(需要说明的是,es5.x以后的head site plugins not supported):

  1. git clone https://github.com/mobz/elasticsearch-head.git

  2. cd elasticsearch-head

  3. npm install

  4. npm run start

  5. open http://172.27.0.1:9100/ on browser。

安装的es默认会在9200端口上暴露很多rest API,head插件就是通过访问这些api然后提供web服务。所以安装head插件后只需要在浏览器输入框中输入http://172.29.0.1:9100/,然后修改连接前的地址为http://172.29.0.1:9200/,点击连接,如果看到集群健康值是绿色,表示es和head插件都安装ok,如下图所示

es-head

图中的索引如service_sla_month,service_sla_hour等都是skywalking连接es后自动创建的。


  • GET技能

如果你只需要在chrome浏览器上访问es,也可以安装chrome浏览器的ElasticSearch Head插件。当然前提是你能访问chrome应用商店:

chrome elasticsearch-head extension

安装skywalking

  • 下载

下载地址请戳链接:http://skywalking.apache.org/downloads/。下载后,放到部署的服务器上,解压即可。

  • 配置

如果skywalking的默认端口(有4个端口:8080、10800、11800和12800)有被占用,那么需要处理:修改skywalking的配置或者修改占用端口进程的配置。其中,8080在配置文件webapp/webapp.yml中,10800、11800和12800都在配置文件config/application.yml中。

另外,配置文件config/application.yml中的存储配置需要注意--clusterName的值一定要与es集群的cluster.name一致,还有clusterNodes的地址:

storage:
   elasticsearch:
     # nameSpace: ${SW_NAMESPACE:""}
     clusterNodes${SW_STORAGE_ES_CLUSTER_NODES:172.29.0.1:9200}
     indexShardsNumber${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:5}
     indexReplicasNumber${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}

说明:skywalking6默认采用H2存储,想必是为了最小化初步体验的代价。有兴趣的朋友,还是建议搭建skywalking+es的组合环境,注释掉H2存储。

  • 启动skywalking

执行命令bin/startup.sh即可。

说明:skywalking6.x版本运行startup.sh会启动两个服务(skywalking5.x也是如此),一定要确认,通过启动日志可知:

SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!

启动后,看到这两行日志并不表示skywalking就已经部署成功。强烈建议查看logs目录下的日志文件中是否有error信息。如果有,请排查问题解决后再重启skywalking。

  • 登陆UI

地址:http://172.29.0.1:8080/,这个端口对应配置文件webapp/webapp.yml中的server.port。

监控应用

将skywalking解压文件夹中的agent文件夹拷贝到需要监控的应用所在的服务器,更改agent/config目录下的配置文件,重点修改如下配置,其中172.29.0.1是skywalking主程序中配置的地址:

agent.service_name=${SW_AGENT_NAME:yyfax-fs}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:172.29.0.1:11800}

正常启动java应用时,只需要带上如下参数即可,例如:java -javaagent:/app/skywalking6-agent/skywalking-agent.jar  -jar skyWalkingdemo-1.0.0-SNAPSHOT.jar:

-javaagent:/app/skywalking-agent/skywalking-agent.jar

另外,需要说明的是,SkyWalking自带的启动脚本startup.sh只有启动功能,没有杀进程的功能,即不能通过脚本重启。所以可以自己写个stop.sh脚本:

#!/bin/bssh
ps aux | grep org.apache.skywalking.oap.server.starter.OAPServerStartUp | grep -v grep | awk '{print $2}' | xargs kill  > /dev/null
ps aux | grep skywalking-webapp.jar | grep -v grep | awk '{print $2}' | xargs kill  > /dev/null

接下来访问通过skywalking追踪的服务的任意rest API(笔者以访问/api/file/uploadFiles为例),然后稍等几秒钟再访问skywalking UI,如果能找到你刚才访问的rest API的trace信息(登陆skywalking UI,然后点击左边菜单的"Trace"即可),表示一切OK:

trace result
  • 一些建议

为了保证skywalking运行良好,给出如下一些建议:

  1. 请保证被监控服务的系统时间和skywalking OAP服务的系统时间是一致的;

  2. config/agent.config中的agent.service_name请使用英文;

  3. jvm参数添加的-javaagent:/agent/skywalking-agent.jar请放在-jar前面(即使skywalking6.x放在-jar后面也能正常运行),比如:java -javaagent:/agent/skywalking-agent.jar -jar skywalking-demo.jar。


  • 参考

  1. https://github.com/apache/incubator-skywalking/

  2. https://my.oschina.net/u/3770892/blog/3005395

  3. https://blog.csdn.net/u013095337/article/details/80452088


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存