Логирование медленных запросов¶
Журнал медленных запросов (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. Для включения записи:
Задайте на нужном экземпляре технологическую роль slow_log.
Добавьте секцию
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
будет удалена.