Skywalking架构
快速开始
一直在寻找一款全能的监控平台,可以满足指标、日志、调用链等多方面一站式观察。Prometheus 在指标方面很强大,但调用链需要依赖需要依赖第三方。而Skywalking 可以一站式解决上面所有问题,其工作原理比较简单,易于二次开发。其架构分为服务端、收集端、前端。收集端既支持后台服务也支持前端服务,例如java项目可以以javaagent 的方式集成skywalking-agent.jar组件,这个组件会读取配置文件(agent.config)并拉起插件(默认拉起 plugins、activations两个目录下的插件),而收集日志和指标的任务都是依赖这些插件完成的,比如要忽视某些方法被追踪,那就使用apm-trace-ignore-plugin-x.x.x.jar 插件;如果想增强某些方法那就使用apm-customize-enhance-plugin-x.x.x.jar 插件等。
OAP服务
启动OAP服务,OAP服务相当于Skywalking的后台服务,这里采用docker的安装方式,skywalking 默认内置H2存储,也可以是ES、Mysql等,下面介绍两种docker启动方案,当然你也可以直接下载分发版本通过本地的方式启动。
方案一: 使用缺省的H2作为存储启动,适合本地测试环境
docker run --name oap -p 11800:11800 -p 12800:12800 -e TZ=Asia/Shanghai --restart always -d apache/skywalking-oap-server:8.6.0-es7
docker run --name oapui --link oap:oap -p 8080:8080 -e TZ=Asia/Shanghai -e SW_OAP_ADDRESS=oap:12800 --restart always -d apache/skywalking-ui:8.6.0
方案二:使用ES作为存储启动,适合生产环境
使用 docker-compose部署skywalking的三个基础服务:ES、OAP、WEB
version: '3'
services:
es7:
container_name: es7
hostname: es7
image: elasticsearch:7.5.1
expose:
- 9200
- 9300
networks:
- e2e
environment:
- discovery.type=single-node
oap:
container_name: oap
hostname: oap
image: apache/skywalking-oap-server:8.7.0-es7
expose:
- 11800
- 12800
- 5005
networks:
- e2e
restart: on-failure
environment:
- SW_STORAGE=elasticsearch7
- SW_STORAGE_ES_CLUSTER_NODES="es7:9200"
healthcheck:
test: ["CMD", "sh", "-c", "nc -zn 127.0.0.1 11800"]
interval: 5s
timeout: 60s
retries: 120
depends_on:
- "es7"
ui:
image: apache/skywalking-ui:8.7.0
ports:
- "8080:8080"
networks:
- e2e
environment:
- SW_OAP_ADDRESS=http://oap:12800
depends_on:
- "oap"
networks:
e2e:
Agent端
在springboot项目集成Skywalking Agent
1.解压apache-skywalking-apm-8.6.0.tar.gz,设置-javaagent:指向解压后的skywalking-agent.jar位置,不能拷贝出来,因为它会通过这个jar来识别当前config 和 plugin目录,同时这个jar会依赖日志、跟踪、指标等相关jar包。
2.先请求springboot服务,请求完后,一定要等一会,点一下右上角刷新按钮才有数据,这些数据缺省会被保存3天,可以调整服务端 recordDataTTL 参数
3.服务名称agent.service_name如果要分组可以命名为:mygroup::myapp,这样所有服务就自动划分到mygroup组中
java -javaagent:D:\apache-skywalking-apm-bin\agent\skywalking-agent.jar \
-Dskywalking.agent.service_name=myapp \
-Dskywalking.agent.instance_name=myapp \
-Dskywalking.collector.backend_service=oap:11800 \
-jar myapp.jar
如果是idea,那么在Edit Configuration 中 VM Option中添加
-javaagent:skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=myapp -Dskywalking.agent.instance_name=myapp -Dskywalking.collector.backend_service=oap:11800
k8s中服务集成Skywalking Agent
在k8s 中 springboot项目集成Skywalking,推荐采用 sidecar形式
# myapp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
selector:
matchLabels:
app: myapp
replicas: 1
template:
metadata:
labels:
app: myapp
spec:
initContainers:
# 应用镜像
- image: myapp:3.0
imagePullPolicy: Always
name: app-container
command: ["cp", "/myapp.jar", "/app"]
volumeMounts:
- mountPath: /app
name: app-volume
# skywalking镜像
- image: apache/skywalking-java-agent:8.7.0-alpine
name: agent-container
command: [ "/bin/sh" ]
args: [ "-c","cp /skywalking/agent/optional-plugins/apm-trace-ignore-plugin-8.7.0.jar /skywalking/agent/activations/ && cp -R /skywalking/agent /agent/"]
volumeMounts:
- name: skywalking-agent
mountPath: /agent
containers:
- name: jre-container
image: anapsix/alpine-java:8_server-jre_unlimited
imagePullPolicy: IfNotPresent
command: ["java","-jar","/usr/local/myapp.jar"]
args: ["--server.port=9086","--spring.profiles.active=dev"]
volumeMounts:
- mountPath: /usr/local
name: app-volume
- name: skywalking-agent
mountPath: /skywalking
ports:
- name: container-port
containerPort: 9086
env:
- name: JAVA_TOOL_OPTIONS
value: "-javaagent:/skywalking/agent/skywalking-agent.jar -Dskywalking.trace.ignore_path=/eureka/**,SpringScheduled/**,Guav
aCache/**,Jedis/**,PostgreSQL/**"
# 应用名称
- name: SW_AGENT_NAME
valueFrom:
fieldRef:
fieldPath: metadata.labels['app']
# oap服务地址
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: "oap:11800"
#- name: SW_AGENT_TRACE_IGNORE_PATH
# value: "/actuator/health/**,/eureka/**,PostgreSQL/**,Jedis/**"
#- name: SW_MOUNT_FOLDERS
# value: "plugins,activations,optional-plugins"
volumes:
- name: app-volume
emptyDir: {}
- name: skywalking-agent
emptyDir: {}
---
#service
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
ports:
- port: 9086
protocol: TCP
targetPort: container-port
selector:
app: myapp
type: ClusterIP
Web前端
整体概览
Skywalking UI
服务概览
Service界面显示某个服务运行情况,当选择不同服务时,相应指标也会变化
同一个服务部署在多个节点上,就会形成多个实例,这时服务显示的就是多个实例的整体运行情况
当前端点可以查看当前服务的某个请求的请求状况