ロギング

Instana でログを使用するには、以下のオプションがあります。

  • アプリケーション・ログおよびサービス・ログを自動的に収集します。 詳しくは、 ログ・メッセージを参照してください。
  • Kubernetes およびコンテナーのコンテキスト内のログを使用して、ログをメトリックおよびトレースと相関させます。 詳しくは、 Analyze Kubernetes logsを参照してください。
  • 追加のメッセージでトレースまたは呼び出しを強化します。 詳しくは、 Instana トレース SDKを参照してください。
  • 専用のロギング製品と統合します。 詳しくは、 ロギングの統合を参照してください。

ログの分析

Unbounded Analyticsのようにログを詳しく調べます。ここでは、ログ関連のすべての情報を確認できます。また、ログをスライスしてダイスすることで、トラブルシューティングの手順に役立てることができます。

ロギング分析の表示

以下のようにして、Analytics アプリケーションのドロップダウン・リストでロギング情報を見つけることができます。

フィルタリングおよびグループ化

以下の 3 つの方法でデータをフィルタリングできます。

  • 照会ビルダー
  • ログ内から
  • フィルター・サイドバー

それぞれの方法を個別に使用できますが、これらの方法を組み合わせると最良の結果が得られます。

照会ビルダー

初期結果セットをフィルタリングするには、 「分析」 ダッシュボードの 「照会ビルダー」 を使用します。 「フィルターの追加」をクリックすると、セクションで分割されたカタログからさまざまなフィルターを適用できます。 クイック検索機能は、より迅速にフィルタリングにアクセスするのに役立ちます。 ログの任意の属性 ( レベルメッセージストリームカスタム・タグスナップショットトレース ID 、および 例外など) を使用してフィルターに掛けることができます。 Instana によって監視されるテクノロジーに関連する追加フィルターも使用できます。 これらのフィルターのいずれかを選択すると、フィルター領域にコンストラクターが表示され、「等しい」演算子がデフォルトとなり、関連する値を入力するための入力フィールドが表示されます。 標準値または関連する Instana エンティティーの場合、ドロップダウン・リストにいくつかの提案が表示されます。 問題のトラブルシューティングを行う際、 「is present」 演算子を使用してフィルタリングし、 例外に対するクイック照会を行うことができます。

複数のフィルターを追加すると、デフォルトとして AND ブール演算子が表示されます。 オペレーターを変更するには、それをクリックします。 トラブルシューティング・ジャーニーの任意の時点で、フィルターまたは演算子のいずれかを削除する必要がある場合は、フィルターまたは演算子をクリックし、「x」記号をクリックします。

グループ化を適用するには、 「グループの追加」をクリックし、タグの 1 つを選択します。 グループ化の一般的なユース・ケースは、どのサービスまたはホストがより多くのログを生成しているかを調べることです。これにより、検索の範囲を絞り込むことができます。

この場合、 「ログの数 (Number of logs)」 データの近くにあるファネル・アイコンをクリックすることで、 ホスト名を持つグループ にフォーカスを置く ip-10-255-219-199 ことができます。 その後、Instana はこのホスト名をフィルターとして追加し、ホスト・グループを削除します。

ログ内から

ログ・メッセージに カスタム・タグが含まれている場合、それらのタグはグレーで強調表示されます。これらのタグをクリックするだけで、フィルターとして照会ビルダーに追加できます。 以下の例では、リモート・アドレス 10.255.201.71 とリモート・ホスト 10.255.201.71を確認できます。 2 番目のイメージは、ログ・メッセージ内からフィルターとして カスタム・タグ を追加した結果を示しています。

ログを展開すると、ログ・タグ表が表示されます。この表では、ログに関連する追加情報がセクションに表示されます。 各行にカーソルを移動すると、コンテキスト・アクションが提供されます。 ログ内でコンテキスト・アクションを使用する場合は、アクションを実行し、ソース・ログを含むログ・リストを表示できます。これは、トラブルシューティング・フローを容易にするために開かれています。

使用可能なコンテキスト・アクションと使用例

「タグでグループ化 (Group by Tag)」: 特定の時間フレームおよびフィルターのすべてのログが、その特定のタグおよび使用するさまざまな値でグループ化されているビューを表示します。 このビューは、特定のタグのログ・ボリュームのヒントを取得するのに便利です。 推奨される次のステップは、 「このグループにフォーカス」をクリックして、特定のタグと値がフィルターとして追加され、無限スクロールが使用可能になるようにすることです。 グループを展開すると、概要のみが表示され、このステップでは無限スクロールは使用できません。

フィルターとして追加: タグとその値をフィルターとして追加します。 デフォルトは「and」として追加されます。 以下の例では、ストリームは以前に適用されたフィルター「warn」に追加されます。

コピー: タグ値をクリップボードにコピーします。 タグ値は、チームのトラブルシューティング・チケットを作成するときに使用できます。

ライブ・モードでのエンティティー・スパーク・グラフおよびメトリックの読み取り

時刻ピッカー領域でライブ・モードをアクティブにすると、ログ内の Spark チャート および 「メトリック」 セクションでライブ情報を確認できます。 以下の例では、スパーク・グラフ上のさまざまな値を検査する方法と、メトリック値が時間とともにどのように変化するかを確認できます。

サイド・フィルター・バーから

サイド・バーを使用すると、クエリー・ビルダーと組み合わせて、ログ内で柔軟にフィルタリングおよびグループ化を行うことができます。 サイド・フィルター・バーでは、3 つのメイン・タグ ( 「ログ・レベル」「ストリーム」 、および 「サービス」) でフィルタリングおよびグループ化を行うことができます。 フィルターを適用する前でも、カテゴリーの近くに表示される数を確認することで、そのタグのさまざまな値ごとにログの数に関するヒントを得ることができます。 以下の例では、エラー・タグに対して 30.3k 個のログが提供されていることが分かります。 値のボックスにチェック・マークを付けると、その値がフィルターに追加されます。 値を削除するには、値のボックスをクリアします。 フィルターによるグループ化は、メイン・カテゴリー・タイトルの近くにあるアイコンから直接行うことができます。

チームとの共有

チームの他のメンバーと情報を共有するために必要なログを処理します。 特定のログのリンク・ボタンをクリックすると、チームとショート・リンクを共有できます。 他のユーザーがリンクを使用すると、コラボレーションを容易にするために、Instana は同じ画面を表示し、時間フレーム、フィルター、およびソース・ログが強調表示されます。これらは画面の中心に表示されます。

複数行ログ・メッセージおよびスタック・トレースの処理

Instana は、コンテナー (Docker および containerd) からの複数行ログ・メッセージおよびスタック・トレースをサポートしています。 複数行のログ・メッセージとスタック・トレースは単一のイベントとして集約されるため、問題のトラブルシューティングが簡素化されます。

複数行ログ・メッセージ

複数行ログ・メッセージは、通常、個別の単一ログ・メッセージとして送信されます。 Instana は、タイム・スタンプに基づいて、単一の複数行ログ・メッセージの一部である個々のログ・メッセージを識別します。 タイム・スタンプを持つ最新のログ・メッセージから開始すると、タイム・スタンプを持たない後続の各ログ・メッセージは、複数行ログ・メッセージの一部と見なされます。

以下の例は、複数行ログ・メッセージを示しています。

例 1
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.5)

2024-04-18T17:04:11.851Z  INFO 13524 --- [           main] o.s.b.d.f.logexample.MyApplication       : Starting MyApplication using Java 17.0.11 with PID 13524 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2024-04-18T17:04:11.905Z  INFO 13524 --- [           main] o.s.b.d.f.logexample.MyApplication       : No active profile set, falling back to 1 default profile: "default"
2024-04-18T17:04:16.256Z  INFO 13524 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2024-04-18T17:04:16.322Z  INFO 13524 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-04-18T17:04:16.323Z  INFO 13524 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.20]
2024-04-18T17:04:16.503Z  INFO 13524 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-04-18T17:04:16.513Z  INFO 13524 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 4332 ms
2024-04-18T17:04:18.401Z  INFO 13524 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path ''
2024-04-18T17:04:18.429Z  INFO 13524 --- [           main] o.s.b.d.f.logexample.MyApplication       : Started MyApplication in 8.19 seconds (process running for 9.711)
例 2
2023-10-08T08:49:17.645+00:00 | INFO | nstana-sensor-scheduler-thread-1 | PackageInstaller | com.instana.discovery-python - 1
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/pip/_internal/cli/base_command.py", line 223, in _main 
  	status = self.run(options, args)
  File "/usr/local/lib/python3.6/site-packages/pip/_internal/cli/req_command.py", line 180, in wrapper 
  	return func(self, options, args)
  File "/usr/local/lib/python3.6/site-packages/pip/_internal/commands/install.py", line 454, in run 
  	options.target_dir, target_temp_dir, options.upgrade
  File "/usr/local/lib/python3.6/site-packages/pip/_internal/commands/install.py", line 461, in _handle_target_dir
	ensure_dir(target_dir)
  File "/usr/local/lib/python3.6/site-packages/pip/_internal/utils/misc.py", line 117, in ensure_dir
	os.makedirs(path)
  File "/usr/lib64/python3.6/os.py", line 210, in makedirs 
  	makedirs (head, mode, exist_ok)
  File "/usr/lib64/python3.6/os.py", line 210, in makedirs 
  	makedirs (head, mode, exist_ok)
  File "/usr/lib64/python3.6/os.py", line 210, in makedirs 
  	makedirs (head, mode, exist_ok)
  [Previous line repeated 1 more time]
  File "/usr/lib64/python3.6/os.py", line 220, in makedirs
	mkdir(name, mode)
FileNotFoundError: [Errno 2] No such file or directory: '/proc/1710'

2023-10-08T08:49:21.317+00:00 | INFO_ | d8f6c8dac361e3387053486ae4957736 | Docker| com.instana.sensor-docker – 1.1.5

以下の図は、Instana ログ内の Java™ スタック・トレースの例を示しています。

スタック・トレース

Instana は、Java™、 Python、および Go アプリケーションからのスタック・トレースをサポートしています。 スタック・トレースは、アプリケーション・ログからの監視に基づいて言語ごとに既に決定されている正規表現に基づいて識別され、グループ化されます。

Java™ スタック・トレースの例
// Example 1:
Exception in thread "main" java.lang.RuntimeException: A test exception
  at com.stackify.stacktrace.StackTraceExample.methodB(StackTraceExample.java:13)
  at com.stackify.stacktrace.StackTraceExample.methodA(StackTraceExample.java:9)
  at com.stackify.stacktrace.StackTraceExample.main(StackTraceExample.java:5)

// Exception name: java.lang.RuntimeException
// Exception message: A test exception
// Stack trace: all lines


// Example 2:
com.instana.backend.common.exception.InstanaException: java.io.InterruptedIOException: Connection has been shut down
	at com.instana.backend.common.client.AbstractHttpClient.execute(AbstractHttpClient.java:217)
	at com.instana.groundskeeper.client.GroundskeeperClient.getHttpEndpointConfigs(GroundskeeperClient.java:360)
	at com.instana.spanprocessing.stream.common.ReloadingConfigCache.loadInternal(ReloadingConfigCache.java:79)
	at com.instana.spanprocessing.stream.common.ReloadingConfigCache$1.reload(ReloadingConfigCache.java:68)
	at com.instana.spanprocessing.stream.common.ReloadingConfigCache$1.reload(ReloadingConfigCache.java:59)
	at com.github.benmanes.caffeine.cache.CacheLoader.lambda$asyncReload$2(CacheLoader.java:190)
	at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1700)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.io.InterruptedIOException: Connection has been shut down
	at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:342)
	at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
	at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
	at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
	at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
	at com.instana.backend.common.client.AbstractHttpClient.executeInternalRequest(AbstractHttpClient.java:238)
	at com.instana.backend.common.client.AbstractHttpClient.execute(AbstractHttpClient.java:212)
	... 9 common frames omitted
Caused by: org.apache.http.impl.conn.ConnectionShutdownException: null
	at org.apache.http.impl.conn.CPoolProxy.getValidConnection(CPoolProxy.java:77)
	at org.apache.http.impl.conn.CPoolProxy.getSSLSession(CPoolProxy.java:137)
	at org.apache.http.impl.client.DefaultUserTokenHandler.getUserToken(DefaultUserTokenHandler.java:82)
	at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:326)
	... 16 common frames omitted

// Exception name: com.instana.backend.common.exception.InstanaException
// Exception message: java.io.InterruptedIOException: Connection has been shut down
// Stack trace: all lines


// Example 3 (suppressed exceptions):
Exception in thread "main" java.lang.RuntimeException: I wanted to access this resource. Bad luck. Its dirty resource !!!
    at DirtyResource.accessResource(DirtyResource.java:9)
    at SuppressedExceptionDemoWithTryWithResource.main(SuppressedExceptionDemoWithTryWithResource.java:12)
    Suppressed: java.lang.NullPointerException: Remember me. I am your worst nightmare !! I am Null pointer exception !!
        at DirtyResource.close(DirtyResource.java:19)
        at SuppressedExceptionDemoWithTryWithResource.main(SuppressedExceptionDemoWithTryWithResource.java:13)
		Caused by: org.apache.http.impl.conn.ConnectionShutdownException: null
				at org.apache.http.impl.conn.CPoolProxy.getValidConnection(CPoolProxy.java:77)

// Exception name: java.lang.RuntimeException
// Exception message: I wanted to access this resource. Bad luck. Its dirty resource !!!
	// Stack trace: all lines
Python スタック・トレースの例
# Example 1:
Traceback (most recent call last):
  File "example.py", line 5, in <module>
    say('Micheal')
  File "example.py", line 3, in say
    print('Hello, ' + nam)
NameError: name 'nam' is not defined

# Exception type: NameError
# Exception message: name 'nam' is not defined
# Stack trace: all lines


# Example 2 (handling an exception raises another exception, with logger used to log):
ERROR:root:Everything is broken
Traceback (most recent call last):
  File "/tmp/spam2.py", line 13, in throws
    1 / 0
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
 File "/tmp/spam2.py", line 18, in <module>
    f1()
  File "/tmp/spam2.py", line 2, in f1
    f2()
  File "/tmp/spam2.py", line 5, in f2
    f3()
  File "/tmp/spam2.py", line 8, in f3
    throws()
  File "/tmp/spam2.py", line 15, in throws
    raise Exception("boom")
Exception: boom

# Exception type: ZeroDivisionError
# Exception message: division by zero
# Stack trace: all lines


# Example 3 (source not available):
Traceback (most recent call last):
  File "example.py", line 5, in <module>
  File "example.py", line 3, in say
NameError: name 'nam' is not defined

# Exception type: NameError
# Exception message: name 'nam' is not defined
# Stack trace: all lines
Golang スタック・トレースの例
panic: This is the message

goroutine 35 [running]:
main.m2(...)
 /tmp/sandbox1090018372/prog.go:19
main.m1()
 /tmp/sandbox1090018372/prog.go:15 +0x27
created by main.myGoRoutine
 /tmp/sandbox1090018372/prog.go:8 +0x25

以下の図は、Instana ログからの Java™ スタック・トレースの例を示しています。

ロギングの統合

Instana は、Instana とこれらのロギング・プロバイダーの間の流動的なワークフローを有効にするために、外部ロギング・プロバイダーからのログの統合をサポートしています。 統合後、Instana UI から外部ロギング・プロバイダー UI にリダイレクトされ、ログを表示できます。

テクノロジー 詳細
Coralogix リンク
ELK リンク
Humio リンク
Mezmo リンク
Splunk リンク

ログの削除

個人情報 (PII) がログ・メッセージに表示されている場合は、Instana UI の 「設定」 > 「ログ管理」 > 「ログの削除」 をクリックして、すべてのログを削除できます。 この「設定」ページには、この機能の簡単な説明、ログ削除を開始するために使用されるボタン、以前のログ削除をリストする要約表、および以下の情報が表示されます。

  • 削除が開始された正確な日付
  • 削除理由
  • 削除されたログの数
  • ログを削除したイニシエーター
  • 削除の状況。

ログを削除するには、 「ログの削除」をクリックします。 削除の理由を入力し、決定を確認するために指定のフィールドに LOGS と入力します。 次に、 「ログの削除」をクリックします。 プロセスが中断されないため、ダイアログを閉じることができます。 削除が完了すると、結果 (Success または Failure) がダイアログに表示され、要約テーブルに新しい項目が作成されます。