Perlでもトレーシングがしたい! 〜はてなブログの"見える化"への挑戦〜 / Tracing in Perl

120b74af626c2b23f954926ef68ac5d6?s=47 papix
July 03, 2019

Perlでもトレーシングがしたい! 〜はてなブログの"見える化"への挑戦〜 / Tracing in Perl

120b74af626c2b23f954926ef68ac5d6?s=128

papix

July 03, 2019
Tweet

Transcript

  1. 2.

    papix 株式会社はてな アプリケーションエンジニア (2017年2月~) シニアエンジニア (2019年2月~) ブログMediaチーム サービスリード兼スクラムマスター はてなブログのHTTPS化などを担当しました 一般社団法人

    Japan Perl Association 理事 アカウント類 はてな: id:papix Twitter: @__papix__ GitHub: papix / CPAN: PAPIX ブログ: https://papix.hatena(blog.(com|jp)|diary.jp)/ 趣味はPerlと, (交通機関を利用した)旅行 JGC修行は完遂済み, 今年はSFC修行をしています
  2. 3.
  3. 8.
  4. 9.
  5. 11.
  6. 17.

    ProfilerとLogger Profiler ... 実際にトレースする君 データベースの読み書き, HTTPリクエスト, Memcachedの読 み書きなどをトレースできる 他, Redis用のProfilerもCPANizeされている

    昨日, AWS::CLIWrapperのProfilerを書いた → Devel::KYTProf::Profiler::AWS::CLIWrapper Logger ... トレース結果を出力する君 指定しなければSTDERRに出す
  7. 22.

    AWS X‑Rayの構成 SDK -(UDP)-> daemon -> API 各プログラミング言語向けにSDKが提供されている SDKは, トレースした結果をUDPでdaemonに送る

    daemonはAWSが提供しているので, EC2インスタンスによし なに置いてあげるとよい daemonへはUDPで通信するので, 最悪daemonが死んでいても 安心 daemonはAWSが提供するAPIに向けてトレース結果を送る 開発者は, X‑Rayのコンソールでトレース結果を見れる
  8. 23.

    AWS X‑Rayにおけるトレース AWS X‑Rayでは... 1リクエスト = 1トレース トレースは, 幾つかのセグメントを持つ 分散トレーシングのための仕様としては"OpenTracing"などが存在

    する ベンダー非依存のAPI仕様とライブラリを提供 OpenTracingでは... 1リクエスト = 1トレース トレースは幾つかのスパンを持つ
  9. 30.

    app.psgi if ($ENV{'ENABLE_AWS_XRAY'}) { require AWS::XRay; require Devel::KYTProf; require Devel::KYTProf::Logger::XRay;

    Devel::KYTProf->apply_prof('Cache::Memcached::Fast'); Devel::KYTProf->apply_prof('DBI'); Devel::KYTProf->apply_prof('LWP::UserAgent'); Devel::KYTProf->apply_prof('Redis::Fast'); Devel::KYTProf->logger('Devel::KYTProf::Logger::XRay'); }
  10. 32.
  11. 33.
  12. 34.
  13. 35.
  14. 36.
  15. 37.
  16. 39.

    Tips: 強制的にトレーシングする enable 'Plack::Middleware::XRay', name => 'Hatena-Blog', sampler => sub

    { my ($env) = @_; # Plack::Request を作ってクエリパラメータを見て, # `force_aws_xray` の値が # XRay を強制的に有効にするためのトークンと一致していれば, # 必ず1 を返す = XRay でトレーシングする my $req = Plack::Request->new($env); my $token = $req->parameters->{force_aws_xray}; return 1 if defined $token && $token eq 'SAMPLE_TOKEN'; # sampling rate でXRay でトレーシングするか判定 return rand() < 0.1; # = 10% サンプリング }, ;