±âŸ(framework)
2019.05.29 / 24:47

4. Scouter Server BuiltInPluginÀ» Á¦ÀÛÇغ¸ÀÚ - (2) Ç÷¯±×ÀÎ Á¦ÀÛ

Źµ¹ÀÌ°³¹ßÀÚ
Ãßõ ¼ö 307

À̹ø Æ÷½ºÆÃÀº (1) ¿ä±¸»çÇ× ºÐ¼® ¿¡ ÀÌ¾î ½ÇÁ¦·Î Ç÷¯±×ÀÎÀ» ¸¸µé¾î º¸´Â ½Ç½ÀÀ» ¼Ò°³ÇÏ°Ú´Ù.
½Ç½ÀÀ¸·Î´Â Á¤ÇØÁø ½Ã°£ °£°Ý¿¡ µû¶ó ·Î±×¸¦ ³²±â´Â ´Ü¼øÇÑ ±â´ÉÀÇ Ç÷¯±×ÀÎÀ» Á¦ÀÛÇØ º¼ °ÍÀÌ´Ù.

¸ñÂ÷´Â ¾Æ·¡¿Í °°´Ù.

1. °³¹ß ¿ä±¸»çÇ×
2. Ç÷¯±×ÀÎ Á¦ÀÛ ½Ç½À
  2-1. ÄÚµå ÀÛ¼º
  2-2. ³»º¸³»±â(export)
3. ±¸µ¿ Å×½ºÆ®
  3-1. Á¤»óÀÛµ¿ È®ÀÎ



1. °³¹ß ¿ä±¸»çÇ×

ÀÌÀü Æ÷½ºÆÿ¡¼­ »ìÆìºÃµíÀÌ À§ÀÇ ¿ä±¸Á¶°ÇÀ» ¹Ýµå½Ã ÃæÁ·ÇØ¾ß ÇÑ´Ù.
Àß ÀÌÇØ°¡ ¾È °£´Ù¸é ÀÌÀü °Ô½Ã±ÛÀ» Âü°íÇÏ¸é µÈ´Ù.
http://blog.naver.com/occidere/221069755554

´Ü, º» ¿¹½Ã¿¡¼­´Â »ó±â ¸í½ÃÇÑ 6°³ÀÇ ±â´ÉÀ» µüÈ÷ È°¿ëÇÒ ÇÊ¿ä°¡ ¾ø´Â ´Ü¼ø Ç÷¯±×ÀÎÀ» Á¦ÀÛÇϱ⠶§¹®¿¡, 6°³ annotation Áß ¾Æ¹«°Å³ª °ñ¶ó »ç¿ëÇϵµ·Ï ÇÏ°Ú´Ù.



2. Ç÷¯±×ÀÎ Á¦ÀÛ ½Ç½À

Á¦ÀÛÇÒ Ç÷¯±×ÀÎÀº ÀÏÁ¤ ½Ã°£¸¶´Ù Äֿܼ¡ ·Î±×¸¦ ³²±â´Â °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸°Ú´Ù.



2-1. ÄÚµå ÀÛ¼º

1. »õ·Î¿î ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇÑ´Ù
À̸§Àº ÀÚÀ¯À̳ª, º» ¿¹½Ã¿¡¼­´Â scouter-plugin-server-log¶ó°í »ý¼ºÇÏ¿´´Ù.

ÇÁ·ÎÁ§Æ® »ý¼º



2. Dependency¸¦ ¼³Á¤ÇÑ´Ù
scouter.server¿Í scouter.commonÀÌ ÇÊ¿äÇÏ´Ù.

Dependency Ãß°¡




3. scouter.plugin.server.log ÆÐÅ°Áö ³»ºÎ¿¡ Log Ŭ·¡½º¸¦ »ý¼ºÇÏ¿© ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù
ÀÌ¹Ì ÀÌÀü¿¡µµ °­Á¶Çß´Ù½ÃÇÇ ÀÛµ¿½Ãų Ç÷¯±×ÀÎÀº ¹Ýµå½Ã scouter.plugin.server ÆÐÅ°Áö ³»ºÎÀÇ public class¿©¾ß ÇÑ´Ù.

Log.java Ŭ·¡½º
package scouter.plugin.server.log; import scouter.lang.pack.*; //¸Þ¼­µåÀÇ ¸Å°³º¯¼ö·Î µé¾î°¥ PackµéÀ» ÀÌ¿ëÇϱâ À§ÇØ ºÒ·¯¿È import scouter.lang.plugin.PluginConstants; //¸Þ¼­µå¿¡ ¾î³ëÅ×ÀÌ¼Ç »ç¿ëÇϱâ À§ÇØ ºÒ·¯¿È import scouter.lang.plugin.annotation.ServerPlugin; //¸Þ¼­µå¿¡ ¾î³ëÅ×ÀÌ¼Ç »ç¿ëÇϱâ À§ÇØ ºÒ·¯¿È import scouter.server.Configure; //¼­¹ö ¼³Á¤ ÆÄÀÏ(scouter.conf)À» ÀÌ¿ëÇϱâ À§ÇØ ºÒ·¯¿È public class Log { private Configure conf = Configure.getInstance(); @ServerPlugin(PluginConstants.PLUGIN_SERVER_COUNTER) public void printLog(Pack pack) { //scouter.conf ÆÄÀÏ¿¡¼­ ext_plugin_log ºÎºÐÀÇ °ª(true ¶Ç´Â false)À» Àоî¿Â´Ù. //ext_plugin_log°¡ ¾øÀ¸¸é false·Î ÃʱâÈ­ boolean extConf = conf.getBoolean("ext_plugin_log", false); if(extConf) { //·Î±× Ãâ·Â ºÎºÐ } } }


³»¿ëÀ» ¼³¸íÇÏÀÚ¸é,

conf ´Â ½ºÄ«¿ìÅÍ ¿ÜºÎ ¼³Á¤ÆÄÀÏÀÎ scouter.conf·Î, ½ºÄ«¿ìÅÍ doc¿¡¼± ¿ÜºÎ Ç÷¯±×ÀÎÀº ext_plugin_À¸·Î ½ÃÀÛÇÏ´Â À̸§ÀÇ ¼³Á¤°ªÀ» »ç¿ëÇÒ °ÍÀ» ¸í½Ã ¹× ±ÇÀåÇÏ°í ÀÖ´Ù.
https://github.com/scouter-project/scouter/blob/master/scouter.document/main/Plugin-Guide_kr.md#2-annotation


±âº»ÀûÀ¸·Î scouter/server/conf/scouter.conf¿¡ Á¸ÀçÇϸç, º» ¿¹½Ã¿¡¼­´Â ext_plugin_log=true °ªÀ» ÀÔ·ÂÇÏ¿© »ç¿ëÇÒ °ÍÀÌ´Ù.
µû¶ó¼­ À§ÀÇ °æ·Î·Î À̵¿ÇÏ¿© ³»ºÎ¿¡ ext_plugin_log=true¸¦ ÀÔ·ÂÇÑ´Ù.

scouter.conf ³»ºÎ¿¡ ext_plugin_log=true ÀÔ·Â
vim scouter.conf

ÀÌ °ªÀ» ÀÌ¿ëÇÏ´Â ÀÌÀ¯·Î´Â º¯°æ»çÇ×À» Àû¿ëÇÏ·Á¸é ¼­¹ö¸¦ Àç½ÃÀÛ ÇؾßÇÏ´Â built-in pluginÀÇ ¾àÁ¡À» º¸¿ÏÇϱâ À§ÇÑ °ÍÀ¸·Î,
ext_plugin_log= °ªÀ» true³ª false·Î º¯°æÇØ ÁÖ´Â °Í ¸¸À¸·Îµµ Àç½ÃÀÛ ¾øÀÌ ¸ðµâ ±â´ÉÀ» ÄÑ°í ²ø ¼ö ÀÖ´Ù´Â ÀåÁ¡À» °®´Â´Ù.



¶ÇÇÑ ¸Þ¼­µåÀÇ ¸Å°³º¯¼ö·Î PackÀ» ±âÀÔÇϱä ÇÏ¿´À¸³ª, ·Î±×¸¦ Âï´Â º» ¿¹½Ã¿¡¼­´Â µüÈ÷ ¾µ ÀÏÀÌ ¾ø´Â Àǹ̾ø´Â ¼±¾ðÀ̱⿡ º°µµ·Î »ç¿ëÇÏÁø ¾Ê¾Ò´Ù.
¿ø·¡ PackÀº scouter¿¡¼­ ¼öÁýÇÑ µ¥ÀÌÅ͵éÀ» ´ã¾Æ³õÀº ´Ù¾çÇÑ Å¬·¡½º(ÀÎÅÍÆäÀ̽º ±¸Çöü)µé ÀÌ´Ù.

¸¶Âù°¡Áö·Î ¾î³ëÅ×À̼ǵµ 6°³ Áß ¾Æ¹«°Å³ª(COUNTER)»ç¿ëÇÏ¿´´Ù.




4. etc ÆÐÅ°Áö¸¦ »ý¼ºÇÏ°í, ³»ºÎ¿¡ ½Ã°£ Áֱ⸦ °ü¸®ÇÒ Time Ŭ·¡½º¸¦ ÀÛ¼ºÇÑ´Ù
¸¶Áö¸· Ãâ·Â ½Ã°£(lastPrinted)À¸·Î ºÎÅÍ ÀÏÁ¤ ½Ã°£(period)¸¸Å­ Áö³µÀ¸¸é Ãâ·ÂÇÏ°í, ¸¶Áö¸· Ãâ·Â ½Ã°£À» °»½ÅÇÏ´Â ÄÚµåÀÌ´Ù.
º» ¿¹½Ã¿¡¼± period = 10ÃÊ °£°ÝÀ¸·Î ·Î±×¸¦ Ãâ·ÂÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.

ÀÌ Å¬·¡½º´Â ½ºÄ«¿ìÅÍ¿¡¼­ Á÷Á¢ ºÒ·¯ »ç¿ëÇÏ´Â °ÍÀÌ ¾Æ´Ñ, ½ºÄ«¿ìÅÍ¿¡¼­ ºÒ·ÁÁö´Â ¸Þ¼­µå ³»ºÎ¿¡¼­ È£ÃâµÇ´Â °ÍÀ̹ǷΠÆÐÅ°Áö À̸§ÀÇ Á¦¾àÀº ¹ÞÁö ¾Ê´Â´Ù´Ü, public class ¹× public method¿©¾ß ÇÑ °ÍÀº ¿©ÀüÈ÷ ÁöÄѾߠÇÑ´Ù.

package etc; public class Time { private static long period = 10000L; //ÁÖ±â 10ÃÊ private static long lastPrinted = -1; //ÃʱⰪ À½¼ö //ÁֱⰡ Áö³µÀ¸¸é true, ¾Æ´Ï¸é false public static boolean canExecute(long curTime) { //ù ½ÇÇàÀ̸é ÇöÀç ½Ã°£À¸·Î ÃʱâÈ­ -> false ¸®ÅÏ(Ãâ·Â ¾ÈµÊ) if(lastPrinted < 0) lastPrinted = curTime; return curTime - lastPrinted > period; } public static void setLastPrinted(long curTime) { lastPrinted = curTime; } }





5. etc ÆÐÅ°Áö ³»ºÎ¿¡ Ãâ·ÂÇÒ ³»¿ëÀ» ´ãÀº TextŬ·¡½º¸¦ »ý¼ºÇÑ´Ù
»ç½Ç ¾Æ¹« ³»¿ëÀ̳ª Ãâ·ÂÇصµ µÇ³ª, Á» ´õ ´Ù¾ç¼ºÀ» Ãß±¸Çϱâ À§ÇØ ·£´ýÀ¸·Î ³ë·¡ °¡»ç¸¦ ¹ÝȯÇÏ´Â ¸Þ¼­µå¸¦ ´ãÀº Ŭ·¡½º¸¦ º°µµ·Î ¸¸µç °ÍÀÌ´Ù(±ÍÂú´Ù¸é ¾È¸¸µé¾îµµ µÊ)

»ç½É°¡µæ
package etc; import java.util.Random; public class Text { private static final String SIGNAL[] = { "Signal º¸³» signal º¸³»", "Â Â Â Â", "³­ ³Ê¸¦ ¿øÇØ ³­ ³Ê¸¦ ¿øÇØ", "¿Ö ¹ÝÀÀÀÌ ¾ø´Ï", "¸¸³¯ ¶§ ¸¶´Ù ¸¶À½À» ´ã¾Æ", "Â Â Â Â", "±â´Ù¸®ÀÝ¾Æ ´Ù º¸ÀÌÀݾÆ", "¿Ö ¾ËÁö ¸øÇÏ´Ï" }; //³ë·¡°¡»ç ·£´ý ¹Ýȯ public static String getText() { int idx = new Random().nextInt(SIGNAL.length); return SIGNAL[idx]; } }






6. Log Ŭ·¡½ºÀÇ printLog() ¸Þ¼­µå¸¦ ¿Ï¼ºÇÑ´Ù

ÀÏÁ¤ ½Ã°£(10ÃÊ)¸¶´Ù ·£´ý °¡»ç¸¦ ÄܼÖâ¿¡ Âï´Â ÄÚµå
package scouter.plugin.server.log; import scouter.lang.pack.*; import scouter.lang.plugin.PluginConstants; import scouter.lang.plugin.annotation.ServerPlugin; import scouter.server.Configure; import scouter.server.Logger; //¼­¹ö Äֿܼ¡ ·Î±× Âï´Â Ŭ·¡½º import etc.Time; //Áֱ⺰·Î Ãâ·ÂÇÏ°Ô Çϴ Ŭ·¡½º import etc.Text; //Ãâ·ÂÇÒ ÅؽºÆ®¸¦ ´ãÀº Ŭ·¡½º public class Log { private Configure conf = Configure.getInstance(); @ServerPlugin(PluginConstants.PLUGIN_SERVER_COUNTER) public void printLog(Pack pack) { boolean extConf = conf.getBoolean("ext_plugin_log", false); if(extConf) { long curTime = System.currentTimeMillis(); //ÇöÀç ½Ã°£ /* ½ÇÇà °¡´ÉÇÏ´Ù = ¸¶Áö¸· Ãâ·ÂÀ¸·Î ºÎÅÍ Áֱ⠸¸Å­ Áö³µ´Ù */ if(Time.canExecute(curTime)) { Logger.println(Text.getText()); //·£´ý ÅؽºÆ® Ãâ·Â Time.setLastPrinted(curTime); //¸¶Áö¸· Ãâ·Â ½Ã°£À» ÇöÀç ½Ã°£À¸·Î °»½Å } } } }



2-2. ³»º¸³»±â(export)

½ºÄ«¿ìÅÍÀÇ built-in pluginÀº jarÆÄÀÏÀÌ´Ù. µû¶ó¼­ ÀÛ¼ºÇÑ Äڵ带 jarÆÄÀÏ·Î export ½ÃÄÑ¾ß ÇÑ´Ù.
jarÆÄÀÏ »ý¼ºÀ» À§ÇÑ °£´ÜÇÑ ANT ÆÄÀÏÀ» »ý¼º(build.xml) ¹× ÀÛ¼ºÇÏ¸é ¾Æ·¡¿Í °°´Ù.
º¹ºÙÇÏ´Â °ÍÀ» ±ÇÀåÇÑ´Ù.

build.xml »ý¼º
º» ¿¹½Ã¿¡¼­ ¿ÜºÎ ¶óÀ̺귯¸®´Â ¾øÀ¸¹Ç·Î ÁÖ¼® ºÎºÐÀº ¾È ½áµµ µÊ
<?xml version="1.0" encoding="UTF-8"?> <project name="Build log plugin" default="packaging"> <property name="dir.target.jar" value="./out" /> <property name="dir.classes" value="./bin" /> <target name="packaging"> <mkdir dir="${dir.target.jar}" /> <jar destfile="${dir.target.jar}/scouter-plugin-server-log.jar"> <fileset dir="${dir.classes}"/> </jar> </target> </project>



ÀÌÈÄ »ý¼ºµÈ build.xmlÀ» ¿ì Ŭ¸¯ - Run As - 1. Ant Build ¸¦ Ŭ¸¯ÇÑ´Ù.

ANT ·Î jarÆÄÀÏ ºôµå



Á¤»óÀûÀ¸·Î ÀÛ¼ºÇß´Ù¸é, ÇÁ·ÎÁ§Æ® Æú´õ¿¡ outÀ̶õ Æú´õ°¡ »ý¼ºµÇ°í, out Æú´õ ³»ºÎ¿¡ jarÆÄÀÏÀÌ »ý¼ºµÈ´Ù.

jar ÆÄÀÏ »ý¼º ¿Ï·á

¿©±â±îÁö µÇ¾úÀ¸¸é ¸ðµç Áغñ°¡ ³¡³­ °ÍÀÌ´Ù. ÀÌÁ¦ ¼­¹ö¿¡ ¿Ã·Á¼­ Å×½ºÆ®¸¸ ÇÏ¸é µÈ´Ù.




3. ±¸µ¿ Å×½ºÆ®

3-1. Á¤»óÀÛµ¿ È®ÀÎ

»ý¼ºµÈ jarÆÄÀÏÀ» scouter/server/lib/ ³»ºÎ·Î ¿Å°ÜÁØ´Ù.

rz -E¸¦ ÀÌ¿ëÇØ ¿Å±è



ÀÌÈÄ agent.host¿Í server¸¦ ½ÇÇà½ÃŲ´Ù. ¹Ýµå½Ã 2°³ ¸ðµÎ ½ÇÇà½ÃÄÑ¾ß ÇÑ´Ù.

agent.host ½ÇÇà
server ½ÇÇà




µÎ°³ ´Ù ½ÇÇàÀ» ¸¶ÃÆÀ¸¸é ¼­¹ö ·Î±×¸¦ È®ÀÎÇØ º»´Ù.
¼­¹ö ·Î±×´Â server/logs/ ³»ºÎ¿¡ ÀÖ´Ù.

10ÃÊ °£°ÝÀ¸·Î Á¤»ó Ãâ·ÂµÇ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù!


·Î±× È®ÀÎ °á°ú 10ÃÊ °£°ÝÀ¸·Î ·Î±×°¡ ¼º°øÀûÀ¸·Î Á¤»ó Ãâ·ÂµÊÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.



4. ¸¶Ä¡¸ç...

¿©±â±îÁö ÇÏ¿© °£´ÜÇÑ Built-in Plugin Á¦ÀÛÀ» ½Ç½ÀÇØ º¸¾Ò´Ù.

»ç½Ç ½ºÄ«¿ìÅÍ¿¡¼­ Á¦°øÇÏ´Â 6°¡Áö ±â´É(counter, alert, object, xlog, profile, summary)¸¦ È°¿ëÇÏÁö ¾ÊÀº ¿¹½Ã¿´À¸³ª, ±â´É È°¿ë ¹æ¹ý±îÁö Æ÷ÇÔÇÏ·Á¸é ³Ê¹« ±æ¾îÁú °Í °°¾Æ¼­ Ç÷¯±×ÀÎ Á¦ÀÛ ºÎºÐ¿¡¸¸ ÁýÁßÇÏ¿´´Ù.

Ãß°¡ÀûÀÎ Ç÷¯±×ÀÎ °³¹ßÀº ½ºÄ«¿ìÅÍÀÇ Ç÷¯±×ÀÎ °¡À̵带 Âü°íÇϸé ÁÁÀ» °ÍÀÌ´Ù.
https://github.com/scouter-project/scouter/blob/master/scouter.document/main/Plugin-Guide_kr.md


p.s. °¡²û ½ºÄ«¿ìÅÍ ³»ºÎ ½ºÄÉÁì·¯·Î ÀÎÇÏ¿© Çѹø¿¡ ¿©·¯¹ø Ãâ·ÂµÇ´Â °æ¿ì°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.
ÀÌ °æ¿ì AtomicInteger µîÀ» È°¿ëÇÏ¿© ¶ôÀ» ÇØÁÖ¸é µÈ´Ù.