Metric SQL 使用者手冊
本手冊面向使用者,系統地介紹了 Metrics SQL 語言的語法與使用方式。
目錄
約定
為了方便起見,在本文件中我們使用 msql
來表示 Ops 語言。
有問題的示例程式碼會在每行開頭標記問號 ?
。例如:
? select *;
描述
Metrics SQL 語言受 SQL 語言啟發,但從未打算與 SQL 標準或某些 SQL 方言 100% 相容。儘管如此,Metrics SQL 程式碼可能看起來與 SQL 程式碼非常相似。
Metrics SQL 語言作為 OpenResty Edge 平臺的一部分提供。它是為 OpenResty Edge 快速建立新動態指標的一種方式。
程式佈局
Metrics SQL 程式由多個用分號分隔的語句組成。目前只允許單個 select
查詢語句,但這在將來可能會改變。下面是一個例子:
select uri, host, count(*)
from reqs group by uri, host limit 10;
最後一個語句的尾隨分號可以省略。
詞法結構
整數
整數可以表示為十進位制或十六進位制字面量,如:
-3
519
0xdeadbeef
浮點數
浮點數可以表示如下:
3.1415926
2e8
4.2E2
字串字面量
字串字面量用單引號括起來,就像標準 SQL 語言一樣,如:
'hello, world!'
此外,我們支援以下特殊轉義序列來指定特殊字元:
\a 響鈴,ascii 碼 0x07
\b 退格,ascii 碼 0x08
\f 換頁,ascii 碼 0x0c
\n 換行
\r 回車
\t 製表符
\v 垂直製表符
\\ 反斜槓 (\)
\' 單引號字元 (')
\" 雙引號字元 (")
\<newline> 換行字元,就像 \n
下面是使用轉義序列的例子:
'hello\nworld\t!'
正規表示式字面量
正規表示式字面量是表示用於模式匹配的正規表示式的一種方式(與 like
二元運算子一起使用)。正規表示式字面量,比如 /[0-9]+/
,可以用不同的分隔符括起來,如:
/[0-9]+/
rx/[0-9]+/
rx{[0-9]+}
rx([0-9]+)
rx[[0-9]+]
rx'[0-9]+'
rx"[0-9]+"
rx![0-9]+!
您可以選擇最佳分隔符來最小化正規表示式模式本身內部必要的轉義。
目前只允許 Perl 相容正規表示式和 POSIX 正規表示式語法的通用子集,但不包括反向引用語法(如 \1
、\2
等)。我們可能在將來取消這個限制。
支援使用括號的子匹配捕獲。
布林字面量
Metrics SQL 中的布林字面量就是 true
和 false
,就像在 SQL 中一樣。
空值
特殊的 null
關鍵字表示空值(類似於 SQL 中的 null
值)。
Metrics SQL 通常不涉及空值,因此這個字面量很少使用。包含它只是為了完整性。
表
表名必須始終以其完全限定形式指定,除非使用者給出別名(如在 from
子句中使用 as ALIAS
語法)。
Metrics SQL 目前支援一個內建表 reqs
。詳見"內建表"部分。
列
當沒有歧義時,列名可以用其裸名稱表示,如 uri
和 host
,或者用帶表名的完全限定形式,如:
select uri, count(*)
from reqs group by uri
其中 uri
列使用完全限定形式 reqs.uri
指定。
列也可以透過使用者別名間接引用(如在 select
列表中使用 as ALIAS
語法)。
運算子和表示式
Metrics SQL 支援許多類似 SQL 的運算子和表示式型別,並有一些自己的補充。
所有運算子的優先順序表如下:
3 一元 !
4 - (一元減號), + (一元加號)
5 || (字串連線)
7 *, /, %
8 二元 -, +
12 = (比較), >=, >, <=, <, <>, !=, is, like, in, prefix, suffix, contains
13 between
14 not
15 and
17 or
19 left join, inner join
20 , (交叉連線)
通常可以使用括號 (...)
來組合優先順序較低的運算子。
not ...
變體如 not between
和 is not
未在運算子優先順序表中列出。
算術表示式
Metrics SQL 支援以下二元算術運算子:加法(+
)、減法(-
)、乘法(*
)、除法(/
)和取模(%
)。
它還支援一元算術運算子 -
和 +
。
字串連線
支援 SQL 風格的字串連線運算子 ||
。
關係表示式
Metrics SQL 支援大多數常見的 SQL 風格關係運算子:
=
(等於)!=
或<>
(不等於)<=
<
>
>=
between ... and
(開發中)in (value...)
(開發中)like
和not like
is
或is not
(開發中)
like
運算子支援兩種形式的模式:
(開發中)
帶有元字元的 SQL 風格模式,如%
(匹配零個或多個任意字元)和_
(匹配一個任意字元)。元字元可以用反斜槓(/
)轉義以表示%
和_
字元本身。- 正規表示式字面量,如
/.../
和rx{...}
。
此外,Metrics SQL 支援以下字串匹配運算子,分別測試右側字串是否是左側字串的字首、子字串或字尾:
prefix
contains
suffix
邏輯表示式
支援以下 SQL 風格邏輯運算子:
- 二元
and
- 二元
or
- 一元
not
子查詢
Metrics SQL 目前不支援子查詢,儘管 Metrics SQL 編譯器可以很好地解析它們。
Select 查詢語句
此語句包含一個帶有以下一個或多個子句的單個 select
查詢。注意 select
子句始終是必需的。
Select 子句
支援 SQL 風格的 select 子句。下面是一些例子:
select host, count(*) from reqs group by host;
聚合函式和轉換函式可以出現在 select
列表中。關係表示式、算術表示式和字串連線表示式也可以。目前不允許邏輯表示式。我們可能在將來取消這個限制。
每個選定的值可以在值表示式後面帶一個可選的別名,就像在標準 SQL 中一樣,如:
select avg(active_conns) as active from http;
聚合函式如 sum()
、avg()
、min()
、max()
和 count()
也可以在選定的值表示式中使用,如:
select count(*), sum(latency_s)
from reqs;
轉換函式如 hist_log()
也可以在選定的值表示式中使用,如:
select count(*), hist_log(latency_ms) as latency
from reqs group by latency;
From 子句
from
子句也類似於標準 SQL 語言。可以指定單個表,如:
select uri, count(*)
from reqs group by uri;
Where 子句
where
子句與標準 SQL 語言相同。可以在這裡指定邏輯表示式作為搜尋條件。下面是一個例子:
select count(*)
from reqs
where uri prefix '/css/';
Group By 子句
group by
子句類似於標準 SQL 語言,如:
select count(*) as cnt, host
from reqs
group by host
order by cnt desc
limit 10;
Order By 子句
order by
子句類似於標準 SQL 語言。Metrics SQL 目前有一些限制:
order by
子句中只允許一列。order by
列只能是列名或count()
聚合函式。
下面是一個例子:
select count(*), host
from reqs
group by host
order by count(*) desc;
也可以在 order by
子句中引用選定值表示式的別名(如果有的話),如:
select count(*) cnt, host
from reqs
group by host
order by cnt desc;
Limit 子句
limit
子句類似於標準 SQL 語言。下面是一個例子:
select *
from reqs
limit 10;
Offset 子句(開發中)
offset
子句語法類似於 PostgreSQL 提供的 PL/SQL 語言。下面是一個例子:
select *
from reqs
offset 1
limit 10;
這將跳過第一行,只輸出第 2 到第 10 行。
內建表
下面是 Metrics SQL 編譯器當前支援的內建表的詳細列表。我們正在快速新增新表和新列。
reqs
此表用於檢查 nginx(主)請求。這裡排除了 Nginx 子請求。
它有以下列:
args
HTTP 請求的 URI 查詢字串。
host
HTTP 請求的主機名。
latency_ms
表示請求延遲(毫秒)的整數,如
120
。latency_s
表示請求延遲(秒)的浮點數,如
0.32
。keepalive
布林值,表示當前請求是否為當前 TCP 連線啟用 HTTP keep-alive。
method
HTTP 請求的方法字串。
scheme
當前 HTTP 請求的協議字串,如
http
和https
。uri
HTTP 請求 URI(不包括任何查詢字串)。
raw_uri
HTTP 原始請求 URI(包括查詢字串)。
client_ip
字串。IP 地址(IPv4 或 IPv6 或 unix socket 檔案路徑)。
req_size
整數。整個請求大小(包括頭部和正文)的位元組數。
req_body_size
整數。請求正文大小的位元組數。
resp_size
整數。整個響應大小(包括頭部和正文)的位元組數(如果涉及壓縮,則為壓縮後的大小)。
resp_body_size
整數。響應正文大小的位元組數。
total_size
整數。下游請求的總大小,包括
req_size
和resp_size
。server_city
字串。基於伺服器 IP 地址查詢地理資訊資料獲得的城市名稱
server_province
字串。基於伺服器 IP 地址查詢地理資訊資料獲得的省份名稱
server_country
字串。基於伺服器 IP 地址查詢地理資訊資料獲得的國家名稱
server_continent
字串。基於伺服器 IP 地址查詢地理資訊資料獲得的大洲名稱
server_isp
字串。基於伺服器 IP 地址查詢地理資訊資料獲得的 ISP 名稱
server_latitude
字串。基於伺服器 IP 地址查詢地理資訊資料獲得的緯度
server_longtitude
字串。基於伺服器 IP 地址查詢地理資訊資料獲得的經度
server_port
整數。當前請求訪問的伺服器埠。
status
整數。HTTP 響應狀態碼(如 502 和 200)或內部 nginx 錯誤碼(如果沒有有意義的 HTTP 狀態碼可用)。
status_class
字串。分類後的 HTTP 響應狀態碼,如 2xx/3xx/4xx/5xx。
is_ssl
布林值。當前請求是否使用 SSL 或 TLS。
tls_ver
數字。TLS 協議版本號,如 1.2 和 1.3。
ssl_ver
數字。SSL 協議版本號,如 2 和 3。
resp_is_chunked
布林值。響應正文是否使用分塊編碼。
req_is_chunked
布林值。請求正文是否使用分塊編碼。
http_ver
數字。HTTP 協議版本(0.9、1.0、1.1、2.0)。
is_websocket
布林值。當前請求是否已升級到 WebSocket 協議。
resp_is_compressed
布林值。當前請求的響應正文是否被壓縮(透過 gzip 或其他編碼)。
mime_type
字串。應該是像 application/javascript 這樣的值。應排除任何尾隨引數,如 ; charset=utf-8。
uses_lua
布林值。當前請求是否在任何請求處理階段使用任何 Lua 程式碼處理程式(如 log_by_lua、rewrite_by_lua 等)。
for_static_file
布林值。當前請求是否使用靜態檔案模組來提供當前機器檔案系統上的靜態檔案。
has_upstream
布林值。當前請求是否使用代理(即使用 nginx upstream 模組)。
uses_error_page
布林值。當前請求是否提供錯誤頁面。
uri_changes
整數。在請求處理階段完成的 URI 更改次數(對應 r->uri_changes)。
uri_changed
布林值。當前請求的 URI 是否曾被請求處理階段更改(對應 r->uri_changed)。
is_pipelined
布林值。當前請求是否是管道請求(即 C 層面的 r->pipeline)。
resp_header_only
布林值。當前響應是否只有頭部(r->header_only)。
location
字串。最後服務當前請求的 nginx location 名稱。
user_agent
字串。User-Agent 字串。
conn_is_reused
布林值。當前請求是否重用了由較早請求建立的連線。
upstream_addr
字串。用於連線到上游伺服器的最後一個上游地址。
upstream_cache_status
字串。上游快取狀態。 如果沒有上游則為空字串,否則為以下之一:
MISS
BYPASS
EXPIRED
STALE
UPDATING
REVALIDATED
HIT
is_upstream_cache_status_hit
字串。當前請求的快取狀態為
HIT
,表示請求的內容在快取中找到且有效,響應直接從快取提供。此變數於 25.6.20-1 版本首次引入。is_upstream_cache_status_miss
字串。當前請求的快取狀態為
MISS
,表示請求的內容在快取中未找到,需要從上游伺服器獲取。此變數於 25.6.20-1 版本首次引入。is_upstream_cache_status_bypass
字串。當前請求的快取狀態為
BYPASS
,表示快取被繞過,請求直接轉發到上游伺服器而不使用快取。此變數於 25.6.20-1 版本首次引入。is_upstream_cache_status_expired
字串。當前請求的快取狀態為
EXPIRED
,表示快取內容已過期,需要從上游伺服器重新獲取。此變數於 25.6.20-1 版本首次引入。is_upstream_cache_status_stale
字串。當前請求的快取狀態為
STALE
,表示快取內容已過期但仍可用,通常在上游伺服器不可用時返回。此變數於 25.6.20-1 版本首次引入。is_upstream_cache_status_updating
字串。當前請求的快取狀態為
UPDATING
,表示快取正在更新,當前請求使用舊的快取內容提供服務。此變數於 25.6.20-1 版本首次引入。is_upstream_cache_status_revalidated
字串。當前請求的快取狀態為
REVALIDATED
,表示快取內容已與上游伺服器重新驗證並確認仍然有效。此變數於 25.6.20-1 版本首次引入。upstream_byte_sent
整數。傳送到上游伺服器的位元組數。多個上游伺服器的值將相加。
upstream_byte_received
整數。從上游伺服器接收的位元組數。多個上游伺服器的值將相加。
upstream_byte_total
整數。傳送到上游伺服器和從上游伺服器接收的位元組數。多個上游伺服器的值將相加。
upstream_body_length
整數。從上游伺服器獲得的響應長度。多個上游伺服器的值將相加。
upstream_header_timer_ms
整數。從上游伺服器接收響應頭部所花費的時間;時間以毫秒解析度儲存。多個響應的時間相加。
upstream_connect_timer_ms
整數。與上游伺服器建立連線所花費的時間;時間以毫秒解析度儲存。在 SSL 情況下,包括握手所花費的時間。多個連線的時間相加。
upstream_resp_timer_ms
整數。從上游伺服器接收響應所花費的時間;時間以毫秒解析度儲存。多個響應的時間相加。
client_city
字串。基於客戶端 IP 地址查詢地理資訊資料獲得的城市名稱
client_province
字串。基於客戶端 IP 地址查詢地理資訊資料獲得的省份名稱
client_country
字串。基於客戶端 IP 地址查詢地理資訊資料獲得的國家名稱
client_continent
字串。基於客戶端 IP 地址查詢地理資訊資料獲得的大洲名稱
client_isp
字串。基於客戶端 IP 地址查詢地理資訊資料獲得的 ISP 名稱
client_latitude
字串。基於客戶端 IP 地址查詢地理資訊資料獲得的緯度
client_longtitude
字串。基於客戶端 IP 地址查詢地理資訊資料獲得的經度
is_status_2xx
布林值。當前請求的響應狀態是否在 200 到 299 之間。
is_status_3xx
布林值。當前請求的響應狀態是否在 300 到 399 之間。
is_status_4xx
布林值。當前請求的響應狀態是否在 400 到 499 之間。
is_status_5xx
布林值。當前請求的響應狀態是否在 500 到 599 之間。
is_status_other
布林值。當前請求的響應狀態是否小於 200 或大於 599。
is_upstream_status_2xx
布林值。當前請求的響應狀態是否在 200 到 299 之間。
is_upstream_status_3xx
布林值。上游的響應狀態是否在 300 到 399 之間。
is_upstream_status_4xx
布林值。上游的響應狀態是否在 400 到 499 之間。
is_upstream_status_5xx
布林值。上游的響應狀態是否在 500 到 599 之間。
is_upstream_status_other
布林值。上游的響應狀態是否小於 200 或大於 599。
is_status_400
布林值。響應狀態是否為 400。
is_status_403
布林值。響應狀態是否為 403。
is_status_404
布林值。響應狀態是否為 404。
is_status_412
布林值。響應狀態是否為 412。
is_status_429
布林值。響應狀態是否為 429。
is_status_500
布林值。響應狀態是否為 500。
is_status_502
布林值。響應狀態是否為 502。
is_status_503
布林值。響應狀態是否為 503。
is_status_504
布林值。響應狀態是否為 504。
is_upstream_status_400
布林值。上游的響應狀態是否為 400。
is_upstream_status_403
布林值。上游的響應狀態是否為 403。
is_upstream_status_404
布林值。上游的響應狀態是否為 404。
is_upstream_status_412
布林值。上游的響應狀態是否為 412。
is_upstream_status_429
布林值。上游的響應狀態是否為 429。
is_upstream_status_500
布林值。上游的響應狀態是否為 500。
is_upstream_status_502
布林值。上游的響應狀態是否為 502。
is_upstream_status_503
布林值。上游的響應狀態是否為 503。
is_upstream_status_504
布林值。上游的響應狀態是否為 504。
HTTP
此表主要用於統計連線數。
它有以下列:
active_conns
當前活躍客戶端連線數,包括等待連線。
waiting_conns
當前等待請求的空閒客戶端連線數。
writing_conns
當前 openresty edge 正在向客戶端寫回響應的連線數。
reading_conns
當前 openresty edge 正在讀取請求頭部的連線數。
示例
示例一:統計統計命中率 TOP 10 的域名
select host, sum(is_upstream_cache_status_hit) / count(*) * 100 as cache_hit_ratio_percent
from reqs
where upstream_cache_status != ''
group by host
order by cache_hit_ratio_percent desc
limit 10
作者
章亦春 yichun@openresty.com,OpenResty Inc.
版權和許可
版權所有 (C) 2020-2021 OpenResty Inc. 保留所有權利。
本文件為專有文件,包含機密資訊。未經版權持有者書面許可,禁止在任何時候重新分發本文件。