天天看点

SLS机器学习介绍:时序补点和版本比较

本次给大家介绍两个实用的函数:时序补点函数、异常对比函数;

一、时序补点函数

SLS机器学习介绍:时序补点和版本比较
SLS机器学习介绍:时序补点和版本比较
  • 上图的中的指标说明
    • 日志事件事件 T0 :日志产生的最早事件
    • 日志事件事件 T1 :日志产生的最晚事件
    • 实际点数据:在某个时刻有确定的数据
    • 缺失点数据:在某个时刻缺失数据点
    • 补点数据:在不同算法执行结果中,补出的数据

1. time_series

2. series_padding

二、版本对比函数

2. 使用场景

2.1 某个服务升级
  • 该场景可以总结为是单个观测对象,在比较升级前后某个观测指标的变化异常情况
  • 需要提供的数据如下:
  • 某个指标的时序观测数据
  • 某服务变更时的时间点

例子如下:某个服务复杂在某个集群做了一次变更,变更时间是 2020-04-20 07:59:00,在这个时间点后,我们发现该集群的请求延时升高很多,相关研发同学也许就要紧急处理。那么是否有办法可以通过一个函数自动的帮我帮我判别变更前后,观测对象的指标是否发生变化。

  • 先通过SQL整理出观察数据,观察出设定的异常点数值
* |
SELECT date_trunc('minute', __time__ - __time__ % 60) AS TIME,
       avg(Latency) AS Latency
FROM log
GROUP BY TIME
ORDER BY TIME
LIMIT 10000           
SLS机器学习介绍:时序补点和版本比较

我们使用对应的函数进行检测:

* |
SELECT anomaly_compare(TIME, array[ Latency ], 1587340740, 60)
FROM
  (SELECT __time__ - __time__ % 60 AS TIME,
          avg(Latency) / 1000.0 AS Latency
   FROM log
   GROUP BY TIME
   ORDER BY TIME)           
{
  "results": [{
    "attribute": "column_0",
    "score": 0.9999840724556095,
    "details": {
      "left": [{
        "key": "mean",
        "value": 248.79610181477835
      }, {
        "key": "std",
        "value": 41.9981113960846
      }, {
        "key": "median",
        "value": 236.34852017385737
      }, {
        "key": "variance",
        "value": 1763.8413608379317
      }],
      "right": [{
        "key": "mean",
        "value": 294.9041720361495
      }, {
        "key": "std",
        "value": 47.074409675083004
      }, {
        "key": "median",
        "value": 299.6439639513877
      }, {
        "key": "variance",
        "value": 2216.0000462575485
      }]
    }
  }]
}           
2.2 灰度发布升级
  • 该场景可以总结为在集群中灰度服务时,观察不通灰度对象之间的异常差别
    • 可以标示具体机器的发布状态的标签字段
    • 相同观测指标

      例子如下:某基础的存储服务在做版本升级时,往往会进行逐步的灰度操作,在选择几台机器先进行灰度,然后观察后在进行整体的升级发布,在做这个操作前是需要将对发布机器的指标状态做相关的判别,确定是否已经符合预期?是否同其它相同服务的机器的指标有较大差异?或者是否这个版本在线上是有有明显的性能提升?

这时我们把问题转换成部分的观测对象之间的相同观测指标数据之间的比较问题。

  • 针对这个场景,我们先想数据进行达标(这里我模拟一个打标的场景,通过请求延时的大小来确定标签)
* |
SELECT date_trunc('minute', __time__ - __time__ % 60) AS TIME,
       avg(Latency) / 100000.0 AS Latency,
       label
FROM
  (SELECT __time__,
          Latency,
          CASE
              WHEN Latency > 1500000.0 THEN 1
              ELSE 0
          END AS label
   FROM log)
GROUP BY TIME,
         label
ORDER BY TIME
LIMIT 10000           
SLS机器学习介绍:时序补点和版本比较
* |
SELECT anomaly_compare(TIME, array[ Latency ], array[ 'Latency' ], label)
FROM
  (SELECT __time__ - __time__ % 60 AS TIME,
          avg(Latency) / 100000.0 AS Latency,
          label
   FROM
     (SELECT __time__,
             Latency,
             CASE
                 WHEN Latency > 1500000.0 THEN 1
                 ELSE 0
             END AS label
      FROM log)
   GROUP BY TIME,
            label
   ORDER BY TIME)           
{
  "results": [{
    "attribute": "Latency",
    "score": 0.981385450748068,
    "details": {
      "left": [{
        "key": "mean",
        "value": 2.083975172731342
      }, {
        "key": "std",
        "value": 0.26912348059219504
      }, {
        "key": "median",
        "value": 2.0386681871982004
      }, {
        "key": "variance",
        "value": 0.07242744780605757
      }],
      "right": [{
        "key": "mean",
        "value": 36.19678922429
      }, {
        "key": "std",
        "value": 6.139164754357247
      }, {
        "key": "median",
        "value": 37.03196953882403
      }, {
        "key": "variance",
        "value": 37.68934388114228
      }]
    }
  }]
}