⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/SkyWalking/ui-2-instance/ 「芋道源码」欢迎转载,保留摘要,谢谢!

本文主要基于 SkyWalking 3.2.6 正式版


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

1. 概述

本文主要分享运维界面的第二部分,应用实例视角

SkyWalking WEBUI :https://github.com/apache/incubator-skywalking-ui

在我们打开 SkyWalking WEBUI 的 Instance Override ( health/health.html ) 页时,如下图:

  • 以应用实例为维度进行展示。
  • 红色部分,时间进度条,调用 「2. AllInstanceLastTimeGetHandler」 接口,获得应用实例最后心跳时间。大多情况下,我们进入该界面,看的是从最后心跳时间开始的应用调用情况。
  • 绿色部分,应用列表,初始化以 [ 实例最后心跳时间前一小时 , 实例最后心跳时间 ] 调用 「3. ApplicationsGetHandler」 接口,获得范围数据,而后每 4 秒刷新一次,数据范围向前走 4 秒( 时间进度条是走 2 次 2 秒 ),为 [ 实例最后心跳时间前一小时 + 四秒 , 实例最后心跳时间 + 四秒 ]。
  • 红色部分,【点击任意应用】,应用实例列表,调用 「4. InstanceHealthGetHandler」 接口,获得当前时间数据,而后每 2 秒刷新一次。
  • 通过进度条的【播放/暂停按钮】可以切换到暂停模式,切换时间范围,查看时间范围为一小时内的应用调用拓扑图。注意,一定要切换到【暂时模式】才可调整时间范围,在【播放模式】下,每次自动请求都会重设时间范围。

在我们【点击任意应用实例】,打开 SkyWalking WEBUI 的 Instance ( instance/instance.html ) 页时,如下图:

  • 单个应用实例为维度进行展示。
  • 橘色部分,应用实例指标,初始化以 [ 打开页面时间前五分钟 , 打开页面时间 ] 调用 「5. InstanceMetricGetRangeTimeBucketHandler」 接口,获得范围数据。
  • 红色部分,【点击 auto 开关】,每 1 秒刷新一次,数据范围向前走 1 秒,为 [ 打开页面时间 + 一秒 , 打开页面时间 + 一秒 ],获得每秒增量数据。

基情提示:运维界面相关 HTTP 接口,逻辑简单易懂,笔者写的会比较简略一些。

2. AllInstanceLastTimeGetHandler

《SkyWalking 源码分析 —— 运维界面(一)之应用视角》「2. AllInstanceLastTimeGetHandler」 相同。

3. ApplicationsGetHandler

org.skywalking.apm.collector.ui.jetty.handler.application.ApplicationsGetHandler ,实现 JettyHandler 接口,获得应用列表逻辑处理器。

4. InstanceHealthGetHandler

org.skywalking.apm.collector.ui.jetty.handler.instancehealth.InstanceHealthGetHandler ,实现 JettyHandler 接口,获得应用的应用实例健康相关信息数组。

  • #pathSpec() ,路径定义,"/instance/health/applicationId"
  • 响应示例:
  • #doGet() 方法,代码如下:
    • 第 58 至 62 行:解析 timeBucket 参数,秒级。
    • 第 65 至 72 行:解析 applicationIds 参数,应用编号数组
    • 第 75 至 79 行:返回字段设置。
    • 第 82 至 85 行:循环应用编号数组,调用 InstanceHealthService#getInstances(timeBucket, applicationId) 方法,获得应用的应用实例健康相关信息数组。代码如下:
      • 第 80 行:获得指定时间内的 5 秒内的数组,倒序。为什么?见下文的 InstPerformance 的查询。
      • 第 81 至 82 行:调用 InstanceEsUIDAO#getInstances(applicationId, timeBucket) 方法,查询查询半小时内有心跳的 Instance 数组。
      • 第 90 行:循环 Instance 数组,逐个查询应用实例的健康相关信息。
      • 第 98 行:调用 InstPerformanceEsUIDAO#get(timeBuckets, instanceId) 方法,查询应用实例五秒内的( timeBuckets )的 InstPerformance 累加数据。
        • 第 100 至 105 行:基于 InstPerformance 数据,设置 tps 返回字段。
        • 第 108 至 121 行:基于 InstPerformance 数据,设置 avghealthLevel 返回数据。
      • 第 124 至 130 行:基于 Instance 数据,设置应用实例是否存活( 两分钟内是否有心跳 )。
      • 第 133 至 135 行:调用 GCMetricEsUIDAO#getGCCount(timeBuckets, instanceId) 方法,查询应用实例五秒内的( timeBuckets )的 GCCount 累加数据,设置 ygcogc 返回字段。

5. InstanceMetricGetRangeTimeBucketHandler

org.skywalking.apm.collector.ui.jetty.handler.instancemetric.InstanceMetricGetRangeTimeBucketHandler ,实现 JettyHandler 接口,获得应用实例指定时间范围内的 Metric 信息。

  • #pathSpec() ,路径定义,"/instance/jvm/instanceId/rangeBucket"
  • 响应示例:
  • #doGet() 方法,代码如下:
    • 第 60 至 74 行:解析 startTimeBucketendTimeBucket 参数,秒级。
    • 第 77 至 88 行:解析 instanceId 参数,应用实例编号。
    • 第 84 至 92 行:解析 metricTypes 数组。
    • 第 94 行:调用 InstanceJVMService#getInstanceJvmMetrics(instanceId, metricTypes, startTimeBucket, endTimeBucket) 方法,获得应用实例指定时间范围内的 Metric 信息,涉及 GCMetric 、InstPerformanceMetric 、MemoryMetric 、MemoryPoolMetric 数据表。代码比较简单易懂( 笔者太懒了 ),胖友自己阅读理解。

666. 彩蛋

知识星球

水更第二发!

胖友,分享一波朋友圈可好?

文章目录
  1. 1. 1. 概述
  2. 2. 2. AllInstanceLastTimeGetHandler
  3. 3. 3. ApplicationsGetHandler
  4. 4. 4. InstanceHealthGetHandler
  5. 5. 5. InstanceMetricGetRangeTimeBucketHandler
  6. 6. 666. 彩蛋