Database Monitoring とトレースの相関付け

Database Monitoring はこのサイトではサポートされていません。

このガイドでは、Database Monitoring を構成し、APM を使用していることを前提としています。APM と DBM を接続すると、DBM のデータ収集に APM トレース識別子が注入され、これによりこれら 2 つのデータソースの相関が可能になります。これにより、APM 製品ではデータベース情報を、DBM 製品では APM データを表示する製品機能が有効になります。

始める前に

対応データベース
Postgres、MySQL、SQL Server
対応 Agent バージョン
7.46+
データプライバシー
SQL コメントの伝播を有効にすると、潜在的に機密のデータ (サービス名) がデータベースに保存され、データベースへのアクセスを許可された他のサードパーティがアクセスできるようになります。

APM トレーサーインテグレーションは、アプリケーションからデータベースに渡される情報の量を制御する Propagation Mode をサポートしています。

  • full モードは完全なトレース情報をデータベースに送信し、DBM 内で個々のトレースを調査できるようにします。これはほとんどのインテグレーションで推奨される方法です。
  • service モードはサービス名を送信し、これによりどのサービスがデータベース負荷の原因となっているかを知ることができます。これは SQL Server アプリケーションでサポートされている唯一のモードです。
  • none モードは伝播を無効にし、アプリケーションからの情報を送信しません。

ステートメントキャッシングの動作が完全なトレースコンテキストを含む場合にパフォーマンスの問題を引き起こす可能性があるため、SQL Server は full 伝播モードをサポートしていません。

DD_DBM_PROPAGATION_MODEPostgresMySQLSQL Server
full
service

対応アプリケーショントレーサーおよびドライバー

言語ライブラリまたはフレームワークPostgresMySQLSQL Server
Go: dd-trace-go >= 1.44.0
database/sqlservice モードのみ
sqlxservice モードのみ
Java dd-trace-java >= 1.11.0
jdbcservice モードのみ
Ruby: dd-trace-rb >= 1.8.0
pg
mysql2
Python: dd-trace-py >= 1.9.0
psycopg2
.NET dd-trace-dotnet >= 2.35.0
Npgsql *
MySql.Data *
MySqlConnector *
ADO.NET *service モードのみ
PHP dd-trace-php >= 0.86.0
pdo
MySQLi
Node.js: dd-trace-js >= 3.17.0
postgres
mysql
mysql2

* CommandType.StoredProcedure はサポートされていません

セットアップ

最高のユーザーエクスペリエンスを得るためには、以下の環境変数がアプリケーションに設定されていることを確認してください。

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.Open でも行うことができ、この機能をより細かく制御することができます。
    sqltrace.Register("postgres", &pq.Driver{}, sqltrace.WithDBMPropagation(tracer.DBMPropagationModeFull))

    // 続いて Open の呼び出し。
    db, err := sqltrace.Open("postgres", "postgres://pqgotest:password@localhost/pqgotest?sslmode=disable")
    if err != nil {
        log.Fatal(err)
    }

    // 次に、database/sql パッケージをトレースしながら通常通り使用します。
    rows, err := db.Query("SELECT name FROM users WHERE age=?", 27)
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
}

Java トレースインスツルメンテーションの説明に従い、Agent の 1.11.0 またはそれ以上のバージョンをインストールします。

また、jdbc-datastore インスツルメンテーションを有効にする必要があります。

以下の方法のいずれかを使用して、データベースモニタリングの伝播機能を有効にします。

  • システムプロパティ dd.dbm.propagation.mode=full を設定する
  • 環境変数 DD_DBM_PROPAGATION_MODE=full を設定する

完全な例:

# 必要なシステムプロパティで Java Agent を起動します
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) {
            //  例外ロジック
        }
    }
}

: プリペアドステートメントは full モードではサポートされておらず、プリペアドステートメントを使用するすべての JDBC API 呼び出しは自動的に service モードにダウングレードされます。ほとんどの Java SQL ライブラリはデフォルトでプリペアドステートメントを使用するため、ほとんどの Java アプリケーションは service モードしか使用できません。

Gemfile で、dd-trace-rb をバージョン 1.8.0 以上にインストールまたは更新します。

source 'https://rubygems.org'
gem 'ddtrace', '>= 1.8.0'

# 使用状況により異なります
gem 'mysql2'
gem 'pg'

以下のいずれかの方法を使用して、データベースモニタリングの伝播機能を有効にします。

  1. 環境変数: DD_DBM_PROPAGATION_MODE=full

  2. オプション comment_propagation (デフォルト: ENV['DD_DBM_PROPAGATION_MODE'])、mysql2 または pg 用:

     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 をインストールします (: DBM と APM の接続は MySQL クライアントではサポートされていません)。

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
この機能を使用するには、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

トレーサーをインポートして初期化するようにコードを更新してください。

// の行は、インスツルメントされたいずれのモジュールのインポートより前である必要があります。
const tracer = require('dd-trace').init();

以下のいずれかの方法で、データベースモニタリングの伝搬機能を有効にします。

  1. 環境変数: DD_DBM_PROPAGATION_MODE=full

  2. オプション dbmPropagationMode (デフォルト: ENV['DD_DBM_PROPAGATION_MODE']):

    tracer.use('pg', { dbmPropagationMode: 'full', service: 'my-db-service' })
    

完全な例:

const pg = require('pg')
const tracer = require('dd-trace').init()

tracer.use('pg', { dbmPropagationMode: 'full', service: 'my-db-service' })

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 トレースをプレビューします。

Database Monitoring で Query Sample を表示するとき、関連付けられたトレースが APM によってサンプリングされている場合、DBM Sample を APM Trace のコンテキストで表示することができます。これにより、クエリの実行計画や過去のパフォーマンスを含む DBM テレメトリーと、インフラストラクチャー内のスパンの系統を組み合わせて、データベース上の変更がアプリケーションパフォーマンスの低下の原因になっているかどうかを理解することができます。

APM で DBM 接続を探る

APM サービスのダウンストリームデータベースホストの可視化

サービスページから、APM サービスが依存するダウンストリームデータベースホストを視覚化します。

指定したサービスの APM ページで、Database Monitoring により特定されたサービスの直接的なダウンストリームデータベース依存関係を確認できます。ノイジーなネイバーが原因と思われる不均衡な負荷がかかっているホストがあるかどうかをすばやく判断できます。サービスのページを表示するには、サービスカタログでサービスをクリックして詳細パネルを開き、パネル内の View Service Page をクリックします。

データベースクエリの実行計画をトレースで確認し、最適化の可能性を特定する

トレース内のデータベースクエリに対する実行計画を使用して非効率を特定します。

トレースで実行されたクエリと同様のクエリの履歴ビュー (サンプルの待機イベント、平均レイテンシー、最近キャプチャした実行計画など) を表示し、クエリがどのように実行されると予想されるかを説明します。動作が異常であるかどうかを判断し、データベースモニタリングにピボットして、基礎となるデータベースホストに関する追加のコンテキストを得ることで、調査を継続します。

その他の参考資料