Array
(
    [__flash] => Array
        (
        )

    [guest] => Array
        (
            [hash_id] => 981jrqhfuqt046i07u4u2kbi30
        )

)
Серверы
  • Готовые серверы
  • Конфигуратор
  • Серверы с 1CPU
  • Серверы с 2CPU
  • 4 поколение AMD EPYC и Intel Xeоn
  • Серверы с AMD Ryzen и Intel Core i9
  • Серверы для хранения данных
  • Cерверы с портом 10 Гбит/c
  • GPU
  • Распродажа
  • VPS
    GPU
  • Выделенные серверы с GPU
  • Виртуальные серверы с GPU
  • GPU-серверы с Nvidia RTX 5090
  • GPU-серверы с AMD Radeon
  • Распродажа
    Маркетплейс
    Colocation
  • Размещение серверов в дата-центре в Москве
  • Обслуживание серверов в других ЦОД
  • Прокат
    Услуги
  • Аренда сетевого оборудования
  • Защита L3-L4 от DDoS атак
  • IPV4 и IPV6 адреса
  • Администрирование серверов
  • Уровни технической поддержки
  • Мониторинг сервера
  • BYOIP
  • USB диск
  • IP-KVM
  • Трафик
  • Коммутация серверов
  • AI-чат-бот Lite
  • AI-платформа
  • О нас
  • Работа в HOSTKEY
  • Панель управления серверами и API
  • Дата-центры
  • Сеть
  • Тест скорости
  • Специальные предложения
  • Отдел продаж
  • Для реселлеров
  • Гранты для специалистов по Data Science
  • Гранты для научных проектов и стартапов
  • Документация и Частые вопросы
  • Новости
  • Блог
  • Оплата
  • Документы
  • Сообщите о нарушении
  • Looking Glass
  • 25.10.2022

    Использование Prometheus + Alertmanager + Node Exporter для мониторинга geo-распределенной инфраструктуры компании.

    server one
    HOSTKEY
    Арендуйте выделенные и виртуальные серверы с моментальным деплоем в надежных дата-центрах класса TIER III в Москве и Нидерландах. Принимаем оплату за услуги HOSTKEY в Нидерландах в рублях на счет российской компании. Оплата с помощью банковских карт, в том числе и картой МИР, банковского перевода и электронных денег.

    Автор: Senior Devops. Ведущий специалист по инфраструктуре Hostkey Никита Зубарев

    Компания Hostkey предоставляет серверы в аренду — это накладывает на нас, сотрудников компании, обязательства по контролю качества работы оборудования. Одним из ключевых элементов поддержания большой инфраструктуры является эффективная система мониторинга, позволяющая оперативно выявлять сбои в работе серверов. Мы хотим поделиться нашим опытом внедрения и использования различных инструментов, позволяющих отслеживать работу оборудования.

    В этой статье мы кратко рассмотрим варианты установки федерации Prometheus, Alertmanager и Node Exporter, остановимся на некоторых особенностях и конфигурации. Можно использовать установку из docker-compose файла или же развернуть систему в Kubernetes-кластере. Наша задача — собирать метрики серверов и сервисов инфраструктуры компании, хранить их, реагировать на алерты. Для решения этих задач необходима база данных.

    Мы выбрали Prometheus по ряду причин:

    • это популярный инструмент с обширной документацией и большим сообществом;
    • открытый исходный код, написанный на Golang;
    • совместим c Docker и т. д.

    Prometheus представляет собой систему мониторинга систем и служб. Он собирает метрики от настроенных целей через заданные временные интервалы, оценивает выражения правил, отображает результаты и может запускать оповещения при соблюдении определенных условий. Для установки всех компонентов системы мы используем ansible-playbook.

    Одной из особенности нашей компании является geo-распределенная инфраструктура: HOSTKEY располагает оборудованием в нескольких ЦОДах в Москве, Амстердаме и Нью-Йорке. Иерархическая федерация позволяет серверу Prometheus собирать выбранные временные ряды с другого сервера Prometheus, а также масштабироваться до сред с множеством центров обработки данных и узлов. В этом случае топология федерации напоминает дерево, где серверы Prometheus более высокого уровня собирают агрегированные данные временных рядов с большего числа подчиненных серверов.

    Пример конфигурации с объединения метрики с одного сервера на другой:

    scrape_configs:
    - job_name: 'federate'
    	scrape_interval: 15s
    
    	honor_labels: true
    	metrics_path: '/federate'
    
    	params:
    		'match[]':
    			- '{job="prometheus"}'
    			- '{__name__=~"job:.*"}'
    
    	static_configs:
    		- targets:
    			- 'ru-<instance_address>:9090'
    			- 'nl-<instance_address>:9090'
    			- 'us-<instance_address>:9090'

    В качестве источника базовых метрик для Prometheus используется Node Exporter — http-приложение, собирающее метрики операционной системы. Prometheus собирает данные с одного или нескольких экземпляров Node Exporter (о том, как написать собственный экспортер, расскажем в следующих статьях). Node Exporter должен быть установлен на каждом хосте.
    После запуска метрики доступны на 9100 порту:

    Чтобы метрика попала в базу Prometheus, необходимо описать конфигурацию в файле:
    ru-federation-app01a / # vim /etc/prometheus/prometheus.yml

     - job_name: 'infra.hostkey'
    	static_configs:
    		- targets:
    			- <instance_address>:9100
    			- <instance_address>:9100
    			- <instance_address>:9100

    Файл должен быть в формате .yaml (управление конфигурацией мы рассмотрим в следующих статьях).

    После рестарта сервиса Prometheus можно открыть его пользовательский интерфейс в браузере "<server_address>:9090". На странице "/targets" отображается статус систем, с которых вы получаете метрики.

    Визуализация

    Grafana — фронтенд к различным time series db: Graphite, InfluxDB, Prometheus — с красивыми и понятными графиками, а самое главное — с множеством шаблонов, подходящих для 90% возможных задач. Формат .json позволяет легко дорабатывать графики. Для удобства проксируем порт Grafana через nginx и подключаем ldap-авторизацию.

    Почти все значения Node Exporter по умолчанию представлены в виде графика. Импортируем дашборд:

    Отображение алертов

    Создаем конфигурацию правил алертов <instance_address>.yml.

    По сути, можно управлять алертингом любого параметра, доступного в node_exporter:

    groups:
    	- name: <instance_address>
    		rules:
    		- alert: InstanceDown
    			expr: up{job="<instance_address>"} == 0
    			for: 5m
    			labels:
    				severity: page
    			annotations:
    				summary: "Instance {{ .instance }} down"
    				description: "{{ .instance }} of job {{ .job }} has been down for more than 5 minutes."
    	
    	#==========CPU==================================================================
    		- alert: NodeCPUUsage
    			expr: (100 - (irate(node_cpu{mode="idle", job="<instance_address>"}[5m]) * 100)) > 50
    			for: 2m
    			labels:
    				severity: page
    			annotations:
    				summary: High CPU usage detected CPU usage is above 75%
    	# ==============Memory==========================================================
    		- alert: NodeSwapUsageSwap
    			expr: (((node_memory_SwapTotal-node_memory_SwapFree{job="<instance_address>"})/node_memory_SwapTotal{job="<instance_address>"})*100) > 30
    			for: 2m 
    			labels:
    				severity: page
    			annotations:
    				summary: Swap usage detected Swap usage usage is above 50%
    		- alert: NodeMemoryUsageMemFree
    			expr: (((node_memory_MemTotal-node_memory_MemFree-node_memory_Cached{job="<instance_address>"})/(node_memory_MemTotal{job="<instance_address>"})*100)) > 30
    			for: 2m
    			labels:
    				severity: page
    			annotations:
    				summary: High memory usage detected, Memory usage is above 50%
    	#==============Load=============================================================
    	
    		- alert: nodeLoad1
    			expr: node_load1{job="<instance_address>"} > 0.7
    			for: 1m
    			labels:
    				severity: page
    			annotations:
    				summary: Load
    	#================Disk space Used ================================================
    		- alert: diskSpaceUsed
    			expr: (100.0 - 100 * (node_filesystem_avail{job="<instance_address>"} / node_filesystem_size{job="<instance_address>"})) > 80
    			for: 10m
    			labels:
    				severity: page
    			annotations:
    				summary: Disk space userd 80
    	#=============nodeContrack========================================
    		- alert: nodeContrack
    			expr: node_nf_conntrack_entries{job="<instance_address>"} > 200
    			for: 10m
    			labels:
    				severity: page
    			annotations:
    				summary: nodeContrack
    	#=============nodeCntextSwitches ========================================
    		- alert: nodeCntextSwitches
    			expr: irate(node_context_switches{job="<instance_address>"}[5m]) > 100
    			for: 5m
    			labels:
    				severity: page
    			annotations:
    				summary: nodeCntextSwitches
    	#=============Disk Utilization per Device ========================================
    		- alert: DiskUtilizationPerDevice
    			expr: irate(node_disk_io_time_ms{job="<instance_address>"}[5m])/10 > 0.2
    			for: 5m
    			labels:
    				severity: page
    			annotations:
    				summary: DiskUtilizationPerDevice
    	#============Disk IOs per Device ========================================
    		- alert: DiskIOsPerDeviceRead
    			expr: irate(node_disk_reads_completed{job="<instance_address>"}[5m]) >10
    			for: 5m
    			labels:
    				severity: page
    			annotations:
    				summary: DiskIOsPerDevice
    	
    		- alert: DiskIOsPerDeviceWrite
    			expr: irate(node_disk_writes_completed{job="<instance_address>"}[5m]) > 10
    			for: 5m
    			labels:
    				severity: page
    			annotations:
    				summary: DiskIOsPerDevice
    	#===========Disk Throughput per Device========================================
    		- alert: DiskThroughputPerDeviceReads
    			expr: irate(node_disk_sectors_read{job="<instance_address>"}[5m]) * 512 >10000000
    			for: 5m
    			labels:
    				severity: page
    			annotations:
    				summary: DiskIOsPerDevice
    		- alert: DiskThroughputPerDeviceWrites
    			expr: irate(node_disk_sectors_written{job="<instance_address>"}[5m]) * 512 > 10000000
    			for: 5m
    			labels:
    				severity: page
    			annotations:
    				summary: DiskIOsPerDevice
    	#===========Network Traffic========================================
    		- alert: NetworkTrafficReceive
    			expr: irate(node_network_receive_bytes{job="<instance_address>"}[5m])*8 > 5000
    			for: 5m
    			labels:
    				severity: page
    			annotations:
    				summary: NetworkTrafficReceive
    		- alert: NetworkTrafficTransmit
    			expr: irate(node_network_transmit_bytes{job="<instance_address>"}[5m])*8 > 5000
    			for: 5m
    			labels:
    				severity: page
    			annotations:
    				summary: NetworkTrafficTransmit
    	
    	#===========Netstat========================================
    		- alert: Netstat
    			expr: node_netstat_Tcp_CurrEstab{job="<instance_address>"} > 20
    			for: 5m
    			labels:
    				severity: page
    			annotations:
    				summary: Netstat
    	
    	#===========UDP Stats============================
    		- alert: UDPStatsInDatagrams
    			expr: irate(node_netstat_Udp_InDatagrams{job="<instance_address>"}[5m]) > 50
    			for: 5m
    			labels:
    				severity: page
    			annotations:
    				summary: UDPStats
    		- alert: UDPStatsInErrors
    			expr: irate(node_netstat_Udp_InErrors{job="<instance_address>"}[5m]) > 20
    			for: 5m
    			labels:
    				severity: page
    			annotations:
    				summary: UDPStats
    		- alert: UDPStatsOutDatagrams
    			expr: irate(node_netstat_Udp_OutDatagrams{job="<instance_address>"}[5m]) > 50
    			for: 5m
    			labels:
    				severity: page
    			annotations:
    				summary: UDPStats
    		- alert: UDPStatsNoPorts
    			expr: irate(node_netstat_Udp_NoPorts{job="<instance_address>"}[5m]) > 20
    			for: 5m
    			labels:
    				severity: page
    			annotations:
    				summary: UDPStats
    	

    Конфигурацию алерта подключаем в prometheus.yml:

    rule_files:
    - "<instance_address>.yml"

    Alertmanager

    Перенаправить алерты можно почти в любую систему: email, Telegram, Slack, Rocket.Chat.

    alerting:
      alertmanagers:
      - static_configs:
        - targets:
          - alertmamager-app01a.infra.hostkey.ru:9093

    Пример для Rocket.Chat:

    alertmanager-app01a ~ # vin /etc/alertmanager/alertmanager.yml
    
    				route:
    						repeat_interval: 5m
    						group_interval: 5m
    						receiver: 'rocketchat'
    				
    				receivers:
    						- name: 'rocketchat'
    							webhook_configs:
    									- send_resolved: false
    										url: 'https://chat_address/hooks/devtest'
    				
    				

    Рассмотрим основное содержание конфигурационного файла:

    global:
    	route:
    		group_b: ['по каким параметрам группировать правила']
    		group_wait: "время ожидания перед отправкой уведомления для группы"
    		group_interval: "время отправки повторного сообщения для группы"
    		repeat_interval: "время до отправки повторного сообщения"
    		receive: "имя способа отправки сообщений"
    	receivers:
    		- nam: "имя способа отправки сообщений"
    			конфигурация

    Все алерты, поступившие в AlertManager, необходимо группировать, чтобы не отправлять информацию об одних и тех же событиях несколько раз. Директива group_by указывает, какие поля использовать во время группировки. После создания новой группы алертов к делу подключается параметр group_wait. Он указывает время ожидания перед отправкой первого сообщения. Параметр позволяет получить одним сообщением всю совокупность алертов группы, а не отдельное сообщение для каждого алерта.

    Параметр group_interval указывает, сколько необходимо ждать после отправки первого сообщения для группы до отправки повторных сообщений из этой же группы. Однако не только он влияет на интервал между сообщениями, еще есть параметр repeat_interval, который указывает, через какой промежуток времени можно повторить отправку того же алерта.

    Получаем:

    Prometheus AlertManager

    Панель инструментов для визуализации на основе одного дашборда в нашей компании используется для мониторинга дежурной сменой:

    В результате мы получили рабочую систему мониторинга для geo-распределенной инфраструктуры, которую в дальнейшем адаптировали к нашей специфике (об этом опыте расскажем в следующих статьях). Гибкость настроек описанных сервисов позволяет адаптировать систему мониторинга под конкретные нужды любой компании и значительно снизить трудозатраты инженеров и иных специалистов на поддержание инфраструктуры.

    Арендуйте выделенные и виртуальные серверы с моментальным деплоем в надежных дата-центрах класса TIER III в Москве и Нидерландах. Принимаем оплату за услуги HOSTKEY в Нидерландах в рублях на счет российской компании. Оплата с помощью банковских карт, в том числе и картой МИР, банковского перевода и электронных денег.

    Другие статьи

    22.02.2025

    Как добавить в OpenWebUI генерацию изображений через ComfyUI

    Добавьте поддержку генерации изображений в OpenWebUI с помощью ComfyUI! Подробное руководство по установке, настройке API, загрузке моделей и автоматическому запуску сервиса.

    14.02.2025

    Что нового в OpenWebUI версий 0.5.x

    OpenWebUI 0.5.x — это новый уровень работы с языковыми моделями! Асинхронные чаты, Code Interpreter, генерация изображений прямо из промта, поддержка Google Drive, гибкие настройки прав пользователей и еще масса улучшений.

    31.01.2025

    Памяти много не бывает. Исследуем сервер от GIGABYTE - R283-ZK0-AAL1

    Мы протестировали сервер GIGABYTE R283-ZK0-AAL1 с 48 слотами RAM и выяснили, насколько эффективно он справляется с нагрузками. Экономия на памяти, температурные показатели и тесты производительности – все подробности в нашем обзоре!

    23.01.2025

    Четыре Radeon RX 7900, нейросеть и настольная игра

    Сможет ли языковая модель играть в сложную настольную игру, а не только решать задачи и писать тексты? Мы проверили это на связке из четырёх Radeon RX 7900 XTX с 24 ГБ памяти. Результаты удивляют!

    24.12.2024

    Как мы мониторинг SMART-данных дисков в оVirt экосистеме прикручивали

    Представьте, что на одной из множества ваших виртуальных машин, работающих на oVirt, начнет давать сбой диск в одном из узлов? Мы в Hostkey используем связку smartctl_exporter совместно с Prometheus и Grafana чтобы отследить этот момент и успеть принять меры и хотим поделиться с вами нашим опытом.

    HOSTKEY Выделенные серверы в Европе, России и США Готовые решения и индивидуальные конфигурации серверов на базе процессоров AMD, Intel, карт GPU, Бесплатной защитой от DDoS-атак и безлимитный соединением на скорости 1 Гбит/с 30
    4.3 48 48
    Upload