데이터베이스 모니터링과 트레이스 상호 연결

이 가이드는 데이터베이스 모니터링을 설정하였고 애플리케이션 성능 모니터링(APM)을 사용하고 있다고 가정합니다. APM 및 DBM을 연결하면 APM 트레이스 식별자가 DBM 데이터 수집으로 전달됩니다. 이를 통해 이들 두 데이터 소스를 연계할 수 있으며 APM 제품에서 데이터 정보를 표시하고 DBM 제품에서 APM 데이터를 표시하는 제품 기능을 활성화할 수 있습니다.

시작 전 참고 사항

지원되는 데이터베이스
Postgres, MySQL, SQL Server, Oracle
지원되는 에이전트 버전
7.46+
데이터 개인정보 보호
데이터베이스에 저장되어 있고 데이터베이스 액세스 권한이 부여된 기타 타사가 액세스할 수 있는 잠재적인 기밀 데이터(서비스 이름)에서 SQL 주석 전파 결과를 활성화합니다.

애플리케이션 성능 모니터링(APM) 트레이서 통합은 전파 모드를 지원하며 전파 모드는 애플리케이션에서 데이터베이스로 전달되는 정보량을 제어합니다.

  • full 모드는 전체 트레이스 정보를 데이터베이스로 전송하여 DBM 내 개별 트레이스를 조사할 수 있도록 해줍니다. 대부분의 통합에서 이는 권장되는 솔루션입니다.
  • service 모드는 서비스 이름을 전송하여 어느 서비스가 데이터베이스 부하에 기여하는지 이해할 수 있도록 해줍니다. 이는 Oracle 애플리케이션에서만 지원되는 모드입니다.
  • disabled 모드는 전파를 비활성화하므로 애플리케이션에서 아무 정보도 전송하지 않습니다.
DD_DBM_PROPAGATION_MODEPostgresMySQLSQL 서버Oracle
full * **
service

* Aurora MySQL의 전체 전파 모드에는 버전 3이 필요합니다.

** SQL Server에서는 Java와 .NET 트레이서만 지원합니다.

지원되는 애플리케이션 트레이서 및 드라이버

언어라이브러리 또는 프레임워크PostgresMySQLSQL 서버Oracle
Go: dd-trace-go >= 1.44.0
database/sqlservice 모드만service 모드만
sqlxservice 모드만service 모드만
Java dd-trace-java >= 1.11.0
jdbc **service 모드만
Ruby: dd-trace-rb >= 1.8.0
pg
mysql2
Python: dd-trace-py >= 1.9.0
psycopg2
dd-trace-py >= 2.9.0
asyncpg
aiomysql
mysql-connector-python
mysqlclient
pymysql
.NET dd-trace-dotnet >= 2.35.0
Npgsql *
MySql.Data *
MySqlConnector *
System.Data.SqlClient * **
Microsoft.Data.SqlClient * **
PHP dd-trace-php >= 0.86.0
pdo
MySQLi
Node.js: dd-trace-js >= 3.17.0
postgres
mysql
mysql2

* CommandType.StoredProcedure 지원 안 됨

** 자바/.NET에 대한 전체 모드 SQL Server:

  • 클라이언트가 쿼리를 발행하면 계측에서 SET context_info 명령을 실행하며, 데이터베이스를 추가 왕복합니다.
  • 애플리케이션에서 context_info를 사용해 애플리케이션을 계측하는 경우, APM 트레이서가 재정의합니다.
  • 요구 사항:
    • 에이전트 버전 7.55.0 이상
    • Java 트레이서 버전 1.39.0 이상
    • .NET 트레이서 버전 3.3 이상

설정

최상의 사용자 경험을 위해 다음 환경 변수가 애플리케이션에 설정되어 있는지 확인하세요.

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

앱 종속성을 업데이트하여 dd-trace-go@v1.44.0 이상을 포함합니다.

go get gopkg.in/DataDog/dd-trace-go.v1@v1.44.0

코드를 업데이트하여 contrib/database/sql 패키지를 내보내세요.

import (
   "database/sql"
   "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
   sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql"
)

다음 메서드 중 하나를 사용해 데이터베이스 모니터링 전파를 활성화합니다.

  1. 환경 변수: DD_DBM_PROPAGATION_MODE=full

  2. 드라이버 등록 동안 코드 사용하기:

    sqltrace.Register("postgres", &pq.Driver{}, sqltrace.WithDBMPropagation(tracer.DBMPropagationModeFull), sqltrace.WithServiceName("my-db-service"))
    
  3. sqltrace.Open 코드 사용하기:

    sqltrace.Register("postgres", &pq.Driver{}, sqltrace.WithServiceName("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)
    }
    

전체 예시:

import (
    "database/sql"
    "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
    sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql"
)

func main() {
    // 첫 번째 단계는 드라이버 등록 시 DBM 전파 모드를 설정하는 것입니다. 이는 또한
    // sqltrace에서도 가능하니 참고하세요. 열기를 통해 기능에 대한 보다 세분화된 통제를 확인하세요.
    sqltrace.Register("postgres", &pq.Driver{}, sqltrace.WithDBMPropagation(tracer.DBMPropagationModeFull))

    // 열기 호출을 진행합니다.
    db, err := sqltrace.Open("postgres", "postgres://pqgotest:password@localhost/pqgotest?sslmode=disable")
    if err != nil {
        log.Fatal(err)
    }

    // 그 뒤 계속하여 평소처럼 데이터베이스 /sql 패키지와 트레이싱을 함께 사용합니다.
    rows, err := db.Query("SELECT name FROM users WHERE age=?", 27)
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
}

Java 트레이싱 계측 지침에 따라 에이전트 1.11.0 버전 이상을 설치합니다.

또한, jdbc-datasource 계측을 활성화해야 합니다.

다음 방법 중 하나를 사용하여 데이터베이스 모니터링 전파 기능을 활성화합니다.

  • 시스템 속성 dd.dbm.propagation.mode=full 설정
  • 환경 변수 DD_DBM_PROPAGATION_MODE=full 설정

전체 예시:

# 필수 시스템 속성을 포함하는 자바(Java) 에이전트를 시작합니다.
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

애플리케이션에서 기능 테스트:

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
        }
    }
}

참고: 준비된 문장은 full 모드에서 지원되지 않으며, 준비된 문장을 사용하는 모든 JDBC API 호출은 자동으로 service 모드로 다운그레이드됩니다. 대부분의 자바(Java) SQL 라이브러리는 기본적으로 준비된 문장을 사용하므로, 대부분의 자바(Java) 애플리케이션은 service 모드만 사용할 수 있습니다.

젬파일에서 dd-trace-rb을 버전 1.8.0 이상으로 설치하거나 업데이트합니다:

source 'https://rubygems.org'
gem 'datadog' # v1.x을 사용하는 경우 `'ddtrace', '>= 1.8.0'`를 사용합니다.

# 사용량에 따라 다음을 설정합니다.
gem 'mysql2'
gem 'pg'

다음 메서드 중 하나를 사용해 데이터베이스 모니터링 전파를 활성화합니다.

  1. 환경 변수: DD_DBM_PROPAGATION_MODE=full

  2. mysql2 또는 pg의 경우 옵션 comment_propagation(기본값: ENV['DD_DBM_PROPAGATION_MODE']):

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

전체 예시:

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;")

dd-trace-py>=1.9.0을 포함하도록 앱 종속성 업데이트:

pip install "ddtrace>=1.9.0"

psycopg2 설치:

pip install psycopg2

다음 환경 변수를 설정해 데이터베이스 모니터링 전파 기능을 활성화합니다.

  • DD_DBM_PROPAGATION_MODE=full

전체 예시:


import psycopg2

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

# POSTGRES DB로 연결
conn = psycopg2.connect(**POSTGRES_CONFIG)
cursor = conn.cursor()
# SQL 쿼리 실행
cursor.execute("select 'blah'")
cursor.executemany("select %s", (("foo",), ("bar",)))
이 기능이 .NET 서비스에 대해 활성화되려면 자동 계측이 필요합니다.

.NET Framework 추적 지침이나 .NET Core 추적 지침을 따라 자동 계측 패키지를 설치하고 서비스 추적을 활성화합니다.

지원되는 클라이언트 라이브러리를 사용하고 있는지 확인하세요(예: Npgsql).

다음 환경 변수를 설정해 데이터베이스 모니터링 전파 기능을 활성화합니다.

  • Postgres 및 MySQL: DD_DBM_PROPAGATION_MODE=full
  • SQL Server: DD_DBM_PROPAGATION_MODE=service 또는 Java와 .Net 트레이서가 있는 DD_DBM_PROPAGATION_MODE=full
  • Oracle: DD_DBM_PROPAGATION_MODE=service
이 기능을 사용하려면 PHP 서비스에서 트레이서 기능이 활성화되어 있어야 합니다.

PHP 추적 지침을 따라 자동 계측 패키지를 설치하고 서비스 추적을 활성화합니다.

지원되는 클라이언트 라이브러리를 사용하고 있는지 확인하세요(예: PDO).

다음 환경 변수를 설정해 데이터베이스 모니터링 전파 기능을 활성화합니다.

  • DD_DBM_PROPAGATION_MODE=full

dd-trace-js3.17.0(또는 서비스 종료된 Node.js 버전 12를 사용하는 경우 2.30.0) 이상 버전으로 설치하거나 업데이트합니다.

npm install dd-trace@^3.17.0

가져올 코드를 업데이트하고 트레이서를 초기화합니다.

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

다음 메서드 중 하나를 사용해 데이터베이스 모니터링 전파를 활성화합니다.

  • 다음 환경 변수를 설정합니다.

    DD_DBM_PROPAGATION_MODE=full
    
  • dbmPropagationMode 옵션을 사용하도록 트레이서를 설정합니다(기본값: ENV['DD_DBM_PROPAGATION_MODE']).

    const tracer = require('dd-trace').init({ dbmPropagationMode: 'full' })
    
  • 통합 수준에서만 활성화:

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

전체 예시:

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) => {
    // 결과 처리
})

DBM에서 APM 연결 탐색

활성 데이터베이스 연결을 APM 서비스 호출에 할당

APM 서비스가 시작된 위치별로 분석된 데이터의 활성 연결 보기

특정 호스트에서 요청을 실행하는 업스트림 APM 서비스별로 분석할 수 있습니다. 데이터베이스에서 개별 서비스에 로드를 할당해 데이터베이스에서 어떤 서비스가 활성화 정도가 가장 높은지 볼 수 있습니다. 활성화 정도가 높은 업스트림 서비스의 서비스 페이지로 이동해 더 조사해 보세요.

호출하는 APM 서비스별로 데이터베이스 호스트 필터링

호출하는 APM 서비스별로 데이터베이스 호스트 필터링.

데이터베이스 목록을 빠르게 필터링해 특정 APM 서비스가 종속된 데이터베이스 호스트만 표시할 수 있습니다. 차단 활동이 있어 서비스 성능에 문제를 일으키는 다운스트림 종속성이 있는지 쉽게 확인할 수 있습니다.

쿼리 샘플에 연결된 트레이스 보기

검사한 쿼리 샘플을 생성한, 샘플된 APM 트레이스 미리 보기

데이터베이스 모니터링에서 쿼리 샘플을 볼 때 연결된 트레이스를 APM이 샘플했다면 APM 트레이스 컨텍스트에서 DBM 샘플을 볼 수 있습니다. 이를 통해 실행 계획과 쿼리 성능 내역을 포함한 DBM 원격 분석을 결합할 수 있습니다. 또한 인프라스트럭처 내 스팬 계보를 알 수 있어 데이터베이스에 애플리케이션 성능 문제를 일으키는 변화가 있었는지 파악할 수 있습니다.

APM에서 DBM 연결 탐색

APM 서비스의 다운스트림 데이터베이스 시각화

서비스 페이지에서 APM 서비스가 종속된 다운스트림 데이터베이스 호스트 시각화.

애플리케이션 성능 모니터링(APM) 기존 서비스 페이지에서 데이터베이스 모니터링으로 식별한 서비스의 다운스트림 데이터베이스 종속성을 바로 볼 수 있습니다. 오류 요인으로 인해 비정상적 로드가 존재하는 호스트를 빠르게 찾아낼 수 있습니다. 서비스 페이지를 보려면 서비스 카탈로그에서 해당 서비스를 클릭하여 세부 정보 패널을 연 다음 패널에서 서비스 페이지 보기를 클릭합니다.

실행 계획을 이용해 트레이스에 있는 데이터베이스 쿼리에서 잠재적 최적화 방법 파악

트레이스 내부 데이터베이스 쿼리에 관한 실행 계획을 활용하여 비효율성 식별.

샘플된 대기 이벤트, 평균 대기 시간, 최근 캡처된 실행 계획 등 트레이스에서 실행된 쿼리와 유사한 쿼리의 성능 내역을 확인하여 향후 쿼리 성능을 컨텍스트 속에서 파악할 수 있습니다. 비정상적인 동작이 있는지 확인한 후 데이터베이스 모니터링으로 이동해 데이트베이스 호스트와 관련한 추가 컨텍스트를 더 자세히 조사할 수 있습니다.

참고 자료