Correlacionar Database Monitoring y trazas (traces)
En esta guía se considera que has configurado Database Monitoring y usas APM. La conexión de APM y DBM inyecta identificadores de trazas de APM en la recopilación de datos de DBM, lo que permite la correlación de estas dos fuentes de datos. Esto permite que las funciones del producto muestren información sobre la base de datos en el producto de APM, y datos de APM en el producto de DBM.
Antes de empezar
- Bases de datos compatibles
- Postgres, MySQL, SQL Server, Oracle, MongoDB
- Versiones compatibles del Agent
- 7.46 o posterior
- Privacidad de los datos
- Al habilitar la propagación de comentarios de SQL, se almacenan datos potencialmente confidenciales (nombres de servicios) en las bases de datos, a los que luego pueden acceder terceros a los que se les ha otorgado acceso a la base de datos.
Las integraciones del rastreador de APM admiten un Modo de propagación, que controla la cantidad de información que pasa de las aplicaciones a la base de datos.
- El modo
full
envía información completa sobre la traza a la base de datos, lo que te permite investigar trazas individuales en DBM. Esta es la solución recomendada para la mayoría de las integraciones. - El modo
service
envía el nombre del servicio, lo que te permite conocer qué servicios contribuyen a la carga de la base de datos. Este es el único modo compatible con las aplicaciones de Oracle. - El modo
disabled
deshabilita la propagación y no envía información desde las aplicaciones.
DD_DBM_PROPAGATION_MODE | Postgres | MySQL | SQL Server | Oracle | MongoDB |
---|
full | |
* | | | |
service | | | | | |
* El modo de propagación completa en Aurora MySQL requiere la versión 3.
Rastreadores y controladores de aplicaciones compatibles
* CommandType.StoredProcedure no compatible
** Modo completo de SQL Server para Java/.NET:
Si tu aplicación utiliza context_info
para la instrumentación, el rastreador de APM lo sobrescribe.
- La instrumentación ejecuta un comando
SET context_info
cuando el cliente emite una consulta, lo que realiza un recorrido completo adicional a la base de datos. - Requisitos previos:
- Versión 7.55.0 o posterior del Agent
- Versión 1.39.0 o posterior del rastreador de Java
- Versión del rastreador .NET 3.3 o posterior
*** Oracle modo completo para Java:
- La instrumentación sobrescribe
V$SESSION.ACTION
. - Requisito previo: rastreador de Java 1.45 o posterior
**** Servicio/Modo completo MongoDB para Node.js:
- Requisito previo:
- Rastreador Node.js v5.37.0 o posterior
***** Servicio/Modo completo MongoDB para Python:
- Requisito previo:
- Rastreador Python v3.5.0 o posterior
Configuración
Para obtener la mejor experiencia de usuario, asegúrate de que las siguientes variables de entorno se hayan configurado en tu aplicación:
DD_SERVICE=(application name)
DD_ENV=(application environment)
DD_VERSION=(application version)
Datadog recomienda establecer el modo de enmascaramiento en obfuscate_and_normalize
para las versiones del Agent 7.63
y posteriores. Añade el siguiente parámetro en la sección apm_config
de tu archivo de configuración del Agent de APM:
sql_obfuscation_mode: "obfuscate_and_normalize"
Cambiar el modo de ofuscación puede alterar el texto SQL normalizado. Si tienes monitores basados en texto SQL en trazas de APM, es posible que tengas que actualizarlos.
Actualiza las dependencias de tu aplicación para incluir dd-trace-go@v1.44.0 o posterior. 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
Actualiza tu código para importar el paquete 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"
)
Habilita la función de propagación de la monitorización de base de datos mediante uno de los siguientes métodos:
Variable de entorno:
DD_DBM_PROPAGATION_MODE=full
Uso de código durante el registro del controlador:
sqltrace.Register("postgres", &pq.Driver{}, sqltrace.WithDBMPropagation(tracer.DBMPropagationModeFull), sqltrace.WithService("my-db-service"))
Uso de código en 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)
}
Ejemplo completo:
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()
}
Sigue las instrucciones de instrumentación del rastreo de Java e instala la versión 1.11.0
, o una posterior, del Agent.
También debes habilitar la instrumentación jdbc-datasource
.
Habilita la función de propagación de la monitorización de base de datos mediante uno de los siguientes métodos:
- Establecer la propiedad del sistema
dd.dbm.propagation.mode=full
- Establecer la variable de entorno
DD_DBM_PROPAGATION_MODE=full
Ejemplo completo:
# 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
Realiza un test de la función en tu aplicación:
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
}
}
}
Versiones 1.44 y posteriores:
Habilita el rastreo de sentencias preparadas para Postgres mediante uno de los siguientes métodos:
- Establece la propiedad del sistema
dd.dbm.trace_prepared_statements=true
- Establece la variable de entorno
export DD_DBM_TRACE_PREPARED_STATEMENTS=true
Nota: La instrumentación de sentencias preparadas sobrescribe la propiedad Application
con el texto _DD_overwritten_by_tracer
, y provocan un viaje de ida y vuelta adicional a la base de datos. Este viaje de ida y vuelta adicional normalmente tiene un impacto insignificante en el tiempo de ejecución de la sentencia SQL.
La activación del rastreo de sentencias preparadas puede generar un aumento del pinning de conexión cuando se utiliza Amazon RDS Proxy, lo que reduce la eficacia de la agrupación de conexiones. Para obtener más información, consulta
Pinning de conexión en RDS Proxy.
Versiones del rastreador inferiores a 1.44:
Las sentencias preparadas no son compatibles con el modo full
para Postgres y MySQL, y todas las llamadas a la API de JDBC que utilizan sentencias preparadas se degradan automáticamente al modo service
. Dado que la mayoría de las bibliotecas SQL de Java utilizan sentencias preparadas por defecto, esto significa que la mayoría de las aplicaciones Java sólo pueden utilizar el modo service
.
En tu archivo GEM, instala o actualiza dd-trace-rb a la versión 1.8.0
o una posterior:
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'
Habilita la función de propagación de la monitorización de base de datos mediante uno de los siguientes métodos:
Variable de entorno:
DD_DBM_PROPAGATION_MODE=full
La opción comment_propagation
(de manera predeterminada: ENV['DD_DBM_PROPAGATION_MODE']
), para mysql2 o pg:
Datadog.configure do |c|
c.tracing.instrument :mysql2, comment_propagation: 'full'
c.tracing.instrument :pg, comment_propagation: 'full'
end
Ejemplo completo:
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;")
Actualiza las dependencias de tu aplicación para incluir dd-trace-py>=1.9.0:
pip install "ddtrace>=1.9.0"
Para Postgres, instala psycopg2:
Para MongoDB (requiere dd-trace-py>=3.5.0), instala pymongo:
Habilita la función de propagación de la monitorización de base de datos al establecer la siguiente variable de entorno:
DD_DBM_PROPAGATION_MODE=full
Ejemplo de 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",)))
Ejemplo de 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)
Esta función requiere que la instrumentación automática se encuentre habilitada para tu servicio de .NET.
Sigue las instrucciones de rastreo de .NET Framework o las instrucciones de rastreo de .NET Core a fin de instalar el paquete de instrumentación automática y habilitar el rastreo para tu servicio.
Asegúrate de usar una biblioteca de cliente compatible. Por ejemplo, Npgsql
.
Habilita la función de propagación de la monitorización de base de datos al establecer la siguiente variable de entorno:
- Para Postgres y MySQL:
DD_DBM_PROPAGATION_MODE=full
- Para SQL Server:
DD_DBM_PROPAGATION_MODE=service
o DD_DBM_PROPAGATION_MODE=full
con Java y rastreadores .NET - Para Oracle:
DD_DBM_PROPAGATION_MODE=service
Esta función requiere que la extensión del rastreador se encuentre habilitada para tu servicio de PHP.
Sigue las instrucciones de rastreo de PHP a fin de instalar el paquete de instrumentación automática y habilitar el rastreo para tu servicio.
Asegúrate de usar una biblioteca de cliente compatible. Por ejemplo, PDO
.
Habilita la función de propagación de la monitorización de base de datos al establecer la siguiente variable de entorno:
DD_DBM_PROPAGATION_MODE=full
Instala o actualiza dd-trace-js a una versión posterior a la 3.17.0
(o 2.30.0
si usas la versión 12 de Node.js que está al final de su vida útil):
npm install dd-trace@^3.17.0
Actualiza tu código para importar e inicializar el rastreador:
// This line must come before importing any instrumented module.
const tracer = require('dd-trace').init();
Habilita la función de propagación de la monitorización de base de datos mediante uno de los siguientes métodos:
Establece la siguiente variable de entorno:
DD_DBM_PROPAGATION_MODE=full
Establece el rastreador para que use la opción dbmPropagationMode
(de manera predeterminada: ENV['DD_DBM_PROPAGATION_MODE']
):
const tracer = require('dd-trace').init({ dbmPropagationMode: 'full' })
Solo habilítalo en el nivel de integración:
const tracer = require('dd-trace').init();
tracer.use('pg', {
dbmPropagationMode: 'full'
})
Ejemplo completo:
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
})
Explorar la conexión de APM en DBM
Atribuir las conexiones de base de datos activas a los servicios de APM que realizan llamadas
Desglosa las conexiones activas de un host determinado por los servicios de APM ascendentes que realizan las solicitudes. Puedes atribuir la carga de una base de datos a servicios individuales para comprender qué servicios son los más activos en la base de datos. Dirígete a la página de servicios del servicio ascendente más activo para continuar la investigación.
Filtrar los hosts de bases de datos por los servicios de APM que los llaman
Filtra con rapidez la lista de bases de datos para solo visualizar los hosts de bases de datos de los que dependen tus servicios de APM específicos. Identifica de manera sencilla si alguna de tus dependencias descendentes tiene actividad de bloqueo que pueda afectar el rendimiento del servicio.
Ver la traza asociada a una muestra de consulta
Al visualizar una muestra de consulta en Database Monitoring, si APM ha realizado un muestreo de la traza asociada, puedes ver la muestra de DBM en el contexto de la traza de APM. Esto te permite combinar la telemetría de DBM, incluido el plan de explicación y el rendimiento histórico de la consulta, junto con el linaje del tramo dentro de tu infraestructura para comprender si un cambio en la base de datos es responsable del bajo rendimiento de la aplicación.
Explorar la conexión de DBM en APM
Visualizar los hosts de bases de datos descendentes de los servicios de APM
En la página de APM de un servicio determinado, visualiza las dependencias de bases de datos descendentes directas del servicio identificadas por Database Monitoring. Determina con rapidez si algún host tiene una carga desproporcionada que puede ser causada por hosts vecinos ruidosos. Para ver la página de un servicio, haz clic en el servicio en el Catálogo de servicios a fin de abrir un panel de detalles y, a continuación, haz clic en View Service Page (Ver página de servicios) en el panel.
Visualiza el rendimiento histórico de consultas similares a las que se ejecutan en tu traza, incluidos los eventos de espera muestreados, la latencia promedio y los planes de explicación capturados recientemente, para contextualizar cómo se espera que funcione una consulta. Determina si el comportamiento es anormal y continúa la investigación al pasar a Database Monitoring para obtener contexto adicional sobre los hosts de bases de datos subyacentes.
Referencias adicionales
Más enlaces, artículos y documentación útiles: