一、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架构原理

在整个skywalking的系统中,有四个角色:

1、skywalking agent

和业务系统关联在一起,负责收集各种监控数据;

2、oapservice

是负责处理监控数据的,比如接受skywalking agent的监控数据,并存储在数据库中(例如elasticsearch、mysql中等);接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。,Skywalking oapservice通常以集群的形式存在;

3、skywalking webapp

前端界面,用于展示数据;

4、用于存储监控数据的数据库

比如mysql、elasticsearch等;

三、skywalking 环境安装(windows为例)

1、下载

http://skywalking.apache.org/
这里我使用的是skywalking6.5.0的版本

2、启动

进入到bin目录(直接双击启动startup.bat)
image.png

3、查看界面

默认端口是8080。
http://127.0.0.1:8080/
image.png

1、修改端口

进入apache-skywalking-apm-bin\webapp中,修改webapp.yml
image.png
image.png

4、项目启动监听

1、如果是idea启动测试监听,增加VM options

  1. --采用探针和指定实例名称
  2. -javaagent:D:/apache-skywalking-apm-bin/agent/skywalking-agent.jar
  3. -Dskywalking.agent.service_name=eduApp

image.png

2、如果是jar包启动的话,执行

  1. 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文件夹到不同服务器上面
image.png2、然后启动的时候把探针指向的服务器地址修改。可以修改配置文件D:\apache-skywalking-apm-bin\agent\config\agent.config
image.png
也可以启动的时候附带上命令,指向探针

  1. 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

同时,不同的服务器上也可以使用相同的服务别名实例名,所有的服务追踪器都能追踪到。我在自己本机和虚拟机上,设置了相同的实例名,结果都能追踪
image.png
image.png

5、监听成功界面展示

1、首界面会展示目前有监听的服务、端点、以及连接的数据库,接口名称和耗时

image.png

2、然后拓扑图的话,可以看到服务与服务之间的调用

image.png

3、追踪可以看到接口的耗时、名称、每个步骤的操作详情,如果是分布式的话,服务之间的调用也会详细的列出来(重)

image.png
image.png

image.png

4、告警功能

SkyWalking 的默认提供config/alarm-settings.yml文件,里面预先定义了一些常用的告警规则。如下:
1.过去3分钟内服务平均响应时间超过1秒
2.服务成功率在过去2分钟内低于80%
3.服务90%响应时间在过去3分钟内低于1000毫秒
4.服务实例在过去2分钟内的平均响应时间超过1秒
5.端点平均响应时间过去2分钟超过1秒
image.png

  1. --entity
  2. package com.haoker.serviceedu.entity.police;
  3. /**
  4. * 封装报警参数的对象
  5. */
  6. public class AlarmMessageDto {
  7. private int scopeId;
  8. private String name;
  9. private int id0;
  10. private int id1;
  11. private String alarmMessage;
  12. private long startTime;
  13. public int getScopeId() {
  14. return scopeId;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public int getId0() {
  20. return id0;
  21. }
  22. public int getId1() {
  23. return id1;
  24. }
  25. public String getAlarmMessage() {
  26. return alarmMessage;
  27. }
  28. public long getStartTime() {
  29. return startTime;
  30. }
  31. public void setScopeId(int scopeId) {
  32. this.scopeId = scopeId;
  33. }
  34. public void setName(String name) {
  35. this.name = name;
  36. }
  37. public void setId0(int id0) {
  38. this.id0 = id0;
  39. }
  40. public void setId1(int id1) {
  41. this.id1 = id1;
  42. }
  43. public void setAlarmMessage(String alarmMessage) {
  44. this.alarmMessage = alarmMessage;
  45. }
  46. public void setStartTime(long startTime) {
  47. this.startTime = startTime;
  48. }
  49. }
  50. --controller
  51. package com.haoker.serviceedu.controller.skywalkingPolice;
  52. import com.haoker.serviceedu.entity.police.AlarmMessageDto;
  53. import org.springframework.web.bind.annotation.*;
  54. import java.util.ArrayList;
  55. import java.util.List;
  56. @RestController
  57. @RequestMapping("/eduservice")
  58. @CrossOrigin
  59. public class PoliceController {
  60. private List<List<AlarmMessageDto>> listAlarmMessage = new ArrayList<>();
  61. /**
  62. * 存放告警信息
  63. *
  64. * @param alarmMessageList
  65. */
  66. @RequestMapping(value = "/police", method = RequestMethod.POST)
  67. public void alarm(@RequestBody List<AlarmMessageDto> alarmMessageList) {
  68. listAlarmMessage.add(alarmMessageList);
  69. }
  70. /**
  71. * 打印告警信息
  72. *
  73. * @return
  74. */
  75. @RequestMapping("/getListAlarmMessageDto")
  76. public List<List<AlarmMessageDto>> getListAlarmMessageDto() {
  77. return listAlarmMessage;
  78. }
  79. }

image.png

四、skywalking数据保存持久化

默认的情况下skywalking是没有持久化的,下次重启后,上次的数据就消失了。下面我们集成es来做数据持久化.

1、先安装docker

https://www.yuque.com/docs/share/14ce8852-eef5-48d5-8cdd-deeb086ce37c?# 《kafka结合ELK实现日志采集》

2、通过docker安装es

  1. --这里我们安装es6.5.0版本的,对应skywalking版本
  2. 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

  1. docker run -it -d -e ELASTICSEARCH_URL=http://192.168.212.5:9200 --name kibana --network=container:es kibana:6.5.0

4、修改apache-skywalking-apm-bin\config下的application.yml

image.png
image.png

5、重新启动,发现数据已经持久化下来了

五、集成操作的时候出现的问题

1、关于启动完出现节点后,把服务关了,节点还在,不知道服务是否关闭了

缓存问题,过一段时间就清除了

2、当服务启动完后,如果把skywalking服务关闭,然后再重启skywalking服务,此时,对之前监听的服务实例会失效。需要重新启动服务实例.(后来集成ES,发现不需要重启)