#spring #elasticsearch #openshift #fluentd
#spring #elasticsearch #openshift #fluentd
Вопрос:
Использование:
- fluentd 1.11.2
- fluent-plugin-elasticsearch 4.1.3
- elasticsearch 7.5.1
- springboot 2.3.3
Работает в Openshift (Kubernetes v1.17.1 20ba474).
И Fluentd, и Elasticsearch выполняются в разных модулях.
Файл конфигурации Fluentd:
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<filter *.**>
@type parser
key_name log
reserve_data true
<parse>
@type none
</parse>
</filter>
<match *.**>
@type copy
<store>
@type elasticsearch
host elasticdb
port 9200
logstash_format true
logstash_prefix applogs
logstash_dateformat %Y%m%d
include_tag_key true
type_name app_log
tag_key @log_name
flush_interval 1s
user elastic
password changeme
</store>
<store>
@type stdout
</store>
</match>
Из локальной службы springboot я отправляю в fluentd некоторые фиктивные данные:
// Local port 24224 is being forwarded to remote 24224 via oc port-forward command
private static FluentLogger LOG = FluentLogger.getLogger("app", "127.0.0.1", 24224);
Map<String, Object> data = new HashMap<String, Object>();
data.put("from", "userA");
data.put("to", "userB");
LOG.log("app", data);
который отправляет этот фрагмент данных JSON:
{"from":"userA","to":"userB"}
По-видимому, он работает только один раз из десяти. Или, кажется, работает два или три раза, а затем прерывается, пока я не изменю индекс. На самом деле, не ясен шаблон поведения.
Когда это не работает (в большинстве случаев), это журналы в модуле fluentd:
2020-09-18 17:33:08.000000000 0000 app.appaa: {"from":"userA","to":"userB"}
2020-09-18 17:33:37 0000 [warn]: #0 dump an error event: error_class=ArgumentError error="log does not exist" location=nil tag="fluent.warn" time=2020-09-18 17:33:37.328180192 0000 record={"error"=>"#<ArgumentError: log does not exist>", "location"=>nil, "tag"=>"app.appaa", "time"=>1600450388, "record"=>{"from"=>"userA", "to"=>"userB"}, "message"=>"dump an error event: error_class=ArgumentError error="log does not exist" location=nil tag="app.appaa" time=1600450388 record={"from"=>"userAa", "to"=>"userBb"}"}
2020-09-18 17:33:37.328180192 0000 fluent.warn: {"error":"#<ArgumentError: log does not exist>","location":null,"tag":"app.appaa","time":1600450388,"record":{"from":"userA","to":"userB"},"message":"dump an error event: error_class=ArgumentError error="log does not exist" location=nil tag="app.appaa" time=1600450388 record={"from"=>"userA", "to"=>"userB"}"}
warning: 299 Elasticsearch-7.5.1-3ae9ac9a93c95bd0cdc054951cf95d88e1e18d96 "[types removal] Specifying types in bulk requests is deprecated."
Хотя модуль Elasticsearch ничего не показывает (я думаю, это вопрос уровня ведения журнала), если я перейду к Elastic, я увижу это:
{
"_index": "applogs-20200918",
"_type": "_doc",
"_id": "F0M2onQBB89nIri4Cb1Z",
"_score": 1.0,
"_source": {
"error": "#<ArgumentError: log does not exist>",
"location": null,
"tag": "app.app",
"time": 1600449251,
"record": {
"from": "userA",
"to": "userB"
},
"message": "dump an error event: error_class=ArgumentError error="log does not exist" location=nil tag="app.app" time=1600449251 record={"from"=>"userA", "to"=>"userB"}",
"@timestamp": "2020-09-18T17:14:39.775332214 00:00",
"@log_name": "fluent.warn"
}
}
Похоже, ошибка возникает из
«Ошибка эластичного аргумента: журнал не существует»
Кто-нибудь сталкивался с этой ошибкой раньше?
Комментарии:
1. Вы проверяли это с
fluent-cat
помощью command?2. Спасибо за ваш комментарий. Нет, у меня нет. Считаете ли вы, что это будет иметь какое-либо значение? Среди всех попыток, которые я делаю, я атакую fluentd как из локальной службы, так и из той же службы, запущенной в отдельном модуле OCP. Поскольку я использую Windows10, я не очень уверен в установке fluent agent. Но если вы считаете, что это будет иметь значение, я попробую. Еще раз спасибо.
3. Добро пожаловать! Это изолирует пипллайн fluentd и elasticsearch. Вы можете протестировать его с того же компьютера, на котором запущен fluentd.
fluent-cat
уже должно быть там. Вам не нужно устанавливать его отдельно на другой компьютер. Это помогло бы проверить, имеет ли клиентская служба какое-либо отношение к этому или нет; и конвейер работает.4. Правильно.
key_name log
. Вы можете попробоватьecho '{"log":"hello"}' | fluent-cat debug.log
?5. Потрясающе! Да, вы должны обратиться к документации для настройки. И я бы всегда использовал
fluent-cat
first для тестирования вещей изолированно. Рад, что это помогло. 🙂
Ответ №1:
Конфигурация анализатора в фильтре, т.е.
<filter *.**>
@type parser
key_name log # << Look for key `log` in event
# ...
</filter>
ищет ключ log
, которого не существует в этом событии:
{"from":"userA","to":"userB"}
Вам нужно использовать что-то вроде этого:
{"log":"... your log here..."}
Возможно, вам потребуется выполнить экранирование "
там, если вы используете цитаты.
Соответствующая документация: https://docs .fluentd.org/filter/parser#key_name