เจเจฎเจพเจœเจผเจพเจจ เจเจฅเฉ€เจจเจพ เจ…เจคเฉ‡ Cube.js เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ Nginx เจฒเฉŒเจ— เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ

เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจตเจชเจพเจฐเจ• เจ‰เจคเจชเจพเจฆ เจœเจพเจ‚ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ‡ เจ“เจชเจจ-เจธเฉ‹เจฐเจธ เจตเจฟเจ•เจฒเจช, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ + เจ—เฉเจฐเจพเจซเจพเจจเจพ, เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ Nginx เจฆเฉ‡ เจธเฉฐเจšเจพเจฒเจจ เจฆเฉ€ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจ…เจคเฉ‡ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจจ เจฒเจˆ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค เจ‡เจน เจจเจฟเจ—เจฐเจพเจจเฉ€ เจœเจพเจ‚ เจฐเฉ€เจ…เจฒ-เจŸเจพเจˆเจฎ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฒเจˆ เจ‡เฉฑเจ• เจตเจงเฉ€เจ† เจตเจฟเจ•เจฒเจช เจนเฉˆ, เจชเจฐ เจ‡เจคเจฟเจนเจพเจธเจ• เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฒเจˆ เจฌเจนเฉเจค เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจ•เจฟเจธเฉ‡ เจตเฉ€ เจชเฉเจฐเจธเจฟเฉฑเจง เจธเจฐเฉ‹เจค 'เจคเฉ‡, nginx เจฒเฉŒเจ—เจธ เจคเฉ‹เจ‚ เจกเฉ‡เจŸเจพ เจฆเฉ€ เจฎเจพเจคเจฐเจพ เจคเฉ‡เจœเจผเฉ€ เจจเจพเจฒ เจตเจง เจฐเจนเฉ€ เจนเฉˆ, เจ…เจคเฉ‡ เจตเฉฑเจกเฉ€ เจฎเจพเจคเจฐเจพ เจตเจฟเฉฑเจš เจกเฉ‡เจŸเจพ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจจ เจฒเจˆ, เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจตเจฟเจธเจผเฉ‡เจธเจผ เจšเฉ€เจœเจผ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจคเจฐเจ•เจชเฉ‚เจฐเจจ เจนเฉˆเฅค

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

เจเจฎเจพเจœเจผเจพเจจ เจเจฅเฉ€เจจเจพ เจ…เจคเฉ‡ Cube.js เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ Nginx เจฒเฉŒเจ— เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ

TL:DR;
เจฎเฉเจ•เฉฐเจฎเจฒ เจนเฉ‹เจ เจกเฉˆเจธเจผเจฌเฉ‹เจฐเจก เจจเจพเจฒ เจฒเจฟเฉฐเจ• เจ•เจฐเฉ‹.

เจœเจพเจฃเจ•เจพเจฐเฉ€ เจ‡เจ•เฉฑเจ เฉ€ เจ•เจฐเจจ เจฒเจˆ เจœเฉ‹ เจ…เจธเฉ€เจ‚ เจตเจฐเจคเจฆเฉ‡ เจนเจพเจ‚ เจชเฉเจฐเจตเจพเจน, เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจฒเจˆ - AWS Kinesis เจกเจพเจŸเจพ เจซเจพเจ‡เจฐเจนเฉ‹เจœเจผ ะธ AWS เจ—เจฒเฉ‚, เจธเจŸเฉ‹เจฐเฉ‡เจœเจผ เจฒเจˆ - AWS S3. เจ‡เจธ เจฌเฉฐเจกเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡, เจคเฉเจธเฉ€เจ‚ เจจเจพ เจธเจฟเจฐเจซเจผ nginx เจฒเฉŒเจ—เจธ เจจเฉ‚เฉฐ เจธเจŸเฉ‹เจฐ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจธเจ—เฉ‹เจ‚ เจนเฉ‹เจฐ เจ‡เจตเฉˆเจ‚เจŸเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ-เจจเจพเจฒ เจนเฉ‹เจฐ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฆเฉ‡ เจฒเฉŒเจ—เจธ เจจเฉ‚เฉฐ เจตเฉ€ เจธเจŸเฉ‹เจฐ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจธเจŸเฉˆเจ• เจฒเจˆ เจ•เฉเจ เจนเจฟเฉฑเจธเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจธเจฎเจพเจจ เจญเจพเจ—เจพเจ‚ เจจเจพเจฒ เจฌเจฆเจฒ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจคเฉเจธเฉ€เจ‚ nginx เจคเฉ‹เจ‚ เจธเจฟเฉฑเจงเฉ‡ เจ•เจพเจ‡เจจเฉ‡เจธเจฟเจธ เจจเฉ‚เฉฐ เจฒเฉŒเจ— เจฒเจฟเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹, 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 เจธเจŸเฉเจฐเฉ€เจฎ เจฌเจฃเจพเจ‰เจฃเจพ

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

เจเจฎเจพเจœเจผเจพเจจ เจเจฅเฉ€เจจเจพ เจ…เจคเฉ‡ Cube.js เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ Nginx เจฒเฉŒเจ— เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ

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

เจเจฎเจพเจœเจผเจพเจจ เจเจฅเฉ€เจจเจพ เจ…เจคเฉ‡ Cube.js เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ Nginx เจฒเฉŒเจ— เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ

เจ…เจธเฉ€เจ‚ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจ…เจคเฉ‡ เจ‰เจธ เจฌเจพเจฒเจŸเฉ€ เจฒเจˆ S3 เจšเฉเจฃเจฆเฉ‡ เจนเจพเจ‚ เจœเฉ‹ เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจฌเจฃเจพเจˆ เจธเฉ€เฅค Aws เจ—เจฒเฉ‚ เจ•เฉเจฐเจพเจฒเจฐ, เจœเจฟเจธ เจฌเจพเจฐเฉ‡ เจฎเฉˆเจ‚ เจฅเฉ‹เฉœเฉเจนเฉ€ เจฆเฉ‡เจฐ เจฌเจพเจ…เจฆ เจ—เฉฑเจฒ เจ•เจฐเจพเจ‚เจ—เจพ, เจ‡เฉฑเจ• S3 เจฌเจพเจฒเจŸเฉ€ เจตเจฟเฉฑเจš เจ…เจ—เฉ‡เจคเจฐเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเจพ, เจ‡เจธเจฒเจˆ เจ‡เจธเจจเฉ‚เฉฐ เจ–เจพเจฒเฉ€ เจ›เฉฑเจกเจฃเจพ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจนเฉˆเฅค

เจเจฎเจพเจœเจผเจพเจจ เจเจฅเฉ€เจจเจพ เจ…เจคเฉ‡ 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 เจชเฉ‹เจฐเจŸ เจนเฉˆ

เจนเฉเจฃ เจœเจฆเฉ‹เจ‚ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ 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 เจจเฉ‚เฉฐ เจฒเจพเจ— เจญเฉ‡เจœเจฃ kinesis firehose เจชเจฒเฉฑเจ—เจ‡เจจ:

<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 เจตเจฟเฉฑเจš เจฒเฉŒเจ— เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ‡เจ–เจฃเฉ€เจ†เจ‚ เจšเจพเจนเฉ€เจฆเฉ€เจ†เจ‚ เจนเจจเฅค 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 เจ—เจฒเฉ‚ เจ•เฉเจฐเจพเจฒเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจœเฉ‹ S3 เจตเจฟเฉฑเจš เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจ•เฉเจฐเฉŒเจฒ เจ•เจฐเฉ‡เจ—เจพ เจ…เจคเฉ‡ เจ—เจฒเฉ‚ เจฎเฉ‡เจŸเจพเจธเจŸเฉ‹เจฐ เจตเจฟเฉฑเจš เจญเจพเจ— เจœเจพเจฃเจ•เจพเจฐเฉ€ เจฒเจฟเจ– เจฆเฉ‡เจตเฉ‡เจ—เจพเฅค เจ‡เจน เจธเจพเจจเฉ‚เฉฐ เจเจฅเฉ€เจจเจพ เจคเฉ‹เจ‚ เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจญเจพเจ—เจพเจ‚ เจจเฉ‚เฉฐ เจซเจฟเจฒเจŸเจฐ เจตเจœเฉ‹เจ‚ เจตเจฐเจคเจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเฉ‡เจตเฉ‡เจ—เจพ, เจ…เจคเฉ‡ เจ‡เจน เจธเจฟเจฐเจซเจผ เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจตเจฟเฉฑเจš เจฆเจฟเฉฑเจคเฉ€เจ†เจ‚ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจธเจ•เฉˆเจจ เจ•เจฐเฉ‡เจ—เจพเฅค

เจเจฎเจพเจœเจผเจพเจจ เจ—เจฒเฉ‚ เจ•เฉเจฐเจพเจฒเจฐ เจธเฉˆเจŸ เจ…เจช เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ

Amazon Glue Crawler S3 เจฌเจพเจฒเจŸเฉ€ เจตเจฟเฉฑเจš เจธเจพเจฐเฉ‡ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจธเจ•เฉˆเจจ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจญเจพเจ—เจพเจ‚ เจจเจพเจฒ เจŸเฉ‡เจฌเจฒ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค AWS เจ—เจฒเฉ‚ เจ•เฉฐเจธเฉ‹เจฒ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจ—เจฒเฉ‚ เจ•เฉเจฐเจพเจฒเจฐ เจฌเจฃเจพเจ“ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจฌเจพเจฒเจŸเฉ€ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹ เจœเจฟเฉฑเจฅเฉ‡ เจคเฉเจธเฉ€เจ‚ เจกเฉ‡เจŸเจพ เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เฅค เจคเฉเจธเฉ€เจ‚ เจ•เจˆ เจฌเจพเจฒเจŸเฉ€เจ†เจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจ•เฉเจฐเจพเจฒเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจ‡เจน เจจเจฟเจธเจผเจšเจฟเจค เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจ‰เจนเจจเจพเจ‚ เจจเจพเจตเจพเจ‚ เจจเจพเจฒ เจŸเฉ‡เจฌเจฒ เจฌเจฃเจพเจเจ—เจพ เจœเฉ‹ เจฌเจพเจฒเจŸเฉ€เจ†เจ‚ เจฆเฉ‡ เจจเจพเจฎ เจจเจพเจฒ เจฎเฉ‡เจฒ เจ–เจพเจ‚เจฆเฉ‡ เจนเจจเฅค เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจจเจฟเจฏเจฎเจฟเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เจธ เจกเฉ‡เจŸเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€ เจฏเฉ‹เจœเจจเจพ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจ†เจชเจฃเฉ€เจ†เจ‚ เจœเจผเจฐเฉ‚เจฐเจคเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเจจ เจฒเจˆ เจ•เฉเจฐเจพเจฒเจฐ เจฆเฉ‡ เจฒเจพเจ‚เจš เจ…เจจเฉเจธเฉ‚เจšเฉ€ เจจเฉ‚เฉฐ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเจจเจพ เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ“เฅค เจ…เจธเฉ€เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจŸเฉ‡เจฌเจฒเจพเจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจ•เฉเจฐเจพเจฒเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจœเฉ‹ เจนเจฐ เจ˜เฉฐเจŸเฉ‡ เจšเฉฑเจฒเจฆเจพ เจนเฉˆเฅค

เจตเจฟเจญเจพเจœเจฟเจค เจŸเฉ‡เจฌเจฒ

เจ•เฉเจฐเจพเจฒเจฐ เจฆเฉ‡ เจชเจนเจฟเจฒเฉ‡ เจฒเจพเจ‚เจš เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจนเจฐเฉ‡เจ• เจธเจ•เฉˆเจจ เจ•เฉ€เจคเฉ€ เจฌเจพเจฒเจŸเฉ€ เจฒเจˆ เจŸเฉ‡เจฌเจฒ เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ เจตเจฟเฉฑเจš เจฆเจฐเจธเจพเจ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจฃเฉ‡ เจšเจพเจนเฉ€เจฆเฉ‡ เจนเจจเฅค เจเจฅเฉ€เจจเจพ เจ•เฉฐเจธเฉ‹เจฒ เจ–เฉ‹เจฒเฉเจนเฉ‹ เจ…เจคเฉ‡ 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 เจตเจœเฉ‡ เจฆเฉ‡ เจตเจฟเจšเจ•เจพเจฐ เจชเฉเจฐเจพเจชเจค เจนเฉ‹เจ เจธเจพเจฐเฉ‡ เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจฆเฉ€ เจšเฉ‹เจฃ เจ•เจฐเฉ‡เจ—เฉ€เฅค เจชเจฐ เจ‡เจน เจ‡เฉฑเจ• เจ—เฉˆเจฐ-เจตเจฟเจญเจพเจœเจจ เจธเจพเจฐเจฃเฉ€ เจคเฉ‹เจ‚ เจชเฉœเฉเจนเจจ เจจเจพเจฒเฉ‹เจ‚ เจ•เจฟเฉฐเจจเจพ เจ•เฉ เจ•เฉเจธเจผเจฒ เจนเฉˆ? เจ†เจ‰ เจ‰เจนเฉ€ เจฐเจฟเจ•เจพเจฐเจก เจฒเฉฑเจญเฉ€เจ เจ…เจคเฉ‡ เจšเฉเจฃเฉ€เจ, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจŸเจพเจˆเจฎเจธเจŸเฉˆเจ‚เจช เจฆเฉเจ†เจฐเจพ เจซเจฟเจฒเจŸเจฐ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ:

เจเจฎเจพเจœเจผเจพเจจ เจเจฅเฉ€เจจเจพ เจ…เจคเฉ‡ Cube.js เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ Nginx เจฒเฉŒเจ— เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ

3.59 เจธเจ•เจฟเฉฐเจŸ เจ…เจคเฉ‡ 244.34 เจฎเฉˆเจ—เจพเจฌเจพเจˆเจŸ เจกเฉ‡เจŸเจพเจธเฉ‡เจŸ 'เจคเฉ‡ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจนเจซเจผเจคเฉ‡ เจฆเฉ‡ เจฒเฉŒเจ— เจฆเฉ‡ เจจเจพเจฒเฅค เจ†เจ‰ เจญเจพเจ— เจฆเฉเจ†เจฐเจพ เจ‡เฉฑเจ• เจซเจฟเจฒเจŸเจฐ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจ:

เจเจฎเจพเจœเจผเจพเจจ เจเจฅเฉ€เจจเจพ เจ…เจคเฉ‡ 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹