fillmissing
標準 group-by クエリを実行すると、結果に空白ではないグループのみが返されます。たとえば、クエリで timeslice を使用してグループ化する場合、データが存在するタイムスライスのみが返されます。
次のような理由で、これは問題になる場合があります。
- データがないことは注目すべきイベントの場合もありますが、この情報を簡単に検出することができません。たとえば、outlier operator は、存在しているタイムスライスのみを異常としてマークできるので、データないことによる異常は検出できません。
- データがないとグラフ化によって誤解が発生する場合があります。たとえば、データのないタイムスライスで線グラフを作成すると、欠落しているタイムスライス間が補完されるため、誤って空白ではないように表示されます。
グループにデータがなくても出力に追加する必要があるグループを指定することにより、fillmissing
operator ではこの欠点を解決しています。
使用方法
fillmissing
operator で出力内のフィールドのジェネレータを定義できます。各ジェネレータは 1 つのフィールドに適用され、値の一部についてはデータに存在しなくても、そのフィールドに対応して出力に表示する値をすべて列挙します。
複数のジェネレータを定義できます。これにより、各ジェネレータが列挙した値のすべての組み合わせについてタプルを列挙します (つまりデカルト積)。たとえば、次のクエリを使用するとします。
| fillmissing values("a1", "a2") in A,
values("b1") in B,
values("c1", "c2", "c3") in C
3 つのフィールド (A、B、C) のジェネレータは次のタプルを列挙します。
A | B | C |
---|---|---|
a1 | b1 | c1 |
a1 | b1 | c2 |
a1 | b1 | c3 |
a2 | b1 | c1 |
a2 | b1 | c2 |
a2 | b1 | c3 |
ジェネレータが定義されたフィールドをキーフィールドと呼びます。それ以外のフィールドは非キー フィールドと呼びます。
ジェネレータのリストを指定すると、fillmissing
はジェネレータが列挙したすべてのタプルを出力に追加します。列挙されたタプルのいずれかがない特別な場合には、fillmissing
はキー フィールドに欠落した値、非キー フィールドにデフォルトの一定値を設定してレコードを出力に追加します。
ジェネレータ
fillmissing
operator は現在次のタイプのジェネレータをサポートしています。
- タイムスライス。クエリ時間範囲で指定期間のすべてのタイムスライスを列挙します。たとえば、
timeslice(15m)
はクエリ時間範囲のすべての 15 分間のタイムスライスを列挙します。 - 値。引数で指定された値の固定セットを列挙します。たとえば、
values("a", "b", "c")
は値 "a", "b"、および "c" を列挙します。現在は、文字列リテラルのみが引数に使用できます。
非キー フィールドのデフォルト値
fillmissing
によってレコードが出力に追加されると、レコードのキー フィールドには欠落した値が入力されますが、それ以外のフィールドには一定値が入力されます。これらのフィールドに一定値を設定できます。設定しない場合は、デフォルト値が割り当てられます。この値はフィールドのタイプによります。
フィールド タイプ | デフォルト値 |
---|---|
整数 | 0 |
double | 0.0 |
ブール | false |
文字列型 (またはその他の型) | null |
構文
このセクションでは、fillmissing
operator の構文について説明します。
fillmissing <keyFieldGenerator> [ with <nonKeyFieldSpecs> ]
keyFieldGenerator
は、operator が指定されたすべての値の組み合わせが存在することを確認するために参照するキー フィールドを生成します。欠落している値は、各キー フィールドごとに 1 つずつ指定される nonKeyFieldSpecs
に基づいて入力されます。2 つのジェネレータがサポートされています。
ジェネレータ | 構文 |
---|---|
タイムスライス順 | timeslice(<integer><time_period>) [in <field>] |
値 | values("<value1>", "<value2>", ...) in <field> |
nonKeyFieldSpecs
は省略可能です。このオプションで 1 つ以上の非キー フィールドのデフォルトの一定値を設定できます。各指定の構文は次のようになります。
非キー フィールド | 構文 |
---|---|
定数値 <constantValue> |
<double> | <int> | <stringLiteral> | null |
定数非キー | <constantValue> for <field> |
ルール
- ライブ ダッシュボードでは、aggregate operator の後に
fillmissing
operator を使用する必要があります。 - タイムスライス ジェネレータからのバケットは、期間に基づいている必要があります。サポートされている
<time_period>
値は、週(w)
、日(d)
、時(h)
、分(m)
、および秒(s)
です。
例
タイムスライス ジェネレータ
このクエリの例では、15 分タイムスライスのログ イベントの数をカウントします。fillmissing
を使用するクエリでは、カウントがゼロのタイムスライスは出力に表示されます。
タイムスライス ジェネレータの場合、キー フィールド名は省略可能です。(デフォルトは _timeslice.
です。)
Fillmissing なし | Fillmissing あり |
---|---|
login |
login |
![]() |
![]() |
値ジェネレータ
このクエリの例では、フィールド (type
) 別にカウントします。ここでは、value()
ジェネレータを使用して、出力に追加する必要がある 3 つのタイプ (web、api、internal) を列挙します。
_count
のデフォルト値を 0 から -1 に変更する方法にも注意してください。
Fillmissing なし | Fillmissing あり |
---|---|
login |
login |
![]() |
![]() |
複数のジェネレータと transpose
このクエリの例では、複数のジェネレータを使用して、2 つのキー フィールド (type
と _timeslice
) での必須値の組み合わせをすべて列挙する方法を示します。transpose で欠落した値の一部は表示できますが、どのタイプにもデータがない場合は表示できません。
Fillmissing なし | Fillmissing あり |
---|---|
login |
login | transpose row _timeslice column type |
![]() |
![]() |
次のシンプルな例のように、fillmissing
operator を transpose
の後に適用すると、type
フィールドのすべての期待値を指定しなくても同様の結果を得られます。
login
| parse "Completed in * ms." as latency
| timeslice 15m
| pct(latency, 99) by type, _timeslice
| transpose row _timeslice column type
| fillmissing timeslice(15m)
ただし、埋められるフィールドの値は (前の例のような 0 ではなく) 常に Null です。現在のところ、デフォルトの Null 値を変更する方法はありません。