modMonitor 2+
Несмотря на то, что в MODX нашлись критические уязвимости, я продолжаю дальше разработку на своей любимой платформе, и надеюсь другие так же будут делать. Лично я ни на минуту не задумался на счет смены движка. Уверен, эти дыры залатаются, и все будут спать спокойно.
Сегодня я выкатил обновленную версию компонента modMonitor, который так же, возможно, кому-нибудь немного расстроил сон. Во всяком случае обсуждений было много.
Итак, что добавилось?
1. Учет вложенности элементов. Вот эта штука изначально планировалась, но являлась одной из двух сложнейших задач. Пример: вызывается у нас сниппет, внутри которого выполняется еще несколько вызовов сниппетов и чанков, а у тех еще вложенные вызовы есть. И вот эту вложенность и хотелось видеть, так как общий список вызванных элементов не очень был информативен, не было понятно где какой вызов выполнялся. Сейчас эту вложенность видно.
Согласитесь, так гораздо удобнее.
Здесь оговорюсь, что пока время отработки элемента включает в себя время выполнения всех дочерних элементов. То есть если вызвался чанк, который сам по себе отрабатывается быстро, но в нем еще вызывался сниппет, который занял гораздо больше времени, зафиксированное время работы чанка будет общее для обоих этих элементов. Планирую в скором времени это подправить.
2. Учет реферальных страниц для ajax-запросов. Это была вторая из сложных задач. Надо было понимать, какие страницы напрямую вызваны, а какие в следствии ajax-запросов. Зачем это нужно? Не раз встречал, что заходя на страницу, с нее отправляются на сервер еще пара-тройка (а то и более), запросов, при чем часто на саму же себя. Пример:
То есть здесь, при заходе на страницу, мы получаем еще три запроса на текущую страницу. Эти запросы видно и по отдельности (с признаком parent), и в раскрываемой информации о запросе (с иконками глобуса — это дочерние ajax-запросы).
Здесь поделюсь очень полезным кодом:
3. Добавились фильтры запросов.
— В строчное поле можно прописать запрос, который учитывается так:
Если это число, то ищет либо запрос с указанным ID, либо документ с указанным ID.
Если это строка, тогда уже идет поиск по строке адреса запроса. Здесь я не стал делать поиск по маске, так как при неточном поиске будет слишком сложно искать более релевантную информацию. То есть если у вас страницы были запрошены по адресу /office/lk/, нельзя их будет увидеть, вбив просто “office”. В таком случае будет выполняться поиск страниц, запрошенных именно по адресу office (такие вряд ли будут когда). Это важно учитывать. Но зато можно использовать родные sql-спецсимволы, такие как % — любое количество любых символов и подчеркивание _ — один любой символ. Так по запросу /office/% будут найдены и /office/, и /office/lk/ и т.п., а по запросу /office_, только /office/. А вот так %office%?% будут найдены документы типа /office/?.. или …../office/….?..
Уверен, вы разберетесь, документация по SQL всегда поможет.
В дальнейшем планирую добавить поддержку регулярных выражений.
— В поле “Время” можно указать время в секундах (можно дробных), чтобы вывести только те запросы, которые по времени выполнялись дольше указанного.
— Кеш. Выпадающий список. Можно отфильтровать только те запросы, которые сформированы из кеша, или наоборот не из кеша.
Таким образом можно, к примеру, вывести все запросы на личный кабинет, не из кеша, с минимальным временем выполнения 0.5 сек. Здесь значения могут сильно разниться для разных пользователей, так как у них могут быть разные права и, соответственно, разный пулл данных, с которым они работают.
4. Мониторинг теперь работает не только при обработке документов. По сути, он сейчас работает при любом вызове MODX-а. Даже если вы в Console выполните $modx->runSnippet($snippetName);, этот запрос будет зафиксирован и сохранен. Это особенно полезно для мониторинга Ajax-запросов, в том числе на коннекторы.
Здесь только оговорочка: если это выполняется в контексте mgr, то такой запрос может быть не зафиксирован. Об этом подробней в следующем пункте.
5. Добавлена системная настройка modmonitor.exclude_contexts. По умолчанию прописано mgr, но можно очистить ее, или наоборот через запятую перечислить контексты, в которых не будет выполняться сохранение статистики.
6.Добавлена системная настройка modmonitor.min_time_for_save. По умолчанию пустая. Сюда можно указать в секундах время (например, 0.3), и если общее время запроса будет меньше этого времени, то этот запрос не будет сохранен в базу данных, что существенно снизит объем хранящейся в базе информации.
Хотя лично я против этого. Если у вас не будет информации о хороших запросах, то как вы узнаете, что сайт по большей степени хорошо работает? Надо, указав минимальное пороговое время, увидеть всего не более 10% запросов (являющихся проблемными), что будет говорить о нормальном состоянии сайта. А если вы будете видеть только плохие, то не с чем будет сравнивать. Да, информации храниться будет много лишней, но, во-первых, можно фильтровать эту информацию, а во-вторых, и вовсе отключать плагин модмонитора, если вы ведете отладку только в риалтайме.
7. Добавлена таки кнопка очистки собранной статистики.
Статистика очищается через truncate table, так что и быстро получается (несколько сотен тысяч записей должно вообще легко очищать), и счетчик айдишников сбрасывается.
8. Добавлена ссылка с переключением на пользователя.
Это уже приятная полезность для тех, кто использует компонент switchUser. Если запрос был выполнен от имени другого авторизованного юзера (не вашего текущего), то ссылка со специальной иконкой будет сформирована так, чтобы при переходе по ней сразу же выполнялась авторизация от имени этого пользователя. Будет полезным для тех, кто занимается отладкой проектов с большим количеством пользователей и групп пользователей.
Ну и напоследок несколько кейсов с использованием modMonitor.
1. Глобальное отключение кеширования ресурсов.
Вот это, честно говоря, мне не очень понятно зачем люди делают. Тем не менее за пару недель на тройке сайтов уже встречал. Начинаешь анализировать статистику и видишь там такое:
То есть все документы не из кеша берутся, даже при повторном заходе. Такое сразу в глаза бросается.
В чем же проблема? Народ зачем-то идет в системные настройки и выставляет cache_resource = 0.
Не надо так! В таком случае не просто все элементы на странице не кешируются, но и в целом документ не кешируется (включая настройки политик безопасности, ТВ-поля и т.п.). Из-за этого нагрузка на сервер сильно возрастает. Переживаете за кеширование и хотите чтобы для всех пользователей все элементы вызывались не кешируемые, не жалейте плюсиков, прописывайте их всем элементам. Даже если вообще все элементы у вас будут не кешируемые, разница в нагрузке будет ощутимая, если вы полностью отключаете кеширование документов.
2. Лишние ajax-запросы. Про это я уже выше упоминал. В одном случае их плодит гугл-тагманагер (почему три запроса вместо одного, не знаю, не ковырял еще). В другом случае просто логическая ошибка в пользовательских скриптах, из-за чего одно и то же событие несколько раз вызывалось.
3. Разбор большого количества вызываемых элементов.
Достался сайт на оптимизацию, так там вот такой ужас творится:
Одних только pdoResources 38 вызовов.
Жесть, как она есть. Разбираться в таком без модмонитора сложно в том плане, что элементов много, но далеко не все они дают серьезную нагрузку. Вычленить из общей кучи только нагруженные элементы и заняться конкретно ими, не распыляясь на мелочь — это серьезная экономия времени.
4. Поиск потерянных элементов.
modMonitor умеет сообщать о вызываемых, но не найденных элементах. Например, вот о таком сообщил один пользователь:
Вот мой развернутый ответ на этот счет:
Это позволит в некоторых случаях более четко увидеть где именно на странице какой элемент вызывается. Да, не очень красиво выглядит, но иногда реально помогает.
Вот как-то так. Демо-версия так же доступна на сайте modmonitor.ru/(регистрируемся во фронте и со своим логином-паролем идем в админку смотреть статистику).
По традиции пакет выходит в статусе beta (просто я так привык), тем не менее основа заложена плотно, предыдущая модель лишь чуть-чуть расширена, так что предыдущая статистика не пропадет.
Если кто обновляется, сразу предупреждаю, что пакет переустановить надо пару раз (просто в менеджере пакетов после установки новой версии еще раз нажать Переустановить). Это отдельная песня. Модуль добавляется в extensionPackages, и в момент установки его модель уже получена MODX-ом. При этом он должен на уже существующие таблицы добавить пару колонок. Но в текущей модели именно в этот момент информации об этих колонках у него нет, потому он их не может создать. При повторной установке модель уже корректно формируется при инициализации MODX-а и колонки новые формируются. В общем, при установке должна быть ругань на то, что не может создать колонки parent и properties, так как они уже существуют. Тогда все ОК уже.
И не забудьте после установки принудительно сбросить кеш сайта.
P.S. Напоминаю, что сегодня последний день продажи компонента со скидкой 30%. Завтра уже будет стоить полную цену и скидок больше не будет. Зато то ли еще будет новенькое в следующих версиях. Держите свои сайты под контролем!
Два пакета уже взяли.
P.P.S. Для, тех, кто все еще считает, что это не стоит 5000: я сегодня просидел к ряду 21 час (с перерывами на покушать и в туалет). Если кто считает, что он легко и быстро такое накатать может и продавать по три рубля (еще и профит получать), повторюсь: первая версия лежит на гитхабе, качайте, прокачивайте, продавайте.
P.P.P.S. Количество продаж уже 4 шт. Компонент получает финансирование и гарантированно будет развиваться.
Сегодня я выкатил обновленную версию компонента modMonitor, который так же, возможно, кому-нибудь немного расстроил сон. Во всяком случае обсуждений было много.
Итак, что добавилось?
1. Учет вложенности элементов. Вот эта штука изначально планировалась, но являлась одной из двух сложнейших задач. Пример: вызывается у нас сниппет, внутри которого выполняется еще несколько вызовов сниппетов и чанков, а у тех еще вложенные вызовы есть. И вот эту вложенность и хотелось видеть, так как общий список вызванных элементов не очень был информативен, не было понятно где какой вызов выполнялся. Сейчас эту вложенность видно.
Согласитесь, так гораздо удобнее.
Здесь оговорюсь, что пока время отработки элемента включает в себя время выполнения всех дочерних элементов. То есть если вызвался чанк, который сам по себе отрабатывается быстро, но в нем еще вызывался сниппет, который занял гораздо больше времени, зафиксированное время работы чанка будет общее для обоих этих элементов. Планирую в скором времени это подправить.
2. Учет реферальных страниц для ajax-запросов. Это была вторая из сложных задач. Надо было понимать, какие страницы напрямую вызваны, а какие в следствии ajax-запросов. Зачем это нужно? Не раз встречал, что заходя на страницу, с нее отправляются на сервер еще пара-тройка (а то и более), запросов, при чем часто на саму же себя. Пример:
То есть здесь, при заходе на страницу, мы получаем еще три запроса на текущую страницу. Эти запросы видно и по отдельности (с признаком parent), и в раскрываемой информации о запросе (с иконками глобуса — это дочерние ajax-запросы).
Здесь поделюсь очень полезным кодом:
$js = "<script type=\"text/javascript\">
window.modMonitorObjectId = {$modMonitor->request->id};
(function(open) {
XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
open.call(this, method, url, async, user, pass);
this.setRequestHeader('modmonitor-object-id', window.modMonitorObjectId);
};
})(XMLHttpRequest.prototype.open);
</script>";
При вызове данная функция переопределяет метод open родного оконного механизм Ajax-запросов XMLHttpRequest таким образом, чтобы при запросах сразу подставлялся пользовательский параметр в заголовках. Далее уже на стороне сервера я ловлю переданный идентификатор в заголовках, и если он есть, выставляю родителя.3. Добавились фильтры запросов.
— В строчное поле можно прописать запрос, который учитывается так:
Если это число, то ищет либо запрос с указанным ID, либо документ с указанным ID.
Если это строка, тогда уже идет поиск по строке адреса запроса. Здесь я не стал делать поиск по маске, так как при неточном поиске будет слишком сложно искать более релевантную информацию. То есть если у вас страницы были запрошены по адресу /office/lk/, нельзя их будет увидеть, вбив просто “office”. В таком случае будет выполняться поиск страниц, запрошенных именно по адресу office (такие вряд ли будут когда). Это важно учитывать. Но зато можно использовать родные sql-спецсимволы, такие как % — любое количество любых символов и подчеркивание _ — один любой символ. Так по запросу /office/% будут найдены и /office/, и /office/lk/ и т.п., а по запросу /office_, только /office/. А вот так %office%?% будут найдены документы типа /office/?.. или …../office/….?..
Уверен, вы разберетесь, документация по SQL всегда поможет.
В дальнейшем планирую добавить поддержку регулярных выражений.
— В поле “Время” можно указать время в секундах (можно дробных), чтобы вывести только те запросы, которые по времени выполнялись дольше указанного.
— Кеш. Выпадающий список. Можно отфильтровать только те запросы, которые сформированы из кеша, или наоборот не из кеша.
Таким образом можно, к примеру, вывести все запросы на личный кабинет, не из кеша, с минимальным временем выполнения 0.5 сек. Здесь значения могут сильно разниться для разных пользователей, так как у них могут быть разные права и, соответственно, разный пулл данных, с которым они работают.
4. Мониторинг теперь работает не только при обработке документов. По сути, он сейчас работает при любом вызове MODX-а. Даже если вы в Console выполните $modx->runSnippet($snippetName);, этот запрос будет зафиксирован и сохранен. Это особенно полезно для мониторинга Ajax-запросов, в том числе на коннекторы.
Здесь только оговорочка: если это выполняется в контексте mgr, то такой запрос может быть не зафиксирован. Об этом подробней в следующем пункте.
5. Добавлена системная настройка modmonitor.exclude_contexts. По умолчанию прописано mgr, но можно очистить ее, или наоборот через запятую перечислить контексты, в которых не будет выполняться сохранение статистики.
6.Добавлена системная настройка modmonitor.min_time_for_save. По умолчанию пустая. Сюда можно указать в секундах время (например, 0.3), и если общее время запроса будет меньше этого времени, то этот запрос не будет сохранен в базу данных, что существенно снизит объем хранящейся в базе информации.
Хотя лично я против этого. Если у вас не будет информации о хороших запросах, то как вы узнаете, что сайт по большей степени хорошо работает? Надо, указав минимальное пороговое время, увидеть всего не более 10% запросов (являющихся проблемными), что будет говорить о нормальном состоянии сайта. А если вы будете видеть только плохие, то не с чем будет сравнивать. Да, информации храниться будет много лишней, но, во-первых, можно фильтровать эту информацию, а во-вторых, и вовсе отключать плагин модмонитора, если вы ведете отладку только в риалтайме.
7. Добавлена таки кнопка очистки собранной статистики.
Статистика очищается через truncate table, так что и быстро получается (несколько сотен тысяч записей должно вообще легко очищать), и счетчик айдишников сбрасывается.
8. Добавлена ссылка с переключением на пользователя.
Это уже приятная полезность для тех, кто использует компонент switchUser. Если запрос был выполнен от имени другого авторизованного юзера (не вашего текущего), то ссылка со специальной иконкой будет сформирована так, чтобы при переходе по ней сразу же выполнялась авторизация от имени этого пользователя. Будет полезным для тех, кто занимается отладкой проектов с большим количеством пользователей и групп пользователей.
Ну и напоследок несколько кейсов с использованием modMonitor.
1. Глобальное отключение кеширования ресурсов.
Вот это, честно говоря, мне не очень понятно зачем люди делают. Тем не менее за пару недель на тройке сайтов уже встречал. Начинаешь анализировать статистику и видишь там такое:
То есть все документы не из кеша берутся, даже при повторном заходе. Такое сразу в глаза бросается.
В чем же проблема? Народ зачем-то идет в системные настройки и выставляет cache_resource = 0.
Не надо так! В таком случае не просто все элементы на странице не кешируются, но и в целом документ не кешируется (включая настройки политик безопасности, ТВ-поля и т.п.). Из-за этого нагрузка на сервер сильно возрастает. Переживаете за кеширование и хотите чтобы для всех пользователей все элементы вызывались не кешируемые, не жалейте плюсиков, прописывайте их всем элементам. Даже если вообще все элементы у вас будут не кешируемые, разница в нагрузке будет ощутимая, если вы полностью отключаете кеширование документов.
2. Лишние ajax-запросы. Про это я уже выше упоминал. В одном случае их плодит гугл-тагманагер (почему три запроса вместо одного, не знаю, не ковырял еще). В другом случае просто логическая ошибка в пользовательских скриптах, из-за чего одно и то же событие несколько раз вызывалось.
3. Разбор большого количества вызываемых элементов.
Достался сайт на оптимизацию, так там вот такой ужас творится:
Одних только pdoResources 38 вызовов.
Жесть, как она есть. Разбираться в таком без модмонитора сложно в том плане, что элементов много, но далеко не все они дают серьезную нагрузку. Вычленить из общей кучи только нагруженные элементы и заняться конкретно ими, не распыляясь на мелочь — это серьезная экономия времени.
4. Поиск потерянных элементов.
modMonitor умеет сообщать о вызываемых, но не найденных элементах. Например, вот о таком сообщил один пользователь:
еще ошибка в логе(ERROR @ /***/www/core/components/modmonitor/model/modmonitor/parser/modmonitorparser.class.php : 79) Не был получен элемент modSnippet [['"±","©","©","®","©","©","®"," "],["±","©","©","®","©","©","®"," "']]
А тут он вот это правило в Jevix воспринимает как снипетНа самом деле совсем не зря MODX-парсер воспринимает это как сниппет, ведь синтаксис соответствует.
<meta property="og:description" content="[[Jevix? &input=`[[*introtext]]` &cfgAllowTags=`` &cfgSetAutoBrMode=`0` &cfgSetAutoReplace=`[["±","©","©","®","©","©","®"," "],["±","©","©","®","©","©","®"," "]]`]]">
Вот мой развернутый ответ на этот счет:
Это не modMonitor ошибается. modMonitor кушает то, что находит MODX-парсер. А он это воспринимает как сниппет. Синтаксис-то соответствует. Просто MODX-парсер работает в двух режимах:Кстати, есть еще одна хитрость. Если в настройках включить modmonitor.debug = 1, то в логах можно увидеть такие записи:
1. Не найденные теги не очищаются.
2. Не найденные теги очищаются.
Второй режим срабатывает когда документ окончательно распарсен. В вашем случае, когда первый раз выполняется, этот не найденный тег не очищается, и передается в вызов как есть. А там уже его нормально съедает джевикс.
Чтобы нормально работало и все рады были, достаточно пробелы поставить между квадратными скобками, вот так:
[ ["±","©","©","®","©","©","®",""],["±","©","©","®","©","©","®"," "] ]
[2016-11-13 15:24:53] (ERROR @ /var/www/core/components/modmonitor/model/modmonitor/parser/modmonitorparser.class.php : 85) Не был получен элемент modSnippet 'some_snippet'
А если при этом включить плагин Debug из пакета modxSite, то можно увидеть подобную картину:Это позволит в некоторых случаях более четко увидеть где именно на странице какой элемент вызывается. Да, не очень красиво выглядит, но иногда реально помогает.
Вот как-то так. Демо-версия так же доступна на сайте modmonitor.ru/
По традиции пакет выходит в статусе beta (просто я так привык), тем не менее основа заложена плотно, предыдущая модель лишь чуть-чуть расширена, так что предыдущая статистика не пропадет.
Если кто обновляется, сразу предупреждаю, что пакет переустановить надо пару раз (просто в менеджере пакетов после установки новой версии еще раз нажать Переустановить). Это отдельная песня. Модуль добавляется в extensionPackages, и в момент установки его модель уже получена MODX-ом. При этом он должен на уже существующие таблицы добавить пару колонок. Но в текущей модели именно в этот момент информации об этих колонках у него нет, потому он их не может создать. При повторной установке модель уже корректно формируется при инициализации MODX-а и колонки новые формируются. В общем, при установке должна быть ругань на то, что не может создать колонки parent и properties, так как они уже существуют. Тогда все ОК уже.
И не забудьте после установки принудительно сбросить кеш сайта.
P.S. Напоминаю, что сегодня последний день продажи компонента со скидкой 30%. Завтра уже будет стоить полную цену и скидок больше не будет. Зато то ли еще будет новенькое в следующих версиях. Держите свои сайты под контролем!
Два пакета уже взяли.
P.P.S. Для, тех, кто все еще считает, что это не стоит 5000: я сегодня просидел к ряду 21 час (с перерывами на покушать и в туалет). Если кто считает, что он легко и быстро такое накатать может и продавать по три рубля (еще и профит получать), повторюсь: первая версия лежит на гитхабе, качайте, прокачивайте, продавайте.
P.P.P.S. Количество продаж уже 4 шт. Компонент получает финансирование и гарантированно будет развиваться.
Комментарии: 57
Спасибо! Фильтр в выборке добавил удобства. Еще бы в этот фильтр отдельно контексты.
Еще бы в этот фильтр отдельно контексты.Выкатил 2.2.1 с фильтром по контекстам.
Это же праздник, чесн слово)))
Спасибо! Очень здорово!
10 контекстов у меня, теперь все очень удобно мониторить!
Спасибо! Очень здорово!
10 контекстов у меня, теперь все очень удобно мониторить!
Не за что! :) В обозримом будущем еще графики будут :)
А без modxSite будет?
Мне смарти не нужен, приходится удалять сразу после проверки.
Мне смарти не нужен, приходится удалять сразу после проверки.
modxSite давно уже не устанавливает никакие пакеты с собой.
modxSite-1.4.0 ===========================
1. Remove packages autoinstall
Но он не обходим, так как в себе несет getdata-процессоры для быстрых выборок.
modxSite-1.4.0 ===========================
1. Remove packages autoinstall
Но он не обходим, так как в себе несет getdata-процессоры для быстрых выборок.
Выложил 2.3.0
Добавлено нормальное отслеживание статусов ответов и фильтры по ним. В статусах даже редиректы учитываются, что очень удобно.
В фильтрах код ответа можно как точно указывать (например 404), так и маску, например 40. Поиск выполняется like 'status%'.
Фишка: можно в поиске указывать код с отрицанием, например !200. Тогда будут найдены все запросы со статусом не 200.
Кстати, здесь SEOшники могут поиграться и поругаться. К примеру, запрос ///catalog//// нормально отдаст страницу, для которой реальный адрес /catalog/. Они скажут «Ага! MODX дубли плодит!».
Добавлено нормальное отслеживание статусов ответов и фильтры по ним. В статусах даже редиректы учитываются, что очень удобно.
В фильтрах код ответа можно как точно указывать (например 404), так и маску, например 40. Поиск выполняется like 'status%'.
Фишка: можно в поиске указывать код с отрицанием, например !200. Тогда будут найдены все запросы со статусом не 200.
Кстати, здесь SEOшники могут поиграться и поругаться. К примеру, запрос ///catalog//// нормально отдаст страницу, для которой реальный адрес /catalog/. Они скажут «Ага! MODX дубли плодит!».
Не удержался)) Выложил новую версию.
В 2.4.0 добавил крайне крутую и важную штуку — логирование критических php-ошибок. Посмотрите какая крутая штука!:
Подробная информация об ошибке — двойной клик по колонке ошибки.
Так же добавил фильтр. Можно указать как абсолютное значение, например 4, так и использовать логические (>1, <8, <>4 и т.п.). А можно и вовсе звездочку указать, тогда вообще все ошибки будут найдены.
Список всех кодов ошибок здесь.
P.S. На одном проекте выяснилось, что стоит fastFieldParser. Выложил 2.4.1 с поддержкой этого парсера.
В 2.4.0 добавил крайне крутую и важную штуку — логирование критических php-ошибок. Посмотрите какая крутая штука!:
Подробная информация об ошибке — двойной клик по колонке ошибки.
Так же добавил фильтр. Можно указать как абсолютное значение, например 4, так и использовать логические (>1, <8, <>4 и т.п.). А можно и вовсе звездочку указать, тогда вообще все ошибки будут найдены.
Список всех кодов ошибок здесь.
P.S. На одном проекте выяснилось, что стоит fastFieldParser. Выложил 2.4.1 с поддержкой этого парсера.
Спасибо за очередные улучшения!
Кстати, вот часто встречается ошибка:
Кстати, вот часто встречается ошибка:
Ошибка: session_start(): Session callback expects true/false return value
Файл: /home/*****/www/core/model/modx/modx.class.php
Строка: 2270
PS смотрю, тут эта тема поднималась
Не за что?
Это уже в модмониторе фиксируется? Можете прислать доступ в админку? Посмотрю что можно сделать.
Это уже в модмониторе фиксируется? Можете прислать доступ в админку? Посмотрю что можно сделать.
Это уже в модмониторе фиксируется— да, именно.
пришлю сегодня
ОК
Наглядность в отчетах показала массу косяков, например что некоторые документы «пролезли» в другой контекст и прочие- прочие плюхи))
Видимо план реконструкции теперь будет реальным, а то так черновиком бы и жили еще неопределенное время.
В общем, это я к тому что мои затраты уже оправдались.
Доступ пришлю когда согласую с редакторами время, что бы ни кто из них не работал в админке.
Видимо план реконструкции теперь будет реальным, а то так черновиком бы и жили еще неопределенное время.
В общем, это я к тому что мои затраты уже оправдались.
Доступ пришлю когда согласую с редакторами время, что бы ни кто из них не работал в админке.
Да, я тоже на некоторых проектах увидел гораздо больше, чем видел раньше. К примеру, при заходе на потерянную страницу вот такая картина возникала: joxi.ru/Y2LjLVESnRQQer
Там вообще отдельный шаблон использовался, и в нем куча битых ссылок на контент. Так-то ходишь по нормальным страницам, не видишь. А тут зашел в панель и скопом 15 потерянных к ряду… Кстати, позже добавлю логирование реферера, чтобы было видно с какой страницы подобные запросы валятся.
Там вообще отдельный шаблон использовался, и в нем куча битых ссылок на контент. Так-то ходишь по нормальным страницам, не видишь. А тут зашел в панель и скопом 15 потерянных к ряду… Кстати, позже добавлю логирование реферера, чтобы было видно с какой страницы подобные запросы валятся.
Да, правда, сейчас все 301 и 404 и куча всего, что надо поправить, все видно.
Больше вариантов сегментации отчетов!!! )) И все прекрасно.
Больше вариантов сегментации отчетов!!! )) И все прекрасно.
Варианты по сегментации отчетов предлагайте.
Да, по мере приведения сайта в порядок… Сейчас мрак. Надо убить 90% черновиков)))
Я записываю себе, что бы еще хотелось.
Я записываю себе, что бы еще хотелось.
ОК. Напоминаю, что хотелки и багрепорты можно слать в трекер bitbucket.org/modxclub/modmonitor/issues
А вот еще совсем свежий кейс:
Одна и та же страница для разных пользователей открывается с ошибкой или без. Проблема была в том, что пользователь хоть и был администратором, и у него были права на просмотр закрытой страницы, но не стояла галочка «Неограниченные права», из-за чего плагин не переключал для него скин, и на этой странице для него отсутствовал смарти-шаблон.
Одна и та же страница для разных пользователей открывается с ошибкой или без. Проблема была в том, что пользователь хоть и был администратором, и у него были права на просмотр закрытой страницы, но не стояла галочка «Неограниченные права», из-за чего плагин не переключал для него скин, и на этой странице для него отсутствовал смарти-шаблон.
Вот даже какие специфические ошибки ловит :)
А вот и вышла версия 2.5.0
Вообще она достойна отдельного топика, но во-первых, быстро слишком много моих анонсов на главной будет за раз, а во-вторых, надо бы пойти поспать, опять не спамши… Но релиз действительно знатный. Добавлен сбор статистики по плагинам, чего лично мне не хватало сильно, и мечтал я об этом не один год. И вот свершилось…
Вообще она достойна отдельного топика, но во-первых, быстро слишком много моих анонсов на главной будет за раз, а во-вторых, надо бы пойти поспать, опять не спамши… Но релиз действительно знатный. Добавлен сбор статистики по плагинам, чего лично мне не хватало сильно, и мечтал я об этом не один год. И вот свершилось…
Доброго дня!
Обновил, но сам плагин модмонитора стал пожирать время. Откатил назад.
Можно сделать возможность отключать в настройках например сбор данных по плагинам?
Обновил, но сам плагин модмонитора стал пожирать время. Откатил назад.
Можно сделать возможность отключать в настройках например сбор данных по плагинам?
Сколько времени он стал и на какое событие отжирать время?
P.S. настройку сделаю.
P.S. настройку сделаю.
30 секунд, аж главная стала колом))) Она и так грузится не очень быстро, но я говорил, что все в стадии выхода из черновиков, но одно дело не быстро — это 1.1146 не из кеша, а другое дело 30 секунд. Я откатился, потом попозже снова поставлю и все вам отправлю в modstor и там же напишите мне почту на которою я вам дам доступ.
Вообще он практически никак не должен влиять на скорость выполнения. Отладка плагинов пишется напрямую в кеш плагинов, то есть сами объекты плагинов никак не модифицируются. А там просто фиксируется время выполнения. Надо будет детальней изучать.
почта n.lanets@modxclub.ru
почта n.lanets@modxclub.ru
Доступ создам и напишу на почту.
Да, конечно надо изучить, но по факту отката к предыдущей версии сразу страница стала нормально грузиться.
Пока пусть прежняя версия трудится :)
Да, конечно надо изучить, но по факту отката к предыдущей версии сразу страница стала нормально грузиться.
Пока пусть прежняя версия трудится :)
ОК, скинете, вечером посмотрю.
Логи выложил в поддержке компонента на MODSTORE.
Вообще он практически никак не должен влиять на скорость выполненияСкорее всего из-за сбора данных о плагине он уходит где-то в рекурсию и через 30 сек. процесс PHP прибивается сервером.
Скопиовал для Николая лог медленных операций за сегодня.
Выложу в личном кабинете ModStore
Выложу в личном кабинете ModStore
Владимир, проверьте структуру таблиц монитора (modmonitor_request и modmonitor_request_items). Там поля parent случайно не nullable? И нет ли записей с parent = NULL?
_monitor_requests
_monitor_request_items
записей с parent = NULL — нет, только фактические ID
могу дампы таблиц скинуть, там же в modstore
_monitor_request_items
записей с parent = NULL — нет, только фактические ID
могу дампы таблиц скинуть, там же в modstore
Мне только структуру таблиц надо. Можно в phpMyAdmin сделать экспорт этих таблиц, но только структуру, данные не надо выгружать. Да, туда же закиньте.
Загрузил, посмотрите в личном кабинете.
PS я весьма понимаю, что разбор любых полетов может быть интересен для других участников сообщества. просто прошу, если я случайно выложу лишние данные- логины на модхосте, префиксы таблиц (не важно, актуально ли это теперь), логины админов, пожалуйста, удалите их, а если это невозможно, скажите мне, что я допустил эту оплошность.
PS я весьма понимаю, что разбор любых полетов может быть интересен для других участников сообщества. просто прошу, если я случайно выложу лишние данные- логины на модхосте, префиксы таблиц (не важно, актуально ли это теперь), логины админов, пожалуйста, удалите их, а если это невозможно, скажите мне, что я допустил эту оплошность.
Странно, поле не нулевое. Тогда без детального осмотра на стороне проекта ничего точно не получится сказать, пока на других проектах не было прецедентов.
Вечером выложу обновленный пакет с настройкой включения-отключения логирования плагинов, но вообще отладка плагинов — очень полезная штука, так что хорошо бы разобраться с ней. Можете обезличенный дамп сайта сделать? (контент и заголовки затереть, а так же емейлы, юзернеймы, комменты и т.п.).
P.S. Ок, просьбу учту.
Вечером выложу обновленный пакет с настройкой включения-отключения логирования плагинов, но вообще отладка плагинов — очень полезная штука, так что хорошо бы разобраться с ней. Можете обезличенный дамп сайта сделать? (контент и заголовки затереть, а так же емейлы, юзернеймы, комменты и т.п.).
P.S. Ок, просьбу учту.
Да, ок. От комментов мы когда то отказались (вообще, комменты — удел профессиональных сообществ, но только не новостных сайтов- упаси бог)
Сделаю обезличенный дамп.
Сделаю обезличенный дамп.
отладка плагинов — очень полезная штука— конечно, лишь бы все работало не нагружая сайт, тем более загрузку с фронта.
конечно, лишь бы все работало не нагружая сайт, тем более загрузку с фронта.Наверняка объяснение логическое есть. Но что интересно, компонент работает так, что с базой данных работает только когда скрипт полностью отработал, то есть сохранение объекта запроса (и вместе с ним всего остального), выполняется уже когда MODX отправил все данные во фронт и выполняет exit; (навешана функция через register_shutdown_function()).
Ради интереса, установите опять новую версию и в файле core/components/modmonitor/model/modmonitor.class.php в методе saveRequest() пропишите сразу return; чтобы тело функции не выполнялось. И если все равно тормозить будет, значит действительно где-то на уровне сбора информации о плагинах (что крайне удивительно будет). А если не будет тормозов, значит рекурсия на уровне получения дочерних элементов запроса, буду запросы изучать дополнительно.
Не вопрос, надо только время выбрать, а то сейчас есть посетители, ну как бы не хочется их распугать долгой загрузкой, я потому и снес все мигом. Выберу время, конечно проверю.
Владимир, выложил я 2.6.0, там добавлена настройка сбора статистики плагинов.
А еще вот такой классный функционал добавлен: modxclub.ru/topics/sbor-polzovatelskoj-statistiki-s-pomoshhyu-modmonitor-2242.html
А еще вот такой классный функционал добавлен: modxclub.ru/topics/sbor-polzovatelskoj-statistiki-s-pomoshhyu-modmonitor-2242.html
Спасибо, сейчас попробую! Статью читаю.
Не за что!
записей с parent = NULL — нет, только фактические IDА с parent =0 есть записи? Есть хотя бы процентов 10 от общего количества?
Из-за самого сбора данных — нет, там механизм простой. Но если поля нулевые, то с этим бага возникает. С этим столкнулся, когда делал вложенность. Я сразу объекты не сохраняю, все набивается через связи в основной объект текущего запроса.
Но когда сделал вложенность, структура данных получилась такая:
В итоге я на сохранение элементов прописал типа foreach($this->Children). И вот тут бага и проявилась: null-поля надо проверять именно как is null, а здесь xPDO видимо формирует запрос типа = null или = 0, и в таком случае он получал вообще все элементы, у которых поле parent = null. В таком случае да, если в базе элементов уже дофига, тут просто не хватает ресурсов. Если поле задавать не нулевое и значение по умолчанию задавать 0, тогда такой фигни не происходит.
$childs = array();
$childs[] = $item;
$childs[] = $item;
// ...
$request->Children = $childs;
Это позволяет в процессе набивать статистику, но не сохранять ничего, если не сохраняется основной объект запроса. А если уже мы его сохраняем, тогда и все дочерние элементы сохраняются.Но когда сделал вложенность, структура данных получилась такая:
$childs = array();
$childs[] = $item;
$childs_2 = array();
$childs_2 [] = $item;
$childs_2 [] = $item;
$item->Children = $childs_2;
$childs[] = $item;
// ...
$request->Children = $childs;
На уровне втором и ниже связь получается не Запрос-Элемент, а Элемент-Элемент, и при сохранении таких элементов id запроса не задается им (так как у них нет прямого родителя Запрос).В итоге я на сохранение элементов прописал типа foreach($this->Children). И вот тут бага и проявилась: null-поля надо проверять именно как is null, а здесь xPDO видимо формирует запрос типа = null или = 0, и в таком случае он получал вообще все элементы, у которых поле parent = null. В таком случае да, если в базе элементов уже дофига, тут просто не хватает ресурсов. Если поле задавать не нулевое и значение по умолчанию задавать 0, тогда такой фигни не происходит.
Выложил 2.6.3 с данными реферера и юзерагента, и поиска по ним joxi.ru/KAxeRO7c4WXXpr
Поиск стандартный для SQL: % — любое количество любых символов, _ — один любой символ.
Можно впереди ставить восклицательный знак, будет расценено как отрицание.
Поиск стандартный для SQL: % — любое количество любых символов, _ — один любой символ.
Можно впереди ставить восклицательный знак, будет расценено как отрицание.
Обновился. Шикарно! Спасибо.
Но реферер плюс, а IP адресс — минус, не уверен, что это хорошо. Хотя…
IP тоже есть, просто несколько полей по умолчанию скрыты. joxi.ru/D2PjRW0SdMzgvr
Класс! Спасибо.
Не за что!
Не забывайте, что скрыть или открыть по умолчанию те или иные поля вы можете самостоятельно на уровне плагина. Пример я описывал здесь. Все колонки дефолтные находятся в массиве $controller->requests_grid_columns
Не забывайте, что скрыть или открыть по умолчанию те или иные поля вы можете самостоятельно на уровне плагина. Пример я описывал здесь. Все колонки дефолтные находятся в массиве $controller->requests_grid_columns
Вот еще отличный кейс:
Переношу сайт с вордпресса, а там УРЛы были не ЧПУ. На новом сайте они ЧПУ, ну и просто IDшники не совпадают. Сложность еще оказалась в том, что все УРЛы с параметром $_GET['p'] ведут на корень сайта, так что 404-ую это не отдает, просто главная страница и все.
Задача состояла в том, чтобы роутер написать (который бы подмену документов делал и отдавал 404-ые для не найденных документов), ну и отслеживать это дело потом, чтобы видеть какие страницы вдруг не были найдены.
Визуально получилось вот так: joxi.ru/4Ak3wb9tMxnWWA
Можно легко сделать выборку всех страниц с таким параметром, и у которых статус не 200 (то есть не ОК) joxi.ru/Dr8Ke8OIkV5NkA
Отличная помощь в отладке проекта. И в ядро компонента не надо лезть, все делается на уровне плагина. Вот плагин вместе с кодом роутинга: gist.github.com/Fi1osof/726cb632b4861c4df8aee00d7863559e
Переношу сайт с вордпресса, а там УРЛы были не ЧПУ. На новом сайте они ЧПУ, ну и просто IDшники не совпадают. Сложность еще оказалась в том, что все УРЛы с параметром $_GET['p'] ведут на корень сайта, так что 404-ую это не отдает, просто главная страница и все.
Задача состояла в том, чтобы роутер написать (который бы подмену документов делал и отдавал 404-ые для не найденных документов), ну и отслеживать это дело потом, чтобы видеть какие страницы вдруг не были найдены.
Визуально получилось вот так: joxi.ru/4Ak3wb9tMxnWWA
Можно легко сделать выборку всех страниц с таким параметром, и у которых статус не 200 (то есть не ОК) joxi.ru/Dr8Ke8OIkV5NkA
Отличная помощь в отладке проекта. И в ядро компонента не надо лезть, все делается на уровне плагина. Вот плагин вместе с кодом роутинга: gist.github.com/Fi1osof/726cb632b4861c4df8aee00d7863559e
Как удалить modmonitor чтобы хвостов не оставалось???
Вот такие хвосты тянутся
Вот такие хвосты тянутся
(ERROR @ /home/--/public_html/core/xpdo/xpdo.class.php : 503) Path specified for package modmonitor is not a valid or accessible directory: /home/--/public_html/core/components/modmonitor/model/
(ERROR @ /home/--/public_html/core/xpdo/xpdo.class.php : 1247) Problem getting service modMonitor, instance of class modMonitor, from path /home/--/public_html/core/components/modmonitor/model/modmonitor/
(ERROR @ /home/--/public_html/core/xpdo/xpdo.class.php : 644) Could not load class: modMonitor from modmonitor.
Хочу предостеречь народ, чтобы не ставили эту приблуду на рабочий сайт. Лог забиваются мегабайтами ошибок во время работы и… после удаления.
… у меня почему нет такого?
Использую на рабочем сайте. Ошибок нет.
версия какая у вас (и MODX и modMonitor)
Использую на рабочем сайте. Ошибок нет.
версия какая у вас (и MODX и modMonitor)
кстати
Важно! Для работы компонента требуется компонент modxSite. Установить можно из официального репозитория. Ничего в сайт он не вносит, просто некоторые его процессоры используются модмонитором.modxSite — установлен?
У меня вопрос был про удаление компонента, а не про работу.
Соответственно modxSite мне тоже не нужен после удаления modMonitorа.
Соответственно modxSite мне тоже не нужен после удаления modMonitorа.
Проверьте системные настройки, найдите в Пакетах расширений такое: joxi.ru/12M1KMNhM1x7R2
Если есть, соответственно удалите и сбросьте кеш. Только не вообще все удалите оттуда (если там помимо монитора еще что-то есть), а только данные о нем.
P.S. Хочу предостеречь народ, чтобы не летали на самолетах. Опасное это дело. Надежней пешком.
А если серьезно, учту, что какие-то вещи не очевидны, и подправлю описание и сам компонент.
Если есть, соответственно удалите и сбросьте кеш. Только не вообще все удалите оттуда (если там помимо монитора еще что-то есть), а только данные о нем.
Хочу предостеречь народ, чтобы не ставили эту приблуду на рабочий сайт. Лог забиваются мегабайтами ошибок во время работы и… после удаления.Специально для этого были добавлены настройки, позволяющие исключать отслеживаемые контексты и выставлять минимальное время выполнения запроса, при превышении которого сохраняется информация в БД. При чем информация об ошибках будет сохраняться независимо от этого порога. Таким образом можно поставить порог секунд в 10, и все равно потом видеть ранее возникшие ошибки.
P.S. Хочу предостеречь народ, чтобы не летали на самолетах. Опасное это дело. Надежней пешком.
А если серьезно, учту, что какие-то вещи не очевидны, и подправлю описание и сам компонент.
Немного лучше стало, пропала 503 ошибка, но 644 и 1247 остались.
Вы перед этим MODX обновляли? Там такая фигня есть, что из настроек расширения загоняются в БД. Выполните в консоли $modx->removeCollection(«modExtensionPackage); и удалите после этого папку core/cache.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.