Splunk Observability Cloud の .NET インストルメンテーションのトラブルシューティング

インストルメンテーションされた .NET アプリケーションが Splunk Observability Cloud にデータを送信しない、またはデータが欠落している場合は、以下の手順に従って問題を特定し、解決してください。

Splunk Distribution of OpenTelemetry .NET を使用して .NET アプリケーションをインストルメンテーションしているときに、Splunk Observability Cloud にデータが表示されない場合は、以下のトラブルシューティング手順に従ってください。

一般的なトラブルシューティング

以下の手順に従って、一般的なインストルメンテーションの問題をトラブルシューティングしてください:

  1. ニーズに合わせてすべての設定を行ったか確認してください。「Splunk Distribution of OpenTelemetry .NET を設定する」を参照してください。

  2. プロセスに適用される環境変数を確認します:

    Windows PowerShell
    # Run a tool like Process Explorer or execute the following:
    
    [System.Diagnostics.Process]::GetProcessById(<pid>).StartInfo.EnvironmentVariables
    Linux
    cat /proc/<pid>/environ # where <pid> is the process ID

デバッグロギングを有効にする

デバッグロギングを有効にして、問題についての詳細な情報を得ることができます:

  1. インストルメンテーションされたアプリケーションを起動する前に、 OTEL_LOG_LEVEL 環境変数 を debug に設定します。

  2. アプリケーションまたはサービスを実行し、アクティビティを生成します。

  3. デバッグログを収集します。インストルメンテーションは以下の場所にログを保存します。

    • Windows:%ProgramData%\OpenTelemetry .NET AutoInstrumentation\logs

    • Linux:/var/log/opentelemetry/dotnet

    デフォルトのログディレクトリを作成できない場合、ログはユーザーの一時フォルダに保存されます。

    デフォルトの場所は、OTEL_DOTNET_AUTO_LOG_DIRECTORY 環境変数を更新することで変更できます。詳細と設定については、「診断ログの設定」を参照してください。

注: デバッグロギングは必要な場合にのみ有効にします。デバッグモードでは、より多くのリソースが必要です。

.NETアプリケーションのランタイム識別子を見つける

Splunk の自動検出を使用して .NET アプリケーションをインストルメンテーションしている場合、適切なインストルメンテーションを設定するためにランタイム識別子が必要になることがあります。

ランタイム識別子を見つけるには、以下の手順に従ってください:

  1. Program.cs ファイルで、コードに以下の依存関係が含まれていることを確認してください:

    using System.Runtime.InteropServices
  2. メインアプリケーションで、以下のコードを追加して、ランタイム識別子情報をプリントします。

    Console.WriteLine(RuntimeInformation.RuntimeIdentifier);
  3. アプリケーションを実行してアプリケーションログを確認します。

  4. ランタイム識別子がインストルメンテーションでサポートされていることを確認します。

Splunk Observability Cloud にトレースが表示されない

インストルメンテーションされたアプリケーションまたはサービスからのトレースが Splunk Observability Cloud で利用できない場合は、OpenTelemetry Collector の設定を確認してください:

  1. OTEL_EXPORTER_OTLP_ENDPOINT が正しい OpenTelemetry Collector インスタンスホストを指していることを確認します。

  2. コレクタインスタンスが設定済みで、稼動していることを確認します。「Splunk OpenTelemetry Collector のトラブルシューティング」を参照してください。

  3. OTLP レシーバーが OTel Collector でアクティブになり、トレースパイプラインに接続されていることを確認します。

  4. OTel Collector がアドレス http://<host>:4318 を指していることを確認します。URL が正しいことを確認します。

AdditionalDepsのアセンブリが見つかりませんでした。

以下のようなアセンブリエラーメッセージが表示される場合があります:

An assembly specified in the application dependencies manifest (OpenTelemetry.AutoInstrumentation.AdditionalDeps.deps.json) was not found

この問題をトラブルシューティングするには、次の例のようにホストトレースを有効にしてください:

COREHOST_TRACE=1
COREHOST_TRACEFILE=corehost_verbose_tracing.log

アプリケーションを実行してログを収集します。

高いCPU使用率

デフォルトでは、Splunk Distribution of OpenTelemetry .NET は、ホスト上で自動的に実行されているすべての .NET をインストルメンテーションします。これにより、システムまたはユーザー範囲でインストルメンテーションをアクティブ化している場合、 CPU 使用率が大幅に増加する可能性があります。インストルメンテーションの環境変数が常にプロセスまたは端末の範囲で設定されていることを確認してください。

グローバル インストルメンテーションをプロセスセットに制限するには、OTEL_DOTNET_AUTO_EXCLUDE_PROCESSES 環境変数を使用します。この変数は、インストルメンテーションのプロセスを除外します。詳細については、「Splunk Distribution of OpenTelemetry .NET を設定する」を参照してください。

特定のインストルメンテーションを無効にする

デフォルトでは、すべてのシグナル・タイプ(トレース、メトリクス、ログ)に対して、すべてのインストルメンテーションが有効になっています。

環境変数 OTEL_DOTNET_AUTO_{SIGNAL}_ENABLED_INSTRUMENTATIONSfalse に設定することで、特定のシグナル・タイプに対するすべてのインストルメンテーションを停止することができます。

よりきめ細かなアプローチとして、OTEL_DOTNET_AUTO_{SIGNAL}_{INSTRUMENTATION}_INSTRUMENTATION_ENABLED 環境変数を false に設定することで、特定のシグナル・タイプのインストルメンテーションを無効にすることができます。{SIGNAL} はシグナルのタイプ(例えばトレース)、{INSTRUMENTATION} はインストルメンテーションの大文字と小文字を区別した名前です。

注: web.config ファイルや app.config ファイルを使用して、インストルメンテーションを停止するための環境変数を設定することはできません。

AlwaysOn Profiling for .NET のトラブルシューティング

AlwaysOn Profilingに関する一般的な問題と修正については、以下を参照してください:

AlwaysOn Profilingが有効になっていることを確認する

.NET インストルメンテーションは、info ログレベルで開始する文字列 ContinuousProfiler::StartThreadSampling をログに記録します。AlwaysOn Profiling が有効になっているかどうかを確認するには、ログで以下のような文字列を検索します。

10/12/23 12:10:31.962 PM [12096|22036] [info] ContinuousProfiler::StartThreadSampling

文字列が表示されない場合は、SPLUNK_PROFILER_ENABLED 環境変数を true に設定して、プロファイラが有効になっていることを確認してください。「AlwaysOn Profiling の .NET OTel 設定」を参照してください。

AlwaysOn Profilingの設定を確認する

AlwaysOn Profiling が意図したとおりに機能していない場合は、構成の設定を確認します。Splunk APMのAlwaysOn Profilingの概要 を参照してください。.NET インストルメンテーションは、スタートアップ時に Debug メッセージを使用して AlwaysOn Profiling 設定をログに記録します。文字列 Continuous profiling configuration: を grep して構成を確認できます。

サポートされていない.NETバージョン

AlwaysOn Profiling を使用するには、.NET のバージョンを .NET 6.0 以降にアップグレードしてください。

どの.NET Frameworkバージョンもサポートしていません。

AlwaysOn Profiling のデータとログが Splunk Observability Cloud に表示されない

Collector 構成の問題により、AlwaysOn Profilingデータとログが Splunk Observability Cloud に表示されない場合があります。

この問題を解決するには、次のようにしてください:

  1. .NET インストルメンテーションの設定、特に SPLUNK_PROFILER_LOGS_ENDPOINT をチェックします。

  2. Splunk Distribution of OpenTelemetry Collectorが期待されるエンドポイントで実行されていること、アプリケーションホストまたはコンテナがホスト名を解決して OTLP ポートに接続できることを確認します。

  3. Splunk Distribution of OpenTelemetry Collector が実行されていて、バージョンが 0.34 以降であることを確認します。メモリプロファイリングに必要なバージョンは 0.44 です。他のコレクタの配布では、プロファイリングデータを含むログデータをルーティングできない場合があります。

  4. カスタム設定は、コレクタにプロファイリングデータを処理させる設定をオーバーライドする場合があります。otlp レシーバと splunk_hec エクスポータに正しいトークンとエンドポイントフィールドを設定してください。profiling パイプラインは、構成した OTLP レシーバと Splunk HEC エクスポータを使用する必要があります。詳細については、「Splunk HEC エクスポータ」を参照してください。

次のスニペットには、profiling パイプラインのサンプルが含まれています:

receivers:
  otlp:
    protocols:
      grpc:

exporters:
  # Profiling
  splunk_hec/profiling:
    token: "${SPLUNK_ACCESS_TOKEN}"
    endpoint: "${SPLUNK_INGEST_URL}/v1/log"
    log_data_enabled: false

processors:
  batch:
  memory_limiter:
    check_interval: 2s
    limit_mib: ${SPLUNK_MEMORY_LIMIT_MIB}

service:
  pipelines:
    logs/profiling:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [splunk_hec, splunk_hec/profiling]

プロファイリングデータの紛失またはギャップ

バッファがいっぱいでインストルメンテーションが Splunk OpenTelemetry Collector にデータを送信できない場合、AlwaysOn Profiling はエスケープハッチを起動し、バッファが空になるまで、プロファイリングデータを含むすべてのログを削除します。

エスケープハッチが作動すると、以下のメッセージが記録されます:

Skipping a thread sample period, buffers are full.

また、** THIS WILL RESULT IN LOSS OF PROFILING DATA **. のメッセージを探すこともできます。

スレッドサンプラーは、いずれかのバッファが空になるとアクティビティを再開します。

フルバッファによるプロファイリングデータの損失を回避するには、プロセスとSplunk Distribution of OpenTelemetry Collector間の設定と通信レイヤーを確認してください。

アセンブリバージョンの競合

.NETインストルメンテーションをインストールする際、依存関係のバージョンの競合が発生し、次のようなエラーメッセージが表示されることがあります:

Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Extensions.DependencyInjection.Abstractions, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified.

File name: 'Microsoft.Extensions.DependencyInjection.Abstractions, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'
   at Microsoft.AspNetCore.Builder.WebApplicationBuilder..ctor(WebApplicationOptions options, Action`1 configureDefaults)
   at Microsoft.AspNetCore.Builder.WebApplication.CreateBuilder(String[] args)
   at Program.<Main>$(String[] args) in /Blog.Core/Blog.Core.Api/Program.cs:line 26

この問題を解決するには、NuGet パッケージを使用して .NET インストルメンテーションをインストールします。NuGet はパッケージが必要とする正しい依存関係を自動的にインストールします。

あるいは、.NETの最新バージョンにアップデートすることもできます。そうすれば、依存関係のバージョンが競合する可能性が低くなります。

アセンブリアクセス許可IISの修正

.NETフレームワークをIISホストアプリケーションで使用している場合、以下のようなイベントでクラッシュすることがあります:
[Exception] System.IO.FileLoadException
[Message] "Loading this assembly would produce a different grant set from other instances."
この問題を解決するには、LoaderOptimization という新しい DWARD の値を作成し、レジストリキー HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework でその値を 1 に設定します。これにより、同じアプリケーションの異なるバージョンを異なるドメインにロードできるようになりますが、CPU とメモリ使用量が増える可能性があります。

インストルメンテーションをアンインストールする

Uninstall the .NET instrumentation」を参照してください。