本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
新增 MySQL 資料來源,以查詢和視覺化 MySQL 相容資料庫的資料。
重要
Grafana 8.0 版會變更 MySQL、Postgres 和 Microsoft SQL Server 資料來源的資料影格基礎資料結構。因此,時間序列查詢結果會以寬格式傳回。如需詳細資訊,請參閱 Grafana 資料影格文件中的廣角格式
若要讓視覺化效果如往常一樣運作,您可能需要進行一些手動遷移。一個解決方案記錄在 Github 上的 Postgres/MySQL/MSSQL:中斷與時間序列查詢和資料欄排序相關的 v8.0 變更。
新增資料來源
-
選擇頂端標頭中的 Grafana 圖示,開啟側邊選單。
-
在儀表板連結下的側邊選單中,您應該會找到名為資料來源的連結。
-
選擇頂端標頭中的 + 新增資料來源按鈕。
-
從類型下拉式清單中選取 MySQL。
資料來源選項
名稱 | 描述 |
---|---|
Name
|
資料來源名稱。這是您在面板和查詢中看到資料來源的方式。 |
Default
|
預設資料來源表示新面板會預先選取。 |
Host
|
MySQL 執行個體的 IP 地址/主機名稱和選用連接埠。 |
Database
|
MySQL 資料庫的名稱。 |
User
|
資料庫使用者的登入/使用者名稱。 |
Password
|
資料庫使用者的密碼。 |
Max open
|
預設 unlimited (Grafana v5.4+) 資料庫的開啟連線數目上限。 |
Max idle
|
預設閒置連線集區中的連線數目上限 2 (Grafana v5.4+)。 |
Max lifetime
|
可以重複使用連線的秒數上限,預設為 14400 /4 小時。這應一律低於 MySQL 中設定的 wait_timeout |
最小時間間隔
$_interval
$_interval_ms
變數的下限。建議設定為寫入頻率,例如,1m
如果每分鐘寫入您的資料。也可以在資料來源選項下的儀表板面板中覆寫/設定此選項。此值的格式必須是數字,後面接著有效的時間識別符;例如 1m
(1 分鐘) 或 30s
(30 秒)。支援下列時間識別碼。
識別符 | 描述 |
---|---|
y
|
年 |
M
|
月 |
w
|
週 |
d
|
天 |
h
|
小時 |
m
|
分鐘 |
s
|
秒 |
ms
|
毫秒 |
資料庫使用者許可
重要
您在新增資料來源時指定的資料庫使用者,應僅授予您要查詢之指定資料庫和資料表的 SELECT 許可。Grafana 不會驗證查詢是否安全。查詢可能包含任何 SQL 陳述式。例如,DROP TABLE user;
會執行 USE otherdb;
和 等陳述式。為了防止這種情況,強烈建議您建立具有限制許可的特定 MySQL 使用者。
下列程式碼範例顯示建立具有受限許可的特定 MySQL 使用者。
CREATE USER 'grafanaReader' IDENTIFIED BY 'password';
GRANT SELECT ON mydatabase.mytable TO 'grafanaReader';
若要授予對更多資料庫和資料表的存取權,您可以視需要使用萬用字元 (*
) 取代資料庫或資料表。
查詢編輯器
您可以在面板編輯模式中的指標索引標籤中找到 MySQL 查詢編輯器。您可以選擇面板標題,然後選擇編輯,以進入編輯模式。
查詢編輯器具有產生的 SQL 連結,會在查詢執行後,在面板編輯模式下顯示。選擇它,它會展開並顯示已執行的原始插補 SQL 字串。
選取資料表、時間欄和指標欄 (FROM)
當您第一次進入編輯模式或新增查詢時,Grafana 會嘗試使用具有時間戳記欄和數值欄的第一個資料表預先填入查詢建置器。
在 FROM 欄位中,Grafana 會建議已設定資料庫中的資料表。若要選取資料庫使用者可存取的另一個資料庫中的資料表或檢視,您可以手動輸入完整名稱 (database.table),例如 otherDb.metrics
。
時間欄欄位是指保留時間值的資料欄名稱。選取指標資料欄欄位的值是選用的。如果選取值,則會使用指標欄欄位做為序列名稱。
指標欄建議只會包含文字資料類型 (文字、小文字、中文字、長文字、varchar、char) 的資料欄。如果您想要使用具有不同資料類型的資料欄做為指標資料欄,則可以輸入具有轉換的資料欄名稱:CAST(numericColumn as CHAR)
。您也可以在指標資料欄欄位中輸入任意 SQL 表達式,評估為文字資料類型,例如 CONCAT(column1, " ", CAST(numericColumn as CHAR))
。
資料欄和彙總函數 (SELECT)
在 SELECT
列中,您可以指定要使用的資料欄和函數。在資料欄欄位中,您可以撰寫任意表達式,而不是資料欄名稱,例如 column1 * column2 / column3
。
如果您使用彙總函數,則必須將結果集分組。GROUP BY time
如果您新增彙總函數,編輯器會自動新增 。
您可以透過選擇加號按鈕並從Column
選單中選擇,來新增更多值欄。在圖形面板中,多個值資料欄將繪製為單獨的序列。
篩選資料 (WHERE)
若要新增篩選條件,請選擇WHERE
條件右側的加號圖示。您可以透過選擇篩選條件並選擇 來移除篩選條件Remove
。目前所選時間範圍的篩選條件會自動新增至新查詢。
分組依據
若要依時間或任何其他資料欄分組,請選擇 GROUP BY 資料列結尾的加號圖示。建議下拉式清單只會顯示目前選取資料表的文字資料欄,但您可以手動輸入任何資料欄。您可以選擇項目,然後選擇 來移除群組Remove
。
如果您新增任何分組,則所有選取的資料欄都必須套用彙總函數。當您新增分組時,查詢建置器會自動將彙總函數新增至所有資料欄,而不需要彙總函數。
間隙填充
當您依時間分組時,Grafana 可以填入缺少的值。時間函數接受兩個引數。第一個引數是您要分組的時間範圍,第二個引數是您希望 Grafana 填入遺失項目的值。
文字編輯器模式 (原始)
您可以選擇漢堡圖示,然後選擇切換編輯器模式,或選擇查詢下方的編輯 SQL,即可切換到原始查詢編輯器模式。
注意
如果您使用原始查詢編輯器,請確定您的查詢至少具有 ,ORDER BY time
並在傳回的時間範圍上有一個篩選條件。
巨集
為了簡化語法並允許動態部分,例如日期範圍篩選條件,查詢可以包含巨集。
巨集範例 | 描述 |
---|---|
$__time(dateColumn)
|
將由表達式取代,以轉換為 UNIX 時間戳記,並將資料欄重新命名為 time_sec ;例如 UNIX_TIMESTAMP(dateColumn) 作為 time_sec。 |
$__timeEpoch(dateColumn)
|
將由表達式取代,以轉換為 UNIX 時間戳記,並將資料欄重新命名為 time_sec ;例如 UNIX_TIMESTAMP(dateColumn) 作為 time_sec。 |
$__timeFilter(dateColumn)
|
將使用指定的資料欄名稱,由時間範圍篩選條件取代。例如,dateColumn BETWEEN FROM_UNIXTIME(1494410783) 和 FROM_UNIXTIME(1494410983)。 |
$__timeFrom()
|
將由目前作用中時間選擇的開始取代。例如 FROM_UNIXTIME(1494410783)。 |
$__timeTo()
|
將取代為目前作用中時間選擇的結尾。例如 FROM_UNIXTIME(1494410983)。 |
$__timeGroup(dateColumn,'5m')
|
將取代為 GROUP BY 子句中可用的表達式。例如,Cast(cast(UNIX_TIMESTAMP(dateColumn)/(300) 已簽章)300 已簽章),* |
$__timeGroup(dateColumn,'5m', 0)
|
與上一列相同,但使用填充參數,因此 grafana 會新增該系列中的遺失點,而 0 會用作值。 |
$__timeGroup(dateColumn,'5m', NULL)
|
與上述相同,但 NULL 將用作遺失點的值。 |
$__timeGroup(dateColumn,'5m', previous)
|
與上述相同,但如果尚未看到 NULL,則會使用該系列中的上一個值作為填充值 (僅適用於 Grafana 5.3+)。 |
$__timeGroupAlias(dateColumn,'5m')
|
將與 相同,$__timeGroup 但以新增的資料欄別名取代 (僅適用於 Grafana 5.3+)。 |
$__unixEpochFilter(dateColumn) |
將使用指定的資料欄名稱取代時間範圍篩選條件,時間表示為 Unix 時間戳記。例如:dateColumn > 1494410783 AND dateColumn <
1494497183 。 |
$__unixEpochFrom() |
將由目前作用中時間選擇的開頭取代為 Unix 時間戳記。例如:1494410783 。 |
$__unixEpochTo() |
會以目前作用中時間選擇的結尾取代為 Unix 時間戳記。例如:1494497183 。 |
$__unixEpochNanoFilter(dateColumn) |
將使用指定的資料欄名稱取代時間範圍篩選條件,時間表示為 nanosecond 時間戳記。例如:dateColumn > 1494410783152415214 AND
dateColumn < 1494497183142514872 。 |
$__unixEpochNanoFrom() |
將以目前作用中時間選擇的開頭取代為 nanosecond 時間戳記。例如:1494410783152415214 。 |
$__unixEpochNanoTo() |
會以目前作用中時間選擇的結尾取代為奈秒時間戳記。例如:1494497183142514872 。 |
$__unixEpochGroup(dateColumn,"5m",
[fillmode]) |
與 相同,$__timeGroup 但適用於儲存為 Unix 時間戳記的時間 (僅適用於 Grafana 5.3+)。 |
$__unixEpochGroupAlias(dateColumn,"5m",
[fillmode])` |
與上述相同,但也會新增欄別名 (僅適用於 Grafana 5.3+)。 |
查詢編輯器具有產生的 SQL 連結,會在查詢執行後,在面板編輯模式下顯示。選擇它,它會展開並顯示已執行的原始插補 SQL 字串。
資料表查詢
如果格式化為查詢選項設定為資料表,基本上您可以執行任何類型的 SQL 查詢。資料表面板會自動顯示查詢傳回的任何資料欄和資料列的結果。
下列程式碼顯示查詢範例。
SELECT
title as 'Title',
user.login as 'Created By' ,
dashboard.created as 'Created On'
FROM dashboard
INNER JOIN user on user.id = dashboard.created_by
WHERE $__timeFilter(dashboard.created)
您可以使用一般 as
SQL 資料欄選取語法來控制資料表面板資料欄的名稱。
時間序列查詢
如果您將 Format 設定為 Time series,例如在圖形面板中使用,查詢必須傳回名為 的資料欄time
,該資料欄會傳回 SQL datetime 或任何代表 Unix epoch 的數值資料類型。除了 time
和 以外的任何資料欄metric
都會視為值資料欄。您可以傳回名為 的資料欄metric
,做為值資料欄的指標名稱。如果您傳回多個值資料欄和名為 的資料欄metric
,則此資料欄會用作序列名稱的字首 (僅適用於 Grafana 5.3+)。
時間序列查詢的結果集必須依時間排序。
下列程式碼範例顯示 metric
欄。
SELECT
$__timeGroup(time_date_time,'5m'),
min(value_double),
'min' as metric
FROM test_data
WHERE $__timeFilter(time_date_time)
GROUP BY time
ORDER BY time
下列程式碼範例顯示使用 $__timeGroup 巨集中的填充參數,將 null 值改為零。
SELECT
$__timeGroup(createdAt,'5m',0),
sum(value_double) as value,
measurement
FROM test_data
WHERE
$__timeFilter(createdAt)
GROUP BY time, measurement
ORDER BY time
下列程式碼範例顯示多個資料欄。
SELECT
$__timeGroup(time_date_time,'5m'),
min(value_double) as min_value,
max(value_double) as max_value
FROM test_data
WHERE $__timeFilter(time_date_time)
GROUP BY time
ORDER BY time
根據時間範圍和面板寬度,不支援依時間的動態群組。
範本
您可以在指標查詢中使用變數,而不是硬式編碼,例如伺服器、應用程式和感應器名稱。變數在儀表板頂端顯示為下拉式清單選取方塊。您可以使用這些下拉式方塊來變更儀表板中顯示的資料。
如需範本和範本變數的詳細資訊,請參閱範本。
查詢變數
如果您新增 類型的範本變數Query
,您可以撰寫 MySQL 查詢,以傳回如測量名稱、索引鍵名稱或顯示為下拉式清單選取方塊的索引鍵值等物件。
例如,如果您在範本變數查詢設定中指定這類查詢,您可以有一個變數,其中包含資料表中資料hostname
欄的所有值。
SELECT hostname FROM my_host
查詢可以傳回多個資料欄,Grafana 會自動從中建立清單。例如,下列查詢將傳回來自 hostname
和 的值清單hostname2
。
SELECT my_host.hostname, my_other_host.hostname2 FROM my_host JOIN my_other_host ON my_host.city = my_other_host.city
若要在查詢$__timeFilter(column)
中使用時間範圍相依巨集,例如 ,範本變數的重新整理模式必須設定為時間範圍變更。
SELECT event_name FROM event_log WHERE $__timeFilter(time_column)
另一個選項是可建立索引鍵/值變數的查詢。查詢應傳回兩個名為 __text
和 的資料欄__value
。__text
資料欄值應該是唯一的 (如果不是唯一的,則會使用第一個值)。下拉式清單中的選項將具有文字和值,以便您可以具有易記的名稱做為文字,並將 ID 做為值。
下列程式碼範例顯示使用 hostname
做為文字和 id
做為值的查詢。
SELECT hostname AS __text, id AS __value FROM my_host
您也可以建立巢狀變數。例如,如果您有另一個名為 的變數region
。然後,您可以讓主機變數只顯示目前所選區域中具有此類查詢的主機 (如果 region
是多值變數,則使用IN
比較運算子,而不是=
比對多個值)。
SELECT hostname FROM my_host WHERE region IN($region)
使用 __searchFilter
在查詢變數中篩選結果
__searchFilter
在查詢欄位中使用 會根據下拉式清單選取方塊中的使用者類型來篩選查詢結果。當使用者未輸入任何內容時, 的預設值__searchFilter
為 %
。
注意
請務必使用引號包圍__searchFilter
運算式,因為 Grafana 不會為您執行此操作。
下列範例顯示如何使用 __searchFilter
做為查詢欄位的一部分,以在下拉式清單選取方塊中的使用者類型hostname
時啟用搜尋。
SELECT hostname FROM my_host WHERE hostname LIKE '$__searchFilter'
在查詢中使用變數
從 Grafana 4.3.0 到 4.6.0,範本變數一律會自動進行引號,因此如果是字串值,則不會在 子句的引號中包裝它們。
從 Grafana 4.7.0 版中,只有在範本變數是 時,才會引用範本變數值。 multi-value
如果變數是多值變數,請使用IN
比較運算子=
,而不是比對多個值。
有兩種語法:
$<varname>
範本變數名為 的範例hostname
:
SELECT
UNIX_TIMESTAMP(atimestamp) as time,
aint as value,
avarchar as metric
FROM my_table
WHERE $__timeFilter(atimestamp) and hostname in($hostname)
ORDER BY atimestamp ASC
[[varname]]
範本變數名為 的範例hostname
:
SELECT
UNIX_TIMESTAMP(atimestamp) as time,
aint as value,
avarchar as metric
FROM my_table
WHERE $__timeFilter(atimestamp) and hostname in([[hostname]])
ORDER BY atimestamp ASC
關閉多值變數的引號
Grafana 會自動為多值變數建立以逗號分隔的引號字串。例如:如果選取 server02
server01
和 ,則會格式化為:'server01', 'server02'
。若要關閉引號,請使用變數的 csv 格式選項。
${servers:csv}
如需變數格式化選項的詳細資訊,請參閱 進階變數格式選項。
註釋
您可以使用註釋在圖形上方疊加豐富的事件資訊。您可以透過儀表板功能表/註釋檢視新增註釋查詢。如需詳細資訊,請參閱。
下列範例程式碼使用具有 epoch 值的時間欄來顯示查詢。
SELECT
epoch_time as time,
metric1 as text,
CONCAT(tag1, ',', tag2) as tags
FROM
public.test_data
WHERE
$__unixEpochFilter(epoch_time)
下列範例程式碼顯示使用具有 epoch 值的日期和時間欄的區域查詢。
注意
僅適用於 Grafana v6.6+。
SELECT
epoch_time as time,
epoch_timeend as timeend,
metric1 as text,
CONCAT(tag1, ',', tag2) as tags
FROM
public.test_data
WHERE
$__unixEpochFilter(epoch_time)
下列範例程式碼使用原生 SQL 日期/時間資料類型的時間資料欄顯示查詢。
SELECT
native_date_time as time,
metric1 as text,
CONCAT(tag1, ',', tag2) as tags
FROM
public.test_data
WHERE
$__timeFilter(native_date_time)
名稱 | 描述 |
---|---|
time
|
日期/時間欄位的名稱。可以是具有原生 SQL 日期/時間資料類型或 epoch 值的資料欄。 |
timeend
|
結束日期/時間欄位的選用名稱。可以是具有原生 SQL 日期/時間資料類型或 epoch 值的資料欄。 |
text
|
事件描述欄位。 |
tags
|
用於事件標籤的選用欄位名稱,做為逗號分隔字串。 |
提醒
時間序列查詢應在提醒條件下運作。警示規則條件中尚不支援資料表格式的查詢。