我正在尝试编写一个 Python 程序来直接从存储在我们工作服务器上的 RRD 性能文件中提取信息,但这些文件不是以纯文本格式存储的,而且我找不到任何规范来分解 RRDtool 在 RRD 文件中存储信息的实际格式(即,前 N 位描述 X,接下来的 N 位描述 Y,等等)。
我知道我可以使用 RRDtool 的“fetch”和“dump”实用程序来提取单个记录,或将整个文件转储到一个巨大的 XML 中,但我想尝试从头开始编写一些内容,以便让我更好地控制文件的读取方式和使用的空间量(每个 XML 转储大约 1GB)。
我想要解决的一种情况的示例:查找服务器上次记录特定值的时间(即,上次记录的丢弃数据包数量超过一定数量的时间)。
我在网上查找过,但我发现的所有内容都只是指向使用 RRDtool 实用程序,而不是有关 RRD 文件本身如何格式化的任何描述。
如果这个 Exchange 不适合提出这个问题,我深表歉意;由于我的问题并不是专门针对编程的,所以这个 Exchange 似乎是最合适的。我也不确定我是否使用了最适合这个问题的标签,所以我当然愿意接受建议。
答案1
您是否考虑过使用 RRDTool 的 JSON 导出功能?
您可以先将 RRD 文件的内容导出为 JSON,它比 XML 轻量得多,然后根据您的喜好对其进行解析和操作。
http://oss.oetiker.ch/rrdtool/doc/rrdxport.en.html
另外值得一提的是一些 PERL 和 R 包可能会帮助您实现目标。
PERL 的 RRD 编辑器:http://search.cpan.org/~dougleith/RRD-Editor/lib/RRD/Editor.pm
对于 R:https://github.com/pldimitrov/Rrd
答案2
我认为理解 RRD 文件二进制格式的最佳解决方案是从下载 RDDTool 源代码https://oss.oetiker.ch/rrdtool/download.en.html并从源文件rrd_fetch.c对文件规范进行逆向工程。
如果您想了解 RRD XML 的结构,请参阅https://serverfault.com/questions/287829/where-documentation-of-rrddump-xml-format-is
完成艰苦的工作后,您可以在此处发布您的研究结果摘要:)。