一、使用场景
今天给大家介绍几个好用的时序相似性分析函数,具体涉及到的函数包含:时序的聚类,相似性计算等。主要解决的场景如下:
- 当您有N台机器的监控指标数据时,想快速知道在某一段时间机器的CPU形态的大致呈现哪些形态,便于用户更好的了解当前系统的状态;
- 当您指定某一台机器的某指标曲线时,您想知道哪些机器的相同指标与当前指定的曲线更加相似;
- 当您人工输入一条时序曲线(网站整体的访问延迟曲线),您想知道是哪个服务的访问延时的变化规律同当前指定的曲线十分相似,便于缩小问题的排查;
上述场景问题均可以归纳成,时序聚类(按照形态、按照数值),时序相似性判别这两个问题。
二、函数介绍
SLS平台提供了两个函数供大家使用,具体的文档地址可以参考下:https://help.aliyun.com/document_detail/93235.html
ts_density_cluster
ts_hierarchical_cluster
其中第一个函数主要是针对曲线的形态进为标准进行聚类,其底层的核心聚类算法是DBSCAN密度聚类;第二个函数主要针对针对原始曲线的相似性进行聚类,更多的会考虑曲线之间的欧式距离等因素,其底层的核心聚类算法是层次聚类;具体的原理介绍可以参考之前的文章,大家也可以去网上查阅相关资料自行阅读。接下来主要给大家介绍下在SLS中该怎么使用这些函数。
三、案例实战
3.1 数据探索
- query-01
* | select DISTINCT index_name, machine, region from log
- query-02
* | select count(1) as num from (select DISTINCT index_name, machine, region from log)
- query-03
* and index_name : load |
select
__time__,
value,
concat(
region, '#', machine, '#', index_name
) as ins
from log order by __time__
limit 10000
- query-04
*
and index_name : load |
select
date_trunc('minute', __time__) as time,
region,
avg(value) as value
from log group by time, region order by time limit 1000
通过query01我们可以得到对应的如下信息,这里表明我们我们当前的logstore中含有多少不同的曲线,每个曲线的标识是什么,为了更好的观察这1300多条线,我们可以使用流图来观察,一次性在一个图表中绘制出来对浏览器资源消耗也比较大,及时能绘制出来,也很难从这里得到有效的信息。我们使用query04来看下在少数曲线的情况下的可视化情况。在来对比下query03可视化的效果。
3.2 聚类实战
通过上述的观察,我们能否将若干条曲线进行聚类呢,将较为相似的曲线划分到一类中,在进行可视化分析,进而打到降维分析的目的。使用如下SQL可以将N条线快速的聚类,在这里我们选择的指标是机器的负载(load)还是比较关注不同机器的水位的变化情况,因此我们可以选择ts_hierarchical_cluster这个函数,我们得到一张分面图,为了更加直观的可视化这个图表,您可以将其存储在Dashboard中更加直观。
*
and index_name : load |
select
ts_hierarchical_cluster(time, value, ins)
from
(
select
__time__ as time,
value,
concat(
region, '#', machine, '#', index_name
) as ins
from
log
)
3.2 相似性查找
通过如下SQL,我们可以获得到跟 aysls-pub-cn-beijing-k8s#192.168.7.254:9100#load 这条指标曲线相似的机器的列表,并通过如下的流图进行可视化,观察我们的结果。在相似性函数中含有一些相似性判别的方法供大家选择:shape、manhattan、euclidean
*
and index_name : load |
select
cast(
cast(ts_value as double) as bigint
) as ts_value,
cast(ds_value as double) as ds_value,
name
from
(
select
tt[1][1] as name,
tt[2] as ts,
tt[3] as ds
from
(
select
ts_similar_instance(
time, value, ins, 'aysls-pub-cn-beijing-k8s#192.168.7.254:9100#load',
10,
'euclidean'
) as res
from
(
select
__time__ as time,
value,
concat(
region, '#', machine, '#', index_name
) as ins
from
log
)
),
unnest(res) as t(tt)
),
unnest(ts) as t(ts_value),
unnest(ds) as t(ds_value)
order by
ts_value
limit
10000