Этот пост показывает примеры кода в Python (2.7) для отправки данных в Graphite .
После того, как вы настроили сервер Graphite , с запущенным / собирающим Carbon, вам необходимо отправить данные для построения графиков.
По сути, вы пишете программу для сбора числовых значений и отправки их в бэкэнд-агрегатор Graphite (Carbon).
Для отправки данных вы создаете сокет- соединение с графитовым / углеродным сервером и отправляете сообщение (строку) в формате:
"metric_path value timestamp\n"
- `metric_path` : произвольное пространство имен, содержащее подстроки, разделенные точками. Самое общее имя слева, а наиболее конкретное — справа.
- `значение` : числовое значение для хранения.
- `timestamp` : время эпохи.
- сообщения должны заканчиваться завершающим символом новой строки.
- несколько сообщений могут быть упакованы и отправлены в одной операции сокета. каждое сообщение отделяется новой строкой, с завершающей новой строкой в конце пакета сообщений.
Пример сообщения:
"foo.bar.baz 42 74857843\n"
Давайте посмотрим на некоторый (Python 2.7) код для отправки данных в графит …
Вот простой клиент, который отправляет одно сообщение в графит.
Код:
#!/usr/bin/env python import socket import time CARBON_SERVER = '0.0.0.0' CARBON_PORT = 2003 message = 'foo.bar.baz 42 %d\n' % int(time.time()) print 'sending message:\n%s' % message sock = socket.socket() sock.connect((CARBON_SERVER, CARBON_PORT)) sock.sendall(message) sock.close()
Вот клиент командной строки, который отправляет одно сообщение графиту:
Использование:
$ python client-cli.py metric_path value
Код:
#!/usr/bin/env python import argparse import socket import time CARBON_SERVER = '0.0.0.0' CARBON_PORT = 2003 parser = argparse.ArgumentParser() parser.add_argument('metric_path') parser.add_argument('value') args = parser.parse_args() if __name__ == '__main__': timestamp = int(time.time()) message = '%s %s %d\n' % (args.metric_path, args.value, timestamp) print 'sending message:\n%s' % message sock = socket.socket() sock.connect((CARBON_SERVER, CARBON_PORT)) sock.sendall(message) sock.close()
Вот клиент, который собирает среднюю нагрузку (только для Linux) и отправляет пакет из 3 сообщений (1 мин / 5 мин / 15 мин loadavg) в графит. Он будет работать непрерывно в цикле, пока не будет убит. (отрегулируйте задержку для более быстрого / медленного интервала сбора):
#!/usr/bin/env python import platform import socket import time CARBON_SERVER = '0.0.0.0' CARBON_PORT = 2003 DELAY = 15 # secs def get_loadavgs(): with open('/proc/loadavg') as f: return f.read().strip().split()[:3] def send_msg(message): print 'sending message:\n%s' % message sock = socket.socket() sock.connect((CARBON_SERVER, CARBON_PORT)) sock.sendall(message) sock.close() if __name__ == '__main__': node = platform.node().replace('.', '-') while True: timestamp = int(time.time()) loadavgs = get_loadavgs() lines = [ 'system.%s.loadavg_1min %s %d' % (node, loadavgs[0], timestamp), 'system.%s.loadavg_5min %s %d' % (node, loadavgs[1], timestamp), 'system.%s.loadavg_15min %s %d' % (node, loadavgs[2], timestamp) ] message = '\n'.join(lines) + '\n' send_msg(message) time.sleep(DELAY)
Ресурсы:
- Графит Документы
- Graphite Docs — ввод данных в графит
- Установка Graphite 0.9.9 на Ubuntu 12.04 LTS
- Установка и настройка Graphite
КОНЕЦ