ããã«ã¡ã¯ããµã¼ãã¼ãµã¤ããã£ã¦ããã¾ã(@o0h_)ã§ãã
ãã¤ãã¼ã ãã¼ãã¼ãã©ãã©ãçãä¸ãã£ã¦ããã¾ããã»ã»ï¼ãã®å¾ã©ããªãã§ãããã

- ä½è : å±±å·ç´è¼,æåºã¾ãã
- ã¡ãã£ã¢: Kindleç
- ãã®ååãå«ãããã°ãè¦ã
ã³ãããã§ã¯èªç±ãªã½ããã§ã¢ã¸ã®è²¢ç®æ´»åã«åãçµãã§ããã¡ã³ãã¼ãå¤ãã®ã§ãããå¹´æ«ããããã社å
ã§ãã½ããã¦ã§ã¢ã®éçºãé²ãããªã©ãã¦ããã¾ããã
ããã¦ããã£ã¨ãããæä½éå
¬éã§ããå½¢ã«ã¯ãªã£ãããªããã¨ããã¨ãã¾ã§é²ãã 次第ã§ãã
ã¨ãããã¨ã§ãæ¬æ¥ã¯ãããªOSSã®ãç´¹ä»ããããã¨æãã¾ãã
CakePHP3ç¨ã®ãSentryãã©ã°ã¤ã³ã§ãã
packagist.org
Whatâs cake-sentry
ãããããªããã¸ã§ã¯ãã§ã¨ã©ã¼ãã©ããã³ã°ã«Sentryãæ´»ç¨ãã¦ãã¾ãã sentry.io
Sentryã¯ç¡æã§ã使ãã¦ãéç¥ãIssue管çãæè»ã«è¡ãã便å©ãªãµã¼ãã¹ã§ãï¼*1
ããã¦ããã¯ãSentryã¸ã®ãã°ã®éåºããµãã¼ãããããã¨ãããã©ã°ã¤ã³ã§ãã
ãCake3ã£ã½ãæ¸ãã¦ããã¨ã«ãããããç°¡åã«åãã¦ããæè»ãªè¨å®ããµãã¼ããããã¨ãã£ãå®è£
ãç®æãã¾ããã
Sentryèªä½ã¯ä»¥åããå©ç¨ãã¦ãããããCakePHP3ãç¨ããããã¸ã§ã¯ãã®ç«ã¡ä¸ãã«éãã¦ãç¶ç¶ãã¦å©ç¨ããã¨å¤æãã¦ãã¾ãããããããªãããããããã¯ãã«æå ¥ã§ããããªã¤ã³ãã°ã¬ã¼ã·ã§ã³ããªãããã¨ãã話ã«ãªããç¬èªã«å®è£ ãé²ãããã¨ã«ãªãã¾ãã*2
ãã®å¾ãä»ã«ãCakePHP3ãã¼ã¹ã®ããã¸ã§ã¯ããç«ã¡ä¸ãã£ã¦ããä¸ã§ã
- è¤æ°ã®ã¬ãã¸ããªã«æ軽ã«æ¨ªå±éãããã
- å½åããè¯ããããªè¨è¨ãè¦ãã¦ããã
- ãã¼ã¿ããªãã£ãæ ä¿ããããã«ãã©ã°ã¤ã³åããã
- ã©ããä½ããªãå ¬éãã¡ããã°
ã¨ããæ©éãé«ã¾ã£ã¦ããã¾ãããããã¦çã¾ããã®ãå½ãã©ã°ã¤ã³ã§ã*3ã
ã¾ãã¯ãã©ã¤ãã¼ãã¬ãã¸ããªã§éçºãé²ããå®éã«æ¬çªæå
¥ãçµã¦ãå
¬éç¨ã«å°ãä½è£ãæ´ãã¦ããOSSåããã¾ããã
composerããã¤ã³ã¹ãã¼ã«
ã¤ã³ã¹ãã¼ã«ã¯ããã¡ããcomposerã³ãã³ã1çºã§å¯è½ã§ã
$ composer require connehito/cake-sentry
ãã©ã°ã¤ã³ãã¢ããªã±ã¼ã·ã§ã³ã«å ¥ãã
cakeã®ã³ãã³ããç¨ãã¦ããã©ã°ã¤ã³ããã¼ããããããã«ãã¾ããbootstrap
ãªãã·ã§ã³ã¯å¿
é ã§ã¯ãªãã§ããããã©ã°ã¤ã³èªä½ã®bootstrapã«ãã£ã¦ãã¬ã¼ã®è¨å®ãããã«ã¦ã§ã¢(ã¨ã©ã¼ãã³ãã©)ã®è¨å®ãèªåçã«è¡ããã¾ãã
å®è¡ãããå
容ã«ã¤ãã¦ã¯å®éã®ã½ã¼ã¹(bootstrap.php)ã御覧ãã ããã
$ bin/cake plugin load Connehito/CakeSentry --bootstrap /app/config/bootstrap.php modified
bootstrapä¸ã«ã次ã®ãããª1è¡ãä»ã足ããã¾ããã
Plugin::load('Connehito/CakeSentry', ['bootstrap' => true]);
ããã§ã¤ã³ã¹ãã¼ã«ã¯å®äºã§ãã
Sentry DSNã®è¨å®
ç¶ãã¦ãSentryã®æ¥ç¶æ
å ±ã®è¨å®ã§ãã
ä»ã®æç¹ã§ã¯ãã¢ã¯ã»ã¹ãããã¨æ¬¡ã®ãããªã¨ã©ã¼ãçºçãã¾ãã
ããã¯Sentryã®æ¥ç¶æ
å ±(ã¢ã«ã¦ã³ãæ
å ±)ã渡ããã¦ããªãããã§ãã
ã¨ãããã¨ã§ã確èªãã¦æ¥ã¾ãã
DSNã®ç¢ºèª
ããã¸ã§ã¯ãã®ä½æç´å¾ã«è¨èªã»ãã¬ã¼ã ã¯ã¼ã¯(ä»åã¯PHP)ãé¸æããå¾ã«åºã¦ããç»é¢ã§ç¢ºèªã§ãã¾ãã
ãããã¯ãSettingsãã確èªå¯è½ã§ãã
Sentry DSNã®è¨å®
ãã®ãã©ã°ã¤ã³ã§ã¯ã Cofigure
ã¯ã©ã¹çµç±ã§è¨å®å¤ãèªã¿è¾¼ãããã«ãªã£ã¦ãã¾ããSentry.dsn
ã¨ãããã¼ã«ãå
ã»ã©ç¢ºèªããDSNã®å¤ãè¨å®ãã¦ãã ããã
ä¾ãã°ä»¥ä¸ã®ããã«ãªãã¾ãã
$ tail -13 config/app.php * - 'cache' - Use the Cache class to save sessions. * * To define a custom session handler, save it at src/Network/Session/<name>.php. * Make sure the class implements PHP's `SessionHandlerInterface` and set * Session.handler to <name> * * To use database sessions, load the SQL file located at config/schema/sessions.sql */ 'Session' => [ 'defaults' => 'php', ], 'Sentry' => [ 'dsn' => 'https://abcabcabc:[email protected]/000000', ], ];
ããã§åºç¤çãªè¨å®ãå®äºãã¾ãã(!) ããªãã®CakePHP3ããã¸ã§ã¯ãã¯ãããåä½å¯è½ã§ãã
使ã£ã¦ã¿ã(ãã¼ã·ãã¯ç·¨)
å®éã«ãã©ã®ãããªæ
å ±ãéãããã®ããè¦ã¦ã¿ã¾ãããã
AppControllerå
ã§ã¨ã©ã¼ãçºçããã¦ã¿ã¾ãã
--- a/src/Controller/AppController.php +++ b/src/Controller/AppController.php @@ -50,5 +50,6 @@ class AppController extends Controller */ //$this->loadComponent('Security'); //$this->loadComponent('Csrf'); + trigger_error('ãªã«ãã¨ã©ã¼ãï¼ï¼', E_USER_WARNING); } }
ããããã¼ã¸ã«ã¢ã¯ã»ã¹ãããã¨ãSentryã«ã¨ã©ã¼ãé£ãã§ãã¾ããã
ãçºçæ¥æããã¨ã©ã¼ã¡ãã»ã¼ã¸ããã¨ã©ã¼ã¬ãã«ããçºçç®æ(file, line, code)ããã¹ã¿ãã¯ãã¬ã¼ã¹ãåã³ãURLããããã¼ãªã©ã®ãªã¯ã¨ã¹ãæ
å ±ãã¨ãã£ããæä½éå¿
è¦ãªæ
å ±+αã¯å«ã¾ãã¦ãã¾ãã
é§ãåºãã®ããã¸ã§ã¯ãã«ããã¦ã¯ããã®æç¹ã§æ¢ã«æ´»ç¨ã§ããã¬ãã«ããç¥ãã¾ããã
ç¶ãã¦ä¾å¤ãæããå ´åã¯ã©ãã§ããããï¼
--- a/src/Controller/PagesController.php +++ b/src/Controller/PagesController.php @@ -44,6 +44,10 @@ class PagesController extends AppController if (!$count) { return $this->redirect('/'); } + throw new \Cake\Network\Exception\BadRequestException( + 'æªããªã¯ã¨ã¹ãã ããï¼', + 499 + ); if (in_array('..', $path, true) || in_array('.', $path, true)) { throw new ForbiddenException(); }
å
ç¨ã®æ
å ±ã«å ãã¦ããä¾å¤åããä¾å¤ã¡ãã»ã¼ã¸ãåã³ãä¾å¤ãæããã¡ã½ããã®å¼æ°ããæ
å ±ã¨ãã¦å¼ã渡ããã¦ãã¾ãã(PagesController::display()
ã®$path
ã¨ãã¦ãhome
ãå
¥ã£ã¦ãã¾ãã)
ãã®ããã«ããã¤ã³ã¹ãã¼ã« & ã²ã¨ã¤ã ãè¨å®å¤ãå ¥ãããã§ããã«Sentryãå°å ¥ã ï¼ï¼ãå®ç¾ã§ãã¦ãã¾ãã
ãã£ã¨å¿«é©ã«ä½¿ã
ããããã¯ãããå ·ä½çãªå®ç¨ã«åãã¦ã®è¨å®ã«ã¤ãã¦ç´¹ä»ãã¾ãã
è¨é²ãããªãä¾å¤ãæå®ãã
ãããã¯å¥ã«Sentryã«éããªãã¦ããããã¨ããæå®ããä¾å¤ã¯ã©ã¹åã®åæã«ããè¡ããã¨ãå¯è½ã§ããWebãµã¼ãã¹ãéç¨ãã¦ããã¨ããããã¯æ¬è³ªçãªåé¡ã§ãªããã対å¿ããã®ã«åã注ããªãã¦è¯ãããããã¯ãå¿ è¦ãªé¨åã«å¿ è¦ãªåã注ããããã¨æãã®ã¯å¸¸ã ã¨æãã®ã§ããã°ããã©ããã³ã°ã綺éºã«ããäºã¯å¤§äºã§ãããã
ä¾ãã°ã誰ãã1度ã¯è¦æããäºãããã§ããã /wp-login.php
ã¸ã®ã¢ã¯ã»ã¹ã»ã»ã»ï¼ããã¯ãåå¨ããªãURLãã¨ãã¦ãããã©ã«ãã®CakePHPçã«ã¯ãMissingControllerExceptionããè¿ãã¾ãã*4
å«ãªããã§ããã
æ¬ãã©ã°ã¤ã³ã®Sentryã¸ã®ãã°éåºã¯CakePHPã®Logæ©æ§ãç¨ãã¦è¡ããã¦ããã®ã§ãFileãDatabaseãªã©ã®é常ã®LogEngineã¨åæ§ã®æ¹æ³ã§ããã°ã«åãåºãã®ãã¹ãããããã¿ã¤ãããè¨å®ãããã¨ãå¯è½ã§ãã
以ä¸ã®ãããªè¨è¿°ãå ãã¾ãã
--- a/config/app.php +++ b/config/app.php @@ -152,6 +152,9 @@ return [ 'Error' => [ 'errorLevel' => E_ALL, 'exceptionRenderer' => 'Cake\Error\ExceptionRenderer', + 'skipLog' => [ + \Cake\Routing\Exception\MissingControllerException::class, + ], 'log' => true, 'trace' => true, ],
ããã ãã§MissingControllerException
ã¯ç¡è¦ãããããã«ãªãã¾ããã
ãã®è¾ºãããä¾ã«ãã£ã¦bookä¸ã«ç¿»è¨³æ¸ã¿èª¬æãããã¾ãã®ã§ã詳ããã¯ãã¡ãã御覧ãã ããã
ã¨ã©ã¼ã¨ä¾å¤ã®å¦ç - 3.5
ã³ã³ããã¹ãã®è¿½å
Sentryã§ã¯ãContext
ã¨ããå½¢ã§ãããã°ããã©ãã«ã·ã¥ã¼ãã«å½¹ç«ã¤æ§ã
ãªæ
å ±ãä»ä¸ãã¦ãããã¨ãã§ãã¾ãã
Context â Sentry Documentation
æ¬ãã©ã°ã¤ã³ã§ã¯Contextã®ä»ä¸ããµãã¼ããã¦ãã¾ãã
CakePHPã® ã¤ãã³ãã·ã¹ãã ãå©ç¨ããã¨ã©ã¼ãã³ãã©ã¼ããã®ã³ã°ã·ã¹ãã ãã®ãã®ã«æãå
¥ããªãã¾ã¾ã§ã®ã¦ã¼ã¶ã¼ã«ããèªç±ãªè¨å®ã®æ³¨å
¥ãå¯è½ã¨ãã¾ããã
ãµã³ãã«ã³ã¼ãã交ãã¦è¦ã¦ããã¾ãããã
user_contextã®è¿½å
ç¾ç¶ã§ã¯ãRequestæ å ±ãcontextã¨ãã¦æ¸¡ãããã«ãªã£ã¦ãã¾ã(è¸ã¿è¾¼ãã§è¨ãã¨ãRequestçµç±ã§Sessionæ å ±ãåå¾ãããã¨ãå¯è½ã§ã)ã
ä¾ãã°ãã¾ãã¤ãã³ãè³¼èªç¨ã®ã¯ã©ã¹ãå®è£ ãã¦
diff --git a/src/Error/SentryErrorContext.php b/src/Error/SentryErrorContext.php new file mode 100644 index 0000000..6203d7f --- /dev/null +++ b/src/Error/SentryErrorContext.php @@ -0,0 +1,27 @@ +<?php + +namespace App\Error; + +use Cake\Event\Event; +use Cake\Event\EventListenerInterface; + +class SentryErrorContext implements EventListenerInterface + { + public function implementedEvents() + { + return [ + 'CakeSentry.Client.beforeCapture' => 'setContext', + ]; + } + + public function setContext(Event $event) + { + $request = $event->getSubject()->getRequest(); + $session = $request->getSession(); + $raven = $event->getSubject()->getRaven(); + $raven->user_context([ + 'id' => $session->read('Auth.User.id'), + 'username' => $session->read('Auth.User.name'), + ]); + } +}
ãããbootstrap.phpããã°ãã¼ãã«ã«ç»é²ããã¾ãã
diff --git a/config/bootstrap.php b/config/bootstrap.php index 97f92a6..c5f1ce2 100644 --- a/config/bootstrap.php +++ b/config/bootstrap.php @@ -216,3 +216,5 @@ if (Configure::read('debug')) { } Plugin::load('Connehito/CakeSentry', ['bootstrap' => true]); + +\Cake\Event\EventManager::instance()->on(new \App\Error\SentryErrorContext());
ãããããã¨ã§ãuseræ å ±ãå ¥ãããã«ãªãã¾ããã*5
useræ å ±ãæ±ããããã«ãªãã¨ãã¨ã©ã¼(Issue)ãã¨ã«ééããã¦ã¼ã¶ã¼æ°ãã«ã¦ã³ããããããã«ãªã£ã¦ä¾¿å©ã§ããå½±é¿ç¯å²ãè¦ãããããªãã¾ããããã©ã«ãã§ã¯IPãSession IDãå©ç¨ãã¦Sentryããããªã«å¤å®ãã¦ããã¯ãããã®ã®ããã¯ãæ示çã«ã¢ããªã±ã¼ã·ã§ã³å´ãããã¸ãã¯ãæã£ã¦ééãã¦ãããæ¹ãæ£ç¢ºã§ãããã*6
ããã«å¤ãã®æ å ±ã追å
Environmentãtagã®ã»ããããã¨ã¦ãç°¡åã«è¡ããã¨ãã§ãã¾ãã
1ã¤ã¯ setEnvironment()
ã tags_context()
ã¨ãã£ãRaven_Client*7ã®å
¬éAPIãå©ç¨ãããã¨ã§ãã ãããã¯ãã©ã°ã¤ã³å´ã®ç¬èªå®è£
ã§ã¯ãªããSentry PHP SDKã®APIãç¨ãã¦è¡ããã®ã«ãªãã®ã§ã詳ããã¯å
¬å¼ã®ããã¥ã¡ã³ããåç
§ãã¦ãã ãã
Usage â Sentry Documentation
ãã1ã¤ã¯ãã»ãããããæ
å ±ãreturnãããæ¹æ³ã§ãã
次ã®ä¾ã§ã¯ã extraæ
å ±ããã®æ¹æ³ã§æ¸¡ãã¦ãã¾ãã
diff --git a/src/Error/SentryErrorContext.php b/src/Error/SentryErrorContext.php index 6203d7f..d60062b 100644 --- a/src/Error/SentryErrorContext.php +++ b/src/Error/SentryErrorContext.php @@ -23,5 +23,15 @@ class SentryErrorContext implements EventListenerInterface 'id' => $session->read('Auth.User.id'), 'username' => $session->read('Auth.User.name'), ]); + $raven->setEnvironment(env('STAGE') ?? 'local'); + $raven->tags_context([ + 'app_ver' => $request->getHeaderLine('App-Version') ?: 0.9, + ]); + + return [ + 'extra' => [ + 'foo' => 'bar', + ], + ]; } }
ãããããã¨ã§ãå¼ã³åºãå
ã«extra.foo
ã渡ããã¨ã«ãªããããããã®ã¾ã¾Raven_Client
ã«å¼ã渡ããããã¨ã«ãªãã¾ãã
- tagã®ã»ãã(app_ver)
- Environmentã®ã»ãã(local)
- extraã®ã»ãã(foo:bar)
以ä¸ãã connehito/cake-sentryã®ãç´¹ä»ã¨ãªãã¾ãã
ä»å¾
å
ã®ã¨ã³ããªã¼ã§ã触ãã¾ããããCakePHP3.6ã«ã¦Pluginå¨ãã®æ¹ä¿®ãè¡ããã¾ãã*8
ï½¢ä½ãå´ã¨ãã¦ã¯ã©ãä»ãåãã¹ãããªï¼ãã«ã¤ãã¦ããã£ããã¨å¤æãã¦ããããã§ãã
ã¾ããSentry SDKã¯2.0
ã¨ãããã©ã³ããæ´»åä¸ã§ããã大ããä½ããå¤ããããç¥ãã¾ããã(ãã£ã¨ã¢ãã³ã½ããªãæ°ãããã»ã»ï¼)
ãã¡ãã¯ãªãªã¼ã¹ããããæ¯é対å¿ããããªãã¨ã¯èãã¦ãã¾ãã
GitHub - getsentry/sentry-php at 2.0
æå¾ã«
å¹æçã«æ
å ±åéãè¡ããã¨ããããã°ããã©ãã«ã·ã¥ã¼ãã£ã³ã°ãä½åãå¹çåããã¦ããã¨æãã¾ãã
ãã®ããããã¼ã ãããã¸ã§ã¯ãã«ãã£ã¦ããã°ã«æ®ãæ
å ±ãæè»ã«åãæ±ãããã¨ããã®ã¯éè¦ãªç¹ã ã¨èãã¦ãã¾ããããããå½ãã©ã°ã¤ã³ãä½ãä¸ã§æèãããã¨ã§ãã
ä»æ¹ã§ããã»ã¨ãã©ä½ãããªãã¦ãåããã¨ããã¬ãã«ããã¼ãã§ãã¦ããã®ã§ã¯ãªããã¨æãã¾ãã
CakePHP3ãæ±ã£ã¦ãããã¼ã ãããã¾ãããããå©ç¨ããã ããã幸ãã§ãã
ãã¡ããã使ãæ¹ã®ææ¡ãå®è£
ã»æ©è½ã®è¦æãªã©ã¯githubä¸ã§ãã¤ã§ããå¾
ã¡ãã¦ããã¾ãï¼
*1:æ¬è¨äºã§ã¯ãµã¼ãã¹èªä½ã«ã¯è§¦ãã¾ãããããã²èª¿ã¹ãã試ããããã¦ã¿ã¦ãã ããï¼
*2:ç¬èªå®è£ ã¨è¨ã£ã¦ããSentryã®å ¬å¼PHP SDKã¯åå¨ããã®ã§ããããã©ãããã¦çµã¿è¾¼ãå½¢ã§ã
*3:ãã ããCakePHP3.5以ä¸ã¨PHP7.0以ä¸ãè¦ãããã¨ã«ã注æãã ãã
*4:å ·ä½çã«è¨ãã°ãRoutingãfallback()å¦çã«å ¥ã£ãä¸ã§urlã®ãã¼ã¹ã«ã¯æåãããããªããmapããã:controllerã«è©²å½ããã¯ã©ã¹ããªãã»ã»ã¨ããç¶æ
*5:ä»åã¯ãµã³ãã«ã®ã¢ããªã±ã¼ã·ã§ã³ãåããã¦ããã®ã§ãç´æ¥AuthComponent::setUser()ã§ã¦ã¼ã¶ã¼ãã»ãããã¾ãã
*6:ç¹ã«IPãã¼ã¹ã¨ãªã£ãå ´åãç´æ¥ã®ãªã¯ã¨ã¹ãå ã¨ãã¦ãã¼ããã©ã³ãµã¼ã®IPãç¨ãã¦ãã¦ã¼ã¶ã¼æ°ããåºãããããããã®ã§ãå®ç¨çãªæ°åãä¸ãã£ã¦ãã¾ãã
*7:Sentryã®å ¬å¼SDK