Как отслеживать, что скрипт работает и не "упал" ?

Поддержка
  • @kuzkuz said in Как отслеживать, что скрипт работает и не "упал" ?:

    Да, цель именно такая.
    Я предположил, что можно раз в 30 минут заставить софт открывать некую ссылку (телеграмм) благодаря которой в ТГ будет приходить уведомление типа "работаю".

    В итоге вы получите кучу спам сообщений от бота с текстом "работаю", вместо того, что бы в случае проблемы получить уведомление именно о проблеме

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

    Модуль появился в официальной сборке очень-очень давно, задолго до 23 версии BAS.

  • @Fox said in Как отслеживать, что скрипт работает и не "упал" ?:

    В итоге вы получите кучу спам сообщений от бота с текстом "работаю", вместо того, что бы в случае проблемы получить уведомление именно о проблеме

    Хм, понял. Слабо пока представляю логику , как реализовать уведомление именно при "вылете".

  • @Fox said in Как отслеживать, что скрипт работает и не "упал" ?:

    Всё решается просто через гугл таблицы. В них можно написать скрипт в "App script" для приёма данных (заполнения таблицы), для проверки данных и отправки данных в телеграм бота (да-да, гугл таблица может фоном отправлять get-запросы). В "App script" можно создать тригер по времени, который запускает функцию проверки данных в таблице (например раз в минуту или раз в пол часа). Если непонятно, но интересно, могу расписать пошагово

    Ясно! Есть тригер по времени. Если пол часа в таблице "0" , например, то срабатывает тригер.

  • Для начала нужен гугл аккаунт, авторизируемся, переходим в гугл таблицы https://docs.google.com/spreadsheets и создаём новую таблицу

    9343344c-69b8-4b66-b459-5de5489a4270-изображение.png


    Далее заходим в меню "расширения" -> "Apps script"

    82e2aa80-bff8-4905-aefc-0c4e35b05891-изображение.png


    В нём пишем функцию заполнения данных из скрипта BAS через get-запрос. Отправлять мы будем номер строки для записи данных и сами данные:

    function doGet(e) {
      var rowNumber = e.parameter.rowNumber;
      var data = e.parameter.data;
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    
      sheet.getRange(rowNumber, 1).setValue(new Date().getTime());
      sheet.getRange(rowNumber, 2).setValue(data);
    
      return ContentService.createTextOutput("Your advertisement could be here :)");
    }
    

    Благодаря этому скрипту данные будут заполнятся в таблице в таком виде:

    7727b75c-edc2-4a41-be42-e63e3c78b8ae-изображение.png


    Что бы проверить, что всё работает как надо, нужно сохранить скрипт

    25018afe-e3f9-4b21-8c11-a06a293effdf-изображение.png


    Затем нужно развернуть приложение "Начать развёртывание" -> "Новое развёртывание":

    b1e261d4-e120-4537-9bbd-344b291e7ad2-изображение.png


    В описании укажите хотя бы цирфу, что бы потом не запутаться. В поле "запуск от имени" нужно указать "От моего имени" что бы данные в таблицу можно было добавлять без авторизации в гугле через get-запросы из BAS. В поле "У кого есть доступ" указать нужно "Все" тоже для того, что бы не авторизовываться в гугле при добавлении данных в таблицу

    a59e2256-3c15-47c8-9240-52cb28b3a2ab-изображение.png


    Затем нужно нажать "Начать развёртывание" и в появившемся окне скопировать ссылку на веб-приложение и нажать кнопку "Готово"

    6dfc8e57-af88-467b-95c5-2338f675352c-изображение.png


    Сохранённая ссылка будет подобного вида:

    https://script.google.com/macros/s/AKfyмногобукавOia06eA/exec
    

    Пробуем передать данные. Для этого к ссылке нужно добавить параметры "rowNumber" и "data"

    https://script.google.com/macros/s/AKfyмногобукавOia06eA/exec?rowNumber=1&data=potok_1
    

    Заходим в BAS и создаём get-запрос с этой ссылкой. После выполнения проверяем добавились ли данные в таблицу:

    78223200-8320-4a3f-a724-3fa2b1c21543-изображение.png


    Убедившись, что всё хорошо продолжаем работу. Теперь нам нужно создать функцию отправки сообщения в телеграмм. Для этого нужно создать бота телеграмм и получить id чата. Расписывать подробно не буду, проще прочитать здесь https://habr.com/ru/articles/306222/

    Добавляем в наш скрипт в "Apps script" функцию отправки:

    function sendTelegramMessage(messageText) {
      var telegramToken = "BOT_TOKEN";
      var chatId = "CHAT_ID";
      var url = "https://api.telegram.org/bot" + telegramToken + "/sendMessage?chat_id=" + chatId + "&text=" + encodeURIComponent(messageText);
      var response = UrlFetchApp.fetch(url);
    }
    

    Для проверки добавляем чуть ниже вызов функции:

    sendTelegramMessage("hello")
    

    выбираем функцию "sendTelegramMessage" и нажимаем кнопку "Выполнить". В итоге вам в тг от бота должно придти сообщение "hello".


    Если всё хорошо, удаляем из кода строку sendTelegramMessage("hello") и приступаем к написанию функции проверки данных.

    function checkForData() {
      var minutesCheck = 5 //количество минут прошедших с последнего обновления данных, для регистрации проблемы
    
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      var dataRange = sheet.getDataRange();
      var data = dataRange.getValues();
      var currentTime = new Date().getTime();
      var resultArray = [];
      for (var i = 0; i < data.length; i++) {
        var timestamp = data[i][0];
        var timeDifference = (currentTime - timestamp) / (1000 * 60);
        if (timeDifference > minutesCheck) {
          resultArray.push(data[i][1]); 
        }
      }
      if(resultArray.length > 0) {
        sendTelegramMessage("Проблема с потоками:\n" + resultArray.join('\n'))
      }
    }
    

    Функция проверяет столбец "A" с записанным временем и сверяет, прошло ли с того времени 5 минут, если прошло, то функция берёт данные с этой строки из столбца "B" и отправляет в тг


    Для проверки выбираем функцию "checkForData" и жмём кнопку "Выполнить". В итоге вам в тг от бота должно придти сообщение

    изображение.png


    Если всё хорошо, можно приступить к установке тригера по времени. Для этого нужно нажать на значок с часами на левой панели "Apps scripts"

    изображение.png


    Справа внизу будет кнопка "Добавить триггер"

    изображение.png


    Функцию нужно выбрать "checkForData". Развёртывание лучше указать "Основное развёртывание". Тип триггера указать "по минутам" и промежуток указать "раз в минуту" (ну или по больше, если не так важно)

    28695c22-7f86-4627-8967-4227eaaacf97-изображение.png


    Нажимаем кнопку "Сохранить" и в списке триггеров должен появится только что созданный триггер:

    ccebc94c-727f-431e-8063-66d0e94bbf15-изображение.png


    В конце нужно сделать снова новое развёртывание и получить ссылку. Разворачивать кстати придётся при каждом изменении скрипта в будущем.

    Приступаем к проверке работы всей системы. Создаём скрипт BAS на 10 потоков, в которых каждый поток узнаёт свой номер и отправляет его в качестве номера строки в таблице и данных. Для корректной передачи данных для параметра "data" нужно использовать действие "Url компонент кодировать/декодировать", а номер потока можно передавать просто цифрой:

    df0e7de3-7c70-4ff5-8b41-e9d0de16c408-изображение.png


    Данные в таблице будут в таком виде:

    8ba09cee-b753-4cf3-bd0d-50cb9947176f-изображение.png


    Всё. Если остановить скрипт, то через минуту придёт сообщение в тг:

    92819650-8361-4b7c-9cb1-0ed6944220be-изображение.png


    Сообщение об ошибках будет приходить в тг каждую минуту, потому что в настройках триггера было установлено частота выполнения "раз в минуту"

  • Я показал только самые основы, можно как угодно изменять, улучшать и усложнять скрипты на любых этапах (передавать данные в json, добавлять стили, цвета, кнопки управления в таблицу или тг чат и т.д.)

  • Решение твоей проблемы зовут zabbix, там без танца бубном (гугл таблицы) все это можно сделать

  • @Fox said in Как отслеживать, что скрипт работает и не "упал" ?:

    Я показал только самые основы, можно как угодно изменять, улучшать и усложнять скрипты на любых этапах (передавать данные в json, добавлять стили, цвета, кнопки управления в таблицу или тг чат и т.д.)

    Охренеть крутотень!
    Но вот теперь задумался, не проще ли на своем сайте сделать страницу, куда поток будет вносить в куки значение "1" если работает, на пол часа.
    Как только 30 минут значение не заносится, оно обнуляется. Время от времени я просто буду в телефоне обновлять страничку... Вижу "0" - упал софт.

    зs мне прям онлайн видеть что софт упал не нужно... Просто задача избежать того что он лежит часами напролет.

  • @kuzkuz said in Как отслеживать, что скрипт работает и не "упал" ?:

    @Fox said in Как отслеживать, что скрипт работает и не "упал" ?:

    Я показал только самые основы, можно как угодно изменять, улучшать и усложнять скрипты на любых этапах (передавать данные в json, добавлять стили, цвета, кнопки управления в таблицу или тг чат и т.д.)

    Охренеть крутотень!
    Но вот теперь задумался, не проще ли на своем сайте сделать страницу, куда поток будет вносить в куки значение "1" если работает, на пол часа.
    Как только 30 минут значение не заносится, оно обнуляется. Время от времени я просто буду в телефоне обновлять страничку... Вижу "0" - упал софт.

    зs мне прям онлайн видеть что софт упал не нужно... Просто задача избежать того что он лежит часами напролет.

    Если есть свой сервер, это в разы будет проще. Поднимите веб сервер на сервере, расшартье внешний ip для получения данных из скрипта BAS (отправлять http-запросы можно прямо на ip сервера). А внутри уже реализуйте какую угодно логику проверки и уведомления (тг, ватсап, вк, почта).
    Либо поднимите удалённую базу и формируйте данные в ней, вместо веба. Вариантов тьма, отталкиваться нужно от доступных инструментов.

  • @Fox пост, достойный быть в вики :)
    Но выше правильная мысль прозвучала - очень не хватает функции онАппликейшнЭнд как минимум. А так же onThreadEnd. Сразу сообщение в телегу бы прилетало. Комп и интернет можно и так остлеживать.

  • @mnail84 said in Как отслеживать, что скрипт работает и не "упал" ?:

    @Fox пост, достойный быть в вики :)

    Спасибо. Гугл таблицы достаточно мощный, не очень сложный, универсальный и бесплатный инструмент, по этому он мне и понравился.

    Но выше правильная мысль прозвучала - очень не хватает функции онАппликейшнЭнд как минимум. А так же onThreadEnd. Сразу сообщение в телегу бы прилетало. Комп и интернет можно и так остлеживать.

    Функции "онАппликейшнЭнд" и "onThreadEnd" находятся в списке желаемого (отдельное репо, где я собираю предложения пользователей по развитию BAS). Сейчас же "онАппликейшнЭнд" можно реализовать через действие "Вызов функции в несколько потоков", а "onThreadEnd" через игнорирование ошибок вызова функции.

  • @Fox said in Как отслеживать, что скрипт работает и не "упал" ?:

    Сейчас же "онАппликейшнЭнд" можно реализовать через действие "Вызов функции в несколько потоков",

    то есть по сути не пользоваться потоками баса, а самому их сделать через это действие, я правильно понял?

    В общем, пока костылями подпереть и ждать функционала :)

  • @mnail84 said in Как отслеживать, что скрипт работает и не "упал" ?:

    Сейчас же "онАппликейшнЭнд" можно реализовать через действие "Вызов функции в несколько потоков",

    то есть по сути не пользоваться потоками баса, а самому их сделать через это действие, я правильно понял?

    В общем, пока костылями подпереть и ждать функционала :)

    Обсуждали много раз, называть можно как хочешь, смысл в том, что бы все действия из функции Main переместить в любую другую, которую вызывать через действие "Вызов функции в несколько потоков". BAS вызывать в один поток, а количество потоков установить в действие. В итоге действия помещённые перед действием "Вызов функции в несколько потоков" будут выполнятся перед началом работы, а действия после "Вызов функции в несколько потоков" будут выполняться соотвественно после работы (читай "OnApplicationStart" и "OnApplicationEnd")

  • This post is deleted!