Amazon Athena āĻāĻŦāĻ‚ Cube.js āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ Nginx āĻ˛āĻ— āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖ

āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤, āĻŦāĻžāĻŖāĻŋāĻœā§āĻ¯āĻŋāĻ• āĻĒāĻŖā§āĻ¯ āĻŦāĻž āĻ°ā§‡āĻĄāĻŋāĻŽā§‡āĻĄ āĻ“āĻĒā§‡āĻ¨ āĻ¸ā§‹āĻ°ā§āĻ¸ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ, āĻ¯ā§‡āĻŽāĻ¨ Prometheus + Grafana, Nginx-āĻāĻ° āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ˛āĻžāĻĒ āĻ¨āĻŋāĻ°ā§€āĻ•ā§āĻˇāĻŖ āĻāĻŦāĻ‚ āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻāĻŸāĻŋ āĻĒāĻ°ā§āĻ¯āĻŦā§‡āĻ•ā§āĻˇāĻŖ āĻŦāĻž āĻ°āĻŋāĻ¯āĻŧā§‡āĻ˛-āĻŸāĻžāĻ‡āĻŽ āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ­āĻžāĻ˛ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ¤āĻŋāĻšāĻžāĻ¸āĻŋāĻ• āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ–ā§āĻŦ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻœāĻ¨āĻ• āĻ¨āĻ¯āĻŧāĨ¤ āĻ¯ā§‡āĻ•ā§‹āĻ¨ā§‹ āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻ¸āĻŽā§āĻĒāĻĻā§‡, nginx āĻ˛āĻ— āĻĨā§‡āĻ•ā§‡ āĻĄā§‡āĻŸāĻžāĻ° āĻĒāĻ°āĻŋāĻŽāĻžāĻŖ āĻĻā§āĻ°ā§āĻ¤ āĻŦā§ƒāĻĻā§āĻ§āĻŋ āĻĒāĻžāĻšā§āĻ›ā§‡, āĻāĻŦāĻ‚ āĻŦāĻŋāĻĒā§āĻ˛ āĻĒāĻ°āĻŋāĻŽāĻžāĻŖ āĻĄā§‡āĻŸāĻž āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻ°āĻ“ āĻŦāĻŋāĻļā§‡āĻˇ āĻ•āĻŋāĻ›ā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§ŒāĻ•ā§āĻ¤āĻŋāĻ•āĨ¤

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡ āĻ†āĻŽāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŦāĻ˛āĻŦ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ—ā§āĻ°ā§€āĻ• āĻĒā§āĻ°āĻžāĻŖā§‡āĻ° āĻĻā§‡āĻŦā§€ āĻ˛āĻ— āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖ āĻ•āĻ°āĻ¤ā§‡, Nginx-āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ¨āĻŋāĻšā§āĻ›āĻŋ, āĻāĻŦāĻ‚ āĻ†āĻŽāĻŋ āĻĻā§‡āĻ–āĻžāĻŦ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ“āĻĒā§‡āĻ¨-āĻ¸ā§‹āĻ°ā§āĻ¸ cube.js āĻĢā§āĻ°ā§‡āĻŽāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻāĻ‡ āĻĄā§‡āĻŸāĻž āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖāĻžāĻ¤ā§āĻŽāĻ• āĻĄā§āĻ¯āĻžāĻļāĻŦā§‹āĻ°ā§āĻĄ āĻāĻ•āĻ¤ā§āĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧāĨ¤ āĻāĻ–āĻžāĻ¨ā§‡ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ° āĻ†āĻ›ā§‡:

Amazon Athena āĻāĻŦāĻ‚ Cube.js āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ Nginx āĻ˛āĻ— āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖ

TL:DR;
āĻ¸āĻŽāĻžāĻĒā§āĻ¤ āĻĄā§āĻ¯āĻžāĻļāĻŦā§‹āĻ°ā§āĻĄ āĻ˛āĻŋāĻ™ā§āĻ•.

āĻ¤āĻĨā§āĻ¯ āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻ•āĻ°āĻ¤ā§‡ āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ āĻ¸āĻžāĻŦāĻ˛ā§€āĻ˛, āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ - AWS Kinesis āĻĄā§‡āĻŸāĻž āĻĢāĻžāĻ¯āĻŧāĻžāĻ°āĻšā§‹āĻœ и āĻāĻĄāĻžāĻŦā§āĻ˛ā§āĻāĻ¸ āĻ†āĻ āĻžāĻ˛ā§‹, āĻ¸āĻžā§āĻšāĻ¯āĻŧā§‡āĻ° āĻœāĻ¨ā§āĻ¯ - āĻāĻĄāĻžāĻŦā§āĻ˛ā§āĻāĻ¸ āĻāĻ¸ 3. āĻāĻ‡ āĻŦāĻžāĻ¨ā§āĻĄāĻŋāĻ˛āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° 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-āĻ āĻĄā§‡āĻŸāĻž āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ā§ˇ āĻĒāĻ°ā§‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡ āĻ†āĻŽāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŦāĻ˛āĻŦ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ˛āĻ—āĻ—ā§āĻ˛āĻŋ āĻ¸āĻ āĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻ¯ā§āĻ•ā§āĻ¤ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ, āĻ¤āĻŦā§‡ āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ¸ 3 āĻ āĻāĻ•āĻŸāĻŋ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻŦāĻžāĻ˛āĻ¤āĻŋ āĻĻāĻ°āĻ•āĻžāĻ°, āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ…āĻ¨ā§āĻ¯ āĻ•āĻŋāĻ›ā§āĻ‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻ¨āĻžāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ•ā§‹āĻ¨ āĻ…āĻžā§āĻšāĻ˛ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻŦāĻžāĻ˛āĻ¤āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¤āĻž āĻ†āĻ—ā§‡ āĻĨā§‡āĻ•ā§‡āĻ‡ āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°āĻž āĻŽā§‚āĻ˛ā§āĻ¯āĻŦāĻžāĻ¨, āĻ•āĻžāĻ°āĻŖ āĻ…ā§āĻ¯āĻžāĻĨā§‡āĻ¨āĻž āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ…āĻžā§āĻšāĻ˛ā§‡ āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻ¨āĻ¯āĻŧāĨ¤

āĻāĻĨā§‡āĻ¨āĻž āĻ•āĻ¨āĻ¸ā§‹āĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ°ā§āĻ•āĻŋāĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻ˛āĻ—ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻĨā§‡āĻ¨āĻžāĻ¯āĻŧ āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻ¯āĻžāĻ•āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ Kinesis Firehose āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻĒāĻ°āĻŋāĻ•āĻ˛ā§āĻĒāĻ¨āĻž āĻ•āĻ°ā§‡āĻ¨ āĻ¤āĻŦā§‡ āĻ˛ā§‡āĻ–āĻž āĻāĻŦāĻ‚ āĻĒāĻĄāĻŧāĻž āĻ‰āĻ­āĻ¯āĻŧā§‡āĻ° āĻœāĻ¨ā§āĻ¯āĻ‡ āĻāĻŸāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨āĨ¤ āĻāĻĨā§‡āĻ¨āĻž āĻ•āĻ¨āĻ¸ā§‹āĻ˛ āĻ–ā§āĻ˛ā§āĻ¨ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨:

āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ

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 āĻĒā§‹āĻ°ā§āĻŸāĨ¤

āĻāĻ–āĻ¨ āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻžāĻĻā§‡āĻ° 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>

āĻ—ā§āĻ°ā§€āĻ• āĻĒā§āĻ°āĻžāĻŖā§‡āĻ° āĻĻā§‡āĻŦā§€

āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ¸āĻ āĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°ā§‡ āĻĨāĻžāĻ•ā§‡āĻ¨, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ•āĻŋāĻ›ā§āĻ•ā§āĻˇāĻŖ āĻĒāĻ°ā§‡ (āĻĄāĻŋāĻĢāĻ˛ā§āĻŸāĻ°ā§‚āĻĒā§‡, āĻ•āĻžāĻ‡āĻ¨ā§‡āĻ¸āĻŋāĻ¸ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻĒā§āĻ°āĻ¤āĻŋ 10 āĻŽāĻŋāĻ¨āĻŋāĻŸā§‡ āĻāĻ•āĻŦāĻžāĻ° āĻĄā§‡āĻŸāĻž āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻšāĻ¯āĻŧ) āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ S3-āĻ¤ā§‡ āĻ˛āĻ— āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ•āĻžāĻ‡āĻ¨ā§‡āĻ¸āĻŋāĻ¸ āĻĢāĻžāĻ¯āĻŧāĻžāĻ°āĻšā§‹āĻ¸ā§‡āĻ° "āĻŽāĻ¨āĻŋāĻŸāĻ°āĻŋāĻ‚" āĻŽā§‡āĻ¨ā§āĻ¤ā§‡ āĻ†āĻĒāĻ¨āĻŋ 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 āĻāĻŽāĻŦāĻŋāĨ¤

āĻāĻŸāĻŋ āĻ āĻŋāĻ• āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻ°āĻž AWS Glue Crawler āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ, āĻ¯āĻž S3-āĻ āĻĄā§‡āĻŸāĻž āĻ•ā§āĻ°āĻ˛ āĻ•āĻ°āĻŦā§‡ āĻāĻŦāĻ‚ Glue Metastore-āĻ āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ā§‡āĻ° āĻ¤āĻĨā§āĻ¯ āĻ˛āĻŋāĻ–āĻŦā§‡āĨ¤ āĻāĻŸāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ…ā§āĻ¯āĻžāĻĨā§‡āĻ¨āĻžāĻ•ā§‡ āĻ…āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻ•āĻŸāĻŋ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨āĻ—ā§āĻ˛āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻŦā§‡ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ•ā§‹āĻ¯āĻŧā§‡āĻ°āĻŋāĻ¤ā§‡ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻĄāĻŋāĻ°ā§‡āĻ•ā§āĻŸāĻ°āĻŋāĻ—ā§āĻ˛āĻŋ āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ¨ āĻ•āĻ°āĻŦā§‡āĨ¤

Amazon Glue Crawler āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

Amazon Glue Crawler S3 āĻŦāĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ¨ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ āĻ¸āĻš āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĨ¤ AWS Glue āĻ•āĻ¨āĻ¸ā§‹āĻ˛ āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ Glue Crawler āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ˛āĻ¤āĻŋ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻĄā§‡āĻŸāĻž āĻ¸āĻžā§āĻšāĻ¯āĻŧ āĻ•āĻ°ā§‡āĻ¨āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻŦāĻžāĻ˛āĻ¤āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ•ā§āĻ°āĻ˛āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻāĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻŦāĻžāĻ˛āĻ¤āĻŋāĻ—ā§āĻ˛āĻŋāĻ° āĻ¨āĻžāĻŽā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻŽā§‡āĻ˛ā§‡ āĻāĻŽāĻ¨ āĻ¨āĻžāĻŽāĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŦā§‡ā§ˇ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻ‡ āĻĄā§‡āĻŸāĻž āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻŋāĻ¤ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻĒāĻ°āĻŋāĻ•āĻ˛ā§āĻĒāĻ¨āĻž āĻ•āĻ°ā§‡āĻ¨, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ…āĻ¨ā§āĻ¸āĻžāĻ°ā§‡ āĻ•ā§āĻ°āĻ˛āĻžāĻ°ā§‡āĻ° āĻ˛āĻžā§āĻšā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§‚āĻšā§€ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻ­ā§āĻ˛āĻŦā§‡āĻ¨ āĻ¨āĻžāĨ¤ āĻ†āĻŽāĻ°āĻž āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ•ā§āĻ°āĻ˛āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ, āĻ¯āĻž āĻĒā§āĻ°āĻ¤āĻŋ āĻ˜āĻ¨ā§āĻŸāĻžāĻ¯āĻŧ āĻšāĻ˛ā§‡āĨ¤

āĻŦāĻŋāĻ­āĻžāĻœāĻŋāĻ¤ āĻŸā§‡āĻŦāĻŋāĻ˛

āĻ•ā§āĻ°āĻ˛āĻžāĻ°ā§‡āĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻ˛āĻžā§āĻšā§‡āĻ° āĻĒāĻ°ā§‡, āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ¨ āĻ•āĻ°āĻž āĻŦāĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŸā§‡āĻŦāĻŋāĻ˛āĻ—ā§āĻ˛āĻŋ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ā§‡ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻž āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻ‰āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤ āĻšāĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤ Athena āĻ•āĻ¨āĻ¸ā§‹āĻ˛ āĻ–ā§āĻ˛ā§āĻ¨ āĻāĻŦāĻ‚ 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 āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖāĻžāĻ¤ā§āĻŽāĻ• āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋāĨ¤ āĻāĻŸāĻŋāĻ¤ā§‡ āĻ…āĻ¨ā§‡āĻ•āĻ—ā§āĻ˛āĻŋ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¤āĻŦā§‡ āĻ†āĻŽāĻ°āĻž āĻĻā§āĻŸāĻŋ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻ†āĻ—ā§āĻ°āĻšā§€: āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻāĻŦāĻ‚ āĻĄā§‡āĻŸāĻž āĻĒā§āĻ°āĻžāĻ•-āĻāĻ•āĻ¤ā§āĻ°ā§€āĻ•āĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻžāĨ¤ āĻāĻŸāĻŋ āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻ•āĻŋāĻŽāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻ•āĻŋāĻŽāĻž, āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‡ āĻ˛ā§‡āĻ–āĻžāĨ¤ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻ•āĻŋāĻŽāĻžāĻ¤ā§‡ āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°āĻŸāĻŋ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ āĻ¤āĻž āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

āĻ†āĻ¸ā§āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ 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āĻāĻ•āĻŸāĻŋ āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ•ā§‹āĻ¯āĻŧā§‡āĻ°āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡āĨ¤

āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻ†āĻŽāĻ°āĻž āĻĄā§āĻ¯āĻžāĻļāĻŦā§‹āĻ°ā§āĻĄā§‡ āĻ¯ā§‡ āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸ āĻāĻŦāĻ‚ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ°āĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡ āĻ¤āĻž āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻžāĻ•-āĻ¸āĻŽāĻˇā§āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻŋāĨ¤ 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 āĻŦā§āĻ¯āĻžāĻ•āĻāĻ¨ā§āĻĄ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡ āĻŦāĻŋāĻļā§āĻ°āĻžāĻŽ āĻāĻĒāĻŋāĻ†āĻ‡ āĻāĻŦāĻ‚ āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻĢā§āĻ°āĻ¨ā§āĻŸ-āĻāĻ¨ā§āĻĄ āĻĢā§āĻ°ā§‡āĻŽāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ¸ā§‡āĻŸāĨ¤ āĻ†āĻŽāĻ°āĻž āĻĄā§āĻ¯āĻžāĻļāĻŦā§‹āĻ°ā§āĻĄ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦāĨ¤ 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

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨