SkyWalking是一款开源的应用性能监控系统,对比阿里云ARMS,可以对应用进行全方位监控,帮助研发人员快速定位出错接口、慢接口、重现调用参数、发现系统瓶颈,从而大幅提升线上问题诊断的效率,本文向大家介绍了Skywalking的相关部署及使用方法,能够帮助大家快速熟悉并接入Skywalking监控平台。
SkyWalking是分布式的应用性能管理APM(Application Performance Monitoring)工具,也被称为分布式追踪系统。
SkyWalking具有以下特性:
全自动探针监控,不需要修改应用程序代码。
手动探针监控,提供了支持OpenTracing标准的SDK。覆盖范围扩大到OpenTracing-Java支持的组件。
自动监控和手动监控可以同时使用,使用手动监控弥补自动监控不支持的组件,甚至私有化组件。
纯Java后端分析程序,提供RESTful服务,可为其他语言探针提供分析能力。
高性能纯流式分析。
SkyWalking的核心在于数据分析和度量结果的存储平台部分,通过HTTP或gRPC方式向SkyWalking Collector提交分析和度量数据。SkyWalking Collector对数据进行分析和聚合,存储到Elasticsearch、H2、MySQL、TiDB等其一即可,最后通过SkyWalking UI的可视化界面查看分析结果。Skywalking支持从多个来源和多种格式收集数据,支持多种语言的Skywalking Agent 、Zipkin v1/v2 、Istio勘测、Envoy度量等数据格式。
在Linux服务器中,下载SkyWalking。
当前选择8.5.0版本。由于当前使用的是Elasticsearch 6.8.18版本,因此选择Binary Distribution for ElasticSearch 6二进制包。下载命令如下。
wget https://archive.apache.org/dist/skywalking/8.5.0/apache-skywalking-apm-8.5.0.tar.gz
解压。
tar -zxvf apache-skywalking-apm-8.5.0.tar.gz
查看解压后的文件。
ll apache-skywalking-apm-bin/
返回结果如下。
在config目录下,打开application.yml文件。
mv apache-skywalking-apm-bin skywalking
cd skywalking/config/
vi application.yml
定位到storage部分,将默认的H2存储库改为elasticsearch,并按照以下说明配置。
storage:
selector: ${SW_STORAGE:elasticsearch}
elasticsearch:
nameSpace: ${SW_NAMESPACE:"skywalking-index"}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:10.128.119.4:9200,10.128.119.5:9200,10.128.119.6:9200}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
user: ${SW_ES_USER:"elastic"}
password: ${SW_ES_PASSWORD:"19e.com.cn"}
trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""}
trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""}
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} # Shard number of new indexes
indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:1} # Replicas number of new indexes
说明 SkyWalking服务默认使用H2存储,不具有持久存储的特性,所以需要将存储组件修改为elasticsearch。
注意 配置中仅指定用户名和密码即可,请注释trustStorePath和trustStorePass,否则会报错NoSuchFileException:../es_keystore.jks。
参数 |
说明 |
selector |
存储选择器。本文设置为elasticsearch6。 |
nameSpace |
命名空间。Elasticsearch实例中,所有索引的命名会使用此参数值作为前缀。 |
clusterNodes |
指定Elasticsearch实例的访问地址。 |
user |
Elasticsearch实例的访问用户名,默认为elastic。 |
password |
对应用户的密码。 |
可选:
修改监听的IP地址或端口号。
SkyWalking默认使用12800作为Rest API通信端口,11800为gRPC API端口,可在application.yml文件的core中修改,本文使用默认配置。
core:
selector: ${SW_CORE:default}
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}
可选:
在webapp目录下,修改webapp.yml配置。
本文使用默认配置,您也可以根据具体需求修改。
server:
port: 8080
collector:
path: /graphql
ribbon:
ReadTimeout: 10000
# Point to all backend's restHost:restPort, split by ,
listOfServers: 127.0.0.1:12800
在Linux服务器中,启动SkyWalking。
cd ../bin
./startup.sh
注意
在启动SkyWalking前,请确保Elasticsearch实例为正常状态。
执行./startup.sh命令,会同时启动Collector和UI。
启动成功后,返回如下结果。
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!
在浏览器中,访问http://
说明 初次使用SkyWalking连接Elasticsearch服务,启动会比较慢。因为SkyWalking需要向Elasticsearch服务创建大量的index,所以在未创建完成之前,访问这个页面会显示空白。此时可以通过查看日志来判断启动是否完成,日志路径为
Kubernetes 1.9.6以上
PV dynamic provisioning support on the underlying infrastructure (StorageClass)或已部署外部elasticsearch集群
Helm 2或3
skywalking-k8s
.
├── helm
│ └── skywalking
│ ├── files
│ │ └── conf.d
│ │ └── oap
│ └── templates
│ └── istio-adapter
├── jre-skywalking
│ ├── agent
│ │ ├── activations
│ │ ├── bootstrap-plugins
│ │ ├── config
│ │ ├── logs
│ │ ├── optional-plugins
│ │ ├── optional-reporter-plugins
│ │ └── plugins
│ └── bin
└── logo
文件位置helm/skywalking/values-my-es.yaml
说明:
oap.image.tag: 8.5.0-es6 # 设置oap组件镜像版本,对应es版本
oap.image.storageType: elasticsearch #设置存储类型
ui.image.tag: 8.5.0 #设置ui组件镜像版本,推荐与oap一一对应
ui.image.ingress.enabled: true #设置ui访问方式,是否使用ingress暴露服务
ui.image.service.type: ClusterIP #设置ui Service类型
elasticsearch.enabled: false #设置是否使用外部elasticsearch,如果使用外部elasticsearch,elasticsearch.enabled为false
elasticsearch.config.host: elasticsearch-master #设置外部elasticsearch地址
elasticsearch.config.port.http: 9200 #设置外部elasticsearch端口
elasticsearch.config.user: "elastic" #设置外部elasticsearch用户名
elasticsearch.config.password: "gyjxwh.com!" #设置外部elasticsearch密码
cd helm
export SKYWALKING_RELEASE_NAME=skywalking # 设置release名称
export SKYWALKING_RELEASE_NAMESPACE=default # 设置命名空间
helm install "${SKYWALKING_RELEASE_NAME}" skywalking -n "${SKYWALKING_RELEASE_NAMESPACE}" -f ./skywalking/values-my-es.yaml
application.yml #skywalking-oap应用配置
log4j2.xml #skywalking-oap日志配置
alarm-settings.yml #skywalking-oap告警配置
endpoint-name-grouping.yml
需要将需要更新的配置文件放置在files/conf.d/oap下:
cd helm
export SKYWALKING_RELEASE_NAME=skywalking # 设置release名称
export SKYWALKING_RELEASE_NAMESPACE=default # 设置命名空间
helm upgrade --force "${SKYWALKING_RELEASE_NAME}" skywalking -n "${SKYWALKING_RELEASE_NAMESPACE}" -f ./skywalking/values-my-es.yaml
cd helm
export SKYWALKING_RELEASE_NAME=skywalking # 设置release名称
export SKYWALKING_RELEASE_NAMESPACE=default # 设置命名空间
helm uninstall "${SKYWALKING_RELEASE_NAME}" -n "${SKYWALKING_RELEASE_NAMESPACE}"
下载 skywalking安装包并解压:
# 下载 skywalking-8.5.0 for es6 版本的发布包,与部署的 skywalking 后端版本一致
wget https://archive.apache.org/dist/skywalking/8.5.0/apache-skywalking-apm-8.5.0.tar.gz
# 将下载的发布包解压到当前目录
tar -zxvf apache-skywalking-apm-8.5.0.tar.gz
在前面步骤中解压的 skywalking 发行包的同级目录编写 Dockerfile 文件,具体内容如下:
FROM busybox:latest
LABEL maintainer="gaoyang"
COPY apache-skywalking-apm-bin/agent/ /usr/skywalking/agent/
在上述 Dockefile 文件中使用的基础镜像是 bosybox 镜像,而不是 SkyWalking 的发行镜像,这样可以确保构建出来的sidecar镜像保持最小。
构建镜像:
docker build -t skywalking-agent-sidecar:8.5.0 .
查看构建的镜像:
docker images |grep agent
skywalking-agent-sidecar 8.5.0 98290e961b49 5 days ago 32.6MB
给镜像打标签,并推送到镜像仓库:
docker tag skywalking-agent-sidecar:8.5.0 registry.cn-beijing.aliyuncs.com/gyjx/skywalking-agent-sidecar:8.5.0
docker push registry.cn-beijing.aliyuncs.com/gyjx/skywalking-agent-sidecar:8.5.0
以Sidecar的形式集成Agent并接入SkyWalking服务
1、查看无状态(Deployment)应用的YAML文件。
kubectl get deployment {deployment名称} -o yaml
2、编辑无状态(Deployment)应用的YAML文件。
kubectl edit deployment {Deployment名称} -o yaml
3、在YAML文件中的spec > template >spec层级下加入以下内容。
spec:
#构建初始化镜像(通过初始化镜像的方式集成SkyWalking Agent)
initContainers:
- image: registry.cn-shenzhen.aliyuncs.com/devan/skywalking-agent-sidecar:8.5.0
name: sw-agent-sidecar
imagePullPolicy: IfNotPresent
command: [ "sh" ]
args:
[
"-c",
"cp -R /usr/skywalking/agent/* /skywalking/agent",
]
volumeMounts:
- mountPath: /skywalking/agent
name: sw-agent
containers:
- name: spring-boot-skywalking-demo
image: ${ORIGIN_REPO}/spring-boot-skywalking-demo:${IMAGE_TAG}
imagePullPolicy: Always
env:
........
........
#这里通过JAVA_TOOL_OPTIONS,而不是JAVA_OPTS可以实现不通过将agent命令加入到java应用jvm参数而实现agent的集成
- name: JAVA_TOOL_OPTIONS
value: -javaagent:/usr/skywalking/agent/skywalking-agent.jar
- name: SW_AGENT_NAME
value: spring-boot-skywalking-demo
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
# FQDN: servicename.namespacename.svc.cluster.local
value: skywalking-oap.default.svc:11800
........
........
volumeMounts:
- mountPath: /usr/skywalking/agent
name: sw-agent
volumes:
- name: sw-agent
emptyDir: { }
1、查看无状态(Deployment)应用的YAML文件。
kubectl get deployment {deployment名称} -o yaml
2、在templates/deployment.yaml文件中的spec > template > spec层级下加入以下内容。
spec:
#构建初始化镜像(通过初始化镜像的方式集成SkyWalking Agent)
initContainers:
- image: registry.cn-shenzhen.aliyuncs.com/devan/skywalking-agent-sidecar:8.5.0
name: sw-agent-sidecar
imagePullPolicy: IfNotPresent
command: [ "sh" ]
args:
[
"-c",
"cp -R /usr/skywalking/agent/* /skywalking/agent",
]
volumeMounts:
- mountPath: /skywalking/agent
name: sw-agent
containers:
- name: spring-boot-skywalking-demo
........
........
volumeMounts:
- mountPath: /usr/skywalking/agent
name: sw-agent
volumes:
- name: sw-agent
emptyDir: { }
3、在values.yaml文件中的secret层级下加入以下内容。
secret:
# skywalking
JAVA_TOOL_OPTIONS: '-javaagent:/usr/skywalking/agent/skywalking-agent.jar'
SW_AGENT_NAME: 'xxx'
SW_AGENT_COLLECTOR_BACKEND_SERVICES: 'xxx'
SW_GRPC_LOG_SERVER_HOST: 'xxx'
SW_GRPC_LOG_SERVER_PORT: 'xxx'
SW_LOGGING_LEVEL: 'off'
4、保存配置后,应用将自动重启,以上配置生效。
2~5分钟后,若您的应用出现在skywalking控制台的页面中且有数据上报,则说明接入成功。
1、在resources/config/skw/下增加agent_dev/test/prod文件,并修改内容:
agent.namespace=xxxxxx
例如:agent.namespace=${SW_AGENT_NAMESPACE:xxxxxx}
agent.service_name={your_application_name}
例如:agent.service_name=${SW_AGENT_NAME:yyyygateway}
collector.backend_service=skywalking-oap.monitoring:11800 (生产环境)
例如:
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:skywalking-oap.monitoring:11800}
logging.file_name
例如:logging.file_name=${SW_LOGGING_FILE_NAME:yyyygateway-skywalking-api.log}
logging.level
例如:logging.level=${SW_LOGGING_LEVEL:error}
logging.dir
例如:logging.dir=${SW_LOGGING_DIR:/log}
plugin.toolkit.log.grpc.reporter.server_host=skywalking-oap.monitoring
例如:
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:skywalking-oap.monitoring}
1、修改基础镜像:
FROM development1/jre:1.8.0_192
更改为:
FROM development1/jre-arms-skw-jacoco:v20210701
2、增加构建命令:
RUN mkdir /home/admin/config/skw
COPY ./src/main/resources/config/skw /home/admin/config/skw/
开发环境,在values.yaml文件中的secret层级下加入以下内容:
secret:
# skywalking
JAVA_TOOL_OPTIONS: ' -javaagent:/home/admin/agent/skywalking-agent.jar -Dskywalking_config=/home/admin/config/skw/agent_dev.config'
测试环境,在values.yaml文件中的secret层级下加入以下内容:
secret:
# skywalking
JAVA_TOOL_OPTIONS: ' -javaagent:/home/admin/agent/skywalking-agent.jar -Dskywalking_config=/home/admin/config/skw/agent_test.config'
线上坏境,需要在values.yaml文件中的secret层级下加入以下内容:
secret:
# skywalking
JAVA_TOOL_OPTIONS: ' -javaagent:/home/admin/agent/skywalking-agent.jar -Dskywalking_config=/home/admin/config/skw/agent_prod.config'