カスタムタグ
# カスタムタグの使用 {#track}
<!-- markdownlint-disable MD046 -->
C# と Native C/C++ はどちらもユーザー情報、SDK グローバルコンテキスト、RUM グローバルコンテキストをサポートします。Log には独立したグローバル属性を設定することもできます。
## SDK の実行時追加
### 匿名ユーザー識別子
C# と Native C/C++ は初期化時に、未ログインユーザーに対して `ft.rd_` で始まる匿名 `userid` を生成します。この識別子は RUM アプリケーション ID ごとに分離され、SDK キャッシュディレクトリ内の `identity` サブディレクトリに保存されます。同じ RUM アプリケーション ID とキャッシュディレクトリを持つプロセスでは、再起動後も同じ識別子が引き続き使用されます。C++ ホストと Electron Bridge もこのセマンティクスを再利用します。
ユーザー API を呼び出さない場合、RUM データは匿名 `userid` を使用します。RUM に関連付けられた Log を有効にすると、その Log にもこの識別子が付与されます。`SetUser()` または `guance_sdk_set_user()` を呼び出すと、以降のデータは明示的なユーザー ID を使用するようになります。クリア API を呼び出すと、以降のデータは再び元の匿名識別子を使用するようになります。対応するキャッシュディレクトリを削除すると、この識別子はリセットされます。
ID ファイルが書き込み不可であるか、ロックに失敗した場合、SDK は現在のプロセスに対して一時的な匿名識別子を使用し、C# の `DiagnosticListener` または Native の診断出力を介して永続化の失敗を報告します。テレメトリ収集が中断されることはありません。
### ユーザーの設定
=== ".NET / C#"
```csharp
GuanceSdk.SetUser(
id: "user-123",
name: "Alice",
email: "alice@example.com",
extra: new Dictionary<string, object?>
{
["plan"] = "enterprise"
});
```
=== "Native C/C++"
```cpp
guance_sdk_set_user(
rum,
"user-123",
"Alice",
"alice@example.com");
```
ユーザーのクリア:
=== ".NET / C#"
```csharp
GuanceSdk.ClearUser();
```
=== "Native C/C++"
```cpp
guance_sdk_clear_user(rum);
```
ユーザーの切り替えは後続のデータにのみ影響し、既にキューに入れられたデータは変更されません。
### SDK グローバルコンテキスト
RUM および関連付けが有効な Log に適用されます:
=== ".NET / C#"
```csharp
GuanceSdk.AddGlobalContext("region", "cn-east-1");
GuanceSdk.AddGlobalContext("tenant", "tenant-a");
```
=== "Native C/C++"
```cpp
guance_sdk_add_global_context(rum, "region", "cn-east-1");
guance_sdk_add_global_context(rum, "tenant", "tenant-a");
```
### RUM グローバルコンテキスト
RUM データにのみ追加されます:
=== ".NET / C#"
```csharp
GuanceSdk.AddRumGlobalContext("ui.framework", "wpf");
```
=== "Native C/C++"
```cpp
guance_rum_add_rum_context(rum, "ui.framework", "win32");
```
### Log グローバルコンテキスト
Log 専用のタグは、Log の初期化時に設定します:
=== ".NET / C#"
```csharp
Logging = new LogConfig
{
EnableCustomLog = true,
GlobalContext = new Dictionary<string, object?>
{
["logger_name"] = "desktop-client"
}
}
```
=== "Native C/C++"
```cpp
guance_log_property context[] = {
{"logger_name", "native-client"}
};
logging.global_context = context;
logging.global_context_count = 1;
```
完全なパラメータについては、[Log 設定](config-log.md)を参照してください。
### イベントレベルの属性
C# の手動 RUM および Log API はイベントレベルの辞書を受け付けます。Native Log は `guance_log_property` を受け付けます。Native RUM v1 の手動イベント API は任意のイベントレベルの属性構造を提供しません。
```csharp
GuanceSdk.AddAction(
"Save",
"click",
TimeSpan.FromMilliseconds(25),
new Dictionary<string, object?>
{
["result"] = "success"
});
命名と予約フィールド¶
- 小文字で、安定しており、集約可能なフィールド名を使用してください(例:
feature.name)。 - Token、Cookie、パスワード、または直接的な個人情報を書き込まないでください。
app_id、service、env、version、sdk_name、session_id、view_id、action_idおよびプラットフォームフィールドは SDK が管理します。- カスタムコンテキストは SDK の予約フィールドを上書きできません。
- Native コンテキスト API は文字列を同期的にコピーします。空のキーを渡さないでください。
```