logstash-input-heroku работает как служба в Ubuntu (logstash 5.2.1)

Я пытаюсь запустить logstash на экземпляре aws ec2 с Ubuntu 16.04, используя systemd. Я установил на машину инструментальный пояс heroku. Запуск конвейера в обычном режиме (через bin/logstash.bat) работает нормально, и события принимаются (однако через несколько минут появляется ошибка «Время ожидания запроса истекло», и конвейер останавливается, что является отдельным вопросом).

Но когда я пытаюсь запустить службу в systemd, я получаю ошибки, не уверен, что эти два типа ошибок связаны. Первая ошибка SSL:

Ошибка: нет соответствия шифру (OpenSSL::SSL::SSLError)

[2017-02-15T13:08:44,037][ОШИБКА][logstash.pipeline ] В плагине произошла неисправимая ошибка. Перезапустит этот плагин. Плагин: "xxxxxx", codec=>"^%{TIMESTAMP_ISO8601} %{WORD}\[\w+(\.\d+)?\]:(\s{3,}| \})", what=>" предыдущая", id=>"032c3b317ae49982945ec7e8fbf11224be98f237-3", enable_metric=>true, negate=>false, charset=>"UTF-8", multiline_tag=>"multiline", max_lines=>500, max_bytes=>10485760>, id =>"032c3b317ae49982945ec7e8fbf11224be98f237-4", enable_metric=>true>

Во-вторых, инструментарий heroku, кажется, запрашивает учетные данные:

15 февраля, 13:08:43 ip-10-0-1-216 logstash[4402]: введите свои учетные данные Heroku.

15 февраля 13:08:43 ip-10-0-1-216 logstash[4402]: Электронная почта: Пароль (ввод будет скрыт):

Моя конфигурация logstash:

input {
    heroku {
        app => "xxx-1"
        codec => multiline {
            pattern => "^%{TIMESTAMP_ISO8601} %{WORD}\[\w+(\.\d+)?\]:(\s{3,}| \})"
            what => "previous"
        }
    }
    heroku {
        app => "xxx-2"
        codec => multiline {
            pattern => "^%{TIMESTAMP_ISO8601} %{WORD}\[\w+(\.\d+)?\]:(\s{3,}| \})"
            what => "previous"
        }
    }
    heroku {
        app => "xxx-3"
        codec => multiline {
            pattern => "^%{TIMESTAMP_ISO8601} %{WORD}\[\w+(\.\d+)?\]:(\s{3,}| \})"
            what => "previous"
        }
    }
    heroku {
        app => "xxx-4"
        codec => multiline {
            pattern => "^%{TIMESTAMP_ISO8601} %{WORD}\[\w+(\.\d+)?\]:(\s{3,}| \})"
            what => "previous"
        }
    }
}

filter {
  grok {
    break_on_match => true
    patterns_dir => ["./grok_patterns"]
    match => { "message" => [
        "^%{TIMESTAMP_ISO8601:timestamp} %{WORD:heroku_source}\[%{DYNO:dyno}\]: %{LEVEL:level}: HTTP %{OPT_NOT_SPACE_COMMA:organization}, %{OPT_NOT_COMMA:user}, %{OPT_NOT_COMMA:device}, %{WORD:method} %{ENDPOINT:endpoint}%{QUERY:query} \[%{INT:responseCode:int}\].*? \(p%{INT:nodeProcess:int}\) \(%{INT:responseTime:int}ms\).*$",
        "^%{TIMESTAMP_ISO8601:timestamp} %{WORD:heroku}\[%{WORD:component}\]: at=\w+ method=%{WORD:method} path=\"%{ENDPOINT:endpoint}\??%{QUERY:query}\" .*?fwd=\"%{IP:site_ip}\" dyno=%{DYNO:dyno} .*?service=%{INT:responseTime:int}ms status=%{INT:responseCode:int} bytes=%{INT:sizeBytes:int}.*?$",
        "^%{TIMESTAMP_ISO8601:timestamp} %{WORD:heroku_source}\[%{DYNO:dyno}\]: (?<data>.*)"
    ] }
    add_field => { "endpoint_template" => "%{endpoint}" }
  }
  mutate {
    gsub => ["endpoint_template", "[0-9a-f]{24}", "ID"]
    add_field => { "type" => "heroku" }
  }
  if ![heroku_source] {
    geoip {
        source => "site_ip"
    }
    mutate {
        add_field => { "heroku_source" => "heroku" }
    }
  }
}

output {
    elasticsearch {
        hosts => [ "aws-es-endpoint:443" ]
        ssl => true        
    }
}

(Я уверен, что это может быть улучшено)

Я попытался запустить службу как root, но результат тот же. Просто чтобы уточнить, это работает:

/usr/share/logstash/bin/logstash --path.settings /etc/logstash/

Пока это не так:

sudo systemctl start logstash

Это чистая установка logstash 5.2.1 после процедур на эластичный. Systemd также запускается в соответствии с своими процедурами, поэтому что он выполняет ту же команду, которую я выполняю вручную. cat logstash.service вывод:

[Unit]
Description=logstash

[Service]
Type=simple
User=logstash
Group=logstash
# Load env vars from /etc/default/ and /etc/sysconfig/ if they exist.
# Prefixing the path with '-' makes it try to load, but if the file doesn't
# exist, it continues onward.
EnvironmentFile=-/etc/default/logstash
EnvironmentFile=-/etc/sysconfig/logstash
ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash"
Restart=always
WorkingDirectory=/
Nice=19
LimitNOFILE=16384

[Install]
WantedBy=multi-user.target

(результат тот же, когда я комментирую пользователя и группу выше)


person joniba    schedule 15.02.2017    source источник


Ответы (1)


Просто для протокола: оказывается, проблема заключалась в том, что systemd не видел учетные данные heroku. Я задал похожий вопрос на AskUbuntu. Решение состояло в том, чтобы добавить домашний каталог ubuntu в службу logstash, чтобы он мог получить доступ к учетным данным. Выполняется путем редактирования файла logstash.service в /etc/systemd/system и установки там Environment="Home=/home/ubuntu".

Пример окончательного файла logstash.service:

[Unit]
Description=logstash

[Service]
Type=simple
User=logstash
Group=root
# Load env vars from /etc/default/ and /etc/sysconfig/ if they exist.
# Prefixing the path with '-' makes it try to load, but if the file doesn't
# exist, it continues onward.
Environment="HOME=/home/ubuntu"
EnvironmentFile=-/etc/default/logstash
EnvironmentFile=-/etc/sysconfig/logstash
ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash"
Restart=always
WorkingDirectory=/
Nice=19
LimitNOFILE=16384

[Install]
WantedBy=multi-user.target
person joniba    schedule 15.02.2017