Добавление пользовательского инструментария New Relic в фоновый процесс в Windows

Я пытаюсь отслеживать методы внутри приложения .NET, которое является фоновым процессом с использованием New Relic, для которого, как я знаю, мне нужно добавить Custom Instrumentation.

Я переустановил агент .NET, и после настройки «Инструментировать все приложения .NET» и внесения изменений в файлы app.config и newrelic.config я получаю основные данные фонового процесса на панели инструментов новой реликвии.

Теперь, чтобы добавить Custom Instrumentation, я добавил еще один файл конфигурации Instrumentation в каталог extensions. Перезапустил приложение, но по-прежнему не вижу новые/пользовательские методы, которые я пытаюсь отслеживать.

Это мой инструментальный файл MyInstrumentation.xml

<?xml version="1.0" encoding="utf-8"?>

<!-- instrument EngineService.BestAgentSolver.Solve inside EngineService.BestAgentSolver -->
<tracerFactory metricName="Cast-a-Net.EngineService.BestAgentSolver.Solve-Metric">
  <match assemblyName="Cast-a-Net.EngineService" className="Cast-a-Net.EngineService.BestAgentSolver">
    <exactMethodMatcher methodName="Solve" />
  </match>
</tracerFactory>

<!-- instrument EngineService.SessonManager.BroadcastLeadCounts inside EngineService.SessionManager -->
<tracerFactory metricName="Cast-a-Net.EngineService.SessionManager.BroadcastLeadCounts-Metric">
  <match assemblyName="Cast-a-Net.EngineService" className="Cast-a-Net.EngineService.SessionManager">
    <exactMethodMatcher methodName="BroadcastLeadCounts" />
  </match>
</tracerFactory>

<tracerFactory metricName="myapp.Web.Controllers.CallListController.ActionResult-Metric">
  <match assemblyName="myapp.Web" className="myapp.Web.Controllers.CallListController">
    <exactMethodMatcher methodName="ActionResult" />
  </match>
</tracerFactory>

Я пропустил шаг или делаю что-то не так?


person utsavanand    schedule 15.04.2014    source источник


Ответы (1)


Пользовательские инструменты в агенте .NET работают с веб-транзакциями, использующими объект HttpContext. С другой стороны, наш API-интерфейс агента .NET позволяет собирать метрики, которые можно отобразить на пользовательской панели мониторинга. В частности, RecordMetric, RecordResponseTimeMetric и IncrementCounter полезны, поскольку они работают с не-веб-приложениями.

Однако, начиная с версии 2.24.218.0 агента .NET, можно использовать новую функцию для создания транзакций, в которых агент обычно этого не делает. Это ручной процесс через пользовательский инструментальный файл.

Создайте пользовательский файл инструментов с именем, скажем, CustomInstrumentation.xml, в папке C:\ProgramData\New Relic.NET Agent\Extensions рядом с CoreInstrumentation.xml. Добавьте следующее содержимое в ваш пользовательский инструментальный файл:

<?xml version="1.0" encoding="utf-8"?>
<extension xmlns="urn:newrelic-extension">
  <instrumentation>
    <tracerFactory name="NewRelic.Agent.Core.Tracer.Factories.BackgroundThreadTracerFactory" metricName="Category/Name">
      <match assemblyName="AssemblyName" className="NameSpace.ClassName">
        <exactMethodMatcher methodName="MethodName" />
      </match>
    </tracerFactory>
  </instrumentation>
</extension>

Вы должны изменить значения атрибутов Category/Name, AssemblyName, NameSpace.ClassName и MethodName выше:

Транзакция начинается, когда объект типа NameSpace.ClassName из сборки AssemblyName вызывает метод MethodName. Транзакция завершается, когда метод возвращает или выдает исключение. Транзакция будет называться «Имя» и будет сгруппирована по типу транзакции, указанному в «Категории». В пользовательском интерфейсе New Relic вы можете выбрать тип транзакции в раскрывающемся меню «Тип» при просмотре страницы «Мониторинг» > «Транзакции».

Обратите внимание, что и Категория, и Имя должны присутствовать и должны быть разделены косой чертой.

Как и следовало ожидать, инструментальная активность (методы, база данных, внешние компоненты), происходящая во время вызова метода, будет отображаться в таблице разбивки транзакций и в трассировках транзакций.

Вот более конкретный пример. Во-первых, инструментальный файл:

<?xml version="1.0" encoding="utf-8"?>
<extension xmlns="urn:newrelic-extension">
  <instrumentation>
    <tracerFactory name="NewRelic.Agent.Core.Tracer.Factories.BackgroundThreadTracerFactory" metricName="Background/Bars">
      <match assemblyName="Foo" className="Foo.Bar">
        <exactMethodMatcher methodName="Bar1" />
        <exactMethodMatcher methodName="Bar2" />
      </match>
    </tracerFactory>
    <tracerFactory metricName="Custom/some custom metric name">
      <match assemblyName="Foo" className="Foo.Bar">
        <exactMethodMatcher methodName="Bar3" />
      </match>
    </tracerFactory>
  </instrumentation>
</extension>

Теперь немного кода:

var foo = new Foo();
foo.Bar1(); // Creates a transaction named Bars in category Background
foo.Bar2(); // Same here.
foo.Bar3(); // Won't create a new transaction.  See notes below.

public class Foo
{
    // this will result in a transaction with an External Service request segment in the transaction trace
    public void Bar1()
    {
        new WebClient().DownloadString("http://www.google.com/);
    }

    // this will result in a transaction that has one segment with a category of "Custom" and a name of "some custom metric name"
    public void Bar2()
    {
        // the segment for Bar3 will contain your SQL query inside of it and possibly an execution plan
        Bar3();
    }

    // if Bar3 is called directly, it won't get a transaction made for it.
    // However, if it is called inside of Bar1 or Bar2 then it will show up as a segment containing the SQL query
    private void Bar3()
    {
        using (var connection = new SqlConnection(ConnectionStrings["MsSqlConnection"].ConnectionString))
        {
            connection.Open();
            using (var command = new SqlCommand("SELECT * FROM table", connection))
            using (var reader = command.ExecuteReader())
            {
                reader.Read();
            }
        }
    }
}

Вот простое консольное приложение, демонстрирующее пользовательские транзакции:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Custom Transactions");
            var t = new CustomTransaction();
            for (int i = 0; i < 100; ++i )
                t.StartTransaction();
        }
    }
    class CustomTransaction
    {
        public void StartTransaction()
        {
            Console.WriteLine("StartTransaction");     
            Dummy();
        }
        void Dummy()
        {
            System.Threading.Thread.Sleep(5000);
        }
    }

}

Используйте следующий пользовательский инструментальный файл:

<?xml version="1.0" encoding="utf-8"?>
<extension xmlns="urn:newrelic-extension">
    <instrumentation>
        <tracerFactory name="NewRelic.Agent.Core.Tracer.Factories.BackgroundThreadTracerFactory" metricName="Background/CustomTransaction">
          <match assemblyName="ConsoleApplication1" className="ConsoleApplication1.CustomTransaction">
            <exactMethodMatcher methodName="StartTransaction" />
          </match>
        </tracerFactory>
        <tracerFactory metricName="Custom/Dummy">
          <match assemblyName="ConsoleApplication1" className="ConsoleApplication1.CustomTransaction">
            <exactMethodMatcher methodName="Dummy" />
          </match>
        </tracerFactory>
    </instrumentation>
</extension>

После запуска приложения несколько раз вы должны увидеть пользовательскую транзакцию в категории «Другие транзакции, фон». Вы должны увидеть фиктивный сегмент в таблице разбивки транзакций и трассировке транзакций.

person Wyatt Lindsey    schedule 15.04.2014
comment
Есть ли разница между использованием NewRelic.Api и XML? Или он делает то же самое, только с другим синтаксисом? - person Snæbjørn; 15.09.2015
comment
@Snæbjørn настраиваемый инструментарий с файлом XML значительно отличается от функциональности предлагаемые API агента .NET. Используйте XML-файл, чтобы определить инструменты для методов, которые вы хотите отслеживать с помощью профилировщика. Используйте API для конкретных утилит, таких как присвоение имени транзакции или запись ошибки. Запись метрик непосредственно с помощью API приводит к метрикам, которые можно просматривать на настраиваемых информационных панелях. - person Wyatt Lindsey; 17.09.2015
comment
Я думаю, что теперь понимаю, немного поигравшись с этим :) - person Snæbjørn; 18.09.2015