Associer la fonctionnalité Database Monitoring aux traces

Ce guide suppose que vous avez configuré Surveillance de la base de données et que vous utilisez APM. La connexion d’APM et de DBM injecte des identifiants de trace APM dans la collecte de données DBM, ce qui permet de corréler ces deux sources de données. Cela active les fonctionnalités du produit qui affichent les informations sur la base de données dans APM et les données APM dans DBM.

Avant de commencer

Bases de données prises en charge
Postgres, MySQL, SQL Server, Oracle, MongoDB
Versions d’Agent prises en charge
7.46+
Confidentialité des données
L’activation de la propagation des commentaires SQL entraîne le stockage de données potentiellement confidentielles (noms de services) dans les bases de données, qui peuvent ensuite être accessibles par d’autres tiers ayant obtenu l’accès à la base de données.

Les intégrations du SDK Datadog prennent en charge un Mode de propagation, qui contrôle la quantité d’informations transmises des applications à la base de données.

Mode de propagationDescription
fullEnvoie des informations de trace complètes à la base de données, vous permettant d’examiner des traces individuelles dans DBM. C’est la solution recommandée pour la plupart des intégrations.
serviceEnvoie le nom du service, vous permettant de comprendre quels services contribuent à la charge de la base de données.
disabledDésactive la propagation et n’envoie aucune information des applications.

Bases de données prises en charge

LangueVersion minimale du traceurBibliothèque/FrameworkMode
Godd-trace-go v2database/sql
sqlx
full
service
Javadd-trace-java >= 1.11.0jdbcfull
service
.NETdd-trace-dotnet >= 2.35.0Npgsqlfull
service
Node.jsdd-trace-js >= 3.17.0postgresfull
service
PHPdd-trace-php >= 0.86.0pdofull
service
Pythondd-trace-py >= 1.9.0psycopg2
psycopg
full
service
Pythondd-trace-py >= 2.9.0asyncpgfull
service
Rubydd-trace-rb >= 1.8.0pgfull
service

Remarque : CommandType.StoredProcedure n’est pas pris en charge pour le pilote .NET.

LangueVersion minimale du traceurBibliothèque/FrameworkMode
Godd-trace-go v2database/sql
sqlx
full
service
Javadd-trace-java >= 1.11.0jdbcfull
service
.NETdd-trace-dotnet >= 2.35.0MySql.Data
MySqlConnector
full
service
Node.jsdd-trace-js >= 3.17.0mysql
mysql2
full
service
PHPdd-trace-php >= 0.86.0pdo
MySQLi
full
service
Pythondd-trace-py >= 2.9.0aiomysql
mysql-connector-python
mysqlclient
pymysql
full
service
Rubydd-trace-rb >= 1.8.0mysql2full
service

Remarque : CommandType.StoredProcedure n’est pas pris en charge pour les pilotes .NET.

Remarque : Le mode de propagation complet sur Aurora MySQL nécessite la version 3.

LangueVersion minimale du traceurBibliothèque/FrameworkMode
Godd-trace-go v2database/sql
sqlx
service
Javadd-trace-java >= 1.11.0jdbcfull
service
.NETdd-trace-dotnet >= 2.35.0System.Data.SqlClient
Microsoft.Data.SqlClient
full
service

Remarque : CommandType.StoredProcedure n’est pas pris en charge pour les pilotes .NET.

Pour le mode full avec Java et .NET :

Si votre application utilise context_info pour l'instrumentation, le SDK Datadog l'écrase.
  • L’instrumentation exécute une commande SET context_info lorsque le client émet une requête, ce qui entraîne un aller-retour supplémentaire vers la base de données.
  • Prérequis :
    • Version de l’agent 7.55.0 ou supérieure
    • Version du traceur Java 1.39.0 ou supérieure
    • Version du traceur .NET 3.3 ou supérieure
LangueVersion minimale du traceurBibliothèque/FrameworkMode
Godd-trace-go v2database/sql
sqlx
service
Javadd-trace-java >= 1.11.0jdbcfull
service

Pour le mode full avec Java :

  • L’instrumentation écrase V$SESSION.ACTION.
  • Prérequis : traceur Java 1.45 ou supérieur
LangueVersion minimale du traceurBibliothèque/FrameworkMode
Javadd-trace-java >= 1.58.0mongo-java-driver v3.8+full
service
Node.jsdd-trace-js >= 5.80.0mongodbfull
service
Pythondd-trace-py >= 3.5.0pymongofull
service

Configuration :

Définissez les variables d’environnement suivantes dans votre application :

DD_SERVICE=(application name)
DD_ENV=(application environment)
DD_VERSION=(application version)

Ces balises identifient votre service dans les vues de corrélation APM et dans la répartition des connexions actives DBM.

Datadog recommande de définir le mode d’obfuscation sur obfuscate_and_normalize pour les versions de l’Agent 7.63 et supérieures. Ajoutez le paramètre suivant dans la section apm_config de votre fichier de configuration de l’agent APM :

  sql_obfuscation_mode: "obfuscate_and_normalize"
Changer le mode d'obfuscation peut modifier le texte SQL normalisé. Si vous avez des moniteurs basés sur le texte SQL dans les traces APM, vous devrez peut-être les mettre à jour.

Mettez à jour vos dépendances d’application pour inclure dd-trace-go v2. Note: This documentation uses v2 of the Go tracer, which Datadog recommends for all users. If you are using v1, see the migration guide to upgrade to v2.

go get github.com/DataDog/dd-trace-go/v2 # 2.x

Mettez à jour votre code pour importer le package contrib/database/sql :

import (
   "database/sql"
   "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer"
   sqltrace "github.com/DataDog/dd-trace-go/contrib/database/sql/v2"
)

Activez la fonctionnalité de propagation de Database Monitoring via l’une des méthodes suivantes :

  • Variable d’environnement : DD_DBM_PROPAGATION_MODE=full

  • Utilisation du code lors de l’enregistrement du conducteur :

    sqltrace.Register("postgres", &pq.Driver{}, sqltrace.WithDBMPropagation(tracer.DBMPropagationModeFull), sqltrace.WithService("my-db-service"))
    
  • Utilisation du code sur sqltrace.Open :

    sqltrace.Register("postgres", &pq.Driver{}, sqltrace.WithService("my-db-service"))
    
    db, err := sqltrace.Open("postgres", "postgres://pqgotest:password@localhost/pqgotest?sslmode=disable", sqltrace.WithDBMPropagation(tracer.DBMPropagationModeFull))
    if err != nil {
        log.Fatal(err)
    }
    

Exemple complet :

import (
	"database/sql"
	"github.com/DataDog/dd-trace-go/v2/ddtrace/tracer"
   sqltrace "github.com/DataDog/dd-trace-go/contrib/database/sql/v2"
)

func main() {
	// The first step is to set the dbm propagation mode when registering the driver. Note that this can also
	// be done on sqltrace.Open for more granular control over the feature.
	sqltrace.Register("postgres", &pq.Driver{}, sqltrace.WithDBMPropagation(tracer.DBMPropagationModeFull))

	// Followed by a call to Open.
	db, err := sqltrace.Open("postgres", "postgres://pqgotest:password@localhost/pqgotest?sslmode=disable")
	if err != nil {
		log.Fatal(err)
	}

	// Then, we continue using the database/sql package as we normally would, with tracing.
	rows, err := db.Query("SELECT name FROM users WHERE age=?", 27)
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()
}

Suivez les instructions d’instrumentation de Java tracing et installez la version 1.11.0 ou supérieure de l’Agent.

Vous devez également activer jdbc-datasource l’instrumentation.

Activez la fonctionnalité de propagation de la surveillance de la base de données en utilisant une des méthodes suivantes :

  • Définissez la propriété système dd.dbm.propagation.mode=full
  • Définissez la variable d’environnement DD_DBM_PROPAGATION_MODE=full

Exemple complet :

# Start the Java Agent with the required system properties
java -javaagent:/path/to/dd-java-agent.jar -Ddd.dbm.propagation.mode=full -Ddd.integration.jdbc-datasource.enabled=true -Ddd.service=my-app -Ddd.env=staging -Ddd.version=1.0 -jar path/to/your/app.jar

Testez la fonctionnalité dans votre application :

public class Application {
    public static void main(String[] args) {
        try {
            Connection connection = DriverManager
                    .getConnection("jdbc:postgresql://127.0.0.1/foobar?preferQueryMode=simple", "user", "password");
            Statement stmt = connection.createStatement();
            String sql = "SELECT * FROM foo";
            stmt.execute(sql);
            stmt.close();
            connection.close();
        } catch (SQLException exception) {
            //  exception logic
        }
    }
}

Versions du traceur 1.44 et supérieures : Activez le traçage des instructions préparées pour Postgres en utilisant une des méthodes suivantes :

  • Définissez la propriété système dd.dbm.trace_prepared_statements=true
  • Définissez la variable d’environnement export DD_DBM_TRACE_PREPARED_STATEMENTS=true

Remarque : L’instrumentation des instructions préparées écrase la propriété Application avec le texte _DD_overwritten_by_tracer, et entraîne un aller-retour supplémentaire vers la base de données. Ce voyage supplémentaire a un impact minimal sur le temps d’exécution des instructions SQL.

L'activation du traçage des instructions préparées peut entraîner une augmentation du maintien de connexion lors de l'utilisation d'Amazon RDS Proxy, ce qui réduit l'efficacité du pool de connexions. Pour plus d'informations, voir Maintien de connexion sur RDS Proxy.

Versions du traceur inférieures à 1.44 : Les instructions préparées ne sont pas prises en charge en mode full pour Postgres et MySQL, et tous les appels d’API JDBC qui utilisent des instructions préparées sont automatiquement rétrogradés en mode service. Étant donné que la plupart des bibliothèques SQL Java utilisent des instructions préparées par défaut, cela signifie que la plupart des applications Java ne peuvent utiliser que le mode service.

Dans votre Gemfile, installez ou mettez à jour dd-trace-rb vers la version 1.8.0 ou supérieure :

source 'https://rubygems.org'
gem 'datadog' # Use `'ddtrace', '>= 1.8.0'` if you're using v1.x

# Depends on your usage
gem 'mysql2'
gem 'pg'

Activez la fonctionnalité de propagation de Database Monitoring via l’une des méthodes suivantes :

  1. Variable d’environnement : DD_DBM_PROPAGATION_MODE=full

  2. Option comment_propagation (par défaut : ENV['DD_DBM_PROPAGATION_MODE']), pour mysql2 ou pg :

     Datadog.configure do |c|
     	c.tracing.instrument :mysql2, comment_propagation: 'full'
     	c.tracing.instrument :pg, comment_propagation: 'full'
     end
    

Exemple complet :

require 'mysql2'
require 'ddtrace'

Datadog.configure do |c|
	c.service = 'billing-api'
	c.env = 'production'
	c.version = '1.3-alpha'

	c.tracing.instrument :mysql2, comment_propagation: ENV['DD_DBM_PROPAGATION_MODE']
end

client = Mysql2::Client.new(:host => "localhost", :username => "root")
client.query("SELECT 1;")

Mettez à jour les dépendances de vos applications afin d’inclure dd-trace-py>=1.9.0 :

pip install "ddtrace>=1.9.0"

Pour Postgres, installez psycopg2 :

pip install psycopg2

Pour MongoDB, installez pymongo :

pip install pymongo

Remarque : Le support de MongoDB nécessite dd-trace-py >= 3.5.0. Si vous devez mettre à niveau : pip install "ddtrace>=3.5.0".

Activez la fonctionnalité de propagation de Database Monitoring en définissant la variables d’environnement suivante :

  • DD_DBM_PROPAGATION_MODE=full

Exemple Postgres :

import psycopg2

POSTGRES_CONFIG = {
    "host": "127.0.0.1",
    "port": 5432,
    "user": "postgres_user",
    "password": "postgres_password",
    "dbname": "postgres_db_name",
}

# connect to postgres db
conn = psycopg2.connect(**POSTGRES_CONFIG)
cursor = conn.cursor()
# execute sql queries
cursor.execute("select 'blah'")
cursor.executemany("select %s", (("foo",), ("bar",)))

Exemple MongoDB :

from pymongo import MongoClient

# Connect to MongoDB
client = MongoClient('mongodb://localhost:27017/')
db = client['test_database']
collection = db['test_collection']

# Insert a document
collection.insert_one({"name": "test", "value": 1})

# Query documents
results = collection.find({"name": "test"})
for doc in results:
    print(doc)
Cette fonctionnalité nécessite que l'instrumentation automatique soit activée pour votre service .NET.

Suivez les instructions de tracing .NET Framework ou les instructions de tracing .NET Core pour installer le package de l’instrumentation automatique et activer le tracing pour votre service.

Assurez-vous d’utiliser une bibliothèque cliente prise en charge. Par exemple, Npgsql.

Activez la fonctionnalité de propagation de Database Monitoring en définissant la variables d’environnement suivante :

  • Pour Postgres et MySQL : DD_DBM_PROPAGATION_MODE=full
  • Pour SQL Server : DD_DBM_PROPAGATION_MODE=service ou DD_DBM_PROPAGATION_MODE=full avec des traceurs Java et .NET
  • Pour Oracle : DD_DBM_PROPAGATION_MODE=service
Cette fonctionnalité nécessite que l'extension de traceur soit activée pour votre service PHP.

Suivez les instructions de tracing PHP pour installer le package de l’instrumentation automatique et activer le tracing pour votre service.

Assurez-vous d’utiliser une bibliothèque cliente prise en charge. Par exemple, PDO.

Activez la fonctionnalité de propagation de Database Monitoring en définissant la variables d’environnement suivante :

  • DD_DBM_PROPAGATION_MODE=full

Installez ou mettez à jour dd-trace-js vers une version supérieure à 3.17.0 (ou 2.30.0 si vous utilisez la version 12 de Node.js en fin de vie) :

npm install dd-trace@^3.17.0

Mettez à jour votre code pour importer et initialiser le traceur :

// This line must come before importing any instrumented module.
const tracer = require('dd-trace').init();

Activez la fonctionnalité de propagation de Database Monitoring via l’une des méthodes suivantes :

  • Définissez la variable d’environnement suivante :

    DD_DBM_PROPAGATION_MODE=full
    
  • Définissez le SDK pour utiliser l’option dbmPropagationMode (par défaut : ENV['DD_DBM_PROPAGATION_MODE']) :

    const tracer = require('dd-trace').init({ dbmPropagationMode: 'full' })
    
  • Activez uniquement au niveau de l’intégration :

    const tracer = require('dd-trace').init();
    tracer.use('pg', {
       dbmPropagationMode: 'full'
    })
    

Exemple complet :

const pg = require('pg')
const tracer = require('dd-trace').init({ dbmPropagationMode: 'full' })

const client = new pg.Client({
	user: 'postgres',
	password: 'postgres',
	database: 'postgres'
})

client.connect(err => {
	console.error(err);
	process.exit(1);
});

client.query('SELECT $1::text as message', ['Hello world!'], (err, result) => {
	// handle result
})

Pour désactiver la propagation après l’avoir activée, définissez DD_DBM_PROPAGATION_MODE=disabled.

Vérifiez l’intégration

Pour confirmer que l’intégration fonctionne :

  1. Exécutez votre application instrumentée et exécutez une requête de base de données.
  2. Dans Datadog, allez à Surveillance de base de données > Échantillons de requêtes.
  3. Confirmez que le badge de corrélation APM apparaît sur l’échantillon de requête.

Explorez la connexion APM dans DBM

Attribuez les connexions actives de la base de données aux services APM appelants

Affichez les connexions actives à une base de données, ventilées par le service APM dont elles proviennent.

Décomposez les connexions actives pour un hôte donné par les services APM en amont qui effectuent les requêtes. Vous pouvez attribuer la charge sur une base de données à des services individuels pour comprendre quels services sont les plus actifs sur la base de données. Basculez vers la page du service en amont le plus actif pour poursuivre l’enquête.

Filtrez vos hôtes de base de données par les services APM qui les appellent

Filtrez vos hôtes de base de données par les services APM qui les appellent.

Filtrez la liste des bases de données pour n’afficher que les hôtes de base de données dont vos services APM spécifiques dépendent. Identifiez si l’une de vos dépendances en aval a une activité bloquante qui pourrait affecter la performance du service.

Affichez la trace associée pour un échantillon de requête

Prévisualisez la trace APM échantillonnée dont l'échantillon de requête inspecté a été généré.

Lors de la visualisation d’un échantillon de requête dans la surveillance de base de données, si la trace associée a été échantillonnée par APM, vous pouvez voir l’échantillon DBM dans le contexte de la trace APM. Cela vous permet de combiner la télémétrie DBM, y compris le plan d’exécution et les performances historiques de la requête, avec la traçabilité du span au sein de votre infrastructure pour déterminer si un changement apporté à la base de données est responsable de la mauvaise performance de l’application.

Explorez la connexion DBM dans APM

Visualisez les hôtes de base de données en aval des services APM

Sur la page APM d’un service donné, visualisez les dépendances directes de la base de données en aval du service telles qu’identifiées par la surveillance de base de données, et déterminez si des hôtes ont une charge disproportionnée qui pourrait être causée par des voisins bruyants. Pour visualiser les dépendances de base de données d’un service :

  1. Sélectionnez le service dans le catalogue de logiciels pour ouvrir un panneau de détails.
  2. Sélectionnez Service Page dans le panneau.
  3. Sur la page de service, sélectionnez la section Databases.
  4. Dans la section Bases de données, sélectionnez l’onglet Databases.

Visualisez les durées des spans et consultez les détails des requêtes

Sélectionnez l’onglet Queries dans la section Databases de la page de service APM pour voir les anomalies de latence et une liste complète des requêtes de l’intervalle de temps sélectionné. Sélectionnez une requête dans le tableau pour afficher le panneau de requête et accéder aux diagnostics, aux détails des erreurs et aux informations de trace.

Identifiez les optimisations potentielles en utilisant les plans d’exécution pour les requêtes de base de données dans les traces

Identifiez les inefficacités en utilisant les plans d'exécution pour les requêtes de base de données dans les traces.

Consultez les performances historiques de requêtes similaires à celles exécutées dans votre trace, y compris les événements d’attente échantillonnés, la latence moyenne et les plans d’exécution récemment capturés, pour contextualiser la performance attendue d’une requête. Déterminez si le comportement est anormal et poursuivez l’enquête en passant à Surveillance de la base de données pour obtenir un contexte supplémentaire sur les hôtes de base de données sous-jacents.

Lectures complémentaires