Этап конвейера ошибок Promtail должен содержать только один ключ
При попытке настроить Promtail я получаю следующую ошибку:
level= error ts =2020-11-27T06:10:30.310583Z caller=main.go:104 msg= "ошибка создания подсказки" error="не удалось создать целевой диспетчер файлов: этап конвейера должен содержать только один ключ"
Я запускаю следующее из командной строки.
promtail-windows-amd64.exe --config.file=.. / conf / promtail-local-config.yml
Мои строки журнала выглядят так:
13:21:03.183 - ИНФОРМАЦИЯ - документ от 127.0.0.1 успешно получен. Сохраняется как 'c:\test\test_file.txt' за 102 мс от адреса '/127.0.0.1'
13:21:05.275 - ПРЕДУПРЕЖДЕНИЕ - Не удалось получить документ от 127.0.0.1. Ошибка при создании файла c:\test\error_file.txt'
Мой конфиг выглядит следующим образом:
scrape_configs:
- job_name: promtailTest
pipeline_stages:
- match:
selector: '{job="promtailTest"}'
stages:
- regex:
expression: '^(?P<timestamp>\\d{2}:\\d{2}:\\d{2}\\.\\d{3})\\s\\-\\s(?P<logLevel>[A-Z]{4,5})\\s\\-\\s(?P<logMessage>.*)$'
- labels:
logLevel:
static_configs:
- targets:
- localhost
labels:
job: promtailTest
app: promtailTest
host: LOCAL
__path__: C:/test/logs/*log
Когда я вынимаю раздел pipeline_stages:, я вижу линии в графане, но не могу заставить работать регулярное выражение. Я действительно хочу добавить метку для уровня ведения журнала (чтобы я мог подсчитать ошибки)
2 ответа
БАХ!! Я дурак. Думаю, проблема была в моем формате (YAML может быть настоящим PITA!!!)
Моя новая конфигурация теперь выглядит так, и она работает.
scrape_configs:
- job_name: promtailTest
static_configs:
- targets:
- localhost
labels:
job: promtailTest
app: promtailTest
host: APOLLO99
__path__: D:/SXI/XPress/Dispatch/logs/*log
pipeline_stages:
- match:
selector: '{job="promtailTest"}'
stages:
- regex:
expression: "^^(?P<myTime>\\d{2}:\\d{2}:\\d{2}\\.\\d{3})\\s\\-\\s(?P<logLevel>[A-Z]{4,5})\\s\\-\\s(?P<logMessage>.*)$$"
- labels:
logLevel:
Я боролся с этой ошибкой, и даже если принятый ответ верен, мне не было ясно, в чем заключалась ошибка.
Как многие уже говорили, проблема в отступах и в том, что YAML довольно сбивает с толку.
Если вы сравните YAML в вопросе и YAML в ответе, вы увидите, что все, что находится под- match:
в правильном ответе отделяется двумя лишними пробелами. То же самое происходит со строками после- regex:
и- labels
. Эти два дополнительных пространства важны, потому что в противном случае они были бы на одном уровне (а они должны быть одно внутри другого).
Все становится ясно, если преобразовать его в JSON.
Это YAML вопроса, преобразованный в JSON:
{
"pipeline_stages": [
{
"match": null,
"selector": "{job=\"promtailTest\"}",
"stages": [
{
"regex": null,
"expression": "^(?P<timestamp>\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d{3})\\\\s\\\\-\\\\s(?P<logLevel>[A-Z]{4,5})\\\\s\\\\-\\\\s(?P<logMessage>.*)$"
},
{
"labels": null,
"logLevel": null
}
]
}
]
}
Как видите, это массив, в котором первый элемент имеет 3 ключа (на одном уровне): , и . Promtail ожидает здесь только 1 ключ (), и именно поэтому он говорит, что «этап конвейера должен содержать только один ключ».
Это правильный ответ, преобразованный в JSON:
{
"pipeline_stages": [
{
"match": {
"selector": "{job=\"promtailTest\"}",
"stages": [
{
"regex": {
"expression": "^^(?P<myTime>\\d{2}:\\d{2}:\\d{2}\\.\\d{3})\\s\\-\\s(?P<logLevel>[A-Z]{4,5})\\s\\-\\s(?P<logMessage>.*)$$"
}
},
{
"labels": {
"logLevel": null
}
}
]
}
}
]
}
Сейчасpipeline_stages
также является массивом, но первый элемент имеет только один ключ, как и ожидает Promtail. Сейчасselector
иstages
находятся внутриmatch
.