DDSQL est SQL pour les données Datadog. Il implémente plusieurs opérations SQL standard, telles que SELECT, et permet des requêtes sur des données non structurées. Vous pouvez effectuer des actions comme obtenir exactement les données que vous souhaitez en écrivant votre propre instruction SELECT, ou interroger des tags comme s’ils étaient des colonnes de table standard.
Vous pouvez exécuter des requêtes DDSQL à partir d’agents AI en utilisant l’ensemble d’outils Datadog MCP Serverddsql (Aperçu).
Cette documentation couvre le support SQL disponible et inclut :
Cette clause est un raccourci pour les jointures où les colonnes de jointure ont le même nom dans les deux tables. Elle prend une liste de ces colonnes séparées par des virgules et crée une condition d’égalité distincte pour chaque paire correspondante. Par exemple, joindre T1 et T2 avec USING (a, b) est équivalent à ON T1.a = T2.a AND T1.b = T2.b.
Intervalle représentant une durée de temps spécifiée dans une unité donnée.
Unités prises en charge : - milliseconds / millisecond - seconds / second - minutes / minute - hours / hour - days / day
Types de données
DDSQL prend en charge les types de données suivants :
Type de données
Description
BIGINT
Entiers signés de 64 bits.
BOOLEAN
true ou false valeurs.
DECIMAL
Nombres à virgule flottante.
INET
Valeurs d’adresse réseau (IPv4 et IPv6, avec longueur de préfixe CIDR optionnelle).
INTERVAL
Valeurs de durée de temps.
JSON
Données JSON.
TIMESTAMP
Valeurs de date et d’heure.
VARCHAR
Chaînes de caractères de longueur variable.
Types de tableau
Tous les types de données prennent en charge les types de tableau. Voir Tableaux pour les littéraux de tableau, l’accès aux éléments et les fonctions de tableau.
Littéraux de type
DDSQL prend en charge les littéraux de type explicites en utilisant la syntaxe [TYPE] [value].
Type
Syntaxe
Exemple
BIGINT
BIGINT 'value'
BIGINT '1234567'
BOOLEAN
BOOLEAN 'value'
BOOLEAN 'true'
DECIMAL
DECIMAL 'value'
DECIMAL '3.14159'
INET
INET 'value'
INET '192.168.1.5/24'
INTERVAL
INTERVAL 'value unit'
INTERVAL '30 minutes'
JSON
JSON 'value'
JSON '{"key": "value", "count": 42}'
TIMESTAMP
TIMESTAMP 'value'
TIMESTAMP '2023-12-25 10:30:00'
VARCHAR
VARCHAR 'value'
VARCHAR 'hello world'
Le préfixe de type peut être omis et le type est automatiquement déduit de la valeur. Par exemple, 'hello world' est déduit comme VARCHAR, 123 comme BIGINT, et true comme BOOLEAN. Utilisez des préfixes de type explicites lorsque les valeurs pourraient être ambiguës ; par exemple, TIMESTAMP '2025-01-01' serait déduit comme VARCHAR sans le préfixe.
Exemple
-- Using type literals in queries
SELECTVARCHAR'Product Name: '||nameASlabeled_name,price*DECIMAL'1.08'ASprice_with_tax,created_at+INTERVAL'7 days'ASexpiry_dateFROMproductsWHEREcreated_at>TIMESTAMP'2025-01-01';
Tableaux
Les tableaux sont des collections ordonnées de valeurs qui partagent toutes le même type de données. Chaque type de base DDSQL a un type de tableau correspondant.
Littéraux de tableau
Utilisez la syntaxe ARRAY[value1, value2, ...] pour construire un littéral de tableau. Le type du tableau est automatiquement déduit des valeurs.
Aligne un horodatage (source) sur des seaux de longueur égale (pas). Renvoie le début du seau contenant la source, calculé comme le plus grand horodatage inférieur ou égal à la source et qui est un multiple du pas à partir de l’origine.
DATE_TRUNC(string unit, timestamp t)
horodatage
Tronque un horodatage à une précision spécifiée en fonction de l’unité fournie.
CURRENT_SETTING(string setting_name)
chaîne
Renvoie la valeur actuelle du paramètre spécifié. Prend en charge les paramètres dd.time_frame_start et dd.time_frame_end, qui renvoient respectivement le début et la fin de la période de temps globale.
NOW()
horodatage
Renvoie l’horodatage UTC actuel au début de la requête actuelle.
CARDINALITY(array a)
entier
Renvoie le nombre d’éléments dans le tableau.
ARRAY_POSITION(array a, typeof_array value)
entier
Renvoie l’index de la première occurrence de la valeur trouvée dans le tableau, ou null si la valeur n’est pas trouvée.
STRING_TO_ARRAY(string s, string delimiter)
tableau de chaînes
Divise la chaîne donnée en un tableau de chaînes en utilisant le délimiteur donné.
ARRAY_TO_STRING(array a, string delimiter)
chaîne
Convertit un tableau en une chaîne en concaténant les éléments avec le délimiteur donné.
ARRAY_AGG(expression e)
tableau de type d’entrée
Crée un tableau en collectant toutes les valeurs d’entrée.
APPROX_PERCENTILE(double percentile) WITHIN GROUP (ORDER BY expression e)
type d’expression
Calcule une valeur percentile approximative. Le percentile doit être compris entre 0,0 et 1,0 (inclus). Nécessite la syntaxe WITHIN GROUP (ORDER BY ...).
UNNEST(array a [, array b...])
lignes d’un [, b…]
Développe les tableaux en un ensemble de lignes. Cette forme n’est autorisée que dans une clause FROM.
dd.time_frame_start : Renvoie le début de la période sélectionnée au format RFC 3339 (YYYY-MM-DD HH:mm:ss.sss±HH:mm).
dd.time_frame_end : Renvoie la fin de la période sélectionnée au format RFC 3339 (YYYY-MM-DD HH:mm:ss.sss±HH:mm).
-- Define the current analysis window
WITHboundsAS(SELECTCAST(CURRENT_SETTING('dd.time_frame_start')ASTIMESTAMP)AStime_frame_start,CAST(CURRENT_SETTING('dd.time_frame_end')ASTIMESTAMP)AStime_frame_end),-- Define the immediately preceding window of equal length
previous_boundsAS(SELECTtime_frame_start-(time_frame_end-time_frame_start)ASprev_time_frame_start,time_frame_startASprev_time_frame_endFROMbounds)SELECT*FROMbounds,previous_bounds
-- Calculate the median (50th percentile) response time
SELECTAPPROX_PERCENTILE(0.5)WITHINGROUP(ORDERBYresponse_time)ASmedian_response_timeFROMlogs-- Calculate 95th and 99th response time percentiles by service
SELECTservice_name,APPROX_PERCENTILE(0.95)WITHINGROUP(ORDERBYresponse_time)ASp95_response_time,APPROX_PERCENTILE(0.99)WITHINGROUP(ORDERBYresponse_time)ASp99_response_timeFROMlogsGROUPBYservice_name
Expressions régulières
Variantes
Toutes les fonctions d’expressions régulières (regex) utilisent la variante des Composants Internationaux pour Unicode (ICU) :
Renvoie les sous-chaînes de la première correspondance de motif dans la chaîne.
Cette fonction recherche la chaîne d’entrée en utilisant le motif donné et renvoie les sous-chaînes capturées (groupes de capture) de la première correspondance. Si aucun groupe de capture n’est présent, renvoie la correspondance complète.
Ce tableau fournit un aperçu des fonctions de fenêtre prises en charge. Pour des détails complets et des exemples, consultez la documentation PostgreSQL.
Fonction
Type de retour
Description
OVER
N/A
Définit une fenêtre pour un ensemble de lignes sur lesquelles d’autres fonctions de fenêtre peuvent opérer.
PARTITION BY
N/A
Divise l’ensemble des résultats en partitions, spécifiquement pour appliquer des fonctions de fenêtre.
RANK()
entier
Attribue un rang à chaque ligne au sein d’une partition, avec des lacunes pour les égalités.
ROW_NUMBER()
entier
Attribue un numéro séquentiel unique à chaque ligne au sein d’une partition.
LEAD(column n)
type de colonne
Renvoie la valeur de la ligne suivante dans la partition.
LAG(column n)
type de colonne
Renvoie la valeur de la ligne précédente dans la partition.
FIRST_VALUE(column n)
type de colonne
Renvoie la première valeur dans un ensemble ordonné de valeurs.
LAST_VALUE(column n)
type de colonne
Renvoie la dernière valeur dans un ensemble ordonné de valeurs.
NTH_VALUE(column n, offset)
type de colonne
Renvoie la valeur à l’offset spécifié dans un ensemble ordonné de valeurs.
Fonctions et opérateurs JSON
Nom
Type de retour
Description
json_extract_path_text(text json, text path…)
texte
Extrait un sous-objet JSON sous forme de texte, défini par le chemin. Son comportement est équivalent à la fonction Postgres du même nom. Par exemple, json_extract_path_text(col, ‘forest') renvoie la valeur de la clé forest pour chaque objet JSON dans col. Voir l’exemple ci-dessous pour une syntaxe de tableau JSON.
json_extract_path(text json, text path…)
JSON
Même fonctionnalité que json_extract_path_text, mais renvoie une colonne de type JSON au lieu de type texte.
json_array_elements(text json)
lignes de JSON
Développe un tableau JSON en un ensemble de lignes. Cette forme n’est autorisée que dans une clause FROM.
json_array_elements_text(text json)
lignes de résultat
Transforme un tableau JSON en un ensemble de lignes. Cette forme n’est autorisée que dans une clause FROM.
Fonctions et opérateurs d’adresse réseau
Le type inet représente les adresses réseau IPv4 et IPv6 avec une longueur de préfixe CIDR optionnelle (par exemple, 192.168.1.5/24 ou ::1). Créez des valeurs inet avec la syntaxe littérale de type INET 'value' ou en convertissant une chaîne avec CAST(column AS inet).
Fonctions
Fonction
Type de retour
Description
host(inet addr)
VARCHAR
Renvoie l’adresse IP sous forme de texte, sans la longueur de préfixe.
network(inet addr)
INET
Renvoie la partie réseau de l’adresse, avec les bits d’hôte mis à zéro.
netmask(inet addr)
INET
Renvoie le masque réseau pour l’adresse.
masklen(inet addr)
BIGINT
Renvoie la longueur de préfixe du masque réseau.
broadcast(inet addr)
INET
Renvoie l’adresse de diffusion du réseau.
family(inet addr)
BIGINT
Renvoie la famille d’adresses : 4 pour IPv4, 6 pour IPv6.
Opérateurs
Opérateur
Type de retour
Description
inet a << inet b
BOOLEAN
Renvoie true si a est strictement contenu dans b.
inet a <<= inet b
BOOLEAN
Renvoie true si a est contenu dans ou égal à b.
inet a >> inet b
BOOLEAN
Renvoie true si a contient strictement b.
inet a >>= inet b
BOOLEAN
Renvoie true si a contient ou est égal à b.
inet a && inet b
BOOLEAN
Renvoie true si les sous-réseaux de a et b se chevauchent.
-- Check if an IP is within a subnet
SELECTINET'192.168.1.5'<<INET'192.168.1.0/24'-- Returns: true
-- Check containment or equality
SELECTINET'192.168.1.0/24'<<=INET'192.168.1.0/24'-- Returns: true
-- Check if a subnet contains an IP
SELECTINET'10.0.0.0/8'>>INET'10.1.2.3'-- Returns: true
-- Check if two subnets overlap
SELECTINET'192.168.1.0/24'&&INET'192.168.1.128/25'-- Returns: true
Utilisation combinée
-- Find all IPs in a private subnet and extract network info
SELECThost(CAST(src_ipASinet))ASip,masklen(CAST(src_ipASinet))ASprefix_len,network(CAST(src_ipASinet))ASnetworkFROMconnectionsWHERECAST(src_ipASinet)<<INET'10.0.0.0/8'ANDfamily(CAST(src_ipASinet))=4
Fonctions de table
Les fonctions de table sont utilisées pour interroger les journaux, les métriques, les coûts cloud et d’autres sources de données.
Renvoie les données de journal sous forme de tableau. Le paramètre colonnes spécifie quels champs de journal extraire. Les champs imbriqués sont accessibles en utilisant la notation par points, et les champs non principaux doivent être précédés par @. La clause AS définit le schéma du tableau renvoyé. Optionnel : filtrage par index ou plage horaire. Lorsque le temps n'est pas spécifié, DDSQL utilise par défaut le paramètre de temps global, qui dans l'éditeur DDSQL est réglé sur la dernière heure. Optionnel : spécifier le stockage à utiliser (par exemple, hot, flex_tier). Si non spécifié, la valeur par défaut est le hot storage.
Renvoie des données métriques sous forme de valeur scalaire. La fonction accepte une requête de métriques (avec regroupement optionnel), un réducteur pour déterminer comment les valeurs sont agrégées (moyenne, maximum, etc.), et des paramètres de timestamp optionnels (par défaut 1 heure) pour définir la plage horaire.
SELECT*FROMdd.metrics_scalar('avg:system.cpu.user{*} by {service}','avg',TIMESTAMP'2025-07-10 00:00:00.000-04:00',TIMESTAMP'2025-07-17 00:00:00.000-04:00')ORDERBYvalueDESC;
Renvoie les données métriques sous forme de série temporelle. La fonction accepte une requête de métriques (avec regroupement optionnel) et des paramètres d'horodatage optionnels (par défaut 1 heure) pour définir la plage temporelle. Renvoie des points de données au fil du temps plutôt qu'une seule valeur agrégée.
SELECT*FROMdd.metrics_timeseries('avg:system.cpu.user{*} by {service}',TIMESTAMP'2025-07-10 00:00:00.000-04:00',TIMESTAMP'2025-07-17 00:00:00.000-04:00')ORDERBYtimestamp,service;
Renvoie des données de coût cloud sous forme de valeur scalaire. La fonction accepte une requête de coût cloud (avec regroupement optionnel), un réducteur d'agrégation (utilisez sum pour les données de coût ; d'autres réducteurs tels que avg, min, et max sont acceptés mais rarement applicables aux requêtes de coût), et des paramètres timestamp optionnels (par défaut 1 heure) pour définir la plage temporelle. Remarque : Les données de coût cloud sont généralement retardées de 24 à 48 heures, donc les timestamps récents peuvent ne renvoyer aucun résultat.
SELECT*FROMdd.cloud_cost_scalar('sum:all.cost{*} by {service}','sum',TIMESTAMP'2025-07-10 00:00:00.000-04:00',TIMESTAMP'2025-07-17 00:00:00.000-04:00')ORDERBYvalueDESC;
Renvoie des données de coût cloud sous forme de série temporelle. La fonction accepte une requête de coût cloud (avec regroupement optionnel) et des paramètres timestamp optionnels (par défaut 1 heure) pour définir la plage temporelle. Renvoie des points de données de coût au fil du temps plutôt qu'une seule valeur agrégée. Remarque : Les données de coût cloud sont généralement retardées de 24 à 48 heures, donc les timestamps récents peuvent ne retourner aucun résultat.
SELECT*FROMdd.cloud_cost_timeseries('sum:all.cost{*} by {service}',TIMESTAMP'2025-07-10 00:00:00.000-04:00',TIMESTAMP'2025-07-17 00:00:00.000-04:00')ORDERBYtimestamp,service;
Les alias de colonnes ne peuvent pas contenir de points ; remplacez-les par des underscores ou tout autre caractère valide lors de la définition de l’alias.
DDSQL expose les étiquettes comme un hstore type, inspiré de PostgreSQL. Vous pouvez accéder aux valeurs pour des clés d’étiquettes spécifiques en utilisant l’opérateur flèche de PostgreSQL. Exemple :
SELECTinstance_type,count(instance_type)FROMaws.ec2_instanceWHEREtags->'region'='us-east-1'-- region is a tag, not a column
GROUPBYinstance_type
Les étiquettes sont des paires clé-valeur où chaque clé peut avoir zéro, une ou plusieurs valeurs d’étiquettes correspondantes. Lorsqu’elle est accédée, la valeur de l’étiquette renvoie une seule chaîne, contenant toutes les valeurs correspondantes. Lorsque les données ont plusieurs valeurs d’étiquettes pour la même clé d’étiquette, elles sont représentées sous forme de chaîne triée, séparée par des virgules. Exemple :