初识apache skywalking
概览
首先大概了解一下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的主要特性有:
服务,实例和端点的metrics分析;
根因分析;
服务拓扑图分析;
服务,实例和端点的依赖分析;
慢服务和接口探测;
性能优化;
分布式追踪以及上下文广播;
告警;
概念说明:
服务(service):表示提供相同行为请求的一个
服务集合
或服务组
工作负载,例如用户服务,评论服务等。当你用语言探针或SDK时,你可以定义服务名称。或是SkyWalking使用你在Istio这类平台中定义的名字。服务实例(service instance):服务组中的每个工作负载都称作服务实例,例如部署的若干用户服务中的某个JVM实例。就像pods在Kubernetes(k8s)中一样,它不需要是OS中的单个进程。然而,如果您正在使用语言探针,一个服务实例则实际上是OS中的单个进程。
端点(endpoint):表示某个服务传入请求的路径,例如HTTP URI路径(/user/api/userinfo)或gRPC服务类+方法签名。
架构图
skywalking架构图如下所示:
架构图解读:
架构图左边部分就是skywalking的
UI
,即提供给相关人员操作使用的界面。在UI上可以看到服务拓扑图,接口调用链路信息等。并且skywaling6.x通过新的GraphQL查询协议,不再与UI强绑定;架构图的右边是skywalking支持的
底层存储
。由图可知,skywalking支持es,mysql, TiDB, H2, ShardingSphere这些存储方式,用户可以根据自己的能力选择适合自己的存储(其中,H2仅限调研阶段使用,禁止使用在生产环境)。同时存储是开放的,用户可以自定义实现,例如使用HBase作为底层存储(如果你的自定义实现经过生产环境的考验,还可以将源码贡献给skywalking,成为apache顶级项目skywalking的contributor甚至committer)。架构图的上面部分,表示skywalking的
探针
(probe)。由图可知,skywalking支持采集zipkin(v1/v2)格式,skywalking自己的格式,Istio遥测格式等。 skywalking通过探针收集tracing和metrics数据并格式化,然后通过协议(gRPC或者HTTP)发送给skywalking核心部分即OAP观察分析平台。架构图中间部分就是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非常简单,只需要如下几步即可:
下载Elasticsearch安装包然后解压 (https://www.elastic.co/downloads/past-releases);
修改配置文件, 参考下面的推荐配置;
执行命令nohup bin/elasticsearch &;
执行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):
git clone https://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start
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,如下图所示
图中的索引如service_sla_month,service_sla_hour等都是skywalking连接es后自动创建的。
GET技能
如果你只需要在chrome浏览器上访问es,也可以安装chrome浏览器的ElasticSearch Head
插件。当然前提是你能访问chrome应用商店:
安装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脚本:
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:
一些建议
为了保证skywalking运行良好,给出如下一些建议:
请保证被监控服务的系统时间和skywalking OAP服务的系统时间是一致的;
config/agent.config中的agent.service_name请使用英文;
jvm参数添加的-javaagent:/agent/skywalking-agent.jar请放在-jar前面(即使skywalking6.x放在-jar后面也能正常运行),比如:java -javaagent:/agent/skywalking-agent.jar -jar skywalking-demo.jar。
参考
https://github.com/apache/incubator-skywalking/
https://my.oschina.net/u/3770892/blog/3005395
https://blog.csdn.net/u013095337/article/details/80452088