2017-01-31 11 views
1

У нас есть функция Azure, которая работает каждые несколько секунд. Мы хотим использовать New Relic, чтобы сообщить нам, генерирует ли этот код исключения или начинает плохо себя вести. Я получил агент новой реликвии, установленный на виртуальной машине, и внедрил DLL NewRelic.Agent.Api через NuGet. Я установил 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.
  • На панели инструментов Insights, я могу запросить SELECT * FROM DevicesSynced SINCE 30 MINUTES AGO, и я вижу таблицу с кучей записей, которые говорят «Успех!». со случайным числом в столбце count.
  • В APM-> События-> Ошибки, я вижу «URL-адрес и тип» «NewRelic.Api.Agent.NoticeError API Call Представление # 0 + SyncException» с сообщением «Это еще одна пользовательская ошибка» и сосчитать.
  • В аналитике ошибок я вижу «Отлично! У вас нет ошибок за это окно!» (Последние 30 минут)
  • В Monitoring-> Transactions я просматриваю транзакции для HTTP-запросов, таких как/Home/Get,/Admin/GetHostStatus,/Keys/Get и/Admin/GetFunctionStatus. Я думаю, что эти HTTP-запросы связаны с внутренними работами Azure Functions и могут произойти, когда я нажимаю на консоли Azure. Я не вижу никакой транзакции под названием GetRoutineData. Если я запустил SELECT * FROM Transactions, я тоже этого не вижу.

У меня есть ощущение, что я не фактически в транзакции в моем Azure кода функции, так что новый Relic не позволил мне установить имя. У меня также есть ощущение, что, хотя я регистрирую ошибку с помощью функции «Уведомление об ошибке», она не привязана к какой-либо транзакции, поэтому она не отображается в аналитике ошибок.

Мои вопросы:

  • Есть ли способ, чтобы получить новые Relic признать этот код путь как сделки?
  • Если нет, существует ли хотя бы один способ настроить новый мониторинг реляционных приложений, чтобы предупредить меня, возникает ли какой-либо тип исключения (например, мой класс SyncException) или достигает определенного ограничения на сброс?

Спасибо!

UPDATE:

Я попытался добавить файл с именем CustomInstrumentation.xml в каталоге Extensions, согласно New Relic instructions со следующим содержимым:

<?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), однако, похоже, это не имеет значения.

Несколько вопросов:

Нового Relic Docs говорит:

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

Однако, мой Новой Интерфейс Relic не имеет ни одного вида «Тип»:

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"); 

В моей функции приложения, я буду видеть следующее предупреждение в журнале New Relic:

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 Вы можете получить доступ к файловой системе для вашего функция на .scm.azurewebsites.net/DebugConsole –

+0

@ MattMason-MSFT - Сейчас это похоже на инструментарий, который я добавил в файл XML, и метрики отправляются в New Relic. Однако он не отображается как транзакция в панели инструментов New Relic. Я не уверен, что это так. Мне кажется, мне нужен инженер Новой Реликвии, чтобы помочь мне, так как я думаю, что все правильно настроено на моем конце. –

+0

@ MattMason-MSFT - Сработало! Ну, 90% в любом случае. Мне бы очень хотелось, чтобы отслеживание исключений работало, но я могу это сделать вручную с помощью функции «Уведомление об ошибках». Я добавил то, что я узнал ниже. В очередной раз благодарим за помощь! –

ответ

2

Вы должны дать Пользовательским Операции со выстрел:

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

Ниже приведены значения, которые я думаю, было бы применимо:

  1. AssemblyName: Microsoft.Azure.WebJobs.Script
  2. ClassName: Microsoft.Azure.WebJobs.Script.Description.FunctionInvokerBase
  3. Имя метода: InvokeCore

Я считаю, что добавит транзакцию на this method call, которая является общей оболочкой вокруг всех исполнений пользовательских функций.

+0

Я дам вам выстрел и сообщит вам! Благодаря! –

+0

Не повезло с пользовательской транзакцией. Я обновил свой вопрос выше с дополнительной информацией. Очень ценю помощь! –

2

Наконец-то это работало! Ну, по крайней мере, я думаю, что это сработает. Вот мой файл .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="Limeade/AzureDeviceSync"> 
      <match assemblyName="Microsoft.Azure.WebJobs.Script" className="Microsoft.Azure.WebJobs.Script.Description.DotNetFunctionInvoker"> 
       <exactMethodMatcher methodName="InvokeCore" /> 
      </match> 
     </tracerFactory> 
    </instrumentation> 
</extension> 

Это не имеет значения, что вы называете этот файл, так как New Relic будет загружать каждый XML-файл в каталоге расширений.

Вот несколько вещей, которые я узнал:

  1. При внесении изменений в любой конфигурации New Relic, включая расширения файлов XML, вы должны сбросить IIS. Однако кнопка «Перезапустить сайт» на SCM фактически не убивает процесс IIS. Вам нужно перейти в Process Explorer в Kudu и закрыть процесс w3wp.exe. Если вы не можете понять, какой процесс убить, вы можете добавить log.Info($"Currently running in PID: {System.Diagnostics.Process.GetCurrentProcess().Id}"); в свое приложение-приложение, чтобы узнать.

  2. New Relic будет генерировать запутанные имена транзакций, таких как Microsoft.Azure.WebJobs.Script.Description.DotNetFunctionInvoker/InvokeCore по умолчанию. Я не мог найти способ установить имя транзакции в файле XML. Тем не менее, вы можете установить новое имя транзакции в вашем Azure кода функции следующим образом:

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

  3. Было бы супер хорошо, если бросать исключение из метода Run будет регистрировать исключение как ошибка в Новая реликвия, но после довольно много попыток я не смог заставить ее работать. Я думаю, что эти исключения съедают где-то, и я не могу понять правильную комбинацию конфигурации трассировщика, чтобы перехватить их, прежде чем они потеряются. Тем не менее, вы можете использовать NoticeError() вызов: NewRelic.Api.Agent.NewRelic.NoticeError(new SyncException("This is a custom error")); Это, кажется, работает так же, и эти ошибки будут отображаться в Ошибки и аналитики ошибок в Нью-Relic. Недостатком является то, что вам, вероятно, придется реорганизовать кучу вашего кода функции Azure, чтобы поймать все ошибки, заметить их, а затем перестроить их, если это необходимо.

Я потратил два дня на то, чтобы это работало, поэтому я надеюсь, что это поможет кому-то!

+0

Я просто хочу упомянуть, что нет никакой гарантии, что эти имена классов сборки и методов остаются согласованными между выпусками, поэтому это определенно неподдерживаемый сценарий. Рад слышать, что ты все работает! –

+0

Да, надеюсь, что эти функции не меняются. Возможно, New Relic добавит официальную поддержку Azure Functions и позаботится о том, чтобы обновлять свои файлы инструментов. В противном случае, возможно, я мог бы написать свою собственную фреймворк поверх функций Azure. –