2017-01-31 4 views
1

우리는 몇 초마다 실행되는 Azure 기능이 있습니다. 이 코드가 예외를 발생 시키거나 오작동을 일으키는 지 여부를 알려주기 위해 New Relic을 사용하고자합니다. VM에 New Relic 에이전트를 설치하고 NuGet을 통해 NewRelic.Agent.Api DLL을 가져 왔습니다. NewRelic.AppName을 AzureFunctionAppTest로 설정하고 NEWRELIC_LICENSEKEY 환경 변수를 설정합니다. 로그 파일은 NewRelic에 연결하고 있음을 나타냅니다. 지금, 나는 다음과 같은 코드를 실행 해요 : 기본적으로 내가 트랜잭션 이름을 설정하기 위해 노력하고있어, 그래서새 유물을 사용하여 Azure Function 응용 프로그램을 모니터링 할 수 있습니까?

#r "Microsoft.windowsazure.storage" 

using System; 
using System.Threading.Tasks; 
using Microsoft.WindowsAzure.Storage.Table; 

public static void Run(TimerInfo myTimer, TraceWriter log, CloudTable syncTimesTable) 
{ 
    NewRelic.Api.Agent.NewRelic.SetTransactionName("SyncEvents", "GetRoutineData"); 

    var rnd = new Random(DateTime.Now.Millisecond).Next(30); 
    log.Info($"Logging {rnd}"); 

    var eventAttributes = new Dictionary<string, object>() {{"result", "Success!"}, {"Count", rnd.ToString()}}; 
    NewRelic.Api.Agent.NewRelic.RecordCustomEvent("DevicesSynced", eventAttributes); 

    NewRelic.Api.Agent.NewRelic.NoticeError(new SyncException("This is another custom error")); 
} 

public class SyncException : Exception 
{ 
    public SyncException(string msg) : base(msg) 
    { 
    } 
} 

을, 그때는 난수를 생성하고 사용자 정의 이벤트로 로그인 한 다음 나는 로그온을 시도 맞춤 오류.

나는 이것을 약간 실행 한 다음 New Relic 대시 보드로 체크인했다. 다음은 내가 얻은 것입니다.

  • 새 응용 프로그램이 APM 대시 보드에 표시됩니다.
  • 통찰력 대시 보드에서 SELECT * FROM DevicesSynced 30 분 전부터 쿼리 할 수 ​​있으며 "성공"이라고 쓰여진 여러 레코드가있는 테이블을 볼 수 있습니다. 카운트 열에 임의의 숫자가 표시됩니다.
  • APM-> 이벤트 -> 오류에서 "NewRelic.Api.Agent.NoticeError API 호출 전송 # 0 + SyncException"의 "URL 및 유형"메시지가 표시됩니다. "이 메시지는 다른 사용자 정의 오류입니다."및 카운트.
  • 오류 분석에서 '좋아요!이 시간대에는 오류가 없습니다.'라는 메시지가 표시됩니다. (지난 30 분)
  • Monitoring-> Transactions에서/Home/Get,/Admin/GetHostStatus,/Keys/Get 및/Admin/GetFunctionStatus와 같은 HTTP 요청에 대한 트랜잭션 만 볼 수 있습니다. 나는이 HTTP 요청이 Azure 함수의 내부 동작에 있다고 생각하며 Azure 콘솔에서 주위를 클릭 할 때 발생할 수 있습니다. GetRoutineData라는 트랜잭션이 보이지 않습니다. 내가 SELECT * FROM Transactions을 실행하면 나는 또한 이것을 보지 못한다. 새로운 유물이 나에게 이름을 설정시키는되지 않도록

나는, 내 푸른 기능 코드에 거래 실제로을 아니에요 느낌이있다. 또한 NoticeError를 사용하여 오류를 기록하더라도 모든 트랜잭션에 연결되지 않으므로 오류 분석에 나타나지 않는다는 느낌이 들었습니다.

내 질문 :

  • 새로운 유물이 거래로이 코드 경로를 인식 얻을 수있는 방법이 있나요?
  • 그렇지 않은 경우 특정 예외 유형 (예 : my SyncException 클래스)이 발생하거나 특정 임계 값 보류에 도달하면 알림을 보내려면 New Relic Application Monitoring을 설정하는 방법이 있습니까?

감사합니다.

UPDATE :

<?xml version="1.0" encoding="utf-8"?> 
<extension 
    xmlns="urn:newrelic-extension"> 
    <instrumentation> 
     <!-- Define the method which triggers the creation of a transaction. --> 
     <tracerFactory name="NewRelic.Agent.Core.Tracer.Factories.BackgroundThreadTracerFactory" metricName="Background/AzureDeviceSync"> 
      <match assemblyName="Microsoft.Azure.WebJobs.Script" className="Microsoft.Azure.WebJobs.Script.Description.FunctionInvokerBase"> 
       <exactMethodMatcher methodName="Invoke" /> 
      </match> 
     </tracerFactory> 
    </instrumentation> 
</extension> 

을 그러나, 나는 어떤 차이를 볼 수 없습니다 : 나는 다음과 같은 내용으로 New Relic instructions 당과 같이 Extensions 디렉토리에 CustomInstrumentation.xml을라는 파일을 추가하는 시도

행동. 몇 가지 메서드 이름 일치 (예 : InvokeCoreInvoke)를 시도했지만 차이가 나타나지 않습니다.

몇 가지 질문 :

새로운 유물 문서는 말한다 : 그러나 내 새로운

enter image description here

:

To view the transaction: From the New Relic menu bar, select APM > Applications > (selected app) > Monitoring > Transactions > Type > (selected type). (The type is defined by Category/Name.) You can then view all custom transactions of the selected type.

그것은 사용자 정의 옵션이있는 드롭 다운 메뉴의 그림을 보여줍니다 유적 인터페이스에는 '유형'드롭 다운 메뉴가 없습니다.

enter image description here

또한 기능 코드 내에서 스택 추적을 표시하도록 코드를 구성하면 다음과 같이 표시됩니다. 아마 도움이됩니다 : 사용자 정의 트랜잭션 설정이 참으로로드 된 경우 새로운 트랜잭션이 생성 될 때 표시 로그 파일의 어떤 종류가 있는지 궁금 해요

Stack: 

    at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) 
    at System.Environment.get_StackTrace() 
    at Submission#0.Run(TimerInfo myTimer, TraceWriter log, CloudTable syncTimesTable) in :line 9 
    at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) 
    at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at Microsoft.Azure.WebJobs.Script.Description.DotNetFunctionInvoker.<InvokeCore>d__23.MoveNext() 
    at System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start[TStateMachine](TStateMachine& stateMachine) 
    at Microsoft.Azure.WebJobs.Script.Description.DotNetFunctionInvoker.InvokeCore(Object[] parameters, FunctionInvocationContext context) 
    at Microsoft.Azure.WebJobs.Script.Description.FunctionInvokerBase.<Invoke>d__29.MoveNext() 
    at System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start[TStateMachine](TStateMachine& stateMachine) 
    at Microsoft.Azure.WebJobs.Script.Description.FunctionInvokerBase.Invoke(Object[] parameters) 
    at Host.Functions.LogNewRelicAlert(TimerInfo myTimer, TraceWriter log, CloudTable syncTimesTable, ExecutionContext _context) 
    at lambda_method(Closure , Functions , Object[]) 
    at Microsoft.Azure.WebJobs.Host.Executors.TaskMethodInvoker`1.InvokeAsync(TReflected instance, Object[] arguments) 
    at Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker`1.<InvokeAsync>d__8.MoveNext() 
    at System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.InvokeMoveNext(Object stateMachine) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.Run() 
    at System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.RunAction(Object state) 
    at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 
    at System.Threading.ThreadPoolWorkQueue.Dispatch() 
    at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() 

. 지금 당장 XML이 잘못된 것 같아요.

한 가지 더. 나는 줄을 추가하는 경우 : 내 기능의 응용 프로그램에서

NewRelic.Api.Agent.NewRelic.SetTransactionName("Custom", "Testing"); 

을, 나는 새로운 유물 로그에 다음과 같은 경고가 표시됩니다

2017-02-01 21:45:25,005 NewRelic WARN: Agent API Error: An error occurred invoking API method "SetTransactionName" - "System.InvalidOperationException: The API method called is only valid from within a transaction. This error can occur if you call the API method from a thread other than the one the transaction started on.

을 내가 그 분명히 우리가 실제로에서 아니에요하게 생각 다른 스레드에서 발생하지 않는 한이 시점에서의 트랜잭션 (이 경우에는 놀랄 일이 아닙니다).

다른 아이디어?

당신은 사용자 정의 트랜잭션에게 탄 주어야한다
+0

이것은 당신이 찾고있는 로깅 것 같습니다 : https://discuss.newrelic.com/t/custom-instrumentation-not-showing-in-transactions/16532 당신을 위해 파일 시스템에 액세스 할 수 있습니다 function @ .scm.azurewebsites.net/DebugConsole –

+0

@ MattMason-MSFT - 지금 XML 파일에 추가 한 도구가 작동하고 Metric이 New Relic으로 전송되는 것처럼 보입니다. 그러나 New Relic 대시 보드에서는 트랜잭션으로 표시되지 않습니다. 나는 그것이 확실한 지 모르겠다. 나는 모든 것이 제 마지막에 올바르게 설정되어 있다고 생각하기 때문에 새로운 유물 기술자가 필요하다고 생각합니다. –

+0

@ MattMason-MSFT - 잘 했어! 어쨌든, 90 %. 예외 추적을 사용하는 것이 좋겠지 만 NoticeError를 사용하여 직접 손쉽게 수행 할 수 있습니다. 내가 찾은 것을 아래에 추가했습니다. 도와 주셔서 다시 한 번 감사드립니다! –

답변

2

:

  1. 의 AssemblyName : 여기 https://docs.newrelic.com/docs/agents/net-agent/instrumentation/net-custom-transactions

    내가 적용 할 것이라고 생각 값입니다을 Microsoft.Azure.WebJobs.Script

  2. ClassName : Microsoft.Azure.WebJobs.Script.Description.FunctionInvokerBase
  3. 메서드 이름 : InvokeCore

나는 모든 사용자 함수 실행에 대한 일반적인 래퍼 인 this method call에 트랜잭션을 추가한다고 생각합니다.

+0

나는 이것을 줄 것이고 당신에게 다시보고 할 것이다! 감사! –

+0

사용자 정의 트랜잭션과 관련하여 운이 없습니다. 위의 질문을 더 많은 정보로 업데이트했습니다. 정말 도움을 주셔서 감사합니다! –

2

마지막으로 작동했습니다! 음, 적어도 그것이 작동 할 것이라고 나는 생각한다. 새로운 유물이 확장 디렉토리에있는 모든 XML 파일을로드 할 것이다 당신이이 파일을 호출 중요하지 않습니다

<?xml version="1.0" encoding="utf-8"?> 
<extension 
    xmlns="urn:newrelic-extension"> 
    <instrumentation> 
     <!-- Define the method which triggers the creation of a transaction. --> 
     <tracerFactory 
      name="NewRelic.Agent.Core.Tracer.Factories.BackgroundThreadTracerFactory" 
      metricName="Limeade/AzureDeviceSync"> 
      <match assemblyName="Microsoft.Azure.WebJobs.Script" className="Microsoft.Azure.WebJobs.Script.Description.DotNetFunctionInvoker"> 
       <exactMethodMatcher methodName="InvokeCore" /> 
      </match> 
     </tracerFactory> 
    </instrumentation> 
</extension> 

다음은/확장 디렉토리에 내 .XML 파일입니다.

여기에서 내가 배운 몇 가지이다 :

  1. 당신이 IIS를 재설정해야, 확장 XML 파일을 포함하여 모든 새로운 유물 구성을 변경, 확인합니다. 그러나 SCM에서 "사이트 재시작"단추는 실제로 IIS 프로세스를 종료하지 않습니다. Kudu에서 Process Explorer로 가서 w3wp.exe 프로세스를 종료해야합니다. 어떤 프로세스가 죽일 지 알 수 없다면, 기능 응용 프로그램에 log.Info($"Currently running in PID: {System.Diagnostics.Process.GetCurrentProcess().Id}");을 추가하여 찾을 수 있습니다.

  2. 새로운 유물이 혼란 트랜잭션 이름과 같은 Microsoft.Azure.WebJobs.Script.Description.DotNetFunctionInvoker/기본적으로 InvokeCore를 생성합니다. XML 파일에서 트랜잭션 이름을 설정하는 방법을 찾지 못했습니다. 그러나 다음처럼 푸른 기능 코드에 새 트랜잭션 이름을 설정할 수 있습니다 당신의 Run 방법에서 예외를 던지는 것은 오류로 예외를 기록 할 경우

    NewRelic.Api.Agent.NewRelic.SetTransactionName("SyncEvents", "GetRoutineData");

  3. 그것은 매우 좋은 것 New Relic, 그러나 꽤 많은 노력 끝에 나는 이것을 작동시키지 못했습니다. 나는이 예외가 어딘가에서 먹힐 것이라고 생각하며 잃어 버리기 전에이를 가로 채기위한 추적 프로그램 구성의 올바른 조합을 이해할 수 없다. 이 나타납니다 NewRelic.Api.Agent.NewRelic.NoticeError(new SyncException("This is a custom error")); 그냥 같은 일을하고 이러한 오류가 오류오류 분석의 새로운 유물에에 표시됩니다 : 그러나 NoticeError() 호출을 사용할 수 있습니다. 단점은 Azure Function 코드를 여러 번 리팩터링하여 모든 오류를 잡아 냄으로써 오류를 발견하고 필요한 경우 재발행해야한다는 것입니다.

저는이 일을 2 일간 보냈으므로이 사람이 도움이되기를 바랍니다 !!

+0

이 어셈블리 클래스 및 메서드 이름이 릴리스간에 일관성을 유지한다고 보장 할 수는 없으므로이 시나리오는 확실히 지원되지 않습니다. 당신이 듣고있어 기쁘다! –

+0

그래, 잘하면 그 기능은 변경되지 않습니다 .. 아마도 새로운 유물은 Azure 기능에 대한 공식 지원을 추가하고 계측 파일을 최신 상태로 유지 관리합니다. 그렇지 않으면 Azure 함수 위에 자체 프레임 워크를 작성할 수 있습니다. –