2013-07-25 3 views
7

PHP 웹 응용 프로그램에서 New Relic을 설정했습니다. 한 가지를 제외하면 모든 것이 잘 작동합니다 ... 모든 거래는 "index.php"를 통해 진행됩니다.Newrelic이 내 Slim PHP 경로를 인식하지 못합니다.

이유 내가 사용하기 때문에 Slim framework (이 aremanyalternativesforrouting) URL 내가 모든 컨트롤러와 액션에 대한 폴더없이 "/ 사용자/설정"와 같은 좋은 인간 URL을 가질 수 있도록 재 작성과 함께.

하지만 여전히 New Relic 웹 트랜잭션의 이름은 index.php입니다.

답변

8

후크를 사용하여 트랜잭션 이름을 라우터의 이름 또는 패턴으로 설정할 수 있습니다.

$app->hook('slim.before.dispatch', function() use ($app) { 
    newrelic_name_transaction($app->router()->getCurrentRoute()->getPattern()); 
}); 
8

CodeIgniter와 관련된 답변 (available here)을 찾을 수 있었지만 검색이 필요했습니다.

약간의 수정이 나를 (슬림)와 함께 작동했다, 나는 거의 같은 솔루션이됩니다 다른 PHP 라우터와 프레임 워크를 상상 :

if (extension_loaded ('newrelic')) { 
    newrelic_name_transaction($_SERVER['REQUEST_URI']); 
} 

편집 : 모든 GET 매개 변수를 포함하지 않도록를, 이것을 사용

newrelic_name_transaction(current(explode('?', $_SERVER['REQUEST_URI']))) 

참고 : 두 번째 줄에 에머슨의 대답은, 그 경로 패턴을 사용하는 것이 좋습니다, 당신은 슬림를 사용하는 경우 리터럴 URL을 사용하는 것보다 훨씬 더 나은 옵션입니다.

+1

"트랜잭션 이름에 요청 별 데이터를 절대 포함하지 말아야합니다. 예를 들어, 실제 요청 URL을 사용하는 것은 극히 나쁜 것입니다." https://newrelic.com/docs/php/framework-developers-integrated-support-for-new-relic – msanford

+0

그들은 그것을 말합니다 -하지만 그들은 정말로 다른 곳을 제공하지 않습니다. – Mbrevda

+0

많은 경우에 요청 URL이 없다고 생각합니다. 사람들에게 유용하다. 예를 들어, 10,000 개의 제품이있는 전자 상거래 사이트가있는 경우 '제품 페이지'를 하나의 액션으로 원하고 10,000 개의 개별 액션으로 사용하지 않을 것입니다. 그렇지 않으면보고 UI를 제대로 활용하기 어렵습니다. –

1

새로운 유물이 이제 슬림 프레임 워크는 PHP 에이전트의 버전 6.7.0.174로 시작하는 아웃 - 오브 - 박스 지원이 :

여기에 패턴으로 설정 한 예이다.

0

나는 NewRelic 에이전트 6.9.0.182로 업데이트하지만 거래는 여전히 (슬림 3 더 이상 훅을 지원하지 않기 때문에) 나는 미들웨어를 넣어 그래서 이름이하지 않는 대신 그것은 작동 더 나은 :

$app = new \Slim\App(['settings' => [ 
    // to be able access to route within middleware 
    'determineRouteBeforeAppMiddleware' => true, 
]]); 

// middleware to send the correct route to NewRelic 
$app->add(function ($request, $response, $next) { 
    if (extension_loaded('newrelic') && $request->getAttribute('route')) { 
     newrelic_name_transaction($request->getAttribute('route')->getPattern()); 
    } 

    return $next($request, $response); 
}); 

// loads some routes 

$app->run(); 
당신이 할 수 있습니다