オープンフローの監視¶
このトピックでは、Openflow の状態を監視し、問題をトラブルシューティングする方法について説明します。
Openflow ログへのアクセス¶
Snowflakeは、 Openflowの設定 で構成したイベントテーブルにOpenflowログを送信します。
Snowflakeは、イベントテーブルクエリの WHERE 句にタイムスタンプを含めることを推奨します。さまざまなSnowflakeコンポーネントによって生成される潜在的データ量のため、これは特に重要です。フィルターを適用すると、より小さなデータのサブセットを取得することができ、クエリのパフォーマンスが向上します。
Openflowのテレメトリーをすぐに使い始めるには、以下の クエリ例 をご参照ください。
Openflowテレメトリースキーマ¶
イベントテーブル列については、 イベントテーブル列 をご参照ください。
次のセクションでは、Openflowがイベントテーブルでテレメトリーをどのように構成するかを説明します。
リソース属性¶
Openflowによって設定されたイベントメタデータについて説明します。他のタイプのリソース属性の一般情報については、イベントテーブル列のドキュメント RESOURCE_ATTRIBUTES 列 をご参照ください。
名前 |
型 |
説明 |
---|---|---|
アプリケーション |
String |
固定値 |
cloud.service.provider |
String |
|
コンテナーID |
String |
コンテナの一意の識別子 |
container.image.name |
String |
コンテナイメージの完全修飾名。Openflowランタイムテナには、ローカルコンテナレジストリへのパスが含まれます。 例: |
container.image.tag |
String |
コンテナイメージのバージョン |
k8s.container.name |
String |
K8sコンテナの名前。Openflowランタイムコンテナは「Runtime Key」で始まり、 たとえば、Runtime KeyがPostgresql-cdcの「PostgreSQLCDC」という名前のOpenflowランタイムでは、コンテナ名は次のようになります。
|
k8s.container.restart_count |
数値文字列 |
このコンテナが作成されてから再起動した回数。 |
k8s.namespace.name |
String |
ポッドまたはコンテナのK8s名前空間。Openflowランタイムの場合は |
k8s.node.name |
String |
ポッド/コンテナをホストする EKS ノード、または EKS ノード自体の内部ドメイン名。 例:ip-10-12-13-144.us-west-2.compute.internal |
k8s.pod.name |
String |
K8sポッドの名前。Openflowランタイムポッドは「Runtime Key」で始まり、各ポッドレプリカの数値識別子で終わります。この数は、ランタイムに設定された「最大ノード数」まで増やすことができます。インデックスは0です。 たとえば、Runtime Keyがpostgresql-cdcでノードが3つある、「PostgreSQLCDC」という名前のOpenflowランタイムでは、ポッド名は次のようになります。
|
k8s.pod.start_time |
ISO 8601日付文字列 |
ポッドが開始されたタイムスタンプ |
k8s.pod.uid |
UUID 文字列 |
クラスター内のポッドの一意の識別子 |
openflow.dataplane.id |
UUID 文字列 |
Openflowデプロイメントの一意の識別子。Snowflake Openflow UI の「Deployment」 > 「詳細の表示」に表示される「ID」と一致します。 |
- リソース属性の例:
{ "application": "openflow", "cloud.service.provider": "aws", "k8s.container.name": "pg-dev-server", "k8s.container.restart_count": "0", "k8s.namespace.name": "runtime-pg-dev", "k8s.node.name": "ip-10-10-62-36.us-east-2.compute.internal", "k8s.pod.name": "pg-dev-0", "k8s.pod.start_time": "2025-04-25T22:14:29Z", "k8s.pod.uid": "94610175-1685-4c8f-b0a1-42898d1058e6", "k8s.statefulset.name": "pg-dev", "openflow.dataplane.id": "abeddb4f-95ae-45aa-95b1-b4752f30c64a" }
範囲¶
名前 |
型 |
説明 |
---|---|---|
name |
String |
メトリックのプロバイダー。次のいずれかです。
|
- スコープの例:
{ "name": "runtime" }
記録の種類¶
この行が表すOpenflowテレメトリーのタイプに応じて、以下のいずれかになります。
LOG
METRIC
Openflowは TRACE 記録は収集しませんが、これはSnowflakeイベントテーブルのこの列の有効なタイプでもあります。
記録¶
オプション。この JSON オブジェクトは、この行が表すメトリックのタイプを記述します。
名前 |
型 |
説明 |
---|---|---|
メトリック |
オブジェクト |
2つのフィールドが含まれます。
名称と単位値は大きく異なります。完全なリストについては、以下の アプリケーションメトリック をご参照ください。 |
metric_type |
String |
次のいずれか:
|
value_type |
String |
このメトリックによって生成される値のプリミティブ型。次のいずれかです。
|
aggregation_temporality |
String |
オプション。ポッド CPU時間やネットワークIO など、以前の値に依存する厳密に増加するメトリックの場合は、累積に設定します。 |
is_monotonic |
ブール値 |
オプション。累積メトリックの場合、これは時系列内で厳密に増加していることを示すため当てはまります。 |
- 記録例:
{ "metric": { "name": "connection.queued.duration.max", "unit": "millisecond" }, "metric_type": "gauge", "value_type": "INT" }
記録属性¶
ログ¶
ログの記録属性は通常、このログのソースがどこであるかを示します。たとえば、testruntime
という名前のOpenflowランタイムからのログは次の記録属性を持つ可能性があります:
{ "log.file.path": "/var/log/pods/runtime-testruntime_testruntime-0_66d80cdb-9484-40a4-bdba-f92eb0af14c7/testruntime-server/0.log", "log.iostream": "stdout", "logtag": "F" }
システムメトリック¶
CPU 使用率などのシステムメトリックは通常、記録属性を設定しないため、これは null
になります。
Openflowアプリケーションメトリック¶
アプリケーションまたは「フロー」メトリックの記録属性は、メトリックを生成したデータパイプラインのコンポーネントに関する詳細を提供します。これはコンポーネントのタイプによって異なります。アプリケーションメトリック をご参照ください。
{ "component": "PutSnowpipeStreaming", "execution.node": "ALL", "group.id": "c052f9d7-7f76-3013-a2c5-d3b064fa7326", "id": "c69e2913-22a9-36bb-a159-6a5ed1fb9d63", "name": "PutSnowpipeStreaming", "type": "processor" }
値¶
この列には、テレメトリーの生の値が含まれます。メトリックの場合、これは数値(整数または倍精度)になります。ログの場合、これは半構造化された文字列値または適切にフォーマットされた JSON 文字列のいずれかです。
Openflowランタイムログ¶
Openflowランタイムはほとんどのログを JSON として出力するため、Snowflakeの TRY_PARSE_JSON を VALUE
列に適用すると、この値をさらに次の構造化フィールドに分割できます。
名前 |
型 |
説明 |
---|---|---|
formattedMessage |
String |
ランタイムロガーから出力された実際のログメッセージ。 |
レベル |
String |
次のいずれか:
|
loggerName |
String |
ロガーの完全修飾クラス名。Openflowプロセッサーは通常、 これは、特定のプロセッサー、コントローラーサービス、バンドルライブラリのログを表示するのに便利です。 |
ナノ秒 |
Integer |
このログメッセージが作成されたナノ秒レベルの時間(ミリ秒から始まる)。 たとえば、ナノ秒値111222333は、タイムスタンプ値1749180210111に対応し、ナノ秒の左端の3桁はタイムスタンプの右端の3桁と一致します。 |
threadName |
String |
この呼び出しを処理するスレッドの名前。例: |
throwable |
JSON オブジェクト |
このログメッセージに例外またはスタックトレースがない場合、
|
タイムスタンプ |
Integer |
このログメッセージが作成された時刻。UNIX エポックからのミリ秒として表されます。 たとえば、1749180210044は、ログが2025-06-05 03:23:30.044 UTC に作成されたことを示します。 |
アプリケーションメトリック¶
注釈
次のリストは、Openflowランタイムで使用可能なすべてのアプリケーションメトリックをカバーしています。ランタイムは、Snowflakeイベントテーブルに永続化するためにOpenflowコネクタに関連するメトリックのサブセットのみを出力します。
Snowflakeの OpenTelemetry レポートタスクは一部またはすべてのメトリックを任意の OTLP 宛先に送信できます。
接続メトリック¶
メトリック名 |
単位 |
説明 |
---|---|---|
connection.input.bytes |
bytes |
入力アイテムのサイズ |
connection.input.count |
items |
入力のアイテム数 |
connection.output.bytes |
bytes |
出力されたアイテムのサイズ |
connection.output.count |
items |
出力のアイテム数 |
connection.queued.bytes |
bytes |
キューに入れられたアイテムのサイズ |
connection.queued.bytes.max |
bytes |
キューに入れられるアイテムの最大サイズ |
connection.queued.count |
items |
キューに入れられたアイテムの数 |
connection.queued.count.max |
items |
キューに入れられたアイテムの最大数 |
connection.queued.duration.total |
ミリ秒 |
キューに入れられたアイテムの期間の合計 |
connection.queued.duration.max |
ミリ秒 |
キューに入れられたアイテムの最大期間 |
connection.backpressure.threshold.bytes |
bytes |
バックプレッシャーが適用される前に、この接続でキューに入れることができるデータの最大サイズ(バイト単位)。 |
connection.backpressure.threshold.objects |
items |
バックプレッシャーが適用される前にこの接続でキューに入れることができる FlowFiles の最大設定数。 |
connection.loadbalance.status.load_balance_not_configured |
バイナリ、0または1 |
接続にロードバランス設定が構成されていない場合は1。それ以外の場合は0です。 |
connection.loadbalance.status.load_balance_active |
バイナリ、0または1 |
接続がクラスター全体で負荷分散されている場合は1。それ以外の場合は0。 |
connection.loadbalance.status.load_balance_inactive |
バイナリ、0または1 |
接続がクラスター全体で負荷分散されていない場合は1。それ以外の場合は0。 |
接続記録属性¶
各接続メトリックには、次の記録属性が含まれます。
属性 |
説明 |
---|---|
ID |
接続の一意の識別子 |
name |
ユーザーから見える接続名 |
type |
固定値 |
source_id |
この接続に FlowFiles を送信しているコンポーネントの一意の識別子 |
source.name |
この接続に FlowFiles を送信しているコンポーネントのユーザーから見える名前 |
destination.id |
この接続から FlowFiles を受信しているコンポーネントの一意の識別子 |
destination.name |
この接続から FlowFiles を受信しているコンポーネントのユーザーから見える名前 |
group.id |
この接続を含むプロセスグループの一意の識別子 |
入出力ポートのメトリック¶
入力ポートと出力ポートは、技術的には2つの別々のタイプのコンポーネントです。一貫性を保つため、入力ポートと出力ポートのメトリックと属性は同じですが、入力ポートか出力ポートかを示す type
属性は異なります。
メトリック名 |
単位 |
説明 |
---|---|---|
port.thread.count.active |
threads |
アクティブなスレッドの数 |
port.bytes.received |
bytes |
受信したバイト数 |
port.bytes.sent |
bytes |
送信したバイト数 |
port.flowfiles.received |
flowfiles |
受信済み FlowFiles 数 |
port.flowfiles.sent |
flowfiles |
送信済み FlowFiles 数 |
port.input.bytes |
bytes |
入力アイテムのサイズ |
port.input.count |
items |
入力のアイテム数 |
port.output.bytes |
bytes |
出力されたアイテムのサイズ |
port.output.count |
items |
出力のアイテム数 |
入力および出力ポート記録属性¶
各ポートメトリックには、次の記録属性が含まれます。
属性 |
説明 |
---|---|
ID |
ポートの一意の識別子 |
name |
ユーザーから見えるポートの名前 |
type |
|
group.id |
このポートを含むプロセスグループの一意の識別子 |
プロセスグループメトリック¶
メトリック名 |
単位 |
説明 |
---|---|---|
processgroup.thread.count.active |
threads |
アクティブなスレッドの数 |
processgroup.thread.count.stateless |
threads |
ステートレススレッドの数 |
processgroup.thread.count.terminated |
threads |
終了したスレッドの数 |
processgroup.bytes.read |
bytes |
読み取りバイト数 |
processgroup.bytes.received |
bytes |
受信したバイト数 |
processgroup.bytes.transferred |
bytes |
転送されたバイト数 |
processgroup.bytes.sent |
bytes |
送信したバイト数 |
processgroup.bytes.written |
bytes |
書き込まれたバイト数 |
processgroup.flowfiles.received |
flowfiles |
受信済み FlowFiles 数 |
processgroup.flowfiles.sent |
flowfiles |
送信済み FlowFiles 数 |
processgroup.flowfiles.transferred |
flowfiles |
転送済み FlowFiles 数 |
processgroup.input.count |
items |
入力アイテム数 |
processgroup.input.content.size |
bytes |
入力アイテムのサイズ |
processgroup.output.count |
items |
出力されたアイテムの数 |
processgroup.output.content.size |
bytes |
出力されたアイテムのサイズ |
processgroup.queued.count |
items |
キューに入れられたアイテムの数 |
processgroup.queued.content.size |
bytes |
キューに入れられたアイテムのサイズ |
processgroup.time.processing |
ナノ秒 |
処理にかかった時間 |
プロセスグループ記録属性¶
各プロセスグループメトリックには、以下の記録属性が含まれます。
属性 |
説明 |
---|---|
ID |
プロセスグループの一意の識別子 |
name |
プロセスグループのユーザーから見える名前 |
type |
固定値 |
tree.level |
フローのルートプロセスグループに対するプロセスグループの深さ。フローの最上位レベルにあるプロセスグループのtree.levelは1になります。 |
プロセッサーメトリック¶
メトリック名 |
単位 |
説明 |
---|---|---|
processor.thread.count.active |
スレッド |
アクティブなスレッドの数 |
processor.thread.count.terminated |
スレッド |
終了したスレッドの数 |
processor.time.lineage.average |
ナノ秒 |
平均系列期間 |
processor.invocations |
呼び出し |
呼び出しの数 |
processor.bytes.read |
バイト |
読み取りバイト数 |
processor.bytes.received |
バイト |
受信したバイト数 |
processor.bytes.sent |
バイト |
送信したバイト数 |
processor.bytes.written |
バイト |
書き込まれたバイト数 |
processor.flowfiles.received |
flowfiles |
受信済み FlowFiles 数 |
processor.flowfiles.removed |
flowfiles |
削除済み FlowFiles 数 |
processor.flowfiles.sent |
flowfiles |
送信済み FlowFiles 数 |
processor.input.count |
アイテム |
入力アイテム数 |
processor.input.content.size |
bytes |
入力アイテムのサイズ |
processor.output.count |
アイテム |
出力されたアイテムの数 |
processor.output.content.size |
バイト |
出力されたアイテムのサイズ |
processor.time.processing |
ナノ秒 |
処理にかかった時間 |
processor.run.status.running |
バイナリ、0または1 |
実行中は1。それ以外の場合は0 |
processor.run.status.stopped |
バイナリ、0または1 |
停止した場合は1。それ以外の場合は0 |
processor.run.status.validating |
バイナリ、0または1 |
検証中の場合は1。それ以外の場合は0 |
processor.run.status.invalid |
バイナリ、0または1 |
無効の場合は1。それ以外の場合は0 |
processor.run.status.disabled |
バイナリ、0または1 |
無効の場合は1。それ以外の場合は0 |
processor.counter |
count |
カウンターの値 |
プロセッサー記録属性¶
各プロセッサーメトリックには、次の記録属性が含まれます。
属性 |
説明 |
---|---|
ID |
プロセッサーの一意の識別子 |
name |
ユーザーが表示および編集できるプロセッサーの名前 |
type |
固定値 |
コンポーネント |
プロセッサーの不変クラス名。 |
execution.node |
このプロセッサーの実行方法に応じて、 |
group.id |
このプロセッサーを含むプロセスグループの一意の識別子 |
カウンターの追加属性¶
上記の標準的なプロセッサー属性に加えて、 processor.counter
メトリックには次が含まれます。
属性 |
説明 |
---|---|
type |
固定値 |
カウンター |
ユーザーまたはシステムが生成したカウンターの名前 |
リモートプロセスグループメトリック¶
メトリック名 |
単位 |
説明 |
---|---|---|
remoteprocessgroup.thread.count.active |
threads |
アクティブなスレッドの数 |
remoteprocessgroup.remote.port.count.active |
ポート |
アクティブなリモートポートの数 |
remoteprocessgroup.remote.port.count.inactive |
ポート |
非アクティブなリモートポートの数 |
remoteprocessgroup.duration.lineage.average |
ナノ秒 |
平均系列期間 |
remoteprocessgroup.refresh.age |
ミリ秒 |
最終更新からの時間 |
remoteprocessgroup.received.count |
items |
受け取ったアイテムの数 |
remoteprocessgroup.received.content.size |
bytes |
受け取ったアイテムのサイズ |
remoteprocessgroup.sent.count |
items |
送信済みアイテムの数 |
remoteprocessgroup.sent.content.size |
bytes |
送信済みアイテムのサイズ |
remoteprocessgroup.transmission.status.transmitting |
バイナリ、0または1 |
リモートプロセスグループが送信中の場合は1。それ以外の場合は0。 |
remoteprocessgroup.transmission.status.nottransmitting |
バイナリ、0または1 |
リモートプロセスグループが送信している場合は0。それ以外の場合は1です。 |
リモートプロセスグループの記録属性¶
各リモートプロセスグループメトリックには、次の記録属性が含まれます。
属性 |
説明 |
---|---|
ID |
リモートプロセスグループの一意の識別子 |
name |
ユーザーから見えるリモートプロセスグループの名前 |
group.id |
このリモートプロセスグループを含むプロセスグループの一意の識別子 |
authorization.issue |
リモートプロセスグループへのアクセスに使用される認証 |
target.uri |
リモートプロセスグループの URI |
type |
固定値 |
JVMメトリック¶
メトリック名 |
単位 |
説明 |
---|---|---|
jvm.memory.heap.used |
bytes |
JVM ヒープ上のオブジェクトが現在使用しているメモリの量 |
jvm.memory.heap.committed |
bytes |
JVM ヒープで使用が保証されているメモリの量 |
jvm.memory.heap.max |
bytes |
JVM ヒープに割り当てられるメモリの最大量 |
jvm.memory.heap.init |
bytes |
JVM ヒープに割り当てられたメモリの初期量 |
jvm.memory.heap.usage |
percentage |
JVM ヒープの使用状況 |
jvm.memory.non-heap.usage |
percentage |
JVM ヒープ以外の使用状況 |
jvm.memory.total.init |
bytes |
JVM に割り当てられたメモリの初期量 |
jvm.memory.total.used |
bytes |
JVMが使用する現在のメモリ量 |
jvm.memory.total.max |
bytes |
JVM が使用できるメモリの最大量 |
jvm.memory.total.committed |
bytes |
JVM が使用できることが保証されているメモリの量 |
jvm.threads.count |
threads |
ライブスレッドの数 |
jvm.threads.deadlocks |
threads |
JVM スレッドのデッドロック |
jvm.threads.daemon.count |
threads |
ライブデーモンスレッドの数 |
jvm.uptime |
秒 |
JVM プロセスが実行されている秒数 |
jvm.file.descriptor.usage |
percentage |
現在使用中の利用可能なファイル記述子の割合。 |
jvm.gc.G1-Concurrent-GC.runs |
実行 |
G1同時ガベージコレクションが実行された合計回数 |
jvm.gc.G1-Concurrent-GC.time |
ミリ秒 |
G1同時ガベージコレクションが実行された合計時間 |
jvm.gc.G1-Young-Generation.runs |
実行 |
G1ヤングジェネレーションが実行された合計回数 |
jvm.gc.G1-Young-Generation.time |
ミリ秒 |
G1ヤングジェネレーションが実行された合計時間 |
jvm.gc.G1-Old-Generation.runs |
実行 |
G1旧世代が実行された合計回数 |
jvm.gc.G1-Old-Generation.time |
ミリ秒 |
G1旧世代が実行されている合計時間 |
JVM 記録属性¶
JVM メトリックは記録属性を提供しません。
CPUメトリック¶
メトリック名 |
単位 |
説明 |
---|---|---|
cores.available |
コア |
ランタイムで利用可能なコアの数 |
cores.load |
percentage |
システム負荷の平均、または利用できない場合は-1 |
CPU 記録属性¶
属性 |
説明 |
---|---|
ID |
固定値 `cpu |
name |
オペレーティングシステムの名前 |
アーキテクチャ |
オペレーティングシステムのアーキテクチャ |
version |
オペレーティングシステムのバージョン |
ストレージメトリック¶
メトリック名 |
単位 |
説明 |
---|---|---|
storage.free |
bytes |
指定されたリポジトリの無料ストレージの量 |
storage.used |
bytes |
特定のリポジトリの使用済みストレージの量 |
ストレージ記録属性¶
属性 |
説明 |
---|---|
ID |
ストレージリポジトリの一意の識別子 |
name |
IDと同じで一貫性を保つために提供されます |
storage.type |
|
クエリ例¶
以下のクエリは、Openflowテレメトリーを使用するための例です。
すべてのクエリは、Openflowが SNOWFLAKE.TELEMETRY.EVENTS
のデフォルトイベントテーブルにテレメトリーを送信するように構成されていることを前提としています。SnowflakeアカウントまたはOpenflowデプロイメントが別のイベントテーブルで構成されている場合は、 SNOWFLAKE.TELEMETRY.EVENTS
と表示されている場所でそのテーブル名を置き換えてください。
FlowFiles スタックを検索¶
このクエリは、一定のしきい値を超えてキューに入れられている FlowFiles との接続を返します。これは、接続がスタックしている可能性があり、介入が必要であることを示しています。ユースケースに応じて30分のしきい値を調整します。
SELECT * FROM (
SELECT
resource_attributes:"openflow.dataplane.id" as Deployment_ID,
resource_attributes:"k8s.namespace.name" as Runtime_Key,
record_attributes:name as Connection_Name,
record_attributes:id as Connection_ID,
MAX(TO_NUMBER(value / 60 / 1000)) as Max_Queued_File_Minutes
FROM snowflake.telemetry.events
WHERE true
AND record_type = 'METRIC'
AND record:metric:name = 'connection.queued.duration.max'
AND timestamp > dateadd(minutes, -30, sysdate())
GROUP BY 1, 2, 3, 4
ORDER BY Max_Queued_File_Minutes DESC
) WHERE Max_Queued_File_Minutes > 30;
Openflowランタイムのエラーログを検索する¶
SELECT
timestamp,
Deployment_ID,
Runtime_Key,
parsed_log:level as log_level,
parsed_log:loggerName as logger,
parsed_log:formattedMessage as message,
parsed_log
FROM (
SELECT
timestamp,
resource_attributes:"openflow.dataplane.id" as Deployment_ID,
resource_attributes:"k8s.namespace.name" as Runtime_Key,
TRY_PARSE_JSON(value) as parsed_log
FROM snowflake.telemetry.events
WHERE true
AND timestamp > dateadd('minutes', -30, sysdate())
AND record_type = 'LOG'
AND resource_attributes:"k8s.namespace.name" like 'runtime-%'
ORDER BY timestamp DESC
) WHERE log_level = 'ERROR';
実行中および非実行のプロセッサーを検索¶
一部のフローは、アクティブにデータを処理していない場合でも、すべてのプロセッサーが「実行中」状態にあることを期待します。
このクエリは、実行中または別の状態のプロセッサーを見つけるのに役立ちます。例:
stopped
invalid
disabled
SELECT
timestamp,
resource_attributes:"openflow.dataplane.id" as Deployment_ID,
resource_attributes:"k8s.namespace.name" as Runtime_Key,
record_attributes:component as Processor,
record_attributes:id as Processor_ID,
TO_NUMBER(value) as Running
FROM snowflake.telemetry.events
WHERE true
AND record:metric:name = 'processor.run.status.running'
AND record_type = 'METRIC'
AND timestamp > dateadd(minutes, -30, sysdate());
Openflowランタイムの CPU 使用率が高い箇所を見つける¶
データフローの速度やスループットの低下は、 CPU のボトルネックの結果である可能性があります。Openflowランタイムは、構成した最小ノード数と最大ノード数に基づいて、自動的にスケールアップします。
Openflowランタイムが最大ノード数を使用中で、まだ CPU の使用率が依然として高い場合は、次のことを検討してください。
ランタイムに割り当てられたノードの最大数の増加
コネクタまたはフローをトラブルシューティングして、ボトルネックを特定
Snowsightチャートは、時間の経過に伴う CPU 使用状況のクエリ結果を簡単に視覚化する方法を提供します。
SELECT
timestamp,
resource_attributes:"openflow.dataplane.id" as Deployment_ID,
resource_attributes:"k8s.namespace.name" as Runtime_Key,
resource_attributes:"k8s.pod.name" as Runtime_Pod,
TO_NUMBER(value, 10, 3) * 100 as CPU_Usage_Percentage
FROM snowflake.telemetry.events
WHERE true
AND timestamp > dateadd(minute, -30, sysdate())
AND record_type = 'METRIC'
AND record:metric:name ilike 'container.cpu.usage'
AND resource_attributes:"k8s.namespace.name" ilike 'runtime-%'
AND resource_attributes:"k8s.container.name" ilike '%-server'
ORDER BY timestamp desc, CPU_Usage_Percentage desc;