概要
UModel システムでは、エンティティは EntitySet の具象インスタンスであり、サービス、ホスト、Pod などのシステム内のリソースを表します。このドキュメントでは、エンティティのデータ形式、取り込みメソッド、およびベストプラクティスについて説明します。
UModel、EntitySet、およびエンティティの概念の詳細については、「エンティティストアの概要」をご参照ください。
エンティティのデータ形式
エンティティデータは、Simple Log Service (SLS) プロトコルを使用して、EntityStore 内の ${workspace}__entity Logstore に書き込みます。各エンティティレコードは、システムフィールドとカスタムフィールドで構成されます。
システムフィールド
フィールド名 | タイプ | 必須 | 例 | 説明 |
| string | はい | apm, k8s, acs | エンティティのドメインを指定します。データの隔離と分類に使用されます。 |
| string | はい | apm.service, k8s.pod | エンティティの分類を定義するエンティティタイプ。 |
| string | はい | 391274C9A1D369FB5222E273D02B81B8 | エンティティの一意の識別子。128 ビットの 16 進数文字列です。 |
| string | いいえ (デフォルト: Update) | Create, Update, Expire, Delete, Revise | エンティティのライフサイクルをコントロールする操作タイプ。 |
| int | いいえ | 1700000000 | エンティティが最初に観測されたときの UNIX タイムスタンプ (秒)。 |
| int | はい | 1700000001 | エンティティが最後に観測されたときの UNIX タイムスタンプ (秒)。 |
| int | いいえ (デフォルト: 3600) | 3600 | エンティティの生存時間 (TTL) (秒)。 |
フィールドの説明
__entity_id__ の生成ルール
標準フォーマット: 128 ビットの 16 進数文字列。
推奨メソッド: エンティティのプライマリキーに MD5 または double xxhash 関数を適用して ID を生成します。
フォールバック動作 (非推奨): 128 ビットの 16 進数文字列ではない ID を指定した場合、システムは xxhash 関数を使用して自動的に変換します。
時間フィールドの管理
__first_observed_time__: エンティティが最初に検出されたときのタイムスタンプ。一度設定すると、この値は不変です。__last_observed_time__: 最新の観測のタイムスタンプ。この値は書き込みごとに更新する必要があります。エンティティの可視時間範囲:
[__first_observed_time__, __last_observed_time__ + __keep_alive_seconds__)注意: 初期作成時に
__first_observed_time__を省略した場合、EntityStore はその値を__last_observed_time__の値に設定します。
カスタムフィールド
システムフィールドに加えて、対応する EntitySet で定義されたカスタムフィールドを含めることができます。
{
"__domain__": "apm",
"__entity_type__": "apm.service",
"__entity_id__": "391274C9A1D369FB5222E273D02B81B8",
"__method__": "Update",
"__last_observed_time__": 1700000001,
"__keep_alive_seconds__": 3600,
"service_name": "user-service",
"version": "v1.2.3",
"cluster": "production",
"labels": {
"env": "prod",
"team": "backend"
}
}JSON フィールドに関する注意
⚠️ 重要: ラベルやアノテーションなどの JSON フィールドでは、キーをアルファベット順に必ずシリアル化してください。そうしないと、システムが変更を検出し、同じエンティティに対して頻繁で不要なインデックスの再構築がトリガーされます。
エンティティの時間範囲とクエリのカバー率
時間範囲の概念
EntityStore の各エンティティには、定義された可視範囲があります。クエリエンジンは、クエリのタイムウィンドウがエンティティの可視時間範囲と交差する場合にのみエンティティを返します。
エンティティの可視性の計算
次の数式は、エンティティの可視範囲を決定します。
注意
エンティティの可視性とクエリの時間範囲は、どちらも左閉じ右開きの区間です。
エンティティのステータス | 可視時間範囲 | 説明 |
通常ステータス |
| キープアライブの延長を含みます。 |
期限切れステータス ( |
| キープアライブの延長を除外します。 |
削除済みステータス | 可視時間範囲なし | エンティティはどのクエリでも返されません。 |
時間交差ロジック
クエリエンジンは、エンティティの可視範囲とクエリのタイムウィンドウが重複する場合にエンティティを返します。
An entity is returned if: QueryTimeWindow ∩ EntityVisibleTimeRange is not empty.具体的なロジックは次のとおりです。
if (QueryEndTime >= EntityFirstObservedTime &&
QueryStartTime < EntityVisibleEndTime) {
// Return the entity
} else {
// Do not return the entity
}書き込みメソッド
Create
ユースケース: Pod の作成イベントを検出した場合など、新しいエンティティを作成していることが確実な場合にのみ、このメソッドを使用します。
動作:
エンティティが既に存在する場合、アクションは実行されません。
エンティティが存在しない場合、指定されたフィールドで作成されます。
例:
{
"__domain__": "k8s",
"__entity_type__": "k8s.pod",
"__entity_id__": "abc123...",
"__method__": "Create",
"__first_observed_time__": 1700000000,
"__last_observed_time__": 1700000000,
"pod_name": "web-app-123",
"namespace": "default"
}Update
ユースケース: 定期的な完全同期と増分変更に適しています。
動作:
__first_observed_time__ を除くすべてのフィールドを上書きします。
__first_observed_time__の処理:エンティティが存在する場合、その
__first_observed_time__は保持されます。エンティティが存在せず、イベントにこのフィールドが含まれている場合、指定された値が使用されます。
エンティティが存在せず、イベントがこのフィールドを省略した場合、デフォルトで
__last_observed_time__の値が使用されます。
例:
{
"__domain__": "apm",
"__entity_type__": "apm.service",
"__entity_id__": "def456...",
"__method__": "Update",
"__last_observed_time__": 1700000100,
"service_name": "payment-service",
"status": "running",
"instance_count": 3
}Expire
ユースケース: Pod の削除イベントを検出した場合など、エンティティを論理的に削除するために使用します。これにより、その履歴レコードが保持されます。
動作:
内部の
__deleted__フラグをtrueに設定します。__last_observed_time__を更新します。KeepAliveSecondsはクエリでカウントされなくなります。
時間範囲の変更:
期限切れ前:
[FirstObservedTime, LastObservedTime + KeepAliveSeconds)。期限切れ後:
[FirstObservedTime, LastObservedTime)
例:
{
"__domain__": "k8s",
"__entity_type__": "k8s.pod",
"__entity_id__": "abc123...",
"__method__": "Expire",
"__last_observed_time__": 1700000200
}Delete (細心の注意を払って使用)
ユースケース: 機能が無効になった場合など、エンティティをその履歴全体で非表示にする場合にのみ、このメソッドを使用します。
動作:
データベースからエンティティレコードを物理的に消去します。
エンティティはすべての時間範囲でクエリできなくなります。
⚠️ 警告: この操作は元に戻せません。絶対に必要な場合にのみ使用してください。
Revise (細心の注意を払って使用)
ユースケース: 誤って書き込まれたデータを強制的に修正するために使用します。多くの場合、Delete メソッドと組み合わせて使用されます。
動作:
__first_observed_time__を含むすべてのフィールドの完全な上書きを実行します。この操作は、エンティティの以前の状態を完全に無視します。
取り込みのベストプラクティス
推奨戦略: 増分イベントと定期的な完全同期のハイブリッドモデル
最も堅牢な戦略は、リアルタイムの増分イベントと、データ調整およびフォールトトレランスのための定期的な完全同期を組み合わせたハイブリッドアプローチです。
設定の推奨事項:
増分イベント: リアルタイムまたはほぼリアルタイムで書き込みます。
定期的な完全同期: 周波数を 1 時間以上に設定します。
キープアライブ時間: ビジネス要件に基づいて値を設定します。通常は 10 分から 1 時間の間です。
注意:
__keep_alive_seconds__は、レポート間隔よりも長くする必要があります。頻繁な更新によるパフォーマンスの低下を避けるため、5 分以上の定期的なレポート間隔を推奨します。
実践的なシナリオ
シナリオ 1: クラウドプロダクトリソースの同期
RMC (Resource Management) の増分および完全同期メカニズムを使用します。
増分イベントの処理:
リソース作成イベントには、Create メソッドを使用します。
リソース更新イベントには、Update メソッドを使用します。
リソース削除イベントには、Delete メソッドを使用します。
完全同期イベントの処理:
定期的な完全同期には、すべてのリソースに対して Update メソッドを使用します。
ビジネスニーズに基づいて
__keep_alive_seconds__を設定します。
// クラウドリソース作成イベント
{
"__domain__": "acs",
"__entity_type__": "acs.ecs.instance",
"__entity_id__": "i-bp1234567890",
"__method__": "Create",
"__first_observed_time__": 1700000000,
"__last_observed_time__": 1700000000,
"__keep_alive_seconds__": 86400,
"instance_id": "i-bp1234567890",
"instance_name": "web-server-01",
"instance_type": "ecs.c6.large",
"status": "Running"
}シナリオ 2: エージェントによるアセットデータの収集
LoongCollector のようなコレクターを使用して Kubernetes のアセットデータを収集します。
初期の完全収集:
エージェントの起動時に一度、完全なデータ収集を実行します。
その後、1 時間ごとに完全な収集を実行します。
すべての書き込みに Update メソッドを使用します。
増分イベントのサブスクライブ:
Kubernetes API をサブスクライブしてイベントを取得します。
各イベントタイプを対応する書き込みメソッドにマッピングします。
増分変更をリアルタイムで書き込みます。
// K8s Pod の完全収集データ
{
"__domain__": "k8s",
"__entity_type__": "k8s.pod",
"__entity_id__": "pod-web-app-123",
"__method__": "Update",
"__last_observed_time__": 1700000400,
"__keep_alive_seconds__": 3600,
"pod_name": "web-app-123",
"namespace": "production",
"node_name": "worker-01",
"pod_ip": "10.0.1.100",
"labels": {
"app": "web-app",
"version": "v1.0"
}
}非推奨の取り込みパターン
イベントのみの管理
問題: このパターンは、すべての時間範囲にわたってデータをクエリする必要があるため、パフォーマンスの低下につながる可能性があります。
ユースケース: エンティティのライフサイクルがイベントのみによって駆動され、履歴の正確性が最重要である場合にのみ、これを検討してください。
完全な取り込みのみ
問題: このアプローチは、高い検出待機時間を引き起こし、大量のデータボリュームを伴います。
推奨事項: 増分更新を実装できない場合は、完全な取り込みの頻度を 10 分以上の間隔に制限してください。
取り込みエンドポイント
Simple Log Service (SLS) プロトコルを使用して ${workspace}__entity Logstore にデータを書き込むことで、エンティティを取り込みます。システムは自動的にデータを EntityStore エンジンに同期します。
サポートされている取り込みメソッドは次のとおりです。
ELT データ変換による書き込み:
スケジュールされた SQL による書き込み
直接の API または SDK レポート
重要な考慮事項
データの一貫性:
__domain__、__entity_type__、および__entity_id__は、エンティティのライフサイクル全体を通じて一貫している必要があります。タイムスタンプの管理: すべての時間フィールドに UNIX タイムスタンプ (秒単位) を使用し、タイムゾーンの一貫性を確保します (UTC を推奨)。
メソッドの選択: ユースケースに適したメソッドを選択してください。Delete メソッドは細心の注意を払って使用してください。
パフォーマンス: データ保持のニーズとクエリパフォーマンスのバランスを取るために、合理的な
__keep_alive_seconds__を設定します。JSON のフォーマット: 効率を向上させるために、JSON フィールドのキーは常にアルファベット順にシリアル化してください。
エンティティ数: 最適なパフォーマンスを得るために、各
`EntitySet`を 10,000 エンティティに、総エンティティ数を 1,000,000 に制限してください。これらの制限を超えると、クエリと取り込みのパフォーマンスが低下する可能性があります。