syslog-ng / telegraf: EOF произошел во время простоя – несовместимо?
Это следующий вопрос из предыдущего вопроса , созданный потому, что я узнал больше информации, и было бы проще задать его как новый вопрос.
Я использую syslog-ng OSE v3.31.2 для получения сообщений системного журнала RFC3164 через UDP-порт 514 от группы клиентов, записываю их как в файл, так и пересылаю их в телеграф через TCP-порт 601 без TLS RFC5424 для вставки в База данных InfluxDB.
Моя конфигурация syslog-ng:
@version: 3.29
@include "scl.conf"
options {
flush-lines(1);
};
source s_network {
udp(ip(0.0.0.0) port(514));
};
destination d_file {
file("/var/log/messages");
};
destination d_telegraf {
syslog("telegraf" port(601) transport(tcp));
};
log {
source(s_network);
destination(d_telegraf);
destination(d_file);
};
Соответствующая часть моей конфигурации телеграфа выглядит следующим образом:
[global_tags]
[agent]
interval = "100ms"
round_interval = true
metric_buffer_limit = 10000
flush_buffer_when_full = true
collection_jitter = "0s"
flush_interval = "100ms"
flush_jitter = "0s"
debug = true
quiet = false
[[outputs.influxdb]]
urls = ["http://influxdb:8086"]
database = "logs_db"
[[inputs.syslog]]
server = "tcp://telegraf:601"
По сути, syslog-ng настроен для пересылки записей системного журнала через TCP-соединение в telegraf.
Проблема в том, что я вижу, что syslog-ng часто отключает TCP от Telegraf. Они отображаются в журнале syslog-ng как:
[2021-11-17T02:55:32.662972] EOF occurred while idle; fd='12'
[2021-11-17T02:55:32.663102] Syslog connection closed; fd='12', server='AF_INET(192.168.0.6:601)', time_reopen='60'
[2021-11-17T02:56:32.719139] Syslog connection established; fd='12', server='AF_INET(192.168.0.6:601)', local='AF_INET(0.0.0.0:0)'
Это отключение обычно происходит, когда я отправляю журнал в syslog-ng с помощью:
logger -i -d --server localhost test
Но если я просто оставлю все это без дела, я также получу:
[2021-11-17T02:57:05.392356] EOF on control channel, closing connection;
В этих случаях 192.168.0.6 является сервером телеграфа.
Хотя я могу установить опциюtime-reopen(1)
Чтобы ускорить повторное подключение, я бы предпочел найти основную причину и в первую очередь предотвратить отключение.
Возможно ли, что существует несовместимость между syslog-ng и telegraf, которая вызывает этот EOF и нечистое отключение?
Все это выполняется в стеке docker-compose на одном хосте.
РЕДАКТИРОВАТЬ: я начал изучать RFC5424 и RFC6587. Используя Wireshark для обнаружения пакетов из syslog-ng, предназначенных для Telegraf, я определил, что они используют вставку октетов (так называемое непрозрачное кадрирование), а не подсчет октетов, который Telegraf ожидает по умолчанию. Полезная нагрузка каждого сообщения системного журнала для telegraf начинается с символа «<», а не с целого числа.
Я предполагаю, что telegraf принимает эти сообщения, но застревает при их анализе и, следовательно, закрывает соединение. Первый FIN, закрывающий соединение, поступает от Telegraf.
К сожалению, когда я настроил телеграф на прием непрозрачного кадра, он отклоняет всю запись, и я еще не понял, почему.
Я также еще не понял, как настроить syslog-ng для вывода сообщений с кадрированием с подсчетом октетов.
Но, по крайней мере, сообщение EOF и отключение перестали происходить. Но я не уверен, что это имеет большое значение, если Telegraf полностью отвергает все сообщения.
1 ответ
Я определил, что syslog-ng отправляет в телеграф сообщения в рамках подсчета октетов.
Причина этой проблемы заключается в том, что Telegraf отключает TCP-соединение от syslog-ng через 5 секунд, не получая сообщения. Это противоречит документации, прилагаемой к плагину системного журнала telegraf, в которой говорится, что этот тайм-аут применяется только ко времени получения одного сообщения, а не ко времени между сообщениями. Хотя это может быть проблема с английским языком/интерпретацией. Параметрread_timeout
к0
в конфигурации телеграфа достаточно, чтобы телеграф не отключался.