前言
小伙伴们大家好,日常系统开发和维护中,大家都用什么观测自己的系统呢?起初项目不太复杂,zabbix日常监控足够使用,随着业务模块越来越多,zabbix这种仅仅针对服务器和服务级别的监控,就有点力不从心了,有些问题只能通过一堆堆的日志中去排查,后来上了ELK,日志搜集,排查变得容易了起来。但随着微服务架构越来越流行,系统的不断拆分,服务和服务之间的调用关系,性能如何,哪里出了问题等等诸如此类的问题,单纯的从日志分析,就又变得十分困难。这个时候,APM就该登场了。
那么啥是APM?
APM 全称是 (Application Performance Monitor)应用性能监测软件,主要是用来处理以及追踪分布式系统中的应用程序的性能问题,可以帮助开发人员快速找出问题的根源,从而提升应用程序性能。
那么啥又是Skywalking呢?
Skywalking 是一个APM系统,即应用性能监控系统,为微服务架构和云原生架构系统设计。它通过探针自动收集所需的指标,并进行分布式追踪。通过这些调用链路以及指标,Skywalking APM会感知应用间关系和服务间关系,并进行相应的指标统计。
介绍完APM和Skywalking并且了解了他们之间的关系,下一步我们就要开始动手在linux上搭建Skywalking了。
搭建Skywalking
我们来看一下搭建它需要哪些环境要求:
- JDK 8+
- Elasticsearch 6.x
- 8080, 10800,11800,12800端口可用
安装JDK
网上安装JDK方法很多,这里我图省事,直接使用openjdk
yum install java-1.8.0-openjdk.x86_64
安装好后,使用java -version命令,就可以看一些信息了
下面我们还需要安装Elasticsearch,需要注意的是,新版本的Skywalking6.x已经可以支持ES7了,但是最低还是得使用6.x版本。
这里处于演示的目的,我直接在Docker上安装ES。
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.8.7
这个过程可能会比较慢,安装好后,执行docker ps看看运行状态。
一切正常后,我们进入容器内部修改一下参数,我们需要修改config文件夹下的elasticsearch.yml文件。(注:ced4是我的container id号,需要替换成您自己的)
docker exec -it ced4 /bin/bash
vi elasticsearch.yml
进行如下的配置,主要是设置了一下集群名字和跨域的一些设置,这里集群名字需要记录一下,一会还要用。
配置完成后,我们退出容器(exit 或者ctrl+d),重启一下容器
docker restart ced4
然后我们访问一下
curl http://localhost:9200
至此,ES环境算是准备好了,下一步我们开始安装配置Skywalking
安装和配置Skywalking
我们访问http://skywalking.apache.org/downloads/,看到下面这些列表,因为我们使用的ES6.x版本,所以我们安装框框所示的版本
点进去是这样的
我们复制框框中的链接,进入linux系统中,执行wget命令
wget https://mirror.bit.edu.cn/apache/skywalking/6.6.0/apache-skywalking-apm-6.6.0.tar.gzwget
下载完成后,我们解压。
tar -zxvf apache-skywalking-apm-6.6.0.tar.gz
我解压后,把文件拷到opt文件夹中了,这不是必须的也可以根据您的喜好操作。
我们看一下整体目录
我们进入config目录,修改application.yml这个配置文件,为了方便展示,我把配置拷出来了。
这只是配置的一部分,这里需要你把所有host,从0.0.0.0变成您本机的ip地址,如果您不配置,或者配置诸如127.0.0.1,localhost后,外面是无法访问的。
ES这快namespace就是我们刚才设置的cluster name,别忘了配置。
到这,application.yml就配置完了。
然后我们进入webapp文件夹,修改webapp.yml配置
修改框框中的ip为本机的ip地址即可。这里千万别忘了配置,不然您打开skywalking会报500错误。
万事俱备,我们进入bin文件夹,执行startup.sh,它会分别启动 oapService 和 webappService。
如果不出意外,安装就已经完成了,我们访问页面看看(ip+8080端口)
如果没报什么500错误,那么恭喜你,skywalking安装完成了,如果控制台有各种500错误,您可能需要看看
- es是否正常启动
- es配置节是不是有错配漏配的情况
- host是否设置成本机的地址
- webapp是否配置上
下一步,我们就要开始让skywalking监控我们的http://asp.net core了。
http://asp.net core集成skywalking
我们新建一个http://asp.net core mvc/api项目,然后我们安装skywalking netcore的探针。
您可以把探针简单理解为负责监控您的应用程序,并把探测到的信息上报到APM服务端。
skywalking-netcore是专门为.NET开发的探针,目前支持asp.net core和asp.net,感兴趣的小伙伴可以GitHub上看看。
使用nuget先安装一下SkyAPM.Agent.AspNetCore
然后我们配置一下环境变量
ASPNETCORE_HOSTINGSTARTUPASSEMBLIES=SkyAPM.Agent.AspNetCore
SKYWALKING__SERVICENAME=sample_app
您可以使用set命令,他的作用域是当前cmd窗口,这里我直接写到environmentVariables中了。(launchSettings.json)。如果仅仅出于演示和排查问题使用,我更推荐您使用set的方式,这样在问题或演示结束后,可以很容易关掉它,具体的请参考文档。
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "SkyAPM.Agent.AspNetCore",
"SKYWALKING__SERVICENAME": "mvc_apm_test"
}
啰嗦一句,SKYWALKING__SERVICENAME使用的是双下划线,它是一个层级键(Hierarchical keys)的作用,它和配置中的冒号是一个作用,因为在环境变量中,冒号分隔符可能无法在所有平台上都起作用。
环境配好了,我们下一步安装CLI(SkyAPM.DotNet.CLI),这个命令可能需要管理员权限。
dotnet tool install -g SkyAPM.DotNet.CLI
然后我们执行
dotnet skyapm config [service name] [server]:11800
server name指的就是您刚才配置的SKYWALKING__SERVICENAME,server指的是您Skywalking的ip地址。
执行命令后,会生成一个skywalking.json
因为该Agent采用的是无侵入的集成方式,我们没有除了配置environment外没有修改任何代码(如果使用set都不需要修改代码)所以,至此,所有的准备工作就已经完成。
执行一下
会生成log信息
没有出现异常,则证明一切ok,如果有异常,那么多半是grpc那出了问题,可能需要您telnet一下11800端口是否畅通,如果不畅通,是不是配置出现问题,或者您装了其他grpc的包导致了冲突,总之,慢慢排查,不要慌
这时候我们去Skywalking上看看,应该已经有数据了。如果服务端点有数据,其他都没有数据也没有图,多半是您日期和服务端不同步导致的,您可以看看您es和Skywalking的时区,您也可以尝试切换到utc时间或者,筛查一下时间范围是否正确,