我们有一个Azure功能,每隔几秒钟运行一次。我们想使用New Relic来告诉我们该代码是否引发异常或行为异常。我已经在VM上安装了New Relic代理,并通过NuGet引入了NewRelic.Agent.Api DLL。我已经将NewRelic.AppName设置为AzureFunctionAppTest并设置了NEWRELIC_LICENSEKEY环境变量。日志文件指示我正在连接到NewRelic。现在,我正在运行以下代码:
#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仪表板进行检入。这是我得到的:
SELECT * FROM Transactions
我也看不到。我觉得我实际上不在Azure函数代码中的事务中,因此New Relic不允许我设置名称。我也有一种感觉,即使我使用NoticeError记录错误,它也不会链接到任何事务,因此不会显示在错误分析中。
我的问题:
谢谢!
更新:
我尝试按照New Relic指令CustomInstrumentation.xml
在Extensions
目录中添加一个名为的文件,其中包含以下内容:
<?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>
但是,我看不出任何行为上的差异。我尝试了几种不同的方法名称匹配(例如InvokeCore
和Invoke
),但似乎没有什么不同。
几个问题:
新文物说明:
要查看事务,请执行以下操作:在New Relic菜单栏中,选择APM>应用程序>(选定的应用程序)>监控>事务处理>类型>(选定的类型)。(类型由“类别/名称”定义。)然后,您可以查看所选类型的所有自定义事务。
它显示了带有“自定义”选项的下拉菜单的图片:
但是,我的New Relic界面没有任何类型的“类型”下拉列表:
另外,如果我检测我的代码以显示来自Function应用程序中的堆栈跟踪,这就是我得到的。也许会有所帮助:
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");
在我的Function应用程序中,我将在New Relic日志中看到以下警告:
2017-02-01 21:45:25,005 NewRelic警告:代理API错误:调用API方法“ SetTransactionName”-“ System.InvalidOperationException时发生错误:调用的API方法仅在事务内有效。如果您从事务开始所在的线程之外的线程调用API方法。
我认为这很清楚,我们目前实际上不在事务中,除非它发生在另一个线程上(如果是这种情况,我不会感到惊讶)。
还有其他想法吗?
您应该尝试一下自定义交易:
https://docs.newrelic.com/docs/agents/net-agent/instrumentation/net-custom-transactions
以下是我认为适用的值:
我相信会在此方法调用上添加一个事务,它是围绕所有用户函数执行的通用包装。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句