New Relicμμ λͺ¨λν°λ§νλ Java μ ν리μΌμ΄μ μ κ²½μ° ν κ°μ§ μ¬μ©μ μ μ κ³μΈ‘ λ°©λ²μ κ³μΈ‘νλ €λ λ©μλμ ν΄λμ€λ₯Ό λμ΄νλ XML νμΌμ μ¬μ©νλ κ²μ λλ€. μ΄ λ¬Έμλ μμ XML κ³μΈ‘ νμΌμ 보μ¬μ€λλ€. μμΈν λ΄μ© μ XMLμ ν΅ν Java κ³μΈ‘μ μ°Έμ‘°νμΈμ.
UIμμ XML νμΌ νΈμ§
λ΄λ λ¦ UI μμ μ§μ XML νμΌμ νΈμ§νλ €λ©΄: one.newrelic.com > All capabilities > APM & services > (select an app) > Settings > Instrumentationλ‘ μ΄λνμΈμ. μ¬κΈ°μμ λ€μμ μνν μ μμ΅λλ€.
- μν XML νμΌμ λ€μ΄λ‘λν©λλ€.
- κΈ°μ‘΄ XML νμΌ νΈμ§μ μ νν©λλ€.
- κ³μΈ‘ κΈ°λ‘μ κ²μν©λλ€.
XML νμΌ νμ
XML νμΌ νμμλ λ£¨νΈ λ° μμ λ Έλκ° ν¬ν¨λ©λλ€.
μ£Όμ
μΈ‘μ νλͺ© κ·Έλ£Ήν λ¬Έμ κ° λ°μν μ μμΌλ―λ‘ λͺ¨λ λ°©λ²μ κ³μΈ‘νμ§ λ§μμμ€.
XML νμΌμ λ£¨νΈ λ
Έλλ extension μ
λλ€. μΈ κ°μ§ λ€λ₯Έ μμ±μ κ°μ§ μ μμ΅λλ€.
κ° | μ μ |
|---|---|
| XML νμ₯μ μλ³νλ κ³ μ νμ§λ§ μ€λͺ μ μΈ μ΄λ¦μ λλ€. |
| Java μμ΄μ νΈμμ νμ₯μ μ½μμ§ μ¬λΆλ₯Ό μλ³ν©λλ€. κΈ°λ³Έκ°μ |
| νμ₯μ λ²μ μ λλ€. λ νμ₯μ μ΄λ¦μ΄ κ°μ κ²½μ° κ°μ₯ λμ λ²μ μ νμ₯λ§ μ¬μ©λ©λλ€. |
instrumentation λ
Έλλ extension μ νμ λ
Έλμ
λλ€. νλμ μμ±μ κ°μ§ μ μμ΅λλ€: metricPrefix . μ΄κ²μ nameTransaction λ
Έλκ° μ§μ λμ§ μμ κ²½μ° λ©νΈλ¦ μ΄λ¦μ μ¬μ©λλ μ λμ¬μ
λλ€. κΈ°λ³Έκ°μ CUSTOM μ
λλ€.
pointcut μ instrumentation μ νμ λ
Έλμ΄λ©° μ¬λ¬ μμ±μ κ°μ§ μ μμ΅λλ€. λν pointcut μλ μ¬λ¬ λ€λ₯Έ νμ λ
Έλ κ° μμ μ μμ΅λλ€.
κ° | μ μ |
|---|---|
| μ΄ ν¬μΈνΈμ»·μ λλ¬νμ λ νΈλμμ μ΄ μμ§ μ§ν μ€μ΄ μλλ©΄ νΈλμμ μ΄ μμλ©λλ€. νΈλμμ μ΄ μ΄λ―Έ μ§ν μ€μ΄λ©΄ ν΄λΉ νΈλμμ μ΄ κ³μλ©λλ€. μ νΈλμμ μ΄ μμ±λμ§ μμ΅λλ€. |
| λ©νΈλ¦μ μ¬μ©ν μ΄λ¦ νμμ
λλ€. μ‘΄μ¬νμ§ μμΌλ©΄ κΈ°λ³Έμ μΌλ‘ ν΄λμ€ μ΄λ¦ λ€μ λ©μλ μ΄λ¦μ΄ μ΅λλ€. |
| μ΄ pointcutμ΄ νΈλμμ
μ μμνλ κ²½μ° |
|
|
| νΈλμμ
μ μ νμ μ€μ ν©λλ€. κ°λ₯ν κ°μ |
pointcut μλ μ¬λ¬ νμ λ
Έλκ° μμ μ μμ΅λλ€.
κ° | μ μ |
|---|---|
| μ΄ μμκ° μμΌλ©΄ μμ΄μ νΈλ μ΄ ν¬μΈνΈμ»·μ μν΄ κ³μΈ‘λ ν΄λμ€ μ΄λ¦κ³Ό λ©μλλ₯Ό μ¬μ©νμ¬ νΈλμμ μ μ΄λ¦μ μ§μ ν©λλ€. |
| ν¨ν€μ§ μ΄λ¦μ ν¬ν¨νλ μ£Όμ ν΄λμ€μ λμλ¬Έμλ₯Ό ꡬλΆνλ μ 체 μ΄λ¦μ λλ€. μ΄ μ£ΌμμΌλ‘ νμλ λͺ¨λ λ©μλκ° μΌμΉν©λλ€. |
| ν¨ν€μ§ μ΄λ¦μ ν¬ν¨νμ¬ μΌμΉμν¬ ν΄λμ€μ λμλ¬Έμλ₯Ό ꡬλΆνλ μ΄λ¦μ
λλ€. μ΄ λ
Έλλ₯Ό λ©μλ λ
Έλμ νμ΄λ§ν©λλ€. μ΄ λ
Έλκ° pointcutμ μλ κ²½μ°
|
| ꡬν ν΄λμ€κ° μΌμΉν ν¨ν€μ§ μ΄λ¦μ ν¬ν¨νμ¬ μΈν°νμ΄μ€μ λμλ¬Έμ κ΅¬λΆ μ΄λ¦μ
λλ€. μ΄ λ
Έλλ₯Ό λ©μλ λ
Έλμ νμ΄λ§ν©λλ€. μ΄ λ
Έλκ° pointcutμ μλ κ²½μ°
|
| κ³μΈ‘ν ν΄λμ€μ λ©μλμ
λλ€. μ΄ λ
Έλλ₯Ό |
| ν¨ν€μ§λ₯Ό ν¬ν¨ν ν΄λμ€ μ΄λ¦μ λ°μ΄νΈμ½λμ μ¬μ©λλ νμ(μ: ν΄λΉ ν΄λμ€μ κ°μ²΄λ₯Ό λ°ννλ λͺ¨λ λ©μλκ° μΌμΉν©λλ€. |
| λλ€μ μΌμΉν μ§ μ¬λΆλ₯Ό λνλ΄λ λΆμΈμ λλ€.
|
method λ
Έλμλ μ¬λ¬ νμ νλͺ©μ΄ μμ μ μμ΅λλ€. μμΈν μ 보 λ° μμ λ Java μ¬μ©μ μ μ κ³μΈ‘ λ¬Έμ ν΄κ²° μ μ°Έμ‘°νμμμ€.
κ° | μ μ |
|---|---|
| μΌμΉμν¬ λ©μλμ μ νν λμλ¬Έμλ₯Ό ꡬλΆνλ μ΄λ¦μ λλ€. λ©μλ
|
| μμλλ‘ μ§μ λ λ©μλμ λ§€κ°λ³μ μ νμ
λλ€. λ©μλ
|
| μΌμΉμν¬ λ°ν μ νμ λνλ΄λ ν΄λμ€μ λμλ¬Έμλ₯Ό ꡬλΆνλ μ΄λ¦μ λλ€. μ΄ ν΄λμ€ μ νμ λ°ννλ λͺ¨λ λ©μλκ° μΌμΉν©λλ€. |
μμ
λ€μμ μν ν΄λμ€μ ν΄λΉ ν΄λμ€λ₯Ό κ³μΈ‘νλ λ° μ¬μ©ν μ μλ XML νμΌμ λλ€.
package test;
import java.util.HashMap;import java.util.Map;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;
public class SampleTester {
private String configName; private Map<String, Long> maxSampleTimes;
public SampleTester(String pConfigName) { configName = pConfigName; maxSampleTimes = new HashMap<>(); }
public void checkSample(String name, long[] times) { if (times != null) { maxSampleTimes.put(name, getFirst(times)); } else { maxSampleTimes.put(name, (long) getFirst()); } }
private Long getFirst(long[] times) { return times[0]; }
private int getFirst() { return 0; }
public void printMaxRepeat(final long max) throws Exception { Runnable myRunnable = new Runnable() { public void run() { try { printMax(max); } catch (Exception e) { e.printStackTrace(); } } };
ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1); scheduledExecutor.scheduleWithFixedDelay(myRunnable, 0, 10000, TimeUnit.MILLISECONDS); }
private void printMax(long max) { System.out.println("max is " + max); }}<?xml version="1.0" encoding="UTF-8"?><extension xmlns="https://newrelic.com/docs/java/xsd/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="newrelic-extension extension.xsd" name="customExtension" version="1.0">
<instrumentation metricPrefix="EXAMPLE"> <pointcut transactionStartPoint="true">
<!--class name is preceded by package name--> <className>test.SampleTester</className> <method> <name>checkSample</name> <parameters> <type attributeName="sampleName">java.lang.String</type> <type>long[]</type> </parameters> </method> <!--two methods with the same name but different signatures can share one node--> <method> <name>getFirst</name> </method> <method> <name>run</name> </method> </pointcut>
<pointcut transactionStartPoint="false" ignoreTransaction="false" excludeFromTransactionTrace="false" metricNameFormat="SampleTester/methods">
<className>test.SampleTester</className> <method> <name>printMaxRepeat</name> </method> <method> <name>printMax</name> </method> </pointcut>
</instrumentation></extension>XML νμΌμ 첫 λ²μ§Έ λΈλ‘μ νμ₯μ μ΄λ¦κ³Ό λ²μ μ μ§μ ν©λλ€. XML νμ₯μλ κΈ°λ³Έ enabled μ΄λ―λ‘ ν΄λΉ μμ±μ μ§μ λμ§ μμ΅λλ€.
λ λ²μ§Έ λΈλ‘μ κ³μΈ‘ν΄μΌ νλ SampleClass μ λ©μλλ₯Ό μ§μ ν©λλ€. λΈλ‘μ μμ λΆλΆμμ νΈλμμ
μ΄ μμλ©λλ€. μμ ν΄λμ€μλ μ΄λ¦( getFirst )μ 곡μ νμ§λ§ μλͺ
μ΄ λ€λ₯Έ λ κ°μ§ λ©μλκ° μλ€λ μ μ μ£Όλͺ©ν κ°μΉκ° μμ΅λλ€. μ΄λ€μ λ¨μΌ λ©μλ λ
Έλλ‘ κ³μΈ‘λ©λλ€. parameters λ
Έλλ₯Ό μ κ±°νλ©΄ λμΌν μ΄λ¦μ κ°μ§ λͺ¨λ λ©μλκ° νλμ λ©μλ λ
Έλμμ μΌμΉλ μ μμ΅λλ€.
μΈ λ²μ§Έ λΈλ‘μμ μ§μ λ λ©μλμλ νΈλμμ
μ΄ μμλμ§ μμμ΅λλ€. νΈλμμ
μ΄ μ΄λ―Έ run μμ μμλμκΈ° λλ¬Έμ
λλ€. νΈλμμ
μ 무μλμ§ μμΌλ©° νΈλμμ
μΆμ μ ν¬ν¨λ©λλ€.