Perl Hackers Hub
第56回 AWS X-Rayによる分散トレーシング―マイクロサービスのボトルネック,障害箇所の特定(2)
2019年8月20日
初出:WEB+DB PRESS Vol.111(2019年6月24日発売)
Perl, プログラミング言語, AWS X-Ray, 分散トレーシング, 可視化, 分散システム, Webアプリケーション
前回の
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と連携することで,
- 注1)
- Fluentdへのログ送信モジュールです。
<続きの
本誌最新号をチェック!
WEB+DB PRESS Vol.122
2021年4月24日発売
B5判/168ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-12119-8
- 特集1
上から下まで全レイヤ解説! 複雑化した世界を体系的に学ぶ
Web技術総整理 - 特集2
新バージョン登場! PythonによるWeb開発の基本
はじめてのDjango - 特集3
Rustで実装!
作って学ぶRDBMSのしくみ
バックナンバー
Perl Hackers Hub
- 第65回 依存モジュールの更新 ―update-cpanfile,GitHub Actionsで実現!(2)
- 第65回 依存モジュールの更新 ―update-cpanfile,GitHub Actionsで実現!(1)
- 第64回 少しマニアックなPerlのテクニック―特殊変数,低レベルの標準関数を使いこなす(2)
- 第64回 少しマニアックなPerlのテクニック―特殊変数,低レベルの標準関数を使いこなす(1)
- 第63回 PPIとPerl::Tidyを組み合わせて作るコード整形ツール(2)
- 第63回 PPIとPerl::Tidyを組み合わせて作るコード整形ツール(1)
- 第62回 Perl歴史散策 ―インタプリタの実装と,構文の進化をたどる(3)
- 第62回 Perl歴史散策 ―インタプリタの実装と,構文の進化をたどる(2)
- 第62回 Perl歴史散策 ―インタプリタの実装と,構文の進化をたどる(1)
- 第61回 GitHub ActionsとAmazon ECSを使ったDockerアプリケーションの自動デプロイ(3)