介绍
如果使用监控系统(如Zabbix或Nagios),那么你知道监控是如何运作的. 简言之,可以描述如下: 监测系统得到各种衡量标准(CPU/模拟使用、网络利用等)。 一旦其中1个度量衡的值超出预定阈值,它就会激活相应的触发器,而监测系统通知您,其中1个度量衡在正常极限之外. 每个度量的阈值通常由人工设定,这并不总是方便的.
在本教程中,您将学习如何安装和配置 Skyline - 一个实时异常检测系统. 它能够实时分析一组指标,而不设定或调整每个门槛。
标签: Threshold Triggers
让我们看看一个手动设置门槛的监控系统的例子。下面的图表显示了CPU负载的图表。
Figure 1
在图 1 的第 1 点,一个过程已经开始,CPU 负载显著增加了。触发器已被激活,管理员注意到它。
过了一段时间后,触发器在图 1 的第 2 点再次启动,管理员发现第二个服务正在定期备份并导致负载增加。
现在,事件负载下降了,但管理员没有被告知,因为门槛没有超过。
这个简单的案例表明,试图设置门槛时存在一些困难,很难调整门槛值以捕捉性能问题,而不会触发虚假正面错误或虚假负面错误。
为了帮助解决这些问题,创建了 Skyline ,它使用了一组非参数算法来分类异常指标。
Skyline 组件
Skyline 由以下组件组成:Horizon Agent、Analyzer Agent 和 Webapp。
名称:Horizon Agent
Horizon Agent 负责收集数据. 它有 Listeners ,可以听取入口数据。
它接受两个格式的数据: pickle (TCP) 和 MessagePack (UDP) 它读取输入的指标,并将其放置在共享的队列中,由 Workers 读取。
分析员代理
分析器代理负责分析数据. 它从 Redis 收到指标列表,运行多个流程,并将指标分配给每个流程. 每个流程使用多个算法分析数据. 每个算法报告结果 - 无论数据是否异常。
所有异常指标都写在一个文件中. 基于此文件,在 Web 应用程序中创建并显示图像。
分析器也可以发送通知:电子邮件、HipChat 或 PagerDuty. 电子邮件通知将在本文中稍后配置。
Webapp 网站
Skyline 提供了一個小型網頁應用程式,可顯示異常指標. 它是一個簡單的網頁應用程式,用 Python 寫成 Flask 框架. 上方顯示兩個圖表 — 過去一小時和過去一天. 下方的圖表是所有異常指標的列表。
Redis 数据库
Redis是一个开源的关键值缓存和存储数据库。
Skyline 将所有指标和编码时间序列存储在一个 Redis 数据库中. 当数据点进入时,Horizon 工人将数据点包装到一个由 MessagePack 编码的二进制字符串中,并将该字符串附加到相应的指标密钥中。
_ 图 2_ 显示了 Skyline 组件的相互作用图。
Figure 2
前提条件
在您可以安装 Skyline 之前,您需要完成以下前提条件:
第1步:安装Skyline和Redis
要安装 Skyline,先安装所需的应用程序,包括一些与Python相关的工具和Apache Web 服务器:
1sudo yum install httpd gcc gcc-c++ git pycairo mod_wsgi python-pip python-devel blas-devel lapack-devel libffi-devel
从 GitHub 获取 Skyline 的最新源文件:
1cd /opt
2sudo git clone https://github.com/etsy/skyline.git
安装一些需要的 Python 包:
1cd /opt/skyline
2sudo pip install -U six
3sudo pip install -r requirements.txt
在此规定的顺序下安装下列 Python 包:
1sudo pip install numpy
2sudo pip install scipy
3sudo pip install pandas
4sudo pip install patsy
5sudo pip install statsmodels
6sudo pip install msgpack-python
安装某些软件包可能需要很长时间,所以请耐心。
其中大多数是用于科学和技术计算的开源Python库,而msgpack-python
包是读取和写入MessagePack(http://msgpack.org/)数据所必需的。
将示例 Skyline 设置文件复制到正确的文件位置:
1sudo cp /opt/skyline/src/settings.py.example /opt/skyline/src/settings.py
创建以下目录:
1sudo mkdir /var/log/skyline
2sudo mkdir /var/run/skyline
3sudo mkdir /var/log/redis
4sudo mkdir /var/dump/
正如我们上面提到的,Skyline 将所有指标存储在 Redis 数据库中,因此您还需要安装它:
1sudo yum install redis
您可以在教程中找到有关 Redis 的更多信息 如何安装和使用 Redis。
启动 Skyline 和 Redis 服务:
1cd /opt/skyline/bin
2sudo redis-server redis.conf
3sudo ./horizon.d start
4sudo ./analyzer.d start
5sudo ./webapp.d start
要测试安装,运行包含的测试脚本:
1python /opt/skyline/utils/seed_data.py
你应该看到以下结果:
1Loading data over UDP via Horizon...
2Connecting to Redis...
3Congratulations! The data made it in. The Horizon pipeline seems to be working.
Skyline 的安装和基本配置已经完成,现在您需要向其发送数据。
步骤2 - 将数据带入天线
如前所述,Skyline 接受两种格式的数据: pickle (TCP) 和 MessagePack (UDP)。
您可以将自己的脚本或模块写给您最喜欢的监控代理,并让它用 MessagePack 编码数据,以便将其发送到 Skyline 进行分析。Skyline 接受以 UDP 形式的 MessagePack 编码字符串的指标。MessagePack 是一种对象序列化规格,如 JSON。 格式为 `
本教程将向您展示如何从 Graphite 发送数据并收集到 Skyline。
从图形中获取数据
Graphite 由几个组件组成,其中一个是 carbon-relay 服务. Carbon-relay 将输入的指标转发到另一个 Graphite 实例中以获取冗余性。
Figure 3
图3显示了数据流的方案图。从外部监测代理(collectd,diamond,statsd等)或系统(Nagios,Icinga,Sensu等)的数据转移到格拉菲特。接下来,碳传输将数据转移到Skyline。碳传输,碳缓存和Skyline可以在单个主机上或单独的主机上运行。
您需要配置 Graphite、collected 和 Skyline 以使此数据流工作。
如果您以前没有将例子 `relay-rules.conf' 复制到碳-relay 配置文件的正确位置,您现在必须这样做:
1sudo cp /opt/graphite/conf/relay-rules.conf.example /opt/graphite/conf/relay-rules.conf
让我们打开relay-rules.conf
配置文件来编辑:
1sudo vi /opt/graphite/conf/relay-rules.conf
将您的 Skyline 主机添加到目的地列表中,其中 YOUR_SKYLINE_HOST 是您的 Skyline 主机的 IP 地址:
1[label /opt/graphite/conf/relay-rules.conf]
2[default]
3default = true
4destinations = 127.0.0.1:2004, YOUR_SKYLINE_HOST:2024
在「relay-rules.conf」中使用的所有目的地也必须在「carbon.conf」配置文件中定义。
打开carbon.conf
配置文件以进行此更改:
1sudo vi /opt/graphite/conf/carbon.conf
然後找到「[轉移]」部分,並編輯「目的地」行:
1[label /opt/graphite/conf/carbon.conf]
2[relay]
3...
4DESTINATIONS = 127.0.0.1:2004, YOUR_SKYLINE_HOST:2024
5...
一旦您完成了这些更改,请启动碳连接服务:
1sudo systemctl start carbon-relay
允许 Skyline 访问图形网
在 CentOS 7 上如何使用 Graphite, Carbon, and collectd 有效保留历史日志中,如果您选择通过密码保护 Graphite 网页接口,则必须允许 localhost 无密码访问 Skyline。
要做到这一点,请编辑 Graphite 配置文件:
1sudo vi /etc/httpd/conf.d/graphite.conf
在<位置>
块中添加以下红色的行:
1[label /etc/httpd/conf.d/graphite.conf]
2<Location "/">
3 AuthType Basic
4 AuthName "Private Area"
5 AuthUserFile /opt/graphite/secure/.passwd
6 Require user sammy
7 Order Deny,Allow
8 Deny from all
9 Allow from localhost
10 Satisfy Any
11</Location>
然后重新启动 Apache 服务:
1sudo systemctl restart httpd
从 Collectd 获取数据
您也可以配置 collectd 以将数据发送到 Skyline. 打开其配置文件:
1sudo vi /etc/collectd.conf
更改<Plugin write_graphite>
块中的端口号为2013
:
1[label /etc/collectd.conf]
2<Plugin write_graphite>
3 . . .
4 Port "2013"
5 . . .
然后重新启动收集:
1sudo systemctl restart collectd.service
为了避免混淆,图4显示了一种简化方案,使用正确的端口号码。
Figure 4
正确的端口号码如下:
- Carbon-relay listens for incoming data in plaintext format on port 2013 2. Carbon-relay sends the data in pickle format 3. Carbon-cache listens for incoming data in pickle format on port 2004 4. Horizon agent listens for incoming data in pickle format on port 2024
注意!如果您在同一主机上启动 Horizon 代理和可选的碳聚合器,则必须更改其端口。
第3步:设置天线
Skyline 配置文件包含许多设置. 打开文件以编辑:
1sudo vi /opt/skyline/src/settings.py
该文件中的每个设置都通过文件本身的信息评论来记录,至少您需要设置以下参数,以您的值代替红色文本:
GRAPHITE_HOST = 'Your_GRAPHITE_HOST' *
HORIZON_IP = '0.0.0.0' * `WEBAPP_IP = 'Your_SKYLINE_HOST_IP'
其他选项可以留给它们的默认值,它们如下:
- `FulL-Dulation ' -- -- 本备选案文具体规定了将数据储存在Redis并进行分析的最大时间。 较长的长度需要较长的时间进行分析,但它们能帮助减少噪音并提供更准确的异常探测. 默认值为"86400"秒.
港口 ' - 此选项指定了碳端口 。 默认值为
2003'。- `ANALYZER-PROECESSES'-本选项具体规定了天线分析器将产生的过程的数量。 建议将这个参数设置为数个小于您主机的CPU总数. 默认值为"5".
WORKER_PROCESESES'——本选项规定从地平线队列中消耗的工人流程数量。 默认值为
2'。港口 ' - 此选项指定了监听 Graphite 泡菜的 TCP 端口 。 默认值为
2024'。UDP_Port ' - 此选项指定了收听 MessagePack 编码包的 UDP 端口 。 默认值为
2025'。 *WEBAPP_Port ' - 此选项指定了 Skyline Webapp 的端口 。 默认值为
1500'。 .
完成这些更改后,您必须重新启动相应的应用程序:
1sudo /opt/skyline/bin/horizon.d restart
2sudo /opt/skyline/bin/analyzer.d restart
3sudo /opt/skyline/bin/webapp.d restart
然后你可以打开链接 http://your_server_ip:1500
并查看天线网页(图5)。
Figure 5
若要讓 Skyline 運行滿足容量,您需要等到「FULL_DURATION」秒過了,預設為「FULL_DURATION」為 1 天(「86400」秒)。
您应该至少等待一个小时才能开始跟踪异常,这会让Skyline有时间收集有关正常负载水平的信息,不要在Skyline建立基线时对系统产生额外的负载。
步骤4:启用电子邮件警报
默认情况下,Skyline 在其 Web 界面(http://your_server_ip:1500
)中显示已检测到的异常,因为它们被发现,而它们仍在发生。一旦异常消失,其相应的指标从此界面中消失。因此,您必须监控 Web 页面以查看这些异常,这并不总是方便。
您可以配置电子邮件警报,以免错过它们。
要做到这一点,打开 Skyline 配置文件:
1sudo vi /opt/skyline/src/settings.py
确保已启用警报:
1[label /opt/syline/src/settings.py]
2ENABLE_ALERTS = True
然后找到以下警报部分,并在红色中添加以下方案:
1[label /opt/syline/src/settings.py]
2ALERTS = (
3 (^)("collectd", "smtp", 1800)(^),
4)
该方案中的第一个值是监控的过程,在这种情况下,它是collectd
。该方案的第二个值是smtp
,它代表电子邮件警报,最后的值是1800
在秒内,这意味着警报不会在30分钟(1800秒)内发射超过一次,即使检测到触发器。
也找到下面的部分,并对您想要使用的电子邮件地址进行修改. 电子邮件警报将发送到 (^)[email protected](^)帐户,从(^)[email protected](^)。
1[label /opt/syline/src/settings.py]
2SMTP_OPTS = {
3 "sender": "(^)[email protected](^)",
4 "recipients": {
5 "collectd": ["(^)[email protected](^)"],
6 },
7}
完成所有这些更改后,您必须重新启动分析器 DAEMON:
1sudo /opt/skyline/bin/analyzer.d restart
步骤5:测试天线
要测试 Skyline,我们可以使用 bash 命令创建一个 CPU 峰值:
1dd if=/dev/zero of=/dev/null
您可以随时停止命令,按CTRL-C. 几分钟应该足以创建异常。
如果您在运行此命令时查看 Skyline Web 界面,您将看到检测到的异常。
Figure 6
您可以看到,由于CPU负载高,Skyline的组件的速度下降了。所有检测到的异常指标都显示为网页底部的列表。当您横跨一个指标的名称时,在顶部图表中,您可以看到最后一小时和一天的相应时间序列。点击指标的名称来打开一个更详细的图表,由Graphite生成(参见图7为示例)。
Figure 7
CPU负载在本示例中没有达到极高的值,并且门槛没有被超过,在这种情况下,经典监控系统无法找到偏差。
与传统的监控系统不同,Skyline可以快速找到偏差并通知您。
第6步:调整算法(可选)
如前所述,Skyline正在使用一组算法来检测异常,目前正在实施以下算法:
- 平均绝对偏差 * 格鲁布斯测试 * 第一小时平均值 * 标准偏差比平均值 * 标准偏差比移动平均值 * 最小平方 * 历史图板 * 科尔莫戈洛夫 - 斯米尔诺夫测试
他们中的大多数是基于 ** kontroll 图表** (也称为 Shewhart 图表)和 ** 三sigma 规则** ,他们在计算中使用 Python 库 SciPy 和 NumPy。
您可以自定义任何使用的算法,您也可以修改、删除或添加新的算法。
1sudo vi /opt/skyline/src/analyzer/algorithms.py
此檔案中的每個算法都提供了一個小型描述,例如,讓我們檢查下列算法:
1[label /opt/skyline/src/analyzer/algorithms.py]
2def median_absolute_deviation(timeseries):
3 """
4 A timeseries is anomalous if the deviation of its latest datapoint with
5 respect to the median is X times larger than the median of deviations.
6 """
7
8 series = pandas.Series([x[1] for x in timeseries])
9 median = series.median()
10 demedianed = np.abs(series - median)
11 median_deviation = demedianed.median()
12
13 # The test statistic is infinite when the median is zero,
14 # so it becomes super sensitive. We play it safe and skip when this happens.
15 if median_deviation == 0:
16 return False
17
18 test_statistic = demedianed.iget(-1) / median_deviation
19
20 # Completely arbitary...triggers if the median deviation is
21 # 6 times bigger than the median
22 if test_statistic > 6:
23 return True
根据您的数据的性质,您可能需要将门槛值从6
更改为4
,5
,7
等。
您还可以调节settings.py
文件中的某些设置:
1[label /opt/skyline/src/settings.py]
2ALGORITHMS = [
3 'first_hour_average',
4 'mean_subtraction_cumulation',
5 'stddev_from_average',
6 'stddev_from_moving_average',
7 'least_squares',
8 'grubbs',
9 'histogram_bins',
10 'median_absolute_deviation',
11 'ks_test',
12]
13
14CONSENSUS = 6
ALGORITHMS
选项指定了分析器将运行的算法,您可以评论其中任何一个,以禁用它们或添加新的算法。 CONSENSUS
选项指定了必须返回True
的算法的数量,然后将指标归类为异常。
结论
Skyline在复杂的动态变化的IT系统中得到了很好的验证,这对经常对操作系统进行更改的程序员有用,并且想要在新软件发布后快速检测系统指标中的异常。
其主要优势包括:
- 大量数据的高速分析 * 无需为每个指标设置个别参数 * 添加自己的异常检测算法的能力
它也有一些缺点:
- 每个指标的数据由几个算法进行分析,这些算法需要大量的计算系统资源。 * 所有数据都存储在RAM中,使系统能够非常快地运作。