コンテンツにスキップ

Pipeline API

共通仕様

認証、エラー形式、レート制限、共通ヘッダーは API 概要・認証 を参照してください。

Pipeline(ログ取り込み定義)の管理を行う API です。 Pipeline は取り込み先と、検索時に適用するパースルールを定義します。


Pipeline 一覧取得

GET /api/user/<user_id>/pipeline/

レスポンス例:

[
  {
    "id": "pipe-001",
    "name": "firewall_logs",
    "is_active": true,
    "druid_parse": "^(\\d+\\.\\d+\\.\\d+\\.\\d+) - - \\[([^\\]]+)\\] \"(\\w+) ([^ ]+) HTTP/[\\d.]+\" (\\d+) (\\d+)$",
    "druid_parse_field": "client_ip, __time, http_method, request_path, status_code, bytes_sent",
    "druid_ttl": 90,
    "created_at": "2025-01-01T00:00:00Z",
    "updated_at": "2025-01-15T10:30:00Z"
  }
]

Pipeline 作成

POST /api/user/<user_id>/pipeline/

リクエストボディ:

{
  "name": "web_access_logs",
  "druid_parse": "^(\\d+\\.\\d+\\.\\d+\\.\\d+) - - \\[([^\\]]+)\\] \"(\\w+) ([^ ]+) HTTP/[\\d.]+\" (\\d+) (\\d+)$",
  "druid_parse_field": "client_ip, __time, http_method, request_path, status_code, bytes_sent",
  "druid_ttl": 90,
  "is_active": true
}

フィールド説明:

フィールド 必須 説明
name string Yes Pipeline 名(組織内で一意。英数字とハイフン推奨)
druid_parse string No 正規表現パターン(キャプチャグループ使用)
druid_parse_field string No カンマ区切りのフィールド名リスト(name(Type) で型指定可)
druid_ttl integer No データ保持期間(日数、0 = 無制限)
is_active boolean No 有効/無効

パースルールの仕組み

druid_parsedruid_parse_field は別々のフィールドとして保存されます。 正規表現のキャプチャグループとフィールド名は出現位置(順番)で対応付けされます。 抽出は取り込み時ではなく検索(クエリ)時に行われます(schema-on-read)。 生ログは messages 列にそのまま保持され、検索時に指定のパースルールでフィールドが取り出されます。 詳細は Pipeline ユーザーガイド を参照してください。

JSON ログの場合

druid_parse を空(省略)にすると JSON モードで動作します。 このとき messages 列の内容を JSON とみなし、検索時に JSON からフィールドを抽出します。 druid_parse に正規表現を指定した場合は正規表現モードになります。


Pipeline 詳細取得

GET /api/user/<user_id>/pipeline/<pipeline_id>/

レスポンス例:

{
  "id": "pipe-001",
  "name": "firewall_logs",
  "is_active": true,
  "druid_parse": "^(\\S+) (\\S+) (.*)$",
  "druid_parse_field": "timestamp, level, message",
  "druid_ttl": 90,
  "created_at": "2025-01-01T00:00:00Z",
  "updated_at": "2025-01-15T10:30:00Z"
}

Pipeline 更新

PUT /api/user/<user_id>/pipeline/<pipeline_id>/

リクエストボディ:

{
  "druid_parse": "^(\\w+ \\d+ \\d+:\\d+:\\d+) (\\S+) (\\S+): (.*)$",
  "druid_parse_field": "__time, hostname, process, message",
  "druid_ttl": 180
}

Pipeline 削除

DELETE /api/user/<user_id>/pipeline/<pipeline_id>/

パースルール生成

サンプルログから生成 AI がパースルール(正規表現とフィールド名)の案を生成します。 生成された案はユーザーが確認・調整してから適用します。 自動では適用されません。

POST /api/user/<user_id>/generate-parse/

リクエストボディ:

{
  "sample_log": "192.168.1.100 - - [15/Jan/2025:10:30:00 +0900] \"GET /api/users HTTP/1.1\" 200 1234"
}

レスポンス例:

{
  "druid_parse": "^(\\d+\\.\\d+\\.\\d+\\.\\d+) - - \\[([^\\]]+)\\] \"(\\w+) ([^ ]+) HTTP/[\\d.]+\" (\\d+) (\\d+)$",
  "druid_parse_field": "client_ip, __time, http_method, request_path, status_code, bytes_sent"
}

生成の流れ

  1. サンプルログを生成 AI(大規模言語モデル)に送信する。
  2. Grok パターン(%{IPV4:client_ip} 形式)が生成される。
  3. Grok パターンを正規表現とフィールド名リストに変換する。
  4. フィールド名は ECS スキーマに正規化し、結果を druid_parsedruid_parse_field として返す。
  5. 生成結果はユーザーが確認・調整してから適用する。自動適用ではない。

生成 AI はマネージド生成 AI 基盤を経由して呼び出します。 モデルは更新され得るため、特定のモデル ID やバージョンは固定しません。 パース生成の経路は、AI Investigate などのアシスタント機能とは別系統です。


Pipeline 共有

共有の作成

POST /api/user/<user_id>/share/pipeline/

リクエストボディ:

{
  "pipeline_id": "pipe-001",
  "target_organization_id": "org-uuid-xxx"
}

共有の解除

DELETE /api/user/<user_id>/share/pipeline/

共有リスト

GET /api/user/<user_id>/share/list/

アクセス可能なケースドメイン

GET /api/user/<user_id>/shared-case-domains/

パースルールの書式

基本形式

標準的なキャプチャグループ (...) を使用して正規表現パターンを記述します。フィールド名はカンマ区切りで別途指定します。

druid_parse(正規表現):

^(\S+) (\S+) (.*)$

druid_parse_field(フィールド名):

timestamp, level, message

この場合、以下のように対応します:

キャプチャグループ フィールド名
1 番目の (\S+) timestamp
2 番目の (\S+) level
3 番目の (.*) message

注意

  • Python スタイルの名前付きキャプチャグループ (?P<name>...)使用しません
  • キャプチャグループの数とフィールド名の数は一致させてください
  • 不要な部分は非キャプチャグループ (?:...) を使用してください

フィールドの型指定

druid_parse_field の各フィールド名には 名前(型) の形式で型を併記できます。 型を指定すると検索時にその型で抽出され、数値比較や集計、日時比較などを変換関数なしで行えます。 抽出は検索時に行われる(schema-on-read)ため、型を変更すると既存ログにも次回検索から適用されます。

action, src_ip, dst_ip, dst_port(Int32), bytes(Int64)
表記 抽出される型
dst_port(型なし) 文字列(既定)。dst_port == "22" のように文字列で比較
dst_port(Int32) 整数。dst_port == 22 のように数値で比較
bytes(Int64) 整数。sum bytes などの集計が可能

指定できる主な型は次のとおりです(大文字小文字を区別)。

String(既定), Int8 / Int16 / Int32 / Int64, UInt8 / UInt16 / UInt32 / UInt64, Float32 / Float64, Bool, Date, DateTime

型指定は両モードで有効

型指定は正規表現モードと JSON モードのどちらでも有効です。 JSON モードでは _source.MsgNum(Int64) のようにドット区切りのネストしたキーにも指定できます。 値が型に合わない行は、そのフィールドが空(NULL)になります。

__time フィールド

__time が指定されていない場合は、システムが自動的にタイムスタンプを推定し、日時型の __time として扱います。

原則として __timedruid_parse_field に含めない

druid_parse_field__time を含めると、抽出された値は文字列型として保存されます。 この場合、検索画面の既定の時間範囲フィルタ(日時型との比較)で型エラーになります。 タイムスタンプはキャプチャせず(例: 先頭を ^\S+ とする)、自動推定に任せることを推奨します。

パースルール例

druid_parse:

^(\d+\.\d+\.\d+\.\d+) - - \[([^\]]+)\] "(\w+) ([^ ]+) HTTP/[\d.]+" (\d+) (\d+)$

druid_parse_field:

client_ip, __time, http_method, request_path, status_code, bytes_sent

druid_parse:

^(\w+ \d+ \d+:\d+:\d+) (\S+) (\S+): (.*)$

druid_parse_field:

__time, hostname, process, message

druid_parse:

^(\d+),(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}),(\S+),(\S+),(.*)$

druid_parse_field:

event_id, __time, source, username, description