Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Connectez-vous à une source de données Microsoft SQL Server
Utilisez la source de données Microsoft SQL Server (MSSQL) pour interroger et visualiser les données de tout Microsoft SQL Server 2005 ou version ultérieure, y compris Microsoft Azure SQL Database.
Important
Grafana version 8.0 modifie la structure de données sous-jacente des trames de données pour Microsoft SQL Server, Postgres et MySQL. Par conséquent, le résultat d'une requête de série chronologique est renvoyé dans un format large. Pour plus d'informations, consultez la section Format large
Pour que vos visualisations fonctionnent comme avant, vous devrez peut-être effectuer des migrations manuelles. Une solution est documentée sur Github à l'adresse Postgres/MySQL/MSSQL : modification majeure de la version 8.0 concernant les requêtes de séries chronologiques et l'ordre
Ajouter la source de données
-
Ouvrez le menu latéral en choisissant l'icône Grafana dans l'en-tête supérieur.
-
Dans le menu latéral, sous le lien Configuration, vous devriez trouver un lien Sources de données.
-
Cliquez sur le bouton + Ajouter une source de données dans l'en-tête supérieur.
-
Sélectionnez Microsoft SQL Server dans la liste déroulante Type.
Options de source de données
Name (Nom) | Description |
---|---|
Name
|
Le nom de la source de données. C'est ainsi que vous voyez la source de données dans les panneaux et les requêtes. |
Default
|
La source de données par défaut signifie qu'elle sera présélectionnée pour les nouveaux panneaux. |
Host
|
Adresse IP/nom d'hôte et port facultatif de votre instance MSSQL. Si le port est omis, la valeur par défaut 1433 sera utilisée. |
Database
|
Nom de votre base de données MSSQL. |
User
|
Login/nom d'utilisateur de l'utilisateur de la base de données. |
Password
|
Mot de passe de l'utilisateur de la base de données |
Encrypt
|
Cette option détermine si et dans quelle mesure une connexion TCP/IP SSL sécurisée sera négociée avec le serveur, par défaut (false Grafana v5.4+). |
Max open
|
Nombre maximum de connexions ouvertes à la base de données, par défaut unlimited (Grafana v5.4+). |
Max idle
|
Nombre maximal de connexions dans le pool de connexions inactives, par défaut 2 (Grafana v5.4+). |
Max lifetime
|
Durée maximale en secondes pendant laquelle une connexion peut être réutilisée, par défaut 14400 /4 heures. |
Intervalle de temps minimum
Une limite inférieure pour les $_interval
$_interval_ms
variables. Il est recommandé de régler la fréquence d'écriture, par exemple 1m
si vos données sont écrites toutes les minutes. Cette option peut également être remplacée/configurée dans un panneau de tableau de bord sous Options de source de données. Cette valeur doit être formatée sous la forme d'un nombre suivi d'un identifiant horaire valide, par exemple 1m
(1 minute) ou 30s
(30 secondes). Les identifiants horaires suivants sont pris en charge.
Identifiant | Description |
---|---|
y
|
Année |
M
|
Mois |
w
|
semaine |
d
|
jour |
h
|
Heure |
m
|
Minute |
s
|
Seconde |
ms
|
Milliseconde |
Autorisations utilisateur de base de données
Important
L'utilisateur de base de données que vous spécifiez lorsque vous ajoutez la source de données ne doit disposer des autorisations SELECT que sur la base de données et les tables spécifiées que vous souhaitez interroger. Grafana ne confirme pas que la requête est sûre. La requête peut inclure n'importe quelle instruction SQL. Par exemple, des instructions telles que DELETE FROM user;
et DROP TABLE user;
seraient exécutées. Pour vous protéger contre cela, nous vous recommandons vivement de créer un utilisateur MSSQL spécifique avec des autorisations restreintes.
L'exemple de code suivant montre la création d'un utilisateur MSSQL spécifique avec des autorisations restreintes.
CREATE USER grafanareader WITH PASSWORD 'password' GRANT SELECT ON dbo.YourTable3 TO grafanareader
Assurez-vous que l'utilisateur n'obtient aucune autorisation indésirable de la part du rôle public.
Problèmes connus
Si vous utilisez une ancienne version de Microsoft SQL Server, telle que 2008 et 2008R2, vous devrez peut-être désactiver le chiffrement pour pouvoir vous connecter. Dans la mesure du possible, nous vous recommandons d'utiliser le dernier service pack disponible pour une compatibilité optimale.
Éditeur de requête
Vous trouverez l'éditeur de requêtes MSSQL dans l'onglet métriques du mode d'édition du graphique, de Singlestat ou du tableau de bord. Vous passez en mode édition en choisissant le titre du panneau, puis en choisissant Modifier. L'éditeur permet de définir une requête SQL pour sélectionner les données à visualiser.
-
Sélectionnez Formater comme
Time series
(pour une utilisation dans les panneaux Graph ou Singlestat, entre autres) ouTable
(pour une utilisation dans le panneau Table, entre autres). -
Il s'agit de l'éditeur dans lequel vous écrivez vos requêtes SQL.
-
Afficher la section d'aide pour MSSQL sous l'éditeur de requêtes.
-
Afficher la requête SQL qui a été exécutée. Sera disponible en premier une fois qu'une requête aura été exécutée avec succès.
-
Ajoutez une requête supplémentaire dans laquelle un éditeur de requêtes supplémentaire sera affiché.
Macros
Pour simplifier la syntaxe et autoriser les parties dynamiques, telles que les filtres de plage de dates, la requête peut contenir des macros.
Exemple de macro | Description |
---|---|
$__time(dateColumn)
|
Sera remplacée par une expression pour renommer la colonne en fonction de l'heure. Par exemple, DateColumn comme heure. |
$__timeEpoch(dateColumn)
|
Sera remplacé par une expression pour convertir un type de colonne DATETIME en horodatage Unix et le renommer en heure. Par exemple, DATEDIFF (second, « 1970-01-01 », DateColumn) AS time. |
$__timeFilter(dateColumn)
|
Sera remplacé par un filtre de plage de temps utilisant le nom de colonne spécifié. Par exemple, DateColumn BETWEEN « 2017-04-21T 05:01:17 Z » ET « 2017-04-21T 05:06:17 Z ». |
$__timeFrom()
|
Sera remplacé par le début de la sélection d'heure actuellement active. Par exemple, « 2017-04-21T 05:01:17 Z ». |
$__timeTo()
|
Sera remplacé à la fin de la sélection d'heure actuellement active. Par exemple, « 2017-04-21T 05:06:17 Z ». |
$__timeGroup(dateColumn,'5m'[, fillvalue])
|
Sera remplacée par une expression utilisable dans la clause GROUP BY. La fourniture d'une valeur FillValue NULL ou d'une valeur flottante remplira automatiquement les séries vides dans la plage de temps avec cette valeur. Par exemple, CAST (ROUND (DATEDIFF (second, « 1970-01-01", time_column) /300.0, 0) en tant que bigint) *300. |
$__timeGroup(dateColumn,'5m', 0)
|
Identique au précédent mais avec un paramètre de remplissage, les points manquants dans cette série seront ajoutés par grafana et 0 sera utilisé comme valeur. |
$__timeGroup(dateColumn,'5m', NULL)
|
Comme ci-dessus, mais NULL sera utilisé comme valeur pour les points manquants. |
$__timeGroup(dateColumn,'5m', previous)
|
Comme ci-dessus, mais la valeur précédente de cette série sera utilisée comme valeur de remplissage si aucune valeur n'a été vue, mais la valeur NULL sera utilisée (uniquement disponible dans Grafana 5.3+). |
L'éditeur de requêtes possède un lien SQL généré qui s'affiche après l'exécution d'une requête, en mode édition du panneau. Choisissez-le et il se développera et affichera la chaîne SQL interpolée brute qui a été exécutée.
Requêtes de table
Si l'option de requête est définie sur Formater en tant que table, vous pouvez essentiellement effectuer n'importe quel type de requête SQL. Le panneau du tableau affiche automatiquement les résultats des colonnes et des lignes renvoyées par votre requête.
L'exemple de code suivant montre une table de base de données.
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')
L'exemple de code suivant montre une requête.
SELECT * FROM [mssql_types]
Vous pouvez contrôler le nom des colonnes du panneau Table à l'aide de la syntaxe AS
SQL classique de sélection des colonnes, comme illustré dans l'exemple de code suivant.
SELECT c_bit as [column1], c_tinyint as [column2] FROM [mssql_types]
Le panneau de table qui en résulte :
Requêtes de séries chronologiques
Si vous définissez le format comme série chronologique, pour une utilisation dans le panneau graphique par exemple, la requête doit avoir une colonne nommée time
qui renvoie soit une date SQL, soit un type de données numérique représentant l'époque Unix en secondes. Vous pouvez renvoyer une colonne nommée metric
qui est utilisée comme nom de métrique pour la colonne de valeurs. Toute colonne sauf time
et metric
est traitée comme une colonne de valeur. Si vous omettez la metric
colonne, le nom de la colonne de valeur sera le nom de la métrique. Vous pouvez sélectionner plusieurs colonnes de valeurs, chacune portant son nom de métrique. Si vous renvoyez plusieurs colonnes de valeurs et qu'une colonne est nomméemetric
, cette colonne est utilisée comme préfixe pour le nom de série.
Les ensembles de résultats des requêtes de séries chronologiques doivent être triés par ordre chronologique.
L'exemple de code suivant montre une table de base de données.
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)
L'exemple de code suivant montre une value
et une metric
colonne.
SELECT time, valueOne, measurement as metric FROM metric_values WHERE $__timeFilter(time) ORDER BY 1
Lorsque la requête précédente est utilisée dans un panneau graphique, elle produit deux séries nommées Metric A
et Metric B
avec les valeurs valueOne
et valueTwo
tracées dessustime
.
L'exemple de code suivant montre plusieurs value
colonnes.
SELECT time, valueOne, valueTwo FROM metric_values WHERE $__timeFilter(time) ORDER BY 1
Lorsque la requête précédente est utilisée dans un panneau graphique, elle produit deux séries nommées Metric A
et Metric B
avec les valeurs valueOne
et valueTwo
tracées dessustime
.
L'exemple de code suivant montre l'utilisation de la macro $__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
Lorsque la requête précédente est utilisée dans un panneau graphique, elle produit deux séries nommées Metric A
et Metric B
avec les valeurs valueOne
et valueTwo
tracées dessustime
. Toute série dépourvue de valeur dans une fenêtre de trois minutes affichera une ligne entre ces deux lignes. Vous remarquerez que le graphique de droite ne descend jamais à zéro.
L'exemple de code suivant montre l'utilisation de la macro $__timeGroup avec un paramètre de remplissage défini sur zéro.
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
Lorsque cette requête est utilisée dans un panneau graphique, le résultat est deux séries nommées Metric A
et Metric B
dont la somme est valueTwo
tracée au-dessustime
. Toute série dépourvue de valeur dans une fenêtre de 3 minutes aura une valeur de zéro, que vous verrez apparaître dans le graphique de droite.
Création de modèles
Au lieu de coder en dur des éléments tels que le nom du serveur, de l'application et du capteur dans vos requêtes métriques, vous pouvez utiliser des variables à leur place. Les variables sont affichées sous forme de boîtes de sélection déroulantes en haut du tableau de bord. Vous pouvez utiliser ces listes déroulantes pour modifier les données affichées dans votre tableau de bord.
Pour plus d'informations sur les modèles et les variables de modèles, consultezModèles et variables.
Variable de requête
Si vous ajoutez une variable de modèle de ce typeQuery
, vous pouvez écrire une requête MSSQL qui peut renvoyer des éléments tels que des noms de mesures, des noms de clés ou des valeurs de clé qui sont affichés sous forme de boîte de sélection déroulante.
Par exemple, vous pouvez avoir une variable contenant toutes les valeurs de la hostname
colonne d'une table si vous spécifiez une requête comme celle-ci dans le paramètre Query de la variable de modèle.
SELECT hostname FROM host
Une requête peut renvoyer plusieurs colonnes et Grafana créera automatiquement une liste à partir de celles-ci. Par exemple, la requête suivante renverra une liste contenant les valeurs de hostname
ethostname2
.
SELECT [host].[hostname], [other_host].[hostname2] FROM host JOIN other_host ON [host].[city] = [other_host].[city]
Une autre option est une requête qui permet de créer une variable clé/valeur. La requête doit renvoyer deux colonnes nommées __text
et__value
. La valeur de la __text
colonne doit être unique (si elle ne l'est pas, c'est la première valeur qui est utilisée). Les options de la liste déroulante comporteront un texte et une valeur qui vous permettront d'avoir un nom convivial sous forme de texte et un identifiant comme valeur. Exemple de requête avec hostname
comme texte et id
comme valeur :
SELECT hostname __text, id __value FROM host
Vous pouvez également créer des variables imbriquées. Par exemple, si vous aviez une autre variable nomméeregion
. Vous pouvez alors faire en sorte que la variable hosts n'affiche que les hôtes de la région actuellement sélectionnée avec une requête comme celle-ci (s'il s'region
agit d'une variable à valeurs multiples, utilisez l'opérateur de IN
comparaison plutôt que de la comparer =
à plusieurs valeurs).
SELECT hostname FROM host WHERE region IN ($region)
Utilisation de variables dans les requêtes
Note
Les valeurs des variables de modèle ne sont citées que lorsque la variable de modèle est unmulti-value
.
Si la variable est une variable à valeurs multiples, utilisez l'opérateur de IN
comparaison plutôt que de =
la comparer à plusieurs valeurs.
Il existe deux syntaxes :
$<varname>
Exemple avec une variable de modèle nommée hostname
:
SELECT atimestamp time, aint value FROM table WHERE $__timeFilter(atimestamp) and hostname in($hostname) ORDER BY atimestamp
[[varname]]
Exemple avec une variable de modèle nommée hostname
:
SELECT atimestamp as time, aint as value FROM table WHERE $__timeFilter(atimestamp) and hostname in([[hostname]]) ORDER BY atimestamp
Désactiver les guillemets pour les variables à valeurs multiples
Grafana crée automatiquement une chaîne entre guillemets séparée par des virgules pour les variables à valeurs multiples. Par exemple, si server01
et server02
sont sélectionnés, il sera formaté comme suit :'server01', 'server02'
. Pour désactiver les guillemets, utilisez l'option de formatage csv pour les variables.
${servers:csv}
Pour plus d'informations sur les options de mise en forme des variables, consultezModèles et variables.
Annotations
Vous pouvez utiliser des annotations pour superposer des informations détaillées sur les événements au-dessus des graphiques. Vous pouvez ajouter des requêtes d'annotation via le menu Tableau de bord/Vue des annotations. Pour plus d’informations, consultez Annotations.
Colonnes :
Name (Nom) | Description |
---|---|
time
|
Nom du champ date/heure. Il peut s'agir d'une colonne avec un type de données de date/heure ou une valeur d'époque SQL natif. |
timeend
|
Nom facultatif du champ date/heure de fin. Il peut s'agir d'une colonne avec un type de données de date/heure ou une valeur d'époque SQL natif. |
text
|
Champ de description de l'événement. |
tags
|
Nom de champ facultatif à utiliser pour les balises d'événements sous forme de chaîne séparée par des virgules. |
L'exemple de code suivant montre les tables de base de données.
CREATE TABLE [events] ( time_sec bigint, description nvarchar(100), tags nvarchar(100), )
Nous utilisons également la table de base de données définie dansRequêtes de séries chronologiques.
L'exemple de code suivant montre une requête utilisant une colonne de temps avec des valeurs d'époque.
SELECT time_sec as time, description as [text], tags FROM [events] WHERE $__unixEpochFilter(time_sec) ORDER BY 1
L'exemple de code suivant montre une requête de région utilisant des colonnes d'heure et de fin de période avec des valeurs d'époque.
SELECT time_sec as time, time_end_sec as timeend, description as [text], tags FROM [events] WHERE $__unixEpochFilter(time_sec) ORDER BY 1
L'exemple de code suivant montre une requête utilisant une colonne de temps de type date/heure SQL natif.
SELECT time, measurement as text, convert(varchar, valueOne) + ',' + convert(varchar, valueTwo) as tags FROM metric_values WHERE $__timeFilter(time_column) ORDER BY 1
Support des procédures stockées
Le fonctionnement des procédures enregistrées a été vérifié. Cependant, il peut y avoir des cas extrêmes où cela ne fonctionnera pas comme prévu. Les procédures stockées doivent être prises en charge dans les requêtes de table, de séries chronologiques et d'annotation, à condition que vous utilisiez le même nom de colonnes et que vous rencontriez les données dans le même format que celui décrit précédemment dans les sections respectives.
Les fonctions macro ne fonctionneront pas dans une procédure stockée.
Exemples
Dans les exemples suivants, la table de base de données est définie dans les requêtes de séries chronologiques. Supposons que vous souhaitiez visualiser quatre séries dans un panneau graphique, telles que toutes les combinaisons de colonnesvalueOne
, valueTwo
etmeasurement
. Le panneau graphique à droite permet de visualiser ce que nous voulons réaliser. Pour résoudre ce problème, vous devez utiliser deux requêtes :
L'exemple de code suivant montre la première requête.
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
L'exemple de code suivant montre la deuxième requête.
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
Procédure stockée utilisant le temps au format Epoch
Vous pouvez définir une procédure stockée qui renverra toutes les données dont vous avez besoin pour afficher quatre séries dans un panneau graphique comme ci-dessus. Dans ce cas, la procédure stockée accepte deux paramètres, l'un @from
des @to
types de int
données, qui doit être une plage de temps (de à) au format epoch qui sera utilisée pour filtrer les données à renvoyer par la procédure stockée.
Cela imite les expressions $__timeGroup(time, '5m')
in select et group by, et c'est pourquoi de nombreuses expressions longues sont nécessaires. Elles peuvent être extraites vers des fonctions MSSQL, si vous le souhaitez.
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
Vous pouvez ensuite utiliser la requête suivante pour votre panneau graphique.
DECLARE @from int = $__unixEpochFrom(), @to int = $__unixEpochTo() EXEC dbo.sp_test_epoch @from, @to
Procédure stockée utilisant l'heure au format date/heure
Vous pouvez définir une procédure stockée qui renverra toutes les données dont vous avez besoin pour afficher quatre séries dans un panneau graphique comme ci-dessus. Dans ce cas, la procédure stockée accepte deux paramètres, @from
l'un des types de datetime
données, qui doit être une plage de temps (de à) qui sera utilisée pour filtrer les données à renvoyer par la procédure stockée. @to
Cela imite les expressions $__timeGroup(time, '5m')
in select et group by, et c'est pourquoi de nombreuses expressions longues sont nécessaires. Elles peuvent être extraites vers des fonctions MSSQL, si vous le souhaitez.
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
Vous pouvez ensuite utiliser la requête suivante pour votre panneau graphique.
DECLARE @from datetime = $__timeFrom(), @to datetime = $__timeTo() EXEC dbo.sp_test_datetime @from, @to
Alerte
Les requêtes de séries chronologiques devraient fonctionner dans des conditions d'alerte. Les requêtes mises en forme de tableau ne sont pas encore prises en charge dans les conditions des règles d'alerte.