Статьи

How-to: данные Python в графит для мониторинга блаженства

Этот пост показывает примеры кода в 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)

Ресурсы:

 

 

КОНЕЦ