アプリケーションパフォーマンスモニタリング(APM)のサンプリング設定方法¶
GuanceのAPM機能は、Opentracing プロトコルに対応したデータ収集ツールで収集されたトレースデータの分析と管理をサポートします。デフォルトでは、APM データはフルサンプリングで収集されます。つまり、呼び出しのたびにデータが生成されます。制限をかけないと、収集されるデータ量が多くなり、データストレージを過剰に消費します。サンプリングを設定することで、APM データの収集量を抑え、データストレージを節約し、コストを削減できます。
以下では、DDtrace 収集ツール を例に、サンプリングレートを 5% に設定する方法を説明します。
前提条件¶
- DataKit をインストールします。
- DDtrace 収集ツールを有効化します。
サンプリング設定¶
APM データの収集を開始する前に、使用する言語に応じて DDtrace を設定する必要があります。
以下では、Python でよく使用される Web サーバーフレームワーク Flask を使ったアプリケーションを例に、APM データのサンプリング方法を説明します。この例では、SERVICE_A が HTTP サービスを提供し、SERVICE_B の HTTP サービスを呼び出します。
1. DDtrace 実行環境のインストール¶
2. Flask パッケージのインストール¶
3. サンプリングの設定¶
サンプリング設定の説明
SERVICE_A と SERVICE_B を作成し、SERVICE_A にはサンプリングレート 5% を設定し、SERVICE_B はデフォルトの収集設定のままにします。
作成時には、DDtrace をインポートし、サービス名、サービス名のマッピング関係を設定し、環境変数でプロジェクト名、環境名、バージョン番号を設定し、DataKit の trace API アドレスを設定する必要があります(具体的なアドレスは DataKit のアドレスに応じて異なり、ポート番号は 9529 です)。
1. SERVICE_A¶
# -*- encoding: utf8 -*-
#--------- service_a.py ----------
from flask import Flask, request
import requests, os
from ddtrace import tracer,sampler
# サービス名を設定
os.environ["DD_SERVICE"] = "SERVICE_A"
# サービス名のマッピング関係を設定
os.environ["DD_SERVICE_MAPPING"] = "postgres:postgresql,defaultdb:postgresql"
# 環境変数でプロジェクト名、環境名、バージョン番号を設定
os.environ["DD_TAGS"] = "project:your_project_name,env=test,version=v1"
# DataKit trace API アドレスを設定
tracer.configure(
hostname = "localhost", # 実際の DataKit アドレスに応じて設定
port = "9529",
sampler = sampler.RateSampler(0.05),
)
app = Flask(__name__)
def shutdown_server():
func = request.environ.get('werkzeug.server.shutdown')
if func is None:
raise RuntimeError('Not running with the Werkzeug Server')
func()
@app.route('/a', methods=['GET'])
def index():
requests.get('http://127.0.0.1:54322/b')
return 'OK', 200
@app.route('/stop', methods=['GET'])
def stop():
shutdown_server()
return 'Server shutting down...\n'
# service A を起動: HTTP サービスをポート 54321 で起動
if __name__ == '__main__':
app.run(host="0.0.0.0", port=54321, debug=True)
例:
2. SERVICE_B¶
# -*- encoding: utf8 -*-
#--------- service_b.py ----------
from flask import Flask, request
import os, time, requests
from ddtrace import tracer
# サービス名を設定
os.environ["DD_SERVICE"] = "SERVICE_B"
# サービス名のマッピング関係を設定
os.environ["DD_SERVICE_MAPPING"] = "postgres:postgresql,defaultdb:postgresql"
# 環境変数でプロジェクト名、環境名、バージョン番号を設定
os.environ["DD_TAGS"] = "project:your_project_name,env=test,version=v1"
tracer.configure(
hostname = "localhost", # 実際の DataKit アドレスに応じて設定
port="9529",
)
app = Flask(__name__)
def shutdown_server():
func = request.environ.get('werkzeug.server.shutdown')
if func is None:
raise RuntimeError('Not running with the Werkzeug Server')
func()
@app.route('/b', methods=['GET'])
def index():
time.sleep(1)
return 'OK', 200
@app.route('/stop', methods=['GET'])
def stop():
shutdown_server()
return 'Server shutting down...\n'
# service B を起動: HTTP サービスをポート 54322 で起動
if __name__ == '__main__':
app.run(host="0.0.0.0", port=54322, debug=True)
4. SERVICE_A と SERVICE_B を起動して呼び出す¶
# 2つのサービスをバックグラウンドでそれぞれ起動:
(ddtrace-run python3 service_a.py &> a.log &)
(ddtrace-run python3 service_b.py &> b.log &)
# A サービスを呼び出し、B サービスを呼び出させる。これにより対応するトレースデータが生成される(ここでは複数回実行してトリガー可能)
curl http://localhost:54321/a
# 2つのサービスをそれぞれ停止
curl http://localhost:54321/stop
curl http://localhost:54322/stop
5. Guanceワークスペースで結果を確認¶
Guanceワークスペースにログインすると、収集された SERVICE_A と SERVICE_B のトレースデータを確認できます。
Warning
APM サンプリングはトレース単位で行われます。100 個のトレースがある場合、サンプリングレートを 5% に設定すると、そのうちの 5%、つまりランダムに 5 個のトレースとその配下のすべてのスパンが Guanceワークスペースに報告されます。
この例では、SERVICE_A が HTTP サービスを提供し、SERVICE_B の HTTP サービスを呼び出しています。つまり、サービス A がサービス B を呼び出すことで 1 つのトレースになります。100 個のトレースがある場合、そのうちの 5 個のトレースがランダムに報告されます。
関連情報¶
- 上記はクライアント側で APM のサンプリングレートを設定する方法です。この方法以外にも、DataKit で直接サンプリングレートを設定することもできます。その場合は、APM 収集ツールの設定でサンプリングを有効にするだけです。
## Sampler config uses to set global sampling strategy.
## sampling_rate used to set global sampling rate.
[inputs.tracer.sampler]
sampling_rate = 1.0
- APM サンプリングを設定すると、重要なトレースを見逃す可能性があります。フィルターを設定して重要なトレースを確実に報告することができます。例えば、
keep_rare_resource = trueを設定すると、レアと判断されたトレースが直接 Guanceに報告されます。

