[TOC]
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名申请、虚拟空间、营销软件、网站建设、合作网站维护、网站推广。
关于SkyWalking的基础使用参考:
官方文档:
首先我们需要获取到SkyWalking的下载地址,官方下载地址如下:
http://skywalking.apache.org/downloads/
这里我选择当前最新的6.6.0版本的二进制包,由于一会需要对接的es服务版本为7.x,所以这里得选择for ElasticSearch 7:
复制下载地址到服务器上进行下载并解压,具体步骤如下:
[root@localhost ~]# cd /usr/local/src
[root@localhost /usr/local/src]# wget http://mirror.bit.edu.cn/apache/skywalking/6.6.0/apache-skywalking-apm-es7-6.6.0.tar.gz
[root@localhost /usr/local/src]# mkdir ../skywalking && tar -zxvf apache-skywalking-apm-es7-6.6.0.tar.gz -C ../skywalking --strip-components 1
[root@localhost /usr/local/src]# cd ../skywalking/
[root@localhost /usr/local/skywalking]# ll -rh # 解压后的目录文件如下
total 88K
drwxr-xr-x 2 root root 53 Dec 28 18:22 webapp
-rw-rw-r-- 1 1001 1002 2.0K Dec 24 14:10 README.txt
drwxrwxr-x 2 1001 1002 12K Dec 24 14:28 oap-libs
-rwxrwxr-x 1 1001 1002 32K Dec 24 14:10 NOTICE
drwxrwxr-x 3 1001 1002 4.0K Dec 28 18:22 licenses
-rwxrwxr-x 1 1001 1002 29K Dec 24 14:10 LICENSE
drwxr-xr-x 2 root root 221 Dec 28 18:22 config
drwxr-xr-x 2 root root 241 Dec 28 18:22 bin
drwxrwxr-x 8 1001 1002 143 Dec 24 14:21 agent
[root@localhost /usr/local/skywalking]#
SkyWalking 的组成在逻辑上分为四部分:探针、平台后端、存储和用户界面。其中平台后端服务是用于收集agent上传的监控数据,其核心配置文件位于:config/application.yml
。
如果没有任何要求,基本上是无需修改配置就可以直接启动 SkyWalking 服务。但通常线上都对监控数据有持久化需求,而SkyWalking 默认使用的是H2这种内存数据库,不具有持久存储的特性。所以我们需要修改其存储配置,接入elasticsearch服务作为存储组件。
首先将默认的H2数据库配置给注释掉:
[root@ip-236-048 skywalking]# vim config/application.yml
# h3:
# driver: ${SW_STORAGE_H2_DRIVER:org.h3.jdbcx.JdbcDataSource}
# url: ${SW_STORAGE_H2_URL:jdbc:h3:mem:skywalking-oap-db}
# user: ${SW_STORAGE_H2_USER:sa}
# metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
然后将elasticsearch7配置的注释解开,并修改如下:
storage:
elasticsearch7:
# nameSpace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.3.10: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}
advanced: ${SW_STORAGE_ES_ADVANCED:""}
另外一个常见需求就是修改监听的ip和端口号,skywalking默认12800为rest api通信端口,默认11800为gRPC api通信端口。这些都可以在配置文件中进行修改,而我这里保持默认:
core:
default:
# Mixed: Receive agent data, Level 1 aggregate, Level 2 aggregate
# Receiver: Receive agent data, Level 1 aggregate
# Aggregator: Level 2 aggregate
role: ${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator
restHost: ${SW_CORE_REST_HOST:0.0.0.0}
restPort: ${SW_CORE_REST_PORT:12800}
restContextPath: ${SW_CORE_REST_CONTEXT_PATH:/}
gRPCHost: ${SW_CORE_GRPC_HOST:0.0.0.0}
gRPCPort: ${SW_CORE_GRPC_PORT:11800}
完成以上配置后,运行bin
目录下的startup.sh
脚本即可启动skywalking服务:
[root@localhost /usr/local/skywalking]# bin/startup.sh
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!
[root@localhost /usr/local/skywalking]#
SkyWalking控制台服务默认监听8080端口,若有防火墙需要开放该端口:
[root@localhost /usr/local/skywalking]# firewall-cmd --zone=public --add-port=8080/tcp --permanent
success
[root@localhost /usr/local/skywalking]# firewall-cmd --reload
success
[root@localhost /usr/local/skywalking]#
若希望允许远程传输,则还需要开放11800(gRPC)和12800(rest)端口,远程agent将通过该端口传输收集的数据:
[root@localhost /usr/local/skywalking]# firewall-cmd --zone=public --add-port=11800/tcp --permanent
success
[root@localhost /usr/local/skywalking]# firewall-cmd --zone=public --add-port=12800/tcp --permanent
success
[root@localhost /usr/local/skywalking]# firewall-cmd --reload
success
[root@localhost /usr/local/skywalking]#
正常启动成功后,使用浏览器访问主页如下:
logs/skywalking-oap-server.log
接下为项目集成java agent探针,看看skywalking是否能正常监控到数据。首先创建两个简单的Spring Cloud项目,分别是consumer和producer:
这两个项目中均包含基础的组件依赖:nacos-discovery、openfeign及web。因为SkyWalking是通过Java agent这种语言探针的方式进行数据的收集和上传,所以不需要像zipkin那样添加额外的依赖和配置。
consumer将调用producer提供的接口,以达到后续在SkyWalking上展示一个简单的调用链路效果。故在producer中编写一个接口,代码如下:
@Slf4j
@RestController
@RequestMapping("/producer")
public class ProducerController {
@GetMapping
public String producer() {
log.info("received a request");
return "this message from producer";
}
}
而consumer也有一个接口,该接口内则是调用了producer的接口。代码如下:
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/consumer")
public class ConsumerController {
private final ProducerClient producerClient;
@GetMapping
public String consumer() {
log.info("consumer something");
// 通过feign调用
String result = producerClient.producer();
return "consumer: " + result;
}
}
ProducerClient
代码如下:
@FeignClient("producer")
public interface ProducerClient {
@GetMapping("/producer")
String producer();
}
由于本地调试需要使用到SkyWalking提供的Java Agent jar包,所以得到之前的下载页面中下载对应平台的压缩包:
解压后的目录文件内容如下:
我们主要是使用到agent目录下的jar包:
为了方便起见,这里就不单独为每个服务拷贝一个agent目录了。通过添加JVM启动参数的方式来覆写配置项:
# 指定java agent的jar包路径
-javaagent:E:\skywalking\apache-skywalking-apm-bin\agent\skywalking-agent.jar
# 指定skywalking agent的服务名称,通常对应项目的服务名称
-Dskywalking.agent.service_name=consumer
# 指定skywalking后端平台收集服务的连接ip及端口号
-Dskywalking.collector.backend_service=192.168.10.6:11800
完成以上步骤后,在IDEA中引导类的配置界面里设置JVM启动参数。如下:
分别启动两个项目,然后访问/consumer
接口:
此时,到SkyWalking的监控页面上,进入“追踪”页面,并选择正确的时间范围,就可以看到该接口的链路追踪信息:
服务拓扑图:
服务监控:
服务实例监控:
端点监控:
如果项目正确集成agent成功后,却依旧发现监控页面上没有数据,日志里又没有错误信息的话,很有可能是时间范围没有选择正确: