トラブルシューティング¶
SDK 初期化時の異常チェック¶
.NET / C# 設定のチェック¶
GuanceSdk.Init() は重要な設定を即座に検証します。
| エラーメッセージ | 対応方法 |
|---|---|
RumAppId is required. |
コンソールで作成したアプリケーション ID を設定してください。 |
ServiceName is required. |
空でない ServiceName を設定してください。 |
Version is required. |
アプリケーションのバージョンを設定してください。 |
Env must be one of... |
prod、gray、pre、common、local のいずれかを使用してください。 |
Either DatawayUrl or DatakitUrl is required. |
少なくとも 1 つの送信先アドレスを設定してください。 |
ClientToken is required when DatawayUrl is configured. |
パブリック DataWay モードでは Client Token を追加してください。 |
SampleRate must be between 0 and 1. |
サンプリングレートを 0.0 ~ 1.0 の範囲に調整してください。 |
Native C/C++ の初期化または読み込みの失敗¶
- アプリケーション、インポートライブラリ、
guance_windows_native.dllが同じアーキテクチャであることを確認してください。現在の vcpkg ポートは動的x64-windowsのみを提供します。その他のアーキテクチャでは、一致するアーキテクチャのソースコードからビルドした成果物を使用する必要があります。 - DLL がアプリケーションディレクトリまたは Windows の DLL 検索パスにあることを確認してください。NuGet パッケージ内の x86、x64、ARM64 の Native ランタイムアセットは .NET ラッパー層向けであり、C/C++ のヘッダーファイルやインポートライブラリとは異なります。
- 最初に
guance_sdk_config_init()を呼び出し、その後にアドレス、Token、アプリケーション ID、サービス名、バージョン、環境を設定してください。 - パブリック DataWay ではアドレスと Client Token が必要です。ローカル環境デプロイ(Datakit)では、アクセス可能な Datakit アドレスを設定する必要があります。
guance_sdk_init()が空の Handle を返す場合は、必須項目、キャッシュディレクトリの権限、プロセスアーキテクチャを確認してください。
SDK は正常に動作するがデータがない¶
コンソールに RUM データがない¶
以下の順に確認してください。
- App ID が現在のワークスペースの「カスタム」アプリケーションと一致するか確認します。
- パブリック DataWay で正しいベースアドレスと Client Token の両方が設定されているか確認します。
- ローカル環境デプロイ(Datakit)にアプリケーションプロセスからアクセスでき、RUM コレクターが有効になっているか確認します。
- RUM の
SampleRateまたはsample_rateが0より大きいか確認します。 - View が開始されているか、対応する自動収集が有効になっているか確認します。
- アプリケーションの終了前に、シャットダウン API を待機または呼び出しているか確認します。
var snapshot = GuanceSdk.GetDiagnosticsSnapshot();
Console.WriteLine(
$"sampled={snapshot.SessionSampled}, " +
$"enqueued={snapshot.RumEventsEnqueued}, " +
$"uploaded={snapshot.RumUploadSuccessCount}, " +
$"retry={snapshot.RumUploadRetryCount}, " +
$"terminal={snapshot.RumUploadTerminalFailureCount}, " +
$"lastStatus={snapshot.LastRumUploadStatusCode}, " +
$"lastError={snapshot.LastRumUploadError}");
guance_sdk_diagnostics diagnostics{};
if (guance_sdk_get_diagnostics(rum, &diagnostics)) {
printf("queued=%lld uploaded=%lld retries=%lld status=%lld error=%lld\n",
static_cast<long long>(diagnostics.rum_events_enqueued),
static_cast<long long>(diagnostics.rum_upload_success_count),
static_cast<long long>(diagnostics.rum_upload_retry_count),
static_cast<long long>(diagnostics.last_rum_upload_status_code),
static_cast<long long>(diagnostics.last_rum_upload_error_code));
}
エンキュー数が 0 の場合は、サンプリング、View、収集スイッチを優先的に確認してください。リトライが増え続ける場合は、ネットワーク、プロキシ、DNS、送信先アドレスを確認してください。最終失敗が増える場合は、Token、権限、サーバーのステータスコードを確認してください。
デスクトップ UI に View または Action がない¶
WPF と WinForms¶
- 最初のウィンドウを作成する前に
EnableAutomaticInstrumentation()を呼び出します。 EnableWpfまたはEnableWinFormsがオフになっていないことを確認します。- 重要なコントロールに、安定した
Name、タイトル、またはアクセシビリティ名を設定します。 - 動的な WinForms コントロールは Application Idle 時にスキャンされます。メッセージループが長時間アイドル状態にならない場合、検出が遅れる可能性があります。
WinUI 3¶
WinUI 3 ウィンドウは Activate() の前に明示的に関連付ける必要があります。マルチウィンドウアプリケーションでは、ウィンドウごとに関連付ける必要があります。
window = new MainWindow().UseGuanceRum("MainWindow");
// または GuanceSdk.AttachWinUIWindow(window, "MainWindow");
window.Activate();
Native C/C++¶
- ウィンドウ作成後に
guance_rum_start_view()を呼び出し、ウィンドウを閉じる前にguance_rum_stop_view()を呼び出します。 - Action は、コマンド、メニュー、または入力メッセージ処理の境界で明示的に開始・終了する必要があります。
- UI Watchdog には、現在のプロセスが所有する有効なトップレベル
HWNDが必要です。 - Native SDK は汎用のウィンドウまたはコントロールの Hook をインストールしないため、すべての MFC またはカスタムフレームワークのイベントを自動的に検出しません。
Log データがない¶
GuanceConfig.Loggingが設定され、EnableCustomLog = trueであることを確認します。SampleRate、LevelFilters、およびメッセージが 30 KiB UTF-8 の上限を超えていないか確認します。System.Diagnostics.Traceの出力は SDK によって自動転送されません。アプリケーションの既存のログ出力先でAddLog()またはAddLogs()を明示的に呼び出してください。GetLogDiagnosticsSnapshot()を読み取り、設定、サンプリング、レベル、容量による破棄カウントをそれぞれ確認します。
- 最初に
guance_log_config_init()を呼び出し、次にguance_log_configure()を呼び出します。 enable_custom_logが1であることを確認し、sample_rateとlevel_filter_maskを確認します。- Native SDK は Console、ETW、サードパーティ製ログライブラリを自動的にインターセプトしません。既存のログ出力先で
guance_log_add()またはguance_log_add_batch()を呼び出してください。 guance_log_get_diagnostics()を使用して、エンキュー、破棄、リトライ、最後のステータスコードを確認します。
Log と RUM は独立したキューを使用します。RUM が正常でも Log が有効になっているとは限りません。逆も同様です。
リクエストに Trace Header がない¶
EnableAutoTraceまたはenable_auto_traceが有効になっていることを確認します。- サンプリングレートが
0でないことを確認し、対象 URL がShouldTraceまたはshould_traceを通過しているか確認します。 - サーバーが要求する伝播フォーマットが
TraceTypeまたはtrace_typeと一致しているか確認します。 - Trace Header は選択したフォーマットによって決まるため、
trace_idという名前の HTTP Header だけを検索しないでください。 - 信頼しない宛先に Trace Header を送信しないでください。
自動診断のサブスクリプションには AutomaticInstrumentationOptions.EnableHttpClient = true が必要です。カスタム HttpClient パイプラインでは、GuanceSdk.CreateHttpMessageHandler() を明示的に使用できます。
WinHTTP リクエストには guance_rum_winhttp.hpp アダプターを使用する必要があります。その他の HTTP ライブラリでは、guance_trace_create_context() を呼び出し、返された Header をリクエストに書き込む必要があります。
リクエストに同じ名前の Trace Header がすでにある場合は、HTTP ライブラリまたはビジネスコードが SDK の注入後にそれを上書きしていないか確認してください。
Trace または Log が RUM に関連付けられていない¶
- Trace/Log 設定の
EnableLinkRumDataまたはenable_link_rum_dataをそれぞれ有効にしてください。 - アクティブな View または Action が存在するときに、リクエストを送信するか Log を書き込みます。SDK は終了したコンテキストを遡って変更しません。
- Trace の関連付け情報は、対応する RUM Resource に書き込まれます。Windows SDK は APM Span を独立してアップロードしません。したがって、Trace コンソールに Span がなくても、Header 注入の失敗を意味するわけではありません。
WebView2 にページデータがない¶
- WebView2 Runtime がインストールされ、コントロールが
EnsureCoreWebView2Async()を完了できることを確認します。 EnableWebView = trueであることを確認するか、明示的にAttachWebView()を呼び出します。- 動的コントロールでは、初期化完了後に明示的に関連付けることを推奨します。
- コントロールが
UnloadedまたはDisposedになった後は、新しいインスタンスで再度関連付ける必要があります。 - 診断リスナーを登録し、
WebView2 initialization failedまたはdid not succeedを確認します。
同じコントロールで AttachWebView() を繰り返し呼び出しても、二重に注入されることはありません。ページ自体でも Browser RUM が初期化されている場合は、同じページイベントを手動で重複送信しないでください。
Electron にデータがない¶
まず、アプリケーションがどの Electron 接続方式を採用しているかを確認してください。2 つの方式では Session とアップロードの所有者が異なるため、設定を混在させることはできません。
- SDK の vcpkg レジストリが設定され、マニフェストで
guance-windows-nativeのelectron-bridgeFeature が有効になっていることを確認してください。現在は動的x64-windowsのみがサポートされています。 - 開発環境では
vcpkg_installed/x64-windows/tools/guance-windows-native/を確認し、パッケージング環境ではresources/native/を確認してください。両方のディレクトリにguance_windows_electron_bridge.exeとguance_windows_native.dllの両方が含まれている必要があります。 - Bridge を起動する際に、
cwdを EXE と DLL が存在するディレクトリに設定し、完全な Native 設定を行い、stdout に[Guance.RUM.NativeBridge] readyが出力されるか確認してください。終了コード2は送信先アドレスまたは RUM Application ID が不足していることを示し、終了コード3は Native Core の初期化または Log 設定の失敗を示します。 - Browser RUM/Logs は監視対象の Renderer でのみ初期化されます。各ウィンドウで Preload をインストールし、信頼できる
webContentsを登録し、最小限の初期化を 1 回実行する必要があります。Renderer には Bridge モードに必要なプレースホルダーパラメータのみを入力し、実際の Token、アプリケーション ID、送信先アドレスは入力しないでください。 - Renderer の DevTools Network に RUM、Log、Replay の直接送信リクエストが表示されていないことを確認してください。固定 IPC Channel がメッセージを受信しているか、Main Process が信頼できる Renderer を受け入れているか、Native Host の stdin が書き込み可能かを確認してください。
- Native Host の RUM、Log、Replay のエンキュー数、アップロードステータスコード、リトライ、最終失敗数を確認してください。アプリケーションの終了時には、
shutdown()が完了するまで待機し、キュー内のデータが失われないようにしてください。
Bridge は Electron の Main Process Crash を自動的にキャプチャできません。Renderer の unresponsive と render-process-gone は、Main Process がリッスンして信頼できる Bridge コマンドに変換する必要があります。完全な接続方法は Electron モニタリング を参照してください。
- Browser RUM は Renderer でのみ初期化されます。独立した Renderer ページごとに初期化が必要です。
file://ページではsessionPersistence: "local-storage"を設定します。- Main Process は RUM インスタンスをリモートページに自動的に渡しません。
- Browser RUM の
applicationId、site/datakitOrigin、Token、サンプリングレートを確認します。 - このモードでは Windows Native Bridge は起動しません。完全なトラブルシューティング方法は、Web RUM Electron アプリの接続 を参照してください。
データの重複¶
- アプリケーションの起動中に、対応する SDK Handle を一度だけ初期化します。
.NETでGuanceSdk.Init()を繰り返し呼び出すと、古いクライアントが非同期に解放されます。初期化の境界が重なると、データが重複して収集される可能性があります。- 自動収集がすでにカバーしているコントロールの操作、
HttpClientまたは WinHTTP リクエストを手動で再度送信しないでください。 - WinUI 3 では、同じウィンドウに対して 1 つの関連付け方法のみを使用します。
- Electron renderer では、初期化エントリポイントが 1 回だけ実行されるようにしてください。
終了時にキューにデータが残っている¶
非同期シャットダウンをトリガーしただけで、その直後にプロセスを終了しないでください。Native のクラッシュ Error は次回起動時に復元され、キューに入れられます。クラッシュしたプロセス内でネットワークアップロードは実行されません。
Debug デバッグを有効にする¶
テスト環境で Debug = true または debug = 1 を有効にします。C# では、GuanceSdk.AddDiagnosticListener() を使用して SDK レベル、ソース、メッセージを記録できます。問題を提出する際は、以下を提供してください。
- SDK バージョン、ランタイムまたはコンパイラのバージョン、Windows のバージョン;
- UI フレームワーク、プロセスアーキテクチャ、および実装言語;
- マスキング済みの設定;
- RUM と Log の診断カウント、ステータスコード;
- 再現可能な最小手順。
Client Token、認証 Header、Cookie、ユーザーの機密情報、ローカルの絶対パスを提出しないでください。