우리는 몇 초마다 실행되는 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
을라는 파일을 추가하는 시도
행동. 몇 가지 메서드 이름 일치 (예 : InvokeCore
및 Invoke
)를 시도했지만 차이가 나타나지 않습니다.
몇 가지 질문 :
새로운 유물 문서는 말한다 : 그러나 내 새로운
:
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.
그것은 사용자 정의 옵션이있는 드롭 다운 메뉴의 그림을 보여줍니다 유적 인터페이스에는 '유형'드롭 다운 메뉴가 없습니다.
또한 기능 코드 내에서 스택 추적을 표시하도록 코드를 구성하면 다음과 같이 표시됩니다. 아마 도움이됩니다 : 사용자 정의 트랜잭션 설정이 참으로로드 된 경우 새로운 트랜잭션이 생성 될 때 표시 로그 파일의 어떤 종류가 있는지 궁금 해요
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.
을 내가 그 분명히 우리가 실제로에서 아니에요하게 생각 다른 스레드에서 발생하지 않는 한이 시점에서의 트랜잭션 (이 경우에는 놀랄 일이 아닙니다).
다른 아이디어?
당신은 사용자 정의 트랜잭션에게 탄 주어야한다
이것은 당신이 찾고있는 로깅 것 같습니다 : https://discuss.newrelic.com/t/custom-instrumentation-not-showing-in-transactions/16532 당신을 위해 파일 시스템에 액세스 할 수 있습니다 function @ .scm.azurewebsites.net/DebugConsole –
@ MattMason-MSFT - 지금 XML 파일에 추가 한 도구가 작동하고 Metric이 New Relic으로 전송되는 것처럼 보입니다. 그러나 New Relic 대시 보드에서는 트랜잭션으로 표시되지 않습니다. 나는 그것이 확실한 지 모르겠다. 나는 모든 것이 제 마지막에 올바르게 설정되어 있다고 생각하기 때문에 새로운 유물 기술자가 필요하다고 생각합니다. –
@ MattMason-MSFT - 잘 했어! 어쨌든, 90 %. 예외 추적을 사용하는 것이 좋겠지 만 NoticeError를 사용하여 직접 손쉽게 수행 할 수 있습니다. 내가 찾은 것을 아래에 추가했습니다. 도와 주셔서 다시 한 번 감사드립니다! –