Amazon Athena เช…เชจเซ‡ Cube.js เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Nginx เชฒเซ‹เช— เชเชจเชพเชฒเชฟเชŸเชฟเช•เซเชธ

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชตเซเชฏเชพเชชเชพเชฐเซ€ เช‰เชคเซเชชเชพเชฆเชจเซ‹ เช…เชฅเชตเชพ เชคเซˆเชฏเชพเชฐ เช“เชชเชจ-เชธเซ‹เชฐเซเชธ เชตเชฟเช•เชฒเซเชชเซ‹, เชœเซ‡เชฎ เช•เซ‡ เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ + เช—เซเชฐเชพเชซเชจเชพ, เชจเซ‹ เช‰เชชเชฏเซ‹เช— Nginx เชจเซ€ เช•เชพเชฎเช—เซ€เชฐเซ€เชจเซเช‚ เชจเชฟเชฐเซ€เช•เซเชทเชฃ เช…เชจเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡. เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช— เช…เชฅเชตเชพ เชฐเซ€เช…เชฒ-เชŸเชพเช‡เชฎ เชเชจเชพเชฒเชฟเชŸเชฟเช•เซเชธ เชฎเชพเชŸเซ‡ เช† เชเช• เชธเชพเชฐเซ‹ เชตเชฟเช•เชฒเซเชช เช›เซ‡, เชชเชฐเช‚เชคเซ เชเชคเชฟเชนเชพเชธเชฟเช• เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชฎเชพเชŸเซ‡ เช–เซ‚เชฌ เช…เชจเซเช•เซ‚เชณ เชจเชฅเซ€. เช•เซ‹เชˆเชชเชฃ เชฒเซ‹เช•เชชเซเชฐเชฟเชฏ เชธเช‚เชธเชพเชงเชจ เชชเชฐ, nginx เชฒเซ‰เช—เซเชธเชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพเชจเซ€ เชฎเชพเชคเซเชฐเชพ เชเชกเชชเชฅเซ€ เชตเชงเซ€ เชฐเชนเซ€ เช›เซ‡, เช…เชจเซ‡ เชฎเซ‹เชŸเซ€ เชฎเชพเชคเซเชฐเชพเชฎเชพเช‚ เชกเซ‡เชŸเชพเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชตเชงเซ เชตเชฟเชถเชฟเชทเซเชŸ เช•เช‚เชˆเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชคเซ‡ เชคเชพเชฐเซเช•เชฟเช• เช›เซ‡.

เช† เชฒเซ‡เช–เชฎเชพเช‚ เชนเซเช‚ เชคเชฎเชจเซ‡ เช•เชนเซ€เชถ เช•เซ‡ เชคเชฎเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเซ€ เชถเช•เซ‹ เชเชฅเซ‡เชจเชพ เชฒเซ‰เช—เซเชธเชจเซเช‚ เชชเซƒเชฅเซเชฅเช•เชฐเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, Nginx เชจเซ‡ เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ เชฒเชˆ, เช…เชจเซ‡ เชนเซเช‚ เช“เชชเชจ-เชธเซ‹เชฐเซเชธ cube.js เชซเซเชฐเซ‡เชฎเชตเชฐเซเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช† เชกเซ‡เชŸเชพเชฎเชพเช‚เชฅเซ€ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชพเชคเซเชฎเช• เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเซเช‚ เชคเซ‡ เชฌเชคเชพเชตเซ€เชถ. เช…เชนเซ€เช‚ เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเซ‹เชฒเซเชฏเซเชถเชจ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เช›เซ‡:

Amazon Athena เช…เชจเซ‡ Cube.js เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Nginx เชฒเซ‹เช— เชเชจเชพเชฒเชฟเชŸเชฟเช•เซเชธ

TL:DR;
เชซเชฟเชจเชฟเชถเซเชก เชกเซ‡เชถเชฌเซ‹เชฐเซเชกเชจเซ€ เชฒเชฟเช‚เช•.

เชฎเชพเชนเชฟเชคเซ€ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช เช…เชธเซเช–เชฒเชฟเชคเชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฎเชพเชŸเซ‡ - AWS Kinesis เชกเซ‡เชŸเชพ เชซเชพเชฏเชฐเชนเซ‹เช ะธ AWS เช—เซเช‚เชฆเชฐ, เชธเช‚เช—เซเชฐเชน เชฎเชพเชŸเซ‡ - AWS S3. เช† เชฌเช‚เชกเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชคเชฎเซ‡ เชฎเชพเชคเซเชฐ nginx เชฒเซ‰เช—เซเชธ เชœ เชจเชนเซ€เช‚, เชชเชฃ เช…เชจเซเชฏ เช‡เชตเซ‡เชจเซเชŸเซเชธ เชคเซ‡เชฎเชœ เช…เชจเซเชฏ เชธเซ‡เชตเชพเช“เชจเชพ เชฒเซ‰เช—เซเชธ เชชเชฃ เชธเซเชŸเซ‹เชฐ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เชธเซเชŸเซ‡เช• เชฎเชพเชŸเซ‡ เชธเชฎเชพเชจ เชญเชพเช—เซ‹ เชธเชพเชฅเซ‡ เช•เซ‡เชŸเชฒเชพเช• เชญเชพเช—เซ‹เชจเซ‡ เชฌเชฆเชฒเซ€ เชถเช•เซ‹ เช›เซ‹, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชคเชฎเซ‡ เชธเซ€เชงเชพ เชœ nginx เชฎเชพเช‚เชฅเซ€ เช•เชฟเชจเซ‡เชธเชฟเชธ เชชเชฐ เชฒเซ‹เช— เชฒเช–เซ€ เชถเช•เซ‹ เช›เซ‹, เชซเซเชฒเซเชเชจเซเชŸเชกเชจเซ‡ เชฌเชพเชฏเชชเชพเชธ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชฅเชตเชพ เช† เชฎเชพเชŸเซ‡ เชฒเซ‹เช—เชธเซเชŸเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

Nginx เชฒเซ‹เช— เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เชกเชฟเชซเซ‰เชฒเซเชŸ เชฐเซ‚เชชเซ‡, Nginx เชฒเซ‰เช— เช†เชจเชพ เชœเซ‡เชตเซ‹ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

4/9/2019 12:58:17 PM1.1.1.1 - - [09/Apr/2019:09:58:17 +0000] "GET /sign-up HTTP/2.0" 200 9168 "https://example.com/sign-in" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" "-"
4/9/2019 12:58:17 PM1.1.1.1 - - [09/Apr/2019:09:58:17 +0000] "GET /sign-in HTTP/2.0" 200 9168 "https://example.com/sign-up" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" "-"

เชคเซ‡เช“เชจเซเช‚ เชชเชฆเชšเซเช›เซ‡เชฆเชจ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ Nginx เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡ เช–เซ‚เชฌ เชธเชฐเชณ เช›เซ‡ เชœเซ‡เชฅเซ€ เชคเซ‡ JSON เชฎเชพเช‚ เชฒเซ‹เช— เช‰เชคเซเชชเชจเซเชจ เช•เชฐเซ‡:

log_format json_combined escape=json '{ "created_at": "$msec", '
            '"remote_addr": "$remote_addr", '
            '"remote_user": "$remote_user", '
            '"request": "$request", '
            '"status": $status, '
            '"bytes_sent": $bytes_sent, '
            '"request_length": $request_length, '
            '"request_time": $request_time, '
            '"http_referrer": "$http_referer", '
            '"http_x_forwarded_for": "$http_x_forwarded_for", '
            '"http_user_agent": "$http_user_agent" }';

access_log  /var/log/nginx/access.log  json_combined;

เชธเซเชŸเซ‹เชฐเซ‡เชœ เชฎเชพเชŸเซ‡ S3

เชฒเซ‹เช— เชธเซเชŸเซ‹เชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ S3 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚. เช† เชคเชฎเชจเซ‡ เชเช• เชœ เชœเช—เซเชฏเชพเช เชฒเซ‹เช— เชธเซเชŸเซ‹เชฐ เช•เชฐเชตเชพ เช…เชจเซ‡ เชคเซ‡เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชเชฅเซ‡เชจเชพ เชธเซ€เชงเชพ S3 เชฎเชพเช‚ เชกเซ‡เชŸเชพ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เชฒเซ‡เช–เชฎเชพเช‚ เชชเช›เซ€เชฅเซ€ เชนเซเช‚ เชคเชฎเชจเซ‡ เช•เชนเซ€เชถ เช•เซ‡ เชฒเซ‰เช—เซเชธเชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช‰เชฎเซ‡เชฐเชตเซเช‚ เช…เชจเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเซ€, เชชเชฐเช‚เชคเซ เชชเชนเซ‡เชฒเชพ เช…เชฎเชจเซ‡ S3 เชฎเชพเช‚ เชธเซเชตเชšเซเช› เชฌเช•เซ‡เชŸเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชœเซ‡เชฎเชพเช‚ เชฌเซ€เชœเซเช‚ เช•เช‚เชˆ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชจเชนเซ€เช‚. เชคเชฎเซ‡ เช•เชฏเชพ เชชเซเชฐเชฆเซ‡เชถเชฎเชพเช‚ เชคเชฎเชพเชฐเซ€ เชฌเช•เซ‡เชŸ เชฌเชจเชพเชตเชถเซ‹ เชคเซ‡ เช…เช—เชพเช‰เชฅเซ€ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชตเชพ เชฏเซ‹เช—เซเชฏ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชเชฅเซ‡เชจเชพ เชฌเชงเชพ เชชเซเชฐเชฆเซ‡เชถเซ‹เชฎเชพเช‚ เช‰เชชเชฒเชฌเซเชง เชจเชฅเซ€.

เชเชฅเซ‡เชจเชพ เช•เชจเซเชธเซ‹เชฒเชฎเชพเช‚ เชธเชฐเซเช•เชฟเชŸ เชฌเชจเชพเชตเชตเซ€

เชšเชพเชฒเซ‹ เชฒเซ‹เช— เชฎเชพเชŸเซ‡ เชเชฅเซ‡เชจเชพเชฎเชพเช‚ เชเช• เชŸเซ‡เชฌเชฒ เชฌเชจเชพเชตเซ€เช. เชœเซ‹ เชคเชฎเซ‡ เช•เชฟเชจเซ‡เชธเชฟเชธ เชซเชพเชฏเชฐเชนเซ‹เชเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชฏเซ‹เชœเชจเชพ เช˜เชกเซ€ เชฐเชนเซเชฏเชพ เชนเซ‹เชต เชคเซ‹ เชคเซ‡ เชฒเช–เชตเชพ เช…เชจเซ‡ เชตเชพเช‚เชšเชตเชพ เชฌเช‚เชจเซ‡ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เชเชฅเซ‡เชจเชพ เช•เชจเซเชธเซ‹เชฒ เช–เซ‹เชฒเซ‹ เช…เชจเซ‡ เชŸเซ‡เชฌเชฒ เชฌเชจเชพเชตเซ‹:

เชเชธเช•เซเชฏเซเชเชฒ เชŸเซ‡เชฌเชฒ เชฌเชจเชพเชตเชŸ

CREATE EXTERNAL TABLE `kinesis_logs_nginx`(
  `created_at` double, 
  `remote_addr` string, 
  `remote_user` string, 
  `request` string, 
  `status` int, 
  `bytes_sent` int, 
  `request_length` int, 
  `request_time` double, 
  `http_referrer` string, 
  `http_x_forwarded_for` string, 
  `http_user_agent` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
  's3://<YOUR-S3-BUCKET>'
TBLPROPERTIES ('has_encrypted_data'='false');

เช•เชฟเชจเซ‡เชธเชฟเชธ เชซเชพเชฏเชฐเชนเซ‹เช เชธเซเชŸเซเชฐเซ€เชฎ เชฌเชจเชพเชตเชตเซ€

Kinesis Firehose เชชเชธเช‚เชฆ เช•เชฐเซ‡เชฒเชพ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ Nginx เชฅเซ€ S3 เชชเชฐ เชชเซเชฐเชพเชชเซเชค เชกเซ‡เชŸเชพ เชฒเช–เชถเซ‡, เชคเซ‡เชจเซ‡ YYYY/MM/DD/HH เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เช“เชฎเชพเช‚ เชตเชฟเชญเชพเชœเซ€เชค เช•เชฐเชถเซ‡. เชกเซ‡เชŸเชพ เชตเชพเช‚เชšเชคเซ€ เชตเช–เชคเซ‡ เช† เช•เชพเชฎเชฎเชพเช‚ เช†เชตเชถเซ‡. เชคเชฎเซ‡, เช…เชฒเชฌเชคเซเชค, fluentd เชฅเซ€ เชธเซ€เชงเชพ S3 เชชเชฐ เชฒเช–เซ€ เชถเช•เซ‹ เช›เซ‹, เชชเชฐเช‚เชคเซ เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชคเชฎเชพเชฐเซ‡ JSON เชฒเช–เชตเซเช‚ เชชเชกเชถเซ‡, เช…เชจเซ‡ เชซเชพเช‡เชฒเซ‹เชจเชพ เชฎเซ‹เชŸเชพ เช•เชฆเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช† เชฌเชฟเชจเช•เชพเชฐเซเชฏเช•เซเชทเชฎ เช›เซ‡. เชตเชงเซเชฎเชพเช‚, PrestoDB เช…เชฅเชตเชพ Athena เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, JSON เช เชธเซŒเชฅเซ€ เชงเซ€เชฎเซเช‚ เชกเซ‡เชŸเชพ เชซเซ‹เชฐเซเชฎเซ‡เชŸ เช›เซ‡. เชคเซ‡เชฅเซ€ Kinesis Firehose เช•เชจเซเชธเซ‹เชฒ เช–เซ‹เชฒเซ‹, "เชกเชฟเชฒเชฟเชตเชฐเซ€ เชธเซเชŸเซเชฐเซ€เชฎ เชฌเชจเชพเชตเซ‹" เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซ‹, "เชกเชฟเชฒเชฟเชตเชฐเซ€" เชซเซ€เชฒเซเชกเชฎเชพเช‚ "เชกเชพเชฏเชฐเซ‡เช•เซเชŸ PUT" เชชเชธเช‚เชฆ เช•เชฐเซ‹:

Amazon Athena เช…เชจเซ‡ Cube.js เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Nginx เชฒเซ‹เช— เชเชจเชพเชฒเชฟเชŸเชฟเช•เซเชธ

เช†เช—เชฒเชพ เชŸเซ…เชฌเชฎเชพเช‚, "เชฐเซ‡เช•เซ‹เชฐเซเชก เชซเซ‹เชฐเซเชฎเซ‡เชŸ เช•เชจเซเชตเชฐเซเชเชจ" - "เชธเช•เซเชทเชฎ" เชชเชธเช‚เชฆ เช•เชฐเซ‹ เช…เชจเซ‡ เชฐเซ‡เช•เซ‹เชฐเซเชกเชฟเช‚เช— เชซเซ‹เชฐเซเชฎเซ‡เชŸ เชคเชฐเซ€เช•เซ‡ "Apache ORC" เชชเชธเช‚เชฆ เช•เชฐเซ‹. เช•เซ‡เชŸเชฒเชพเช• เชธเช‚เชถเซ‹เชงเชจ เชฎเซเชœเชฌ เช“เชตเซ‡เชจ เช“'เชฎเซ‡เชฒเซ€, เช† PrestoDB เช…เชจเซ‡ Athena เชฎเชพเชŸเซ‡ เชถเซเชฐเซ‡เชทเซเช  เชซเซ‹เชฐเซเชฎเซ‡เชŸ เช›เซ‡. เช…เชฎเซ‡ เช‰เชชเชฐ เชฌเชจเชพเชตเซ‡เชฒ เช•เซ‹เชทเซเชŸเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชธเซเช•เซ€เชฎเชพ เชคเชฐเซ€เช•เซ‡ เช•เชฐเซ€เช เช›เซ€เช. เชฎเชนเซ‡เชฐเชฌเชพเชจเซ€ เช•เชฐเซ€เชจเซ‡ เชจเซ‹เช‚เชง เช•เชฐเซ‹ เช•เซ‡ เชคเชฎเซ‡ เช•เชฟเชจเซ‡เชธเชฟเชธเชฎเชพเช‚ เช•เซ‹เชˆเชชเชฃ S3 เชธเซเชฅเชพเชจเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹; เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚เชฅเซ€ เชซเช•เซเชค เชธเซเช•เซ€เชฎเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชชเชฐเช‚เชคเซ เชœเซ‹ เชคเชฎเซ‡ เช…เชฒเช— S3 เชธเซเชฅเชพเชจเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ‹ เช›เซ‹, เชคเซ‹ เชชเช›เซ€ เชคเชฎเซ‡ เช† เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚เชฅเซ€ เช† เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ เชตเชพเช‚เชšเซ€ เชถเช•เชถเซ‹ เชจเชนเซ€เช‚.

Amazon Athena เช…เชจเซ‡ Cube.js เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Nginx เชฒเซ‹เช— เชเชจเชพเชฒเชฟเชŸเชฟเช•เซเชธ

เช…เชฎเซ‡ เชธเซเชŸเซ‹เชฐเซ‡เชœ เชฎเชพเชŸเซ‡ S3 เชชเชธเช‚เชฆ เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เช…เชฎเซ‡ เช…เช—เชพเช‰ เชฌเชจเชพเชตเซ‡เชฒ เชฌเช•เซ‡เชŸ. Aws Glue Crawler, เชœเซ‡เชจเชพ เชตเชฟเชถเซ‡ เชนเซเช‚ เชฅเซ‹เชกเซ€ เชตเชพเชฐ เชชเช›เซ€ เชตเชพเชค เช•เชฐเซ€เชถ, S3 เชฌเช•เซ‡เชŸเชฎเชพเช‚ เช‰เชชเชธเชฐเซเช— เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซ€ เชถเช•เชคเซเช‚ เชจเชฅเซ€, เชคเซ‡เชฅเซ€ เชคเซ‡เชจเซ‡ เช–เชพเชฒเซ€ เช›เซ‹เชกเชตเซเช‚ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช›เซ‡.

Amazon Athena เช…เชจเซ‡ Cube.js เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Nginx เชฒเซ‹เช— เชเชจเชพเชฒเชฟเชŸเชฟเช•เซเชธ

เชฌเชพเช•เซ€เชจเชพ เชตเชฟเช•เชฒเซเชชเซ‹ เชคเชฎเชพเชฐเชพ เชฒเซ‹เชกเชจเชพ เช†เชงเชพเชฐเซ‡ เชฌเชฆเชฒเซ€ เชถเช•เชพเชฏ เช›เซ‡; เชนเซเช‚ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชกเชฟเชซเซ‹เชฒเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเช‚ เช›เซเช‚. เชจเซ‹เช‚เชง เช•เชฐเซ‹ เช•เซ‡ S3 เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ เช‰เชชเชฒเชฌเซเชง เชจเชฅเซ€, เชชเชฐเช‚เชคเซ ORC เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡ เชฎเซ‚เชณ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡.

เช…เชธเซเช–เชฒเชฟเชค

เชนเชตเซ‡ เชœเซเชฏเชพเชฐเซ‡ เช…เชฎเซ‡ เชฒเซ‹เช—เซเชธ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เช…เชจเซ‡ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เช•เชฐเซเชฏเซเช‚ เช›เซ‡, เชคเซ‹ เช…เชฎเชพเชฐเซ‡ เชฎเซ‹เช•เชฒเชตเชพเชจเซเช‚ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช…เชฎเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚ เช…เชธเซเช–เชฒเชฟเชค, เช•เชพเชฐเชฃ เช•เซ‡ เชนเซเช‚ เชฐเซ‚เชฌเซ€เชจเซ‡ เชชเซเชฐเซ‡เชฎ เช•เชฐเซเช‚ เช›เซเช‚, เชชเชฐเช‚เชคเซ เชคเชฎเซ‡ เชฒเซ‹เช—เชธเซเชŸเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชฅเชตเชพ เชธเซ€เชงเชพ เช•เชพเช‡เชจเซ‡เชธเชฟเชธเชจเซ‡ เชฒเซ‹เช— เชฎเซ‹เช•เชฒเซ€ เชถเช•เซ‹ เช›เซ‹. Fluentd เชธเชฐเซเชตเชฐ เช˜เชฃเซ€ เชฐเซ€เชคเซ‡ เชฒเซ‹เชจเซเชš เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชนเซเช‚ เชคเชฎเชจเซ‡ เชกเซ‹เช•เชฐ เชตเชฟเชถเซ‡ เช•เชนเซ€เชถ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชธเชฐเชณ เช…เชจเซ‡ เช…เชจเซเช•เซ‚เชณ เช›เซ‡.

เชชเซเชฐเชฅเชฎ, เช†เชชเชฃเชจเซ‡ fluent.conf เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชคเซ‡เชจเซ‡ เชฌเชจเชพเชตเซ‹ เช…เชจเซ‡ เชธเซเชคเซเชฐเซ‹เชค เช‰เชฎเซ‡เชฐเซ‹:

เชชเซเชฐเช•เชพเชฐ เชซเซ‹เชฐเชตเชฐเซเชก
24224 เชฌเช‚เชฆเชฐ
เชฌเชพเช‚เชงเซ‹ 0.0.0.0

เชนเชตเซ‡ เชคเชฎเซ‡ Fluentd เชธเชฐเซเชตเชฐ เชถเชฐเซ‚ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชœเซ‹ เชคเชฎเชจเซ‡ เชตเชงเซ เช…เชฆเซเชฏเชคเชจ เช—เซ‹เช เชตเชฃเซ€เชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เชคเซ‹ เชชเชฐ เชœเชพเช“ เชกเซ‹เช•เชฐ เชนเชฌ เชคเชฎเชพเชฐเซ€ เช›เชฌเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเซ€ เชคเซ‡ เชธเชนเชฟเชค เชตเชฟเช—เชคเชตเชพเชฐ เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชฟเช•เชพ เช›เซ‡.

$ docker run 
  -d 
  -p 24224:24224 
  -p 24224:24224/udp 
  -v /data:/fluentd/log 
  -v <PATH-TO-FLUENT-CONF>:/fluentd/etc fluentd 
  -c /fluentd/etc/fluent.conf
  fluent/fluentd:stable

เช† เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชชเชพเชฅเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ /fluentd/log เชฎเซ‹เช•เชฒเชคเชพ เชชเชนเซ‡เชฒเชพ เชฒเซ‹เช— เช•เซ‡เชถ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡. เชคเชฎเซ‡ เช† เชตเชฟเชจเชพ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เชชเชฐเช‚เชคเซ เชชเช›เซ€ เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชชเซเชจเชƒเชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเซ‹ เช›เซ‹, เชคเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชฌเซ‡เช•-เชฌเซเชฐเซ‡เช•เชฟเช‚เช— เชฒเซ‡เชฌเชฐ เชธเชพเชฅเซ‡ เช•เซ‡เชถเซเชก เชฌเชงเซเช‚ เช—เซเชฎเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹. เชคเชฎเซ‡ เช•เซ‹เชˆเชชเชฃ เชชเซ‹เชฐเซเชŸเชจเซ‹ เชชเชฃ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹; 24224 เช เชกเชฟเชซเซ‹เชฒเซเชŸ เชซเซเชฒเซเชเชจเซเชŸ เชชเซ‹เชฐเซเชŸ เช›เซ‡.

เชนเชตเซ‡ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ Fluentd เชšเชพเชฒเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡, เช…เชฎเซ‡ เชคเซเชฏเชพเช‚ Nginx เชฒเซ‹เช— เชฎเซ‹เช•เชฒเซ€ เชถเช•เซ€เช เช›เซ€เช. เช…เชฎเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชกเซ‹เช•เชฐ เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ Nginx เชšเชฒเชพเชตเซ€เช เช›เซ€เช, เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ Docker เชชเชพเชธเซ‡ Fluentd เชฎเชพเชŸเซ‡ เชฎเซ‚เชณ เชฒเซ‹เช—เชฟเช‚เช— เชกเซเชฐเชพเช‡เชตเชฐ เช›เซ‡:

$ docker run 
--log-driver=fluentd 
--log-opt fluentd-address=<FLUENTD-SERVER-ADDRESS>
--log-opt tag="{{.Name}}" 
-v /some/content:/usr/share/nginx/html:ro 
-d 
nginx

เชœเซ‹ เชคเชฎเซ‡ Nginx เช…เชฒเช— เชฐเซ€เชคเซ‡ เชšเชฒเชพเชตเซ‹ เช›เซ‹, เชคเซ‹ เชคเชฎเซ‡ เชฒเซ‹เช— เชซเชพเช‡เชฒเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, Fluentd เชชเชพเชธเซ‡ เช›เซ‡ เชซเชพเช‡เชฒ เชชเซ‚เช‚เช›เชกเซ€ เชชเซเชฒเช—เช‡เชจ.

เชšเชพเชฒเซ‹ เช‰เชชเชฐ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เช•เชฐเซ‡เชฒ เชฒเซ‹เช— เชชเชพเชฐเซเชธเชฟเช‚เช—เชจเซ‡ เชซเซเชฒเซเช…เชจเซเชŸ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ€เช:

<filter YOUR-NGINX-TAG.*>
  @type parser
  key_name log
  emit_invalid_record_to_error false
  <parse>
    @type json
  </parse>
</filter>

เช…เชจเซ‡ Kinesis เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฒเซ‹เช— เชฎเซ‹เช•เชฒเซ€ เชฐเชนเซเชฏเชพ เช›เซ‡ เช•เชฟเชจเซ‡เชธเชฟเชธ เชซเชพเชฏเชฐเชนเซ‹เช เชชเซเชฒเช—เช‡เชจ:

<match YOUR-NGINX-TAG.*>
    @type kinesis_firehose
    region region
    delivery_stream_name <YOUR-KINESIS-STREAM-NAME>
    aws_key_id <YOUR-AWS-KEY-ID>
    aws_sec_key <YOUR_AWS-SEC_KEY>
</match>

เชเชฅเซ‡เชจเชพ

เชœเซ‹ เชคเชฎเซ‡ เชฌเชงเซเช‚ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเซเชฏเซเช‚ เชนเซ‹เชฏ, เชคเซ‹ เชชเช›เซ€ เชฅเซ‹เชกเชพ เชธเชฎเชฏ เชชเช›เซ€ (เชกเชฟเชซเซ‰เชฒเซเชŸ เชฐเซ‚เชชเซ‡, เช•เชฟเชจเซ‡เชธเชฟเชธ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ เชฆเชฐ 10 เชฎเชฟเชจเชฟเชŸเชฎเชพเช‚ เชเช•เชตเชพเชฐ เชกเซ‡เชŸเชพ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซ‡ เช›เซ‡) เชคเชฎเชพเชฐเซ‡ S3 เชฎเชพเช‚ เชฒเซ‹เช— เชซเชพเช‡เชฒเซ‹ เชœเซ‹เชตเซ€ เชœเซ‹เชˆเช. เช•เชฟเชจเซ‡เชธเชฟเชธ เชซเชพเชฏเชฐเชนเซ‹เชเชจเชพ "เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช—" เชฎเซ‡เชจเซ‚เชฎเชพเช‚ เชคเชฎเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹ เช•เซ‡ S3 เชฎเชพเช‚ เช•เซ‡เชŸเชฒเซ‹ เชกเซ‡เชŸเชพ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡, เชคเซ‡เชฎเชœ เชญเซ‚เชฒเซ‹. Kinesis เชญเซ‚เชฎเชฟเช•เชพ เชฎเชพเชŸเซ‡ S3 เชฌเช•เซ‡เชŸเชฎเชพเช‚ เชฒเช–เชตเชพเชจเซ€ เชเช•เซเชธเซ‡เชธ เช†เชชเชตเชพเชจเซเช‚ เชญเซ‚เชฒเชถเซ‹ เชจเชนเซ€เช‚. เชœเซ‹ Kinesis เช•เช‚เชˆเช• เชชเชพเชฐเซเชธ เช•เชฐเซ€ เชถเช•เชคเซเช‚ เชจเชฅเซ€, เชคเซ‹ เชคเซ‡ เชธเชฎเชพเชจ เชฌเช•เซ‡เชŸเชฎเชพเช‚ เชญเซ‚เชฒเซ‹ เช‰เชฎเซ‡เชฐเชถเซ‡.

เชนเชตเซ‡ เชคเชฎเซ‡ เชเชฅเซ‡เชจเชพเชฎเชพเช‚ เชกเซ‡เชŸเชพ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹. เชšเชพเชฒเซ‹ เชจเชตเซ€เชจเชคเชฎ เชตเชฟเชจเช‚เชคเซ€เช“ เชถเซ‹เชงเซ€เช เช•เซ‡ เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เชญเซ‚เชฒเซ‹ เชชเชฐเชค เช•เชฐเซ€ เช›เซ‡:

SELECT * FROM "db_name"."table_name" WHERE status > 499 ORDER BY created_at DESC limit 10;

เชฆเชฐเซ‡เช• เชตเชฟเชจเช‚เชคเซ€ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฎ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ เชธเซเช•เซ‡เชจ เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ‡

เชนเชตเซ‡ เช…เชฎเชพเชฐเชพ เชฒเซ‹เช— เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡ เช…เชจเซ‡ ORC เชฎเชพเช‚ S3 เชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡, เชธเช‚เช•เซเชšเชฟเชค เช…เชจเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ เช›เซ‡. เช•เชฟเชจเซ‡เชธเชฟเชธ เชซเชพเชฏเชฐเชนเซ‹เชเซ‡ เชคเซ‡เชฎเชจเซ‡ เชฆเชฐเซ‡เช• เช•เชฒเชพเช• เชฎเชพเชŸเซ‡ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เช“เชฎเชพเช‚ เช—เซ‹เช เชตเซเชฏเชพ. เชœเซ‹ เช•เซ‡, เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เช•เซ‹เชทเซเชŸเช•เชจเซเช‚ เชตเชฟเชญเชพเชœเชจ เชจ เชฅเชพเชฏ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€, เชเชฅเซ‡เชจเชพ เชฆเซเชฐเซเชฒเชญ เช…เชชเชตเชพเชฆเซ‹ เชธเชพเชฅเซ‡, เชฆเชฐเซ‡เช• เชตเชฟเชจเช‚เชคเซ€ เชชเชฐ เชคเชฎเชพเชฎ เชธเชฎเชฏเชจเซ‹ เชกเซ‡เชŸเชพ เชฒเซ‹เชก เช•เชฐเชถเซ‡. เช† เชฌเซ‡ เช•เชพเชฐเชฃเซ‹เชธเชฐ เชฎเซ‹เชŸเซ€ เชธเชฎเชธเซเชฏเชพ เช›เซ‡:

  • เชกเซ‡เชŸเชพเชจเซ€ เชฎเชพเชคเซเชฐเชพ เชธเชคเชค เชตเชงเซ€ เชฐเชนเซ€ เช›เซ‡, เช•เซเชตเซ‡เชฐเซ€เชเชจเซ‡ เชงเซ€เชฎเซเช‚ เช•เชฐเซ€ เชฐเชนเซ€ เช›เซ‡;
  • เชเชฅเซ‡เชจเชพเชจเซเช‚ เชฌเชฟเชฒ เชธเซเช•เซ‡เชจ เช•เชฐเซ‡เชฒเชพ เชกเซ‡เชŸเชพเชจเชพ เชœเชฅเซเชฅเชพเชจเชพ เช†เชงเชพเชฐเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชตเชฟเชจเช‚เชคเซ€ เชฆเซ€เช  เช“เช›เชพเชฎเชพเช‚ เช“เช›เชพ 10 MB เชธเชพเชฅเซ‡.

เช†เชจเซ‡ เช เซ€เช• เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ AWS Glue Crawler เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช, เชœเซ‡ S3 เชฎเชพเช‚ เชกเซ‡เชŸเชพเชจเซ‡ เช•เซเชฐเซ‹เชฒ เช•เชฐเชถเซ‡ เช…เชจเซ‡ Glue Metastore เชชเชฐ เชชเชพเชฐเซเชŸเซ€เชถเชจเชจเซ€ เชฎเชพเชนเชฟเชคเซ€ เชฒเช–เชถเซ‡. เช† เช…เชฎเชจเซ‡ เชเชฅเซ‡เชจเชพเชจเซ‡ เช•เซเชตเซ‡เชฐเซ€ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชชเชพเชฐเซเชŸเซ€เชถเชจเซ‹เชจเซ‡ เชซเชฟเชฒเซเชŸเชฐ เชคเชฐเซ€เช•เซ‡ เชตเชพเชชเชฐเชตเชพ เชฆเซ‡เชถเซ‡, เช…เชจเซ‡ เชคเซ‡ เชซเช•เซเชค เช•เซเชตเซ‡เชฐเซ€เชฎเชพเช‚ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เช“ เชœ เชธเซเช•เซ‡เชจ เช•เชฐเชถเซ‡.

Amazon Glue Crawler เชธเซ‡เชŸเช…เชช เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

Amazon Glue Crawler S3 เชฌเช•เซ‡เชŸเชฎเชพเช‚เชจเชพ เชคเชฎเชพเชฎ เชกเซ‡เชŸเชพเชจเซ‡ เชธเซเช•เซ‡เชจ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเชพเชฐเซเชŸเซ€เชถเชจเซ‹ เชธเชพเชฅเซ‡ เช•เซ‹เชทเซเชŸเช•เซ‹ เชฌเชจเชพเชตเซ‡ เช›เซ‡. AWS Glue เช•เชจเซเชธเซ‹เชฒเชฎเชพเช‚เชฅเซ€ เช—เซเชฒเซ เช•เซเชฐเชพเช‰เชฒเชฐ เชฌเชจเชพเชตเซ‹ เช…เชจเซ‡ เชœเซเชฏเชพเช‚ เชคเชฎเซ‡ เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐ เช•เชฐเซ‹ เช›เซ‹ เชคเซเชฏเชพเช‚ เชเช• เชฌเช•เซ‡เชŸ เช‰เชฎเซ‡เชฐเซ‹. เชคเชฎเซ‡ เช˜เชฃเซ€ เชฌเช•เซ‡เชŸเซเชธ เชฎเชพเชŸเซ‡ เชเช• เช•เซเชฐเชพเช‰เชฒเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชคเซ‡ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชจเชพเชฎเซ‹ เชธเชพเชฅเซ‡ เช•เซ‹เชทเซเชŸเช•เซ‹ เชฌเชจเชพเชตเชถเซ‡ เชœเซ‡ เชฌเช•เซ‡เชŸเชจเชพ เชจเชพเชฎ เชธเชพเชฅเซ‡ เชฎเซ‡เชณ เช–เชพเชฏ เช›เซ‡. เชœเซ‹ เชคเชฎเซ‡ เช† เชกเซ‡เชŸเชพเชจเซ‹ เชจเชฟเชฏเชฎเชฟเชค เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชฏเซ‹เชœเชจเชพ เช˜เชกเซ€ เชฐเชนเซเชฏเชพ เชนเซ‹, เชคเซ‹ เชคเชฎเชพเชฐเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹เชจเซ‡ เช…เชจเซเชฐเซ‚เชช เช•เซเชฐเชพเช‰เชฒเชฐเชจเชพ เชฒเซ‹เชจเซเชš เชถเซ‡เชกเซเชฏเซ‚เชฒเชจเซ‡ เช—เซ‹เช เชตเชตเชพเชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเซ‹. เช…เชฎเซ‡ เชฌเชงเชพ เช•เซ‹เชทเซเชŸเช•เซ‹ เชฎเชพเชŸเซ‡ เชเช• เช•เซเชฐเชพเช‰เชฒเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช, เชœเซ‡ เชฆเชฐ เช•เชฒเชพเช•เซ‡ เชšเชพเชฒเซ‡ เช›เซ‡.

เชตเชฟเชญเชพเชœเชฟเชค เช•เซ‹เชทเซเชŸเช•เซ‹

เช•เซเชฐเซ‹เชฒเชฐเชจเชพ เชชเซเชฐเชฅเชฎ เชฒเซ‹เช‚เชš เชชเช›เซ€, เชฆเชฐเซ‡เช• เชธเซเช•เซ‡เชจ เช•เชฐเซ‡เชฒเซ€ เชฌเช•เซ‡เชŸ เชฎเชพเชŸเซ‡เชจเชพ เช•เซ‹เชทเซเชŸเช•เซ‹ เชธเซ‡เชŸเชฟเช‚เช—เซเชธเชฎเชพเช‚ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชฆเซ‡เช–เชพเชตเชพ เชœเซ‹เชˆเช. เชเชฅเซ‡เชจเชพ เช•เชจเซเชธเซ‹เชฒ เช–เซ‹เชฒเซ‹ เช…เชจเซ‡ Nginx เชฒเซ‹เช— เชธเชพเชฅเซ‡ เชŸเซ‡เชฌเชฒ เชถเซ‹เชงเซ‹. เชšเชพเชฒเซ‹ เช•เช‚เชˆเช• เชตเชพเช‚เชšเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชคเซเชจ เช•เชฐเซ€เช:

SELECT * FROM "default"."part_demo_kinesis_bucket"
WHERE(
  partition_0 = '2019' AND
  partition_1 = '04' AND
  partition_2 = '08' AND
  partition_3 = '06'
  );

เช† เช•เซเชตเซ‡เชฐเซ€ 6 เชเชชเซเชฐเชฟเชฒ, 7เชจเชพ เชฐเซ‹เชœ เชธเชตเชพเชฐเซ‡ 8 เชฅเซ€ 2019 เชตเชพเช—เซเชฏเชพเชจเซ€ เชตเชšเซเชšเซ‡ เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซ‡เชฒเชพ เชคเชฎเชพเชฎ เชฐเซ‡เช•เซ‹เชฐเซเชกเชจเซ‡ เชชเชธเช‚เชฆ เช•เชฐเชถเซ‡. เชชเชฐเช‚เชคเซ เชฌเชฟเชจ-เชตเชฟเชญเชพเชœเชฟเชค เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚เชฅเซ€ เชตเชพเช‚เชšเชตเชพ เช•เชฐเชคเชพเช‚ เช† เช•เซ‡เชŸเชฒเซเช‚ เชตเชงเซ เช•เชพเชฐเซเชฏเช•เซเชทเชฎ เช›เซ‡? เชšเชพเชฒเซ‹ เช เชœ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ เชถเซ‹เชงเซ€เช เช…เชจเซ‡ เชชเชธเช‚เชฆ เช•เชฐเซ€เช, เชคเซ‡เชฎเชจเซ‡ เชŸเชพเช‡เชฎเชธเซเชŸเซ‡เชฎเซเชช เชฆเซเชตเชพเชฐเชพ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเซ€เช:

Amazon Athena เช…เชจเซ‡ Cube.js เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Nginx เชฒเซ‹เช— เชเชจเชพเชฒเชฟเชŸเชฟเช•เซเชธ

เชฎเชพเชคเซเชฐ เชเช• เช…เช เชตเชพเชกเชฟเชฏเชพเชจเชพ เชฒเซ‹เช— เชธเชพเชฅเซ‡ เชกเซ‡เชŸเชพเชธเซ‡เชŸ เชชเชฐ 3.59 เชธเซ‡เช•เชจเซเชก เช…เชจเซ‡ 244.34 เชฎเซ‡เช—เชพเชฌเชพเช‡เชŸเซเชธ เชกเซ‡เชŸเชพ. เชšเชพเชฒเซ‹ เชชเชพเชฐเซเชŸเซ€เชถเชจ เชฆเซเชตเชพเชฐเชพ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช:

Amazon Athena เช…เชจเซ‡ Cube.js เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Nginx เชฒเซ‹เช— เชเชจเชพเชฒเชฟเชŸเชฟเช•เซเชธ

เชฅเซ‹เชกเซ€ เชเชกเชชเซ€, เชชเชฐเช‚เชคเซ เชธเซŒเชฅเซ€ เช…เช—เชคเซเชฏเชจเซเช‚ - เชฎเชพเชคเซเชฐ 1.23 เชฎเซ‡เช—เชพเชฌเชพเช‡เชŸเซเชธ เชกเซ‡เชŸเชพ! เชœเซ‹ เช•เชฟเช‚เชฎเชคเชฎเชพเช‚ เชตเชฟเชจเช‚เชคเซ€ เชฆเซ€เช  เชจเซเชฏเซ‚เชจเชคเชฎ 10 เชฎเซ‡เช—เชพเชฌเชพเช‡เชŸเซเชธ เชจ เชนเซ‹เชฏ เชคเซ‹ เชคเซ‡ เช˜เชฃเซเช‚ เชธเชธเซเชคเซเช‚ เชนเชถเซ‡. เชชเชฐเช‚เชคเซ เชคเซ‡ เชนเชœเซ เชชเชฃ เชตเชงเซ เชธเชพเชฐเซเช‚ เช›เซ‡, เช…เชจเซ‡ เชฎเซ‹เชŸเชพ เชกเซ‡เชŸเชพเชธเซ‡เชŸเซเชธ เชชเชฐ เชคเชซเชพเชตเชค เชตเชงเซ เชชเซเชฐเชญเชพเชตเชถเชพเชณเซ€ เชนเชถเซ‡.

Cube.js เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เชฌเชจเชพเชตเชตเซเช‚

เชกเซ‡เชถเชฌเซ‹เชฐเซเชกเชจเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ Cube.js เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชพเชคเซเชฎเช• เชซเซเชฐเซ‡เชฎเชตเชฐเซเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช. เชคเซ‡เชฎเชพเช‚ เช˜เชฃเชพ เชฌเชงเชพ เช•เชพเชฐเซเชฏเซ‹ เช›เซ‡, เชชเชฐเช‚เชคเซ เช…เชฎเชจเซ‡ เชฌเซ‡เชฎเชพเช‚ เชฐเชธ เช›เซ‡: เชชเชพเชฐเซเชŸเซ€เชถเชจ เชซเชฟเชฒเซเชŸเชฐเซเชธ เช…เชจเซ‡ เชกเซ‡เชŸเชพ เชชเซ‚เชฐเซเชต-เชเช—เซเชฐเชฟเช—เซ‡เชถเชจเชจเซ‹ เช†เชชเชฎเซ‡เชณเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ. เชคเซ‡ เชกเซ‡เชŸเชพ เชธเซเช•เซ€เชฎเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ เชกเซ‡เชŸเชพ เชธเซเช•เซ€เชฎเชพ, SQL เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพ เช…เชจเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เช เช•เซเชตเซ‡เชฐเซ€ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ Javascript เชฎเชพเช‚ เชฒเช–เชพเชฏเซ‡เชฒ เช›เซ‡. เช†เชชเชฃเซ‡ เชซเช•เซเชค เชกเซ‡เชŸเชพ เชธเซเช•เซ€เชฎเชพเชฎเชพเช‚ เชชเชพเชฐเซเชŸเซ€เชถเชจ เชซเชฟเชฒเซเชŸเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซ‹ เชคเซ‡ เชธเซ‚เชšเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชšเชพเชฒเซ‹ เชเช• เชจเชตเซ€ Cube.js เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฌเชจเชพเชตเซ€เช. เช…เชฎเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ AWS เชธเซเชŸเซ‡เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เชนเซ‹เชตเชพเชฅเซ€, เชœเชฎเชพเชตเชŸ เชฎเชพเชŸเซ‡ เชฒเซ‡เชฎเซเชฌเชกเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชคเชพเชฐเซเช•เชฟเช• เช›เซ‡. เชœเซ‹ เชคเชฎเซ‡ Heroku เช…เชฅเชตเชพ Docker เชฎเชพเช‚ Cube.js เชฌเซ‡เช•เชเชจเซเชก เชนเซ‹เชธเซเชŸ เช•เชฐเชตเชพเชจเซ€ เชฏเซ‹เชœเชจเชพ เช˜เชกเซ€ เชฐเชนเซเชฏเชพ เชนเซ‹เชต เชคเซ‹ เชคเชฎเซ‡ เชœเชจเชฐเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชเช•เซเชธเชชเซเชฐเซ‡เชธ เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เช…เชจเซเชฏเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡ เชนเซ‹เชธเซเชŸเชฟเช‚เช— เชชเชฆเซเชงเชคเชฟเช“.

$ npm install -g cubejs-cli
$ cubejs create nginx-log-analytics -t serverless -d athena

เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชšเชฒเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— cube.js เชฎเชพเช‚ เชกเซ‡เชŸเชพเชฌเซ‡เช เชเช•เซเชธเซ‡เชธเชจเซ‡ เช—เซ‹เช เชตเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡. เชœเชจเชฐเซ‡เชŸเชฐ เชเช• .env เชซเชพเช‡เชฒ เชฌเชจเชพเชตเชถเซ‡ เชœเซ‡เชฎเชพเช‚ เชคเชฎเซ‡ เชคเชฎเชพเชฐเซ€ เชšเชพเชตเซ€เช“เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เชเชฅเซ‡เชจเชพ.

เชนเชตเซ‡ เช†เชชเชฃเชจเซ‡ เชœเชฐเซ‚เชฐ เช›เซ‡ เชกเซ‡เชŸเชพ เชธเซเช•เซ€เชฎเชพ, เชœเซ‡เชฎเชพเช‚ เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เชฒเซ‹เช—เซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เชฅเชพเชฏ เช›เซ‡ เชคเซ‡ เชฌเชฐเชพเชฌเชฐ เชฆเชฐเซเชถเชพเชตเซ€เชถเซเช‚. เชคเซเชฏเชพเช‚ เชคเชฎเซ‡ เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เชฎเชพเชŸเซ‡ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซ€ เชคเซ‡ เชชเชฃ เชธเซเชชเชทเซเชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ schema, เชซเชพเชˆเชฒ เชฌเชจเชพเชตเซ‹ Logs.js. เช…เชนเซ€เช‚ nginx เชฎเชพเชŸเซ‡ เชกเซ‡เชŸเชพ เชฎเซ‹เชกเซ‡เชฒเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เช›เซ‡:

เชฎเซ‹เชกเชฒ เช•เซ‹เชก

const partitionFilter = (from, to) => `
    date(from_iso8601_timestamp(${from})) <= date_parse(partition_0 || partition_1 || partition_2, '%Y%m%d') AND
    date(from_iso8601_timestamp(${to})) >= date_parse(partition_0 || partition_1 || partition_2, '%Y%m%d')
    `

cube(`Logs`, {
  sql: `
  select * from part_demo_kinesis_bucket
  WHERE ${FILTER_PARAMS.Logs.createdAt.filter(partitionFilter)}
  `,

  measures: {
    count: {
      type: `count`,
    },

    errorCount: {
      type: `count`,
      filters: [
        { sql: `${CUBE.isError} = 'Yes'` }
      ]
    },

    errorRate: {
      type: `number`,
      sql: `100.0 * ${errorCount} / ${count}`,
      format: `percent`
    }
  },

  dimensions: {
    status: {
      sql: `status`,
      type: `number`
    },

    isError: {
      type: `string`,
      case: {
        when: [{
          sql: `${CUBE}.status >= 400`, label: `Yes`
        }],
        else: { label: `No` }
      }
    },

    createdAt: {
      sql: `from_unixtime(created_at)`,
      type: `time`
    }
  }
});

เช…เชนเซ€เช‚ เช†เชชเชฃเซ‡ เชตเซ‡เชฐเซ€เชเชฌเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช FILTER_PARAMSเชชเชพเชฐเซเชŸเซ€เชถเชจ เชซเชฟเชฒเซเชŸเชฐ เชธเชพเชฅเซ‡ SQL เช•เซเชตเซ‡เชฐเซ€ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡.

เช…เชฎเซ‡ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เช…เชจเซ‡ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชชเชฃ เชธเซ‡เชŸ เช•เชฐเซ€เช เช›เซ€เช เชœเซ‡ เช…เชฎเซ‡ เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เชชเชฐ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช เช…เชจเซ‡ เชชเซ‚เชฐเซเชต-เชเช—เซเชฐเชฟเช—เซ‡เชถเชจเซเชธเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€เช เช›เซ€เช. Cube.js เชชเซ‚เชฐเซเชต-เชเช—เซเชฐเชฟเช—เซ‡เชŸเซ‡เชก เชกเซ‡เชŸเชพ เชธเชพเชฅเซ‡ เชตเชงเชพเชฐเชพเชจเชพ เช•เซ‹เชทเซเชŸเช•เซ‹ เชฌเชจเชพเชตเชถเซ‡ เช…เชจเซ‡ เชกเซ‡เชŸเชพ เช†เชตเชคเชพเชจเซ€ เชธเชพเชฅเซ‡ เชคเซ‡เชจเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเชถเซ‡. เช† เชฎเชพเชคเซเชฐ เช•เซเชตเซ‡เชฐเซ€เชเชจเซ‡ เชตเซ‡เช— เช†เชชเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชเชฅเซ‡เชจเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เช•เชฟเช‚เชฎเชค เชชเชฃ เช˜เชŸเชพเชกเซ‡ เช›เซ‡.

เชšเชพเชฒเซ‹ เช† เชฎเชพเชนเชฟเชคเซ€เชจเซ‡ เชกเซ‡เชŸเชพ เชธเซเช•เซ€เชฎเชพ เชซเชพเช‡เชฒเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ€เช:

preAggregations: {
  main: {
    type: `rollup`,
    measureReferences: [count, errorCount],
    dimensionReferences: [isError, status],
    timeDimensionReference: createdAt,
    granularity: `day`,
    partitionGranularity: `month`,
    refreshKey: {
      sql: FILTER_PARAMS.Logs.createdAt.filter((from, to) => 
        `select
           CASE WHEN from_iso8601_timestamp(${to}) + interval '3' day > now()
           THEN date_trunc('hour', now()) END`
      )
    }
  }
}

เช…เชฎเซ‡ เช† เชฎเซ‹เชกเซ‡เชฒเชฎเชพเช‚ เชธเซเชชเชทเซเชŸ เช•เชฐเซ€เช เช›เซ€เช เช•เซ‡ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเชพ เชคเชฎเชพเชฎ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเซเชต-เชเช—เซเชฐเชฟเช—เซ‡เชŸ เชกเซ‡เชŸเชพ เช…เชจเซ‡ เชฎเชนเชฟเชจเชพ เชชเซเชฐเชฎเชพเชฃเซ‡ เชชเชพเชฐเซเชŸเซ€เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เชชเซ‚เชฐเซเชต-เชเช—เซเชฐเชฟเช—เซ‡เชถเชจ เชชเชพเชฐเซเชŸเซ€เชถเชจ เชกเซ‡เชŸเชพ เชธเช‚เช—เซเชฐเชน เช…เชจเซ‡ เช…เชชเชกเซ‡เชŸเชจเซ‡ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เชเชกเชชเซ€ เชฌเชจเชพเชตเซ€ เชถเช•เซ‡ เช›เซ‡.

เชนเชตเซ‡ เช…เชฎเซ‡ เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช!

Cube.js เชฌเซ‡เช•เชเชจเซเชก เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡ REST API เช…เชจเซ‡ เชฒเซ‹เช•เชชเซเชฐเชฟเชฏ เชซเซเชฐเชจเซเชŸ-เชเชจเซเชก เชซเซเชฐเซ‡เชฎเชตเชฐเซเช• เชฎเชพเชŸเซ‡ เช•เซเชฒเชพเชฏเช‚เชŸ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เช“เชจเซ‹ เชธเชฎเซ‚เชน. เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เช•เซเชฒเชพเชฏเชจเซเชŸเชจเชพ เชฐเชฟเชเช•เซเชŸ เชตเชฐเซเชเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚. Cube.js เชฎเชพเชคเซเชฐ เชกเซ‡เชŸเชพ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ เช…เชฎเชจเซ‡ เชตเชฟเชเซเชฏเซเชฒเชพเช‡เชเซ‡เชถเชจ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡ - เชฎเชจเซ‡ เชคเซ‡ เช—เชฎเซ‡ เช›เซ‡ เชฐเซ€เชšเชพเชฐเซเชŸ, เชชเชฐเช‚เชคเซ เชคเชฎเซ‡ เช•เซ‹เชˆเชชเชฃ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

Cube.js เชธเชฐเซเชตเชฐ เชตเชฟเชจเช‚เชคเซ€ เชธเซเชตเซ€เช•เชพเชฐเซ‡ เช›เซ‡ JSON เชซเซ‹เชฐเซเชฎเซ‡เชŸ, เชœเซ‡ เชœเชฐเซ‚เชฐเซ€ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ‡ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, Nginx เช เชฆเชฟเชตเชธเชฎเชพเช‚ เช•เซ‡เชŸเชฒเซ€ เชญเซ‚เชฒเซ‹ เช†เชชเซ€ เชคเซ‡เชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชตเชฟเชจเช‚เชคเซ€ เชฎเซ‹เช•เชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

{
  "measures": ["Logs.errorCount"],
  "timeDimensions": [
    {
      "dimension": "Logs.createdAt",
      "dateRange": ["2019-01-01", "2019-01-07"],
      "granularity": "day"
    }
  ]
}

เชšเชพเชฒเซ‹ Cube.js เช•เซเชฒเชพเชฏเช‚เชŸ เช…เชจเซ‡ NPM เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช˜เชŸเช• เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€เช:

$ npm i --save @cubejs-client/core @cubejs-client/react

เช…เชฎเซ‡ เช˜เชŸเช•เซ‹ เช†เชฏเชพเชค เช•เชฐเซ€เช เช›เซ€เช cubejs ะธ QueryRendererเชกเซ‡เชŸเชพ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพ เช…เชจเซ‡ เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡:

เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เช•เซ‹เชก

import React from 'react';
import { LineChart, Line, XAxis, YAxis } from 'recharts';
import cubejs from '@cubejs-client/core';
import { QueryRenderer } from '@cubejs-client/react';

const cubejsApi = cubejs(
  'YOUR-CUBEJS-API-TOKEN',
  { apiUrl: 'http://localhost:4000/cubejs-api/v1' },
);

export default () => {
  return (
    <QueryRenderer
      query={{
        measures: ['Logs.errorCount'],
        timeDimensions: [{
            dimension: 'Logs.createdAt',
            dateRange: ['2019-01-01', '2019-01-07'],
            granularity: 'day'
        }]
      }}
      cubejsApi={cubejsApi}
      render={({ resultSet }) => {
        if (!resultSet) {
          return 'Loading...';
        }

        return (
          <LineChart data={resultSet.rawData()}>
            <XAxis dataKey="Logs.createdAt"/>
            <YAxis/>
            <Line type="monotone" dataKey="Logs.errorCount" stroke="#8884d8"/>
          </LineChart>
        );
      }}
    />
  )
}

เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เชธเซเชคเซเชฐเซ‹เชคเซ‹ เชชเชฐ เช‰เชชเชฒเชฌเซเชง เช›เซ‡ เช•เซ‹เชกเชธเซ‡เชจเซเชกเชฌเซ‹เช•เซเชธ.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹