意識低いテクです at: NRUG (New Relic User Group) Vol.2 when: 2022/03/16 by: @uzulla
NewRelicͱઓ͏ϨΨγʔPHPat: NRUG (New Relic User Group) Vol.2when: 2022/03/16by: @uzulla
View Slide
ࣗݾհ• uzulla• ϑϦʔͷPHPΤϯδχΞ• N+1ࣾͷMՕॴͷݱͰՔಇத• ྫ PR TIMES ͞Μ
:͜ͷτʔΫಛఆͷاۀʹ͍ͭͯޠ͍ͬͯ·ͤΜ• ࢲݱࡏਐߦͰɺNࣾ x MݱͰՔಇத• աڈͷݱ֮͑ͯ͢Βډͳ͍• ͨͩ͠ɺ৭ʑͳݱͰࣅ͍ͯΔ͜ͱ͋Δ
ࣗࣾհͱ͔ͳ͍ΜͰએ• PHPerKaigi 2022• PHPͳํͥͻ• PR TIMESͷਓؒొஃ͠·͢
NewRelic❤PHP• ϙϯͱ(ϛυϧΣΞతʹ)͍ΕΔ͚ͩͰಈ͘• ύοʂͱ֎ͤΔ• ຊ൪ʹೖΕ͓͚ͯΔ΄ͲੑೳྼԽ͍• Τϥʔɾྫ֎͕͍͍ײ͡ʹϦΞϧλΠϜूܭ• = ࠷ߴʂ
ࢲͱNewRelic• ׂͱੲ͔Βɺ͔ͭͣΕͣϢʔβʔ• ʮ͓٬༷͕͍Εͯ͘ΕΔ͔ʯ࣍ୈ• ʢ·͋ɺ͝༧ࢉ͋ΔΑͶ…Θ͔Δ…ʣ• ͨͱ͑PR TIMES͞ΜೖΕͯ͘ΕͯΔ• ʮ͑ͯϥοΩʔʂʂʯ
ࣗෲ()ͱͷ૬ੑͷΑ͞• ༧ࢉग़ͳ͍͕ɺ͍͍ͬͯͱ͍͏ݱ͋Δ• ͢Δͱɺ֎͍͢͜͠ͱॏཁͰ͢ΑͶ…• PHP + NewRelic֎͍͢͠ʂ• (ίʔυʹೖΕͳͯ͘ྑ͍ͷͰ)• ISUCONͱ͔ͰɺඵͰ֎ͤΔͷͰ͑Δ
ͯ͞ɺϨΨγʔPHP• ݹ͍ίʔυϕʔεͷPHP• PHP<=7…PHP<=5…• ࠷ۙPHP8ະຬΛΔ͕࣌ͩʢྫ: Laravel9ʣNewRelicͪΌΜͱಈ͘ʢخʣ
ϨΨγʔPHPͱઓ͏Έ• ੵΈॏͳͬͨෛ࠴ίʔυ• error_reporting, display_errors=offͰݱ࣮ಀආ• ΤϥʔϩάΛݟͯͳ͍ʢ݁ߏଟ͘ͷݱʣ• ͱ͍͏͔ɺϩά͕ࣺͯΒΕ͍ͯΔ• ͋;ΕΔNotice, WarningΤϥʔ
NewRelicͳΒʂ• ΤϥʔϩάΛಠࣗʹरͬͯूܭͯ͘͠ΕΔʂ• ͳʹ͠ͳͯࣗ͘ಈతʹϝτϦοΫʹ• ελοΫτϨʔε͖ʂ• ಉ͡ΤϥʔΛྨʂ• Error Inbox͔Βर͚ͬͯͩ͢Ͱվળ͞ΕΔ• ෳͰtail -f͠ͳ͍͍ͯ͘ͷָʂ()
NewRelicΛΘͳ͍߹…• ϩάج൫…fluentd…kibana…• ूܭɾϝτϦΫε…• ϩʔςʔγϣϯ…DiskFull…• ෛՙ…• ༨ͳαʔόʔӡ༻…• etc,etc... େมͩͶ…
ͯ͞ຊ• ʮϦϑΝΫλϦϯά͍ͨ͠ʂʯ• ͦͼཱ͑ͭϨΨγʔ• ʮσουίʔυΛ҆શʹফ͍ͨ͠ʯ• ʮͰɺຊʹࢮΜͰΔͷ͔ͳ…ʯ
ʮͦΕɺNRͰ؆୯ʹऩूͰ͖ΔΑʂʯ
E_USER_WARNING()Λ͏trigger_error("This code is NOT DEAD",E_USER_WARNING);• https://www.php.net/manual/ja/function.trigger-error.php• ϢʔβʔϨϕϧͷΤϥʔ/ܯࠂ/௨ϝοηʔδΛੜ͢Δ
Error InboxʹΨϯΨϯ͍ͬͯ͘Δ• (ͪΖΜϑΟϧλͰ͖Δ)
ิɿE_USER_*ͱʁ• PHPʹྫ֎ʹࣅͨ(?) ผͷΤϥʔػߏ͕͋Δ• DBଓࣦഊE_WARNINGͱ͔ɺΑ͘Έ·͢ΑͶʢനʣ• E_USER_* ɺϢʔβʔ͕ൃߦͰ͖ΔΤϥʔܕ• DEPRECATED, NOTICE, WARNING, ERROR,ͷ4छ• WARN·Ͱ࣮ߦ͕ࢭ·Βͳ͍ (͜ͱ͕׆༻ͷϛι̍)• display_errors=offͰӅͤΔ (͜ͱ͕׆༻ͷϛι̎)
ո͍͠ॴʹೖΕ·͘Δ͚ͩ• ෛՙͰ• ར༻ॴ͕Θ͔Δ• ूܭࣗಈతʹ͞ΕΔ• ຊʹফ͔ͤͨλΠϜϥΠϯͰΘ͔Δ• શ෦͕Θ͔Δɻͦ͏ɺNewRelicͳΒͶ
͞Βʹݴ͑• ༷ʑͳཧ༝ͰσϓϩΠͰ͖ͳ͍߹Ͱ…• ී௨ͷPHPͳΒɺຊ൪ʹsshͯ͠ɺviͯ͠ίʔυΛͿͬ͢·ͰͰ͖ΔʢίϨͰͬͯΔΘ͚Ͱͳ͍Ͱ͢ʂʂʣ
ͬͱͬͱ׆༻!!!!!• ༷ʑͳ݅ͰಈతʹൃߦͰ͖Δɻͨͱ͑ifͰʮ͋Γ͑ͳ͍ݕʯൃՐͰ͖Δif(!in_array($type, $allow_type_list)){trigger_error("OOB!!", E_USER_WARNING);}
• REQUEST_URIΛਖ਼نදݱͰҾֻ͚ͬΔͱ͔Α͍if(preg_match("|\A/v0.1/old_api/|u",$_SERVER['REQUEST_URI']){trigger_error("deprecated...",E_USER_WARNING);}
• ʮഇࢭ͞Εͨύϥϝλ͕͋Δʯͱ͔ʁ• php.iniͷauto_prepend_fileΛ׆༻͢Δͱָ͔if(isset($_GET['session_id'])){trigger_error("OMG!!",E_USER_WARNING);}
ເ͕͕Δʂʂ• (ී௨ͷߦҝͰͳ͍Ͱ͢Ͷɺ͍)
ޙย͚• શจݕࡧͰফͤOK• (E_USER_WARNINGͱ͔ී௨͔ͭΘͳ͍ͷͰ…)• Ծʹ͍ͬͯͯΤϥʔϩάʹग़Δ͔Β୳ͤΔ͠ɺѱӨڹͳ͍
ͱ͍͏͜ͱͰ(?)PHPʹNewRelic࠷ߴʂ• ݹ͍PHPݱͦ͜ɺඞܞ• ͱʹ͔͘ೖΕͯɺͲΜͲΜίʔυվળ• ύϑΥʔϚϯενϡʔχϯά͚ͩͰͳ͍ʂ• (ɺࣗಈతʹ࣮ߦαϯϓϧͯ͠վળ)• Error Inbox ͚ͩͰศརʂ
Ҏ্ʂ
ҟৗͳཁ• ϨϯαόΈ͍ͨͳͷͰ͏͍ͯ͝΄͍͠ͳ• ʢREST APIΛ͖ͨͨ·͘ΕͰ͖Δ…ʁʣ• ʮdl("newrelic.so")Ͱ͏͍ͨ͝Γ͠ͳ͍͔ͳ…ʯ• ʢҟৗͳཁͩͱཧղ͍ͯ͠·͢ʣ• ʮPHPʹৄ͍͠ʯNRͷਓ ͱͯ͠Έ͍ͨ͆
ΏΔ͍ئ• (ʮ͘͝Ұൠతͳ͓٬༷ʯʹ͓͍ͯ…ʣ• ʮͰɺ͜Ε͍͘Β͔͔Δͷʁʯ• Ͱɺ༧ࢉ͕ΊͣɺೖΕΒΕͳ͍͜ͱ͕ଟ͍…• ʢࢼࢉ͕͍͠ʣ•!
I❤NewRelic• NRͱPHPΛτϦοΩʔʹͬͯΔਓͱΓ߹͍͍ͨ• ࠷ޙʹɺPHPͳਓPHPerKaigiʹ͝ࢀՃݕ౼͍ͩ͘͞