@X92

Почему изменяются значения при передаче логов Nginx через Vector в Clickhouse?

Настраиваю связку для передачи access логов NGINX в Clickhouse при помощи Vector.
В NGINX сразу использую лог в формате JSON, Vector берет этот файл на вход, парсит JSON и отправляет в sink Clickhouse

При запуске Vector в консоли на выходе в своем логе он выплевывает корректную инфу по запросу, которая совпадает с логом NGINX

{"args":"","body_bytes_sent":"548","http_referer":"","http_user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36","http_x_forwarded_for":"","remote_addr":"37.252.90.111","remote_user":"","request_id":"e45499dd84d036eb3dbdf3bc2197105f","request_method":"GET","request_time":"0.000","request_uri":"/vector","scheme":"https",""server_protocol":"HTTP/1.1","size":0,"ssl_cipher":"TLS_AES_128_GCM_SHA256","ssl_protocol":"TLSv1.3","status":404,"time_iso8601":"2023-09-01T13:11:57+00:00","time_local":"01/Sep/2023:13:11:57 +0000","timestamp":"2023-09-01T13:12:02.401320582Z"}

При этом в Clickhouse в поля с временем и статусом записываются некорректные значения. 404 статус превращается в 148, при этом если запрос был 200, то прилетает также 200. Вместо даты timestamp = 0

request_id:           e45499dd84d036eb3dbdf3bc2197105f
remote_addr:          37.252.90.111
remote_user:
<b>datetime:             1970-01-01 01:00:00
</b>request:
request_uri:          /vector
args:
<b>status:               148
</b>body_bytes_sent:      548
http_referer:
http_user_agent:      Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
http_x_forwarded_for:
request_time:         0
ssl_protocol:         TLSv1.3
ssl_cipher:           TLS_AES_128_GCM_SHA256
scheme:               https
request_method:       GET
server_protocol:      HTTP/1.1


Конфиг Vector

[sources.track]
type = "file"
include = ["/var/log/nginx/access.json.log"]
read_from = "end"

[transforms.log_json]
type = "remap"
inputs = ["track"]
source = '''
. = parse_json!(.message)
.status = to_int!(.status)
.size = to_int!(.size)
'''

# Print parsed logs to stdout
[sinks.print]
type = "console"
inputs = ["log_json"]
encoding.codec = "json"

[sinks.clickhouse]
type = "clickhouse"
inputs = ["log_json"]
endpoint = "http://<IP>:8123"
database = "default"
table = "ii_access_log"
skip_unknown_fields = true
auth.strategy = "basic"
auth.user = "юзер"
auth.password = "пароль"


Собственно, почему наблюдаются проблемы с статусом и datetime?
Есть предположение, что нужно попробовать какую-то другую переменную для времени, типа сейчас прилетает пустой timestamp в clickhouse и он по умолчанию ставит unix timestamp 0, т.е. 1970-01-01 01:00:00. А вот со статусом вообще не понятно.

Также принимаются инструкции по поводу правильной настройки блока с учетными данными. Сейчас по http передаются логин и пароль в открытом виде, это тоже нужно исправить.
  • Вопрос задан
  • 72 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы