10分钟搭建一套SkyWalking(基于Elasticsearch)
环境
- Rocky Linux8.7
- openjdk-1.8
- Elasticsearch 6.7.2
- SkyWalking 6.6.0
因为CentOS目前变成了RHEL的上游,常用环境目前使用Rocky Linux;如果用openjdk 17,SkyWalking 6.6.0会报错,还是用最常用的jdk8吧。
Rocky Linux8.7
下载地址:https://download.rockylinux.org/pub/rocky/8/isos/x86_64/Rocky-8.7-x86_64-dvd1.iso
OpenJDK 1.8
使用yum或者dnf进行安装
- 版本查询
yum list java* | grep jdk
- 安装1.8或者17版本,这里是1.8
yum install -y java-1.8.0-openjdk*
- 验证版本
java -version
Elasticsearch 6.7.2
参考 https://www.iocoder.cn/Elasticsearch/install/?self 里的1.单机部署
下载地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.7.2.tar.gz
注意:一定要非ROOT用户启动
解决办法
退出非root账号 ,修改文件所属组,就有操作权限了chown -R leyou:leyou elasticsearch
参考 https://blog.csdn.net/qq_41887560/article/details/105754128
SkyWalking 6.6.0
参考:https://skywalking.apache.org/zh/2020-04-19-skywalking-quick-start/
下载地址:https://archive.apache.org/dist/skywalking/6.6.0/apache-skywalking-apm-6.6.0.tar.gz
下载后解压
SkyWalking OAP 搭建
- 修改 OAP 配置文件
友情提示:如果配置文件,适合 SkyWalking 6.X 版本。
$ vi config/application.yml
storage:
elasticsearch7:
nameSpace: ${SW_NAMESPACE:"elasticsearch"}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
# trustStorePath: ${SW_SW_STORAGE_ES_SSL_JKS_PATH:"../es_keystore.jks"}
# trustStorePass: ${SW_SW_STORAGE_ES_SSL_JKS_PASS:""}
user: ${SW_ES_USER:""}
password: ${SW_ES_PASSWORD:""}
indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
# Those data TTL settings will override the same settings in core module.
recordDataTTL: ${SW_STORAGE_ES_RECORD_DATA_TTL:7} # Unit is day
otherMetricsDataTTL: ${SW_STORAGE_ES_OTHER_METRIC_DATA_TTL:45} # Unit is day
monthMetricsDataTTL: ${SW_STORAGE_ES_MONTH_METRIC_DATA_TTL:18} # Unit is month
# Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the bulk every 1000 requests
flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests
concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests
resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000}
metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
# h2:
# driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource}
# url: ${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db}
# user: ${SW_STORAGE_H2_USER:sa}
# metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
- storage.elasticsearch7 配置项,设置使用 Elasticsearch 7.X 版本作为存储器。
- 这里,我们打开注释,并记得通过 nameSpace 设置 Elasticsearch 集群名。
- storage.elasticsearch 配置项,设置使用 Elasticsearch 6.X 版本作为存储器。
- 这里,我们无需做任何改动。
- 如果胖友使用 Elasticsearch 6.X 版本作为存储器,记得设置这个配置项,而不是 storage.elasticsearch7 配置项。
- storage.h2 配置项,设置使用 H2 作为存储器。
- 这里,我们需要手动注释掉,因为 H2 是默认配置的存储器。
- 启动 SkyWalking OAP 服务
$ bin/oapService.sh
SkyWalking OAP started successfully!
是否真正启动成功,胖友打开 logs/skywalking-oap-server.log 日志文件,查看是否有错误日志。首次启动时,因为 SkyWalking OAP 会创建 Elasticsearch 的索引,所以会“疯狂”的打印日志。最终,我们看到如下日志,基本可以代表 SkyWalking OAP 服务启动成功:
友情提示:因为首次启动会创建 Elasticsearch 索引,所以可能会比较慢。
2020-01-02 18:22:53,635 - org.eclipse.jetty.server.Server - 444 [main] INFO [] - Started @35249ms
SkyWalking UI 搭建
① 启动 SkyWalking UI 服务
bin/webappService.sh
SkyWalking Web Application started successfully!
是否真正启动成功,胖友打开 logs/logs/webapp.log
日志文件,查看是否有错误日志。最终,我们看到如下日志,基本可以代表 SkyWalking UI 服务启动成功:
2020-01-02 18:27:02.824 INFO 48250 --- [main] o.a.s.apm.webapp.ApplicationStartUp : Started ApplicationStartUp in 7.774 seconds (JVM running for 8.316)
如果想要修改 SkyWalking UI 服务的参数,可以编辑 webapp/webapp.yml
配置文件。例如说:
server.port
:SkyWalking UI 服务端口。collector.ribbon.listOfServers
:SkyWalking OAP 服务地址数组。因为 SkyWalking UI 界面的数据,是通过请求 SkyWalking OAP 服务来获得的。
② 访问 UI 界面:
浏览器打开 http://127.0.0.1:8080
。界面如下图:
SkyWalking Agent
Shell
① Agent 软件包
我们需要将 apache-skywalking-apm-bin/agent
目录,拷贝到 Java 应用所在的服务器上。这样,Java 应用才可以配置使用该 SkyWalking Agent。我们来看看 Agent 目录下有哪些:
$ ls -ls
total 35176
0 drwxr-xr-x@ 7 yunai staff 224 Dec 24 14:20 activations
0 drwxr-xr-x@ 4 yunai staff 128 Dec 24 14:21 bootstrap-plugins
0 drwxr-xr-x@ 3 yunai staff 96 Dec 24 14:12 config # SkyWalking Agent 配置
0 drwxr-xr-x@ 3 yunai staff 96 Jan 2 19:29 logs # SkyWalking Agent 日志
0 drwxr-xr-x@ 13 yunai staff 416 Dec 24 14:22 optional-plugins # 可选插件
0 drwxr-xr-x@ 68 yunai staff 2176 Dec 24 14:20 plugins # 插件
35176 -rw-r--r--@ 1 yunai staff 18006420 Dec 24 14:12 skywalking-agent.jar # SkyWalking Agent
- 关于 SkyWalking Agent 提供的插件列表,可以看看《SkyWalking 文档 —— 插件支持列表》。
因为艿艿是在本机测试,所以无需拷贝,SkyWalking Agent 目录是 /Users/yunai/skywalking/apache-skywalking-apm-bin-es7/agent/
。
考虑到方便胖友,艿艿这里提供了一个最简的 Spring Boot 应用 lab-39-demo-2.2.2.RELEASE.jar。对应 Github 仓库是 lab-39-demo。
② 配置 Java 启动脚本
# SkyWalking Agent 配置
export SW_AGENT_NAME=demo-application # 配置 Agent 名字。一般来说,我们直接使用 Spring Boot 项目的 `spring.application.name` 。
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 # 配置 Collector 地址。
export SW_AGENT_SPAN_LIMIT=2000 # 配置链路的最大 Span 数量。一般情况下,不需要配置,默认为 300 。主要考虑,有些新上 SkyWalking Agent 的项目,代码可能比较糟糕。
export JAVA_AGENT=-javaagent:/Users/yunai/skywalking/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar # SkyWalking Agent jar 地址。
# Jar 启动
java -jar $JAVA_AGENT -jar lab-39-demo-2.2.2.RELEASE.jar
- 通过环境变量,进行配置。
- 更多的变量,可以在
/work/programs/skywalking/apache-skywalking-apm-bin/agent/config/agent.config
查看。要注意,可能有些变量是被注释掉的,例如说SW_AGENT_SPAN_LIMIT
对应的agent.span_limit_per_segment
。
③ 执行脚本:
直接执行上述的 Shell 脚本,启动 Java 项目。在启动日志中,我们可以看到 SkyWalking Agent 被加载的日志。日志示例如下:
DEBUG 2020-01-02 19:29:29:400 main AgentPackagePath : The beacon class location is jar:file:/Users/yunai/skywalking/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar!/org/apache/skywalking/apm/agent/core/boot/AgentPackagePath.class.
INFO 2020-01-02 19:29:29:402 main SnifferConfigInitializer : Config file found in /Users/yunai/skywalking/apache-skywalking-apm-bin-es7/agent/config/agent.config.
同时,也可以在 /Users/yunai/skywalking/apache-skywalking-apm-bin-es7/agent/agent/logs/skywalking-api.log
查看对应的 SkyWalking Agent 日志。日志示例如下:
DEBUG 2020-01-02 19:37:22:539 SkywalkingAgent-5-ServiceAndEndpointRegisterClient-0 ServiceAndEndpointRegisterClient : ServiceAndEndpointRegisterClient running, status:CONNECTED.
- 这里,我们看到
status:CONNECTED
,表示 SkyWalking Agent 连接 SkyWalking OAP 服务成功。
④ 简单测试
完事,可以去 SkyWalking UI 查看是否链路收集成功。
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/echo 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。
2、然后,继续使用浏览器,打开 http://127.0.0.1:8080/ 地址,进入 SkyWalking UI 界面。如下图所示:
这里,我们会看到 SkyWalking 中非常重要的三个概念:
- 服务(Service) :表示对请求提供相同行为的一系列或一组工作负载。在使用 Agent 或 SDK 的时候,你可以定义服务的名字。如果不定义的话,SkyWalking 将会使用你在平台(例如说 Istio)上定义的名字。
这里,我们可以看到 Spring Boot 应用的服务为
"demo-application"
,就是我们在环境变量SW_AGENT_NAME
中所定义的。 - 服务实例(Service Instance) :上述的一组工作负载中的每一个工作负载称为一个实例。就像 Kubernetes 中的 pods 一样, 服务实例未必就是操作系统上的一个进程。但当你在使用 Agent 的时候, 一个服务实例实际就是操作系统上的一个真实进程。
这里,我们可以看到 Spring Boot 应用的服务为
{agent_name}-pid:{pid}@{hostname}
,由 Agent 自动生成。关于它,我们在「5.1 hostname」小节中,有进一步的讲解,胖友可以瞅瞅。 - 端点(Endpoint) :对于特定服务所接收的请求路径, 如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名。
这里,我们可以看到 Spring Boot 应用的一个 端点 ,为 API 接口
/demo/echo
。
3、之后,点击「拓扑图」菜单,进入查看拓扑图的界面。如下图所示:
4、再之后,点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
参考链接:
SkyWalking 极简入门 | Apache SkyWalking
芋道 Elasticsearch 极简入门 | 芋道源码 —— 纯源码解析博客
解决ElasticSearch的Exception in thread "main" java.nio.file.AccessDeniedException错误_BackBay2的博客
Linux yum 安装 JDK 的方法_yum install jdk_长安明月的博客