MareoのIT技術ブログ

インフラエンジニアの技術ブログです

LogstashでMultiplePipelineに失敗した話

MultiplePipelineを実施したくて調べて来た方はごめんなさい、解決していないです。

結論

経緯としては、Logstashで処理するデータ送信元や格納先インデックスが増えて来たため、MultiplePipelinesにしてパイプライン定義ファイルもパイプライン単位で独立させ、パイプラインの独立性と、パイプライン定義ファイルの可読性を上げようと思いました。

結果、MultiplePipelineではどうにもうまくデータが入らなかったため、パイプラインの分割は諦め、mainパイプラインのみとし、パイプライン定義ファイルの可読性向上のみ実施しました。

 

以下作成中。後で清書します

環境や設計

  • Logstash 7.6らへん
  • 対象データはFilebeatのみ
  • 格納先インデックスは、「システム名-ログ名-年月」で設定
  • IndexTemplateやKibanaでは「システム名-*」「システム名-ログ名-*」でインデックスパターンを設定

変更前の設定値

パイプライン定義ファイル「input-filebeat.conf」

input {
  beats {
    port => 5044
  }
}

filter {

  ※全てのログの分m必要なフィルターを定義(3パターンくらいしかログがなく、基本grokフィルターでの処理のみなので、特に条件分岐なし)

}

output{

  if システム==A

    if ログ名==A {

        ※インデックス「filebeat-システム名-ログ名-年月」に格納

    }

  (中略)

}

やったこと

設計

パイプラインを以下のように流れるように変更

  1. パイプライン「input-filebeat」でinputにFilebeatのデータ取得を行い、outputで個別のパイプライン「filter-システム名-ログ名」に送信する
  2. 個別の「input-filebeat」で、ログ毎に必要なFilterを実行し、outputで個別のインデックス「filebeat-システム名-ログ名-年月」に格納する

手順

/etc/logstash/logstash.yml

以下のようにpath.configのコメントアウトを実施します。これを実施しないとpipelines.ymlが読み込まれません。

# path.config: /etc/logstash/conf.d/*.conf

/etc/logstash/pipelines.yml

- pipeline.id: input-filebeat
  path.config: "/etc/logstash/conf.d/input-filebeat.conf"
- pipeline.id: filter-systemA-LogA
  path.config: "/etc/logstash/conf.d/filter-systemA-LogA.conf"
  queue.type: persisted

パイプライン定義ファイル「input-filebeat.conf」

input {
  beats {
    port => 5044
  }
}

output{

  if システム==A

    if ログ名==A {

      pipelines { send_to => "filter-systemA-LogA" }

    }

  (中略)

}

パイプライン定義ファイル「filter-systemA-LogA.conf」

input {
  pipeline { address => "filter-systemA-LogA" }
}

filter {

  ※ログ毎に必要なフィルターを定義

}

output {

  ※インデックス「filebeat-システム名-ログ名-年月」に格納

}

参考

www.elastic.co

qiita.com

想定した結果

設計通りに動く

設計

パイプラインを以下のように流れるように変更

  1. パイプライン「input-filebeat」でinputにFilebeatのデータ取得を行い、outputで個別のパイプライン「filter-システム名-ログ名」に送信する
  2. 個別の「input-filebeat」で、ログ毎に必要なFilterを実行し、outputで個別のインデックス「filebeat-システム名-ログ名-年月」に格納する

実際の結果

インデックスにデータが格納されない状態になりました。

※後日、具体的なエラーメッセージ貼り付けます

代わりにやったこと

logstash.ymlやpipelines.ymlはデフォルト設定に戻し、パイプライン定義ファイルの可読性向上や、誤ったフィルターが適用されないよう、ログの出力形式毎に条件分岐を定義

filterにもoutputにも同じ条件分岐を載せるので書きっぷりは冗長になりましたが、今後ログの種類や量が増える予定なので、Filter部分の可読性を優先してこういう感じにしました。

パイプライン定義ファイル「input-filebeat.conf」

input {
  beats {
    port => 5044
  }
}

output{

  if システム==A

    if ログ名==A {

      pipelines { send_to => "filter-systemA-LogA" }

    }

  (中略)

}

パイプライン定義ファイル「filter-systemA-LogA.conf」

filter {

  if システム==A

    if ログ名==A {

      ※ログ毎に必要なフィルターを定義

    }

}

後書き

パイプラインが一つだけなのは、今後支障が出そうなので、おいおいMultiplePipelinesは調べないとと思ってます