skyline 简介

21
Skyline Etsy 的 机制 过滤

Upload: -

Post on 05-Jul-2015

1.159 views

Category:

Travel


2 download

DESCRIPTION

skyline是Etsy的Kale系统的一部分,负责异常探测过滤,和rrdtool/graphite的预测式警报属于另一个方向。

TRANSCRIPT

Page 1: Skyline 简介

SkylineEtsy 的 控 机制监 过滤

Page 2: Skyline 简介

• Etsy 技 博客:术团队• http://codeascraft.com/2013/06/11/introd

ucing-kale/• Qcon London2013 演 稿:讲• https://speakerdeck.com/astanway/bring-

the-noise-continuously-deploying-under-a-hailstorm-of-metrics

介简

Page 3: Skyline 简介

Kale架构图

• 常探 的异 测 skyline( 左边 )• 相似 找的查 oculus( 右边 )

Page 4: Skyline 简介

skyline部署

• apt-get install git numpy scipy python-pip python-msgpack python-pandas python-statsmodels

• git clone https://github.com/etsy/skyline• cd skyline• pip install -r requirement.txt• cp src/settings.py.example src/settings.py• mkdir /var/log/skyline• mkdir /var/run/skyline• mkdir /var/log/redis• # 必 用须 2.6 版以上的 redis-server 才能正常存储• wget http://redis.googlecode.com/files/redis-2.6.13.tar.gz• tar zxvf redis-2.6.13.tar.gz• cd redis-2.6.13• make

Page 5: Skyline 简介

skyline启动

• ./src/redis-server ../bin/redis.conf• cd bin• # 分析器• sudo ./analyzer.d start• # 数据接收• sudo ./horizon.d start• # flask 界面• sudo ./webapp.d start

Page 6: Skyline 简介

horizon支持

• 2024 端口支持转发 graphite 数据• 2025 端口支持 pickle 和 msgpack两种

网 数据格式络• 数据存 在储 redis 中, key 的命名格式类

似 graphite 的的 group.item.time这样

Page 7: Skyline 简介

analyzer原理

• analyzer 根据周期内 有数据判断最新数现据是否 常异

• rrdtool/graphite 是根据 有数据推 下现 测一个数据 是多少应该

Page 8: Skyline 简介

analyzer原理

• first_hour_average• 是最 的。先求本周期内最前面的第这 简单

一个小 的平均 和 准差,然后和最新时 值 标的三个 的平均值 值 (tail_avg() , 是后面这多数算法都通用的做法 ) 做比 。如果 较tail_avg 和 第一小 平均 的差距大于 时 值3 倍的 准差,那么 定 常。标 认 为异

Page 9: Skyline 简介

analyzer原理

• simple_stddev_from_moving_average

• 把上面算法的范 大化,求的是整个周围扩期内全部数据的平均 和 准差。值 标

Page 10: Skyline 简介

analyzer原理

• stddev_from_moving_average• 在上面算法的基 上,采用指数加权移础 动

平均 。 周期内采点数量 少的情况更值 对 较好一些。

Page 11: Skyline 简介

analyzer原理

• mean_subtraction_cumulation• 做法是 的:这样

• 排除最后一个 ;值• 求剩余序列的平均 ;值• 全序列 去上面 个平均 ;减 这 值• 求剩余序列的 准差;标• 判断全序列最后一个 是否大于 值 3 倍的 准差标• 在代 中本来 算了一次序列的指数加权移码 还计 动

平均 ,但是算完了却没用,感 怪怪的。值 觉

Page 12: Skyline 简介

analyzer原理

• least_squares• 采用最小二乘法 近 序列,然后用拟 时间 实

去 近 得到新序列。然后判断新际值减 拟 值序列的最后三个 的平均 是否大于 值 值 3 倍的新序列 准差。标

• 所 最小二乘法, 就是 一个 谓 简单说 对 [x, y] 序列,会有一 常数 对 [m, c] , 让 Y = mx + c 等式中的 Y 和 y 在全序列上最接近。

Page 13: Skyline 简介

analyzer原理

• histogram_bins• 将整个周期序列的数据按照直方 法图统计

入 归 15 个直方中,然后看最后三个 的值平均 属于 值 这 15 个直方的具体 个。如哪果 个直方中包含的数据小于 这 20 个,判断 常。为异

• 从算法中可以知道,如果周期内数据量不,很容易被判断 常的。够 为异

Page 14: Skyline 简介

analyzer原理

• grubbs• 将整个周期序列的数据按照格拉布斯法求 常 。异 值

• 准的格拉布斯法是 的:标 这样

• 从小到大排序;• 求序列的平均 和 准差;值 标• 算最小 和最大 与平均 的差距,更大的那个 可疑 ;计 值 值 值 为 值• 可疑 去平均 ,再除以 准差,如果大于格拉布斯 界 ,那么值减 值 标 临 值

就是 常 ;异 值• 排除 常 , 剩余序列循 做 异 值 对 环 1-5 步 。骤• 里只用判断 序列的最后是否 常,所以直接将最后三个 的平这 时间 异 值

均 作 可疑 判断是否 常即可。值 为 值 异

Page 15: Skyline 简介

analyzer原理

• median_absolute_deviation• 具体 是:序列的最后一个 ,比 序列的 中 大 实现 值 该 绝对 值 6 倍以上

,即判断 常。为异

• 注意 里是中 ,不是平均 。这 值 值

Page 16: Skyline 简介

analyzer原理

• Kolmogorov-Smirnov_test• 具体 是: 算序列内最近十分 的数 的实现 计 钟 值 ks 分布,然后测试 计

算序列中最近一个小 前到十分 前 时 钟 这 50 分 的数 的钟 值 ks 分测试布;如果 个分布相差 大,即判断 常。两 较 为异

Page 17: Skyline 简介

webapp原理

• 一个 flask 面,通页 过 ajax 求请 json 画。图

• 个这 anomalies.json 是 analyzer 程进 实生成到时 src/webapp/static/dump 目录

下的。在没有 常的 候的基 式如下异 时 础样:

• handle_data([])

Page 18: Skyline 简介

示例• use Data::MessagePack;• use AnyEvent::Handle::UDP;• my $mp = Data::MessagePack->new->utf8->prefer_integer;• my $sock = AnyEvent::Handle::UDP->new(• connect => [ '127.0.1.1', '2025' ],• on_recv => sub { },• autoflush => 1,• );• my $timer = AnyEvent->timer(• after => 0,• interval => 1,• cb => sub {$sock->push_send($mp->pack(['localhost.loadavg', [time, rand*2]]))}• );• my $atimer = AnyEvent->timer(• after => 200,• interval => 1,• cb => sub {• $timer = undef;• $sock->push_send($mp->pack(['localhost.loadavg', [time, rand*2000]]));• },• );• AnyEvent->condvar->recv;

Page 19: Skyline 简介

analyzer.log 常异 记录

Page 20: Skyline 简介

webapp效果

Page 21: Skyline 简介