ApsaraDB for ClickHouse は、すべてのクエリ実行を system.query_log に記録します。このテーブルをクエリすることで、追加のモニタリング設定を一切行わずに、エラー、遅延クエリ、高頻度クエリパターン、およびユーザー単位のアクティビティを特定できます。
クイックリファレンス
| シナリオ | セクション | 用途 |
|---|---|---|
| エラーが発生したクエリ | エラーを含むクエリの表示 | トラブルシューティング |
| 最近の書き込みアクティビティ | 最近の書き込みクエリの表示 | モニタリング |
| 最近の読み取りアクティビティ | 最近の非書き込みクエリの表示 | モニタリング |
| 高頻度クエリパターン | 頻繁に実行されるクエリの検出 | トラブルシューティング |
| 時間帯別のクエリ数およびレイテンシー | 時間間隔別実行統計の表示 | モニタリング |
| JOIN クエリの使用状況 | JOIN クエリのカウント | トラブルシューティング |
| ユーザー別アクティビティランキング | クエリ数によるユーザーのランキング | モニタリング |
前提条件
開始する前に、クエリログ記録が有効化されていることを確認してください。
デフォルトでは、ApsaraDB for ClickHouse でクエリログ記録が有効化されています。確認方法は以下のとおりです。
SHOW settings like 'log_queries';結果が 1 の場合、クエリログ記録は有効化されています。結果が 0 の場合は、以下のステートメントを実行して有効化してください。
SET GLOBAL ON CLUSTER default log_queries = 1;注意事項
クエリログには機密情報が含まれる可能性があります。そのため、
system.query_logテーブルへのアクセスは適切に管理してください。過剰なログ蓄積を防ぐため、クエリログを定期的にクリーンアップおよびアーカイブしてください。
デフォルトでは、
query_logテーブルの生存時間(TTL)は 15 日です。15 日を超えたログは自動的に削除されます。ディスク領域の使用量を削減するには、ApsaraDB for ClickHouse コンソールの [パラメーター設定] ページで TTL を調整します。トラブルシューティングに十分な履歴を保持するために、TTL を少なくとも 7 日間以上に設定してください。詳細については、「config.xml ファイルでのパラメーター設定」をご参照ください。
仕組み
本トピックのすべてのクエリでは、QueryStart イベント(type != 'QueryStart')を除外するため、各クエリは最終ステータスとともに結果に 1 回だけ表示されます。
各ノードが自身のクエリログデータのみを保存するため、すべてのクエリで clusterAllReplicas('default', system.query_log) を使用して、全ノードにわたる結果を集約します。substring(hostname(), 38, 8) を使用すると、特定のノード名で結果をフィルターできます。
ノード名を確認するには、次のコマンドを実行します。
SELECT * FROM system.clusters;または、ApsaraDB for ClickHouse コンソールの [クラスターモニタリング] タブを確認してください。詳細については、「クラスターのモニタリング情報を表示する」をご参照ください。
本トピックの例では、ノード名として s-2-r-0 を使用しています。実際のノード名に置き換えてください。エラーを含むクエリの表示
指定されたタイムウィンドウ内で失敗したクエリを特定するには、このクエリを使用します。エラーログにより、以下のような作業が可能になります。
exceptionフィールドから、問題の根本原因を直接特定できます。システム全体の問題を示す反復的な失敗を検出できます。
SQL インジェクションや不正アクセス試行などの潜在的なセキュリティ問題を特定できます。
クエリテンプレート
SELECT
written_rows,
written_bytes,
query_duration_ms,
event_time,
exception
FROM clusterAllReplicas('default', system.query_log) ql
WHERE event_time >= '2021-11-22 22:00:00'
AND event_time <= '2021-11-22 23:00:00'
AND lowerUTF8(query) LIKE '%insert into sdk_event_record_local%'
AND type != 'QueryStart'
AND exception_code != 0
AND substring(hostname(), 38, 8) = 's-2-r-0'
ORDER BY event_time DESC
LIMIT 30パラメーター
| パラメーター | 説明 | 例 |
|---|---|---|
<startTime> | 期間の開始時刻。フォーマット:yyyy-mm-dd hh:mm:ss | 2021-11-22 22:00:00 |
<endTime> | 期間の終了時刻。フォーマット:yyyy-mm-dd hh:mm:ss | 2021-11-22 23:00:00 |
<nodeName> | ノード名。すべてのノードを対象とする場合は、この行を削除してください。 | s-2-r-0 |
<x> | 返される最大行数 | 30 |
例
2021 年 11 月 22 日の 22:00:00 ~ 23:00:00 の間に、s-2-r-0 ノードで発生したエラーを表示し、最新の 30 件を取得します。
SELECT
written_rows,
written_bytes,
query_duration_ms,
event_time,
exception
FROM clusterAllReplicas('default', system.query_log) ql
WHERE event_time >= '2021-11-22 22:00:00'
AND event_time <= '2021-11-22 23:00:00'
AND lowerUTF8(query) LIKE '%insert into sdk_event_record_local%'
AND type != 'QueryStart'
AND exception_code != 0
AND substring(hostname(), 38, 8) = 's-2-r-0'
ORDER BY event_time DESC
LIMIT 30最近の書き込みクエリの表示
指定されたタイムウィンドウ内で実行された INSERT クエリについて、書き込まれた行数および転送されたバイト数を表示します。
クエリテンプレート
-- 最近の書き込みクエリ(バッチごとの行数およびバイト数を含む)を表示
SELECT
written_rows,
written_bytes,
query_duration_ms,
event_time
FROM clusterAllReplicas('default', system.query_log) ql
WHERE event_time >= '<startTime>'
AND event_time <= '<endTime>'
AND lowerUTF8(query) ILIKE '%insert into%'
AND type != 'QueryStart'
[AND substring(hostname(), 38, 8) = '<nodeName>']
ORDER BY event_time DESC
[LIMIT <x>]パラメーター
| パラメーター | 説明 | 例 |
|---|---|---|
<startTime> | 期間の開始時刻。フォーマット:yyyy-mm-dd hh:mm:ss | 2021-11-22 22:00:00 |
<endTime> | 期間の終了時刻。フォーマット:yyyy-mm-dd hh:mm:ss | 2021-11-22 23:00:00 |
<nodeName> | ノード名。すべてのノードを対象とする場合は、この行を削除してください。 | s-2-r-0 |
<x> | 返される最大行数 | 30 |
例
2021 年 11 月 22 日の 22:00:00 ~ 23:00:00 の間に、s-2-r-0 ノードで実行された書き込みクエリを表示し、最新の 30 件を取得します。
-- 最近の書き込みクエリ(バッチごとの行数およびバイト数を含む)を表示
SELECT
written_rows,
written_bytes,
query_duration_ms,
event_time
FROM clusterAllReplicas('default', system.query_log) ql
WHERE event_time >= '2021-11-22 22:00:00'
AND event_time <= '2021-11-22 23:00:00'
AND lowerUTF8(query) LIKE '%insert into sdk_event_record_local%'
AND type != 'QueryStart'
AND substring(hostname(), 38, 8) = 's-2-r-0'
ORDER BY event_time DESC
LIMIT 30最近の非書き込みクエリの表示
直近 N 分間に実行された SELECT クエリを表示します。メモリ使用量および例外も併せて表示されます。
クエリテンプレート
SELECT
event_time,
user,
query_id AS query,
read_rows,
read_bytes,
result_rows,
result_bytes,
memory_usage,
exception
FROM clusterAllReplicas('default', system.query_log)
WHERE event_date = today()
AND event_time >= (now() - <time>)
AND is_initial_query = 1
AND query NOT ILIKE 'INSERT INTO%'
[AND substring(hostname(), 38, 8) = '<nodeName>']
ORDER BY event_time DESC
[LIMIT <x>]パラメーター
| パラメーター | 説明 | 例 |
|---|---|---|
<time> | 過去何分間かの期間(分単位) | 60 |
<nodeName> | ノード名。すべてのノードを対象とする場合は、この行を削除してください。 | s-2-r-0 |
<x> | 返される最大行数 | 100 |
例
直近 60 分間に s-2-r-0 ノードで実行された非書き込みクエリを表示し、最大 100 件を取得します。
SELECT
event_time,
user,
query_id AS query,
read_rows,
read_bytes,
result_rows,
result_bytes,
memory_usage,
exception
FROM clusterAllReplicas('default', system.query_log)
WHERE event_date = today()
AND event_time >= (now() - 60)
AND is_initial_query = 1
AND query NOT LIKE 'INSERT INTO%'
AND substring(hostname(), 38, 8) = 's-2-r-0'
ORDER BY event_time DESC
LIMIT 100頻繁に実行されるクエリの検出
指定されたタイムウィンドウ内で、最小実行回数を超える非書き込みクエリを特定します。結果は平均持続時間でソートされるため、高頻度かつ遅延の大きいクエリを容易に特定できます。
クエリテンプレート
SELECT *
FROM (
SELECT
LEFT(query, 100) AS SQL,
count() AS queryNum,
sum(query_duration_ms) AS totalTime,
totalTime / queryNum AS avgTime
FROM clusterAllReplicas('default', system.query_log) ql
WHERE event_time > toDateTime('<startTime>')
AND event_time < toDateTime('<endTime>')
AND query NOT LIKE '%INSERT INTO%'
AND substring(hostname(), 38, 8) = '<nodeName>'
GROUP BY SQL
ORDER BY avgTime DESC
)
WHERE queryNum > <queryNum>
[LIMIT <x>]パラメーター
| パラメーター | 説明 | 例 |
|---|---|---|
<startTime> | 期間の開始時刻。フォーマット:yyyy-mm-dd hh:mm:ss | 2022-09-23 12:00:00 |
<endTime> | 期間の終了時刻。フォーマット:yyyy-mm-dd hh:mm:ss | 2022-09-23 17:00:00 |
<queryNum> | 最小実行回数のしきい値 | 1000 |
<nodeName> | ノード名 | s-2-r-0 |
<x> | 返される最大行数 | 50 |
例
2022 年 9 月 23 日の 12:00:00 ~ 17:00:00 の間に、s-2-r-0 ノードで 1,000 回以上実行された非書き込みクエリを検出します。
SELECT *
FROM (
SELECT
LEFT(query, 100) AS SQL,
count() AS queryNum,
sum(query_duration_ms) AS totalTime,
totalTime / queryNum AS avgTime
FROM clusterAllReplicas('default', system.query_log) ql
WHERE event_time > toDateTime('2022-09-23 12:00:00')
AND event_time < toDateTime('2022-09-23 17:00:00')
AND query NOT LIKE '%INSERT INTO%'
AND substring(hostname(), 38, 8) = 's-2-r-0'
GROUP BY SQL
ORDER BY avgTime DESC
)
WHERE queryNum > 1000
LIMIT 50時間間隔別実行統計の表示
クエリ数および平均持続時間を、時間単位または分単位で集計します。これらのクエリを使用すると、時間経過に伴うトラフィックスパイクおよびレイテンシー劣化を検出できます。
時間単位
クエリテンプレート
-- 時間単位の実行統計を表示
SELECT
toHour(event_time) AS t,
count() AS queryNum,
sum(query_duration_ms) AS totalTime,
totalTime / queryNum AS avgTime
FROM clusterAllReplicas('default', system.query_log) ql
WHERE event_time > toDateTime('<startTime>')
AND event_time < toDateTime('<endTime>')
AND query NOT LIKE '%INSERT INTO%'
AND query LIKE '%Faulty container%'
AND read_rows != 0
AND substring(hostname(), 38, 8) = '<nodeName>'
GROUP BY t
[LIMIT <x>]パラメーター
| パラメーター | 説明 | 例 |
|---|---|---|
<startTime> | 期間の開始時刻。フォーマット:yyyy-mm-dd hh:mm:ss | 2022-09-23 08:00:00 |
<endTime> | 期間の終了時刻。フォーマット:yyyy-mm-dd hh:mm:ss | 2022-09-23 17:00:00 |
<nodeName> | ノード名 | s-2-r-0 |
<x> | 返される最大行数 | 50 |
例
2022 年 9 月 23 日の 08:00:00 ~ 17:00:00 の間に、s-2-r-0 ノードで収集された時間単位のクエリ統計を表示します。
-- 時間単位の実行統計を表示
SELECT
toHour(event_time) AS t,
count() AS queryNum,
sum(query_duration_ms) AS totalTime,
totalTime / queryNum AS avgTime
FROM clusterAllReplicas('default', system.query_log) ql
WHERE event_time > toDateTime('2022-09-23 08:00:00')
AND event_time < toDateTime('2022-09-23 17:00:00')
AND query NOT LIKE '%INSERT INTO%'
AND query LIKE '%Faulty container%'
AND read_rows != 0
AND substring(hostname(), 38, 8) = 's-2-r-0'
GROUP BY t
LIMIT 50分単位
クエリテンプレート
-- 分単位の実行統計を表示
SELECT
toMinute(event_time) AS t,
count() AS queryNum,
sum(query_duration_ms) AS totalTime,
totalTime / queryNum AS avgTime
FROM clusterAllReplicas('default', system.query_log) ql
WHERE event_time > toDateTime('<startTime>')
AND event_time < toDateTime('<endTime>')
AND query NOT LIKE '%INSERT INTO%'
AND query LIKE '%Faulty container%'
AND read_rows != 0
AND substring(hostname(), 38, 8) = '<nodeName>'
GROUP BY t
[LIMIT <x>]パラメーター
| パラメーター | 説明 | 例 |
|---|---|---|
<startTime> | 期間の開始時刻。フォーマット:yyyy-mm-dd hh:mm:ss | 2022-09-23 12:00:00 |
<endTime> | 期間の終了時刻。フォーマット:yyyy-mm-dd hh:mm:ss | 2022-09-23 13:00:00 |
<nodeName> | ノード名 | s-2-r-0 |
<x> | 返される最大行数 | 50 |
例
2022 年 9 月 23 日の 12:00:00 ~ 13:00:00 の間に、s-2-r-0 ノードで収集された分単位のクエリ統計を表示します。
-- 分単位の実行統計を表示
SELECT
toMinute(event_time) AS t,
count() AS queryNum,
sum(query_duration_ms) AS totalTime,
totalTime / queryNum AS avgTime
FROM clusterAllReplicas('default', system.query_log) ql
WHERE event_time > toDateTime('2022-09-23 12:00:00')
AND event_time < toDateTime('2022-09-23 13:00:00')
AND query NOT LIKE '%INSERT INTO%'
AND query LIKE '%Faulty container%'
AND read_rows != 0
AND substring(hostname(), 38, 8) = 's-2-r-0'
GROUP BY t
LIMIT 50JOIN クエリのカウント
指定されたタイムウィンドウ内で実行された JOIN クエリのボリュームおよび平均持続時間を表示します。このクエリを使用して、JOIN 操作がクラスターのパフォーマンスに与える影響を評価できます。
クエリテンプレート
SELECT *
FROM (
SELECT
LEFT(query, 100) AS SQL,
count() AS queryNum,
sum(query_duration_ms) AS totalTime,
totalTime / queryNum AS avgTime
FROM clusterAllReplicas('default', system.query_log) ql
WHERE query LIKE '%JOIN%'
AND read_rows != 0
AND event_time > toDateTime('<startTime>')
AND event_time < toDateTime('<endTime>')
AND query NOT LIKE '%INSERT INTO%'
AND substring(hostname(), 38, 8) = '<nodeName>'
GROUP BY SQL
ORDER BY queryNum DESC
)パラメーター
| パラメーター | 説明 | 例 |
|---|---|---|
<startTime> | 期間の開始時刻。フォーマット:yyyy-mm-dd hh:mm:ss | 2022-09-23 12:00:00 |
<endTime> | 期間の終了時刻。フォーマット:yyyy-mm-dd hh:mm:ss | 2022-09-23 21:00:00 |
<nodeName> | ノード名 | s-2-r-0 |
例
2024 年 6 月 25 日の 12:00:00 ~ 15:00:00 の間に、s-2-r-0 ノードで実行された JOIN クエリをカウントします。
SELECT *
FROM (
SELECT
LEFT(query, 100) AS SQL,
count() AS queryNum,
sum(query_duration_ms) AS totalTime,
totalTime / queryNum AS avgTime
FROM clusterAllReplicas('default', system.query_log) ql
WHERE query LIKE '%JOIN%'
AND read_rows != 0
AND event_time > toDateTime('2024-06-25 12:00:00')
AND event_time < toDateTime('2024-06-25 15:00:00')
AND query NOT LIKE '%INSERT INTO%'
AND substring(hostname(), 38, 8) = 's-2-r-0'
GROUP BY SQL
ORDER BY queryNum DESC
)クエリ数によるユーザーのランキング
前日の非書き込みクエリ実行数が最も多いユーザーを表示します。読み取られた行数およびバイト数の合計も併せて表示されます。
クエリテンプレート
SELECT
user,
count(1) AS query_times,
sum(read_bytes) AS query_bytes,
sum(read_rows) AS query_rows
FROM clusterAllReplicas('default', system.query_log)
WHERE event_date = yesterday()
AND is_initial_query = 1
AND query NOT LIKE 'INSERT INTO%'
AND substring(hostname(), 38, 8) = '<nodeName>'
GROUP BY user
ORDER BY query_times DESC
[LIMIT <x>]パラメーター
| パラメーター | 説明 | 例 |
|---|---|---|
<nodeName> | ノード名 | s-2-r-0 |
<x> | 返されるユーザー数 | 10 |
例
前日の s-2-r-0 ノードにおける、非書き込みクエリ実行数の上位 10 位のユーザーを表示します。
SELECT
user,
count(1) AS query_times,
sum(read_bytes) AS query_bytes,
sum(read_rows) AS query_rows
FROM clusterAllReplicas('default', system.query_log)
WHERE event_date = yesterday()
AND is_initial_query = 1
AND query NOT LIKE 'INSERT INTO%'
AND substring(hostname(), 38, 8) = 's-2-r-0'
GROUP BY user
ORDER BY query_times DESC
LIMIT 10次のステップ
config.xml ファイルでパラメーターを設定する —
query_logの TTL およびその他のログ関連のパラメーターを調整しますクラスターのモニタリング情報を表示する — ノード名とクラスターの健全性メトリックを確認する