前回の
X-Ray──AWSによるマネージドサービス
分散トレーシングを行うためのソフトウェアとして、
X-RayはAWSが提供しているサービスです。マネージドサービスのため、
X-Rayの構成要素
X-Rayは次の4つの要素で構成されています。なお、
X-Ray API──管理のためのAPI
データの送信、
X-Ray daemon──トレース転送用デーモン
アプリケーションからネットワーク経由でセグメントデータを受信するエージェントです。通常はアプリケーションと同一ホストで稼働し、
X-Ray SDK──アプリケーションに組み込むライブラリ
アプリケーションに組込み、
SDKはアプリケーション内部の処理を捕捉し、
X-Ray console──トレースを可視化する
X-Ray APIに送信されたトレースをブラウザ上で可視化して表示するコンソール画面です。どのコンポーネントで障害や遅延が発生しているのかの概観、
X-Rayへのトレース送信方法
X-Rayのアーキテクチャでは、
{"format": "json", "version": 1}
{
"trace_id": "1-5759e988-bd862e3fe1be46a994272793",
"id": "defdfd9912dc5a56",
"start_time": 1461096053.37518,
"end_time": 1461096053.4042,
"name": "MyApp"
}
最初の改行まではプロトコルのバージョンを指定するヘッダです。次の行では1つのセグメントデータがJSONで表現されています。trace_
呼び出しもとを持つ子セグメントの場合は、
X-Rayアーキテクチャの利点
アプリケーションからAPIへ直接通信するのではなくX-Ray daemonをいったん経由するアーキテクチャなのは、
- APIはAWS側にあるため、
ネットワーク的に遠くレイテンシが大きい可能性がある - APIのプロトコルはHTTPSなので、
接続のオーバーヘッドが比較的大きい - セグメントデータはアプリケーションの1つの処理に対して多数発行されるため、
HTTPSよりも軽量なプロトコルが望ましい
X-Ray SDKからX-Ray daemonへは、
障害を検知するトレースのしくみに問題が発生したために、
PerlアプリケーションをX-Rayでトレースする
「X-Ray SDK」
AWS::XRay──Perl用トレーシングモジュール
AWS::XRayはコード内の処理をラップして、capture
関数で包むだけです。
use AWS::XRay qw/ capture /;
capture "myApp", sub {
# セグメントmyAppの処理
capture "internal", sub {
# myAppを親に持つセグメントinternalの処理
};
};
これでcapture
の第1引数をセグメント名として、

capture
を入れ子にした場合は自動で親子関係を把握し、capture
で包んでいけばよいのです。
capture
で包まれた関数には、trace_
メソッドで得られる値をリクエストヘッダX-Amzn-Trace-Id
に設定します。FurlモジュールでHTTPリクエストを行う例を次に示します。
use AWS::XRay qw/ capture /;
use Furl;
capture "external", sub {
my $seg = shift; # AWS::XRay::Segmentオブジェクト
my $furl = Furl->new;
# トレースID、セグメントIDを付与してHTTPリクエストする
my $res = $furl->get(
"https://example.com/",
[ "X-Amzn-Trace-Id" => $seg->trace_header ],
);
# ステータスコードをメタデータとして記録
$seg->{metadata}->{external} = {
status => $res->status,
};
};
セグメントオブジェクトのハッシュキーmetadata、
に値を設定すると、
Plack::Middleware::XRay──HTTPリクエストをトレース
Plack::Middleware::XRayはPlackのミドルウェアとして使用し、enable
するだけです。
use Plack::Builder;
builder {
enable "XRay",
name => "myPlackApp";
$app;
};
これだけで、capture
は、
リクエストヘッダにX-Amzn-Trace-Id
ヘッダが存在する場合にはそれを読み取り、
オプションを設定することで、
Devel::KYTProf::Logger::XRay──任意の関数呼び出しをトレース
AWS::XRayを単体で利用する場合は、capture
を計測したい箇所に差し込んでいく必要があります。
実際の既存アプリケーションへ組込む場合、
そこで、
Devel::KYTProfはデータベースへのクエリ
Devel::KYTProf::Logger::XRayをDevel::KYTProfのロガーとして設定すると、
use Devel::KYTProf;
use Devel::KYTProf::Logger::XRay;
Devel::KYTProf->logger("Devel::KYTProf::Logger::XRay");
Devel::KYTProf::Profiler以下の名前空間には、
Devel::KYTProf->apply_prof('Fluent::Logger');
モジュールを作成せず、foo
関数を計測する例です。
Devel::KYTProf->add_prof('MyApp', 'foo');
Devel::KYTProfと連携することで、
<続きの
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/168ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-13000-8
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現! - 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう - 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT