ããã«ã¡ã¯ãå¤ä¼ã¿ã«é·éã«è¡ã£ã¦å±
é
å±ã§é¦¬åºãããããµãé£ã¹ã¦ããã
å°å
ã®ãã£ãã人çã®å¤§å
輩ã®çµ¡ã¿é
ã«ä»ãåããããç¥å±±ã§ãã
4æã«å ¥ç¤¾ãã¦ä»¥éããµã¼ããµã¤ãã®Webéçºãã¹ã¯ã©ã ã®å°å ¥ããµã¤ãå æ¤ç´¢ã®æ¹åãªã©æ§ã ãªæ¥åã« åãçµãã§ãã¾ãããæè¿ã®å¤§ããªæ¡ä»¶ã¨ãã¦ã¯ãã¢ã¯ã»ã¹ãã°è§£æåºç¤ã®æ´åãããã¾ããã
nginxã®ã¢ã¯ã»ã¹ãã°ãåæããããç°å¢ãä½ããããElasticsearchã¨BigQueryã«ãã°ãèç©ãå§ããã®ã§ããã ãã®éã«ä¸çªã®ãã¢ã¨ãªãã®ã¯ãã¿ããªå¤§å¥½ãfluentdã§ãã
ä»åã¯ãæã ãã¦ãã¬ãã¸ã§ã³ãã©ã®ããã«ã¢ã¯ã»ã¹ãã°ãåéãä¿åãã¦ããã®ãã«ã¤ãã¦ãfluentdã®è¨å®ãä¸å¿ã«ãç´¹ä»ãã¾ãã
ã¢ã¯ã»ã¹ãã°åéã®ç®ç
ç¾å¨ã®æã ã®ãµã¼ãã¹ç°å¢ãèæ ®ããã¨ãã¢ã¯ã»ã¹ãã°ã®åéã«ã¯ä¸è¨2ã¤ã®ç®çãåå¨ãã¾ãã
- ã¢ã¯ã»ã¹æ
å ±ããã¨ã«ã¦ã¼ã¶ã¼ã®è¡åãè§£æ
- é²è¦§å±¥æ´ãç¨ããã¬ã³ã¡ã³ãã¼ã·ã§ã³çã«ããããµã¼ãã¹ããã¼ã½ãã©ã¤ãºããã
- åé¡çºçæã®èª¿æ»
- æéãIPã¢ãã¬ã¹ããã¹ãªã©ã§ç®çã®ãã°ãããã«æ¢ãåºãã調æ»ã容æã«ããã
ã©ã®ãã¼ã«ããµã¼ãã¹ã使ãã®ã
1ã®ç®çãéæããããã®ãã¼ã«ããµã¼ãã¹ã¯è¤æ°èãããã¾ãããä¾¡æ ¼ãæ§è½ã®ä¸¡é¢ãèæ ®ããã¨ãã¯ãBigQeuryãå§åçã§ãã é常ã«å®ä¾¡ãã¤é«éã«ãã°ãèç©ãæ¤ç´¢ã§ãã¾ãã ã¾ãç¨éã®å¿ è¦ä¸ãè¤éãªã¯ã¨ãªãçºè¡ãããã¨ãå¤ããããæ £ã親ããã§ããSQLã©ã¤ã¯ãªã¯ã¨ãªãæ¸ãããã¨ã ã¯ã©ã¦ããµã¼ãã¹ã®ããéç¨å·¥æ°ãæãããããã¨ã大ããªã¡ãªããã§ãã
䏿¹ãBigQueryã¯ã¯ã¨ãªãçºè¡ãã度ã«èª²éããããããæ¢ç´¢çãã¢ãããã¯ãªæ¤ç´¢ã«ã¯åãã¦ãã¾ããã ãã®ãã2ã®ç®çã«BigQueryãç¨ãããã¨ã¯ä¸é©åã§ãã
仿¹ãæ¤ç´¢æ¡ä»¶ã¯æéãIPã¢ãã¬ã¹ãªã©åç´ã§ãããããã©ã¼ãã³ã¹ããã»ã©è¦æ±ãããªãããã ã¯ã©ã¦ãä¸ã®èªç¤¾ãµã¼ãã«Elasticsearch + Kibanaãèªãã¤ã³ã¹ãã¼ã«ãã¦éç¨ãã¦ãããã»ã©éç¨å·¥æ°ã¯ããããªãã§ãããã
ä¸è¨ã®çç±ãããã¦ã¼ã¶ã¼ã®è¡åè§£æã«ã¯BigQueryãåé¡çºçæã®èª¿æ»ã«ã¯Elasticsearch + Kibanaãæ¡ç¨ãã¾ããã
ã©ããã£ã¦ããã®ã
ä¸å¿ãçµµãããã¦ã¿ããã®ã®ãããããå³ã«ããã¾ã§ããªãã·ã³ãã«ãªæ§æã§ãã
Webãµã¼ã(nginx)ããfluentdã§ç´æ¥ããããã«ãã°ãéã£ã¦ãã¾ãã Webãµã¼ã1å°ã§éç¨ãã¦ããããã仲ä»ãµã¼ãã¯è¨ãã¦ãã¾ããã
td-agent.confã®ä¸èº«
å種ãã¼ã«åå¥ã®ã»ããã¢ããæ¹æ³ã«ã¤ãã¦ã¯æ¢åã®æ å ±ãè±å¯ãªãããããã§ã¯çç¥ãã¾ãã
fluentdã¨Elasticsearchãããã¯BigQueryã®é£æºã«ã¤ãã¦ãæ¢ãã°ããããè¦ã¤ããã§ãããã fluentdãããã°ãåç´ã«æµãã ãã§ããã°ãå°é£ã«çªãå½ãããã¨ã¯ãªãã§ãããã
ããããªããæã ã®è¦ä»¶ããåãã¼ã«ããµã¼ãã¹ã®ä½¿ç¨ä¸ã®å¶ç´ãããæ°ãã¤ããªããã°ãªããªãç¹ãããã¤ãããã¾ãã
- BigQueryã¯ã¹ãã¬ã¼ã¸èª²éï¼ã¯ã¨ãªèª²éï¼èµ°æ»ãããã¼ã¿ã®åã ã課éãããï¼ãããä¿åãããã¼ã¿ã¯å³é¸ããã
- éçãã¡ã¤ã«çã®ã¦ã¼ã¶ã¼ã®è¡åè§£æã¨ã¯é¢ä¿ãªããã°ã¯ãã£ã«ã¿ãªã³ã°ããã
- åãçç±ã§ããã°ã®ä¿åå
ãã¼ãã«ã¯1ã¤ã§ã¯ãªããææã«ãã£ã¦åãããã¨ãæã¾ãã
- WHEREå¥ã§åå¾ç¯å²ãéå®ããå ´åã§ãããã¼ãã«å ¨ä½ãèµ°æ»ãããã¨ã¯å¤ãããªã
- ãããããæ¥æ¯ãææ¯ãªã©ã§ãã¼ãã«ãåãã¦ããã°èª²éãæãããã
- é害調æ»ã®ããã«ã¯å
¨ã¦ã®ãã°ã欲ãã
- Elasticsearchã«ä¿åãããã°ã¯ãã£ã«ã¿ãªã³ã°ãããªã
ãã®ããã«ããªãè¤éãªè¦ä»¶ãæ±ãããã¾ããã幸ããªãã¨ã«fluentdã«ã¯å種æ§ã ãªãã©ã°ã¤ã³ãéçºããã¦ããã ãããã䏿ãçµã¿åããããã¨ã§å ¨ã¦å®ç¾ãå¯è½ã§ãã
ããã§ã¯ãå¾ ã¡ãããæã ã使ã£ã¦ããtd-agent.confãããã§å ¬éãã¾ãã
ï¼å®éã«ã¯ãã°ã®ãã©ã¼ããããã¢ã¬ã³ã¸ãã¦ããã®ã§formatã¯apacheã§ã¯ãªãã£ããã ãã£ã«ã¿ãªã³ã°æ¡ä»¶ãããå°ãè¤éãªã®ã§ããã話ãè¤éã«ãªãã®ã§å®éã®ãã¡ã¤ã«ããå°ã ã¢ã¬ã³ã¸ãã¦ãã¾ãï¼
<source> type tail format apache time_format %d/%b/%Y:%T %z path /var/log/nginx/access.log pos_file /var/log/td-agent/nginx.access.pos tag nginx.access </source> <match nginx.access> type rewrite_tag_filter rewriterule1 path ^/(files|img|js|css)/ ${tag}.clear rewriterule2 path ^/favicon\.ico/ ${tag}.clear rewriterule3 path (.+) ${tag}.accept </match> <match nginx.access.accept> type record_reformer enable_ruby true tag ${tag}.${time.strftime('%Y%m')} </match> <match nginx.access.**> type forest subtype copy remove_prefix nginx.access <template> <store> type elasticsearch host 192.168.100.1 port 9200 type_name access_log logstash_format true logstash_prefix service_front_access logstash_dateformat %Y%m buffer_type memory buffer_chunk_limit 10m buffer_queue_limit 10 flush_interval 1s retry_limit 16 retry_wait 1s </store> </template> <case accept.*> <store> type bigquery method insert auth_method private_key email [email protected] private_key_path /etc/td-agent/XXXXXXXXXX.p12 project XXXXXXXXXX dataset XXXXXXXXXX table nginx_${tag_parts[-1]} time_format %s time_field time schema_path /etc/td-agent/schema.json </store> </case> </match>
é ã追ã£ã¦è§£èª¬ãã¦ããã¾ãã
sourceãã£ã¬ã¯ãã£ã
<source> type tail format apache time_format %d/%b/%Y:%T %z path /var/log/nginx/access.log pos_file /var/log/td-agent/nginx.access.pos tag nginx.access </source>
sourceãã£ã¬ã¯ãã£ãã«ã¤ãã¦ã¯ç¹ã«èª¬æããå¿
è¦ã¯ãªãã§ãããã
æ¨æºã®tail
ãã©ã°ã¤ã³ã§nginxã®ãã°ããã©ãã¯ãã¦nginx.access
ã¨ããã¿ã°ãä»ä¸ããã ãã§ãã
ãã°ã®ãã£ã«ã¿ãªã³ã°
<match nginx.access> type rewrite_tag_filter rewriterule1 path ^/(files|img|js|css)/ ${tag}.clear rewriterule2 path ^/favicon\.ico ${tag}.clear rewriterule3 path (.+) ${tag}.accept </match>
1ã¤ç®ã®matchãã£ã¬ã¯ãã£ãã§ã¯ããã°ã®ãã£ã«ã¿ãªã³ã°ãè¡ã£ã¦ãã¾ãã fluent-plugin-rewrite-tag-filterã¨ãããæ£è¦è¡¨ç¾ããã¨ã«ã¿ã°ãä»ãæ¿ãããããã©ã°ã¤ã³ã使ãã¾ãã
è¦ã¦ãã¦ã ããã°å¤§ä½ã®æ³åã¯ã¤ããã¨æãã¾ããã
pathã/files/, /img/, /favicon.icoãªã©ã§å§ã¾ãå ´åï¼ã¤ã¾ãéçãã¡ã¤ã«ï¼ã«ã¯ã¿ã°ã®æ«å°¾ã«clear
ãã
ãã®ä»ï¼ã¦ã¼ã¶ã¼ã®è¡åã«é¢ä¿ã®ãããã°ï¼ã®å ´åã«ã¯accept
ã追å ãã¾ãã
ããã«ãããBigQueryã«ä¿åãã¹ããã°ã¯nginx.access.accept
ã
é¤å¤ãããã°ã¯nginx.access.clear
ã¨ãªã£ã¦æ¬¡ã®matchã«æ¸¡ããã¾ãã
ææ¯ã«åçã«ã¿ã°ãå¤åããã
<match nginx.access.accept> type record_reformer enable_ruby true tag ${tag}.${time.strftime('%Y%m')} </match>
å
ã«æããçç±ãããBigQueryã®ä¿åå
ãã¼ãã«ãææ¯ã«å¤åãããå¿
è¦ãããã¾ãã
ä¾ãã°2014å¹´8æã®ãã°ãªãä¿åå
ãã¼ãã«ã¯nginx_201408
ã9æãªãnginx_201409
ã¨ãã£ã次第ã§ãã
ãã®ç®çãéæããããã«ã¯ãæã«ãã£ã¦ãã°ã«ä»ä¸ããã¿ã°ãåçã«å¤ãã¦ããå¿
è¦ãããã®ã§ããã
ãã®ããã«fluent-plugin-record-reformer
ã¨ãããã©ã°ã¤ã³ã使ãã¾ãã
ãã®ãã©ã°ã¤ã³ã使ãã¨ãã°ã®ãã£ã¼ã«ããã¿ã°ãèªç±ã«æ¸ãæãããã¨ãã§ããã®ã§ããã
ä¸è¨ã®ããã«enable_ruby
ãtrueã«ã»ããããã¨ãä»»æã®Rubyã®ã³ã¼ãã使ããã¨ãã§ãã¾ãã
ããã§ãtime.strftime('%Y%m')
ã®çµæããã°ã®æ«å°¾ã«è¿½å ãããã¨ã§ãä¾ãã°2014å¹´8æã«å¦çããããã°ã§ããã°ã
nginx.access.accept.201408
ã¨ã¿ã°ãæ¸ãæãããã¨ãã§ãã¾ãã
ãããã¦æ«å°¾ã«ä»ä¸ããå¹´æã«ãã£ã¦ã次ã®matchãã£ã¬ã¯ãã£ãã§ä¿åãããã¼ãã«ãå¤ãã¦ããã¾ãã
<match nginx.access.accept>
ã¨ãã¦ãããããBigQueryããé¤å¤ãããã°ï¼nginx.access.clear
ï¼ã«ã¤ãã¦ã¯ããã§ã¯å¦çãè¡ããã¾ããã
Elascticsearchã¨BigQueryã«ãã°ãéã
<match nginx.access.**> type forest subtype copy remove_prefix nginx.access <template> <store> type elasticsearch host 192.168.100.1 port 9200 type_name access_log logstash_format true logstash_prefix service_front_access logstash_dateformat %Y%m buffer_type memory buffer_chunk_limit 10m buffer_queue_limit 10 flush_interval 1s retry_limit 16 retry_wait 1s </store> </template> <case accept.*> <store> type bigquery method insert auth_method private_key email [email protected] private_key_path /etc/td-agent/XXXXXXXXXX.p12 project XXXXXXXXXX dataset XXXXXXXXXX table service_nginx_${tag_parts[-1]} time_format %s time_field time schema_path /etc/td-agent/schema.json </store> </case> </match>
ããããæå¾ã®matchãã£ã¬ã¯ãã£ãã«æ¥ã¾ãããããã§ã¯
- ãã¹ã¦ã®ãã°ãElasticsearchã«æµã
- ã¿ã°ã«acceptãã¤ãããã°ã ãã¯BigQueryã«æµã
- ã¿ã°ã®æ«å°¾ã®å¤ï¼201408ãªã©ï¼ã«å¿ãã¦ãBigQueryã®ä¿åå ãã¼ãã«ãå¤åããã
ã¨ãããå°ã è¤éãªæä½ãå¿ è¦ã¨ãªãã¾ãã
è¤æ°ã®å®å
ã¸ãã°ãéãã«ã¯ãæ¨æºã®copy
ãã©ã°ã¤ã³ã使ãã¾ãã
ã¿ã°ã®å¤ã«ãã£ã¦åçã«ä¿åå
ãã¼ãã«ãå¤åãããã®ã«ã¯ãfluent-plugin-forestãå©ç¨ãã¾ãã
<template> <store> type elasticsearch host 192.168.100.1 port 9200 type_name access_log ...ç¥ </store> </template>
templateã»ã¯ã·ã§ã³ã«ã¯ãããããå ¨ã¦ã®ãã°ã«å¯¾ããå ±éã®å¦çãè¨è¿°ãã¾ãã Elasticsearchã«ã¯å ¨ã¦ã®ãã°ãä¿åãã¦ãããããããããã«ã¯Elasiticsearchã«ä¿åããå¦çãè¨è¿°ãã¾ãã
<case accept.*> <store> type bigquery method insert auth_method private_key email [email protected] private_key_path /etc/td-agent/XXXXXXXXXX.p12 project XXXXXXXXXX dataset XXXXXXXXXX table nginx_${tag_parts[-1]} time_format %s time_field time schema_path /etc/td-agent/schema.json </store> </case>
caseã»ã¯ã·ã§ã³ã¯ä¸è¬çãªããã°ã©ãã³ã°è¨èªã®switch-caseæã¨åããããã®æ¡ä»¶ã«ããããããã°ã«å¯¾ãã¦ã®ã¿è¡ãå¦çãè¨è¿°ãã¾ãã
ä»åã®å ´åãBigQueryã«ä¿åããã®ã¯nginx.access.accept.201408
, nginx.access.accept.201409
, ...çã®ã¿ã°ãã¤ãããã°ã§ãã®ã§ãaccept.*
ã§æ¡ä»¶ãæå®ãã¾ã
ï¼nginx.access
ã®é¨åã¯remove_prefix
ã§é¤å»æ¸ã¿ã§ãï¼ã
table service_nginx_${tag_parts[-1]}
æå¾ã«ããã®é¨åããã¢ã¨ãªãã¾ãã${tag_parts[-1]}
ã¨ãããã¨ã§ãã¿ã°ã®æ«å°¾ï¼accept.201408
ãªã201408
ï¼ã®å¤ãåãè¾¼ããã¨ãã§ãã¾ãã
ãã®ããã2014å¹´8æã®ãã°ãªãã°nginx_201408
, 9æã®ãã°ãªãã°nginx_201409
ã®ãã¼ãã«ã¨ãã£ãæ¬¡ç¬¬ã«æ ¼ç´å
ã®ãã¼ãã«ãå¤åããããã¨ãã§ããã®ã§ãã
ã¾ã¨ã
以ä¸ãfluentdã使ã£ã¦nginxã®ãã°ãElasticsearchã¨BigQueryã«ä¿åããæ¹æ³ã«ã¤ãã¦ãç´¹ä»ãã¾ããã
fluentdã¯ãã1, 2å¹´ã®éã«å¤§æµè¡ããæ©ããå®çªã¨ãªã£ãæã®ãããããã¯ãã§ããã ãªãã»ã©ä½¿ãã°ä½¿ãã»ã©ããã®æè»æ§ãè¨å®ã®å®¹æããã¨ã³ã·ã¹ãã ã®åºãã«é©åããã°ããã§ãã
ãããã§ãã°ãåéãä¿åãããã¨ã容æã«ãªã£ã䏿¹ã§ããã 貯ãã¦ããã ãã§ã¯ä½ã®ä¾¡å¤ãçã¿åºãã¾ããã æã ã®è§£æåºç¤ã¯åºæ¥ãã¦ã®ãã¤ãã¤ã§ãããããããã©ãã©ããã¼ã¿ãèç©ããã¦ããã¾ãã ããç¨åº¦ãã¼ã¿ãæºã¾ã£ã段éã§æ§ã ãªæ½çã«æ´»ããã¦ããã¾ãã®ã§ããã®éç¨ãçµæã«ã¤ãã¦ãã¾ãããã§ãç´¹ä»ã§ããã°ã¨æãã¾ãã