Amazon Athena, Cube.js เดŽเดจเตเดจเดฟเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Nginx เดฒเต‹เด—เต เด…เดจเดฒเดฟเดฑเตเดฑเดฟเด•เตโ€Œเดธเต

เดธเดพเดงเดพเดฐเดฃเด—เดคเดฟเดฏเดฟเตฝ, เดตเดพเดฃเดฟเดœเตเดฏ เด‰เตฝเดชเตเดชเดจเตเดจเด™เตเด™เดณเต‹ เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต เด“เดชเตเดชเตบ เดธเต‹เดดเตโ€Œเดธเต เด‡เดคเดฐเดฎเดพเตผเด—เด™เตเด™เดณเดพเดฏ Prometheus + Grafana, Nginx-เดจเตเดฑเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดจเดฟเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เดจเดฟเดฐเต€เด•เตเดทเดฃเดคเตเดคเดฟเดจเต‹ เดคเดคเตเดธเดฎเดฏ เดตเดฟเดถเด•เดฒเดจเดคเตเดคเดฟเดจเต‹ เด‡เดคเต เด’เดฐเต เดจเดฒเตเดฒ เด“เดชเตเดทเดจเดพเดฃเต, เดŽเดจเตเดจเดพเตฝ เดšเดฐเดฟเดคเตเดฐเดชเดฐเดฎเดพเดฏ เดตเดฟเดถเด•เดฒเดจเดคเตเดคเดฟเดจเต เดตเดณเดฐเต† เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดฒเตเดฒ. เดเดคเตŠเดฐเต เดœเดจเดชเตเดฐเดฟเดฏ เด‰เดฑเดตเดฟเดŸเดคเตเดคเดฟเดฒเตเด‚, nginx เดฒเต‹เด—เตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เด…เดณเดตเต เด…เดคเดฟเดตเต‡เด—เด‚ เดตเดณเดฐเตเด•เดฏเดพเดฃเต, เด•เต‚เดŸเดพเดคเต† เด’เดฐเต เดตเดฒเดฟเดฏ เด…เดณเดตเดฟเดฒเตเดณเตเดณ เดกเดพเดฑเตเดฑ เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เด•เต‚เดŸเตเดคเตฝ เดชเตเดฐเดคเตเดฏเต‡เด•เดฎเดพเดฏ เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เดฏเตเด•เตเดคเดฟเดธเดนเดฎเดพเดฃเต.

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเด™เตเด™เดจเต† เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดžเดพเตป เดจเดฟเด™เตเด™เดณเต‹เดŸเต เดชเดฑเดฏเตเด‚ เด…เดฅเต€เดจ เดฒเต‹เด—เตเด•เตพ เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเดพเตป, Nginx เด‰เดฆเดพเดนเดฐเดฃเดฎเดพเดฏเดฟ เดŽเดŸเตเดคเตเดคเต, เด“เดชเตเดชเตบ เดธเต‹เดดเตโ€Œเดธเต cube.js เดซเตเดฐเต†เดฏเดฟเด‚เดตเตผเด•เตเด•เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดˆ เดกเดพเดฑเตเดฑเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เด…เดจเดฒเดฟเดฑเตเดฑเดฟเด•เตเด•เตฝ เดกเดพเดทเตโ€Œเดฌเต‹เตผเดกเต เดŽเด™เตเด™เดจเต† เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เดพเดฎเต†เดจเตเดจเต เดžเดพเตป เด•เดพเดฃเดฟเด•เตเด•เตเด‚. เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เดชเดฐเดฟเดนเดพเดฐ เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏ เด‡เดคเดพ:

Amazon Athena, Cube.js เดŽเดจเตเดจเดฟเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Nginx เดฒเต‹เด—เต เด…เดจเดฒเดฟเดฑเตเดฑเดฟเด•เตโ€Œเดธเต

TL:DR;
เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏ เดกเดพเดทเตโ€Œเดฌเต‹เตผเดกเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดฒเดฟเด™เตเด•เต.

เดžเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดตเดฟเดตเดฐเด™เตเด™เตพ เดถเต‡เด–เดฐเดฟเด•เตเด•เดพเตป เด’เดดเตเด•เตเด•เตเดณเตเดณ, เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เดฟเดจเดพเดฏเดฟ - AWS Kinesis เดกเดพเดฑเตเดฑ เดซเดฏเตผเดนเต‹เดธเต ะธ AWS เดชเดถ, เดธเด‚เดญเดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ - AWS S3. เดˆ เดฌเดฃเตเดŸเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เดจเดฟเด™เตเด™เตพเด•เตเด•เต nginx เดฒเต‹เด—เตเด•เตพ เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดฎเดฑเตเดฑเต เด‡เดตเดจเตเดฑเตเด•เดณเตเด‚ เดฎเดฑเตเดฑเต เดธเต‡เดตเดจเด™เตเด™เดณเตเดŸเต† เดฒเต‹เด—เตเด•เดณเตเด‚ เดธเด‚เดญเดฐเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚. เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดฑเตเดฑเดพเด•เตเด•เดฟเดจเต เดธเดฎเดพเดจเดฎเดพเดฏเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดšเดฟเดฒ เดญเดพเด—เด™เตเด™เตพ เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเด•เตเด•เดพเด‚, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดจเดฟเด™เตเด™เตพเด•เตเด•เต nginx-เตฝ เดจเดฟเดจเตเดจเต เดจเต‡เดฐเดฟเดŸเตเดŸเต kinesis-เดฒเต‡เด•เตเด•เต เดฒเต‹เด—เตเด•เตพ เดŽเดดเตเดคเดพเด‚, fluentd-เดจเต† เดฎเดฑเดฟเด•เดŸเด•เตเด•เดพเด‚, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด‡เดคเดฟเดจเดพเดฏเดฟ logstash เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•.

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 เตฝ เด’เดฐเต เดตเตƒเดคเตเดคเดฟเดฏเตเดณเตเดณ เดฌเด•เตเด•เดฑเตเดฑเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต, เด…เดคเดฟเตฝ เดฎเดฑเตเดฑเตŠเดจเตเดจเตเด‚ เดธเด‚เดญเดฐเดฟเด•เตเด•เดชเตเดชเต†เดŸเดฟเดฒเตเดฒ. เด…เดฅเต€เดจ เดŽเดฒเตเดฒเดพ เดชเตเดฐเดฆเต‡เดถเด™เตเด™เดณเดฟเดฒเตเด‚ เดฒเดญเตเดฏเดฎเดฒเตเดฒเดพเดคเตเดคเดคเดฟเดจเดพเตฝ, เดเดคเต เดชเตเดฐเดฆเต‡เดถเดคเตเดคเดพเดฃเต เดจเดฟเด™เตเด™เตพ เดฌเด•เตเด•เดฑเตเดฑเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเต†เดจเตเดจเต เดฎเตเตปเด•เต‚เดŸเตเดŸเดฟ เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดพเดฃเต.

เด…เดฅเต€เดจ เด•เตบเดธเต‹เดณเดฟเตฝ เด’เดฐเต เดธเตผเด•เตเดฏเต‚เดŸเตเดŸเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต

เดฒเต‹เด—เตเด•เตพเด•เตเด•เดพเดฏเดฟ เด…เดฅเต€เดจเดฏเดฟเตฝ เด’เดฐเต เดชเดŸเตเดŸเดฟเด• เด‰เดฃเตเดŸเดพเด•เตเด•เดพเด‚. เดจเดฟเด™เตเด™เตพ Kinesis Firehose เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดจเดพเดฃเต เด‰เดฆเตเดฆเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเดคเต†เด™เตเด•เดฟเตฝ เดŽเดดเตเดคเตเดคเดฟเดจเตเด‚ เดตเดพเดฏเดจเดฏเตเด•เตเด•เตเด‚ เด‡เดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เด…เดฅเต€เดจ เด•เตบเดธเต‹เตพ เดคเตเดฑเดจเตเดจเต เด’เดฐเต เดชเดŸเตเดŸเดฟเด• เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•:

SQL เดชเดŸเตเดŸเดฟเด• เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตฝ

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 เด•เตบเดธเต‹เตพ เดคเตเดฑเด•เตเด•เตเด•, "เดกเต†เดฒเดฟเดตเดฑเดฟ เดธเตเดŸเตเดฐเต€เด‚ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•" เด•เตเดฒเดฟเด•เตเด•เต เดšเต†เดฏเตเดฏเตเด•, "เดกเต†เดฒเดฟเดตเดฑเดฟ" เดซเต€เตฝเดกเดฟเตฝ "direct PUT" เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•:

Amazon Athena, Cube.js เดŽเดจเตเดจเดฟเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Nginx เดฒเต‹เด—เต เด…เดจเดฒเดฟเดฑเตเดฑเดฟเด•เตโ€Œเดธเต

เด…เดŸเตเดคเตเดค เดŸเดพเดฌเดฟเตฝ, "เดฑเต†เด•เตเด•เต‹เตผเดกเต เดซเต‹เตผเดฎเดพเดฑเตเดฑเต เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚" - "เดชเตเดฐเดพเดชเตเดคเดฎเดพเด•เตเด•เดฟ" เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดคเตเดคเต เดฑเต†เด•เตเด•เต‹เตผเดกเดฟเด‚เด—เต เดซเต‹เตผเดฎเดพเดฑเตเดฑเดพเดฏเดฟ "เด…เดชเตเดชเดพเดšเตเดšเต† ORC" เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•. เดšเดฟเดฒ เด—เดตเต‡เดทเดฃ เดชเตเดฐเด•เดพเดฐเด‚ เด“เดตเตป เด’เดฎเดพเดฒเดฟ, PrestoDB, Athena เดŽเดจเตเดจเดฟเดตเดฏเตโ€Œเด•เตเด•เตเดณเตเดณ เด’เดชเตเดฑเตเดฑเดฟเดฎเตฝ เดซเต‹เตผเดฎเดพเดฑเตเดฑเดพเดฃเดฟเดคเต. เดžเด™เตเด™เตพ เดฎเตเด•เดณเดฟเตฝ เดธเตƒเดทเตเดŸเดฟเดšเตเดš เดชเดŸเตเดŸเดฟเด• เด’เดฐเต เดธเตเด•เต€เดฎเดฏเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. Kinesis-เตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดเดคเต S3 เดฒเตŠเด•เตเด•เต‡เดทเดจเตเด‚ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดพเดจเดพเด•เตเดฎเต†เดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด•; เดชเดŸเตเดŸเดฟเด•เดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดธเตเด•เต€เดฎ เดฎเดพเดคเตเดฐเดฎเต‡ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเตเดณเตเดณเต‚. เดŽเดจเตเดจเดพเตฝ เดจเดฟเด™เตเด™เตพ เดฎเดฑเตเดฑเตŠเดฐเต S3 เดฒเตŠเด•เตเด•เต‡เดทเตป เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดˆ เดชเดŸเตเดŸเดฟเด•เดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดˆ เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ เดตเดพเดฏเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ.

Amazon Athena, Cube.js เดŽเดจเตเดจเดฟเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Nginx เดฒเต‹เด—เต เด…เดจเดฒเดฟเดฑเตเดฑเดฟเด•เตโ€Œเดธเต

เดธเด‚เดญเดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เดžเด™เตเด™เตพ S3 เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•เดฏเตเด‚ เดžเด™เตเด™เตพ เดฎเตเดฎเตเดชเต เดธเตƒเดทเตเดŸเดฟเดšเตเดš เดฌเด•เตเด•เดฑเตเดฑเตเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•. เดžเดพเตป เด•เตเดฑเดšเตเดšเต เด•เดดเดฟเดžเตเดžเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเดจเตเดจ Aws Glue Crawler, เด’เดฐเต S3 เดฌเด•เตเด•เดฑเตเดฑเดฟเตฝ เดชเตเดฐเดฟเดซเดฟเด•เตเดธเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ เด‡เดคเต เดถเต‚เดจเตเดฏเดฎเดพเดฏเดฟ เดตเดฟเดŸเต‡เดฃเตเดŸเดคเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต.

Amazon Athena, Cube.js เดŽเดจเตเดจเดฟเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Nginx เดฒเต‹เด—เต เด…เดจเดฒเดฟเดฑเตเดฑเดฟเด•เตโ€Œเดธเต

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฒเต‹เดกเดฟเดจเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเต เดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจ เด“เดชเตเดทเดจเตเด•เตพ เดฎเดพเดฑเตเดฑเดพเดตเตเดจเตเดจเดคเดพเดฃเต; เดžเดพเตป เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เดธเตเดฅเดฟเดฐเดฎเดพเดฏเดตเดฏเดพเดฃเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต. S3 เด•เด‚เดชเตเดฐเดทเตป เดฒเดญเตเดฏเดฎเดฒเตเดฒ, เดŽเดจเตเดจเดพเตฝ ORC เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ เดจเต‡เดฑเตเดฑเต€เดตเต เด•เด‚เดชเตเดฐเดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต.

เด’เดดเตเด•เตเด•เตเดณเตเดณ

เดฒเต‹เด—เตเด•เตพ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดžเด™เตเด™เตพ เด‡เดชเตเดชเต‹เตพ เด•เตเดฐเดฎเต€เด•เดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เดžเด™เตเด™เตพ เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเดคเต เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดžเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚ เด’เดดเตเด•เตเด•เตเดณเตเดณ, เด•เดพเดฐเดฃเด‚ เดŽเดจเดฟเด•เตเด•เต เดฑเต‚เดฌเดฟเดฏเต† เด‡เดทเตเดŸเดฎเดพเดฃเต, เดŽเดจเตเดจเดพเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต Logstash เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดจเต‡เดฐเดฟเดŸเตเดŸเต kinesis-เดฒเต‡เด•เตเด•เต เดฒเต‹เด—เตเด•เตพ เด…เดฏเดฏเตเด•เตเด•เดพเด‚. 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 เดชเต‹เตผเดŸเตเดŸเต.

เด‡เดชเตเดชเต‹เตพ เดžเด™เตเด™เตพเด•เตเด•เต Fluentd เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เดžเด™เตเด™เตพเด•เตเด•เต Nginx เดฒเต‹เด—เตเด•เตพ เด…เดตเดฟเดŸเต† เด…เดฏเดฏเตโ€Œเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚. เดžเด™เตเด™เตพ เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเตฝ Nginx เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต, เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ เดกเต‹เด•เตเด•เดฑเดฟเดจเต 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>

เด…เดฅเต€เดจ

เดจเดฟเด™เตเด™เตพ เดŽเดฒเตเดฒเดพเด‚ เดถเดฐเดฟเดฏเดพเดฏเดฟ เด•เตเดฐเดฎเต€เด•เดฐเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เด•เตเดฑเดšเตเดšเต เดธเดฎเดฏเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚ (เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ, Kinesis เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพเด•เตเด•เต เด“เดฐเต‹ 10 เดฎเดฟเดจเดฟเดฑเตเดฑเดฟเดฒเตเด‚ เด’เดฐเดฟเด•เตเด•เตฝ เดกเดพเดฑเตเดฑ เดฒเดญเดฟเดšเตเดšเต) เดจเดฟเด™เตเด™เตพ S3-เตฝ เดฒเต‹เด—เต เดซเดฏเดฒเตเด•เตพ เด•เดพเดฃเตเด‚. Kinesis Firehose-เดจเตเดฑเต† "เดฎเต‹เดฃเดฟเดฑเตเดฑเดฑเดฟเด‚เด—เต" เดฎเต†เดจเตเดตเดฟเตฝ S3-เตฝ เดŽเดคเตเดฐ เดกเดพเดฑเตเดฑ เดฐเต‡เด–เดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเด‚, เด…เดคเตเดชเต‹เดฒเต† เดคเดจเตเดจเต† เดชเดฟเดถเด•เตเด•เดณเตเด‚. Kinesis เดฑเต‹เดณเดฟเดฒเต‡เด•เตเด•เต S3 เดฌเด•เตเด•เดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดŽเดดเตเดคเตเดคเต เด†เด•เตเดธเดธเต เดจเตฝเด•เดพเตป เดฎเดฑเด•เตเด•เดฐเตเดคเต. Kinesis-เดจเต เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดชเดพเดดเตโ€Œเดธเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด…เดคเต เด…เดคเต‡ เดฌเด•เตเด•เดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดชเดฟเดถเด•เตเด•เตพ เดšเต‡เตผเด•เตเด•เตเด‚.

เด‡เดชเตเดชเต‹เตพ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด…เดฅเต€เดจเดฏเดฟเดฒเต† เดกเดพเดฑเตเดฑ เด•เดพเดฃเดพเตป เด•เดดเดฟเดฏเตเด‚. เดชเดฟเดถเด•เตเด•เตพ เดจเตฝเด•เดฟเดฏ เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เดจเดฎเตเด•เตเด•เต เด•เดฃเตเดŸเต†เดคเตเดคเดพเด‚:

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

เด“เดฐเต‹ เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเตเด•เตเด•เตเด‚ เดŽเดฒเตเดฒเดพ เดฐเต‡เด–เด•เดณเตเด‚ เดธเตเด•เดพเตป เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด‡เดชเตเดชเต‹เตพ เดžเด™เตเด™เดณเตเดŸเต† เดฒเต‹เด—เตเด•เตพ ORC-เดฏเดฟเดฒเต† S3-เตฝ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดคเต, เด•เด‚เดชเตเดฐเดธเตเดธเตเดšเต†เดฏเตโ€Œเดคเต เดตเดฟเดถเด•เดฒเดจเดคเตเดคเดฟเดจเต เดคเดฏเตเดฏเดพเดฑเดพเดฃเต. Kinesis Firehose เด…เดตเดฏเต† เด“เดฐเต‹ เดฎเดฃเดฟเด•เตเด•เต‚เดฑเดฟเดฒเตเด‚ เดกเดฏเดฑเด•เตเดŸเดฑเดฟเด•เดณเดพเดฏเดฟ เด•เตเดฐเดฎเต€เด•เดฐเดฟเดšเตเดšเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดŸเต‡เดฌเดฟเตพ เดชเดพเตผเดŸเตเดŸเต€เดทเตป เดšเต†เดฏเตเดฏเดพเดคเตเดคเดฟเดŸเดคเตเดคเต‹เดณเด‚, เด…เดชเต‚เตผเดตเดฎเดพเดฏ เด’เดดเดฟเดตเดพเด•เตเด•เดฒเตเด•เดณเต‹เดŸเต† เดŽเดฒเตเดฒเดพ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เดณเดฟเดฒเตเด‚ เด…เดฅเต€เดจ เดŽเดฒเตเดฒเดพ เดธเดฎเดฏ เดกเดพเดฑเตเดฑเดฏเตเด‚ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด‚. เดฐเดฃเตเดŸเต เด•เดพเดฐเดฃเด™เตเด™เดณเดพเตฝ เด‡เดคเต เด’เดฐเต เดตเดฒเดฟเดฏ เดชเตเดฐเดถเตเดจเดฎเดพเดฃเต:

  • เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เด…เดณเดตเต เดจเดฟเดฐเดจเตเดคเดฐเด‚ เดตเตผเดฆเตเดงเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เดšเต‹เดฆเตเดฏเด™เตเด™เดณเตเดŸเต† เดตเต‡เด—เดค เด•เตเดฑเดฏเตเด•เตเด•เตเดจเตเดจเต;
  • เด“เดฐเต‹ เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเตเด•เตเด•เตเด‚ เด•เตเดฑเดžเตเดžเดคเต 10 MB เดŽเดจเตเดจ เดคเต‹เดคเดฟเตฝ เดธเตโ€Œเด•เดพเตป เดšเต†เดฏเตโ€Œเดค เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เดตเต‹เดณเดฟเดฏเด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเดพเดฃเต เด…เดฅเต€เดจ เดฌเดฟเตฝ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต.

เด‡เดคเต เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเตป, เดžเด™เตเด™เตพ AWS Glue Crawler เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเต S3-เดฒเต† เดกเดพเดฑเตเดฑ เด•เตเดฐเต‹เตพ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดชเดพเตผเดŸเตเดŸเต€เดทเตป เดตเดฟเดตเดฐเด™เตเด™เตพ เด—เตเดฒเต‚ เดฎเต†เดฑเตเดฑเดพเดธเตเดฑเตเดฑเต‹เดฑเดฟเดฒเต‡เด•เตเด•เต เดŽเดดเตเดคเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚. เด…เดฅเต€เดจเดฏเต† เด…เดจเตเดตเต‡เดทเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดชเดพเตผเดŸเตเดŸเต€เดทเดจเตเด•เตพ เด’เดฐเต เดซเดฟเตฝเดŸเตเดŸเดฑเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด‡เดคเต เดžเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเด‚, เด•เต‚เดŸเดพเดคเต† เด‡เดคเต เด…เดจเตเดตเต‡เดทเดฃเดคเตเดคเดฟเตฝ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏ เดกเดฏเดฑเด•เตเดŸเดฑเดฟเด•เตพ เดฎเดพเดคเตเดฐเด‚ เดธเตเด•เดพเตป เดšเต†เดฏเตเดฏเตเด‚.

Amazon Glue Crawler เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต

เด†เดฎเดธเต‹เตบ เด—เตเดฒเต‚ เด•เตเดฐเดพเดณเตผ S3 เดฌเด•เตเด•เดฑเตเดฑเดฟเดฒเต† เดŽเดฒเตเดฒเดพ เดกเดพเดฑเตเดฑเดฏเตเด‚ เดธเตเด•เดพเตป เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดชเดพเตผเดŸเตเดŸเต€เดทเดจเตเด•เดณเตเดณเตเดณ เดชเดŸเตเดŸเดฟเด•เด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. AWS เด—เตเดฒเต‚ เด•เตบเดธเต‹เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เด—เตเดฒเต‚ เด•เตเดฐเดพเดณเตผ เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพ เดกเดพเดฑเตเดฑ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเตเดฅเดฒเดคเตเดคเต เด’เดฐเต เดฌเด•เตเด•เดฑเตเดฑเต เดšเต‡เตผเด•เตเด•เตเด•. เดจเดฟเดฐเดตเดงเดฟ เดฌเด•เตเด•เดฑเตเดฑเตเด•เตพเด•เตเด•เดพเดฏเดฟ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เด•เตเดฐเดพเดณเตผ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚, เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ เด…เดคเต เดฌเด•เตเด•เดฑเตเดฑเตเด•เดณเตเดŸเต† เดชเต‡เดฐเตเด•เดณเตเดฎเดพเดฏเดฟ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจ เดชเต‡เดฐเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดชเดŸเตเดŸเดฟเด•เด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด‚. เดˆ เดกเดพเดฑเตเดฑ เดชเดคเดฟเดตเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เดณเตเดŸเต† เด†เดตเดถเตเดฏเด™เตเด™เตพเด•เตเด•เต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ เดฐเต€เดคเดฟเดฏเดฟเตฝ Crawler-เดจเตเดฑเต† เดฒเต‹เดžเตเดšเต เดทเต†เดกเตเดฏเต‚เตพ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเด•. เดŽเดฒเตเดฒเดพ เดŸเต‡เดฌเดฟเดณเตเด•เตพเด•เตเด•เตเด‚ เดžเด™เตเด™เตพ เด’เดฐเต เด•เตเดฐเดพเดณเตผ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเต เด“เดฐเต‹ เดฎเดฃเดฟเด•เตเด•เต‚เดฑเดฟเดฒเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต.

เดตเดฟเดญเดœเดฟเดšเตเดš เดชเดŸเตเดŸเดฟเด•เด•เตพ

เด•เตเดฐเดพเดณเดฑเดฟเดจเตเดฑเต† เด†เดฆเตเดฏ เดตเดฟเด•เตเดทเต‡เดชเดฃเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚, เดธเตเด•เดพเตป เดšเต†เดฏเตเดค เด“เดฐเต‹ เดฌเด•เตเด•เดฑเตเดฑเดฟเดจเตเด‚ เดตเต‡เดฃเตเดŸเดฟเดฏเตเดณเตเดณ เดชเดŸเตเดŸเดฟเด•เด•เตพ เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เดณเดฟเตฝ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดฆเตƒเดถเตเดฏเดฎเดพเด•เตเด‚. เด…เดฅเต€เดจ เด•เตบเดธเต‹เตพ เดคเตเดฑเดจเตเดจเต 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 เดธเตเดฑเตเดฑเดพเด•เตเด•เต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ, เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเดจเดพเดฏเดฟ Lambda เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เดฏเตเด•เตเดคเดฟเดธเดนเดฎเดพเดฃเต. 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"
    }
  ]
}

NPM เดตเดดเดฟ Cube.js เด•เตเดฒเดฏเดจเตเดฑเตเด‚ เดฑเดฟเดฏเดพเด•เตเดฑเตเดฑเต เด˜เดŸเด• เดฒเตˆเดฌเตเดฐเดฑเดฟเดฏเตเด‚ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเด‚:

$ 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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•