ããã«ã¡ã¯ããµãŒããŒãµã€ããšã³ãžãã¢ã®è
åã§ãã ä»åã¯ElasticStack6ã«ã€ããŠåŠãã§ã¿ãã®ã§ãã®ç¥èŠãå
±æããããšæãèšäºã«ããŸããã ã¯ããã« æ€çŽ¢ãšã³ãžã³Elasticsearchã®æ€èšŒãããŠããäžã§ELKãšåŒã°ããElasticStackã®è£œåã«ã€ããŠåŠãã§ã¿ãŸããã®ã§ãã®ELKã®å®è¡ãŸã§ã®æµããèšèŒããŠãããŸãã ç°å¢ Mac OS Elasticsearch 6.2.4 Kibanaã6.2.3 Logstash 6.2.3 å
¥éå
容 ãŽãŒã«ïŒELKã®äœ¿ãæ¹ãåã³å°å
¥ããããžã¥ã¢ã©ã€ãºãŸã§ã®æµãã確èªãã Logstashã§ããŒã¿ãæ±ã LogstashããElasticsearchã«ããŒã¿ãå å·¥ãæå
¥ãã Kibanaã§Elasticsearchã§æå
¥ããããŒã¿ãå¯èŠåãã 1 . Logstashã§ããŒã¿ãæ±ã Logstashãã€ã³ã¹ããŒã«ããŸãã ããã¥ã¡ã³ãéãã«ã€ã³ã¹ããŒã«ããŠãåé¡ãªãã§ããä»åã¯homebrewã§ã€ã³ã¹ããŒã«ããŸããã logstashãããŒã«ã«ã® /usr/local/bin/logstash ã«ã€ã³ã¹ããŒã«ãããããšãããããŸãã https://www.elastic.co/jp/downloads/logstash $ brew install logstash $ which logstash /usr/local/bin/logstash ã§ã¯ Logstashãå®éã«èµ·åãããŠåäœã確èªããŠãããŸããã Logstashãæ±ãããã«ã¯Logstashã«ã©ããªããŒã¿ã«å¯ŸããŠ(input)ã©ã®ããã«å å·¥ã(filter)ã©ãåºå(output)ããããèšå®ããããã®confãã¡ã€ã«ãå¿
èŠã«ãªãã®ã§ãã¡ã€ã«ãäœããŸãããã ãã¡ã€ã«ã¯ã©ãã§ã倧äžå€«ãªã®ã§ããããã§ã¯ /usr/local/Cellar/logstash/6.2.4/bin é
äžã« logstash.conf ãé
眮ããŸããã // ã©ããªããŒã¿ã«å¯Ÿã㊠input { stdin {} } // ã©ã®ããã«å å·¥ããã filter {} // ã©ãåºåããã output { stdout { codec => rubydebug } } äžèšãé
眮ããŸããä»ã¯logstash.confã®é圢ããããã ããªã®ã§ç¹ã«èšå®ãªã©ã¯èšããŠããŸããã å®éã«èµ·åããŠç¢ºèªããŠãããŸããã $ /usr/local/bin/logstash -f logstash.conf æåãããšæçµè¡ã«ãã®ãããªåºåã§ã³ãã³ãã©ã€ã³ãæ¢ãŸãããšã確èªããŸãã Pipelines running {:count=>1, :pipelines=>["main"]} ãã¡ãã®ç¶æ
ã§æååãå
¥åããŠã¿ãŸãã Pipelines running {:count=>1, :pipelines=>["main"]} Hello! { "host" => "host", "@timestamp" => 2018-06-17T11:38:44.370Z, "message" => "Hello!", "@version" => "1" } LogstashåŽããäžèšã®ã¬ã¹ãã³ã¹ãè¿ã£ãŠããããšã確èªã§ããŸãã Hello! ãšããã¡ãã»ãŒãžã messageã®ãã£ãŒã«ãã«ååšããŠããããšãããããŸãã ããã§ã¯logstash.confã§ããŒã¿ãå å·¥ããŠã¿ãŸããã ããŒã¿ã®å å·¥ã«ã¯filterã䜿ããŸãã filterã«ãæ§ã
ãªå å·¥ãæœãAPIãçšæãããŠãããŸãã https://www.elastic.co/guide/en/logstash/current/filter-plugins.html ãã®äžã§ grok ãšåŒã°ããapacheãªã©ã®ãã°ããã£ã«ã¿ãªã³ã°ãããšãã«äŸ¿å©ãªfilterã䜿ã£ãŠã¿ãŸãã logstash.confã®filterå
ã«grokãã£ãŒã«ãã远å ããŸãã input { stdin {} } filter { grok { match => { "message" => '%{HTTPDATE:date} %{IP:ip} ' } } } output { stdout { codec => rubydebug } } äžèšã®èšå®ã§ä¿åãããã²ãšãŸãäžèšãå®è¡ããŠã¿ãŸãã $ /usr/local/bin/logstash -f logstash.conf ç«ã¡äžãã£ãããšã確èªã§ããã以äžãå
¥åããŸãã 18/July/2018:19:38:00 -0700 183.60.215.50 18/July/2018:19:38:00 -0700 183.60.215.50 { "@timestamp" => 2018-06-17T15:31:18.991Z, "message" => "18/July/2018:19:38:00 183.60.215.50 ", "msg" => "Hello!", "ip" => "183.60.215.50", "@version" => "1", "date" => "18/July/2018:19:38:00 -0700", "host" => "WP3N-219" } ã¬ã¹ãã³ã¹ãã¿ããšãã£ãŒã«ããå¢ããŠããããšãããããŸãã å
¥åãããã°ãfilterã§ç¢ºèªããŠããŒã¿ãåå²ããŠãããŠããã®ã§ãã HTTPDATEã«ã¯æ¥ä»ãIPã«ã¯ipã¢ãã¬ã¹ãDATAã«ã¯ã¡ãã»ãŒãžããŒã¿ãå
¥ã£ãŠããããšãããããŸãã ãã®ããã«ããŠElasticsearchã«ããŒã¿ãéãéã«äºåã«å å·¥ããããšã«ãã£ãŠKibanaã§å¯èŠåããããããã Elasticsearchã®ãããã³ã°ã«å¯Ÿå¿ããå€ãæå
¥ããããšãã§ããŸãã ãããã³ã°ã«ã€ããŠã¯åŸã»ã©ãã 2. LogstashããElasticsearchã«ããŒã¿ãå å·¥ãæå
¥ãã Logstashã§ããŒã¿ãå å·¥ããŠæäœããããšãã§ããŸãããæ¬¡ã«å å·¥ããããŒã¿ãElasticsearchåŽã«æå
¥ããŠããæºåãããŸãã Logstashã«ã¯ããŒã¿ãæ±ãããã®APIãããã©ã«ãã§æ§ã
ãªãã¡ã€ã«åœ¢åŒããµãŒãã¹ã«å¯ŸããŠæ±ãããšãã§ããŸãã https://www.elastic.co/guide/en/logstash/current/input-plugins.html ä»åã¯CSV圢åŒã®ãã¡ã€ã«ã§LogstashããElasticsearchåŽã«ããŒã¿ãéãæºåãããŸããã ååæ
å ±ãå
¥ã£ã product.csv ãšããcsvãäºåã«çšæããŸãã äžèº«ã¯ id, title, description, manufacturer, priceã®ã»ã«ã®åãæã£ãããŒã¿ãçšæããŸãã logstash.confã以äžã®ããã«ç·šéããŸã // fileAPIã䜿ã£ãŠpathã®csvãæå®ããŸãã // èµ·åããã¿ã€ãã³ã°ã§èªã¿èŸŒã¿ããã®ã§begining (ããã©ã«ãã¯end) // ã©ããŸã§æå
¥ã§ãããã©ãããèŠããŠãããã°ãåãåºããã¹(ä»åã¯èšå®ããªã) input { file { path => "~/Desktop/products.csv" start_position => "beginning" sincedb_path => "/dev/null" } } // ã,ãã§ããããããšããã§ã«ã©ã ã«ã¯äžåç®ã®ã»ã«ã®ååãå
¥ããŸã // mutateã§ã«ã©ã ã®åã®ã¿ã€ããæå®ããããå å·¥ãããããã£ãŒã«ãã«å
¥ãããŒã¿ãå¶åŸ¡ãããããããšãã§ããŸãã // ä»åã¯å¿
èŠãªãfieldãæããŠå¯Ÿå¿ããŠããŸãã filter { csv { separator => "," columns => ["id","title","description","manufacturer","price"] } mutate { remove_field => ["@version","path","host", "tags", "message"] } } // ããŒã«ã«ã®9200ããŒãã§elasticsearchãèµ·åããŠããã®ã§hostsãåããŸã // indexã«ã¯RDBMSã§ããDBåãæå®ã // document_typeã«ã¯RDBMSã§ããããŒãã«åãæå®ããŸã output { elasticsearch { hosts => "http://localhost:9200" index => "wp_products" document_type => "products" } stdout {} } äžèšã®èšå®ãã§ãããããŒã¿ãæå
¥ããŠãããŸãããïŒ å
ã»ã©ãšåãããã«logstash.confã®èšå®ãå
ã«logstashãèµ·åããŠãããŸãã $ /usr/local/bin/logstash -f logstash.conf ãããšããããã®ããŒã¿ãæå
¥ãããŠããããšãããããŸãã èšäºã§ã¯äžéšããŒã¿ãæå
¥ãããŠãããšãããèšèŒããŠãããŸãã ~~äžç¥~~ { "title" => "kensington contour pro 17 notebook carrying case (62340)", "manufacturer" => "kensington", "price" => "89.99", "id" => "b0000dbmhr", "@timestamp" => 2018-06-17T10:38:45.141Z, "description" => "kensington 62340a contour pro 17 notebook carrying case - the contour pro 17 offers premium protection and exceptional comfort in one outstanding case. not only does its snugfit? protection system keep your notebook computer safe its contour panel and weight distribution system helps reduce weight impact by 35% so the case feels lighter. shock-absorbing contour shoulder strap is secure and comfortable convenient compartment for on-the-go access to aircraft tickets et al 1680 denier ballistic nylon protects against abrasions punctures and tears front pockets laid out for easy organization and access padded rear compartment keeps peripherals from poking through contour pro 17 notebook carrying case is backed by the kensington lifetime warranty." } { "title" => "now up-to-date & contact v5.0 (mac)", "manufacturer" => "now software", "price" => "0", "id" => "b000a7q6n8", "@timestamp" => 2018-06-17T10:38:45.142Z, "description" => "now up-to-date & contact is the only solution that addresses all of the problems that businesses and power users face. productivity is a lot like the weather. everyone talks about it but nobody does anything about it. staying organized is a continual struggle for most people. now you can manage all your appointments contacts notes and information. it's the solution for your busy modern life. best of all it's fully cross-platform -- it doesn't matter if you use macs or windows it looks and acts the same on both. professional rapid response via online support system automated faq and free email support" } ~~äžç¥~~ æå
¥ãçµããæ¬¡ç¬¬Elasticsearchã§ããŒã¿ãã§ããŠãããã®ç¢ºèªãããŸãã curl -XGET "http://localhost:9200/wp_products/products/_search?pretty" ãããšçŽ1363ä»¶ã®ããŒã¿ãå
¥ã£ãŠããããšã確èªã§ããŸãã { "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1363, "max_score" : 1.0, "hits" : [ { "_index" : "wp_products", "_type" : "products", "_id" : "cwtMDWQBLzsARdUAhfb1", "_score" : 1.0, "_source" : { "title" : "clickart 950 000 - premier image pack (dvd-rom)", "price" : "0", "id" : "b000jz4hqo", "description" : null, "manufacturer" : "broderbund" } }, 確èªã§ãããKibanaã§ããŒã¿ãå¯èŠåããŠãããŸããã 3. Kibanaã§Elasticsearchã§æå
¥ããããŒã¿ãå¯èŠåãã ããã§ã¯Kibanaã§ããŒã¿ãå¯èŠåããŠãããŸããã(5601ããŒãã§Kibanaãèµ·åããŠããŸã) å
ã»ã©è¿œå ããindexã®ãwp_productsããManagementããŒããindex_patternsã«è¿œå ããŠãããŸãã 远å ãã§ããããµã€ãããŒã®Discoverãããwp_productsãã®ã€ã³ããã¯ã¹ãç»é²ãããŠããããšãããããŸãã ç»é²ã確èªã§ãããæ©éããžã¥ã¢ã©ã€ãºããŠãããŸããã ãµã€ãããŒã®VisualizeãæŒããŠããžã¥ã¢ã©ã€ãºãããå³ã»è¡šãéžæããŸãã ä»åã¯Pieãã£ãŒããéžæããŸãã éžæãããPieãã£ãŒãã衚瀺ãããŠããããšãããããŸãã ãã®Pieãã£ãŒãã«æ¡ä»¶ãã€ããŠãããŸãã Priceã®ç¯å²(range)ã§åããŠã¿ãã Bucketsã®split sliceããRangeã§ã°ã«ãŒãã³ã°ããŠå¯Ÿè±¡ãã£ãŒã«ãããPriceãã«ãç¯å²ãèšå®ããŸãã ãããšãã®ããã«Pieã«è²ãã€ãããšãããããŸãã Priceã«å¯ŸããŠã©ã®ãããªååãããã®ãTermsã§IDã䜿ã£ãŠå¯èŠåããŠã¿ãŸã å
ã»ã©ã®rangeã«è¿œå ã§ååID(Terms)ã远å ããŠorderã§ä»¶æ°ãæå®ããŠå®è¡ããŠã¿ãŸããã ã©ã®ãããªååãå
¥ã£ãŠãããããžã¥ã¢ã©ã€ãºã§ããããšãããããŸãã ãã®ããã«æ§ã
ãªæ¡ä»¶ã§å³ã»è¡šãããžã¥ã¢ã©ã€ãºåããããã·ã¥ããŒããäœæããããšãã§ããŸãã x-packã®Kibana Canvasãçšãããšãªã¢ã«ã¿ã€ã ã§ããã·ã¥ããŒããæŽæ°ãããŠãããããã¡ããä»åŸã¯è§Šã£ãŠã¿ããã§ãã 以äžã§ELKã®æµããç¥ãããšãã§ããŸããã è£è¶³(ãããã³ã°ã«ã€ããŠ) LogstashããElasticsearchåŽã«ããŒã¿ãæå
¥ããéã«ElasticsearchåŽã§ã¯äœãããã«ããŒã¿ãæå
¥ããŸããã ããããå®éã®æ¥åã«äœ¿ãã«ã¯ãããå±éºã§ãã ãšããã®ã wp_products ã®ãããã³ã°ãšåŒã°ãã(RDBMSã§ããããŒãã«èšèš)ãäºåã«å®çŸ©ããŠãããªããšæåŸ
ããæåãããŠãããªãããšãããããã§ãã ä»åã®ããŒã¿ã§ãããšpriceãåœãŠã¯ãŸããŸãã ä»åpriceã«ã¯ãã«ã®åäœã®å°æ°ç¹ãå«ãã æ°åãå
¥ããŸãã å®éã«ãããã³ã°ãå®çŸ©ããªãã§æå
¥ãããããã³ã°ãã¿ãŠã¿ãŸãã $ curl -XGET "http://localhost:9200/wp_products/_mapping?pretty" "wp_products" : { "mappings" : { "products" : { "properties" : { "@timestamp" : { "type" : "date" }, ~~ äžç¥ ~~ "price" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, ~~ äžç¥ ~~ } } ãããšpriceãã£ãŒã«ãã®åãtextã«ãªã£ãŠããããšãããããŸãã ããã§ã¯æ€çŽ¢ã¯ãšãªã§priceã®rangeãçµã£ãå Žåã«æå³ããªãæåãæããããŸããã ããããäºæ
ã«ãªããªãããã«ãäºåã«ããŒãã«å®çŸ©ã®ããã«ãããã³ã°ãäœãå¿
èŠããããŸãã å°æ°ç¹ãã€ããããã³ã°ã«ã¯priceã«å¯ŸããŠfloatã®åãæå®ããŠãããå¿
èŠããããŸãã ä»åã¯mappingã«å¯ŸããŠæ°ãã远å ãããå scaled_float ãæå®ããŠããŸãã ããã¯floatã§å
¥ã£ãããŒã¿ã«å¯ŸããŠscaling_factorã«èšè¿°ããŠãã100ãæãåãããããšã§ æŽæ°å€integerã«å€æŽããããã«ããŠããŸããããã«ãã£ãŠã³ã³ãã¥ãŒã¿ãfloatã«ãããæ€çŽ¢åŠçæéãççž®ã ãã€disk容éãæžãããããšãã§ããã®ã§æ€çŽ¢æã«ãããã©ãŒãã³ã¹ããããªãããã§ãã { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "products": { "properties": { "id": { "type": "keyword" }, "title": { "type": "text" }, "description": { "type": "text" }, "manufacturer": { "type": "text", "fields": { "raw": { "type": "keyword" } } }, "price": { "type": "scaled_float", "scaling_factor": 100 } } } } } ãŸãšã ãããã§ãããïŒä»åã¯ElasticStack6ã®ELKã®åºæ¬æäœã®å
¥éãããŸããã ããã°ã©ãã³ã°çèŠçŽ ã¯å€ããªãããšã£ããããããçè§£ãããããå°è±¡ã§ããã ElasticStack補åã¯èšå®ãããªã现ããã§ã仿§ãæ·±ãããŒãžã§ã³ã¢ããã®é »åºŠãé«ããã ã©ããªããŒã¿ã«å¯ŸããŠã察å¿çãããªãããè¯ãåé¢ãç¥ã£ãŠããªããšäœ¿ããªãããŒã«ãªã®ã§ããã¥ã¡ã³ããéããŠä»åŸãåŠãã§ã¢ãŠããããããŠããããã§ãã ãã®åºŠã¯ããæž
芧é ãããããšãããããŸããã Wedding Parkã§ã¯äžç·ã«æè¡ã®ãŠãšãã£ã³ã°ããŒã¯ãåµã£ãŠãããšã³ãžãã¢ãåéããŠããŸãã èå³ã®ããæ¹ã¯ãã²äžåºŠæ°è»œã«ãªãã£ã¹ã«éã³ã«ããããŠé ããã°ãšæããŸãã ãã©ã€ãã«æ¥çã®ããžã¿ã«ã·ãããå éããããªãŒããšã³ãžãã¢åè£åéïŒ