Nginx вычисляет переменные журнала с помощью lua

Nginx вычисляет переменные журнала с помощью lua

Я пытаюсь заставить 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;
}

Связанный контент