skywalking(一)skywalking简介、部署及实现收集java博客追踪
一、skywalking架构
Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的开源项目, 2017年12月SkyWalking成为Apache国内首个个人孵化项目, 2019年4月17日SkyWalking从Apache基金会的孵化器毕业成为顶级项目,目前SkyWalking支持Java、.Net、Node.js、go、python等探针,数据存储支持MySQL、 ElasticSearch等, SkyWalking与Pinpoint相同,对业务代码无侵入,不过探针采集数据粒度相较于Pinpoint来说略粗, 但性能表现优秀, 目前SkyWalking增长势头强劲, 社区活跃, 中文文档齐全, 没有语言障碍,支持多语言探针,这些都是SkyWalking的优势所在,还有就是SkyWalking支持很多框架,包括很多国产框架,例如,Dubbo、gRPC、SOFARPC等,同时也有很多开发者正在不断向社区提供更多插件以支持更多组件无缝接入SkyWalking。
https://skywalking.apache.org/
1.1 特点
- 实现从请求跟踪、指标收集和日志记录的完整信息记录
- 多语言自动探针,支持Java、GO、Python、PHP、NodeJS、LUA、Rust等客户端
- 内置服务网格可观察性,支持从Istio+Envoy Service Mesh收集和分析数据
- 模块化架构,存储、集群管理、使用插件集合都可以进行自由选择
- 支持告警
- 优秀的可视化效果
1.2 组件

- OAP平台(Observability Analysis Platform,可观测性分析平台)或OAP Server,它是一个高度组件化的轻量级分析程序,由兼容各种探针Receiver、流式分析内核和查询内核三部分构成。
- 探针:基于无侵入式的收集,并通过HTTP或者gRPC方式发送数据到OAP Server。
- 存储实现(Storage lmplementors),SkyWalking OAP Server支持多种存储实现并且提供了标准接口,可支持不同的存储后端。
- UI模块(SkyWalking),通过标准的GraphQL(Facebook在2012年开源)协议进行统计数据查询和展示。
1.3 设计模式
1.3.1 面向协议设计
面向协议设计是skywalking从5.x开始严格遵守的首要设计原则,组件之间使用标准的协议进行数据交互
1.3.2 协议有探针协议和查询协议
- 探针协议
- 探针上报协议:协议包括语言探针的注册、Metrics数据上报、Tracing数据上报等标准,Java、Go等探针都需要严格遵守此协议的标准。
- 探针交互协议:因为分布式追踪环境,探针间需要借助HTTP Header、MQ Header在应用之间进行通信和交互,探针交互协议就定义了交互的数据格式。
- Service Mesh协议:是SkyWalking对Service Mesh抽象的专有协议,任何Mesh类的服务都可以通过此协议直接上传指标数据,用于计算服务的指标数据和绘制拓扑图。
- 第三方协议:对大型的第三方开源项目尤其是Service Mesh核心平台Istio和Envoy,提供核心协议适配,支持针对lstio+Envoy Service Mesh进行无缝对接。
- 数据查询协议
- 元数据查询:查询在SkyWalking注册的服务、服务实例、Endpoint等元数据信息。
- 拓扑关系查询:查询全局、或者单个服务、Endpoint的拓扑图及依赖关系。
- Metrics指标查询:查询指标数据。
- 聚合指标查询:区间范围均值查询及Top N排名数据查询等。
- Trace查询:追踪数据的明细查询。
- 告警查询:基于表达式,判断指标数据是否超出阈值
1.4 skywalking设计
- 模块化设计
- 探针负责收集数据
- 前端负责展示数据
- 后端负责从后端存储读写数据
- 后端储存负责持久化数据
- 轻量化设计
skywalking在设计之初就提出了轻量化的设计理念,skywalking使用最轻量级的jar包模式,实现强大的数据处理和分析能力、可扩展能力和模块化能力。
1.5 skywalking优势
-
兼容性好
支持传统的部署架构dubbo和spring cloud,也支持云原生中的Istio和Envoy
-
易于部署和后期维护
组件化,可以自定义部署,后期横向扩容简单
-
高性能
每天数T的数据无压力
-
易于二次开发
标志的http和grpc协议,开源项目,企业可以自主二次开发
1.6 skywalking与其他特性对比

二、skywalking部署

skywalking-ui:前端服务,端口号8080
skywalking-oap(Observability Analysis Platform) :可观测性分析平台,11800为gRPC数据端口,12800为http数据端口
es:9200为elasticsearch的数据读写端口,skywalking支持的存储有elasticsearch、h2、mysql、tidb、influxdb、postgresql等
agent:app服务器部署skywalking agent,用于收集app中的访问请求
2.1 docker-compose部署skywalking
2.1.1 安装docker
#! /bin/bash # docker版本 docker_version=5:20.10.10~3-0 apt update # 安装依赖包 apt install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release \ software-properties-common # 安装GPG证书 curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=$(dpkg --print-architecture)] http://mirrors.aliyun.com/docker-ce/linux/ubuntu \ $(lsb_release -cs) stable" apt update # apt-cache madison docker-ce docker-ce-cli apt -y install docker-ce=${docker_version}~ubuntu-$(lsb_release -cs) \ docker-ce-cli=${docker_version}~ubuntu-$(lsb_release -cs) # 关闭防火墙 systemctl disable firewalld && systemctl stop firewalld # 在/etc/hosts中添加IP、主机名 cat >> /etc/hosts <<EOF `hostname -I|awk '{print $1}'` `hostname` EOF # 内核参数优化 cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter EOF cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sudo sysctl --system # 设置docker的cgroup driver # docker 默认的 cgroup driver 是 cgroupfs,可以通过 docker info 命令查看 # 如果用户没有在 KubeletConfiguration 下设置 cgroupDriver 字段,则 kubeadm 将默认为systemd,需要将docker cgroup driver更改为systemd # 配置docker hub镜像加速 cat <<EOF >/etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://ung2thfc.mirror.aliyuncs.com", "https://registry.docker-cn.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"] } EOF # systemctl daemon-reload # systemctl restart docker # 关闭swap # 在/etc/fstab注释swap那一行 sed -ri 's/(^[^#]*swap)/#\1/' /etc/fstab echo 'swapoff -a' >> /etc/profile swapoff -a # 修改grub sed -i '/GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"/c GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 cgroup_enable=memory swapaccount=1"' /etc/default/grub update-grub reboot
验证docker
[root@skywalking opt]#docker -v Docker version 19.03.15, build 99e3ed8919
2.1.2 安装docker-compose
wget https://github.com/docker/compose/releases/download/v2.12.0/docker-compose-linux-x86_64 #wget https://shichu.fun/download/packages/docker/compose/releases/download/v2.12.0/docker-compose-linux-x86_64 chmod a+x docker-compose-linux-x86_64 mv docker-compose-linux-x86_64 /usr/bin/docker-compose
验证docker-compose
[root@skywalking opt]#docker-compose -v Docker Compose version v2.12.0
2.1.3 编写docker-compose.yaml文件
version: '3.3' services: es7: image: elasticsearch:7.10.1 container_name: es7 ports: - 9200:9200 - 9300:9300 environment: - discovery.type=single-node #单机模式 - bootstrap.memory_lock=true #锁定物理内存地址 - "ES_JAVA_OPTS=-Xms1048m -Xmx1048m" #堆内存大小 - TZ=Asia/Shanghai ulimits: memlock: soft: -1 hard: -1 volumes: - /data/elasticsearch/data:/usr/share/elasticsearch/data skywalking-oap: image: apache/skywalking-oap-server:8.6.0-es7 container_name: skywalking-oap restart: always depends_on: - es7 links: - es7 ports: - 11800:11800 - 12800:12800 environment: TZ: Asia/Shanghai SW_STORAGE: elasticsearch7 SW_STORAGE_ES_CLUSTER_NODES: es7:9200 skywalking-ui: image: apache/skywalking-ui:8.6.0 container_name: skywalking-ui restart: always depends_on: - skywalking-oap links: - skywalking-oap ports: - 8080:8080 environment: TZ: Asia/Shanghai SW_OAP_ADDRESS: skywalking-oap:12800
若网络不好,可先手动下载镜像
# 查看要下载镜像 [root@skywalking opt]#grep 'image:' docker-compose.yaml image: elasticsearch:7.10.1 image: apache/skywalking-oap-server:8.6.0-es7 image: apache/skywalking-ui:8.6.0 # 下载镜像 docker pull elasticsearch:7.10.1 docker pull apache/skywalking-oap-server:8.6.0-es7 docker pull apache/skywalking-ui:8.6.0
执行创建
# 创建目录 [root@skywalking opt]#mkdir -p /data/elasticsearch/data # 授权 [root@skywalking opt]#chmod -R 777 /data/elasticsearch/data # 创建服务 [root@skywalking opt]#docker-compose up -d [+] Running 4/4 ⠿ Network opt_default Created 0.0s ⠿ Container es7 Started 0.6s ⠿ Container skywalking-oap Started 0.9s ⠿ Container skywalking-ui Started
2.1.4 验证端口
查看容器状态
[root@skywalking opt]#docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c380754d39e1 apache/skywalking-ui:8.6.0 "bash docker-entrypo…" 18 seconds ago Up 16 seconds 0.0.0.0:8080->8080/tcp skywalking-ui 6d175936e7c5 apache/skywalking-oap-server:8.6.0-es7 "bash docker-entrypo…" 19 seconds ago Up 17 seconds 0.0.0.0:11800->11800/tcp, 1234/tcp, 0.0.0.0:12800->12800/tcp skywalking-oap 37555dd061e1 elasticsearch:7.10.1 "/tini -- /usr/local…" 19 seconds ago Up 18 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp es7
查看端口
[root@skywalking opt]#netstat -ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name ... tcp6 0 0 :::12800 :::* LISTEN 13452/docker-proxy # skywalking-oap tcp6 0 0 :::2049 :::* LISTEN - tcp6 0 0 :::111 :::* LISTEN 1/init tcp6 0 0 :::8080 :::* LISTEN 13062/docker-proxy # skywalking-ui tcp6 0 0 :::9200 :::* LISTEN 12761/docker-proxy # elasticsearch tcp6 0 0 :::43345 :::* LISTEN 794/rpc.mountd tcp6 0 0 :::54163 :::* LISTEN 794/rpc.mountd tcp6 0 0 :::9300 :::* LISTEN 12749/docker-proxy # elasticsearch tcp6 0 0 :::22 :::* LISTEN 886/sshd: /usr/sbin tcp6 0 0 :::11800 :::* LISTEN 13467/docker-proxy # skywalking-oap tcp6 0 0 :::41369 :::* LISTEN -
2.1.5 验证skywalking server

2.1.6 验证elasticsearch

Elasticsearch Head插件查看

2.2 二进制部署skywalking
主机清单
类型 | IP | 主机名 | VIP |
---|---|---|---|
Elasticsearch-node1/Kibana |
10.0.0.71 |
es1 |
10.0.0.70 |
Elasticsearch-node2 | 10.0.0.72 | es2 | |
Elasticsearch-node3 | 10.0.0.73 | es3 | |
skywalking oap | 10.0.0.91 | skywalking-server |
2.2.1 部署elasticsearch集群
部署方法参考:部署Elasticsearch
验证

2.2.2 部署skywalking server
- 安装jdk11
# apt安装 apt update apt install openjdk-11-jdk -y # 验证版本 [root@skywalking-server ~]#java --version openjdk 11.0.20.1 2023-08-24 OpenJDK Runtime Environment (build 11.0.20.1+1-post-Ubuntu-0ubuntu120.04) OpenJDK 64-Bit Server VM (build 11.0.20.1+1-post-Ubuntu-0ubuntu120.04, mixed mode, sharing)
- 安装skywalking
下载地址:https://archive.apache.org/dist/skywalking/
# 下载 mkdir /apps cd /apps wget https://archive.apache.org/dist/skywalking/9.1.0/apache-skywalking-apm-9.1.0.tar.gz # 解压 tar xvf apache-skywalking-apm-9.1.0.tar.gz
- 修改配置
cd apache-skywalking-apm-bin/ # 修改配置文件 vim config/application.yml ... # 修改存储配置 132 storage: 133 selector: ${SW_STORAGE:elasticsearch} # 选择elasticsearch存储 134 elasticsearch: 135 namespace: ${SW_NAMESPACE:""} 136 clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:10.0.0.71:9200,10.0.0.73:9200,10.0.0.73:9200} # es集群地址
- 启动服务
[root@skywalking-server apache-skywalking-apm-bin]#bin/startup.sh SkyWalking OAP started successfully! SkyWalking Web Application started successfully! # 查看端口 [root@skywalking apache-skywalking-apm-bin]#netstat -ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name ... tcp6 0 0 :::12800 :::* LISTEN 5382/java tcp6 0 0 :::8080 :::* LISTEN 5405/java tcp6 0 0 :::22 :::* LISTEN 876/sshd: /usr/sbin tcp6 0 0 :::11800 :::* LISTEN 5382/java
- 验证

skywalking数据已存入elasticsearch

三、skywalking实现收集java博客追踪
3.1 halo博客实现链路追踪案例
halo博客参考:https://docs.halo.run/getting-started/prepare/
3.1.1 下载安装包
agent下载地址:https://skywalking.apache.org/downloads/#Agents
# 安装java环境 apt update apt install openjdk-11-jdk -y # 创建目录 mkdir -p /data mkdir /apps # 下载skywalking java agent的 cd /data wget https://archive.apache.org/dist/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz tar xvf apache-skywalking-java-agent-9.0.0.tgz # 下载halo wget https://dl.halo.run/release/halo-1.4.17.jar -O /apps/halo-1.4.17.jar
3.1.2 修改配置
vim /data/skywalking-agent/config/agent.config ... # The service name in UI # 服务名称 # ${service name} = [${group name}::]${logic name} # The group name is optional only. agent.service_name=${SW_AGENT_NAME:halo-service} # The agent namespace # agent agent.namespace=${SW_AGENT_NAMESPACE:halo} # Backend service addresses. # 后端服务即skywalking-oap平台地址,11800为grpc端口,12800为http端口 collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:10.0.0.91:11800}
3.1.3 启动服务
java -javaagent:/data/skywalking-agent/skywalking-agent.jar -jar /apps/halo-1.4.17.jar

3.1.4 验证8090端口
[root@halo ~]#netstat -ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:50349 0.0.0.0:* LISTEN 831/rpc.mountd tcp 0 0 0.0.0.0:57773 0.0.0.0:* LISTEN 831/rpc.mountd tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 17024/systemd-resol tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 4297/sshd: /usr/sbi tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 1803/sshd: root@pts tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 1803/sshd: root@pts tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:38243 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:50915 0.0.0.0:* LISTEN 831/rpc.mountd tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::51475 :::* LISTEN 831/rpc.mountd tcp6 0 0 :::22 :::* LISTEN 4297/sshd: /usr/sbi tcp6 0 0 :::35575 :::* LISTEN - tcp6 0 0 :::8090 :::* LISTEN 99844/java tcp6 0 0 ::1:6010 :::* LISTEN 1803/sshd: root@pts tcp6 0 0 ::1:6011 :::* LISTEN 1803/sshd: root@pts tcp6 0 0 :::2049 :::* LISTEN - tcp6 0 0 :::38467 :::* LISTEN 831/rpc.mountd tcp6 0 0 :::51557 :::* LISTEN 831/rpc.mountd
3.2 验证skywalking采集数据
- 服务(Service)
表示对请求提供相同行为的一系列或一组负载(服务名称),在使用Agent或SDK的时候,可以自定义服务的名字,如果不定义的话,SkyWalking将使用在平台(如Istio)上定义的名字。

- 拓扑

- 链路追踪

四、skywalking性能指标
选择指定service name,查看性能指标数据。
Apdex全称是Application Performance Index即应用性能指数,是由Apdex联盟开放的用于评估应用性能的标准,Apdex联盟起源于2004,Apdex标准从用户的角度出发,提供一个统一的测量和报告用户体验的方法,将其量化为范围为0-1的满意度评价,把最终用户的体验和应用性能作为一个完整的指标进行统一度量。
在网络中运行的任何一个应用(Web服务),它的响应时间决定了用户的满意程度,用户等待所有交互完成时间的长短直接影响了用户对应用的满意程度,这才是对用户有真正意义的“响应时间”,Apdex把完成这样一个任务所用的时间长短称为应用的“响应性”。
Apdex定义了应用响应时间的最优门槛为T,另外根据应用响应时间结合T定义了三种不同的性能表现:
-
Satisfied(满意)
应用响应时间小于或等于Apdex阈值,比如Apdex阈值为1s,则一个耗时0.6s或者1s的响应结果则可以认为是满意的。
-
Tolerating(可容忍)
应用响应时间大于Apdex阈值,但同时小于或等于4倍的Apdex阈值,假设应用设定的Apdex阈值为1s,则4*1=4s为应用响应时间的容忍上限。
-
Frustrated(烦躁期)
应用响应时间大于4倍的Apdex阈值。
Apdex =(正常请求数 + 可容忍请求数 / 2)/ 请求总数。示例如下:
服务A定义:T=200ms,在100个采样中,有20个请求小于200ms,有60个请求在200ms到800ms之间,有20个请求大于800ms。计算apdex = (20 + 60/2)/100 = 0.5。
4.1 Overview
显示服务的全局统计详情。
-
Service Apdex(数字)
当前服务的评分,1为满分
-
Success Rate (数字)
请求成功率
-
Servce Load (calls/min)(数字)
每分钟请求数
-
Service Avg Response Times (ms)
平均响应延时,单位ms
-
Service Apdex(折线图)
不同时间的Apdex评分
-
Service Response Time Percentile(ms)
百分比响应延时
-
Success Rate(折线图)
不同时间的请求成功率
-
Servce Load (calls/min)(折线图)
不同时间的每分钟请求数
-
Message Queue Consuming Count
消息队列消耗计数
-
Message Queue Avg Consuming Latency (ms)
消息队列平均消耗延迟(毫秒)
-
Service Instances Load (calls /min)
每个服务实例的每分钟请求数
-
Slow Service lnstance(ms)
每个服务实例的最大延时
-
Service Instance Successful Rate
每个服务实例的请求成功率
-
Endpoint Load in Current Service (calls / min)
每个端点(URL)的请求次数
-
Slow Endpoints in Current Service (ms)
当前端点(URL)的最慢响应时间
-
Success Rate in Current Service (%)
当前服务成功率(%)

4.2 instance
上述的一组工作负载中的每一个工作负载成为一个实例(一个服务运行的节点),一个服务实例可以是一个kubernetes中的pod或者是一个虚拟机甚至是物理机。

overview
-
Service Instance Load (calls/min)
当前实例的每分钟请求数
-
Service Instance Successful Rate (%)
当前实例的请求成功率
-
Service Instance Latency (ms)
当前实例的响应延时
-
Database Connection Pool
数据库连接池信息
-
Thread Pool
线程池信息

JVM信息
-
JVM CPU (%)
jvm占用CPU的百分比
-
JVM Memory (MB)
JVM内存占用大小,羊位m,包括堆内存,与堆外内存(直接内存).
-
JVM GC Time (ms)
JVM垃圾回收时间,包含YGC和OGC
-
JVM GC Count
JVM垃圾回收次数,,包含YGC和OGC
-
JVM Thread Count
JVM线程计数
instance_jvm_thread_live_count:实例jvm线程活动计数
instance_jvm_thread_daemon_count:实例jvm线程守护进程计数,
instance_jvm_thread_peak_count :实例jvm线程峰值计数 -
JVM Thread State Count
JVM线程状态计数
instance jvm thread runnable state thread count:实例jvm线程可运行状态线程计数
instance jvm thread blocked state thread count :实例jvm线程阻塞状态线程计数
instance jvm thread waiting state thread count :实例jvm线程等待状态线程计数
instance jvm thread timed waiting state thread count :实例jvm线程定时等待状态线程计数 -
JVM Class Count
JVM类计数
instance jvm class loaded class count:实例jvm类加载类计数
instance jvm class total unloaded class count:实例jvm类总卸载类计数
instance jvm class total loaded class count:实例jvm类总加载类计数

.net指标

4.3 endpoint
端点(Endpoint):对于特定服务所接收的请求路径,如HTTP的URL路径和gRPC服务的类+方法签名,如/api/v1/
-
Endpoints
URL
-
Load (calls / min)
平均请求次数(默认时间范围半小时),比如半小时内总请求次数6次,6%30=0.20
-
Success Rate (%)
平均成功率(默认时间范围半小时)
-
Latency (ms)
平均延迟时间(默认时间范围半小时)

overview
-
Endpoint Load (calls / min)
当前端点每分钟的请求数据
-
Endpoint Avg Response Time (ms)
当前端点每个时间段的请求行响应时间
-
Endpoint Response Time Percentile (ms)
当前端点每个时间段的响应时间占比
-
Endpoint Success Rate (%)
当前端点每个时间段的请求成功率
-
Message Queue Consuming Count
消息队列消耗计数
-
Message Queue Avg Consuming Latency (ms)
消息队列平均消耗延迟(毫秒)

拓扑

追踪
同一个URL的请求追踪信息

4.4 topology
拓扑
4.5 trace
不同URL的追踪请求信息

4.6 trace profiling
追踪分析


【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求