背景
検索分析ログでクエリタイムアウトが表示された場合の対処方法:
1. クエリ時間範囲が長すぎるために単一クエリのデータ量が大きすぎる場合は、タイマーSQL分析を使用して、そのクエリを複数の小範囲クエリに分割し、その結果を集計することをお勧めします。
2. クエリ結果がすべて数値型である場合は、タイマーSQL分析を使用してログを指標Metricに変換し、さらにPromQLを使用して指標を計算分析できます。そのクエリ性能はログよりも高く、ログクエリのタイムアウト問題を効果的に解決できます。 本文では、クエリを複数の小範囲クエリに分割し、その結果を集計する詳細な操作について説明します。
操作手順
考え方:クエリ時間範囲の分割
タイマーSQLを使用すると、ログトピックAにおける1つの長時間範囲クエリを複数の短時間範囲クエリに分割できます。例えば、1日間のデータをクエリする場合、12個の2時間クエリに分割し、クエリ結果を新しいログトピックBに保存できます。ログトピックBでクエリ結果を確認したり、ログトピックBで検索分析を続行したりできます。このソリューションはすでに本番環境で適用されており、検索分析のタイムアウト問題を効果的に解決できます。
事例:
1. ユーザーがソースログトピック:cls_service_logで、データ範囲2023-12-13 12:00:00 - 2023-12-13 12:15:00をクエリし、クエリがタイムアウトしたと仮定します。ステートメントは以下の通りです:
select sum(etl_input_line) as input_lines ,sum(etl_failure_line) as failed_lines , etl_task_id group by etl_task_id
定时SQL分析の構成は以下の通りです:
ソースログトピック:分割クエリが必要なログトピックとして構成します。例ではcls_service_logです。
書き込み先:ログトピックを選択します。例ではsql_resultです。
スケジュール範囲:2023-12-13 12:05:00 - 2023-12-13 12:15:00(実際にクエリされるのは12:00:00 -12:15:00のデータです。スケジュール詳細でSQL時間枠を確認できます。SQL時間枠はクエリの範囲です)
スケジュール周期:5分間
SQL時間枠:@m-5m,@m
SQLステートメント(CQL):
*|select sum(etl_input_line) as input_lines ,sum(etl_failure_line) as failed_lines , etl_task_id group by etl_task_id
説明:
例中の定时SQL分析で使用するステートメントは検索分析のものと同じです。ただし、一部のビジネスシナリオでは、例えばDistinct、Avg、TOP Nの計算がある場合、ビジネス要件に応じてSQLステートメントを調整する必要があります。
定时SQL分析のスケジュール詳細で確認できます。元の1つの15分範囲のクエリが、3つの5分範囲のクエリに分割されています。3つのクエリのSQL時間枠を合計すると、ちょうど元の時間範囲12:00-12:15になります。
3. ターゲットトピック sql_resultを開いてデータを確認します:
定时SQL分析で処理されるデータは以下の通りです。input_linesとfailed_linesは、定时SQL内で3回に分けて(毎回5分間のsum値を計算して)書き込まれます。そのため、結果データに対して再度sumを実行すると、元のビジネスシナリオにおける15分間のinput_linesとfailed_linesのsum値を取得できます。
4. ターゲットログトピック内で検索します
ターゲットログトピック sql_resultでSQLステートメントを実行します:
select sum(input_lines) as input_lines, sum(failed_lines) as failed_lines,etl_task_id group by etl_task_id
下図のような結果が得られ、ソースログトピック:cls_service_logで直接検索分析した結果と一致します(タイムアウトがない場合)。
結論
クエリがタイムアウトした場合、定时SQLを使用してソースログデータを事前計算(クエリ範囲の分割)した後、ターゲットログトピックで検索するか、またはダッシュボードやアラートを設定できます。これにより、ログデータの計算分析能力を効果的に向上できます。