Connectez-vous à une source de données Microsoft SQL Server - Amazon Managed Grafana

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 dans la documentation des trames de données Grafana.

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 des colonnes de données.

Ajouter la source de données

  1. Ouvrez le menu latéral en choisissant l'icône Grafana dans l'en-tête supérieur.

  2. Dans le menu latéral, sous le lien Configuration, vous devriez trouver un lien Sources de données.

  3. Cliquez sur le bouton + Ajouter une source de données dans l'en-tête supérieur.

  4. 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 (falseGrafana 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.

  1. Sélectionnez Formater comme Time series (pour une utilisation dans les panneaux Graph ou Singlestat, entre autres) ou Table (pour une utilisation dans le panneau Table, entre autres).

  2. Il s'agit de l'éditeur dans lequel vous écrivez vos requêtes SQL.

  3. Afficher la section d'aide pour MSSQL sous l'éditeur de requêtes.

  4. 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.

  5. 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'regionagit 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.