Pipeline error log
==================

各パイプラインにはエラーログテーブルがあります。レコードが任意のステップで失敗すると、ログは、ソースレコードID、失敗したステップ、操作タイプ、およびエラーメッセージをキャプチャします。バッチの残りの部分は処理を継続します。

その仕組み
----------

- レコードに失敗すると、ソースID、失敗したステップ番号、操作タイプ、エラーメッセージとともに\ ``{source_schema}.pipeline_{pipeline_name}_errors``
  ログに記録されます。

- 単一の不良レコードはパイプラインをブロックしません。バッチ内の他のレコードは、残りのすべてのステップを続行します。

- エラーログテーブルはパイプラインで作成され、パイプラインが削除されるときに削除されます。

- エラーは4つの\ ``error_category`` 値のいずれかを取得します。

.. csv-table::
  :header: Category,Scope,Blocks pipeline?,Description
  :widths: 15,12,12,20
  :align: left
  :class: longtable

  `RecordTemporary`,Record,No,単一レコードの一時的な障害。再試行で成功する場合があります。
  `RecordPermanent`,Record,No,単一のレコードの永続的な障害たとえば、破損したデータ。
  `PipelineTemporary`,Pipeline,Yes,ステップ全体を停止した一時的な障害たとえば、サービスの停止。再試行で解決される場合があります。
  `PipelinePermanent`,Pipeline,Yes,ステップ全体を停止した永続的な障害たとえば、無効なモデル構成。

``RecordTemporary`` および\ ``RecordPermanent``
エラーはパイプラインをブロックしません。他のレコードは処理を継続します。
``PipelineTemporary`` および\ ``PipelinePermanent``
エラーは、ステップ全体をブロックします。一時的なエラーは、再試行すると解決される場合があります。永続的なエラーは、不正なデータまたは構成ミスを示しています。

エラーのクエリー
----------------

``aidb.get_error_logs()``
を使用して、パイプラインのエラーログを検査します。

.. code:: sql

   SELECT * FROM aidb.get_error_logs(my_pipeline);

   __OUTPUT__
    id | source_id | part_ids | pipeline_step | step_operation | error_message                          | error_category    | failed_at                  | retry_count | last_retry_at
   - ---+-----------+----------+---------------+----------------+----------------------------------------+-------------------+----------------------------+-------------+---------------
     3 | doc_99    | {0,2}    |             2 | ChunkText      | text segment exceeded maximum length   | RecordPermanent   | 2026-04-10 14:32:01.123+00 |           0 |
     2 | doc_42    | {0}      |             1 | ParsePdf       | failed to extract text from page 0     | RecordPermanent   | 2026-04-10 14:31:58.456+00 |           0 |
     1 | doc_7     |          |             1 | ParsePdf       | corrupt PDF header                     | RecordPermanent   | 2026-04-10 14:31:55.789+00 |           0 |
   (3 rows)

ソースレコード、ステップ番号、またはエラーカテゴリでフィルタリングします。

.. code:: sql

   SELECT * FROM aidb.get_error_logs(
       my_pipeline,
       p_source_id => doc_42
   );

.. code:: sql

   SELECT * FROM aidb.get_error_logs(
       my_pipeline,
       p_pipeline_step  => 1::smallint,
       p_error_category => RecordPermanent
   );

``p_limit`` および\ ``p_offset`` を使用したページ付け

.. code:: sql

   SELECT * FROM aidb.get_error_logs(my_pipeline, p_limit => 20, p_offset => 40);

完全なパラメーターと戻り型の詳細については、
:ref:`Operations reference <Operations reference>` を参照してください。

エラーの概要
------------

1つのパイプラインのステップ、オペレーション、およびカテゴリ別にグループ化されたエラー数を取得します。

.. code:: sql

   SELECT * FROM aidb.get_error_log_summary(my_pipeline);

   __OUTPUT__
    pipeline_step | step_operation | error_category    | error_count | latest_failed_at
   - --------------+----------------+-------------------+-------------+----------------------------
                1 | ParsePdf       | RecordPermanent   |           2 | 2026-04-10 14:31:58.456+00
                2 | ChunkText      | RecordPermanent   |           1 | 2026-04-10 14:32:01.123+00
   (2 rows)

または、すべてのパイプラインで同じロールアップを一度に取得します。

.. code:: sql

   SELECT * FROM aidb.get_all_error_summaries();

   __OUTPUT__
    pipeline_name | pipeline_step | step_operation | error_category    | error_count | latest_failed_at
   - --------------+---------------+----------------+-------------------+-------------+----------------------------
    my_pipeline   |             1 | ParsePdf       | RecordPermanent   |           2 | 2026-04-10 14:31:58.456+00
    my_pipeline   |             2 | ChunkText      | RecordPermanent   |           1 | 2026-04-10 14:32:01.123+00
    pdf_ingester  |             1 | ParsePdf       | PipelinePermanent |           1 | 2026-04-10 15:00:12.000+00
   (3 rows)

エラーのクリア
--------------

IDで特定のエラーログエントリを削除します。

.. code:: sql

   SELECT aidb.clear_error_logs(my_pipeline, ARRAY[1, 3]);

   __OUTPUT__
    clear_error_logs
   - -----------------
                   2
   (1 row)

削除された行数を返します。クリアはIDベースです。エントリを削除する前に\ ``get_error_logs()``
で確認してください。

失敗したレコードの再試行
------------------------

!!!注 ``aidb.retry_pipeline_errors()``
はまだ利用できません。将来のリリースに含まれる予定です。
:ref:`Known issues <Known issues>` を参照してください。

``aidb.retry_pipeline_errors()``
は、利用可能な場合、失敗したステップから特定のエラーログエントリを再処理します。

.. code:: sql

   SELECT * FROM aidb.retry_pipeline_errors(my_pipeline, ARRAY[1, 2]);

   __OUTPUT__
    error_id | status   | error_message
   - ---------+----------+--------------------------------------------
           1 | resolved |
           2 | failed   | failed to extract text from page 0
   (2 rows)

解決されたエントリはエラーログから削除されます。失敗した再試行は、インクリメントされた\ ``retry_count``
および更新された\ ``last_retry_at``
タイムスタンプとともにログに残ります。

パイプラインステータスの統合
----------------------------

エラー数は :ref:`promoteb.pipeline_metrics <promoteb.pipeline_metrics>` ビューにも表示されます。パイプラインステータスはエラーの重大度を反映します。

- ``PartialErrors`` —
  一部のレコードは失敗しました。残りは通常に処理されました。

- ``BlockingErrors``
  —パイプラインレベルのエラーにより、ステップが完全に停止しました。

パイプラインの状態のモニタリングの詳細については、
:ref:`モニタリングとオブザーバビリティ <モニタリングとオブザーバビリティ>` を参照してください。
