āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤, āĻŦāĻžāĻŖāĻŋāĻā§āĻ¯āĻŋāĻ āĻĒāĻŖā§āĻ¯ āĻŦāĻž āĻ°ā§āĻĄāĻŋāĻŽā§āĻĄ āĻāĻĒā§āĻ¨ āĻ¸ā§āĻ°ā§āĻ¸ āĻŦāĻŋāĻāĻ˛ā§āĻĒ, āĻ¯ā§āĻŽāĻ¨ Prometheus + Grafana, Nginx-āĻāĻ° āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ˛āĻžāĻĒ āĻ¨āĻŋāĻ°ā§āĻā§āĻˇāĻŖ āĻāĻŦāĻ āĻŦāĻŋāĻļā§āĻ˛ā§āĻˇāĻŖ āĻāĻ°āĻ¤ā§ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻāĻāĻŋ āĻĒāĻ°ā§āĻ¯āĻŦā§āĻā§āĻˇāĻŖ āĻŦāĻž āĻ°āĻŋāĻ¯āĻŧā§āĻ˛-āĻāĻžāĻāĻŽ āĻŦāĻŋāĻļā§āĻ˛ā§āĻˇāĻŖā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻāĻžāĻ˛ āĻŦāĻŋāĻāĻ˛ā§āĻĒ, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ¤āĻŋāĻšāĻžāĻ¸āĻŋāĻ āĻŦāĻŋāĻļā§āĻ˛ā§āĻˇāĻŖā§āĻ° āĻāĻ¨ā§āĻ¯ āĻā§āĻŦ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻāĻ¨āĻ āĻ¨āĻ¯āĻŧāĨ¤ āĻ¯ā§āĻā§āĻ¨ā§ āĻāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻ¸āĻŽā§āĻĒāĻĻā§, nginx āĻ˛āĻ āĻĨā§āĻā§ āĻĄā§āĻāĻžāĻ° āĻĒāĻ°āĻŋāĻŽāĻžāĻŖ āĻĻā§āĻ°ā§āĻ¤ āĻŦā§āĻĻā§āĻ§āĻŋ āĻĒāĻžāĻā§āĻā§, āĻāĻŦāĻ āĻŦāĻŋāĻĒā§āĻ˛ āĻĒāĻ°āĻŋāĻŽāĻžāĻŖ āĻĄā§āĻāĻž āĻŦāĻŋāĻļā§āĻ˛ā§āĻˇāĻŖ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻ°āĻ āĻŦāĻŋāĻļā§āĻˇ āĻāĻŋāĻā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻ¯ā§āĻā§āĻ¤āĻŋāĻāĨ¤
āĻāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§ āĻāĻŽāĻŋ āĻāĻĒāĻ¨āĻžāĻā§ āĻŦāĻ˛āĻŦ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻĒāĻ¨āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨
TL:DR;
āĻ¤āĻĨā§āĻ¯ āĻ¸āĻāĻā§āĻ°āĻš āĻāĻ°āĻ¤ā§ āĻāĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŋ
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" āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻāĻ¨ āĻāĻ°ā§āĻ¨:
āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻā§āĻ¯āĻžāĻŦā§, "āĻ°ā§āĻāĻ°ā§āĻĄ āĻĢāĻ°ā§āĻŽā§āĻ¯āĻžāĻ āĻ°ā§āĻĒāĻžāĻ¨ā§āĻ¤āĻ°" - "āĻ¸āĻā§āĻˇāĻŽ" āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻāĻ¨ āĻāĻ°ā§āĻ¨ āĻāĻŦāĻ āĻ°ā§āĻāĻ°ā§āĻĄāĻŋāĻ āĻĢāĻ°ā§āĻŽā§āĻ¯āĻžāĻ āĻšāĻŋāĻ¸āĻžāĻŦā§ "Apache ORC" āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻāĻ¨ āĻāĻ°ā§āĻ¨ā§ˇ āĻāĻŋāĻā§ āĻāĻŦā§āĻˇāĻŖāĻž āĻ
āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧā§
āĻāĻŽāĻ°āĻž āĻ¸ā§āĻā§āĻ°ā§āĻā§āĻ° āĻāĻ¨ā§āĻ¯ S3 āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻāĻ¨ āĻāĻ°āĻŋ āĻāĻŦāĻ āĻŦāĻžāĻ˛āĻ¤āĻŋāĻāĻŋ āĻ¯āĻž āĻāĻŽāĻ°āĻž āĻāĻā§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻāĻŋāĨ¤ Aws Glue Crawler, āĻ¯ā§āĻāĻž āĻ¨āĻŋāĻ¯āĻŧā§ āĻāĻŽāĻŋ āĻāĻāĻā§ āĻĒāĻ°ā§ āĻāĻĨāĻž āĻŦāĻ˛āĻŦ, S3 āĻŦāĻžāĻ˛āĻ¤āĻŋāĻ¤ā§ āĻāĻĒāĻ¸āĻ°ā§āĻ āĻĻāĻŋāĻ¯āĻŧā§ āĻāĻžāĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻ¨āĻž, āĻ¤āĻžāĻ āĻāĻāĻŋ āĻāĻžāĻ˛āĻŋ āĻ°āĻžāĻāĻž āĻā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻŖāĨ¤
āĻāĻĒāĻ¨āĻžāĻ° āĻ˛ā§āĻĄā§āĻ° āĻāĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻāĻ° āĻāĻ°ā§ āĻ āĻŦāĻļāĻŋāĻˇā§āĻ āĻŦāĻŋāĻāĻ˛ā§āĻĒāĻā§āĻ˛āĻŋ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§; āĻāĻŽāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻĄāĻŋāĻĢāĻ˛ā§āĻāĻā§āĻ˛āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŋāĨ¤ āĻŽāĻ¨ā§ āĻ°āĻžāĻāĻŦā§āĻ¨ āĻ¯ā§ S3 āĻāĻŽā§āĻĒā§āĻ°ā§āĻļāĻ¨ āĻāĻĒāĻ˛āĻŦā§āĻ§ āĻ¨āĻ¯āĻŧ, āĻ¤āĻŦā§ ORC āĻĄāĻŋāĻĢāĻ˛ā§āĻāĻ°ā§āĻĒā§ āĻ¨ā§āĻāĻŋāĻ āĻāĻŽā§āĻĒā§āĻ°ā§āĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§āĨ¤
āĻ¸āĻžāĻŦāĻ˛ā§āĻ˛
āĻāĻāĻ¨ āĻ¯ā§āĻšā§āĻ¤ā§ āĻāĻŽāĻ°āĻž āĻ˛āĻ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻŦāĻ āĻā§āĻ°āĻšāĻŖ āĻāĻ°āĻžāĻ° āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ° āĻāĻ°ā§āĻāĻŋ, āĻāĻŽāĻžāĻĻā§āĻ° āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤ āĻāĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŦā§
āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻāĻŽāĻžāĻĻā§āĻ° 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 āĻāĻžāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ°ā§āĻāĻ°ā§āĻĄ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻāĻ¨ āĻāĻ°āĻŦā§āĨ¤ āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻāĻŋ āĻ -āĻŦāĻŋāĻāĻžāĻāĻ¨ āĻā§āĻŦāĻŋāĻ˛ āĻĨā§āĻā§ āĻĒāĻĄāĻŧāĻžāĻ° āĻā§āĻ¯āĻŧā§ āĻāĻāĻŋ āĻāĻ¤ āĻŦā§āĻļāĻŋ āĻāĻžāĻ°ā§āĻ¯āĻāĻ°? āĻāĻ¸ā§āĻ¨ āĻāĻžāĻāĻŽāĻ¸ā§āĻā§āĻ¯āĻžāĻŽā§āĻĒ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻāĻ°ā§ āĻāĻāĻ āĻ°ā§āĻāĻ°ā§āĻĄāĻā§āĻ˛āĻŋ āĻā§āĻāĻā§ āĻŦā§āĻ° āĻāĻ°āĻŋ āĻāĻŦāĻ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻāĻ¨ āĻāĻ°āĻŋ:
āĻŽāĻžāĻ¤ā§āĻ° āĻāĻ āĻ¸āĻĒā§āĻ¤āĻžāĻš āĻ˛āĻ āĻ¸āĻš āĻāĻāĻāĻŋ āĻĄā§āĻāĻžāĻ¸ā§āĻā§ 3.59 āĻ¸ā§āĻā§āĻ¨ā§āĻĄ āĻāĻŦāĻ 244.34 āĻŽā§āĻāĻžāĻŦāĻžāĻāĻ āĻĄā§āĻāĻžāĨ¤ āĻāĻ¸ā§āĻ¨ āĻĒāĻžāĻ°ā§āĻāĻŋāĻļāĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻž āĻāĻāĻāĻŋ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻā§āĻˇā§āĻāĻž āĻāĻ°āĻŋ:
āĻāĻāĻā§ āĻĻā§āĻ°ā§āĻ¤, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻŖ - āĻŽāĻžāĻ¤ā§āĻ° 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`
}
}
});
āĻāĻāĻžāĻ¨ā§ āĻāĻŽāĻ°āĻž āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻāĻŋ
āĻāĻāĻžāĻĄāĻŧāĻžāĻ āĻāĻŽāĻ°āĻž āĻĄā§āĻ¯āĻžāĻļāĻŦā§āĻ°ā§āĻĄā§ āĻ¯ā§ āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸ āĻāĻŦāĻ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻāĻžāĻ°āĻā§āĻ˛āĻŋ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻāĻ°āĻ¤ā§ āĻāĻžāĻ āĻ¤āĻž āĻ¸ā§āĻ āĻāĻ°āĻŋ āĻāĻŦāĻ āĻĒā§āĻ°āĻžāĻ-āĻ¸āĻŽāĻˇā§āĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻ°āĻŋāĨ¤ 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 āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻ
āĻ¨ā§āĻ°ā§āĻ§āĻāĻŋ āĻā§āĻ°āĻšāĻŖ āĻāĻ°ā§
{
"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