
Я пытаюсь заставить Nginx (работающий как контроллер входящего трафика Kubernetes) регистрировать данные в миллисекундах, а не в секундах. (Это необходимо для того, чтобы мы могли вводить данные в нашу существующую систему Elasticsearch, в которой уже есть другие системы, регистрирующие данные в миллисекундах)
Основываясь на этомСообщение блогаЯ попробовал следующее в контексте «http»:
map $host $request_time_ms {
default 'test';
}
log_by_lua_block {
ngx.var.request_time_ms = 'foo'
}
И затем в моей строке журнала:
'{...."duration_ms":"$request_time_ms",....}'
Однако зарегистрированное значение всегда является значением по умолчанию, test
а не ожидаемым значением foo
.
В конечном итоге должно получиться так:
ngx.var.request_time_ms = math.floor(tonumber(ngx.var.request_time) * 1000)
Но я просто пытаюсь сначала разобраться с базовой ситуацией.
Есть идеи, почему это не работает? Как будто log_by_lua_block
просто не работает.
решение1
Я не могу воспроизвести вашу ситуацию на своем сервере (нужно сказать, что я не использовал kubernetes или docker для тестов). Для меня эта конфигурация работает так, как и ожидалось. Похоже, что она log_by_lua_block
вообще не работает на вашем контроллере Ingress. Но вы можете использовать следующий обходной путь, чтобы получить время запроса в миллисекундах, а не в секундах:
map $request_time $request_time_ms {
~^0\.0*(\d+?)$ $1;
~(\d+)\.(\d+) $1$2;
}