2014-04-15 4 views
3

새 유물을 사용하는 백그라운드 프로세스 인 .NET 응용 프로그램 내부의 메소드를 모니터하려고합니다. 사용자 지정 계측을 추가해야하는 경우입니다.Windows의 백그라운드 프로세스에 새 유적의 사용자 정의 계측 추가하기

.NET Agent를 다시 설치하고 "Instrument all .NET Applications"를 구성하고 app.config 및 newrelic.config 파일 내에서 변경 한 후 백그라운드 프로세스의 기본 데이터를 새로운 유적 대시 보드.

이제 Custom Instrumentation을 추가하기 위해 다른 instrumentation 구성 파일을 extensions 디렉토리에 추가했습니다. 앱을 다시 시작했지만 여전히 모니터 할 새/맞춤 메소드를 볼 수 없습니다.

이 내 계측 파일 MyInstrumentation.xml입니다

<?xml version="1.0" encoding="utf-8"?> 

<!-- instrument EngineService.BestAgentSolver.Solve inside EngineService.BestAgentSolver --> 
<tracerFactory metricName="Cast-a-Net.EngineService.BestAgentSolver.Solve-Metric"> 
    <match assemblyName="Cast-a-Net.EngineService" className="Cast-a-Net.EngineService.BestAgentSolver"> 
    <exactMethodMatcher methodName="Solve" /> 
    </match> 
</tracerFactory> 

<!-- instrument EngineService.SessonManager.BroadcastLeadCounts inside EngineService.SessionManager --> 
<tracerFactory metricName="Cast-a-Net.EngineService.SessionManager.BroadcastLeadCounts-Metric"> 
    <match assemblyName="Cast-a-Net.EngineService" className="Cast-a-Net.EngineService.SessionManager"> 
    <exactMethodMatcher methodName="BroadcastLeadCounts" /> 
    </match> 
</tracerFactory> 

<tracerFactory metricName="myapp.Web.Controllers.CallListController.ActionResult-Metric"> 
    <match assemblyName="myapp.Web" className="myapp.Web.Controllers.CallListController"> 
    <exactMethodMatcher methodName="ActionResult" /> 
    </match> 
</tracerFactory> 

나는 단계를 누락되거나 잘못된 일을하고 있습니까?

답변

3

.NET 에이전트의 사용자 지정 계측은 HttpContext 개체를 사용하는 웹 트랜잭션과 함께 작동합니다. 반면 .NET Agent API를 사용하면 사용자 정의 대시 보드에 표시 할 수있는 메트릭을 수집 할 수 있습니다. 특히 RecordMetric, RecordResponseTimeMetric 및 IncrementCounter는 웹 이외의 응용 프로그램에서 작동하기 때문에 유용합니다.

그러나 .NET 에이전트 버전 2.24.218.0부터는 새 기능을 사용하여 에이전트가 일반적으로 그렇게하지 않는 트랜잭션을 만들 수 있습니다. 이는 사용자 정의 계측 파일을 통한 수동 프로세스입니다.

CoreInstrumentation.xml과 함께 C : \ ProgramData \ New Relic.NET Agent \ Extensions에 CustomInstrumentation.xml이라는 사용자 지정 계측 파일을 만듭니다. 사용자 정의 계측 파일에 다음 내용을 추가합니다 :

<?xml version="1.0" encoding="utf-8"?> 
<extension xmlns="urn:newrelic-extension"> 
    <instrumentation> 
    <tracerFactory name="NewRelic.Agent.Core.Tracer.Factories.BackgroundThreadTracerFactory" metricName="Category/Name"> 
     <match assemblyName="AssemblyName" className="NameSpace.ClassName"> 
     <exactMethodMatcher methodName="MethodName" /> 
     </match> 
    </tracerFactory> 
    </instrumentation> 
</extension> 

당신은 변경해야 속성이 위 카테고리/이름,의 AssemblyName, NameSpace.ClassName 및 methodName로 값 :

거래를 시작할 때 형 이름 공간의 객체 AssemblyName 어셈블리의 .ClassName은 MethodName 메서드를 호출합니다. 메소드가 메소드를 리턴하거나 예외를 던지면 트랜잭션이 종료됩니다. 트랜잭션의 이름은 Name이며 카테고리로 지정된 트랜잭션 유형으로 그룹화됩니다. New Relic UI에서는 Monitoring> Transactions 페이지를 볼 때 Type 드롭 다운 메뉴에서 트랜잭션 유형을 선택할 수 있습니다.

범주와 이름이 모두 있어야하며 슬래시로 구분해야합니다.

예상대로 메소드 호출 중에 발생하는 계측 된 활동 (메소드, 데이터베이스, 외부)은 트랜잭션의 분석 테이블과 트랜잭션 추적에 표시됩니다.

다음은 좀 더 구체적인 예입니다.첫째, 계측 파일 :

<?xml version="1.0" encoding="utf-8"?> 
<extension xmlns="urn:newrelic-extension"> 
    <instrumentation> 
    <tracerFactory name="NewRelic.Agent.Core.Tracer.Factories.BackgroundThreadTracerFactory" metricName="Background/Bars"> 
     <match assemblyName="Foo" className="Foo.Bar"> 
     <exactMethodMatcher methodName="Bar1" /> 
     <exactMethodMatcher methodName="Bar2" /> 
     </match> 
    </tracerFactory> 
    <tracerFactory metricName="Custom/some custom metric name"> 
     <match assemblyName="Foo" className="Foo.Bar"> 
     <exactMethodMatcher methodName="Bar3" /> 
     </match> 
    </tracerFactory> 
    </instrumentation> 
</extension> 

이제 몇 가지 코드 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Custom Transactions"); 
      var t = new CustomTransaction(); 
      for (int i = 0; i < 100; ++i) 
       t.StartTransaction(); 
     } 
    } 
    class CustomTransaction 
    { 
     public void StartTransaction() 
     { 
      Console.WriteLine("StartTransaction");  
      Dummy(); 
     } 
     void Dummy() 
     { 
      System.Threading.Thread.Sleep(5000); 
     } 
    } 

} 

사용하여 다음과 같은 사용자 정의 계측 파일 : 여기

var foo = new Foo(); 
foo.Bar1(); // Creates a transaction named Bars in category Background 
foo.Bar2(); // Same here. 
foo.Bar3(); // Won't create a new transaction. See notes below. 

public class Foo 
{ 
    // this will result in a transaction with an External Service request segment in the transaction trace 
    public void Bar1() 
    { 
     new WebClient().DownloadString("http://www.google.com/); 
    } 

    // this will result in a transaction that has one segment with a category of "Custom" and a name of "some custom metric name" 
    public void Bar2() 
    { 
     // the segment for Bar3 will contain your SQL query inside of it and possibly an execution plan 
     Bar3(); 
    } 

    // if Bar3 is called directly, it won't get a transaction made for it. 
    // However, if it is called inside of Bar1 or Bar2 then it will show up as a segment containing the SQL query 
    private void Bar3() 
    { 
     using (var connection = new SqlConnection(ConnectionStrings["MsSqlConnection"].ConnectionString)) 
     { 
      connection.Open(); 
      using (var command = new SqlCommand("SELECT * FROM table", connection)) 
      using (var reader = command.ExecuteReader()) 
      { 
       reader.Read(); 
      } 
     } 
    } 
} 

은 사용자 정의 트랜잭션을 설명하는 간단한 콘솔 응용 프로그램입니다

<?xml version="1.0" encoding="utf-8"?> 
<extension xmlns="urn:newrelic-extension"> 
    <instrumentation> 
     <tracerFactory name="NewRelic.Agent.Core.Tracer.Factories.BackgroundThreadTracerFactory" metricName="Background/CustomTransaction"> 
      <match assemblyName="ConsoleApplication1" className="ConsoleApplication1.CustomTransaction"> 
      <exactMethodMatcher methodName="StartTransaction" /> 
      </match> 
     </tracerFactory> 
     <tracerFactory metricName="Custom/Dummy"> 
      <match assemblyName="ConsoleApplication1" className="ConsoleApplication1.CustomTransaction"> 
      <exactMethodMatcher methodName="Dummy" /> 
      </match> 
     </tracerFactory> 
    </instrumentation> 
</extension> 

응용 프로그램을 몇 번 실행 한 후에 다른 트랜잭션, 백그라운드 범주에 사용자 정의 트랜잭션이 표시되어야합니다. 트랜잭션 분석 테이블과 트랜잭션 추적에서 더미 세그먼트를 확인해야합니다.

+0

NewRelic.Api와 XML을 사용하는 사이에 차이점이 있습니까? 아니면 다른 구문으로도 똑같은가? –

+0

@ Snæbjørn [custom instrumentation] (https://newrelic.com/docs/dotnet/agent-custom-metrics)과 XML 파일은 [.NET Agent API] (https : //newrelic.com/docs/dotnet/the-net-agent-api). XML 파일을 사용하여 프로파일 러가 추적 할 메소드에 대한 계측을 정의하십시오. 트랜잭션 이름 지정 또는 오류 기록과 같은 특정 유틸리티에 API를 사용하십시오. API로 직접 측정 항목을 기록하면 [맞춤 대시 보드] (https://docs.newrelic.com/docs/dashboards/new-relic-dashboards)에서 볼 수있는 측정 항목이됩니다. –

+0

나는 그것을 조금만 가지고 놀고 난 후 지금은 이해하고 있다고 생각한다. :) –