Splunk Observability Cloud の Node.js インストルメンテーションのトラブルシューティング
インストルメンテーションされた Node.js アプリケーションが Splunk Observability Cloud にデータを送信しない、またはデータが欠落している場合は、以下の手順に従って問題を特定し、解決してください。
Splunk Distribution of OpenTelemetry JS を使用して Node.js アプリケーションをインストルメンテーションしているときに、Splunk Observability Cloud にデータが表示されない場合は、以下のトラブルシューティング手順に従ってください。
Node.jsのOpenTelemetry問題のトラブルシューティングの手順
以下の手順は、Node.js インストルメンテーションの問題のトラブルシューティングに役立ちます:
診断ロギングの有効化
診断ログは、インストルメンテーションの問題のトラブルシューティングに役立ちます。
インストルメンテーションログをコンソールに出力するには、アプリケーションが実行されているのと同じスコープで、 OTEL_LOG_LEVEL 環境変数を debug に設定します。たとえば、OTEL_LOG_LEVEL=<level> node start.js のようになります。.env ファイルには追加しないでください。これは後で読み込まれるためです。
また、logLevel 引数を設定することで、プログラムでデバッグロギングを有効にすることもできます。例:
start({
logLevel: 'debug',
metrics: {
// configuration passed to metrics signal
},
profiling: {
// configuration passed to profiling signal
},
tracing: {
// configuration passed to tracing signal
},
});
コードでデバッグロギングを無効にするには、次の例のように setLogger() を呼び出します:
const { diag } = require('@opentelemetry/api');
diag.setLogger();
デバッグメトリクスを有効にする
アプリケーションが実行されているのと同じスコープで、SPLUNK_DEBUG_METRICS_ENABLED 環境変数を true に設定することで、内部デバッグメトリクスを有効にできます。たとえば、SPLUNK_DEBUG_METRICS_ENABLED=true node start.js のようになります。.env ファイルには追加しないでください。これは後で読み込まれるためです。
詳細については、「デバッグメトリクス」を参照してください。
トレース・エクスポーターの問題
デフォルトでは、Splunk Distribution of OpenTelemetry JS は OTLP エクスポータを使用します。トレースのエクスポートに影響する問題があると、デバッグログにエラーが表示されます。
OTLP がスパンをエクスポートできない
ログの以下のエラーは、インストルメンテーションがトレースデータを OpenTelemetry Collector に送信できないことを意味します。
@opentelemetry/instrumentation-http http.ClientRequest return request
{"stack":"Error: connect ECONNREFUSED 127.0.0.1:55681\n at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1148:16)\n at TCPConnectWrap.callbackTrampoline (internal/async_hooks.js:131:17)","message":"connect ECONNREFUSED 127.0.0.1:55681","errno":"-111","code":"ECONNREFUSED","syscall":"connect","address":"127.0.0.1","port":"55681","name":"Error"}
OTLPエクスポーターとOTel Collector 間の接続不足のトラブルシューティングを行うには、以下のことを確認してください:
-
OTEL_EXPORTER_OTLP_ENDPOINTが正しい OpenTelemetry Collector インスタンスホストを指していることを確認します。 -
コレクタインスタンスが設定済みで、稼動していることを確認します。「Splunk OpenTelemetry Collector のトラブルシューティング」を参照してください。
-
OTLP レシーバーが OTel Collector でアクティブになり、トレースパイプラインに接続されていることを確認します。
-
OTel Collector がアドレス
http://<host>:4317を指していることを確認します。URL が正しいことを確認します。
スパン送信時の401エラー
トレースを Splunk Observability Cloud に直接送信して 401 エラーコードを受け取った場合、SPLUNK_ACCESS_TOKEN で指定した認証トークンが無効です。考えられる原因は次のとおりです。
-
値はnullです。
-
値が整形式トークンではありません。
-
このトークンは、
authScopeが ingest に設定されているアクセストークンではありません。
Splunk プラットフォームインスタンスに直接データを送信する場合は、有効な Splunk アクセストークンを使用していることを確認してください。「Splunk Observability Cloud を使用したユーザー API アクセストークンの取得と管理」を参照してください。
Webpackの互換性の問題
Splunk Distribution of OpenTelemetry JS では、Webpack を使ってバンドルされたモジュールをインストルメンテーションすることができません。OpenTelemetry はライブラリの require 呼び出しを傍受することでしかライブラリをインストルメンテーションできないからです。
バンドルされたモジュールを使用する Node.js アプリケーションをインストルメンテーションするには、 requireの呼び出しが OpenTelemetry から見えるように、Webpack externals 設定オプションを使用します。
以下の例では、 express フレームワークをインストルメンテーションするために、webpack.config.js ファイルを編集する方法を示しています:
module.exports = {
// ...
externalsType: "node-commonjs",
externals: [
"express"
// See https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node
// for a list of supported instrumentations. Use the require name of the library or framework,
// not the name of the instrumentation. For example, "tedious" instead of "instrumentation-tedious".
]
};
externals に追加すると、require メソッドを通して express フレームワークがロードされ、OpenTelemetry はそれをインストルメンテーションできるようになります。 node_modules メソッドが検出できるように、パッケージが require フォルダにあることを確認します。
# Install the library or framework and add it to node_modules
npm install express
http、net、dns などの Node.js コアモジュールを externals リストに追加する必要はありません。Node.js の AlwaysOn Profilingのトラブルシューティング
AlwaysOn Profilingに関する一般的な問題と修正については、以下を参照してください:
AlwaysOn Profilingが有効になっていることを確認する
SPLUNK_PROFILER_ENABLED 環境変数を true に設定して、プロファイラが有効になっていることを確認してください。「AlwaysOn Profiling の Node.js 設定」を参照してください。
サポートされていないNode.jsのバージョン
AlwaysOn Profiling を使用するには、Node.js をバージョン 16 以降にアップグレードします。
AlwaysOn Profiling のデータとログが Splunk Observability Cloud に表示されない
Collector 構成の問題により、AlwaysOn Profilingデータとログが Splunk Observability Cloud に表示されない場合があります。
この問題を解決するには、次のようにしてください:
-
Node.jsエージェントの設定、特に
SPLUNK_PROFILER_LOGS_ENDPOINTをチェックします。 -
Splunk Distribution of OpenTelemetry Collectorが期待されるエンドポイントで実行されていること、アプリケーションホストまたはコンテナがホスト名を解決して OTLP ポートに接続できることを確認します。
-
Splunk Distribution of OpenTelemetry Collector が実行されていて、バージョンが 0.34 以降であることを確認します。他のコレクタの配布では、プロファイリングデータを含むログデータをルーティングできない場合があります。
-
カスタム設定は、コレクタにプロファイリングデータを処理させる設定をオーバーライドする場合があります。
otlpレシーバとsplunk_hecエクスポータに正しいトークンとエンドポイントフィールドを設定してください。profilingパイプラインは、構成した OTLP レシーバと 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] __ ___ ___ _ ______ _____________ _____ ________ ___ ___ ___ ____ __ ___ ____ ____ __ ______ _____________ ______ ___ ___ ___ ____ __ ___ _________ _____
_________ __ ______ _____________ _____ _________
-
______ _ ____ __ ___ ______ _______ _______
-
_______ ______ ________
_________ __ ___________ _________ ___ ____ _____ _____
-
___ _ ________ ___ ___ _______ _______ _________ _______ __ ______ ________
-
____ ___ ______ ______________ ____ _____ _____ _______ __ ___________ ____ __________ _________ ___ ______ _________ __________ __ _____ ___ ____ _______