ãã®ãããææ°ã®CI / CDã¢ãããŒãã䜿çšããŠãã®ãœãããŠã§ã¢ãéçºããŠããŸããããã«ãããæ©èœãä¿®æ£ããã°ã©ã ããªãªãŒã¹ãæ¬çªç°å¢ã«é«éã§é ä¿¡ã§ããŸãã 幎ã®åãã«ããã¹ããœãªã¥ãŒã·ã§ã³ã«è² è·ãã¹ããæäŸãããµãã¿ã¹ã¯ãšã¹ããããCI / CDã«çµ±åããæ©èœãã客æ§ã«ç€ºãã¿ã¹ã¯ãæäŸãããŸããã
äžè¬çãªèšèã«å ããŠããŠã£ãã·ã¥ãªã¹ãã¯æ¬¡ã®ããã«èŠçŽãããŠããŸãïŒããŒãã¹ã¿ã³ãã§ã®èªåãœãããŠã§ã¢å±éã®æäŸãããŒã¿ãçæããç°¡åãªæ¹æ³ã®èæ¡ããã¹ããå®è¡ããããã®èªåããã³åèªåã®æ¹æ³ã®å®è£ ãã€ãã³ãã§ã®ãã¹ãã®èªåéå§ããã³åæ¢ããªã¬ãŒã®è£ åãNTã¡ã«ãã¯ã¹ã®ã¿ã¹ã¯ãã©ãã«ãŒãžã®çãæ¥ç¶ã¬ããŒãããã¹ãã·ã¹ãã ãå©çšå¯èœãªNTåæã·ã¹ãã ã«æ¥ç¶ããã¯ãŒã¯ãããŒå ã®ãããªãã¢ã¯ã·ã§ã³ïŒããŒã«ã¢ãŠããŸãã¯éä¿¡ïŒã®ããã«è¯ããªãªãŒã¹ãšæªããªãªãŒã¹ãããã€ã³ããããæ©èœãäœæããŸãã å ±åããïŒã 確ãã«ãèŠä»¶ã¯å®å šã«é©åã§ç解ãããããã®ã§ãã
èªåå
é ãããå§ããŸãããã ç§ãã¡ã¯åžžã«åãããšãèããŸãããéè¡ããã³éèãœãããŠã§ã¢ã®è² è·ãã¹ããèªååããããšã¯äžå¯èœã§ãïŒ é¢ä¿ãå€ãããŸãïŒ ç§ãã¡ã¯éåžžã«è€éã§ãïŒã ãã®èª²é¡ã¯ãåé¡ã解決ããè奮ãé«ããã ãã§ãã ç¹å®ã®äŸã§è€éããåžžã«ãã§ãã¯ãããã£ãã®ã§ãã
ãã©ããããšããŒã³ã¢ã€ã¹ã¯ãªãŒã ã®åœ¢ã§ã®ãã¹ãã«é¢ããçŽ æŽãããåçãèŠããŠããŸããïŒ ãã©ããããšã¯ãå®äŸ¡ãªèªåãŠããããã¹ããå€ããå°ãé«äŸ¡ãªUIãããå Žåã§ãã ã¢ã€ã¹ã¯ãªãŒã ããŒã³-ãã®éã ããŒã³ã¯é«äŸ¡ã§ãé ããã¹ã±ãŒã«ããŸãã;ãã©ãããã¯å®äŸ¡ã§æè»ã§ãã
ã·ã¹ãã ã®çžäºäœçšã®ã¬ãã«ã§ãœãããŠã§ã¢ã®è² è·ãã¹ããè¡ã代ããã«ãéè¡ã·ã¹ãã éšéã§ã¯ãã¯ã³ããŒã¹ã·ã¹ãã ãã¢ããªã±ãŒã·ã§ã³ã®æ代ããäžè¬çã«è¡ãããŠããããã«ããã¹ãŠã®ãŠãŒã¶ãŒãUIãéããŠãã¹ããããŸãã ããã«ã¯å€ãã®æéãšåŽåããããããããéè¡ãœãããŠã§ã¢ã®éçºãé ãããäœå質ã§ããŒãã¯ã«ããŸãã Jet Infosystemsã§ã¯ããããã®ã¹ãã¬ãªã¿ã€ããã解æŸãããŸãããéçºè ã¯ã³ãŒãèªäœã®ãŠããããã¹ããäœæããæ©èœãã¹ã¿ãŒã¯Selenium + Cucumberã䜿çšããŠUIãã¹ããå®å šã«ããã°ã©ãã³ã°ããŸããã è² è·ãã¹ãã®è¿œå 段éãããã»ã¹ã«çµ±åããããšã ããæ®ã£ãŠããŸãã
ã€ã³ãã©èšèš
åé ã§ãç§ãã¡ã¯ãå¹ççã§ä¿¡é Œæ§ã®é«ãã³ãŒããéçºãããšãã質åã«å¯Ÿããçããè€éã«ãã䟵é£ããé¢ä¿ãæŸæ£ããããšã«ããŸããã ããšãã°ãæäœã®æ¿èªãšããŒã¯ã³ã®çºè¡ã¯ãµãŒãããŒãã£ã·ã¹ãã ã®æ©èœã§ãããã¿ã¹ã¯ã®äžéšãšããŠã®ããã©ãŒãã³ã¹ã調æ»ããã«ã¯éå°ã§ãã ããã«ãããã€ãã®ããã¯ãªãã£ã¹ã·ã¹ãã ãšã®çµ±åãããã«æåŠããäžå®ã®é 延ã§ã·ã¹ãã ã«å¿çããã¹ã¿ããäœæããŸããïŒè¶ é«éã®ã¢ãã¯ã§ã·ã¹ãã ããã¹ãããããšãã©ãã»ã©å±éºããç¥ã£ãŠããŸãïŒã
ãããããã¹ããã©ãã€ã ã®æãéèŠãªå€æŽã¯ãUI端æ«ã®è² è·ãã¹ãã®æåŠã§ãã ãããŸã§ã¯ãããã¯å¥åŠã«æããŸãããç§ãã¡ã®åã§ã¯ããã®ãµãŒããŒãœãããŠã§ã¢ã¯UI ATMã§åŸ¹åºçã«ãã¹ããããŠããŸããã ããã¯æ¬¡ã®ããã«èµ·ãããŸããïŒå¹³åçãªãŠãŒã¶ãŒããšãã¥ã¬ãŒããããäžéã®ããŒãºïŒããŒã·ã³ã°ãæèæéïŒã®ã»ããã§ããçš®ã®ã¹ã¯ãªããããŒã«ãééããããŒãããŒã«ã¯è€æ°ã®ããŒããžã§ãã¬ãŒã¿ãŒããã®é·ããã³ãŒã«ããã¹ã¯ãªããã§æ§æãããããŒããäœæããããšã匷å¶ãããŸããHP Loadrunnerãäžæ¹ãAPIãµãŒããŒã®1ã€ã®ããŒãã§çºçããè² è·ã¯ã1ç§ãããããã100ïŒïŒïŒãã©ã³ã¶ã¯ã·ã§ã³ã§ããã ïŒæ°å人ã®åžæ°ã1ã€ã®éè¡ã¿ãŒããã«ã®ã³ã³ãããŒã«ãã¯ãªãã¯ããããšããåæ¢ãªåçãæ®ããŸãããïŒã ãã®çµæãATMããã¯ãšã³ãã®ããã©ãŒãã³ã¹ã«é¢ä¿ã®ãªãã»ãŒãã¹ãŠã®ãã®ãã¹ã¿ã³ãããå»æ£ãããŸããã
æ®ãã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãèšèšããã³æ€æ»ããåŸãããã»ã¹ãã©ã®ããã«æ§ç¯ãããããã©ã®ãããªã¡ãªãããåŸãããããã»ãŒæ確ã«ãªããNTããã»ã¹èªäœã®äœæãéå§ããå¿ èŠããããŸããã
CI / CDããã»ã¹ããã³ãœãããŠã§ã¢
ãœãããŠã§ã¢ã³ãŒãã¯ãå éšgitãªããžããªïŒGitLabïŒã«é 眮ãããŸãã ç¹å¥ãªããªã¬ãŒã«ã³ãããããåŸãJenkinsã¯ã³ãŒããã¢ã»ã³ããªãã·ã³ã«ãã«ããéå§ããããã¹ãŠã®ãŠããããã¹ããå®è¡ããŠãªãªãŒã¹ããã«ãããããšããŸãã ã¹ã¯ãªããã䜿çšããã¢ã»ã³ããªã®æååŸãã¢ã»ã³ãã«ããããã«ãã¯2ã€ã®ãã¹ãç°å¢ïŒNTããã³FTïŒã«ã€ã³ã¹ããŒã«ããããã¹ãã®åèµ·åãè¡ãããŸãã ããã¯ãšã³ããäžãããšããžã§ã³ãã³ã¹ã¯FTãUIãIFTãã¹ãã次ã ã«å®è¡ããŸãã è² è·ãã¹ãã¯åå¥ã®ã¿ã¹ã¯ãšããŠèµ·åãããŸãããåå¥ã«èª¬æãã䟡å€ããããŸãã
誰ããç¥ã£ãŠããããã«ãåŸæ¥ã®è² è·ãã¹ãããŒã«ã¯ããã¹ãããŒã¿ãžã§ãã¬ãŒã¿ãŒãè² è·ãžã§ãã¬ãŒã¿ãŒãçµæã®ã¢ãã©ã€ã¶ãŒãšãã3ã€ã®ãæ±ãã§æ§æãããŠããŸãã ãããã£ãŠã3ã€ã®æ¹åã§åé¡ã解決ããŸããã
é¢é£ããAPIãªã¯ãšã¹ããåéããå€åããä»æ§ã®äžã§æ¯åXMLãæžãæããªãããã«ãå¥ã®æ¹æ³ã§è¡ã£ã-UIãã¹ãå®è¡æã«äž»èŠãªæ¯æãã·ããªãªã®TOP-10ãã奪åãããŸããã ãããè¡ãããã«ããã¹ããã³ãã«tsharkããããã€ãããããããã³ãããXMLãåéããŸãïŒåŸã§APIã«éä¿¡ããŸãïŒã ããã«ããããã¹ãããŒã¿ã®æºåã«å€ãã®æéãšåŽåãç¯çŽãããŸãã
è² è·ãžã§ãã¬ãŒã¿ãŒãšããŠã ãªãŒãã³ãœãŒã¹åžå Žã§æã人æ°ã®ããããŒã«ã§ããJMeterã䜿çšããŸãããã Yandex.Tankããã€ã³ãã£ã³ã°ãšããŠäœ¿çšããŸããã JMeterã¯ãããŒããããæ¯ç§100ãã©ã³ã¶ã¯ã·ã§ã³ãéä¿¡ããã®ã«ååãªèœåãåããŠãããTankã¯èªååã®äŸ¿å©ããšããã€ãã®äŸ¿å©ãªæ©èœãæäŸããŸã-ããããã€ã¯ãã€ã³ã¿ã©ã¯ãã£ãã°ã©ãã£ãã¯ã¹ãNTããã»ã¹ãåæç»ããã«ä»ã®è² è·ãžã§ãã¬ãŒã¿ãŒã䜿çšããæ©èœãªã©
NTæ§ç¯ã®æ®µéã§æãé£ããéšåã¯åæéšåã§ãã åžå Žã§ããã©ãŒãã³ã¹ãã¹ãçšã®ç¬èªã®åæãäœæããããã®åå¥ã®ãœãªã¥ãŒã·ã§ã³ã¯ãªãããã Yandexã®Overloadã䜿çšããããšã«ããŸããã éè² è·ã¯ãã¹ãã¬ã¹ãã¹ãã®çµæãä¿åããã³åæããããã®ãµãŒãã¹ã§ãã è² è·ãžã§ãã¬ãŒã¿ãŒããè² è·ãäœæããçµæããµãŒãã¹ã«ããŒãããŠãã°ã©ã圢åŒã§ãããã芳å¯ããŸãã çŸåšããµãŒãã¹ã¯ãããªãã¯ããŒã¿çã§ãããYandexã¯Jet Infosystemã®ãã€ããããã©ã€ããŒãã€ã³ã¹ã¿ã³ã¹ãäœæããŸããã
JMeterããã®ãã¹ãŠã®ããŒã¿ã¯éçŽããã圢åŒã§ãªãŒããŒããŒãã«éãããæ¯æããšé¡§å®¢ã«é¢ããå人æ å ±ã¯å«ãŸããŸããããŠãŒã¶ãŒã«ã¯ããã©ãŒãã³ã¹ãã¹ãã®ã°ã©ãã£ãã¯è¡šç€ºã®ã¿ã衚瀺ãããŸãã
æãèå³æ·±ã
ãã«ããããŒãã¹ã¿ã³ãã«å°éãããšãJenkinsã®ã¹ã¯ãªãããä»ããŠããŒããã¹ãçšã®ç¹å¥ãªã¿ã¹ã¯ãéå§ãããŸãã ã¿ã¹ã¯ã¯ãã·ã§ã«ã¹ã¯ãªãããšãã©ã¡ãŒã¿ãŒåãéããŠãå€å žçãªæ¹æ³ã§æ§æãããŸãã
ããšãã°ããã®æ¹æ³ã§ããããã€ã¯ãæ§æã§ããŸãã
ããã¯ãYandex.Tankã®èšå®ã次ã®ããã«èŠãããã®ã§ãã
ããã¯ãNTããã»ã¹å šäœãéå§ããã·ã§ã«ã¹ã¯ãªããã®äŸã§ãã
ã芧ã®ãšããããã¹ãŠã®èšå®ã¯éåžžã«åå§çã§ãã ãžã§ããèªåçã«éå§ããããšãããã©ã«ãã®ãã©ã¡ãŒã¿ãŒãèªåçã«é©çšãããŸããæåã§éå§ããå Žåãããã¥ã¡ã³ããç解ããããLinuxãã·ã³ãæãäžããããå¿ èŠãªæ§æããœãŒããããããããšãªããJenkinsãã©ã¡ãŒã¿ãŒã§ã·ã¥ãŒã¿ãŒãæ§æã§ããŸãã
éçºè ã®ããã¿ã³ã§éå§ãã¢ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
ãã¹ããéå§ãããšãã³ã³ãœãŒã«ãã¥ãŒã®JenkinsãšTelegramã«ãªã³ã¯ã衚瀺ãããã¯ãªãã¯ããŠãªã¢ã«ã¿ã€ã ã§è² è·ãã¹ããèŠãããšãã§ããŸãã
ãã¹ãçµæãSLAã®ç¯å²å€ã§ããå Žåããã¹ãã¯èªåçã«åæ¢ãããªãªãŒã¹ã«é¢ããåé¡ã«ã€ããŠé»å ±ãã¡ãŒã«ãããã³JIRAã§ã¬ããŒããåãåããŸãã çµæãè¯å¥œãªå Žåãã¬ããŒãã®åŸããªãªãŒã¹ã¯SUCCESSã®ã¹ããŒã¿ã¹ãåãåããæ¬çªç°å¢ã§ããŒããããç°å¢ã«å±éããæºåãã§ããŠããŸãã
ãã¬ã°ã©ã ç»é¢ã®ç»é¢ïŒ
ãã®ããããããã¯çµæãJIRAã«å ±åããŸãã
Yandexã®äŒæ¥ãã°ããã£ãŒããšããŠããã³ãããŒã¯æ¯èŒã«ã¢ã¯ã»ã¹ã§ããŸããã
KPIã¡ããªãã¯ã«é¢ããååž°ã¬ããŒãã®äœæãžã®ã¢ã¯ã»ã¹ïŒ
åé¡ãšè§£æ±ºç
ä»äºäžã«ã€ãŸãããããã€ãã®çæã説æããªãã£ãå Žåããã®è©±ã¯äžå®å šã«ãªããŸãã
ã¢ãã¿ãªã³ã° æããã«ãã¹ãã¬ã¹ãã¹ãäžã¯ãããžãã¹ã¢ãã¿ãªã³ã°ããŒã«ïŒãã©ã³ã¶ã¯ã·ã§ã³ã®æ€èšŒããã¥ãŒãµã€ãºããã©ã³ãžããé床ïŒã ãã§ãªããã·ã¹ãã ã¢ãã¿ãªã³ã°ïŒããã»ããµã®æ¶è²»ãã¡ã¢ãªãµã€ãºããã£ã¹ã¯æäœã®æ°ãèªåã§çºæããã¡ããªãã¯ãªã©ïŒã䜿çšããå¿ èŠããããŸãã dãïŒã ã€ã³ãã©ã¹ãã©ã¯ãã£å šäœãLinuxäžã«æ§ç¯ãããŠããå ŽåïŒsshã«çµ±åãããtelegrafãœãªã¥ãŒã·ã§ã³ã䜿çšãããšãã®åé¡ã解決ãããïŒããã¹ãŠã®ããŒã¿ãçµ±èšããã¯ãšã³ãã«èªåçã«æ³šã蟌ãŸããããžãã¹ã¡ããªãã¯ã®éèšãšåæããŠæ§ç¯ããããšäŸ¿å©ã§ãã ããããWindowsãã©ãããã©ãŒã äžã«æ§ç¯ããããã¹ãç°å¢ã®äžéšãããå Žåã¯ã©ãã§ããããïŒ
ããŸããŸãªãªãã·ã§ã³ã«ã€ããŠè°è«ããããã«è³ããŸããã
ãã®å ŽåããµãŒããŒããã³è² è·ãžã§ãã¬ãŒã¿ãŒããã®ãã¹ãŠã®ã¡ããªãã¯ã¯ãããŒã«ã«ãã¬ã°ã©ããšãŒãžã§ã³ãã«ãã£ãŠInfluxDBã«æžã蟌ãŸããYandex.Tankã¢ãã¿ãªã³ã°ã¯ãåçŽãªã¹ã¯ãªããã§InfluxDBããããŒã¿ãæœåºããOverloadã«ããŒã¿ãããã·ã¥ããŸãã ãã®ã¢ãããŒãã«ãããYandex.Tankã«ãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®åç©åå šäœã®ãµããŒããæŸæ£ãããone to allãæ¥ç¶ã®å¿ èŠæ§ãåé¿ã§ããŸãã
次ã®ãããªç°¡åãªã¹ã¯ãªãããäœæããŸãã
from inflow import Client import sys try: connect = Client(sys.argv[1]) try: query_string = "SELECT LAST(" + sys.argv[4] + ") FROM " + sys.argv[3] + " WHERE host='" + sys.argv[2] + "';" result = connect.query(query_string) print (result[0]["values"][0]["last"]) except: print ("Bad request or something wrong with DB. See logs on " + sys.argv[1] + " for details.") except ValueError: print("Something wrong with parameters. " "Usage: python ./influx_picker <http://db_host:port/dbname> <target_host> <group> <metric>") except IndexError: print("Usage: python ./influx_picker <http://db_host:port/dbname> <target_host> <group> <metric>")
ãã®ç£èŠæ§æã䜿çšããŠãYandex.Tankã«InfluxDBããã«ã¹ã¿ã ã¡ããªãã¯ãåéãããããšãã§ããŸãã
<Monitoring> <Host address="localhost" interval="5"> <Custom diff="0" measure="call" label="cpu_sys">python influx_picker.py http://<INFLUXDB_IP>:8086/target_host target_host cpu usage_system</Custom> <Custom diff="0" measure="call" label="cpu_usr">python influx_picker.py http://<INFLUXDB_IP>:8086/target_host target_host cpu usage_user</Custom> <Custom diff="0" measure="call" label="cpu_iowait">python influx_picker.py http://<INFLUXDB_IP>:8086/target_host target_host cpu usage_iowait</Custom> <Custom diff="0" measure="call" label="mem_free_perc">python influx_picker.py http://<INFLUXDB_IP>:8086/target_host target_host mem available_percent</Custom> <Custom diff="0" measure="call" label="mem_used_perc">python influx_picker.py http://<INFLUXDB_IP>:8086/target_host target_host mem used_percent</Custom> <Custom diff="0" measure="call" label="diskio_read">python influx_picker.py http://<INFLUXDB_IP>:8086/target_host target_host diskio read_bytes</Custom> <Custom diff="0" measure="call" label="diskio_write">python influx_picker.py http://<INFLUXDB_IP>:8086/target_host target_host diskio write_bytes</Custom> </Host> </Monitoring>
ãã®çµæããªãŒããŒããŒãã§ãã®ãããªã°ã©ããååŸããŸãã
å ±å 2çš®é¡ã®ã¬ããŒãçµæã䜿çšããŸããã
ç°¡åãªã¬ããŒãïŒæéååžãå«ãå°éã®ã¡ã¿æ å ±ãšèªååæ¢ãã©ã°ã€ã³ããã®ã¡ãã»ãŒãžïŒãã¡ãã»ãŒãžãšããŠTelegramãã£ããã«éä¿¡ãããéçºè ãã¢ãŒããã¯ãããããŒãžã£ãŒããã¹ã¿ãŒã賌èªããŸããã
ååž°ã¬ããŒã-åç §çµæãšã®æ¯èŒãç°¡åãªæ å ±ã«è¿œå ãããæ¡åŒµã¬ããŒã-ã¯ãã³ã¡ã³ããšããŠJIRAã«éä¿¡ãããŸããã
ãããè¡ãããã«ãTelegramã®Groovyã¹ã¯ãªãããšåçŽãªã©ã€ãã©ãªïŒè©³çŽ°ã¯https://pypi.python.org/pypi/jira/ ïŒã䜿çšããŠJIRA APIã«æ¥ç¶ããŸããã
ãããã«
ã芧ã®ãšããããã®ã¿ã¹ã¯ã¯Rocket Scienceã®ã«ããŽãªã§ã¯ãããŸãããåæ§ã®èšäºããã¡ã ã ãã¡ã ããããŠãããªãã芧ãã ãã ã ãã³ãããã®äžã«ã¯éåžžã®ã¹ã¯ãªãããšãµãŒãã¹ããããŸã-å®éãéèã»ã¯ã¿ãŒã¯ãDevopsãããã³äžè¬çãªèªååã®æ代ã«é·ãéæºåãã§ããŠããããšã瀺ãããã£ãã ãã§ãã
èªååããåŸãããã¡ãªããã¯äœã§ããïŒ
- ãã¹ãé床ã®åäžïŒã³ãããåŸæ倧2æéã§çµæãåŸãããŸãããæåãã¹ãã«ã¯çŽ1ã2é±éããããŸãã
- 容é䜿çšçã®åäžïŒ3ã€ã®ä»®æ³ãµãŒããŒãšçŽ10ã®ç©çãµãŒããŒïŒïŒïŒã
- ã©ã€ã»ã³ã¹ã³ã¹ãã®å¢å ïŒJmeter察LoadrunnerãTelegraf察Sitescope / Tivoliãããã³é«ããã³ããŒç¬ç«æ§ã
以äžã®èšäºã§ã¯ãããã©ãŒãã³ã¹ãšãšã³ãžã³æé©åã®èŠ³ç¹ãããInfluxDBã䜿çšããå®éšã«ã€ããŠèª¬æããŸãã ãã¥ãŒã¹ããã©ããŒããŠãã ããïŒ
Jet Infosystemsã¹ãã¬ã¹ãã¹ãããŒã ã