前回の
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


