Альтернативные поисковики хранилищ
Встроенные поисковики
По умолчанию конфигурация Graphite состоит из:
- Базы данных Whisper
- Демона carbon, записывающего данные в базу данных
- Graphite-web, считывающего и отображающего данные из базы данных
Для удовлетворения конкретных потребностей возможно использование альтернативного уровня хранения данных по сравнению с базовым Whisper. В таком случае конфигурация будет следующей:
- Альтернативная база данных
- Демон carbon или другой альтернативный демон для записи в базу данных
- Пользовательский поисковик хранилища для считывания данных в graphite-web
В этом разделе описывается последний пункт: настройка graphite-web для чтения данных из пользовательского уровня хранения.
Это можно сделать с помощью параметра STORAGE_FINDERS. Этот параметр представляет собой список путей к реализациям поисковиков. Его значение по умолчанию:
STORAGE_FINDERS = (
'graphite.finders.remote.RemoteFinder',
'graphite.finders.standard.StandardFinder',
) Поисковик по умолчанию считывает данные из базы данных Whisper.
Доступен альтернативный поисковик для экспериментальной базы данных Ceres:
STORAGE_FINDERS = (
'graphite.finders.ceres.CeresFinder',
) Параметр поддерживает несколько значений, что означает возможность чтения данных как из базы данных Whisper, так и из базы данных Ceres:
STORAGE_FINDERS = (
'graphite.finders.remote.RemoteFinder',
'graphite.finders.standard.StandardFinder',
'graphite.finders.ceres.CeresFinder',
) Пользовательские поисковики
STORAGE_FINDERS являясь списком произвольных путей Python, написать пользовательский поисковик для чтения данных из источников помимо Whisper и Ceres относительно просто. Поисковик — это класс Python с методом find_nodes().
class CustomFinder(object):
def find_nodes(self, query):
# ... query является объектом FindQuery. find_nodes() — точка входа при просмотре дерева метрик. Он должен возвращать листья или ветви, соответствующие запросу:
from graphite.node import LeafNode, BranchNode
from graphite.finders.utils import BaseFinder
class CustomFinder(BaseFinder):
def find_nodes(self, query):
# find some paths matching the query, then yield them
for path in matches:
if is_branch(path):
yield BranchNode(path)
if is_leaf(path):
yield LeafNode(path, CustomReader(path)) LeafNode создается с помощью ридера, который является классом, ответственным за извлечение точек данных для заданного пути. Это простой класс с двумя методами: fetch() и get_intervals().
from graphite.intervals import IntervalSet, Interval
from graphite.readers.utils import BaseReader
class CustomReader(BaseReader):
__slots__ = ('path',) # __slots__ is recommended to save memory on readers
def __init__(self, path):
self.path = path
def fetch(self, start_time, end_time):
# fetch data
time_info = _from_, _to_, _step_
return time_info, series
def get_intervals(self):
return IntervalSet([Interval(start, end)]) fetch() должен возвращать список из 2 элементов: информацию о времени для данных и сами точки данных. Информация о времени представляет собой список из 3 элементов: начальное время точек данных (в формате Unix time), конечное время и шаг времени (в секундах) между точками данных.
Точки данных — это список точек, найденных в базе данных для заданного интервала. В наборе данных должно быть (end - start) / step точек, даже если в базе данных есть пробелы: пробелы могут быть заполнены значениями None.
get_intervals() — метод, который даёт Graphite-web подсказку о диапазоне времени, доступном для данной метрики в базе данных. Он должен возвращать список одного или нескольких объектов IntervalSet.
Расширенные поисковики
Пользовательские поисковики также могут реализовывать следующие методы:
factory(cls)-
Этот метод класса отвечает за инициализацию и возврат объекта(ов) поисковика в виде списка.
Он может возвращать список из 1 или более экземпляров поисковика; если возвращается несколько экземпляров, они будут вызваны параллельно в нескольких потоках. Это используется для распределения запросов на несколько удалённых хостов параллельно.
Если не определён, будет создан один экземпляр поисковика без параметров.
get_index(self, requestContext)-
Этот метод должен возвращать все пути узлов, о которых знает поисковик, в виде списка строк.
requestContext— словарь, который может содержать ключиlocalOnlyиforwardHeaders.Если не реализован,
find_nodes()будет вызван с запросом для**, и будет возвращён список путей возвращённых узлов. find_multi(self, queries)-
Этот метод следует той же семантике, что и
find_node(), но принимает список запросов.Если не реализован,
find_nodes()будет вызван для каждого указанного запроса. fetch(self, patterns, start_time, end_time, now=None, requestContext=None)-
Этот метод отвечает за загрузку данных для запросов отображения.
Он должен вернуть список словарей результатов, каждый из которых содержит:
{ 'pathExpression': '<the pattern that this path matched>', 'path': 'the.metric.path', 'name': 'the.metric.path', 'time_info': (_from_, _to_, _step_), 'values': [list of values], }Если не реализован,
find_multi()будет вызван со списком запросов, иnode.fetch()будет вызван для каждого результата. auto_complete_tags(self, exprs, tagPrefix=None, limit=None, requestContext=None)-
Этот метод используется только при указании
tags = Trueв определении класса.Если определён, он должен возвращать список автодополнения тегов для серий, которые соответствуют указанным выражениям.
auto_complete_values(self, exprs, tag, valuePrefix=None, limit=None, requestContext=None)-
Этот метод используется только при указании
tags = Trueв определении класса.Если определён, он должен возвращать список автодополнения значений для указанного тега в сериях, которые соответствуют указанным выражениям.
Установка пользовательских поисковиков
Для того, чтобы ваш пользовательский поисковик можно было импортировать, необходимо упаковать его в выбранном вами пространстве имён. Упаковка Python здесь не рассматривается, но вы можете посмотреть на поисковики сторонних разработчиков, чтобы получить вдохновение:
- Поисковик Cyanite
- Поисковик BigGraphite
- Поисковик KairosDB
© 2008–2012 Chris Davis
© 2011–2016 The Graphite Project
Licensed under the Apache License, Version 2.0.
https://graphite.readthedocs.io/en/latest/storage-backends.html