У нас есть функция 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.
Это показывает картину выпадающего меню с опцией заказа:
Однако, мой Новой Интерфейс Relic не имеет ни одного вида «Тип»:
Кроме того, если я использую свой код для отображения трассировки стека из приложения-функции, вот что я получаю. Может быть, это поможет:
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.
Я думаю, что становится ясно, что мы на самом деле не в транзакция на данный момент, если только это не происходит в другом потоке (что я не удивлюсь, если это так).
Другие идеи?
Это, кажется, лесозаготовительной вы ищете: https://discuss.newrelic.com/t/custom-instrumentation-not-showing-in-transactions/16532 Вы можете получить доступ к файловой системе для вашего функция на .scm.azurewebsites.net/DebugConsole –
@ MattMason-MSFT - Сейчас это похоже на инструментарий, который я добавил в файл XML, и метрики отправляются в New Relic. Однако он не отображается как транзакция в панели инструментов New Relic. Я не уверен, что это так. Мне кажется, мне нужен инженер Новой Реликвии, чтобы помочь мне, так как я думаю, что все правильно настроено на моем конце. –
@ MattMason-MSFT - Сработало! Ну, 90% в любом случае. Мне бы очень хотелось, чтобы отслеживание исключений работало, но я могу это сделать вручную с помощью функции «Уведомление об ошибках». Я добавил то, что я узнал ниже. В очередной раз благодарим за помощь! –