Ни единого разрыва. Пишем на C# утилиту для мониторинга сети - «Новости» » Самоучитель CSS
Меню
Наши новости
Учебник CSS

Невозможно отучить людей изучать самые ненужные предметы.

Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3

Надо знать обо всем понемножку, но все о немногом.

Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы

Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)

Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода

Самоучитель CSS

Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5

Новости

Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости

Справочник CSS

Справочник от А до Я
HTML, CSS, JavaScript

Афоризмы

Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы

Видео Уроки


Наш опрос



Наши новости

      
      
  • 24 марта 2016, 16:20
7-04-2020, 12:40
Ни единого разрыва. Пишем на C# утилиту для мониторинга сети - «Новости»
Рейтинг:
Категория: Новости

Если тебе надоели постоянные обрывы связи и косяки провайдера, но субъективные оценки типа «подвисает» не внушают доверия, лучший выбор — записать состояние сети в автоматическом режиме. Причем для этого необязательно гонять Nagios, который к тому же не так прост в настройке. Сегодня мы напишем утилиту для мониторинга сети, которая легко настраивается и сохраняет в журнал RTT до заданных хостов, packet loss и скорость соединения (опционально), а логи летят прямо в Telegram.

Виновником появления этой статьи стал уже несколько месяцев сбоящий интернет, который мне предоставляет единственный в округе провайдер. Увы, в мою деревню ничего, кроме ADSL, не завезли, и, судя по качеству связи, и тот не дошел без многочисленных скруток. Packet loss порой доходит до 60–70%, что уже ни в какие ворота не лезет. Поэтому я решил сам измерить качество связи, дабы ткнуть провайдеру под нос логи вместе с заявлением о расторжении договора.


Задачи



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



  • Пинг для заданных хостов. Просто маст-хэв для любой диагностической утилиты. Измеряя пинг, можно узнать также и процент потерь пакетов (packet loss), и коды ошибок, позволяющие узнать, что именно не так с сетью. Например, Destination Prohibited означает, что сеть РІСЂРѕРґРµ Рё есть, РЅРѕ администратор какого-то РёР· промежуточных устройств РЅРµ пропускает пакет. Р’ общем, анализировать статус-РєРѕРґС‹ ответов обязательно.

  • Реальная возможность подключений РїРѕ TCP. Р’РѕР·РјРѕР¶РЅР° ситуация, РєРѕРіРґР° хосты РІСЂРѕРґРµ Р¶РёРІС‹ Рё откликаются РЅР° РїРёРЅРі, DNS работает, Р° доступ РІ интернет закрыт Р·Р° неоплату. Этот тест потенциально позволит нам выявить недобросовестного провайдера, который подделывает ответы РЅР° РїРёРЅРіРё, РЅРѕ РЅРµ обеспечивает реальный коннект.

  • Уведомления Рѕ времени даунтайма РІ Telegram. РћРЅРё должны отправляться, как только соединение восстановится. Сообщение РїРѕ-хорошему должно включать расширенную инфу Рѕ РїРёРЅРіРµ Рё потерях пакетов после СЃР±РѕСЏ, Р° также состояние HTTP-клиента.

  • Доступ Рє роутеру. Для домашней сети СЃ нестабильным Wi-Fi это особенно актуально. Роутер может просто упасть РѕС‚ перегрузки (например, очередной школохакер ломится РЅР° дырявый WPS, РЅРѕ вместо взлома получается DoS) или попросту РЅРµ выдержать всех клиентов, которых РІ РёРЅРѕРј «умном доме» может быть Рё 15, Рё 20. Короче, роутер РІ любой момент может уйти РІ перезагрузку, Р° РјС‹ будем грешить РЅР° провайдера. Это нехорошо, поэтому РїСЂРё потере СЃРІСЏР·Рё СЃ роутером РјС‹ РЅРµ будем тестировать дальше, Р° просто подождем, РїРѕРєР° починят.

Цели обрисованы. Теперь детали реализации.



  • Программа предназначена для длительной работы РІ фоновом режиме. Оформим программу как системный сервис Windows.

  • Если РјС‹ работаем РІ фоновом режиме, РЅРё консольный интерфейс, РЅРё тем более GUI нам РЅРµ нужен. Тем лучше — меньше РєРѕРґР°.

  • Проверки РЅРµ должны сильно нагружать канал, ведь будет некомфортно работать. Так что постоянно флудить пингами РјС‹ РЅРµ станем. Отправим очередь РёР· десятка пакетов раз РІ минуту-РґРІРµ, Рё хватит. Реже отправлять РЅРµ имеет смысла — большинство неполадок устраняются РІ течение нескольких РјРёРЅСѓС‚, Р° РјС‹ хотим знать Рѕ каждом СЃР±РѕРµ.

  • Возможность хранить отчет РІ JSON Рё выгружать CSV для изучения РІ Excel — СЃ фильтрацией РїРѕ дате создания.

  • Неплохо Р±С‹ прикрутить возможность забирать логи РїРѕ сети Рё скидывать статистику РЅР° центральный сервер, РЅРѕ РІ рамках демо СЏ этого делать РЅРµ Р±СѓРґСѓ.

Р?Р· этого следует, что нам понадобится работа СЃ JSON. Писать СЏ Р±СѓРґСѓ РЅР° C# Рё воспользуюсь модулем Json.NET.



WWW

Json.NET — популярная и простая библиотека для работы с JSON. Скачать ее можно с NuGet, а примеры использования лежат на сайте проекта.


 

РљРѕРґРёРј



Для начала скачай Visual Studio с сайта Microsoft, если у тебя ее еще нет. Нужна поддержка языка C# и NuGet (с вкладки «Дополнительные компоненты»).



Первым делом создаем новый проект типа «Консольное приложение». Можно было, конечно, реализовать его в качестве «Службы Windows», тогда не нужно было бы городить костыли для регистрации нашего монитора как системной службы. Бонусом получили бы автозапуск. Жаль, что в случае «шаблонного» сервиса мы теряем ту гибкость и управляемость, что имеем при ручном управлении.



Тип проекта «Служба Windows», если решишь им воспользоваться
Тип проекта «Служба Windows», если решишь им воспользоваться

Готово. Теперь — алгоритм. Алгоритм работы программы будет РїСЂРѕСЃС‚. Р’Рѕ-первых, РЅСѓР¶РЅРѕ прочитать настройки. РћРЅРё Сѓ нас Р±СѓРґСѓС‚ РІ файле JSON СЂСЏРґРѕРј СЃ исполняемым файлом. Р’Рѕ-вторых, надо создать Рё запустить таймер, чтобы неожиданные задержки канала РЅРµ мешали нам производить замеры через равные промежутки времени. Р? РІ-третьих, надо написать РєРѕРґ сохранения результатов замеров. Поехали!



Сперва определим, что именно мы сможем настраивать. Я выбрал следующие параметры:



  • С…РѕСЃС‚ Рё РїРѕСЂС‚, РґРѕ которых будет проходить проверка работоспособности HTTP;

  • количество пакетов РїРёРЅРіР° Рё РёС… тайм-аут;

  • задержка перед отправлением следующего пакета РїРёРЅРіР°;

  • задержка между соседними измерениями (та, которая определяет, раз РІ сколько РјРёРЅСѓС‚ проверка);

  • включить или выключить вывод сообщений РІ консоль (для отладки);

  • хосты, которые будем пинговать;

  • IP роутера (чтобы узнавать, РЅРµ завис ли РѕРЅ). РўС‹ спросишь, зачем отдельно IP роутера, если его РјРѕР¶РЅРѕ указать РІ общем СЃРїРёСЃРєРµ адресов для проверки, Рё будешь прав. Разница РІ том, что, если программа РЅРµ обнаружит СЃРІСЏР·Рё СЃ роутером, остальные хосты проверяться РЅРµ Р±СѓРґСѓС‚, чтобы РЅРµ тратить ресурсы;

  • тайм-аут для подключения РїРѕ HTTP;

  • максимальный уровень packet loss, РїСЂРё котором подключение считается нормальным. РњРЅРµ пришлось поставить себе 10%, так как 5–7% совсем РЅРµ редкость для моей деревни;

  • выходной формат строки для CSV, если ты РІРґСЂСѓРі решишь отключить вывод ненужных столбцов. Признаюсь, СЏ СѓР¶Рµ забыл, зачем РјРЅРµ это понадобилось;

  • выходной файл CSV, РІ который Р±СѓРґСѓС‚ дописываться результаты Рё возможность отключить запись.

static String       HTTP_TEST_HOST;
static int HTTP_TEST_PORT;
static int HTTP_TIMEOUT;
static int PING_COUNT;
static int PING_DELAY;
static int PING_TIMEOUT;
static List<String> PING_HOSTS;
static int MEASURE_DELAY;
static String ROUTER_IP;
static bool CUI_ENABLED;
static double MAX_PKT_LOSS;
static String OUT_FILE;
static bool WRITE_CSV;
static String CSV_PATTERN;
static String TG_TOKEN;
static String TG_CHAT_ID;
static bool TG_NOTIFY;


Думаю, нет смысла расписывать, какая переменная за что отвечает, я постарался дать им понятные названия. Если что, можешь прочитать комментарии к коду (ссылка на GitHub — в конце статьи).



С настройками разобрались, теперь добавим их загрузку. Тут все просто: читаем файл, скармливаем его Json.NET, раскладываем настройки по переменным.



Ни единого разрыва. Пишем на C# утилиту для мониторинга сети - «Новости»
Загружаем настройки

Теперь позаботимся о выводе CSV. Поскольку строка в конфиге задает только шаблон вывода, заголовки столбцов нам придется назначить самостоятельно. А так как мы хотим знать и результаты измерений по каждому хосту из списка, нужен цикл. Ниже — часть кода, которая отвечает за формирование заголовка таблицы.



String CSV_HEADER = CSV_PATTERN
.Replace("FTIME", "Snapshot time")
.Replace("IUP", "Internet up")
.Replace("AVGRTT", "Average ping (ms)")
.Replace("ROUTERRTT", "Ping to router (ms)")
.Replace("LOSS", "Packet loss, %")
.Replace("MID", "Measure ID")
.Replace("SEQ", "SeqID")
.Replace("HTTP", "HTTP OK")
.Replace("STIME", "STime");
foreach (var host in PING_HOSTS) {
CSV_HEADER = CSV_HEADER.Replace("RN", $"RTT to {host};RN");
}
CSV_HEADER = CSV_HEADER.Replace("RN", ";;rn");
[/code]

Теперь небольшое пояснение, что тут происходит. Сначала мы заменяем почти все идентификаторы в строке формата на их человекочитаемые значения. Почти — потому что RN, обозначающий конец строки, остается. Далее в цикле мы вот таким нехитрым образом дописываем новые столбцы, а под конец закрываем строку с помощью ;;rn и убираем RN.



Парсим аргументы и выводим справку
Парсим аргументы и выводим справку

С этим кодом и так все понятно: парсим аргументы, если их нет — выводим справку. Программа знает четыре режима работы.



При запуске без аргументов. Просто выводит справку и ждет, когда пользователь ее прочитает.
Запуск СЃ -d или --daemon. Программа запускается Рё работает РІ фоновом режиме, РЅРёРєСѓРґР° РЅРµ устанавливаясь.
Запуск СЃ -m или --measure-once. Программа также РЅРµ будет регистрировать сервис, РЅРѕ Рё прятать РѕРєРЅРѕ РЅРµ будет, РІ отличие РѕС‚ второго режима. Просто для запуска портативной измерялки СЃ флешки.
Режим установки. Войти РІ него РјРѕР¶РЅРѕ СЃ помощью параметров -i или --install. В этом случае будет зарегистрирован сервис, а программа перезапустится как сервис в режиме 2.

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


Цитирование статьи, картинки - фото скриншот - Rambler News Service.
Иллюстрация к статье - Яндекс. Картинки.
Есть вопросы. Напишите нам.
Общие правила  поведения на сайте.

Если тебе надоели постоянные обрывы связи и косяки провайдера, но субъективные оценки типа «подвисает» не внушают доверия, лучший выбор — записать состояние сети в автоматическом режиме. Причем для этого необязательно гонять Nagios, который к тому же не так прост в настройке. Сегодня мы напишем утилиту для мониторинга сети, которая легко настраивается и сохраняет в журнал RTT до заданных хостов, packet loss и скорость соединения (опционально), а логи летят прямо в Telegram. Виновником появления этой статьи стал уже несколько месяцев сбоящий интернет, который мне предоставляет единственный в округе провайдер. Увы, в мою деревню ничего, кроме ADSL, не завезли, и, судя по качеству связи, и тот не дошел без многочисленных скруток. Packet loss порой доходит до 60–70%, что уже ни в какие ворота не лезет. Поэтому я решил сам измерить качество связи, дабы ткнуть провайдеру под нос логи вместе с заявлением о расторжении договора. Задачи Наша цель — написать простой сетевой монитор, чтобы в фоновом режиме отслеживать главные показатели в сети и сохранять их для анализа. Думаю, сбора следующих параметров хватит с головой, а если тебе понадобится что-то еще, всегда можно добавить (не забудь рассказать об этом мне). Пинг для заданных хостов. Просто маст-хэв для любой диагностической утилиты. Измеряя пинг, можно узнать также и процент потерь пакетов (packet loss), и коды ошибок, позволяющие узнать, что именно не так с сетью. Например, Destination Prohibited означает, что сеть РІСЂРѕРґРµ Рё есть, РЅРѕ администратор какого-то РёР· промежуточных устройств РЅРµ пропускает пакет. Р’ общем, анализировать статус-РєРѕРґС‹ ответов обязательно. Реальная возможность подключений РїРѕ TCP. Р’РѕР·РјРѕР¶РЅР° ситуация, РєРѕРіРґР° хосты РІСЂРѕРґРµ Р¶РёРІС‹ Рё откликаются РЅР° РїРёРЅРі, DNS работает, Р° доступ РІ интернет закрыт Р·Р° неоплату. Этот тест потенциально позволит нам выявить недобросовестного провайдера, который подделывает ответы РЅР° РїРёРЅРіРё, РЅРѕ РЅРµ обеспечивает реальный коннект. Уведомления Рѕ времени даунтайма РІ Telegram. РћРЅРё должны отправляться, как только соединение восстановится. Сообщение РїРѕ-хорошему должно включать расширенную инфу Рѕ РїРёРЅРіРµ Рё потерях пакетов после СЃР±РѕСЏ, Р° также состояние HTTP-клиента. Доступ Рє роутеру. Для домашней сети СЃ нестабильным Wi-Fi это особенно актуально. Роутер может просто упасть РѕС‚ перегрузки (например, очередной школохакер ломится РЅР° дырявый WPS, РЅРѕ вместо взлома получается DoS) или попросту РЅРµ выдержать всех клиентов, которых РІ РёРЅРѕРј «умном доме» может быть Рё 15, Рё 20. Короче, роутер РІ любой момент может уйти РІ перезагрузку, Р° РјС‹ будем грешить РЅР° провайдера. Это нехорошо, поэтому РїСЂРё потере СЃРІСЏР·Рё СЃ роутером РјС‹ РЅРµ будем тестировать дальше, Р° просто подождем, РїРѕРєР° починят. Цели обрисованы. Теперь детали реализации. Программа предназначена для длительной работы РІ фоновом режиме. Оформим программу как системный сервис Windows. Если РјС‹ работаем РІ фоновом режиме, РЅРё консольный интерфейс, РЅРё тем более GUI нам РЅРµ нужен. Тем лучше — меньше РєРѕРґР°. Проверки РЅРµ должны сильно нагружать канал, ведь будет некомфортно работать. Так что постоянно флудить пингами РјС‹ РЅРµ станем. Отправим очередь РёР· десятка пакетов раз РІ минуту-РґРІРµ, Рё хватит. Реже отправлять РЅРµ имеет смысла — большинство неполадок устраняются РІ течение нескольких РјРёРЅСѓС‚, Р° РјС‹ хотим знать Рѕ каждом СЃР±РѕРµ. Возможность хранить отчет РІ JSON Рё выгружать CSV для изучения РІ Excel — СЃ фильтрацией РїРѕ дате создания. Неплохо Р±С‹ прикрутить возможность забирать логи РїРѕ сети Рё скидывать статистику РЅР° центральный сервер, РЅРѕ РІ рамках демо СЏ этого делать РЅРµ Р±СѓРґСѓ. Р?Р· этого следует, что нам понадобится работа СЃ JSON. Писать СЏ Р±СѓРґСѓ РЅР° C
Просмотров: 1 948
Комментариев: 0:   7-04-2020, 12:40
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

 
Еще новости по теме:



Другие новости по теме: