transactionize operator
transactionize operator は、指定したフィールドで一致するログをグループ化します。指定フィールドから作成されたグループはトランザクションになります。
グループ内のログはすべての定義済みフィールドで一致する必要があるその他の "group by" operator と異なり、transactionize はログを同じグループに割り当てる場合、1 つのフィールドが一致するだけですみます。
連鎖的な一致も可能で、隣接するメッセージどうしの間で一致するフィールドがあればログがグループ化されます。たとえば、transactionize クエリでは以下のログはすべてグループ化されます
A, , , ...
A, B, , ...
, B, C, ...
transactionize operator は、検索結果にトランザクション フィールドを追加します。フィールド名の先頭には指定したエイリアス接頭辞が付けられ、エイリアスを指定しないと「_group」が付けられます。transactionize は以下のフィールドを追加します。
- _group。各グループで一意の整数値です。
- _group_duration。トランザクションの期間 (ミリ秒) です。
- _group_size。トランザクションに含まれるログ メッセージ数です。
- _group_orphaned。フィールドがトランザクションのメンバーではなくても、比較や分析用にキープしておきたい場合は、
keepOrphans
- _group_signature。非推奨。代わりに、subquery で merge operator を使用してください。
構文
transactionize [<field1>], [<field2>], [<field3>] as [<field>]
transactionize [<field1>] as [<field>] [<subquery>]
[<subquery>]
は、各グループの結果に対して独立して実行されます。transactionize [<field1>] as [<field>] [<parameters>] [<subquery>]
パラメーター
パラメータは、上記の「構文」に示されている as [<field>]
句に準拠する必要があります。例:
| transactionize accountId as account maxlogs = 10
maxSpan = [time] —
トランザクションの期間が指定時間を超えるとトランザクションが終了します。時間は、1s や 1m など、さまざまな単位で指定できます。maxPause = [time] —
ログ メッセージ間の時間が指定時間を超えるとトランザクションが終了します。時間は、1s や 1m など、さまざまな単位で指定できます。maxLogs = [n] —
トランザクションのメッセージ数が指定数を超えるとトランザクションが終了します。startsWith = [string] [;strict] —
指定した文字列と一致するログ メッセージから新しいトランザクションが開始されます。例:startsWith="foo"
(strict はデフォルトではオフです。)endsWith = [string] [;strict] —
指定した文字列と一致するログ メッセージで現在のトランザクションが終了します。例:endsWith="foo";strict
keepOrphans = [true or false] (true, by default) —
フィールドがトランザクションのメンバーではなくても、比較や分析用にキープしておきたい場合に便利です。(nodrop と同等。)
制限事項
- transactionize では、一度に 50MB までの未処理ログを分析できます。バッファがこの制限を超えると、古いトランザクションがバッファから消去され、バッファに格納される新しいトランザクションとグループ化されなくなるため、結果が正しくグループ化されない場合があります。この場合は次の警告メッセージが表示されます。
The transactionize operator has reached its memory limit; transactions could be emitted prematurely.
この状況に対処するには、以下のいずれかの対策を執ってください。 - ダッシュボードのライブ モードでは transactionize はサポートされません。
- リアルタイムの Scheduled Search では transactionize はサポートされません。
例
セッション ID を使用してリクエストに属するログをグループ化
リクエストが複数の異なるシステムの間で受け渡される分散システムからのログを処理するとします。各システムは、それぞれのセッション ID を (そのシステムと通信する他のシステムのセッション ID と一緒に) ログに残します。
ログの内容は次のようになります。
[system=001] [sessionId=a39eb7] processing request [system=002] [sessionId=982c8d] accepting request from system=001 with sessionId=a39eb7 [system=002] [sessionId=982c8d] processing [system=003] [sessionId=3b7af9] accepting request from system=001 with sessionId=a39eb7 [system=003] [sessionId=3b7af9] processing
同じリクエストに属するログをグループ化するには、次のクエリのように parse nodrop を使用して各セッション ID を抽出してから、transactionize を使用してログをグループ化します。
| parse "[system=001] [sessionId=*]" as system1Id nodrop
| parse "[system=002][sessionId=*]" as system2Id nodrop
| parse "[system=003][sessionId=*]" as system3Id nodrop
| parse "system=001 with sessionId=*" as system1Id nodrop
| transactionize system1Id, system2Id, system3Id
例: