一、skywalking基本介绍
SkyWalking是一个开源的观测平台,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,SkyWalking 提供了一种简便的方式来清晰地观测分布式系统,甚至可以观测横跨不同云的系统,SkyWalking 更像是一种现代的应用程序性能监控(Application Performance Monitoring,即APM)工具,专为云原生,基于容器以及分布式系统而设计。
1、探针:基于不同的来源探针可能是不一样的,但作用都是收集数据,将数据格式化为SkyWalking 适用的格式。例如在Java中则是做字节码植入,无侵入式的收集,并通过 HTTP 或者 gRPC 方式发送数据到平台后端 通过Agent技术 代理主函数
2、存储:是开放式的,可以选择一个既有的存储系统,如ElasticSearch、H2 或 MySQL 集群(Sharding-Sphere 管理),也可以选择自己实现一个存储系统。
用户界面:也就是SkyWalking的可视化界面,UI非常炫酷且强大,同样它也是可定制以匹配你已存在的后端的
3、SkyWalking 为观察和监控分布式系统提供了许多不同场景下的解决方案。例如为Java、C#及Node.js提供语言自动探针,无侵入式的收集。同时也为一些编译型语言C++、GO等提供了手动打点 SDK(目前还未支持)。除此之外,还可以使用服务网格基础探针来收集数据,以帮助了解整个分布式系统。
4、多种监控手段,语言探针和服务网格(Service Mesh)
模块化,UI、存储、集群管理多种机制可选。支持告警
二、skywalking架构原理
1、skywalking agent
2、oapservice
是负责处理监控数据的,比如接受skywalking agent的监控数据,并存储在数据库中(例如elasticsearch、mysql中等);接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。,Skywalking oapservice通常以集群的形式存在;
3、skywalking webapp
4、用于存储监控数据的数据库
三、skywalking 环境安装(windows为例)
1、下载
http://skywalking.apache.org/
这里我使用的是skywalking6.5.0的版本
2、启动
3、查看界面
默认端口是8080。
http://127.0.0.1:8080/
1、修改端口
进入apache-skywalking-apm-bin\webapp中,修改webapp.yml
4、项目启动监听
1、如果是idea启动测试监听,增加VM options
--采用探针和指定实例名称
-javaagent:D:/apache-skywalking-apm-bin/agent/skywalking-agent.jar
-Dskywalking.agent.service_name=eduApp
2、如果是jar包启动的话,执行
java -javaagent:D:/apache-skywalking-apm-bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=eduApp -jar service-edu-1.0-SNAPSHOT.jar
3、如果部署多台服务器服务
1、复制apache-skywalking-apm-bin/agent文件夹到不同服务器上面
2、然后启动的时候把探针指向的服务器地址修改。可以修改配置文件D:\apache-skywalking-apm-bin\agent\config\agent.config
也可以启动的时候附带上命令,指向探针
java -javaagent:/usr/local/src/agent/skywalking-agent.jar -Dskywalking.agent.service_name=eduApp -Dskywalking.collector.backend_service=192.168.20.121:11800 -jar service-edu-1.0-SNAPSHOT.jar
同时,不同的服务器上也可以使用相同的服务别名实例名,所有的服务追踪器都能追踪到。我在自己本机和虚拟机上,设置了相同的实例名,结果都能追踪
5、监听成功界面展示
1、首界面会展示目前有监听的服务、端点、以及连接的数据库,接口名称和耗时
2、然后拓扑图的话,可以看到服务与服务之间的调用
3、追踪可以看到接口的耗时、名称、每个步骤的操作详情,如果是分布式的话,服务之间的调用也会详细的列出来(重)
4、告警功能
SkyWalking 的默认提供config/alarm-settings.yml文件,里面预先定义了一些常用的告警规则。如下:
1.过去3分钟内服务平均响应时间超过1秒
2.服务成功率在过去2分钟内低于80%
3.服务90%响应时间在过去3分钟内低于1000毫秒
4.服务实例在过去2分钟内的平均响应时间超过1秒
5.端点平均响应时间过去2分钟超过1秒
--entity
package com.haoker.serviceedu.entity.police;
/**
* 封装报警参数的对象
*/
public class AlarmMessageDto {
private int scopeId;
private String name;
private int id0;
private int id1;
private String alarmMessage;
private long startTime;
public int getScopeId() {
return scopeId;
}
public String getName() {
return name;
}
public int getId0() {
return id0;
}
public int getId1() {
return id1;
}
public String getAlarmMessage() {
return alarmMessage;
}
public long getStartTime() {
return startTime;
}
public void setScopeId(int scopeId) {
this.scopeId = scopeId;
}
public void setName(String name) {
this.name = name;
}
public void setId0(int id0) {
this.id0 = id0;
}
public void setId1(int id1) {
this.id1 = id1;
}
public void setAlarmMessage(String alarmMessage) {
this.alarmMessage = alarmMessage;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
}
--controller
package com.haoker.serviceedu.controller.skywalkingPolice;
import com.haoker.serviceedu.entity.police.AlarmMessageDto;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/eduservice")
@CrossOrigin
public class PoliceController {
private List<List<AlarmMessageDto>> listAlarmMessage = new ArrayList<>();
/**
* 存放告警信息
*
* @param alarmMessageList
*/
@RequestMapping(value = "/police", method = RequestMethod.POST)
public void alarm(@RequestBody List<AlarmMessageDto> alarmMessageList) {
listAlarmMessage.add(alarmMessageList);
}
/**
* 打印告警信息
*
* @return
*/
@RequestMapping("/getListAlarmMessageDto")
public List<List<AlarmMessageDto>> getListAlarmMessageDto() {
return listAlarmMessage;
}
}
四、skywalking数据保存持久化
默认的情况下skywalking是没有持久化的,下次重启后,上次的数据就消失了。下面我们集成es来做数据持久化.
1、先安装docker
https://www.yuque.com/docs/share/14ce8852-eef5-48d5-8cdd-deeb086ce37c?# 《kafka结合ELK实现日志采集》
2、通过docker安装es
--这里我们安装es6.5.0版本的,对应skywalking版本
docker run -it --name es -e "discovery.type=single-node" -d -p 9200:9200 -p 9300:9300 -p 5601:5601 elasticsearch:6.5.0
3、安装kinba
docker run -it -d -e ELASTICSEARCH_URL=http://192.168.212.5:9200 --name kibana --network=container:es kibana:6.5.0