Spec-Zone.ru › Graphite

Альтернативные поисковики хранилищ

Встроенные поисковики

По умолчанию конфигурация 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API