是否可以使用New Relic监视Azure Function应用?

迈克·克里斯滕森

我们有一个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仪表板进行检入。这是我得到的:

  • 我看到我的新应用程序显示在APM仪表板上。
  • 在Insights仪表板上,我可以查询SELECT * FROM DevicesSynced SINCE 30 MINUTES AGO,然后看到一个带有一堆记录的表格,上面写着“成功!”。在“计数”列中使用随机数。
  • 在APM->事件->错误中,我看到“ NewRelic.Api.Agent.NoticeError API调用Submission#0 + SyncException”的“ URL和类型”,并显示消息“这是另一个自定义错误”和一个计数。
  • 在错误分析中,我看到“好极了!您在此时间范围内没有错误!” (过去30分钟)
  • 在“监视”->“事务”中,我仅看到HTTP请求的事务,例如/ Home / Get,/ Admin / GetHostStatus,/ Keys / Get和/ Admin / GetFunctionStatus。我认为这些HTTP请求来自Azure Functions的内部工作,并且当我在Azure控制台中单击时可能会发生。我看不到任何称为GetRoutineData的事务。如果我跑步,SELECT * FROM Transactions我也看不到。

我觉得我实际上不在Azure函数代码中的事务中,因此New Relic不允许我设置名称。我也有一种感觉,即使我使用NoticeError记录错误,它也不会链接到任何事务,因此不会显示在错误分析中。

我的问题:

  • 有没有办法让New Relic将此代码路径识别为事务?
  • 如果不是,是否至少有一种方法可以设置新的Relic Application Monitoring,以在出现某种异常类型(例如,我的SyncException类)或达到某种脱粒保持状态时向我发出警报?

谢谢!

更新:

我尝试按照New Relic指令CustomInstrumentation.xmlExtensions目录中添加一个名为文件,其中包含以下内容:

<?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>

但是,我看不出任何行为上的差异。我尝试了几种不同的方法名称匹配(例如InvokeCoreInvoke),但似乎没有什么不同。

几个问题:

新文物说明:

要查看事务,请执行以下操作:在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方法。

我认为这很清楚,我们目前实际上不在事务中,除非它发生在另一个线程上(如果是这种情况,我不会感到惊讶)。

还有其他想法吗?

马特·梅森(Matt Mason)

您应该尝试一下自定义交易:

https://docs.newrelic.com/docs/agents/net-agent/instrumentation/net-custom-transactions

以下是我认为适用的值:

  1. AssemblyName:Microsoft.Azure.WebJobs.Script
  2. 类别名称:Microsoft.Azure.WebJobs.Script.Description.FunctionInvokerBase
  3. 方法名称:InvokeCore

我相信会在此方法调用上添加一个事务,它是围绕所有用户函数执行的通用包装。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否可以使用 ARM 模板为 Azure Active Directory 应用程序配置 api 权限

来自分类Dev

使用New Relic和Heroku监视服务器资源

来自分类Dev

是否可以使用从美国政府租户在“商业”公共Azure门户中注册的Azure AD应用程序?

来自分类Dev

是否可以使用Azure CLI设置监视URL Ping测试?

来自分类Dev

两个 Azure Web 应用程序是否可以使用相同的令牌进行身份验证?

来自分类Dev

是否可以使用Astersik AMI监视频道

来自分类Dev

是否可以在CosmosDB中的Azure Function中完美监视更改Feed的工作

来自分类Dev

使用Nodejs是否可以使用桌面应用程序?

来自分类Dev

Azure Deployment error involving New Relic Extension?

来自分类Dev

服务主体(Azure应用程序多租户)是否可以使用AZ CLI向管理员授予租户中的应用程序同意?

来自分类Dev

我们可以使用CloudWatch监视AWS外部的应用程序吗?

来自分类Dev

是否可以使用PHP开发Windows应用程序?

来自分类Dev

是否可以使用CDN仅对div应用引导程序?

来自分类Dev

是否可以使用本机反应创建Android Wear应用

来自分类Dev

是否可以使用内置终端调试应用程序

来自分类Dev

是否可以使用Tkinter为Android或iOS创建应用?

来自分类Dev

是否可以使用CDN仅对div应用引导程序?

来自分类Dev

是否可以使用目标C开发Google Glass应用?

来自分类Dev

是否可以使用JavaScript制作GUI应用程序?

来自分类Dev

是否可以使用Xcui测试Web应用程序?

来自分类Dev

是否可以使用Azure文件存储创建Azure CDN?

来自分类Dev

是否可以使用Azure文件存储创建Azure CDN?

来自分类Dev

是否可以使用服务主体通过基于角色的访问控制对未托管在 Azure 中的应用程序进行身份验证?

来自分类Dev

使用New Relic和Heroku进行服务器资源监视

来自分类Dev

使用Azure和New Relic进行部署

来自分类Dev

是否可以使用 Microsoft Azure Queue 来替换 Thread?

来自分类Dev

是否可以将NewRelic用于第三方服务的常规可用性监视,而无需在其上安装New Relic代理?

来自分类Dev

如何在New Relic的外部服务页面中监视外部请求?

来自分类Dev

如何在New Relic中监视内部tcp端口的可用性?

Related 相关文章

  1. 1

    是否可以使用 ARM 模板为 Azure Active Directory 应用程序配置 api 权限

  2. 2

    使用New Relic和Heroku监视服务器资源

  3. 3

    是否可以使用从美国政府租户在“商业”公共Azure门户中注册的Azure AD应用程序?

  4. 4

    是否可以使用Azure CLI设置监视URL Ping测试?

  5. 5

    两个 Azure Web 应用程序是否可以使用相同的令牌进行身份验证?

  6. 6

    是否可以使用Astersik AMI监视频道

  7. 7

    是否可以在CosmosDB中的Azure Function中完美监视更改Feed的工作

  8. 8

    使用Nodejs是否可以使用桌面应用程序?

  9. 9

    Azure Deployment error involving New Relic Extension?

  10. 10

    服务主体(Azure应用程序多租户)是否可以使用AZ CLI向管理员授予租户中的应用程序同意?

  11. 11

    我们可以使用CloudWatch监视AWS外部的应用程序吗?

  12. 12

    是否可以使用PHP开发Windows应用程序?

  13. 13

    是否可以使用CDN仅对div应用引导程序?

  14. 14

    是否可以使用本机反应创建Android Wear应用

  15. 15

    是否可以使用内置终端调试应用程序

  16. 16

    是否可以使用Tkinter为Android或iOS创建应用?

  17. 17

    是否可以使用CDN仅对div应用引导程序?

  18. 18

    是否可以使用目标C开发Google Glass应用?

  19. 19

    是否可以使用JavaScript制作GUI应用程序?

  20. 20

    是否可以使用Xcui测试Web应用程序?

  21. 21

    是否可以使用Azure文件存储创建Azure CDN?

  22. 22

    是否可以使用Azure文件存储创建Azure CDN?

  23. 23

    是否可以使用服务主体通过基于角色的访问控制对未托管在 Azure 中的应用程序进行身份验证?

  24. 24

    使用New Relic和Heroku进行服务器资源监视

  25. 25

    使用Azure和New Relic进行部署

  26. 26

    是否可以使用 Microsoft Azure Queue 来替换 Thread?

  27. 27

    是否可以将NewRelic用于第三方服务的常规可用性监视,而无需在其上安装New Relic代理?

  28. 28

    如何在New Relic的外部服务页面中监视外部请求?

  29. 29

    如何在New Relic中监视内部tcp端口的可用性?

热门标签

归档