«Java Script» и «Zabbix»: разница между страницами

Материал из support.qbpro.ru
(Различия между страницами)
imported>Supportadmin
 
imported>Vix
 
Строка 1: Строка 1:
==Как бы учебник==
[[Файл:Zabbix2.png]]
*[[Операторы JavaScript]]
<hr>
*[[Массивы JavaScript]]
== Установка и настройка ==
*[[Объекты JavaScript]]
'''''- Система Debian Jessie (8)'''''
*[[Особенности функций в JavaScript]]
**[[Возвратные функции]]
*<span style="color:darkgred; background:yellow">[[Базовые Namespace паттерны JavaScript]]</span>
*<span style="color:darkgred; background:yellow">[[Шаблоны проектирования JavaScript]]</span>
*[[ООП JavaScript - наследование]]
*[[Область видимости переменной в Javascript]]
*[[Клиентский (браузерный) JavaScript]]
**[[Javascript синхронный и асинхронный запрос]]
*[[JavaScript Strict Mode]]


----
* '''устанавливаем postgresql''', читать тут [[PostgreSQL]]
*[[Масштабируемые JavaScript приложения]]
*[[10 несуразностей и секретов JavaScript]]
*[[Используем console на полную]]
----
*[[Java Script модули]]


==Крайне полезная информация==
* '''устанавливаем необходимые пакеты:'''
echo "deb-src http://repo.zabbix.com/zabbix/3.4/debian stretch main" > /etc/apt/sources.list.d/zabbix.list
wget -O - "http://repo.zabbix.com/zabbix-official-repo.key" | apt-key add -
wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-79EA5ED4" | apt-key add -
wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-A14FE591" | apt-key add -
wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-A14FE591-EL5" | apt-key add -


Это надо обработать
apt-get update
*[http://jsperf.com/array-prototype-push-apply-vs-concat/20 Тесты производительности циклов, работы с массивами и т.д.]
  apt-get install zabbix-agent zabbix-frontend-php zabbix-proxy-pgsql zabbix-server-pgsql php-fpm nginx
*'''[http://bonsaiden.github.com/JavaScript-Garden/ru/ JavaScript Гарден]'''
*[http://habrahabr.ru/post/117069/ Модульный подход в JavaScript]
*[http://canegor.urc.ac.ru/gui_for_script/articles/random_sort.htm Случайное перемешивание массива]
*[http://habrahabr.ru/post/131714/ Javascript наследование для чайников]
*[http://javascript.ru/basic/operators Операторы, их особенности в JS]
*[http://www.w3schools.com/js/js_comparisons.asp JavaScript Comparison and Logical Operators]
*'''[http://habrahabr.ru/post/138773/ Путь асинхронного самурая]'''
*[http://habrahabr.ru/post/137818/ «Лапша» из callback-ов — будьте проще]
*[http://habrahabr.ru/post/97042/ Как избавиться от пристрастия к синхронности]
*[http://habrahabr.ru/post/137778/ Спагетти в последовательном вызове асинхронных функций. Теория и практика]
*'''[http://hashcode.ru/questions/87809/javascript-xmlhttprequest-%D0%B2-%D1%86%D0%B8%D0%BA%D0%BB%D0%B5 javascript - XMLHttpRequest в цикле]'''
*[[javascript - XMLHttpRequest подробный анализ примера]]
*[http://javascript.ru/blog/tenshi/mnogopotochnyi-yavaskript Многопоточный яваскрипт]
* [http://javascript.ru/tutorial/object/inheritance работаем с объектами в примерах]
* '''[http://javascript.ru/unsorted/top-10-functions 10 лучших функций на JavaScript]''' - в комментах тьма полезностей
* [http://webo.in/articles/habrahabr/28-chain-javascript-calls-optimization/ ОПТИМИЗИРУЕМ JS]
* http://pyramidin.narod.ru/clientref13/ -очень хорошо описаны функции, их стандартные методы, свойства и использование
* [http://wiki.dieg.info/doku.php/pobitovye_ili_porazrjadnye_operacii Побитовые или поразрядные операции] в конце для js
* [http://ruseller.com/lessons.php?rub=28&id=1445 Прототипы в JavaScript]
* [http://habrahabr.ru/post/49245/ Стыкуем компоненты в JavaScript]
* [http://webo.in/articles/habrahabr/77-coupling-async-scripts/ Стыкуем асинхронные скрипты]
* [http://learn.javascript.ru/gcc-closure-library GCC: интеграция с Google Closure Library]
* [http://creativejs.com/resources/requestanimationframe/ 3d -javascipt]
* [http://stepansuvorov.com/blog/2012/07/%D0%BF%D0%B8%D1%88%D0%B5%D0%BC-%D1%81%D0%B2%D0%BE%D0%B9-uploader-%D1%81-%D0%BD%D1%83%D0%BB%D1%8F-%D0%BD%D0%B0-javascript-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D1%8F-fileapi-%D1%87%D0%B0-3/ свой Uploader с нуля]
* [http://alljs.ru/articles/document-write document-write]
* [http://www.jaguar-developers.com/category/articles/javascript_dom/ создаем элементы DOM]
* [http://www.jstoolbox.com/skripty/rabota-s-massivami/zapolnenie-massiva-odinakovymi-znacheniyami/ Заполнение массива одинаковыми значениями]
* [http://webo.in/articles/habrahabr/78-javascript-constructions-performance/ Производительность простых и сложных конструкций в JavaScript]


==обработка событий в примерах==
* '''создаем администратора базы zabbix'''
*[http://on-line-teaching.com/js/js.events.keyboard.htm События клавиатуры и мыши]
  CREATE USER zabbixadmin WITH PASSWORD 'mypassword';
*[http://javascript.ru/tutorial/events/properties Свойства объекта событие]
*[http://www.tigir.com/javascript.htm разные примеры...]
*[https://developer.mozilla.org/ru/docs/JavaScript/Guide/Regular_Expressions регулярные выражения - шаблоны]
==Контекст==
*[http://habrahabr.ru/post/149516/ Ключевое слово this в javascript — учимся определять контекст на практике]
*[http://habrahabr.ru/post/149581/ Привязка контекста (this) к функции в javascript и частичное применение функций]
*[http://habrahabr.ru/post/103760/ Правильный захват контекста в Javascript]
*[http://habrahabr.ru/qa/5846/ JavaScript: что делает Function.call.apply(…)?]
*[http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%B0%D1%82%D0%B5%D0%B3%D0%B8%D1%8F_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F) Стратегия (шаблон проектирования)]
[http://javascript.ru/ecma/part10 Контексты исполнения]
*[http://habrahabr.ru/post/112069/ предсказание элемента формы]


==Библиотеки==
* '''создаем базу данных для zabbix'''
*[http://qooxdoo.org/ JavaScript-фреймворк qooxdoo 1.6] - новое слово в вебинтерфейсах
CREATE DATABASE "zabbix"
:*[http://www.opennet.ru/opennews/art.shtml?num=32573 Новость про qooxdoo 1.6]
  WITH OWNER "zabbixadmin"
*[http://www.leemon.com/crypto/BigInt.js JS библиотека для работы с большими числами][http://www.leemon.com/crypto/BigInt.html Демо]
  ENCODING 'UTF8'
  LC_COLLATE = 'ru_RU.UTF-8'
  LC_CTYPE = 'ru_RU.UTF-8';


* '''даем права на базу администратору'''
GRANT ALL PRIVILEGES ON DATABASE "zabbix" to zabbixadmin;


*[http://learn.javascript.ru/lib Мини-библиотека функций]
* '''теперь необходимо в эту базу загрузить шаблоны и схему (для postgresql)'''
===Несколько интересных проектов с помощью которых можно динамически создавать векторные рисунки.===
zcat /usr/share/zabbix-server-pgsql/{schema,images,data}.sql.gz|psql -h 127.0.0.1 zabbix zabbixadmin
* [http://y3x.ru/2010/12/artisanjs/ Статья - Пробуем ремесло рисования с помощью ArtisanJS]
'''{!}''' - для версии 3.4:
* [http://artisanjs.com/ Страница разработчика ArtisanJS]
zcat /usr/share/doc/zabbix-server-pgsql/create.sql.gz|psql -h 127.0.0.1 zabbix zabbixadmin
* [http://jcscript.com/ Высокопроизводительная библиотека динамического рисования Html5 - полностью самодостаточная]
* [http://raphaeljs.com Кросс-браузерное решение]
* [http://kangax.github.com/fabric.js/kitchensink/ Поддерживается как свободное рисование так и работа с векторными формами]


==Полезные трюки==
* '''настраиваем php-fpm'''
http://habrahabr.ru/post/155093/
cat /etc/php5/fpm/pool.d/www.conf
....
;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000
....
cat /etc/php5/fpm/php.ini
....
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,<br>pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,<br>pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
....
date.timezone = Europe/Moscow
....
max_execution_time = 300
....
post_max_size = 16M
....
always_populate_raw_post_data = -1
....


==Как работает Array.prototype.slice.call==
* '''(!)''' - возможно '''zabbix''' при первом запуске еще что-то попросит, измените как будет указано.
Для того, чтобы из аргументов JavaScript функции "отрезать" первые Х значений, используется метод:


Array.prototype.slice.call(arguments, X);
* '''nginx''' - пример наcтройки для '''zabbix''':
 
Например такая функция вернет "3,4":
 
<nowiki>(function(){
  var args = Array.prototype.slice.call(arguments, 2);
  alert(args); // Returns: 3,4
})(1, 2, 3, 4);</nowiki>
 
 
Таким образом, такой подход используется когда нужно срезать входящие параметры функции JavaScript.
==Array.prototype.concat.apply==
Для объединения более двух массивов используется concat().
 
<nowiki>var a = [1, 2], b = ["x", "y"], c = [true, false];
var d = a.concat(b, c);
console.log(d); // [1, 2, "x", "y", true, false];</nowiki>
 
For concatenating just two arrays, using push.apply() can be used instead for the case of adding elements from one array to the end of another without producing a new array. With slice() it can also be used instead of concat() but there appears to be no performance advantage from doing this.
 
<nowiki>var a = [1, 2], b = ["x", "y"];
a.push.apply(a, b);
console.log(a); // [1, 2, "x", "y"];</nowiki>
 
==Современный метод bind==
 
В современном JavaScript для привязки функций есть метод bind. Он поддерживается большинством современных браузеров, за исключением IE<9, но легко эмулируется.
 
Этот метод позволяет привязать функцию к нужному контексту, и даже к аргументам.
 
Синтаксис bind:
 
<nowiki>var wrapper = func.bind(context[, arg1, arg2...])</nowiki>
*'''func''' Произвольная функция
*'''wrapper''' Функция-обёртка, которую возвращает вызов bind. Она вызывает func, фиксируя контекст и, если указаны, первые аргументы.
*'''context''' Обертка wrapper будет вызывать функцию с контекстом this = context.
*'''arg1, arg2, …''' Если указаны аргументы arg1, arg2... — они будут прибавлены к каждому вызову новой функции, причем встанут перед теми, которые указаны при вызове.
 
Простейший пример, фиксируем только this:
 
<nowiki>function f() {
  alert(this.name);
}
 
var user = { name: "Вася" };
 
var f2 = f.bind(user);
 
f2(); // выполнит f с this = user
</nowiki>
Использование для привязки метода sayHi к новому объекту User:
<nowiki>
function User() {
  this.id = 1;
  this.sayHi = function() {
    alert(this.id);
  }.bind(this);
}
var user = new User();
setTimeout(user.sayHi, 1000); // выведет "1"</nowiki>
 
==Object.defineProperty или как сделать код капельку лучше==
[http://habrahabr.ru/post/150571/ оригинал статьи] [http://msdn.microsoft.com/ru-ru/library/ie/dd548687(v=vs.94).aspx тоже ребята старались]
 
Этот краткий пост-заметку или температурный бред (в Одессе похолодало, да) хочу посвятить такой прекрасной функции, как Object.defineProperty (и Object.defineProperties). Активно использую её уже около двух месяцев, так как поддержка старых браузеров (в том числе и IE8) в проекте, который я сейчас реализую, не требуется (завидуйте).
 
Как положено статье на хабре, приведу краткое описание того, что она делает. Object.defineProperty добавляет новое свойство, обладающее неким нестандартным для обычного свойства поведением, и принимает три аргумента:
*Объект, который мы модифицируем, добавляя новое свойство
*Свойство (строка), которое, собственно, хотим добавить
*Дескриптор: объект, содержащий «настройки» нового свойства, например аццессоры (геттер, сеттер)
 
Дескриптор может содержать следующие свойства:
*value (любое значение: строка, функция...) — значение, которое получит определяемое свойство объекта (геттер и сеттер в данном случае определить нельзя)
*writable (true/false) — можно ли перезаписать значение свойства (аццессоры тоже не доступны)
*get (функция) — геттер (value и writable определить нельзя)
*set (функция) — сеттер (value и writable определить нельзя)
*configurable (true/false) — можно ли переопределить дескриптор (использовать Object.defineProperty над тем же свойством)
*enumerable (true/false) — будет ли свойство перечисляться через for..in и доступно в Object.keys (плохая формулировка)
<nowiki>var o = {};
Object.defineProperty(o, "a", {value : 37,
                              writable : true,
                              enumerable : true,
                              configurable : true});


  server {
    listen      10.0.1.40:88;
    server_name zabbix;
    root /home/www/zabbix;
    location / {
        index  index.html index.php;
    }
    location ~* \.(gif|jpg|png)$ {
        expires 30d;
    }
   
   
var bValue;
    location ~ \.php$ {
Object.defineProperty(o, "b", {get : function(){ return bValue; },
        fastcgi_pass  localhost:9000;
                              set : function(newValue){ bValue = newValue; },
        fastcgi_param SCRIPT_FILENAME
                              enumerable : true,
                      $document_root$fastcgi_script_name;
                              configurable : true});</nowiki>
        include      fastcgi_params;
    }  
}


Лучше меня объяснит MDN [https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty Object/defineProperty]. Благо, даже английский знать не надо, и так всё понятно.
* После успешного прохождения первичных настроек Zabbix, сохраните файл настроек в /etc/zabbix/web/zabbix.conf.php
* При первичной регистрации '''login:Admin password:zabbix'''


Если нужно определить сразу несколько свойств, можно использовать Object.defineProperties, который принимает два аргумента: объект, требующий изменений и объект с определяемыми ключами.
==Zabbix-Proxy==
MDN: [https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperties Object/defineProperties].
* Пример zabbix_proxy.conf для Sqlite3
ProxyMode=0
Server=IP do zabbix server (master)
ServerPort=10051
Hostname=Nome do proxy que foi criado no Zabbix server, tem quer ser igual
LogFile=/var/log/zabbix/zabbix_proxy.log
LogFileSize=100
DebugLevel=3
PidFile=/var/log/zabbix/zabbix_proxy.pid
DBName=/var/lib/sqlite/zabbix.db # SQLite não vai pedir usuário ou senha
DBSocket=/var/lib/mysql/mysql.sock
ProxyLocalBuffer=1
ProxyOfflineBuffer=1
HeartbeatFrequency=60
ConfigFrequency=60
DataSenderFrequency=60
StartPollers=65
StartPollersUnreachable=15
StartPingers=60
StartDiscoverers=35
StartHTTPPollers=5
HousekeepingFrequency=1
CacheSize=20M
StartDBSyncers=8
HistoryCacheSize=20M
HistoryTextCacheSize=32M
Timeout=15
UnreachablePeriod=45
UnavailableDelay=60
UnreachableDelay=15
FpingLocation=/usr/sbin/fping
LogSlowQueries=2
StartIPMIPollers=0
StartJavaPollers=0
StartVMwareCollectors=0
VMwareFrequency=60
StartSNMPTrapper=0
* [https://www.vivaolinux.com.br/dica/Zabbix-Proxy-com-SQLite-3 взято тут]


<nowiki>
=='''Полезные советы'''==
// Код сперт с MDN
* '''Проблема:''' Триггер с элементом vm.memory.size
Object.defineProperties(obj, {
Пытаюсь мониторить переполнение RAM (если меньше 10% свободной RAM в течении 5 минут) и создаю триггер:
  "property1": {
{hostname:vm.memory.size[available].last(5m)}<10
    value: true,
Однако ничего не происходит.
    writable: true
  },
  "property2": {
    value: "Hello",
    writable: false
  }
  // etc. etc.
});</nowiki>


* '''Решение:'''
Вам для вашей задачи лучше использовать функцию max()
{hostname:vm.memory.size[pavailable].max(5m)}<10
* [https://www.zabbix.com/forum/in-russian/46020-%D0%A2%D1%80%D0%B8%D0%B3%D0%B3%D0%B5%D1%80-%D1%81-%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%BC-vm-memory-size источник]
  '''Пример:''' {Zabbix server:vm.memory.size[available].max(5m)}<10
<hr>


* '''Проблема:'''  Если постоянно выскакивает предупреждение на триггер Disk I/O is overloaded on
{Zabbix server:system.cpu.util[,iowait].last(0)}>20
Получается, что ожидает операции ввода.вывода более 20 сек ?


Теперь соль. Чего я вообще решил это запостить?
* '''Решение:''' Cоветую увеличить интервал и также путем увелечинеия памяти!
[https://www.zabbix.com/forum/zabbix-help/36397-disk-i-o-is-overloaded-on-zabbix-server/page2?t=44382&highlight=Disk+I/O+overloaded&page=2 Вот здесь совет]
Пример: {Zabbix server:system.cpu.util[,iowait].avg(5m)}>30
<hr>


Так как в упомянутом выше проекте мне приходится использовать defineProperty не просто активно, а очень активно, код стал, мягко говоря, некрасивым. Пришла в голову простейшая идея (как я до этого раньше-то не додумался?), расширить прототип Object, сделав код сильно компактнее. Плохой тон, скажете вы, засерать прототип Object новыми методами.
* '''Проблема:''' Zabbix discoverer processes more than 75% busy
 
* '''Решение:''' Этот процесс используется при обнаружении устройств в сети.
Проверьте и в случае необходимости, подправьте настройки правил обнаружения или увеличьте количество процессов которые
занимаются обнаружением новых устройств (параметр StartDiscoverers в конфиг файле zabbix сервера).
К пингу этот процесс и триггер отношения не имеют.
Если не нужен, то и не запускайте обнаружения. Если нужен, то поставьте 2. Посмотрите на графике динамику изменения.
Если всё равно нагрузка будет большая, поставьте 3. Ну и так далее.
<hr>


Откуда вообще взялось это мнение? Потому что все объекты унаследуют это свойство, которое, при обычной модификации прототипа, становится перечисляемым в for..in. На душе становится тепло, когда вспоминаешь о том, что я описал выше, а именно, о свойстве дескриптора enumerable. Действительно, расширив прототип таким образом:
* Проблема: zabbix win 7  cannot make counterpath for "\\": [0xC0000BBD] Обязательный аргумент пропущен или указан неправильно.
* Решение:
cmd
lodctr /r
* взято [https://serveradmin.ru/zabbix-init_cpu_collector-cannot-make-counterpath/ тут]
<hr>


<nowiki>Object.defineProperty( Object.prototype, 'logOk' {
'''* Проблема:''' fping failed: /usr/bin/fping: can't create socket (must run as root?) : Permission denied <br>
    value: function() { console.log('ok') },
'''* Решение:'''
    enumerable: false
  chown root:zabbix /usr/bin/fping 
});</nowiki>
  chmod 710 /usr/bin/fping 
  chmod ug+s /usr/bin/fping


все объекты получат этот метод, но, при этом, он будет неперечисляемым (не нужно каждый раз использовать hasOwnProperty для проверки, есть ли такое свойство):
* взято [https://ip-connection.blogspot.com/2016/11/zabbix-fping-cant-create-socket-must.html тут]
<hr>


<nowiki>var o = {a: 1, b: 2}
==Использование SpeedTest-Cli вместе с Zabbix==
for( var i in o ) console.log( i, o[ i ] );
В этой статье я продемонстрирую, как мы можем использовать скрипты в Zabbix через UserParameter. Я буду использовать SpeedTest-cli в качестве примера, для выполнения тестов скорости загрузки интернет канала.
> a 1
Мы будем использовать UserParameter, он используется, когда нам нужна информация, которую сам zabbix не предоставляет, мы можем использовать команды и скрипты, не беспокоясь о том, поддерживает ли их zabbix, мы можем создавать собственные ключи.
> b 2
o.logOk();
> ok</nowiki>


Выполнение установки SpeedTest-Cli
    sudo apt-get install speetest-cli
Выполним простой тест, показывающий только пинг, скорость загрузки и отдачи, а также сохраним в файл TXT.<br>
Для этого выполним:
speedtest-cli ---bytes ---simple > /tmp/speed.txt
xak@zabbix-new:~$ speedtest-cli ---bytes ---simple > /tmp/speed.txt
xak@zabbix-new:~$ cat /tmp/speed.txt
Ping: 1.692 ms
Download: 10.56 Mbyte/s
Upload: 11.46 Mbyte/s


Собственно то, ради чего я тут графоманю.
В данном примере скорость измеряется с ближайшим сервером, вызвав справку
speedtest –help
Вы можете сменить сервер для проверки на нужный.<br>
* Создание графика выполнения скриптов:<br>
Поскольку сценарий имеет довольно большую задержку, около 50 секунд для генерации результатов, мы не могли просто запустить его с zabbix и получить результаты. Zabbix имеет 30-секундный тайм-аут для внешних скриптов. Таким образом, один из способов, который я нашел, заключается в том, чтобы запланировать выполнение скрипта через Crontab. Я рекомендую прочитать немного больше о [http://help.ubuntu.ru/wiki/cron Crontab] или [https://crontab.guru/ тут].
/etc/crontab: system-wide crontab
Unlike any other crontab you don’t have to run the `crontab’
command to install the new version when you edit this file
and files in /etc/cron.d. These files also have username fields,
that none of the other crontabs do.SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin# m h dom mon dow user command
17 * * * * root cd / && run-parts ---report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts ---report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts ---report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts ---report /etc/cron.monthly )
*/20 * * * * root /usr/bin/speedtest-cli ---simple > /tmp/speed.txt


Во-первых определим метод define, чтоб каждый раз не вызывать перегруженную, на мой взгляд, конструкцию. Во-вторых определим метод extendNotEnum, который расширяет объект неперечисляемыми свойствами.
Поскольку speedtest использует пропускную способность интернета для выполнения тестов, не стоит его запускать сильно часто, в данном примере я настроил запуск каждые 20мин.
* Создание UserParameter
Поскольку скрипт speedtest устанавливается на самом zabbix, нам нужно будет настроить UserParameter в собственном агенте Zabbix Server. Добавьте следующие строки в
/etc/zabbix/zabbix-agentd.conf:


  <nowiki>Object.defineProperties( Object.prototype, {
  UserParameter=upload[*],cat /tmp/speed.txt | grep «Upload:» | cut -d » » -f2
    define: {
UserParameter=download[*],cat /tmp/speed.txt | grep «Download:» | cut -d » » -f2
        value: function( key, descriptor ) {
            if( descriptor ) {
                Object.defineProperty( this, key, descriptor );
            } else {
                Object.defineProperties( this, key );
            }
            return this;
        },
        enumerable: false
    },
    extendNotEnum: {
        value: function( key, property ) {
            if( property ) {
                this.define( key, {
                    value: property,
                    enumerable: false,
                    configurable: true
                });
            } else {
                for( var prop in key ) if( key.hasOwnProperty( prop ) ){
                    this.extendNotEnum( prop, key[ prop ] );
                }
            }
        },
        enumerable: false
    }
});
</nowiki>


Использование:
Выполните описанную выше процедуру, перезапустите агент zabbix<br>
<nowiki>var o = { a: 1 };
Используйте zabbixget, чтобы проверить, работает ли ключ.
o.define( 'randomInt', {
xak@zabbix-new:~$ zabbix_get -s 127.0.0.1 -p 10050 -k «download» && zabbix_get -s 127.0.0.1 -p 10050 -k «upload»
    get: function() {
87.31
        return 42;
33.98
    }
Наш UserParameter работает правильно.
});


o.extendNotEnum({
* Создание элемента данных в Zabbix
    b: 2;
В ключе определяем ключ, который мы создали в агенте.<br>
});
В окне Интервал обновления укажите 20-30мин<br>
Вы можете найти больше о пользовательских интервалах [https://www.zabbix.com/documentation/3.4/ru/manual/config/items/item/custom_intervals здесь].


for( var i in o ) console.log( i, o[ i ] );
Повторяем действия для upload:
> a 1
> randomInt 42


console.log( o.b );
Создание элемента данных в Zabbix
> 2
В ключе определяем ключ, который мы создали в агенте.
</nowiki>
В окне Интервал обновления укажите 20-30мин
Вы можете найти больше о пользовательских интервалах здесь.


И пошла… Еще два удобных метода:
Повторяем действия для upload
Дождитесь появления запланированного обновления в Zabbix.


<nowiki>Object.prototype.extendNotEnum({
    extend: function() {
        var args = Array.prototype.slice.call( arguments );
        args.unshift( this );
        return $.extend.apply( null, args ); // если jQuery надоест, можно просто переписать под себя
    },
   
    each: function( callback ) {
        return $.each( this, callback ); // аналогично
    }
});




o.extend({c: 3}); // тупо добавляет новые свойства в объект
'''ИСТОЧНИКИ:'''
o.each(function( key, value ) {
<hr>
    // просто повторяет механизм $.each, перебирая все ключи и свойства
* [http://it.rdcm.com/archives/category/monitoring Рубрика: Monitoring]
});</nowiki>
* [https://serveradmin.ru/ustanovka-i-nastroyka-zabbix-3-4-na-debian-9/#_Zabbix_34_Debian_9 Установка сервера Zabbix 3.4 на Debian 9]
 
* [https://blog.vpsville.ru/blog/pro/61.html Установка службы Zabbix - агент на Windows сервер.]
 
* [http://jakondo.ru/ustanovka-i-nastrojka-zabbix-agentov-na-os-windows-i-linux-ubuntu-debian/ Установка и настройка Zabbix агентов на ОС Windows и Linux (Ubuntu, Debian)]
Добавлять новые свойства можно до бесконечности, никто вам за это руку не откусит.
* [http://www.ekzorchik.ru/2015/01/install-zabbix-agent-on-windows-7/ Установить Zabbix агент на Windows 7]
 
* [http://www.ekzorchik.ru/2015/01/how-to-install-zabbix-agent-on-windows-xp/ Как установить Zabbix агент на Windows XP]
Вывод
* [http://www.suiviperf.com/zabbix/ '''ZABBIX AGENT installers''']
 
* [https://www.zabbix.com/documentation/3.0/ru/manual/quickstart/notification Получение оповещения о проблеме]
Играйте в Денди, пишите на Javascript, который становится всё лучше и лучше.
* [https://serveradmin.ru/nastroyka-email-opoveshheniy-v-zabbix/ Отправка email уведомлений в zabbix 2.4]
 
* [https://habrahabr.ru/company/zabbix/blog/193472/ Zabbix тюнинг]
комментарии
* [http://blog.files.dp.ua/zabbix-trigger Решение проблем с триггерами processes more than 75% busy]
 
* [http://linux-notes.org/optimizatsiya-nastroek-zabbix/ Оптимизация настроек Zabbix]
 
* [https://glaber.io/ '''Fork Zabbix - оптимизированный для снижения нагрузки CPU и повышения кластеризации''']
Еще один финт ушами для тех, кто определяет свойства прототипа только однажды, после определения функции-конструктора:
* [https://github.com/burner1024/zabbix-sql/blob/master/delete-old-data.pg.sql Скрипты чистки базы zabbix]
<nowiki>// запускается в консоли
Object.defineProperty( Object.prototype, 'awesomeprototype', {
    set: function( object ) {
        for( var prop in object ) {
            Object.defineProperty( this.prototype, prop, {
                value: object[ prop ],
                enumerable: false
            });
        }
    }
});
 
var X = function() {}
X.awesomeprototype = {
    method: function() { alert( 'ok' ) }
};
 
var x = new X
 
x.method()
</nowiki>
 
'''Стоит отметить что в литералах объектов свойства можно задавать через геттер и сеттер:'''
<nowiki>var o = {
    __someProperty : 42,
    get someProperty() { return this.__someProperty; },
    set someProperty(v) { this.__someProperty = v; }
};
 
o.someProperty; // 42
o.someProperty = 56;
o.someProperty; // 56
</nowiki>
 
Ну это так, к слову :)
 
==deferred==
*[http://habrahabr.ru/post/175947/ Асинхронные API и объект Deferred в деталях][https://github.com/StreetStrider/utils/tree/master/doc GitHub]
*[http://javascript.ru/unsorted/async/deferred Объект Deferred.]
*[http://www.smira.ru/2009/02/10/deferred-async-programming/ Асинхронное программирование: концепция Deferred]
*[http://www.smira.ru/2009/02/24/more-about-deferred/ Deferred: все подробности]
==Шаблонизация в JavaScript==
*[http://learn.javascript.ru/templates Шаблонизация в JavaScript]
==DOM==
===dom2json===
http://coderepos.org/share/browser/lang/javascript/dom2json/dom2json.js?rev=30780
skips empty attributes that IE implicitly adds
<nowiki>/*
* $Id: dom2json.js,v 0.2 2008/06/15 07:04:10 dankogai Exp dankogai $
*/
(function(){
 
dom2json = function(dom){
    var type = dom.nodeType;
    if (type == 3) return dom.nodeValue;
    if (type == 1){
        var json = [];
        json.push(dom.nodeName);
        var attrs = dom.attributes;
        if (attrs.length){
            var attr = {};
            for (var i = 0, l = attrs.length; i < l; i++){
                attr[attrs[i].name] = attrs[i].value;
            }
            if (0 /*@cc_on +1@*/){
                attr['style'] = dom.style;
            }
            json.push(attr);
        }
        if (! dom.hasChildNodes()) return json;
        var kids = dom.childNodes;
        for (var i = 0, l = kids.length; i < l; i++){
            var kjson = arguments.callee(kids[i]);
            if (kjson) json.push(kjson);
        }
        return json;
    }
};
json2dom = function(json){
    var i = 0;
    var tag = json[i++]
    var dom = document.createElement(tag);
    if (json[i].constructor == Object){
        var attr = json[i++];
        for (var name in attr){
            dom.setAttribute(name, attr[name]);
        }
    }
    for (var l = json.length; i < l; i++){
        dom.appendChild(
            json[i].constructor == Array
                ? arguments.callee(json[i])
                : document.createTextNode(json[i])
            );           
    }
    return dom;
}
})();</nowiki>
===обход дерева DOM===
  <nowiki>/**
* Рекурсивное перечисление дочерних элементов
*
* @param DomNode node
* Родительский элемент, чьи дочерние узлы нужно перечислять.
*
* @return void
*/
function enumChildNodes(node) {
    // если нам передали элемент
    if (node && 1 == node.nodeType) {
        // берем его первый дочерний узел
        var child = node.firstChild;
        // пока узлы не закончились
        while (child) {
            // если этот узел является элементом
            if (1 == child.nodeType) {
                // что-то делаем с найденным элементом
                alert('элемент ' + child.tagName);
                // рекурсивно перечисляем дочерние узлы
                enumChildNodes(child);
            };
            // переходим к следующему узлу
            child = child.nextSibling;
        };
    };
};
// перечисляем содержимое body
enumChildNodes(document.body);</nowiki>
 
===Обход child nodes (потомков) определнного элемента в Javascript===
JavaScript на заметку Комментировать
Речь о том как корректно обойти элементы потомки DOM для данного элемента,
простите за тафтологию
 
var object = document.getElementById('el');
for (var childItem in object.childNodes) {
if (object.childNodes[childItem].nodeType == 1)
object.childNodes[childItem].style.color = '#FF0000';
 
В данном примере мы берем некоторый элемент с id = 'el' и проходим по массиву
его потомков (childNodes), при этом проверяем nodeType потомка, чтобы он был
элементом страницы и если так, то окрашиваем его в КРАСНЫЙ цвет.
 
В принципе на базе этой конструкции можно организовать рекурсивный обход дерева
всех потомков заданного элемента, если конечно возникнет такая необходимость, но
пока я представляю только упрощенный вариант.
 
Здесь следует обратить внимание на проверку свойства nodeType == 1, дело в том
что без этой проверки в обработку попадут и разрывы строк, т.е. символы "\n",
которые тоже воспинимаются как ноды. Т.е. например конструкция вида:
 
так быстрее и меньше кода
var object = document.getElementById(‘el’).getElementsByTagName(‘*’);
for(var i=0;object[i];i++){
object[i].style.color = ‘#FF0000′;
 
 
Sun, getElementsByTagName не поддерживает ИЕ, смысл его использовать?
 
К сожалению заметил, что данная конструкция в Opera выполняется некорректно
(цикл for проходится два раза), никто с таким не встречался? Где-то всё же
закралась моя ошибка или это ошибка браузера (проверял в 9.20, 9.50, 10.20),
замечу, что в остальных браузерах всё выполняется верно.
 
var object = document.getElementById(‘el’);
for (var childItem in object.childNodes) {
}
var object=document.getElementById(‘el’);
for(var i=0;i<object.childNodes.length;i++) {
if (object.childNodes[i].nodeType == 1) {
// тут что-либо делаем
}
}

Версия от 15:02, 26 декабря 2019

Zabbix2.png


Установка и настройка

- Система Debian Jessie (8)

  • устанавливаем postgresql, читать тут PostgreSQL
  • устанавливаем необходимые пакеты:
echo "deb-src http://repo.zabbix.com/zabbix/3.4/debian stretch main" > /etc/apt/sources.list.d/zabbix.list
wget -O - "http://repo.zabbix.com/zabbix-official-repo.key" | apt-key add -
wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-79EA5ED4" | apt-key add -
wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-A14FE591" | apt-key add -
wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-A14FE591-EL5" | apt-key add -
apt-get update
apt-get install zabbix-agent zabbix-frontend-php zabbix-proxy-pgsql zabbix-server-pgsql php-fpm nginx
  • создаем администратора базы zabbix
CREATE USER zabbixadmin WITH PASSWORD 'mypassword';
  • создаем базу данных для zabbix
CREATE DATABASE "zabbix"
 WITH OWNER "zabbixadmin"
 ENCODING 'UTF8'
 LC_COLLATE = 'ru_RU.UTF-8'
 LC_CTYPE = 'ru_RU.UTF-8';
  • даем права на базу администратору
GRANT ALL PRIVILEGES ON DATABASE "zabbix" to zabbixadmin;
  • теперь необходимо в эту базу загрузить шаблоны и схему (для postgresql)
zcat /usr/share/zabbix-server-pgsql/{schema,images,data}.sql.gz|psql -h 127.0.0.1 zabbix zabbixadmin

{!} - для версии 3.4:

zcat /usr/share/doc/zabbix-server-pgsql/create.sql.gz|psql -h 127.0.0.1 zabbix zabbixadmin
  • настраиваем php-fpm
cat /etc/php5/fpm/pool.d/www.conf
....
;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000

....

cat /etc/php5/fpm/php.ini
....
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,
pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,
pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, .... date.timezone = Europe/Moscow .... max_execution_time = 300 .... post_max_size = 16M .... always_populate_raw_post_data = -1 ....
  • (!) - возможно zabbix при первом запуске еще что-то попросит, измените как будет указано.
  • nginx - пример наcтройки для zabbix:
 server {
    listen      10.0.1.40:88;
    server_name zabbix;
    root /home/www/zabbix;
    location / {
        index   index.html index.php;
    }

    location ~* \.(gif|jpg|png)$ {
        expires 30d;
    }

    location ~ \.php$ {
        fastcgi_pass  localhost:9000;
        fastcgi_param SCRIPT_FILENAME
                      $document_root$fastcgi_script_name;
        include       fastcgi_params;
    } 
}
  • После успешного прохождения первичных настроек Zabbix, сохраните файл настроек в /etc/zabbix/web/zabbix.conf.php
  • При первичной регистрации login:Admin password:zabbix

Zabbix-Proxy

  • Пример zabbix_proxy.conf для Sqlite3
ProxyMode=0
Server=IP do zabbix server (master)
ServerPort=10051
Hostname=Nome do proxy que foi criado no Zabbix server, tem quer ser igual
LogFile=/var/log/zabbix/zabbix_proxy.log
LogFileSize=100
DebugLevel=3
PidFile=/var/log/zabbix/zabbix_proxy.pid
DBName=/var/lib/sqlite/zabbix.db # SQLite não vai pedir usuário ou senha
DBSocket=/var/lib/mysql/mysql.sock
ProxyLocalBuffer=1
ProxyOfflineBuffer=1
HeartbeatFrequency=60
ConfigFrequency=60
DataSenderFrequency=60
StartPollers=65
StartPollersUnreachable=15
StartPingers=60
StartDiscoverers=35
StartHTTPPollers=5
HousekeepingFrequency=1
CacheSize=20M
StartDBSyncers=8
HistoryCacheSize=20M
HistoryTextCacheSize=32M
Timeout=15
UnreachablePeriod=45
UnavailableDelay=60
UnreachableDelay=15
FpingLocation=/usr/sbin/fping
LogSlowQueries=2
StartIPMIPollers=0
StartJavaPollers=0
StartVMwareCollectors=0
VMwareFrequency=60
StartSNMPTrapper=0 

Полезные советы

  • Проблема: Триггер с элементом vm.memory.size
Пытаюсь мониторить переполнение RAM (если меньше 10% свободной RAM в течении 5 минут) и создаю триггер:
{hostname:vm.memory.size[available].last(5m)}<10
Однако ничего не происходит.
  • Решение:
Вам для вашей задачи лучше использовать функцию max()
{hostname:vm.memory.size[pavailable].max(5m)}<10
 Пример: {Zabbix server:vm.memory.size[available].max(5m)}<10

  • Проблема: Если постоянно выскакивает предупреждение на триггер Disk I/O is overloaded on
{Zabbix server:system.cpu.util[,iowait].last(0)}>20
Получается, что ожидает операции ввода.вывода более 20 сек ?
  • Решение: Cоветую увеличить интервал и также путем увелечинеия памяти!
Вот здесь совет
Пример: {Zabbix server:system.cpu.util[,iowait].avg(5m)}>30

  • Проблема: Zabbix discoverer processes more than 75% busy
  • Решение: Этот процесс используется при обнаружении устройств в сети.
Проверьте и в случае необходимости, подправьте настройки правил обнаружения или увеличьте количество процессов которые
занимаются обнаружением новых устройств (параметр StartDiscoverers в конфиг файле zabbix сервера).
К пингу этот процесс и триггер отношения не имеют.
Если не нужен, то и не запускайте обнаружения. Если нужен, то поставьте 2. Посмотрите на графике динамику изменения.
Если всё равно нагрузка будет большая, поставьте 3. Ну и так далее.

  • Проблема: zabbix win 7 cannot make counterpath for "\\": [0xC0000BBD] Обязательный аргумент пропущен или указан неправильно.
  • Решение:
cmd
lodctr /r

* Проблема: fping failed: /usr/bin/fping: can't create socket (must run as root?) : Permission denied
* Решение:

 chown root:zabbix /usr/bin/fping  
 chmod 710 /usr/bin/fping   
 chmod ug+s /usr/bin/fping

Использование SpeedTest-Cli вместе с Zabbix

В этой статье я продемонстрирую, как мы можем использовать скрипты в Zabbix через UserParameter. Я буду использовать SpeedTest-cli в качестве примера, для выполнения тестов скорости загрузки интернет канала. Мы будем использовать UserParameter, он используется, когда нам нужна информация, которую сам zabbix не предоставляет, мы можем использовать команды и скрипты, не беспокоясь о том, поддерживает ли их zabbix, мы можем создавать собственные ключи.

Выполнение установки SpeedTest-Cli

   sudo apt-get install speetest-cli

Выполним простой тест, показывающий только пинг, скорость загрузки и отдачи, а также сохраним в файл TXT.
Для этого выполним:

speedtest-cli ---bytes ---simple > /tmp/speed.txt
xak@zabbix-new:~$ speedtest-cli ---bytes ---simple > /tmp/speed.txt
xak@zabbix-new:~$ cat /tmp/speed.txt
Ping: 1.692 ms
Download: 10.56 Mbyte/s
Upload: 11.46 Mbyte/s

В данном примере скорость измеряется с ближайшим сервером, вызвав справку

speedtest –help

Вы можете сменить сервер для проверки на нужный.

  • Создание графика выполнения скриптов:

Поскольку сценарий имеет довольно большую задержку, около 50 секунд для генерации результатов, мы не могли просто запустить его с zabbix и получить результаты. Zabbix имеет 30-секундный тайм-аут для внешних скриптов. Таким образом, один из способов, который я нашел, заключается в том, чтобы запланировать выполнение скрипта через Crontab. Я рекомендую прочитать немного больше о Crontab или тут.

/etc/crontab: system-wide crontab
Unlike any other crontab you don’t have to run the `crontab’
command to install the new version when you edit this file
and files in /etc/cron.d. These files also have username fields,
that none of the other crontabs do.SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin# m h dom mon dow user command
17 * * * * root cd / && run-parts ---report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts ---report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts ---report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts ---report /etc/cron.monthly )
*/20 * * * * root /usr/bin/speedtest-cli ---simple > /tmp/speed.txt

Поскольку speedtest использует пропускную способность интернета для выполнения тестов, не стоит его запускать сильно часто, в данном примере я настроил запуск каждые 20мин.

  • Создание UserParameter

Поскольку скрипт speedtest устанавливается на самом zabbix, нам нужно будет настроить UserParameter в собственном агенте Zabbix Server. Добавьте следующие строки в

/etc/zabbix/zabbix-agentd.conf:
UserParameter=upload[*],cat /tmp/speed.txt | grep «Upload:» | cut -d » » -f2
UserParameter=download[*],cat /tmp/speed.txt | grep «Download:» | cut -d » » -f2

Выполните описанную выше процедуру, перезапустите агент zabbix
Используйте zabbixget, чтобы проверить, работает ли ключ.

xak@zabbix-new:~$ zabbix_get -s 127.0.0.1 -p 10050 -k «download» && zabbix_get -s 127.0.0.1 -p 10050 -k «upload»
87.31
33.98

Наш UserParameter работает правильно.

  • Создание элемента данных в Zabbix

В ключе определяем ключ, который мы создали в агенте.
В окне Интервал обновления укажите 20-30мин
Вы можете найти больше о пользовательских интервалах здесь.

Повторяем действия для upload:

Создание элемента данных в Zabbix В ключе определяем ключ, который мы создали в агенте. В окне Интервал обновления укажите 20-30мин Вы можете найти больше о пользовательских интервалах здесь.

Повторяем действия для upload Дождитесь появления запланированного обновления в Zabbix.


ИСТОЧНИКИ: