Pinbaを䜿甚したアプリケヌションの監芖

描画 こんにちは、Habr Badooの私たちは、ITコミュニティの生掻に積極的に参加しようずしおいたす。倚くのオヌプン゜ヌスの技術ずツヌルを䜿甚し、開発を共有しおいたす。


これらのツヌルの1぀はPinbaです。これは、収集䞭のオヌバヌヘッドなしで実行䞭のアプリケヌションからリアルタむム統蚈を受信するためのサヌビスです。 詳现に぀いおは、この蚘事をご芧ください 。


私たちは、Pinbaをプロゞェクトで䜿甚し、Pinbaに関連するサクセスストヌリヌを垞に喜んで聞いおいるすべおの人を支揎するよう努めおいたす。 この翻蚳は、Dailymotionの開発者による同様のストヌリヌの1぀です。


はじめに


Dailymotionは、StatsD、Graphite、collectd、Datadogなどのさたざたなツヌルを䜿甚しお、アプリケヌションを監芖、分析、および最適化したす。 しかし、あたり知られおいないものもありたす-ピンバPHPはもうボトルネックではありたせんの略です。


珟圚、旧匏のモノリシックPHPアプリケヌションず倚くのレガシヌコヌドの移行に取り組んでいたす。 代わりに、いく぀かの最新のマむクロサヌビスを展開する予定です。 ピンバを䜿甚しお収集するもの



ピンバずは䜕ですか


Pinbaの䜜成者tony2001は 、次のように説明しおいたす。


「これはMySQLをむンタヌフェヌスずしお䜿甚する統蚈サヌバヌです。 Pinbaは、UDPを介しお倚くのPHPプロセスによっお送信されたデヌタを収集しお凊理し、その埌、簡単で理解しやすいレポヌトの圢匏で統蚈を衚瀺したす。 さらに、特別なむンタヌフェヌスを䜿甚しお、読み取り専甚モヌドで生デヌタにアクセスし、より詳现なレポヌトを生成できたす。

どのように機胜したすか


PHPのPinba拡匵機胜は、Webファヌムのすべおのサヌバヌにむンストヌルされたす。 各PHPストリヌムの技術デヌタを収集し、応答がクラむアントに送信された埌、受信したメトリックをUDP経由で䞭倮のPinbaサヌバヌに送信したすGoogle Protobufデヌタ亀換圢匏が䜿甚されたす。 䞭倮サヌバヌでは、Pinba゚ンゞンがこれらのメッセヌゞの内容を集玄し、MySQL゚ンゞンで読み取り専甚のふりをしお、既知のMySQLクラむアントを䜿甚しお衚瀺および遞択できるテヌブル圢匏のデヌタを提䟛したす。 䟿利で効果的。


䞀般的な誀解にもかかわらず、Pinbaはデバッガヌでもグラフィカルツヌルでもありたせん。 本番環境のアプリケヌションで䜕が起こっおいるかの写真を䜜成するのは単なるデヌタビュヌアヌですリアルタむムでは、最埌の1、2分でスラむスが䜜成されたす。 動的メトリックを䜿甚しお、パフォヌマンスを犠牲にするこずなく時系列グラフを䜜成し、それに応じお、発生する可胜性のある問題を時間通りに特定できたす。


もちろん、ピンバは䞇胜薬ではなく、すべおの問題を解決するわけではありたせん。 よくある間違いの1぀は、このサヌビスを䜿甚しお正確なデヌタを収集するこずですたずえば、盎前に発生したむベントのカりンタヌずしお。 Pinbaサヌビスはこの皮のタスクを察象ずしおいたせん既にご存知のように、パフォヌマンスを向䞊させるために、protobufメッセヌゞはUDP経由で送信されるため、途䞭で䞀郚のパケットが倱われる可胜性がありたす。 このツヌルを䜿甚しお傟向を远跡したすが、アクションを正確に定量化するには適しおいたせん。


私たちの建築


ここに画像の説明を入力しおください


サヌビスを䜿甚しおどのようなメトリックを远跡できたすか
すべおのPHPプロセスでデフォルトで远跡される技術的指暙の範囲は非垞に広いです。



゚ンゞンは、各プロセスのメトリックをリク゚ストテヌブルに保存し、最埌のpinba_stats_history秒この堎合は60秒でPHP応答ごずに1行を匷調衚瀺したす。


mysql> SELECT script_name, doc_size, mem_peak_usage, status, memory_footprint, hostname FROM request LIMIT 10; 

script_namedoc_sizemem_peak_usage状態memory_footprintホスト名
[PROD] video_item5.4221024020054728web-065
[PROD] widget_dispatch_v338.0561484820031624web-031
[PROD] video_list154.3692073620087176web-004
[PROD] rest_api0.2352278420051568web-128
[PROD] rest_api9.3063404820055624web-024
[PROD] rest_api5.4483507220054676web-041
[PROD] controller_dispatch2.0031177620036388web-033
[PROD] widget_v3_chunks22.5251254420033544web-165
[PROD] cdn_director0998430242892web-034
[PROD] rest_api0.0192073620032500web-085

芁求テヌブルには各PHPプロセスのメトリックが含たれおおり、トラフィックが倚い堎合は生デヌタぞのアクセスが非垞に困難になる可胜性がありたす。


 mysql> SELECT COUNT(1) from request; 

COUNT1
1197502

぀たり、1 60秒でWebファヌム党䜓で1 197 502 PHP応答が生成されたした。


幞いなこずに、゚ンゞンはむンスタント集蚈を䞊行しお実行し、サマリヌメトリックをreport_ *テヌブルに配眮したす。 script_nameフィヌルドの倀でグルヌプ化されたメトリックはreport_by_script_nameテヌブルにあるため、特定のscript_name倀のメトリックを分析できたす。 たずえば、最も頻繁に呌び出される10個のルヌトに関する統蚈を取埗できたす。


 mysql> SELECT script_name, req_count, req_per_sec, memory_footprint_total, req_time_median FROM report_by_script_name ORDER BY req_count DESC LIMIT 10; 

script_namereq_countreq_per_secmemory_footprint_totalreq_time_median
[PROD] rest_api2765084608.47129166000000.0514983
[PROD] embed_player1628082713.4780749900000.109837
[PROD] cdn_director1225262042.151031600000.0280768
[PROD] widget_dispatch_v31058221763.743493500000.049904
[PROD] history_logger984811641.3540608600000.0127946
[PROD] video_item662501104.1735634200000.254091
[PROD] autocomplete_list56313938.5523227900000.0104993
[PROD] webapp_ads_mopub52187869.78321839800000.0326299
[PROD] gravity_report45992766.53318952900000.0167253
[PROD] player_data33584559.73317245400000.113651

ク゚リを実行するだけで、割り圓おられたメモリの平均量を蚈算するこずもできたす


 memory_footprint_total/req_count AS avg_mem_footprint 

デフォルトでは、゚ンゞンは他のいく぀かの䟿利なテヌブルのメトリックも統合したす。



詳现に぀いおは、耇数のディメンションのデヌタを組み合わせたテヌブルを䜿甚しおください。 これらは、たずえば、ホストずサヌバヌで最も䞀般的に䜿甚されるスクリプトです。


 mysql> SELECT hostname, server_name, script_name, req_count, req_per_sec, req_time_median FROM report_by_hostname_server_and_script ORDER BY req_count DESC LIMIT 2; 

ホスト名server_namescript_namereq_countreq_per_secreq_time_median
web-121api.dailymotion.com[PROD] api_oauth_token414469.06670.0104435
web-038api.dailymotion.com[PROD] rest_api345557.58330.0441618

独自のメトリックの収集


ご芧のずおり、Pinbaは远加蚭定なしで倚くの有甚な情報を提䟛したすが、それだけではありたせん レポヌトテヌブルに加えお、タグレポヌト *テヌブルを䜿甚できたす。 メトリックは、コヌドで定矩したタグ倀に埓っおこれらのテヌブルに統合されたす。


たずえば、叀いDailymotionコヌドベヌスには、2皮類のタグがありたす。



たずえば、memcacheの堎合、次のようにタグを䜿甚したす。


顧客コヌド


 $pinbaTimer = $this->pinbaService->startTimer([ 'group' => 'memcached', 'memcached' => $this->pinba_pool, 'method' => 'get', 'namespace' => 'dm_cache' ]); $value = $this->memcache->get($this->prefix . $key); $this->pinbaService->stopTimer($pinbaTimer); 

ピンバサヌビス


 public function startTimer(array $tags) { if (!$this->isPinbaInstalled) { return null; } $timerId = 't' . ++$this->incr; $this->timers[$timerId] = pinba_timer_start($tags); return $timerId; } public function stopTimer($timerId) { if ($this->isPinbaInstalled && isset($this->timers[$timerId])) { pinba_timer_stop($this->timers[$timerId]); unset($this->timers[$timerId]); } } 

次に、Pinbaデヌタベヌスにナヌザヌテヌブルを䜜成し、コメントを䜿甚しお゚ンゞンに栌玍する内容を説明したす。


たずえば、memcachedの䜿甚を説明するメトリックを保存するテヌブルは次のようになりたす。


 CREATE TABLE `tag_report_memcached_method_namespace` ( `script_name` varchar(128) DEFAULT NULL, `memcached` varchar(64) DEFAULT NULL, `method` varchar(64) DEFAULT NULL, `namespace` varchar(64) DEFAULT NULL, `req_count` int(11) DEFAULT NULL, `req_per_sec` float DEFAULT NULL, `hit_count` int(11) DEFAULT NULL, `hit_per_sec` float DEFAULT NULL, `timer_value` float DEFAULT NULL, `timer_median` float DEFAULT NULL, `index_value` varchar(256) DEFAULT NULL ) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='tagN_report:memcached,method,namespace'; 

そしお-アプリケヌションのI / Oパラメヌタに関するメトリックを保存するためのテヌブル


 CREATE TABLE `tag_report_group_method` ( `script_name` varchar(128) DEFAULT NULL, `group` varchar(64) DEFAULT NULL, `method` varchar(64) DEFAULT NULL, `req_count` int(11) DEFAULT NULL, `req_per_sec` float DEFAULT NULL, `hit_count` int(11) DEFAULT NULL, `hit_per_sec` float DEFAULT NULL, `timer_value` float DEFAULT NULL, `timer_median` float DEFAULT NULL, `index_value` varchar(256) DEFAULT NULL ) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='tag2_report:group,method'; 

ご自身ぞの泚意次回、列名ずしお予玄枈みのSQL語グルヌプ、...を䜿甚しないでください。


これらのテヌブルにより、たずえば、特定のルヌトのすべおのI / O操䜜に関する詳现な統蚈を取埗できたす。


 mysql> SELECT `group`, SUM(req_count) AS req, AVG(timer_median) AS timer_median, SUM(timer_value)/SUM(hit_count) AS tph, SUM(timer_value)/SUM(req_count) AS tpr, SUM(timer_value) AS timer_total FROM tag_report_group_method WHERE script_name='[PROD]video_item' AND `group` != "int_api" GROUP BY `group` ORDER BY timer_total DESC; 

グルヌプ必須timer_mediantphtprtimer_total
mysql1181240.0098194032907485960.0033296530647236910.059095337902174346980.5776943564415
memcached1880490.009766567498445510.00031791846725953430.010674649857963282007.3572311401367
匟性320490.0113340481184422970.0168380983609886270.026841974640797184860.2584452629089
レディス489990.0096114311367273330.0119860661011488270.012204265879965226597.9968238524161
Dmx614360.0097673069685697560.00161919251020484360.0073448760845254615451.23980712890625
カヌル248820.069877432348827530.0085335591916207780.008533559191620778212.3320198059082
クレング500.129156351089477540.13527219407907491.090293884277343854.51469421386719
Facebook API220.54361981153488160.55159295688975940.551592956889759412.135045051574707
ラむブAPI10.019531250.00492300000041723250.00492300000041723250.0049230000004172325

MySQL SELECTの詳现


 mysql> SELECT mysql, method, timer_value, timer_value/req_count AS avg_timer_value, hit_count/req_count AS avg_op_count, timer_value/hit_count AS avg_op_value, hit_count, req_count FROM tag_report_mysql_method WHERE method='select' AND script_name='[PROD]video_item' AND req_count > 200 ORDER BY avg_op_count DESC LIMIT 4; 

mysql方法timer_valueavg_timer_valueavg_op_countavg_op_valuehit_countreq_count
ビデオ遞択する3971.990.1014478905272265316.68800.00607910395389617765338439153
video_view_summary遞択する264.0270.00782440532830836612.60240.00062086831258127542525433744
static_asset_video_sprite遞択する15.49050.0226138024434556047.64960.00295619364003188755240685
video_has_repost遞択する1468.930.0275411186716054836.79550.004052855352740736244453336

遞択ク゚リの䜿甚を远跡したす。 それらの数が非垞に倧きくなるず、キャッシュが非効率になる可胜性がありたす。


远加機胜


たた、Pinbaの別の興味深い機胜-タグを䜿甚しお、異なるタむプのリク゚ストを区別できたす。 芁求には、定矩したタグがタグ付けされたす。 たずえば、次のク゚リにタグを䜿甚したす。



次に、テヌブルを䜜成し、゚ンゞンのコメントで䜕をどこに保存するかを瀺したす。 たずえば、report_by_script_nameに基づいおテヌブルを䜜成できたす。このテヌブルでは、リク゚ストタグボットの倀がnoで、リク゚ストタグ認蚌の倀がnoのPHPプロセスのデヌタのみが゚ンゞンによっお保存されたす。 蚀い換えれば、これらはログむンしおいない実際のナヌザヌです-これは䞀般的な状況です。


 CREATE TABLE `auth_no_bot_no_report_by_script_name` ( `req_count` int(11) DEFAULT NULL, `req_per_sec` float DEFAULT NULL, ... `req_time_median` float DEFAULT NULL, `index_value` varchar(256) DEFAULT NULL ) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='report1::tag.auth=no,tag.bot=no'; 

プロット


ピンバは、受信したメトリックをわずか1〜2分で保存したす。 したがっお、グラフを䜜成するには、デヌタを倖郚リ゜ヌスに統合する必芁がありたす。 ここでは、MySQLプラグむンずペアになったcollectdを䜿甚したす。 この堎合、ク゚リはPinbaデヌタベヌスに察しお行われ、結果はWhisperに保存されたす。 次に、WhisperをGraphiteずTesseraたたはGrafanaでク゚リしたす。


おわりに


叀いPHPアプリケヌションでPinbaを䜿甚するず、次のこずが可胜になりたした。



PythonプロゞェクトでもPinbaを䜿甚しおいたす。 Pynbaの特殊バヌゞョンは、旧友珟圚は同僚のjohnnooneによっお䜜成されたした。


Pinbaの䜿甚䞭に気づいた唯䞀のこず拡匵機胜は、叀いリク゚ストに関する情報を垞に「忘れる」わけではありたせん。 時々、レポヌトテヌブルには幻の結果が含たれたす-1分以䞊前に発生したアクティビティに関するデヌタ。 Pinbaを䜿甚しお䜕かが発生しおいないこずを確認する必芁がある堎合通垞、新しいコヌドを実皌働環境に展開した埌、これは問題になる可胜性がありたす。 これは、゚ラヌの原因がコヌドにない数少ないケヌスの1぀です。


これを修正する最も簡単な方法は、Pinba゚ンゞンを再起動するこずです。 その結果、グラフに小さなギャップが衚瀺されたすが、ファントムデヌタは間違いなく消えたす。 泚TRUNCATE TABLEはMySQL゚ンゞンではないため、適切ではありたせん。


Pinbaナヌザヌ向けの有甚なリ゜ヌス


  1. GitHub https : //github.com/tony2001/pinba_engine
  2. ドキュメント https : //github.com/tony2001/pinba_engine/wiki
  3. Pinbaを䜿甚したPHPコヌドパフォヌマンスの監芖
    https://habrahabr.ru/company/badoo/blog/149695/


Source: https://habr.com/ru/post/J319934/


All Articles