アプリのログとイベントトレースを使用する

このトピックでは、プロバイダーがログメッセージとトレースイベントを記録するために Snowflake Native App を設定する方法について説明します。

アプリのログメッセージとトレースイベントについて

Snowflake Native App Framework は、アプリに関する情報を収集するために、Snowflake のロギングとトレース 機能の使用をサポートしています。プロバイダーは、以下のことを記録・分析するアプリを設定することができます:

  • ログメッセージ は、コードの特定部分の状態に関する情報を含む、独立した詳細なメッセージです。

  • 構造化データを使用した トレースイベント は、プロバイダーがコードの複数の部分にまたがる情報やグループ化された情報を取得するために使用できます。 トレース・イベントは、アプリがそのパフォーマンスや動作に関連する情報を発信することを可能にします。

  • Metrics - Snowflake が生成する CPU とメモリメトリクスに基づく、ストアドプロシージャと UDF のリソース消費に関する情報。

アプリがログメッセージとトレースイベントを出力するように設定するには、プロバイダーはマニフェストファイルでログレベルとトレースレベルを設定します。アプリのログとトレースのレベルを設定する をご参照ください。

プロバイダーは、コンシューマがログメッセージとトレースイベントをプロバイダーと共有できるように、イベント共有を使用するようにアプリを構成することもできます。詳しくは イベントの共有について をご参照ください。

アプリケーションのライフサイクルイベントについて

Snowflakeは、|native-app|のステータスと履歴を可視化するイベントを記録します。Snowflakeが提供するこれらのイベントは、*アプリケーションライフサイクルイベント*と呼ばれます。

たとえば、アップグレード中にエラーが発生してコンシューマーのアプリインスタンスが失敗した状態に移行した場合は、アプリケーションライフサイクルイベントを使用してこの履歴イベントを表示することができます。

Snowflakeは、これらのアプリケーションライフサイクルイベントをアカウントの:doc:イベントテーブル</developer-guide/logging-tracing/event-table-setting-up>`に記録します。デフォルトでは、アプリケーションのライフサイクルイベントはログに記録されません。アプリケーションのライフサイクルイベントのログを有効にするには、:ref:`マニフェストファイルのログレベルプロパティ<label-manifest_configuration_log_level>`でログおよびトレースのレベルを設定します。詳細については、 :ref:`label-nativeapps_provider_logging_configure をご参照ください。

マニフェストファイルの:code:`log_level`プロパティの値によって、イベントテーブルに記録されるイベントの重大度が決まります。アプリケーションのライフサイクルイベントは、次の重大度レベルをサポートします。

  • TRACE

  • DEBUG

  • INFO

  • WARN

  • ERROR

  • FATAL

  • OFF

注釈

各ログレベルには、それより下位のすべてのレベルの記録が含まれます。たとえば、ログレベルを:code:`WARN`に設定すると、:code:`ERROR`および:code:`FATAL`イベントも記録されます。

アプリケーションのライフサイクルイベントのクエリ

アプリケーションのログレベルを構成すると、SnowflakeはアプリケーションのライフサイクルイベントをSnowflakeアカウントのアクティブイベントテーブルに記録します。イベントテーブルをクエリしてそれらの結果を表示できます。

次のSELECTステートメントは、過去1時間に記録された特定のアプリのアプリケーションライフサイクルイベントを取得します。

SELECT TIMESTAMP, RESOURCE_ATTRIBUTES, RECORD, VALUE
  FROM <your_event_table>
  WHERE TIMESTAMP > DATEADD(hour, -1, CURRENT_TIMESTAMP())
    AND RESOURCE_ATTRIBUTES:"snow.application.name" = '<your_app_name>'
    AND RECORD_TYPE = 'EVENT'
  ORDER BY TIMESTAMP DESC
  LIMIT 10;
Copy

イベント共有について

イベント共有により、プロバイダーはアプリのパフォーマンスや動作に関する情報を収集できます。プロバイダーは、コンシューマがログメッセージとトレースイベントをプロバイダーと共有することを要求するように、アプリを構成することができます。イベント共有は、プロバイダーとコンシューマーが、アプリによって発行されたログメッセージとトレースイベントを保存するために、アカウントにイベントテーブルを設定することを必要とします。

イベント共有が有効な場合、コンシューマ・アカウントのイベント・テーブルに挿入されるログ・メッセージとトレース・イベントは、プロバイダー・アカウントのイベント・テーブルにも挿入されます。

注釈

:code:`RECORD_TYPE`が:code:`EVENT`であるイベントのうち、イベント共有をサポートしているのは、|native-apps|のアプリケーションライフサイクルイベントと|SPCS|のプラットフォームイベントのみです。

イベント共有を使用する際の考慮事項

アプリのロギングとイベント共有を設定する前に、プロバイダーは以下を考慮する必要があります:

  • プロバイダーは、データインジェスチョンやストレージなど、プロバイダー側でのイベント共有に関連するすべてのコストを負担します。

  • プロバイダーは、イベント共有をサポートする各リージョンで、 共有イベントを保存するためのアカウント を持っている必要があります。

  • プロバイダーは、マニフェストファイルで、アプリケーションのデフォルトのログレベルとトレースレベルを定義する必要があります。

以前のイベント共有機能から移行する際の注意点

既存のイベント共有機能からイベント定義の使用に移行する場合、プロバイダーは以下を考慮する必要があります。

  • 以前のイベント共有機能は、 OPTIONAL ALL のイベント定義に相当します。

  • 以前の機能を使用していたアプリの公開バージョンとパッチは、デフォルトで OPTIONAL ALL イベント定義を持ちます。プロバイダーは、このイベント定義をマニフェスト・ファイルに追加する必要はありません。

イベント定義の使用を開始するには、プロバイダーはサポートされているイベント定義をマニフェストファイルに追加します。これは新規アプリだけでなく、既存アプリの新バージョンやパッチにも適用されます。

注釈

より詳細なログとイベントの共有を要求し始めるには、プロバイダーはマニフェストファイルにイベント定義を追加するだけでよいです。プロバイダーは他に何もする必要はありません。

ワークフロー - アプリのイベント共有を設定する

イベント共有は、コンシューマがプロバイダーとログメッセージやトレースイベントを共有することを可能にします。

以下のワークフローは、アプリのイベント共有を設定し、有効にする方法を示しています:

  1. プロバイダー は、アプリのログとトレース・レベル を設定します。

  2. プロバイダー はイベント定義 をマニフェストファイルに追加します。

    イベント定義は、アプリが発するログメッセージとトレースイベントのフィルターとして機能します。プロバイダーは、イベント定義を必須または任意に設定できます。

  3. プロバイダーは 、組織内にイベントテーブル を設定します。

  4. プロバイダーはアプリを公開します。

消費者がアプリをインストールすると、イベントテーブルを設定し、イベント共有を有効にすることができます。イベント共有のためのコンシューマ要件の詳細については、 Enable logging and event sharing for an app をご参照ください。

コンシューマーアプリケーションの健全性を監視する

APPLICATION_STATE ビューLAST_HEALTH_STATUS および LAST_HEALTH_STATUS_UPDATED_ON 列を使用して、アプリのコンシューマーインスタンスの健全性を監視できます。LAST_HEALTH_STATUS 列で可能な値は次のとおりです。

  • OK:コンシューマーインスタンスは正常です。

  • FAILED:コンシューマーインスタンスはエラー状態にあります。

  • PAUSED:コンシューマーは手動でアプリを一時停止しました。

次のコードサンプルは、 APPLICATION_STATE ビューを使用して、アプリのすべてのコンシューマーインスタンスの健全性ステータスを取得していることを示しています。

SELECT
    CONSUMER_ORGANIZATION_NAME,
    CONSUMER_ACCOUNT_NAME,
    LAST_HEALTH_STATUS,
    LAST_HEALTH_STATUS_UPDATE_TIME
FROM
    SNOWFLAKE.ACCOUNT_USAGE.APPLICATION_STATE
WHERE
    PROVIDER_ORG_NAME = '<your_provider_org_name>'
    AND APPLICATION_NAME = '<your_app_name>'
ORDER BY
    LAST_HEALTH_STATUS_UPDATE_TIME DESC;
Copy

上記のクエリは、次のような結果を返す場合があります。

CONSUMER_ORG_NAME    CONSUMER_ACCOUNT_NAME    LAST_HEALTH_STATUS    LAST_HEALTH_STATUS_UPDATE_TIME
------------------   ---------------------    ------------------    -------------------------------
consumer_org_1      consumer_account_1       OK                    2024-01-15 10:30:00.000
consumer_org_2      consumer_account_2       FAILED                2024-01-15 09:45:00.000
consumer_org_3      consumer_account_3       PAUSED                2024-01-14 16:20:00.000