Этап конвейера ошибок 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.

Другие вопросы по тегам