«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:darkgreen">*[[Базовые Namespace паттерны JavaScript]]</span>
* '''устанавливаем postgresql''', читать тут [[PostgreSQL]]
*[[Базовые Namespace паттерны JavaScript]]


*[[ООП JavaScript - наследование]]
* '''устанавливаем необходимые пакеты:'''
*[[Область видимости переменной в Javascript]]
echo "deb-src http://repo.zabbix.com/zabbix/3.4/debian stretch main" > /etc/apt/sources.list.d/zabbix.list
*[[Клиентский (браузерный) JavaScript]]
wget -O - "http://repo.zabbix.com/zabbix-official-repo.key" | apt-key add -
**[[Javascript синхронный и асинхронный запрос]]
wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-79EA5ED4" | apt-key add -
*[[JavaScript Strict Mode]]
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
*[[Масштабируемые JavaScript приложения]]
apt-get install zabbix-agent zabbix-frontend-php zabbix-proxy-pgsql zabbix-server-pgsql php-fpm nginx
*[[10 несуразностей и секретов JavaScript]]
*[[Используем console на полную]]
----
*[[Java Script модули]]


==Крайне полезная информация==
* '''создаем администратора базы zabbix'''
CREATE USER zabbixadmin WITH PASSWORD 'mypassword';


Это надо обработать
* '''создаем базу данных для zabbix'''
*[http://jsperf.com/array-prototype-push-apply-vs-concat/20 Тесты производительности циклов, работы с массивами и т.д.]
CREATE DATABASE "zabbix"
*'''[http://bonsaiden.github.com/JavaScript-Garden/ru/ JavaScript Гарден]'''
  WITH OWNER "zabbixadmin"
*[http://habrahabr.ru/post/117069/ Модульный подход в JavaScript]
  ENCODING 'UTF8'
*[http://canegor.urc.ac.ru/gui_for_script/articles/random_sort.htm Случайное перемешивание массива]
  LC_COLLATE = 'ru_RU.UTF-8'
*[http://habrahabr.ru/post/131714/ Javascript наследование для чайников]
  LC_CTYPE = 'ru_RU.UTF-8';
*[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]


==обработка событий в примерах==
* '''даем права на базу администратору'''
*[http://on-line-teaching.com/js/js.events.keyboard.htm События клавиатуры и мыши]
  GRANT ALL PRIVILEGES ON DATABASE "zabbix" to zabbixadmin;
*[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/ предсказание элемента формы]


==Библиотеки==
* '''теперь необходимо в эту базу загрузить шаблоны и схему (для postgresql)'''
*[http://qooxdoo.org/ JavaScript-фреймворк qooxdoo 1.6] - новое слово в вебинтерфейсах
zcat /usr/share/zabbix-server-pgsql/{schema,images,data}.sql.gz|psql -h 127.0.0.1 zabbix zabbixadmin
:*[http://www.opennet.ru/opennews/art.shtml?num=32573 Новость про qooxdoo 1.6]
'''{!}''' - для версии 3.4:
*[http://www.leemon.com/crypto/BigInt.js JS библиотека для работы с большими числами][http://www.leemon.com/crypto/BigInt.html Демо]
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,<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
....


*[http://learn.javascript.ru/lib Мини-библиотека функций]
* '''(!)''' - возможно '''zabbix''' при первом запуске еще что-то попросит, измените как будет указано.
===Несколько интересных проектов с помощью которых можно динамически создавать векторные рисунки.===
* [http://y3x.ru/2010/12/artisanjs/ Статья - Пробуем ремесло рисования с помощью ArtisanJS]
* [http://artisanjs.com/ Страница разработчика ArtisanJS]
* [http://jcscript.com/ Высокопроизводительная библиотека динамического рисования Html5 - полностью самодостаточная]
* [http://raphaeljs.com Кросс-браузерное решение]
* [http://kangax.github.com/fabric.js/kitchensink/ Поддерживается как свободное рисование так и работа с векторными формами]
 
==Полезные трюки==
http://habrahabr.ru/post/155093/
 
==Как работает Array.prototype.slice.call==
Для того, чтобы из аргументов JavaScript функции "отрезать" первые Х значений, используется метод:
 
Array.prototype.slice.call(arguments, X);
 
Например такая функция вернет "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.
* '''nginx''' - пример наcтройки для '''zabbix''':
 
<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;
    }
   
   
var bValue;
    location ~* \.(gif|jpg|png)$ {
Object.defineProperty(o, "b", {get : function(){ return bValue; },
        expires 30d;
                              set : function(newValue){ bValue = newValue; },
    }
                              enumerable : true,
                              configurable : true});</nowiki>
 
Лучше меня объяснит MDN [https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty Object/defineProperty]. Благо, даже английский знать не надо, и так всё понятно.
 
Если нужно определить сразу несколько свойств, можно использовать Object.defineProperties, который принимает два аргумента: объект, требующий изменений и объект с определяемыми ключами.
MDN: [https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperties Object/defineProperties].
 
<nowiki>
// Код сперт с MDN
Object.defineProperties(obj, {
  "property1": {
    value: true,
    writable: true
  },
  "property2": {
    value: "Hello",
    writable: false
  }
  // etc. etc.
});</nowiki>
 
 
 
Теперь соль. Чего я вообще решил это запостить?
 
Так как в упомянутом выше проекте мне приходится использовать defineProperty не просто активно, а очень активно, код стал, мягко говоря, некрасивым. Пришла в голову простейшая идея (как я до этого раньше-то не додумался?), расширить прототип Object, сделав код сильно компактнее. Плохой тон, скажете вы, засерать прототип Object новыми методами.
 
Откуда вообще взялось это мнение? Потому что все объекты унаследуют это свойство, которое, при обычной модификации прототипа, становится перечисляемым в for..in. На душе становится тепло, когда вспоминаешь о том, что я описал выше, а именно, о свойстве дескриптора enumerable. Действительно, расширив прототип таким образом:
 
<nowiki>Object.defineProperty( Object.prototype, 'logOk' {
    value: function() { console.log('ok') },
    enumerable: false
});</nowiki>
 
все объекты получат этот метод, но, при этом, он будет неперечисляемым (не нужно каждый раз использовать hasOwnProperty для проверки, есть ли такое свойство):
 
<nowiki>var o = {a: 1, b: 2}
for( var i in o ) console.log( i, o[ i ] );
> a 1
> b 2
o.logOk();
> ok</nowiki>
 
 
Собственно то, ради чего я тут графоманю.
 
Во-первых определим метод define, чтоб каждый раз не вызывать перегруженную, на мой взгляд, конструкцию. Во-вторых определим метод extendNotEnum, который расширяет объект неперечисляемыми свойствами.
 
<nowiki>Object.defineProperties( Object.prototype, {
    define: {
        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>
 
Использование:
<nowiki>var o = { a: 1 };
o.define( 'randomInt', {
    get: function() {
        return 42;
    }
});
 
o.extendNotEnum({
    b: 2;
});
 
for( var i in o ) console.log( i, o[ i ] );
> a 1
> randomInt 42
 
console.log( o.b );
> 2
</nowiki>
 
И пошла… Еще два удобных метода:
 
<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 ) {
    // просто повторяет механизм $.each, перебирая все ключи и свойства
});</nowiki>
 
 
Добавлять новые свойства можно до бесконечности, никто вам за это руку не откусит.
 
Вывод
 
Играйте в Денди, пишите на Javascript, который становится всё лучше и лучше.
 
комментарии
 
 
Еще один финт ушами для тех, кто определяет свойства прототипа только однажды, после определения функции-конструктора:
<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
    location ~ \.php$ {
enumChildNodes(document.body);</nowiki>
        fastcgi_pass  localhost:9000;
 
        fastcgi_param SCRIPT_FILENAME
===Обход child nodes (потомков) определнного элемента в Javascript===
                      $document_root$fastcgi_script_name;
JavaScript на заметку Комментировать
        include      fastcgi_params;
Речь о том как корректно обойти элементы потомки 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 потомка, чтобы он был
* '''Проблема:''' Триггер с элементом vm.memory.size
элементом страницы и если так, то окрашиваем его в КРАСНЫЙ цвет.
Пытаюсь мониторить переполнение RAM (если меньше 10% свободной RAM в течении 5 минут) и создаю триггер:
{hostname:vm.memory.size[available].last(5m)}<10
Однако ничего не происходит.


В принципе на базе этой конструкции можно организовать рекурсивный обход дерева
* '''Решение:'''
всех потомков заданного элемента, если конечно возникнет такая необходимость, но
Вам для вашей задачи лучше использовать функцию 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>


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


так быстрее и меньше кода
* '''Решение:''' Cоветую увеличить интервал и также путем увелечинеия памяти!
  var object = document.getElementById(‘el’).getElementsByTagName(‘*’);
  [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 Вот здесь совет]
for(var i=0;object[i];i++){
  Пример: {Zabbix server:system.cpu.util[,iowait].avg(5m)}>30
  object[i].style.color = ‘#FF0000′;
<hr>


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


Sun, getElementsByTagName не поддерживает ИЕ, смысл его использовать?
* Проблема: zabbix win 7  cannot make counterpath for "\\": [0xC0000BBD] Обязательный аргумент пропущен или указан неправильно.
* Решение:
cmd
lodctr /r
* взято [https://serveradmin.ru/zabbix-init_cpu_collector-cannot-make-counterpath/ тут]


К сожалению заметил, что данная конструкция в Opera выполняется некорректно
(цикл for проходится два раза), никто с таким не встречался? Где-то всё же
закралась моя ошибка или это ошибка браузера (проверял в 9.20, 9.50, 10.20),
замечу, что в остальных браузерах всё выполняется верно.


var object = document.getElementById(‘el’);
<hr>
for (var childItem in object.childNodes) {
'''ИСТОЧНИКИ:'''
<hr>
}
* [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 сервер.]
var object=document.getElementById(‘el’);
* [http://jakondo.ru/ustanovka-i-nastrojka-zabbix-agentov-na-os-windows-i-linux-ubuntu-debian/ Установка и настройка Zabbix агентов на ОС Windows и Linux (Ubuntu, Debian)]
for(var i=0;i<object.childNodes.length;i++) {
* [http://www.ekzorchik.ru/2015/01/install-zabbix-agent-on-windows-7/ Установить Zabbix агент на Windows 7]
if (object.childNodes[i].nodeType == 1) {
* [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 Получение оповещения о проблеме]
}
* [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]

Версия от 05:12, 17 сентября 2018

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;
    } 
}

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

  • Проблема: Триггер с элементом 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



ИСТОЧНИКИ: