一 什么是 Skywalking?
Skywalking 时一个开源的分布式追踪系统,用于检测、诊断和优化分布式系统的功能。它可以帮助开发者和运维人员深入了解分布式系统中各个组件之间的调用关系、性能瓶颈以及异常情况,从而提供系统级的性能优化和故障排查。
1.1 为何使用 Skywalking
- 监控分布式系统:在分布式系统中,各个组件之间的调用链错综复杂,难以进行全面的监控和诊断。SkyWalking 提供了完善的分布式追踪功能,可以帮助开发者全面了解分布式系统的调用关系、性能瓶颈和异常情况,提供系统级的监控和诊断能力。
- 异常排查:当系统发生异常或错误时,需要及时定位问题并进行配查。SkyWalking 可以捕获和记录系统中的异常情况,并在调用链中标记异常的来源和传播路径,帮助开发者快速定位问题和解决问题。
1.2 同类产品分析
- pinpoint:韩国团队开发,优点:UI丰富。缺点:探针收集的数据粒度非常细,但性能损耗大。
- CAT:大众点评开发,优点:报表功能强大。缺点:有业务侵入性、代码比较老旧。
- Zipkin:Twitter 公司开发,它的优点:轻松接入 Spring Cloud 官方推荐 APM(Application Performance Management,系统性能管理)系统。缺点:有一定侵入性,但比 CAT 框架强一些。
- Skywalking:国人开发,Apache 孵化和运营。它的优点:无侵入、性能优秀、社区活跃、支持广泛、中文文档比较齐全。
1.3 Skywalking 组成
- 探针(Agent):提供了系统的原始数据。
- OAP 服务:Observability Analysis Platform,可观性分析平台。它的功能主要有两个:
a. 收集数据、加工处理并持久化。
b. 给 UI 界面提供查询服务。 - UI界面:展示数据信息
1.4 Skywalking 本质
Skywalking 本质是一个 APM(Application Performance Management, 系统性能管理)系统
而 APM 通常是实现 Open Tracing 标准的系统,OpenTracing 是一个开放标准和规范,用于实现分布式应用程序中的追踪和调用链分析。它提供了一种统一的API 和工具,使开发者能够在不同的应用程序中实现分布式追踪功能,并将各个组件之间的调用关系和性能指标汇总起来,用于分析和监控应用程序的性能。
OpenTracing 中主要包含了 Tracing 试图,Tracing 视图有两个明显的优点:
1. 清晰的看出每个模块的执行时长。
2. 清晰的看到问题和发现问题。
普通试图:
OpenTracing 试图:
二、Skywalking 服务安装与启动
Skywalking 支持的数据库有很多,例如 ElasticSearch、H2、MySQL、PostgreSql 等,但因为 ElasticSearch(下面简称 ES) 优秀的搜索性能,所以他几乎是 SkyWalking 的不二选择。
因此对于 Skywalking 的安装主要分为以下几步:
1. 安装并启动 ES
2. 安装并运行 Skywalking
- 运行 Skywalking 后端服务
- 运行 Skywalking UI 服务
2.1 ES 安装并启动
2.1.1 下载并解压 ES
ES 官方下载地址:Elasticsearch 8.9.2 | Elastic
选择对应的平台进行下载:
下载完成之后,解压下载包
解压之后的目录文件如下:
- bin:可执行脚本文件,包括启动服务命令,插件管理,函数命令
- config:配置文件目录,如ES配置、角色配置、JVM 配置等。
- lib:ES 所依赖的 jar 包库。
- data:默认的数据库存放目录,包含所有节点、分片、索引、文档的所有数据。
- logs:默认的日志存储路径
- modules:包含所有ES 包含的模块,如 Cluster、Discovery、Indices
- plugins:所有安装的插件的目录
2.1.2 删除环境变量
删除环境变量中配置的,Java 类中的 dt.jar 和 tool.jar,如果未配置这两个变量,那么此步骤可以忽略。
高版本的 Java lib 中未包含这两个 jar 包,如果不删除,那么 ES 会判断和使用这两个jar 包,然后启动就会出错。
2.1.3 预启动 ES
进入 bin 路径,Windows 系统双击 elasticsearch.bat 进行启动:
预启动是为了在配置文件中生成相关配置信息
等ES 启动之后,关闭控制,关闭ES服务。
2.1.4 关闭 HTTPS 认证
在配置文件 config/elasticsearch.yml 中将 xpack.security.htttp.ssl 中的 enabled 改为 "false" :
2.1.5 关闭授权登录
在 config/elasticsearch.yml 配置文件中将 xpack.security.enabled 改为 "false":
2.1.6 再次启动 ES
2.1.7 验证 ES
在网页中输入 :http://localhost:9200/ 可以看到如下信息就说明 ES启动成功
2.2 Skywalking 安装并启动
2.2.1 下载并解压 Skywalking
下载并解压 Skywalking,官方下载地址:Index of /dist/skywalking (apache.org)
解压后的目录:
- bin:包含了启动和运行 SkyWalking 的可执行程序和脚本文件。
- config:包含了 SkyWalking 的配置文件,用于配置 SkyWalking 的各种参数和选项。
- oap-libs:包含了 SkyWalking OAP(Open Analysis Platform)相关的库文件
- webapp:包含了 SkyWalking Web 模块的文件,用于运行和展示 SkyWalking 的监控数和分析结果。
- tools:包含了一些辅助工具和脚本,用于帮助安装、配置和运行 SkyWalking.
- liscenses:包含了 Apache SkyWalking APM 的开源许可证
2.2.2 修改配置文件
config/application.yml
2.2.3 启动 Skywalking
双击安装目录下的 bin/startup.bat 就可以启动,之后再浏览器访问:打开 Skywalking 的 UI 控制台:
注: 解压后的路径中不要带中文,否则肯能会报错: No files in meter-analyzer-config
三、上传数据值 Skywalking
3.1 下载 Agent 代理
官方下载地址:Downloads | Apache SkyWalking
下载解压 agent 得到以下文件
3.2 项目添加 Agent 代理
添加如下内容
-javaagent:D:\SCComponent\Skywalkings\skywalking-agent\skywalking-agent.jar
-Dskywalking.agent.service_name=provider
-Dskywalking.collector.backentd_service=127.0.0.1:11800
- -javaagent:填写你本地 skywalking-agent.jar 的路径
- -Dskywalking.agent.service_name:服务名称,在 Skywalking 端展示时使用。
- -Dsky walking。collector。backend_service:Skywalking 日志收集地址,固定端口号 11800,不需要修改。
为每个项目配置好上述内容后,再次访问 Skywalking 控制台就可以看到调用信息了,如图:
四、Skywalking 控制台说明
服务说明 UI 如下:
服务详情指标:
五、告警功能
告警功能开启和实现,需要以下两步:
5.1 设置告警规则
告警规则的设置需要在 config/alarm-settings.yml 下配置,总共配置两块内容。第一块 rules 下的规则:
另外,还需要开启告警提醒的 URL 地址,如图:
5.2 编写告警提醒代码
@Slf4j
@RestController
public class AlarmController {
@RequestMapping("/timeout")
public void timeout() throws InterruptedException {
Thread.sleep(1500);
}
@RequestMapping("/webhook")
public void webHolk(@RequestBody List<AlarmMessage> msg) {
log.error("===============================================");
log.error("告警信息" + msg);
}
}
class AlarmMessage implements Serializable {
private String scopeId;
private String name;
private String id0;
private String id1;
private String ruleName;
private String alarmMessage;
private long StartTime;
}
其中实体类 AlarmMessage 字段说明如下:
1. ScopeId:告警范围,取值有以下几个:
- 0:Unknown/位置级别,表示未指定或未能确定的范围
- 1:All/全部级别,表示所有范围或整个系统层级。
- 2:Instance/实例级别,表示具体的服务实例。
- 3:Service/服务级别,表示整个服务。
- 4:Service instance/服务实例级别,表示特定服务的实例集合。
- 5:Endpoint Name/端点名称级别,依据端点的名称进行划分。
- 6:Endpoint/端点级别,表示特定服务的实例集合
- 7:Database/数据库级别,表示数据库的操作或查询。
- 8:Cache/缓存级别,表示缓存调用
- 9:MQ/消息队列,表示消息队列的操作。
2. name:告警项目名
3. id0:Skywalking 主键标识,与 name 一一匹配
4. id1:预留字段,暂未使用
5. ruleName:告警名称,如 service_resp_time_rule
6. alarmMessage:告警内容
7. startTime:告警开始时间