c# - Adding New Relic's Custom Instrumentation to background process in Windows -


i trying monitor methods inside .net app background process using new relic know need add custom instrumentation.

i have re-installed .net agent, , after configuring "instrument .net applications", , making changes within app.config , newrelic.config files, getting basic data of background process in new relic dashboard.

now, add custom instrumentation, have added instrumentation config file inside extensions directory. restarted app, still can't see new/custom methods trying monitor.

this instrumentation file 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> 

am missing step or doing wrong?

custom instrumentation in .net agent works web transactions use httpcontext object. our .net agent api, on other hand, allows collect metrics can displayed in custom dashboard. in particular, recordmetric, recordresponsetimemetric, , incrementcounter useful because work non-web applications.

starting version 2.24.218.0 of .net agent however, new feature can used create transactions agent not so. manual process via custom instrumentation file.

create custom instrumentation file named, custominstrumentation.xml, in c:\programdata\new relic.net agent\extensions along side coreinstrumentation.xml. add following content custom instrumentation file:

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

you must change attribute values category/name, assemblyname, namespace.classname, , methodname above:

the transaction starts when object of type namespace.classname assembly assemblyname invokes method methodname. transaction ends when method returns or throws exception. transaction named name , grouped transaction type specified category. in new relic ui can select transaction type type drop down menu when viewing monitoring > transactions page.

note both category , name must present , must separated slash.

as expect, instrumented activity (methods, database, externals) occurring during method's invocation shown in transaction's breakdown table , in transaction traces.

here more concrete example. first, instrumentation file:

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

now code:

var foo = new foo(); foo.bar1(); // creates transaction named bars in category background foo.bar2(); // same here. foo.bar3(); // won't create new transaction.  see notes below.  public class foo {     // result in transaction external service request segment in transaction trace     public void bar1()     {         new webclient().downloadstring("http://www.google.com/);     }      // result in transaction has 1 segment category of "custom" , name of "some custom metric name"     public void bar2()     {         // segment bar3 contain sql query inside of , possibly execution plan         bar3();     }      // if bar3 called directly, won't transaction made it.     // however, if called inside of bar1 or bar2 show segment containing sql query     private void bar3()     {         using (var connection = new sqlconnection(connectionstrings["mssqlconnection"].connectionstring))         {             connection.open();             using (var command = new sqlcommand("select * table", connection))             using (var reader = command.executereader())             {                 reader.read();             }         }     } } 

here simple console app demonstrates custom transactions:

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();             (int = 0; < 100; ++i )                 t.starttransaction();         }     }     class customtransaction     {         public void starttransaction()         {             console.writeline("starttransaction");                  dummy();         }         void dummy()         {             system.threading.thread.sleep(5000);         }     }  } 

use following custom instrumentation file:

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

after running application few times should see custom transaction in other transactions, background category. should see dummy segment in transactions breakdown table , transaction trace.


Comments

Popular posts from this blog

javascript - jquery or ashx not working -

opencv - DataType<cv::detail::deriv_type>::depth what is it used for -

python 3.x - Mapping specific letters onto a list of words -