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.128
2022年4月23日発売
B5判/160ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-12789-3
- 特集1
演習で慣れる!
データベース入門
SQL操作,テーブル設計,分析用データ処理 - 特集2
クラウド構築ツールの大本命!
ゼロから学ぶTerraform - 特集3
チャットやIssueでちゃんと伝えたい!
エンジニアのための英語
バックナンバー
Perl Hackers Hub
- 第71回 ISUCONの実装から最近のPerlを学ぶ ―わかりやすく変更しやすいコードを実現する考え方と方法(2)
- 第71回 ISUCONの実装から最近のPerlを学ぶ ―わかりやすく変更しやすいコードを実現する考え方と方法(1)
- 第70回 Raisin入門 ―Rest APIマイクロフレームワークを使ってみよう!(2)
- 第70回 Raisin入門 ―Rest APIマイクロフレームワークを使ってみよう!(1)
- 第69回 表形式データを操るUNIXシェル型Perl製コマンド群 ―ビッグデータ時代の汎用的なデータ整備と分析のために(2)
- 第69回 表形式データを操るUNIXシェル型Perl製コマンド群 ―ビッグデータ時代の汎用的なデータ整備と分析のために(1)
- 第68回 他言語のライブラリをPerlに移植する(2)
- 第68回 他言語のライブラリをPerlに移植する(1)
- 第67回 GitHub APIによるチーム開発の効率化 ―基本操作から,GitHub Webhooksの活用まで(2)
- 第67回 GitHub APIによるチーム開発の効率化 ―基本操作から,GitHub Webhooksの活用まで(1)