コンテンツにスキップ

アプリケーションパフォーマンスモニタリング(APM)のサンプリング設定方法


GuanceのAPM機能は、Opentracing プロトコルに対応したデータ収集ツールで収集されたトレースデータの分析と管理をサポートします。デフォルトでは、APM データはフルサンプリングで収集されます。つまり、呼び出しのたびにデータが生成されます。制限をかけないと、収集されるデータ量が多くなり、データストレージを過剰に消費します。サンプリングを設定することで、APM データの収集量を抑え、データストレージを節約し、コストを削減できます。

以下では、DDtrace 収集ツール を例に、サンプリングレートを 5% に設定する方法を説明します

前提条件

  1. DataKit をインストールします。
  2. DDtrace 収集ツールを有効化します。

サンプリング設定

APM データの収集を開始する前に、使用する言語に応じて DDtrace を設定する必要があります。

以下では、Python でよく使用される Web サーバーフレームワーク Flask を使ったアプリケーションを例に、APM データのサンプリング方法を説明します。この例では、SERVICE_A が HTTP サービスを提供し、SERVICE_B の HTTP サービスを呼び出します。

1. DDtrace 実行環境のインストール

pip install ddtrace

2. Flask パッケージのインストール

pip install flask

3. サンプリングの設定

サンプリング設定の説明

SERVICE_ASERVICE_B を作成し、SERVICE_A にはサンプリングレート 5% を設定し、SERVICE_B はデフォルトの収集設定のままにします。

作成時には、DDtrace をインポートし、サービス名、サービス名のマッピング関係を設定し、環境変数でプロジェクト名、環境名、バージョン番号を設定し、DataKit の trace API アドレスを設定する必要があります(具体的なアドレスは DataKit のアドレスに応じて異なり、ポート番号は 9529 です)。

参考:Python Flask 完全な例

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_ASERVICE_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_ASERVICE_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に報告されます。

フィードバック

このページは役に立ちましたか?