Database Monitoring とトレースの相関付け
このガイドでは、Database Monitoring を構成し、APM を使用していることを前提にしています。APM と DBM を接続すると、APM のトレース識別子が DBM のデータ収集に挿入され、これら 2 つのデータソースを相関させることができます。これにより、APM 製品ではデータベース情報を、DBM 製品では APM データを表示する製品機能が有効になります。
はじめに
- サポートされるデータベース
- Postgres、MySQL、SQL Server、Oracle、MongoDB
- サポート対象の Agent バージョン
- 7.46 以上
- データプライバシー
- SQL コメントの伝播を有効にすると、潜在的に機密データ (サービス名) がデータベースに保存され、それにアクセスする権限を与えられた、ほかの第三者がそのデータにアクセスできるようになります。
Datadog SDK インテグレーションは、アプリケーションからデータベースに渡される情報量を制御する伝播モードをサポートしています。
| 伝播モード | 説明 |
|---|
full | 完全なトレース情報をデータベースに送信し、DBM 内で個々のトレースを調査できるようにします。これはほとんどのインテグレーションで推奨されるソリューションです。 |
service | サービス名を送信し、どのサービスがデータベースの負荷に寄与しているかを理解できるようにします。 |
disabled | 伝播を無効にし、アプリケーションからの情報を送信しません。 |
サポートされるデータベース
注: CommandType.StoredProcedure は .NET ドライバーではサポートされていません。
Java と .NET の full モードの場合:
アプリケーションで context_info をインスツルメンテーションに使用している場合、Datadog SDK はそれを上書きします。
- インスツルメンテーションは、クライアントがクエリを発行する際に
SET context_info コマンドを実行し、これによりデータベースとの追加のラウンドトリップが発生します。 - 前提条件:
- Agent バージョン 7.55.0 以降
- Java トレーサーバージョン 1.39.0 以降
- .NET トレーサーバージョン 3.3 以降
Java の full モードの場合:
- このインスツルメンテーションは
V$SESSION.ACTION を上書きします。 - 前提条件: Java トレーサー 1.45 以降
セットアップ
アプリケーションに以下の環境変数を設定します。
DD_SERVICE=(application name)
DD_ENV=(application environment)
DD_VERSION=(application version)
これらのタグは、APM 相関ビューおよび DBM アクティブ接続の内訳でサービスを識別します。
Datadog では、Agent のバージョンが 7.63 以上の場合、難読化モードを obfuscate_and_normalize に設定することを推奨しています。APM エージェント構成ファイルの apm_config セクションに以下のパラメーターを追加します。
sql_obfuscation_mode: "obfuscate_and_normalize"
難読化モードを変更すると、正規化された SQL テキストが変更される可能性があります。APM トレース内の SQL テキストに基づくモニターがある場合は、それらを更新する必要が生じることがあります。
アプリの依存関係を更新して、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
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"
)
以下のいずれかの方法で、Database Monitoring の伝播機能を有効にします。
完全な例:
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()
}
Java トレーシング のインスツルメンテーションの説明に従い、Agent の 1.11.0 以上のバージョンをインストールします。
また、jdbc-datasource インスツルメンテーション を有効にする必要があります。
以下のいずれかの方法で、Database Monitoring の伝播機能を有効にします。
- システムプロパティ
dd.dbm.propagation.mode=full を設定する - 環境変数
DD_DBM_PROPAGATION_MODE=full を設定する
完全な例:
# 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
アプリケーションで機能をテストします。
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
}
}
}
トレーサーバージョン 1.44 以上:
Postgres でのプリペアドステートメントのトレースを有効にするには、以下のいずれかの方法を使用してください。
- システムプロパティ
dd.dbm.trace_prepared_statements=true を設定する - 環境変数
export DD_DBM_TRACE_PREPARED_STATEMENTS=true を設定する
注: プリペアドステートメントのインスツルメンテーションは、Application プロパティを _DD_overwritten_by_tracer というテキストで上書きし、データベースへの追加のラウンドトリップが発生します。この追加のラウンドトリップがレイテンシーに与える影響はごくわずかです。
プリペアドステートメントのトレースを有効にすると、Amazon RDS Proxy を使用する際に接続の固定が増加し、接続プールの効率が低下する可能性があります。詳細については、
RDS Proxy の接続の固定を参照してください。
トレーサーのバージョンが 1.44 未満の場合:
Postgres と MySQL では、full モードでプリペアドステートメントはサポートされていません。そのため、プリペアドステートメントを使用するすべての JDBC API 呼び出しは自動的に service モードにダウングレードされます。ほとんどの Java SQL ライブラリはデフォルトでプリペアドステートメントを使用するため、ほとんどの Java アプリケーションは service モードのみを使用できることを意味します。
Gemfile で dd-trace-rb をバージョン1.8.0 以上にインストールまたは更新してください。
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'
以下のいずれかの方法で、Database Monitoring の伝播機能を有効にします。
環境変数:
DD_DBM_PROPAGATION_MODE=full
オプション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"
Postgres の場合は、psycopg2 をインストールします。
MongoDB の場合は、pymongo をインストールします。
注: MongoDB のサポートには dd-trace-py 3.5.0 以上が必要です。アップグレードが必要な場合: pip install "ddtrace>=3.5.0"。
以下の環境変数を設定して、Database Monitoring の伝播機能を有効にします。
DD_DBM_PROPAGATION_MODE=full
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",)))
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)
この機能を使用するには、.NET サービスの自動インスツルメンテーションが有効である必要があります。
.NET Framework のトレース手順 または .NET Core のトレース手順 に従って、自動インスツルメンテーションパッケージをインストールし、サービスのトレースを有効にしてください。
サポートされているクライアントライブラリを使用していることを確認します。たとえば、Npgsql です。
以下の環境変数を設定して、Database Monitoring の伝播機能を有効にします。
- Postgres および MySQL の場合:
DD_DBM_PROPAGATION_MODE=full - SQL Server の場合:
DD_DBM_PROPAGATION_MODE=service または DD_DBM_PROPAGATION_MODE=full と Java および .NET トレーサー - Oracle の場合:
DD_DBM_PROPAGATION_MODE=service
この機能を使用するには、PHP サービスでトレーサー拡張機能が有効になっている必要があります。
PHP トレース手順 に従って、自動インスツルメンテーションパッケージをインストールし、サービスのトレースを有効にしてください。
サポートされているクライアントライブラリを使用していることを確認します。たとえば、PDO です。
以下の環境変数を設定して、Database Monitoring の伝播機能を有効にします。
DD_DBM_PROPAGATION_MODE=full
3.17.0 より新しいバージョン (あるいはサポート終了となった Node.js バージョン 12 を使用している場合は 2.30.0 以上) の dd-trace-js をインストールするか、これらのバージョンに更新してください。
npm install dd-trace@^3.17.0
トレーサーをインポートして初期化するようにコードを更新します。
// This line must come before importing any instrumented module.
const tracer = require('dd-trace').init();
以下のいずれかの方法で、Database Monitoring の伝播機能を有効にします。
完全な例:
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
})
有効にした後に伝播を無効にするには、DD_DBM_PROPAGATION_MODE=disabled を設定します。
インテグレーションを確認する
インテグレーションが機能していることを確認するには、次のようにします。
- インスツルメンテーションされたアプリケーションを実行し、データベースクエリを実行します。
- Datadog で、Database Monitoring > Query Samples に移動します。
- クエリサンプルに APM 相関バッジが表示されることを確認します。
DBM で APM 接続を調べる
呼び出し元の APM サービスとアクティブなデータベース接続と関連付ける
特定のホストのアクティブな接続を、リクエスト元の上流の APM サービス別に表示します。データベースへの負荷を個々のサービスと関連付けて、どのサービスがデータベースで最もアクティブであるかを把握できます。最もアクティブな上流サービスのサービスページに移動して、さらに詳しく調べます。
呼び出し元の APM サービスでデータベースホストをフィルターする
特定の APM サービスが依存しているデータベースホストのみを表示するように、データベースリストをフィルターします。下流の依存関係にサービスのパフォーマンスに影響を与える可能性のあるブロックアクティビティがあるかどうかを特定します。
クエリサンプルに関連するトレースを表示する
Database Monitoring で クエリサンプル を表示する際、関連するトレースが APM によってサンプリングされている場合は、DBM サンプルを APM トレースのコンテキストで確認できます。これにより、クエリの実行計画や過去のパフォーマンスを含む DBM テレメトリと、インフラストラクチャー内のスパンの系統を組み合わせて、データベース上の変更がアプリケーションパフォーマンスの低下の原因になっているかどうかを理解することができます。
APM での DBM 接続を調査する
APM サービスの下流データベースホストを可視化する
特定のサービスの APM ページでは、Database Monitoring によって識別された、そのサービスの直接的なダウンストリームデータベース依存関係を表示し、ノイジーネイバーによって負荷が偏っている可能性のあるホストを判別できます。サービスのデータベース依存関係を表示するには、次のようにします。
- Software Catalog でサービスを選択して詳細パネルを開きます。
- パネルで [Service Page] (サービスページ) を選択します。
- [Service] (サービス) ページで、[Databases] (データベース) セクションを選択します。
- [Databases] セクション内で [Databases] タブを選択します。
スパンの期間を可視化し、クエリの詳細を表示する
APM サービスページの [Databases] セクションで [Queries] (クエリ) タブを選択して、レイテンシー外れ値と選択した期間のすべてのクエリのリストを表示します。テーブル内のクエリを選択してクエリパネルを表示し、診断、エラーの詳細、およびトレース情報にアクセスします。
トレースでデータベースクエリの実行計画を使用して、最適化の可能性を特定する
トレース内で実行されたクエリと同様のクエリの過去のパフォーマンス (サンプリングされた待機イベントや平均レイテンシー、最近取得された実行計画など) を表示して、そのクエリが期待通りに動作しているかどうかを把握します。動作が異常かどうかを判断し、Database Monitoring に移動して、基盤となるデータベースホストについての追加コンテキストを確認し、さらに詳しく調べます。
参考資料