Логирование медленных запросов | Tdb

Версия:

latest

Логирование медленных запросов

Журнал медленных запросов (slow log) – это запись таких iproto-запросов к базе данных, время выполнения которых превышает заданное пороговое значение. Для логирования таких запросов используется модуль slow_log. В Tarantool DB модуль доступен в виде технологической роли slow_log.

В этом руководстве описано, как включить и настроить логирование медленных запросов, а также приведен пример приложения, в котором логирование настроено для функции и CRUD-запросов.

Примечание

Модуль slow_log может быть ресурсоемким и снижать производительность. Чтобы оценить потенциальное влияние на нее, перед включением модуля проведите нагрузочное тестирование. Результаты работы модуля не могут быть использованы для измерения производительности.

Руководство включает следующие шаги:

Пререквизиты

Для выполнения примера требуются:

  • установленный Docker-образ Tarantool DB;

  • приложение Docker compose;

  • утилита TT CLI;

  • исходные файлы примера slow_log.

    Примечание

    Есть два способа получить исходные файлы примера:

    • Архив с полной документацией Tarantool DB, полученный по почте или скачанный в личном кабинете tarantool.io. Пример архива: tarantooldb-documentation-0.8.0.tar.gz. Пример slow_log расположен в таком архиве в директории ./doc/examples/slow_log/.

    • Отдельный архив slow_log.tar.gz, скачанный c сайта Tarantool.

Конфигурация модуля slow_log

Включение журнала медленных запросов

По умолчанию, запись медленных запросов в журнал отключена. Включить логирование медленных запросов можно с помощью опции slow_log.enable. Для включения записи:

  1. Задайте на нужном экземпляре технологическую роль slow_log.

  2. Добавьте секцию slow_log в файл конфигурации (config.yaml):

    slow_log:
      enable: true
    

По умолчанию запись будет включена для запросов через модуль CRUD.

Установка порогового значения

Задать пороговое значение для времени выполнения запроса можно с помощью опции slow_log.threshold. При превышении этого значения запрос будет записан в журнал:

slow_log:
  enable: true
  threshold: 0.01

По умолчанию, значение threshold равно 0.5.

Добавление функции для логирования

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

  • функций из модуля app (функции из _G['app']);

  • для персистентных функций с префиксом app..

slow_log:
  enable: true
  threshold: 0.01
  namespaces:
    - "app"

Полное описание опций конфигурации slow_log приведено в Справочнике по конфигурации.

Запуск стенда и подключение к узлу

Перейдите в директорию примера slow_log:

cd ./doc/examples/slow_log/

Запустите стенд Tarantool DB:

docker compose up -d`.

Команда поднимает кластер с двумя хранилищами и одним роутером. Роль slow_log задана на роутере.

Чтобы гарантированно получить сообщение в логе, задайте для опции slow_log.threshold значение 0 в конфигурационном файле:

threshold: 0

Подключитесь к роутеру с помощью команды tt connect:

tt connect admin:secret-cluster-cookie@localhost:3300

Команда открывает интерактивную консоль Tarantool, позволяющую работать с базой данных.

Запись CRUD-запросов в журнал

В примере данные хранятся в спейсе data со следующим форматом:

box.schema.space.create('data', {if_not_exists = true})
box.space.data:format({
    { name = 'id', type = 'number' },
    { name = 'bucket_id', type = 'unsigned' },
    { name = 'data', type = 'any' },
})

Добавьте кортеж в спейс data, используя функцию из модуля CRUD:

require('crud').replace("data", {1, box.NULL, {}})

После просмотрите логи приложения:

docker compose logs | grep 'Function call crud'

Запись в логе может выглядеть так:

slow_log-tarantool-router-1    | 2023-11-30 14:02:35.599 [12] main/176/main/tarantooldb.app.roles.slow_log I> Function call crud.replace(["data",[1,null,[]]]) was too long: 0.011s

Логирование пользовательской функции

В примере создана персистентная функция app.wait_for, которая ждет заданное количество секунд:

box.schema.func.create('app.wait_for',  {
    language = 'LUA',
    if_not_exists = true,
    body = [[
        function(sleep_time)
            local log = require('log')
            local fiber = require('fiber')
            log.info("start wait_for " .. sleep_time)
            fiber.sleep(sleep_time)
            log.info("stop wait_for " .. sleep_time)
        end
    ]],
})

Чтобы включить запись в журнал для функции app.wait_for, обновите секцию slow_log в файле конфигурации:

enable: true
threshold: 3
namespaces:
- app

Далее подключитесь к роутеру с помощью утилиты tt:

tt connect admin:secret-cluster-cookie@localhost:3300

Вызовите функцию app.wait_for, задав для нее значение в 3 секунды:

box.schema.func.call('app.wait_for', 3)

После просмотрите логи приложения:

docker compose logs | grep wait_for

Запись в логе может выглядеть так:

slow_log-tarantool-router-1    | 2023-11-30 14:13:52.738 [12] main/225/main/tarantool I> start wait_for 3
slow_log-tarantool-router-1    | 2023-11-30 14:13:55.740 [12] main/225/main/tarantool I> stop wait_for 3
slow_log-tarantool-router-1    | 2023-11-30 14:13:55.740 [12] main/225/main/tarantooldb.app.roles.slow_log I> Function call app.wait_for([3]) was too long: 3.002s

При использовании модуля персистентные функции заменяются на версии с логированием времени выполнения, оригинальные функции сохраняются с префиксом __slow_log_orig_. Для функции app.wait_for будет создана функция __slow_log_orig_app.wait_for. После отключения модуля __slow_log_orig_app.wait_for будет удалена.

Остановка стенда

Чтобы остановить стенд, выполните следующую команду:

docker compose down
Нашли ответ на свой вопрос?
Обратная связь