1、SkyWalking是什么

官网地址:http://skywalking.apache.org/

SkyWalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8S、Mesos)架构而设计;
SkyWalking是观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案;

2、SkyWalking功能

SkyWalking是一个开源APM系统,包括对Cloud Native体系结构中的分布式系统的监视,跟踪,诊断功能。 核心功能如下。

  • 服务,服务实例,端点指标分析
  • 根本原因分析
  • 服务拓扑图分析
  • 服务,服务实例和端点依赖关系分析
  • 检测到慢速服务和端点
  • 性能优化
  • 分布式跟踪和上下文传播
  • 数据库访问指标。 检测慢速数据库访问语句(包括SQL语句)。
  • 报警
  • SkyWalking支持从多种来源和多种格式收集遥测(跟踪和度量)数据,包括
  • SkyWalking格式的Java,.NET Core,NodeJS和PHP自动仪器代理
  • SkyWalking格式的手动仪器Go代理。
  • Istio遥测格式
  • 由Istio控制的服务网格中的Envoy gRPC访问日志服务(ALS)格式
  • 特使指标服务格式
  • Zipkin v1 / v2格式
  • Jaeger gRPC格式

3、整体架构

在这里插入图片描述
整个架构,分成上、下、左、右四部分:
考虑到让描述更简单,我们舍弃掉 Metric 指标相关,而着重在 Tracing 链路相关功能。

  • 上部分 Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而我们目前采用的是,SkyWalking Agent 收集 SkyWalking Tracing 数据,传递给服务器。
  • 下部分 SkyWalking OAP :负责接收 Agent 发送的 Tracing 数据信息,然后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query )功能。
  • 右部分 Storage :Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而我们目前采用的是 ES ,主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主。
  • 左部分 SkyWalking UI :负责提供控台,查看链路等等。

SkyWalking 的中文文档: https://github.com/SkyAPM/document-cn-translation-of-skywalking

4、SkyWalking实战

我们实战搭建一下SkyWalking单机环境
在这里插入图片描述

4.1 ElasticSearch搭建

SkyWalking数据持久化支持多种数据源,这里数据源选择使用ElasticSearch,版本为V7.4.0

【注】如果项目中也使用ElasticSearch,不建议SkyWalking与项目使用同一个ElasticSearch。因为SkyWalking会在ES中创建大量索引并且比较消耗内存。

ES搭建建议大家使用Docker进行安装
1、配置参数

sysctl -w vm.max_map_count=262144 &&
grep vm.max_map_count /etc/sysctl.conf

2、下载镜像

docker pull elasticsearch:7.4.0

3、启动容器

docker run --name elasticsearch -d \
-v /home/elk/elasticsearch/data:/usr/share/elasticsearch/data \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:7.4.0

4、配置目录权限
由于容器目录映射到宿主机目录,需要给宿主机目录授权。我这里就省事配置777了。

chmod 777 /home/elk/elasticsearch/data

5、验证

curl http://127.0.0.1:9200

看到如下结果证明安装成功

{
 
    "name": "0a50cb561c04",
    "cluster_name": "docker-cluster",
    "cluster_uuid": "DFu_C31fQwqhzLyTko6wGg",
    "version": {
        "number": "7.4.0",
        "build_flavor": "default",
        "build_type": "docker",
        "build_hash": "b7e28a7",
        "build_date": "2019-04-05T22:55:32.697037Z",
        "build_snapshot": false,
        "lucene_version": "8.0.0",
        "minimum_wire_compatibility_version": "6.7.0",
        "minimum_index_compatibility_version": "6.0.0-beta1"
    },
    "tagline": "You Know, for Search"
 
}

4.2 安装配置SkyWalking

官方下载地址:http://skywalking.apache.org/downloads/

【注】需要注意版本,我开始使用SkyWalking7.0.0版本,发现无法监控到我的服务,后来我切换到最新 的8.0.1解决了问题。

下载最新版本V8.0.1Binary Distribution for ElasticSearch 7版本

 wget https://mirror.bit.edu.cn/apache/skywalking/8.0.1/apache-skywalking-apm-es7-8.0.1.tar.gz

修改/apache-skywalking-apm-bin-es7/config/application.yml配置文件中的数据源,默认使用H2,我们切换成ES。

storage:
  # 切换数据源
  selector: ${SW_STORAGE:elasticsearch7}
  elasticsearch:
    nameSpace: ${SW_NAMESPACE:""}
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
    protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
    trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""}
    trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""}
    user: ${SW_ES_USER:""}
    password: ${SW_ES_PASSWORD:""}
    secretsManagementFile: ${SW_ES_SECRETS_MANAGEMENT_FILE:""} # Secrets management file in the properties format includes the username, password, which are managed by 3rd party tool.
    dayStep: ${SW_STORAGE_DAY_STEP:1} # Represent the number of days in the one minute/hour/day index.
    indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} # The index shards number is for store metrics data rather than basic segment record
    superDatasetIndexShardsFactor: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR:5} # Super data set has been defined in the codes, such as trace segments. This factor provides more shards for the super data set, shards number = indexShardsNumber * superDatasetIndexShardsFactor. Also, this factor effects Zipkin and Jaeger traces.
    indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
    # 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}
    profileTaskQueryMaxSize: ${SW_STORAGE_ES_QUERY_PROFILE_TASK_SIZE:200}
    advanced: ${SW_STORAGE_ES_ADVANCED:""}
  elasticsearch7:
  	# 配置自己安装ES的nameSpace
    nameSpace: ${SW_NAMESPACE:"docker-cluster"}
    # 配置ES的连接信息
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.0.4:9200}
    protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
    #trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""}
    #trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""}
    dayStep: ${SW_STORAGE_DAY_STEP:1} # Represent the number of days in the one minute/hour/day index.
    #user: ${SW_ES_USER:""}
    #password: ${SW_ES_PASSWORD:""}
    secretsManagementFile: ${SW_ES_SECRETS_MANAGEMENT_FILE:""} # Secrets management file in the properties format includes the username, password, which are managed by 3rd party tool.
    indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} # The index shards number is for store metrics data rather than basic segment record
    superDatasetIndexShardsFactor: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR:5} # Super data set has been defined in the codes, such as trace segments. This factor provides more shards for the super data set, shards number = indexShardsNumber * superDatasetIndexShardsFactor. Also, this factor effects Zipkin and Jaeger traces.
    indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
    # 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}
    profileTaskQueryMaxSize: ${SW_STORAGE_ES_QUERY_PROFILE_TASK_SIZE:200}
    advanced: ${SW_STORAGE_ES_ADVANCED:""}

由于SkyWalking UI的默认地址是8080,与很多中间件有冲突,建议大家修改一下

修改apache-skywalking-apm-bin-es7/webapp/webapp.yml

server:
  port: 18080

修改agent配置,apache-skywalking-apm-bin-es7/agent/config/agent.config

collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.0.4:11800}
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:1}

**

采样率修改

agent.sample_n_per_3_secs配置详解:

在访问量较少时,链路全量收集不会对系统带来多少负担,同时能够完整的观测到系统的运行状况。但是在访问量较大时,全量的链路收集,对链路收集的客户端(应用)、服务端(例如说 SkyWalking OAP Collector)、存储器(例如说 Elastcsearch)都会带来较大的性能开销,甚至会影响应用的正常运行。

因此,在访问量级较大的情况下,我们往往会选择抽样采样,只选择收集部分链路信息。SkyWalking Agent 在 agent/config/agent.config 配置文件中,定义了 agent.sample_n_per_3_secs 配置项,设置每 3 秒可收集的链路数据的数量。

启动SkyWalking

apache-skywalking-apm-bin-es7/bin/startup.sh

访问:http://127.0.0.1:18080 看到下图内容代表搭建完成。由于还没有配置服务,因为没有服务的监控信息。
在这里插入图片描述

5、服务添加至SkyWalking

搭建完成SkyWalking,我们需要将我们的应用服务添加到SkyWalking中。这个也非常简单。对代码无任何侵入性。

Idea 配置
如果我们是本地启动的项目,开发工具使用的IDEA,我们只需要在如下图所示地方配置启动附加信息即可。

javaagent配置的是agent对应的jar位置。
service_name配置建议使用服务的spring.application.name方便区分。

-javaagent:D:\Develop\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=leimingtech-admin-api

在这里插入图片描述
jar启动配置
我们的应用最终肯定是部署在服务器上的,因为我们需要在jar启动的时候配置SkyWalking连接信息。

java -javaagent:/opt/skywalking/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=leimingtech-operation-api -Xms256m -Xmx256m -Xmn250m  -jar leimingtech-operation-api.jar

一般生产环境多个服务肯定是部署在不同机器上,这时候可能会有疑问,我是需要在全部机器上都搭建SkyWalking么?肯定不是的!我们只需要把SkyWalking中的agent模块复制到另一台机器即可。

6、SkyWalking UI查看

启动完成项目,由于SkyWalking采用懒加载收集模式,我们需要先请求接口才能被SkyWalking监控到。
任意访问一个接口地址。查看SkyWalking UI。

APM视图:
在这里插入图片描述
拓扑图
在这里插入图片描述
链路追踪
在这里插入图片描述
链路追踪-SQL查看
在这里插入图片描述

参考文献

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐