使用 Kairos 替换碳和石墨用于时间序列存储
项目描述
- 版本:
- 0.7.1
- 下载:
- 来源:
- 关键词:
python,redis,时间,rrd,gevent,碳,石墨,耳语,statsd,kairos
一套旨在替代Graphite并扩展其功能的工具。使用kairos支持从许多不同类型的数据存储中存储和读取数据,并专注于提供用于存储、检索和处理流时间序列数据的编程工具。
<nav class="contents local" id="contents" role="doc-toc"> </nav>动机
Kairos 是一个受 RRD 启发的时间序列库,提供了改进的存储引擎和比大多数其他支持 statsd 的系统更多的功能。与 RRD 和 Whisper 等传统磁盘存储相比,Torus 补充道:
简单的运行时,便于开发和部署
kairos 之上的抽象直方图
稀疏数据点的紧凑存储
通过每个模式托管和分片进行扩展
聚合处理的非缓冲语义
时间戳的一致散列,以便于交织和插值
数据处理的编程接口
StatsD 快速入门
在示例/statsd.py中提供了一个在 SQLite 中跟踪每小时、每天和每月数据的配置文件。默认会为当前用户创建一个临时目录来存储数据库(例如 Unix 上的/tmp/torus.user)。更改文件顶部的STORAGE_DIR以设置永久位置。
如果你已经在虚拟环境中安装了 torus,你可以使用foreman来启动karbon和torus。如果您在存储库之外运行环面,那么您可以使用foreman start -f Procfile.dev。
示例配置包括对性能测试的支持(见下文)。
碳服务器
karbon应用程序运行与Carbon兼容的统计数据收集应用程序。它是 statsd的 Carbon 后端的直接替代品。它采用以下参数:
usage: karbon [-h] [--tcp TCP] [--config CONFIG]
Karbon, a Carbon-replacement data collection server
optional arguments:
-h, --help show this help message and exit
--tcp TCP TCP binding, in the form of "host:port", ":port", or
"port". Defaults to "localhost:2003".
--config CONFIG Configuration file to load. Can be called multiple times
for multiple configuration files.
配置记录如下。要重新加载配置,请将 SIGHUP发送到karbon进程。
查询服务器
torus应用程序是Graphite的替代品。它与 Graphite 的 API 不兼容,尽管它确实旨在让 Graphite 用户熟悉并提供与石墨兼容的 JSON 格式,以便于与现有工具链集成。
usage: torus [-h] [--tcp TCP] [--config CONFIG]
Torus, a web server for mining data out of kairos
optional arguments:
-h, --help show this help message and exit
--tcp TCP TCP binding, in the form of "host:port", ":port", or
"port". Defaults to "localhost:8080".
--config CONFIG Configuration file to load. Can be called multiple times
for multiple configuration files.
对于大多数用例,它可以与karbon共享配置。但是,可以使用Chef、puppet或类似工具来模板化配置,并替换主机定义等字符串,以便在读取数据时定位一组特定的资源。
要重新加载配置,请向环面进程发送SIGHUP 。
torus将响应http://$tcp/$command?$parameters以获取以下命令,其中$parameters是标准 URL 编码参数列表。
命令
/系列
已弃用:以前的/data
参数
获取一个或多个统计信息的数据并返回每个统计信息的对象列表。从匹配统计信息的第一个模式返回数据。
统计
要获取的统计信息的名称。stat参数的每个实例都被解释为一个单独的统计数据。统计信息可以是$stat_name或$func($stat_name)的形式,其中$func可以是以下之一:
avg - 每个时间片中每个数据点的平均值。
min - 每个时间片中数据点的最小值。
max - 每个时间片中数据点的最大值。
sum - 每个时间片中数据点的总和。
count - 每个时间片中的数据点数。
此外,$func可以是配置中定义的转换或宏。$func可以是任何匹配模式[a-zA-Z0-9_] 的东西。
格式
[graphite, json]之一,其中石墨是与 Graphite 兼容的 json 格式,而json提供了kairos数据结构的更细微的表示。
凝结
[true, false]之一,如果为模式配置了kairos分辨率,则确定分辨率是展平还是按原样返回。对于石墨格式,强制为真。
坍塌
[true, false]之一,如果为true ,则每个时间间隔的所有数据都将折叠为单个值。这对于计算一个范围内的聚合非常有用(例如“过去 5 天的所有命中”)。
图式
在多个模式与统计名称匹配的情况下,强制使用特定模式。
间隔
要选择的间隔,在任何模式匹配stat中可用的间隔之一。必须适用于所有统计参数。
开始
返回间隔开始的可选时间戳。可以是 unix 时间戳、strftime格式的字符串或人类可读的相对值,例如“今天”、“5 天前”、“上周”等。
结尾
返回间隔结束的可选时间戳。可以接受与start相同的值。没有参数,这隐含地是进行查询的时间。
脚步
给定开始或结束时间戳,此参数定义要返回的间隔数(包括)之后或之前(分别)。因此,如果start是“last week”并且steps=7,结果数据将以昨天的数据结束。如果没有给出时间戳,这是当前时间(包括)之前的间隔数。
退货
一个json结构。
[{
'function': 'avg',
'interval': 'hour',
'schema': 'calls',
'stat': 'avg(calls.system)',
'stat_name' : 'calls.system',
'target': 'calls.system',
'datapoints': [[0.0391, 1362153600], [0, 1362157200]],
},
...
]
stat字段将是相应参数的全名,包括函数(如果有)。stat_name字段将只是与模式匹配的统计信息的名称,而对于期望石墨 格式数据的客户端,目标将是相同的副本。
配置
所有环面应用程序都会加载一个或多个配置,其中配置是加载到应用程序中的 python 模块。Torus 会查找下面记录的常量,但由于配置是完整的 python 模块,因此可以包含扩展、插件和其他运行时配置。例如,可以将 torus 对标准 python 记录器的使用连接 到 syslog、logstash 或许多错误报告工具之一,例如 Sentry。对于torus,日志消息优先考虑标头X-Forwarded-For,然后使用远程 IP 地址(如果该地址不可用)。出于这个原因和一般安全性,您应该始终在torus前面使用代理服务器。
torus的配置包括模式、聚合、可在查询中使用的自定义函数和调试设置的定义。环面模式是kairos模式的扩展;模式定义中的每个键值对都将传递给时间序列 构造函数。配置文件可以包括以下一项或多项。
负载
如果这是一个可调用的,将在第一次加载配置时调用。对于一次性配置(例如 Sentry 日志处理程序)很有用。
on_reload
如果这是一个可调用的,将在重新加载配置模块时调用。
模式
配置唯一名称的字典,用于捕获和存储与正则表达式匹配的统计信息。模式定义支持以下字段,其中许多直接传递给 kairos。
类型
必需,定义时间序列的类型。[series, histogram, count, set, gauge]之一 ,取决于后端支持的内容。
主持人
必需,URL 连接字符串或受支持的连接类型的实例。请参阅 存储引擎
客户端配置
可选,是在与主机URL关联的连接构造函数中使用的参数字典。请参阅存储引擎
匹配
一个字符串或字符串列表,它们是正则表达式,用于定义应在此模式中存储和查询的统计信息名称。在定义了转换的情况下,很可能一个或多个表达式将定义输入统计信息,而另一个表达式将定义可以查询的统计信息。请参阅 GitHub 问题。
滚动
可选,定义插入数据时应写入数据副本之前(负)或之后(正)多少间隔。额外的存储大小抵消了在预定日期范围内更快地计算聚合。例如,当存储每日值时,值-30将存储一个值,就好像它发生在过去 30 天的任何时间一样。
字首
可选,用于限定 redis 数据存储中的数据。如果提供并且它不以“:”结尾,它将被自动附加。
转换
可选,允许一个人用另一个替换统计名称和值。接受两个参数,并且必须返回两个项目(统计数据,值)的元组。如果统计为无,将跳过写入统计。该值将是输入的字符串,并且输出必须是任何定义的 write_func 可接受的。示例:transform: lambda s,v: (None,None) if 0>long_or_float(v)>3.14 else (s,v)
读取函数
可选,是应用于从数据库读回的所有值的函数。没有它,值将是字符串。必须接受字符串值并且可以返回任何内容。默认为long_or_float,它尝试转换为 long 并且失败,转换为浮点数。 long_or_float可供所有模式使用。
write_func
可选,是写入时应用于所有值的函数。可用于直方图解析、将对象转换为 id 等。必须接受可以插入时间序列的任何内容并返回可以转换为字符串的对象。默认为long_or_float,它尝试转换为 long 并且失败,转换为浮点数。示例:write_func: lambda v: '%0.3f'%(v)
间隔
必需,定义 应存储数据的时间间隔。
发电机
可选,定义可用于生成负载测试的函数。必须以(stat_name, value)形式返回一个元组。示例:lambda: ('application.hits.%d'%(random.choice([200,404,500])), 1)
例子:
SCHEMAS = {
'response_times' : {
'type': 'histogram'
'host': 'redis://localhost:6379/0'
'match': [ 'application.*.response_time', 'application.response_time' ]
'read_func': float
'write_func': lambda v: '%0.3f'%(v)
'intervals': {
'minute': {
'step': 60,
'steps': 240,
},
'daily' : {
'step': 'daily',
'steps': 30
}
},
}
}
聚合
类似于 Carbon 聚合器,但没有时间缓冲。匹配的统计信息将通过任何匹配的模式进行处理。是一个元组列表,支持将任意数量的不同统计信息汇总为一个。此时键名必须在字符集中[a-zA-Z0-9_-]。每个聚合被定义为(rollup_stat, source_stat)形式的元组。捕获可以以<capture>的形式定义并在每个汇总中使用。
例子:
AGGREGATES = [
('application.response_time', 'application.*.response_time'),
('application.<status_code>', 'application.*.status.<status_code>'),
]
变换
可以在查询中使用的函数的命名映射。
例子:
TRANSFORMS = {
# Returns the number of elements
'size' : lambda row: len(row)
}
宏
配置选项的命名映射,因此“foo(stat)”将导致传递给 kairos 的一组固定选项。这对于使用 kairos 的自定义读取功能特别有用。这个例子假设一个直方图存储在 redis 中。更复杂的宏可能会使用服务器端脚本。kairos 中公开的所有自定义读取函数都可以在此处定义。查询字符串的所有字段(“stat”除外)都可以在宏定义中设置,并且如果提供了这些查询参数,则将覆盖它们。要在宏中使用转换,请将“转换”字段设置为字符串或可调用对象。宏可以利用TRANSFORMS中定义的变换。
例子:
MACROS = {
'unique' : {
'fetch' : lambda handle,key: handle.hlen(key)
'condense' : lambda data: sum(data.values()),
'process_row' : lambda data: data,
'join_rows' : lambda rows: sum(rows),
}
}
调试
用于定义日志输出量的布尔值或整数。
0 或假
只记录错误。
1 或真
记录基本信息,不应产生大量输出。
2
记录重要信息,特别是来自karbon过程的信息。
调试
调试一个或一组模式可能会带来挑战。Torus 附带schema_debug,这是一个针对任意数量的模式测试任意数量的输入字符串的工具。它将输出与输入字符串匹配的规则、将存储匹配的数据库、将从输入规则生成的任何聚合,然后递归地输出匹配每个聚合的任何模式和聚合。
usage: schema_debug [-h] [--config CONFIG] strings [strings ...]
Debugging tool for schemas
positional arguments:
strings One or more input strings to test against the scheams
optional arguments:
-h, --help show this help message and exit
--config CONFIG Configuration file to load. Can be called multiple times
for multiple configuration files.
Torus 还支持可以在任何配置文件中定义的DEBUG标志,这将导致karbon打印到标准输出。如果为0或未定义,则不会生成输出。如果为1, karbon将在存储原始值 ( STOR ) 或聚合 ( AGRT ) 时记录,以及处理的数量和持续时间 ( DONE ) 的统计信息。如果DEBUG==2,karbon还将记录它收到的每一行(RECV)和它跳过的行(SKIP)。
要使用调试标志,您可以更改karbon加载的配置文件之一中的值,然后使用命令kill -SIGHUP `pidof karbon`向进程发出信号以重新加载。
性能测试
为了测试您的模式的性能和回归,环面包括 schema_test。该工具在模式中查找生成器定义,并不断调用它们以发出通过所有模式和聚合处理的数据点。打印出一些基本的统计数据。
usage: schema_test [-h] [--config CONFIG] [--clear] [--duration DURATION]
Tool for performance testing of schemas
optional arguments:
-h, --help show this help message and exit
--config CONFIG Configuration file to load. Can be called multiple
times for multiple configuration files.
--clear If true, clear all data before running the test.
Defaults to false.
--duration DURATION Duration of the test. Defaults to 60 seconds.
移民
有时您需要将数据从一种模式迁移到另一种模式。Torus 附带了migrate来促进这一点。
usage: migrate [-h] --config CONFIG --source SOURCE --destination DESTINATION
--interval INTERVAL [--start START] [--end END]
[--concurrency CONCURRENCY] [--stat STAT] [--match MATCH]
[--dry-run] [--verbose]
A tool to migrate data from one schema to another
optional arguments:
-h, --help show this help message and exit
--config CONFIG Configuration file to load. Can be called multiple
times for multiple configuration files.
--source SOURCE The name of the source schema [required]
--destination DESTINATION
The name of the destination schema [required]
--interval INTERVAL The name of the interval from which to read data
[required]
--start START Only copy stats occurring on or after this date. Same
format as web parameter. [optional]
--end END Only copy stats occurring on or before this date. Same
format as web parameter. [optional]
--concurrency CONCURRENCY
Set the concurrency on the schema target writing.
Defaults to 10.
--stat STAT The name of the stat to copy. Can be called multiple
times for a list of stats. If not provided, all stats
will be copied. [optional]
--match MATCH Pattern match to migrate a subset of the data.
[optional]
--dry-run Print out status but do not save results in the
destination schema. [optional]
--verbose Print out even more information during the migration
[optional]
安装
Torus 在pypi上可用,可以使用 pip安装
pip install torus
如果从源安装:
有开发需求(例如测试框架)
pip install -r development.pip
无开发要求
pip install -r requirements.pip
SQL
Torus 安装 SQLAlchemy 以支持 SQL。要使用您选择的方言,您可能需要安装其他软件包。有关更多详细信息,请参阅 文档 。
测试
使用鼻子运行测试套件。
$ nosetests
路线图
记录有关 karbon 和环面使用情况的指标
添加“死信”支持以跟踪不匹配任何架构的统计信息
将统计删除端点添加到环面
用于查询数据和可选地使用bashplotlib绘图的命令行工具
添加用于生成 tasseo 配置的工具 ( https://github.com/obfuscurity/tasseo )
添加为 Redis 和 SQLite 后端设置事务提交间隔的功能
研究更快的正则表达式引擎。pyre2目前正在运行中。
扩展支持的统计命名(unicode、符号等)
用于将 karbon 数据转发到另一个 Carbon 兼容主机的中继主机类型
架构迁移工具
torus和karbon的 log 和 stdout