Nginx berechnete Protokollvariablen mit Lua

Nginx berechnete Protokollvariablen mit Lua

Ich versuche, Nginx (das als Kubernetes-Ingress-Controller läuft) dazu zu bringen, in Millisekunden statt in Sekunden zu protokollieren. (Auf diese Weise können wir die Protokolle in unser vorhandenes Elasticsearch-System aufnehmen, in dem bereits andere Systeme in ms protokollieren.)

Basierend aufBlogeintragIch habe Folgendes im 'http'-Kontext versucht:

  map $host $request_time_ms {
    default 'test';
  }
  log_by_lua_block { 
    ngx.var.request_time_ms = 'foo'
  }

Und dann in meiner Protokollzeichenfolge:

 '{...."duration_ms":"$request_time_ms",....}'

Der protokollierte Wert ist jedoch immer der Standardwert und testnicht der erwartete Wert foo.

Letztendlich sollte es so aussehen:

ngx.var.request_time_ms = math.floor(tonumber(ngx.var.request_time) * 1000)

Aber ich versuche zunächst einmal, die Grundsituation zum Laufen zu bringen.

Irgendeine Idee, warum das nicht funktioniert? Es ist, als ob es log_by_lua_blockeinfach nicht läuft.

Antwort1

Ich kann Ihre Situation auf meinem eigenen Server nicht reproduzieren (muss sagen, dass ich weder Kubernetes noch Docker für Tests verwende). Für mich funktioniert diese Konfiguration wie erwartet. Es sieht wirklich so aus, als würde es log_by_lua_blockauf Ihrem Ingress-Controller überhaupt nicht laufen. Sie können jedoch den folgenden Workaround verwenden, um die Anforderungszeit in Millisekunden statt in Sekunden zu erhalten:

map $request_time $request_time_ms {
    ~^0\.0*(\d+?)$  $1;
    ~(\d+)\.(\d+)   $1$2;
}

verwandte Informationen