翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Microsoft SQL Server データソースに接続する
Microsoft SQL Server (MSSQL) データソースを使用して、Microsoft Azure SQL データベースを含む Microsoft SQL Server 2005 以降のデータをクエリおよび視覚化します。
重要
Grafana バージョン 8.0 は、Microsoft SQL Server、Postgres、MySQL のデータフレームの基盤となるデータ構造を変更します。その結果、時系列クエリ結果が幅広い形式で返されます。詳細については、Grafana データフレームドキュメントの「ワイドフォーマット
ビジュアライゼーションを以前と同じように機能させるには、いくつかの手動移行が必要になる場合があります。解決策の 1 つは、「Postgres/MySQL /MSSQL: 時系列クエリとデータ列 の順序に関連する v8.0 の重大な変更」で Github
データソースの追加
-
上部のヘッダーにある Grafana アイコンを選択して、サイドメニューを開きます。
-
リンクの下にあるサイドメニュー、Configuration にデータソースリンクがあります。
-
上部のヘッダーで + データソースの追加ボタンを選択します。
-
タイプドロップダウンリストから Microsoft SQL Server を選択します。
データソースオプション
名前 | 説明 |
---|---|
Name
|
データソース名。これは、パネルとクエリでデータソースを表示する方法です。 |
Default
|
デフォルトのデータソースは、新しいパネルに対して事前に選択されることを意味します。 |
Host
|
MSSQL インスタンスの IP アドレス/ホスト名とオプションのポート。ポートを省略すると、デフォルトの 1433 が使用されます。 |
Database
|
MSSQL データベースの名前。 |
User
|
データベースユーザーのログイン/ユーザー名。 |
Password
|
データベースユーザーのパスワード。 |
Encrypt
|
このオプションは、安全な SSL TCP/IP 接続をサーバーとネゴシエートするかどうか、またはどの程度までネゴシエートするかを決定します。デフォルト false (Grafana v5.4+)。 |
Max open
|
データベースへのオープン接続の最大数。デフォルト unlimited (Grafana v5.4+)。 |
Max idle
|
アイドル接続プール内の接続の最大数。デフォルト 2 (Grafana v5.4+)。 |
Max lifetime
|
接続を再利用できる秒単位の最大時間。デフォルトは 14400 /4 時間です。 |
最小時間間隔
$_interval
$_interval_ms
変数の下限。データを毎分書き込む1m
場合など、書き込み頻度に設定することをお勧めします。このオプションは、データソースオプションのダッシュボードパネルで上書き/設定することもできます。この値は、 (1 分) や (30s
30 秒) など、1m
有効な時間識別子が続く数値としてフォーマットする必要があります。次の時間識別子がサポートされています。
識別子 | 説明 |
---|---|
y
|
年 |
M
|
月 |
w
|
週 |
d
|
日 |
h
|
時間 |
m
|
分 |
s
|
秒 |
ms
|
ミリ秒 |
データベースユーザーのアクセス許可
重要
データソースの追加時に指定するデータベースユーザーには、クエリを実行する指定されたデータベースとテーブルに対する SELECT アクセス許可のみを付与する必要があります。Grafana はクエリが安全であることを検証しません。クエリには任意の SQL ステートメントを含めることができます。例えば、 DELETE FROM user;
や などのステートメントDROP TABLE user;
が実行されます。これを防ぐために、アクセス許可が制限された特定の MSSQL ユーザーを作成することを強くお勧めします。
次のコード例は、アクセス許可が制限された特定の MSSQL ユーザーの作成を示しています。
CREATE USER grafanareader WITH PASSWORD 'password' GRANT SELECT ON dbo.YourTable3 TO grafanareader
ユーザーがパブリックロールから不要なアクセス許可を取得していないことを確認します。
既知の問題
2008 や 2008R2 などの古いバージョンの Microsoft SQL Server を使用している場合は、接続できるように暗号化を無効にする必要がある場合があります。可能な限り、最適な互換性を実現するために、利用可能な最新のサービスパックを使用することをお勧めします。
クエリエディタ
MSSQL クエリエディタは、グラフ、Singlestat、またはテーブルパネルの編集モードのメトリクスタブにあります。編集モードに入るには、パネルタイトルを選択し、編集を選択します。エディタでは、視覚化するデータを選択する SQL クエリを定義できます。
-
Format as
Time series
(Graph パネルや Singlestat パネルなどで使用) またはTable
(Table パネルなどで使用) を選択します。 -
これは、SQL クエリを記述する実際のエディタです。
-
クエリエディタの下に MSSQL のヘルプセクションを表示します。
-
実行された SQL クエリを表示します。クエリが正常に実行された後、最初に使用できます。
-
追加のクエリエディタが表示される追加のクエリを追加します。
マクロ
構文を簡素化し、日付範囲フィルターなどの動的部分を可能にするために、クエリにマクロを含めることができます。
マクロの例 | 説明 |
---|---|
$__time(dateColumn)
|
列の名前を時刻 に変更する式に置き換えられます。例えば、dateColumn は時間 です。 |
$__timeEpoch(dateColumn)
|
DATETIME 列タイプを Unix タイムスタンプに変換し、名前を時間 に変更する式に置き換えられます。例えば、DATEDIFF(second, "1970-01-01", dateColumn ) AS time です。 |
$__timeFilter(dateColumn)
|
指定された列名を使用する時間範囲フィルターに置き換えられます。例えば、dateColumn BETWEEN "2017-04-21T05:01:17Z" および "2017-04-21T05:06:17Z" などです。 |
$__timeFrom()
|
現在アクティブな時間選択の開始に置き換えられます。例えば、2017-04-21T05:01:17Z」などです。 |
$__timeTo()
|
現在アクティブな時間選択の終了に置き換えられます。例えば、2017-04-21T05:06:17Z」などです。 |
$__timeGroup(dateColumn,'5m'[, fillvalue])
|
GROUP BY 句で使用できる式に置き換えられます。fillValue を NULL または浮動小数点値に指定すると、時間範囲内の空のシリーズがその値で自動的に埋められます。例えば、CAST(ROUND(DATEDIFF(second, "1970-01-01", time_column)/300.0, 0) as bigint)*300 です。 |
$__timeGroup(dateColumn,'5m', 0)
|
前と同じですが、fill パラメータが付いているため、そのシリーズの欠落ポイントは grafana によって追加され、0 が値として使用されます。 |
$__timeGroup(dateColumn,'5m', NULL)
|
上記と同じですが、NULL が欠落ポイントの値として使用されます。 |
$__timeGroup(dateColumn,'5m', previous)
|
上記と同じですが、まだ NULL が表示されていない場合は、そのシリーズの以前の値がフィル値として使用されます (Grafana 5.3+ でのみ使用可能)。 |
クエリエディタには、パネル編集モードでクエリが実行された後に表示される生成 SQL リンクがあります。これを選択すると、実行された未加工の補間された SQL 文字列が展開されて表示されます。
テーブルクエリ
クエリオプションが に設定されている場合、テーブルとしてフォーマットすると、基本的に任意のタイプの SQL クエリを実行できます。テーブルパネルには、クエリが返す列と行の結果が自動的に表示されます。
次のサンプルコードは、データベーステーブルを示しています。
CREATE TABLE [event] ( time_sec bigint, description nvarchar(100), tags nvarchar(100), )
CREATE TABLE [mssql_types] ( c_bit bit, c_tinyint tinyint, c_smallint smallint, c_int int, c_bigint bigint, c_money money, c_smallmoney smallmoney, c_numeric numeric(10,5), c_real real, c_decimal decimal(10,2), c_float float, c_char char(10), c_varchar varchar(10), c_text text, c_nchar nchar(12), c_nvarchar nvarchar(12), c_ntext ntext, c_datetime datetime, c_datetime2 datetime2, c_smalldatetime smalldatetime, c_date date, c_time time, c_datetimeoffset datetimeoffset ) INSERT INTO [mssql_types] SELECT 1, 5, 20020, 980300, 1420070400, '$20000.15', '£2.15', 12345.12, 1.11, 2.22, 3.33, 'char10', 'varchar10', 'text', N'☺nchar12☺', N'☺nvarchar12☺', N'☺text☺', GETDATE(), CAST(GETDATE() AS DATETIME2), CAST(GETDATE() AS SMALLDATETIME), CAST(GETDATE() AS DATE), CAST(GETDATE() AS TIME), SWITCHOFFSET(CAST(GETDATE() AS DATETIMEOFFSET), '-07:00')
次のサンプルコードは、クエリを示しています。
SELECT * FROM [mssql_types]
次のサンプルコードに示すように、通常の AS
SQL 列選択構文を使用してテーブルパネル列の名前を制御できます。
SELECT c_bit as [column1], c_tinyint as [column2] FROM [mssql_types]
結果のテーブルパネル:
時系列クエリ
例えば、グラフパネルで使用するために Format を時系列 に設定した場合、クエリには SQL 日時または Unix エポックを表す数値データ型を秒単位で返time
す という名前の列が必要です。値列のメトリクス名として使用される metric
という名前の列を返すことができます。time
と を除くすべての列metric
は、値列として扱われます。metric
列を省略すると、値列の名前がメトリクス名になります。複数の値列を選択できます。それぞれにメトリクスとして名前が付けられます。複数の値列と という名前の列を返す場合metric
、この列はシリーズ名のプレフィックスとして使用されます。
時系列クエリの結果セットは、時間でソートする必要があります。
次のサンプルコードは、データベーステーブルを示しています。
CREATE TABLE [event] ( time_sec bigint, description nvarchar(100), tags nvarchar(100), )
CREATE TABLE metric_values ( time datetime, measurement nvarchar(100), valueOne int, valueTwo int, ) INSERT metric_values (time, measurement, valueOne, valueTwo) VALUES('2018-03-15 12:30:00', 'Metric A', 62, 6) INSERT metric_values (time, measurement, valueOne, valueTwo) VALUES('2018-03-15 12:30:00', 'Metric B', 49, 11) ... INSERT metric_values (time, measurement, valueOne, valueTwo) VALUES('2018-03-15 13:55:00', 'Metric A', 14, 25) INSERT metric_values (time, measurement, valueOne, valueTwo) VALUES('2018-03-15 13:55:00', 'Metric B', 48, 10)
次のコード例は、1 列value
と 1 metric
列を示しています。
SELECT time, valueOne, measurement as metric FROM metric_values WHERE $__timeFilter(time) ORDER BY 1
上記のクエリをグラフパネルで使用するMetric A
と、 と という名前Metric B
の 2 つのシリーズが生成され、 にvalueOne
valueTwo
プロットされますtime
。
次のコード例は、複数のvalue
列を示しています。
SELECT time, valueOne, valueTwo FROM metric_values WHERE $__timeFilter(time) ORDER BY 1
上記のクエリをグラフパネルで使用するMetric A
と、 と という名前Metric B
の 2 つのシリーズが生成され、 にvalueOne
valueTwo
プロットされますtime
。
次のコード例は、$__timeGroup マクロの使用を示しています。
SELECT $__timeGroup(time, '3m') as time, measurement as metric, avg(valueOne) FROM metric_values WHERE $__timeFilter(time) GROUP BY $__timeGroup(time, '3m'), measurement ORDER BY 1
前のクエリがグラフパネルで使用されると、 Metric A
と という名前Metric B
の 2 つのシリーズが生成されvalueOne
、 にvalueTwo
プロットされますtime
。3 分間のウィンドウに値がない 2 つのシリーズでは、その 2 つの行の間に線がレンダリングされます。右側のグラフがゼロに下がらないことがわかります。
次のコード例は、fill パラメータをゼロに設定して $__timeGroup マクロを使用する方法を示しています。
SELECT $__timeGroup(time, '3m', 0) as time, measurement as metric, sum(valueTwo) FROM metric_values WHERE $__timeFilter(time) GROUP BY $__timeGroup(time, '3m'), measurement ORDER BY 1
このクエリがグラフパネルで使用される場合、結果は Metric A
と という名前の 2 つのシリーズMetric B
になり、 にvalueTwo
プロットされた の合計が表示されますtime
。3 分間のウィンドウに値がないシリーズでは、値が 0 になり、グラフの右側にレンダリングされます。
テンプレート
メトリクスクエリでサーバー、アプリケーション、センサー名などのモノをハードコーディングする代わりに、代わりに変数を使用できます。変数は、ダッシュボードの上部にドロップダウン選択ボックスとして表示されます。これらのドロップダウンボックスを使用して、ダッシュボードに表示されるデータを変更できます。
テンプレート変数とテンプレート変数の詳細については、「」を参照してくださいテンプレートと変数。
クエリ変数
タイプ のテンプレート変数を追加するとQuery
、測定名、キー名、ドロップダウン選択ボックスとして表示されるキー値などのものを返すことができる MSSQL クエリを作成できます。
例えば、テンプレート変数 Query 設定でこのようなクエリを指定した場合、テーブル内のhostname
列のすべての値を含む変数を使用できます。
SELECT hostname FROM host
クエリは複数の列を返すことができ、Grafana は自動的にそれらからリストを作成します。例えば、次のクエリは、 hostname
および の値を含むリストを返しますhostname2
。
SELECT [host].[hostname], [other_host].[hostname2] FROM host JOIN other_host ON [host].[city] = [other_host].[city]
もう 1 つのオプションは、キー/値変数を作成できるクエリです。クエリは、 __text
および という名前の 2 つの列を返す必要があります__value
。__text
列の値は一意である必要があります (一意でない場合、最初の値が使用されます)。ドロップダウンリストのオプションには、わかりやすい名前をテキストとして、ID を値として指定できるテキストと値があります。をテキストhostname
、 を値id
とするクエリの例:
SELECT hostname __text, id __value FROM host
ネストされた変数を作成することもできます。例えば、 という名前の別の変数がある場合ですregion
。次に、hosts 変数に、現在選択されているリージョンのホストのみを次のようなクエリで表示させることができます ( region
が複数値変数の場合は、複数の値と照合=
するのではなくIN
比較演算子を使用します)。
SELECT hostname FROM host WHERE region IN ($region)
クエリでの変数の使用
注記
テンプレート変数の値は、テンプレート変数が の場合にのみ引用符で囲まれますmulti-value
。
変数が複数値変数の場合は、複数の値と照合=
するのではなく、IN
比較演算子を使用します。
次の 2 つの構文があります。
$<varname>
という名前のテンプレート変数の例hostname
:
SELECT atimestamp time, aint value FROM table WHERE $__timeFilter(atimestamp) and hostname in($hostname) ORDER BY atimestamp
[[varname]]
という名前のテンプレート変数の例hostname
:
SELECT atimestamp as time, aint as value FROM table WHERE $__timeFilter(atimestamp) and hostname in([[hostname]]) ORDER BY atimestamp
複数値変数の引用を無効にする
Grafana は、複数値変数の引用符で区切られたカンマ区切り文字列を自動的に作成します。例えば、 server01
と server02
を選択した場合、 の形式になります'server01', 'server02'
。引用を無効にするには、変数に csv フォーマットオプションを使用します。
${servers:csv}
可変フォーマットオプションの詳細については、「」を参照してくださいテンプレートと変数。
注釈
注釈を使用して、グラフの上に豊富なイベント情報をオーバーレイできます。ダッシュボードメニュー/注釈ビューを使用して注釈クエリを追加します。詳細については、「注釈」を参照してください。
列:
名前 | 説明 |
---|---|
time
|
日付/時刻フィールドの名前。SQL のネイティブ日付/時刻データ型またはエポック値を持つ列にすることができます。 |
timeend
|
終了日時フィールドのオプション名。SQL のネイティブ日付/時刻データ型またはエポック値を持つ列にすることができます。 |
text
|
イベントの説明フィールド。 |
tags
|
イベントタグに使用するオプションのフィールド名をカンマで区切った文字列として指定します。 |
次のサンプルコードは、データベーステーブルを示しています。
CREATE TABLE [events] ( time_sec bigint, description nvarchar(100), tags nvarchar(100), )
また、 で定義されているデータベーステーブルも使用します時系列クエリ。
次のサンプルコードは、エポック値を持つ時間列を使用したクエリを示しています。
SELECT time_sec as time, description as [text], tags FROM [events] WHERE $__unixEpochFilter(time_sec) ORDER BY 1
次のサンプルコードは、エポック値を持つ時間および時間終了列を使用したリージョンクエリを示しています。
SELECT time_sec as time, time_end_sec as timeend, description as [text], tags FROM [events] WHERE $__unixEpochFilter(time_sec) ORDER BY 1
次のコード例は、ネイティブ SQL 日付/時刻データ型の時間列を使用したクエリを示しています。
SELECT time, measurement as text, convert(varchar, valueOne) + ',' + convert(varchar, valueTwo) as tags FROM metric_values WHERE $__timeFilter(time_column) ORDER BY 1
ストアドプロシージャのサポート
ストアドプロシージャは機能することが検証されています。ただし、予想どおりに機能しないエッジケースがあるかもしれません。列の同じ命名を使用し、それぞれのセクションで前述したのと同じ形式でデータを返す限り、ストアドプロシージャはテーブル、時系列、および注釈クエリでサポートされる必要があります。
マクロ関数はストアドプロシージャ内では機能しません。
例
次の例では、データベーステーブルは時系列クエリで定義されています。列 、valueOne
、 のすべての組み合わせなど、グラフパネルで 4 つのシリーズを視覚化するとvalueTwo
しますmeasurement
。右側のグラフパネルには、達成したいことが視覚化されています。これを解決するには、次の 2 つのクエリを使用する必要があります。
次のサンプルコードは、最初のクエリを示しています。
SELECT $__timeGroup(time, '5m') as time, measurement + ' - value one' as metric, avg(valueOne) as valueOne FROM metric_values WHERE $__timeFilter(time) GROUP BY $__timeGroup(time, '5m'), measurement ORDER BY 1
次のサンプルコードは、2 番目のクエリを示しています。
SELECT $__timeGroup(time, '5m') as time, measurement + ' - value two' as metric, avg(valueTwo) as valueTwo FROM metric_values GROUP BY $__timeGroup(time, '5m'), measurement ORDER BY 1
エポック形式の時間を使用したストアドプロシージャ
上記のようなグラフパネルで 4 つのシリーズをレンダリングするために必要なすべてのデータを返すストアドプロシージャを定義できます。この場合、ストアドプロシージャはint
、データ型の @from
と @to
の 2 つのパラメータを受け入れます。これは、ストアドプロシージャから返されるデータをフィルタリングするために使用されるエポック形式の時間範囲 (最初から最後まで) である必要があります。
これは、式によって選択およびグループ化$__timeGroup(time, '5m')
される を模倣しているため、多数の長い式が必要です。これらは、必要に応じて MSSQL 関数に抽出できます。
CREATE PROCEDURE sp_test_epoch( @from int, @to int ) AS BEGIN SELECT cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int) as time, measurement + ' - value one' as metric, avg(valueOne) as value FROM metric_values WHERE time >= DATEADD(s, @from, '1970-01-01') AND time <= DATEADD(s, @to, '1970-01-01') GROUP BY cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int), measurement UNION ALL SELECT cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int) as time, measurement + ' - value two' as metric, avg(valueTwo) as value FROM metric_values WHERE time >= DATEADD(s, @from, '1970-01-01') AND time <= DATEADD(s, @to, '1970-01-01') GROUP BY cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int), measurement ORDER BY 1 END
その後、グラフパネルに次のクエリを使用できます。
DECLARE @from int = $__unixEpochFrom(), @to int = $__unixEpochTo() EXEC dbo.sp_test_epoch @from, @to
日時形式の時刻を使用したストアドプロシージャ
上記のようなグラフパネルで 4 つのシリーズをレンダリングするために必要なすべてのデータを返すストアドプロシージャを定義できます。この場合、ストアドプロシージャはdatetime
、データ型の @from
と @to
の 2 つのパラメータを受け入れます。これは、ストアドプロシージャから返されるデータをフィルタリングするために使用される時間範囲 (最初から最後まで) である必要があります。
これは、式によって選択およびグループ化$__timeGroup(time, '5m')
される を模倣しているため、多数の長い式が必要です。これらは、必要に応じて MSSQL 関数に抽出できます。
CREATE PROCEDURE sp_test_datetime( @from datetime, @to datetime ) AS BEGIN SELECT cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int) as time, measurement + ' - value one' as metric, avg(valueOne) as value FROM metric_values WHERE time >= @from AND time <= @to GROUP BY cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int), measurement UNION ALL SELECT cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int) as time, measurement + ' - value two' as metric, avg(valueTwo) as value FROM metric_values WHERE time >= @from AND time <= @to GROUP BY cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int), measurement ORDER BY 1 END
その後、グラフパネルに次のクエリを使用できます。
DECLARE @from datetime = $__timeFrom(), @to datetime = $__timeTo() EXEC dbo.sp_test_datetime @from, @to
アラート
時系列クエリはアラート条件で機能する必要があります。テーブル形式のクエリは、アラートルール条件ではまだサポートされていません。