เปเบเบเบเบปเบเบเบฐเบเบด, เบเบฐเบฅเบดเบเบเบฐเบเบฑเบเบเบฒเบเบเปเบฒเบซเบผเบทเบเบฒเบเปเบฅเบทเบญเบเบเบตเปเบเปเบญเบกเบเบตเปเบเบฐเปเบฎเบฑเบเปเบฅเปเบง, เปเบเบฑเปเบ: 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. เบเบตเปเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเปเบฒเบเปเบเบฑเบเบฎเบฑเบเบชเบฒเปเบฅเบฐเบงเบดเปเบเบฒเบฐเบเบฑเบเบเบถเบเบขเบนเปเปเบเบชเบฐเบเบฒเบเบเบตเปเบซเบเบถเปเบ, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒ Athena เบชเบฒเบกเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบฑเบเบเปเปเบกเบนเบเปเบ S3 เปเบเบเบเบปเบ. เบเปเปเบกเบฒเปเบเบเบปเบเบเบงเบฒเบกเบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฐเบเบญเบเบเปเบฒเบเบงเบดเบเบตเบเบฒเบเปเบเบตเปเบกเปเบฅเบฐเบเบฑเบเบเบถเบเบเบฒเบเบเบธเบเปเบเปเบเบขเปเบฒเบเบเบทเบเบเปเบญเบ, เปเบเปเบเปเบฒเบญเบดเบเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเบเบฑเบเบเบตเปเบชเบฐเบญเบฒเบเบขเบนเปเปเบ S3, เปเบเบดเปเบเบเปเปเบกเบตเบซเบเบฑเบเบญเบตเบเบเบตเปเบเบฐเปเบเบฑเบเปเบงเป. เบกเบฑเบเบเบธเปเบกเบเปเบฒเบเบตเปเบเบฐเบเบดเบเบฒเบฅเบฐเบเบฒเบฅเปเบงเบเบซเบเปเบฒเบงเปเบฒเบเปเบฒเบเบเบฐเบชเปเบฒเบเบเบฑเบเบเบญเบเปเบเบปเปเบฒเบขเบนเปเปเบเบเบฒเบเบเบทเปเบเปเบ, เปเบเบฒเบฐเบงเปเบฒ Athena เบเปเปเบชเบฒเบกเบฒเบเปเบเปเปเบเปเปเบเบเบธเบเบเบปเบเปเบเบ.
เบเบฒเบเบชเปเบฒเบเบงเบปเบเบเบญเบเปเบ Athena console
เปเบซเปเบชเปเบฒเบเบเบฒเบเบฐเบฅเบฒเบเปเบ Athena เบชเปเบฒเบฅเบฑเบเบเบฑเบเบเบถเบ. เบกเบฑเบเปเบเบฑเบเบชเบดเปเบเบเปเบฒเปเบเบฑเบเบชเปเบฒเบฅเบฑเบเบเบฑเบเบเบฒเบเบเบฝเบเปเบฅเบฐเบเบฒเบเบญเปเบฒเบเบเปเบฒเบเปเบฒเบเบงเบฒเบเปเบเบเบเบตเปเบเบฐเปเบเป Kinesis Firehose. เปเบเบตเบ Athena console เปเบฅเบฐเบชเปเบฒเบเบเบฒเบเบฐเบฅเบฒเบ:
เบเบฒเบเบชเปเบฒเบเบเบฒเบเบฐเบฅเบฒเบ 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 Stream
Kinesis Firehose เบเบฐเบเบฝเบเบเปเปเบกเบนเบเบเบตเปเปเบเปเบฎเบฑเบเบเบฒเบ Nginx เบซเบฒ S3 เปเบเบฎเบนเบเปเบเบเบเบตเปเปเบฅเบทเบญเบ, เปเบเปเบเบญเบญเบเปเบเบฑเบเปเบเปเบฅเบเบฐเบเปเบฅเบตเปเบเบฎเบนเบเปเบเบ YYYY/MM/DD/HH. เบเบตเปเบเบฐเปเบเบฑเบเบเบฐเปเบซเบเบเปเบเปเบงเบฅเบฒเบญเปเบฒเบเบเปเปเบกเบนเบ. เบเปเบฒเบเบชเบฒเบกเบฒเบ, เปเบเปเบเบญเบ, เบเบฝเบเปเบเบเบเบปเบเบเบฑเบ S3 เบเบฒเบ fluentd, เปเบเปเปเบเบเปเบฅเบฐเบเบตเบเบตเปเบเปเบฒเบเบเบฐเบเปเบญเบเบเบฝเบ JSON, เปเบฅเบฐเบเบตเปเบเปเปเบกเบตเบเบฐเบชเบดเบเบเบดเบเบฒเบเปเบเบทเปเบญเบเบเบฒเบเบเบฐเบซเบเบฒเบเปเบซเบเปเบเบญเบเปเบเบฅเป. เบเบญเบเบเบฒเบเบเบฑเปเบ, เปเบกเบทเปเบญเปเบเป PrestoDB เบซเบผเบท Athena, JSON เปเบกเปเบเบฎเบนเบเปเบเบเบเปเปเบกเบนเบเบเปเบฒเบเบตเปเบชเบธเบ. เบชเบฐเบเบฑเปเบเปเบเบตเบ Kinesis Firehose console, เบเบฅเบดเบ "เบชเปเบฒเบเบเบฒเบเบเบฑเบเบชเบปเปเบเบเบฐเปเบช", เปเบฅเบทเบญเบ "เปเบญเบปเบฒเปเบเบเบเบปเบ" เปเบเบเปเบญเบ "เบเบฒเบเบเบฑเบเบชเบปเปเบ":
เปเบเปเบเบเบเปเปเปเบ, เปเบฅเบทเบญเบ "เบเบฒเบเปเบเบเบฎเบนเบเปเบเบเบเบฒเบเบเบฑเบเบเบถเบ" - "เปเบเบตเบเปเบเปเบเบฒเบ" เปเบฅเบฐเปเบฅเบทเบญเบ "Apache ORC" เปเบเบฑเบเบฎเบนเบเปเบเบเบเบฒเบเบเบฑเบเบเบถเบ. เบญเบตเบเบเบฒเบกเบเบฒเบเบเบปเปเบเบเบงเปเบฒเบเบฒเบเบขเปเบฒเบ
เบเบงเบเปเบฎเบปเบฒเปเบฅเบทเบญเบ S3 เบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเบฑเบเบฎเบฑเบเบชเบฒเปเบฅเบฐเบเบฑเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบชเปเบฒเบเบเปเบญเบเบซเบเปเบฒเบเบตเป. Aws Glue Crawler, เบเบตเปเบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฐเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบเปเบฅเบฑเบเบเปเบญเบเบเปเปเบกเบฒ, เบเปเปเบชเบฒเบกเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบฑเบเบเปเบฒเบเปเบฒเบซเบเปเบฒเปเบเบเบฑเบ S3, เบชเบฐเบเบฑเปเบเบกเบฑเบเปเบเบฑเบเบชเบดเปเบเบชเปเบฒเบเบฑเบเบเบตเปเบเบฐเบเปเบญเบเปเบซเปเบกเบฑเบเบซเบงเปเบฒเบเปเบเบปเปเบฒ.
เบเบฒเบโเปเบฅเบทเบญเบโเบเบตเปโเบเบฑเบโเปเบซเบผเบทเบญโเบชเบฒโเบกเบฒเบโเปเบเปโเบฎเบฑเบโเบเบฒเบโเบเปเบฝเบโเปเบเบโเปเบเบโเบญเบตเบโเปเบชเปโเบเบฒเบโเปเบซเบผเบโเบเบญเบโเบเปเบฒเบโ; เปเบเบโเบเบปเบโเบเบฐโเบเบดโเบเปเบฒโเบเบฐโเปเบเบปเปเบฒโเปเบเปโเปเบโเบเบญเบโเบเบปเปเบโ. เปเบซเปเบชเบฑเบเปเบเบเบงเปเบฒเบเบฒเบเบเบตเบเบญเบฑเบ S3 เบเปเปเบชเบฒเบกเบฒเบเปเบเปเปเบเป, เปเบเป ORC เปเบเปเบเบฒเบเบเบตเบเบญเบฑเบเปเบเบเปเบเบตเบกเปเบเบเบเปเบฒเปเบฅเบตเปเบกเบเบปเปเบ.
เบเปเบญเบเปเบเปเบง
เปเบเบเบฑเบเบเบธเบเบฑเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฑเปเบเบเปเบฒเบเบฑเบเบเบถเบเบเบฒเบเปเบเบฑเบเบฎเบฑเบเบชเบฒเปเบฅเบฐเบเบฒเบเบฎเบฑเบ, เบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบเปเบฒเบเบปเบเบเบฒเบเบชเบปเปเบ. เบเบงเบเปเบฎเบปเบฒเบเบฐเบเปเบฒเปเบเป
เบเปเบญเบเบญเบทเปเบ, เบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเปเบเบฅเปเบเบฒเบเบเบฑเปเบเบเปเบฒ fluent.conf. เบชเปเบฒเบเบกเบฑเบเปเบฅเบฐเปเบเบตเปเบกเปเบซเบผเปเบ:
port 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
เปเบเบทเปเบญ cache เบเบฑเบเบเบถเบเบเปเบญเบเบเบตเปเบเบฐเบชเบปเปเบ. เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบฎเบฑเบเปเบเปเปเบเบเบเปเปเบกเบตเบเบฒเบเบเบตเป, เปเบเปเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเปเบกเบทเปเบญเบเปเบฒเบ restart, เบเปเบฒเบเบชเบฒเบกเบฒเบเบชเบนเบเปเบชเบเบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเบเบตเปเปเบเบฑเบเปเบงเปเปเบเบเบฒเบเบเบงเบฒเบกเบเปเบฒเบเปเบงเบเปเบฎเบเบเบฒเบ back-breaking. เบเปเบฒเบเบเบฑเบเบชเบฒเบกเบฒเบเปเบเปเบเบญเบเปเบเบเปเปเบเป; 24224 เปเบกเปเบเบเบญเบ Fluentd เปเบฅเบตเปเบกเบเบปเปเบ.
เปเบเบเบฑเบเบเบธเบเบฑเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบกเบต Fluentd เปเบฅเปเบ, เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบชเบปเปเบเบเบฑเบเบเบถเบ Nginx เบขเบนเปเบเบตเปเบเบฑเปเบ. เบเบงเบเปเบฎเบปเบฒเบเบปเบเบเบฐเบเบดเปเบฅเปเบงเปเบฅเปเบ Nginx เปเบ Docker container, เปเบเบเปเบฅเบฐเบเบตเบเบตเป Docker เบกเบตเปเบเปเบงเบตเบเบฒเบเปเบเบปเปเบฒเบชเบนเปเบฅเบฐเบเบปเบเบเบทเปเบเปเบกเบทเบญเบเบชเปเบฒเบฅเบฑเบ Fluentd:
$ docker run
--log-driver=fluentd
--log-opt fluentd-address=<FLUENTD-SERVER-ADDRESS>
--log-opt tag="{{.Name}}"
-v /some/content:/usr/share/nginx/html:ro
-d
nginx
เบเปเบฒเบเปเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบ Nginx เปเบเบเบเปเบฒเบเบเบฑเบ, เบเปเบฒเบเบชเบฒเบกเบฒเบเบเปเบฒเปเบเปเปเบเบฅเปเบเบฑเบเบเบถเบ, Fluentd เบกเบต
เบกเบฒเปเบเบตเปเบกเบเบฒเบเปเบเบเบงเบดเปเบเบฒเบฐเบเบฑเบเบเบถเบเบเบตเปเบเบณเบเบปเบเปเบงเปเบเปเบฒเบเปเบเบดเบเปเบชเปเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบตเปเบเปเบญเบเปเบเปเบง:
<filter YOUR-NGINX-TAG.*>
@type parser
key_name log
emit_invalid_record_to_error false
<parse>
@type json
</parse>
</filter>
เปเบฅเบฐเบเบฒเบเบชเบปเปเบเบเบฑเบเบเบถเบเปเบเบซเบฒ Kinesis เปเบเบเปเบเป
<match YOUR-NGINX-TAG.*>
@type kinesis_firehose
region region
delivery_stream_name <YOUR-KINESIS-STREAM-NAME>
aws_key_id <YOUR-AWS-KEY-ID>
aws_sec_key <YOUR_AWS-SEC_KEY>
</match>
Athena
เบเปเบฒเบเปเบฒเบเปเบเปเบเบฑเปเบเบเปเบฒเบเบธเบเบขเปเบฒเบเบขเปเบฒเบเบเบทเบเบเปเบญเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเปเบฅเบเบฐเบซเบเบถเปเบ (เปเบเบเบเปเบฒเปเบฅเบตเปเบกเบเบปเปเบ, Kinesis เบเบฑเบเบเบถเบเบเปเปเบกเบนเบเบเบตเปเปเบเปเบฎเบฑเบเบเบธเบเป 10 เบเบฒเบเบต) เบเปเบฒเบเบเบงเบเปเบซเบฑเบเปเบเบฅเปเบเบฑเบเบเบถเบเปเบ S3. เปเบเปเบกเบเบน "เบเบฒเบเบเบดเบเบเบฒเบก" เบเบญเบ Kinesis Firehose เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเบดเปเบเบเปเปเบกเบนเบเบซเบผเบฒเบเบเบฒเบเปเบเบเบตเปเบเบทเบเบเบฑเบเบเบถเบเปเบงเปเปเบ S3, เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบเบเบงเบฒเบกเบเบดเบเบเบฒเบ. เบขเปเบฒเบฅเบทเบกเปเบซเปเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบเบฒเบเบเบฝเบเปเบชเปเบเบฑเบ S3 เบเบฑเบเบเบปเบเบเบฒเบ Kinesis. เบเปเบฒ Kinesis เบเปเปเบชเบฒเบกเบฒเบเบงเบดเปเบเบฒเบฐเบเบฒเบเบญเบฑเบเปเบเป, เบกเบฑเบเบเบฐเปเบเบตเปเบกเบเปเปเบเบดเบเบเบฒเบเปเบชเปเปเบเบเบฑเบเบเบฝเบงเบเบฑเบ.
เปเบเบเบฑเบเบเบธเบเบฑเบเบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเบดเปเบเบเปเปเบกเบนเบเปเบ Athena. เปเบซเปเบเบญเบเบซเบฒเบเปเบฒเบฎเปเบญเบเบเปเบซเบผเปเบฒเบชเบธเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบชเบปเปเบเบเบทเบเบเปเปเบเบดเบเบเบฒเบ:
SELECT * FROM "db_name"."table_name" WHERE status > 499 ORDER BY created_at DESC limit 10;
เบเบณเบฅเบฑเบเบชเบฐเปเบเบเบเบฑเบเบเบถเบเบเบฑเบเปเบปเบเบชเบณเบฅเบฑเบเปเบเปเบฅเบฐเบเบณเบฎเปเบญเบเบเป
เปเบเบเบฑเบเบเบธเบเบฑเบเบเบฑเบเบเบถเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบเปเบเบทเบเบเบธเบเปเบเปเบเปเบฅเบฐเปเบเบฑเบเบฎเบฑเบเบชเบฒเปเบงเปเปเบ S3 เปเบ ORC, เบเบตเบเบญเบฑเบเปเบฅเบฐเบเบฝเบกเบเปเบญเบกเบชเปเบฒเบฅเบฑเบเบเบฒเบเบงเบดเปเบเบฒเบฐ. Kinesis Firehose เปเบกเปเปเบเปเบเบฑเบเบฅเบฐเบเบฝเบเปเบซเปเปเบเบปเบฒเปเบเบปเปเบฒเปเบเบปเปเบฒเปเบเปเบเบฅเบฒเบเบเบฒเบเบชเปเบฒเบฅเบฑเบเปเบเปเบฅเบฐเบเบปเปเบงเปเบกเบ. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบเบฒเบเปเบเบเบตเปเบเบฒเบเบฐเบฅเบฒเบเบเปเปเปเบเปเบเบทเบเปเบเปเบเบญเบญเบ, Athena เบเบฐเปเบซเบฅเบเบเปเปเบกเบนเบเบเบฐเบซเบผเบญเบเปเบงเบฅเบฒเปเบเบเบธเบเบเปเบฒเบฎเปเบญเบเบเป, เบกเบตเบเปเปเบเบปเบเปเบงเบฑเปเบเบเบตเปเบซเบฒเบเบฒเบ. เบเบตเปเปเบกเปเบเบเบฑเบเบซเบฒเปเบซเบเปเบชเปเบฒเบฅเบฑเบเบชเบญเบเปเบซเบเบเบปเบ:
- เบเบฐเบฅเบดเบกเบฒเบเบเปเปเบกเบนเบเปเบกเปเบเบเบฒเบเบเบฐเบซเบเบฒเบเบเบปเบงเบขเปเบฒเบเบเปเปเปเบเบทเปเบญเบ, เบเปเบฒเบฅเบปเบเบเบฒเบเบชเบญเบเบเบฒเบก;
- Athena เบเบทเบเปเบญเบตเปเบเปเบเบฑเบเปเบเบดเบเปเบเบเบญเบตเบเปเบชเปเบเบฐเบฅเบดเบกเบฒเบเบเปเปเบกเบนเบเบเบตเปเบเบทเบเบชเบฐเปเบเบ, เบขเปเบฒเบเบซเบเปเบญเบ 10 MB เบเปเปเบเปเบฒเบฎเปเบญเบเบเป.
เปเบเบทเปเบญเปเบเปเปเบเบเบตเป, เบเบงเบเปเบฎเบปเบฒเปเบเป AWS Glue Crawler, เปเบเบดเปเบเบเบฐเบฅเบงเบเบฅเบงเบกเบเปเปเบกเบนเบเปเบ S3 เปเบฅเบฐเบเบฝเบเบเปเปเบกเบนเบเบเบฒเบเปเบเปเบเบเบฑเบเปเบเบซเบฒ Glue Metastore. เบเบตเปเบเบฐเบเปเบงเบเปเบซเปเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเปเบเบฒเบเบดเบเบฑเบเปเบเบฑเบเบเบปเบงเบเบญเบเปเบเปเบงเบฅเบฒเบเบตเปเบชเบญเบเบเบฒเบก Athena, เปเบฅเบฐเบกเบฑเบเบเบฐเบเบฝเบเปเบเปเบชเบฐเปเบเบเปเบเปเบฅเบเบฐเบเปเบฅเบตเบเบตเปเบฅเบฐเบเบธเปเบงเปเปเบเปเบเบเบชเบญเบเบเบฒเบกเปเบเบปเปเบฒเบเบฑเปเบ.
เบเบฒเบเบเบฑเปเบเบเปเบฒ Amazon Glue Crawler
Amazon Glue Crawler เบชเบฐเปเบเบเบเปเปเบกเบนเบเบเบฑเบเปเบปเบเบขเบนเปเปเบเบเบฑเบ S3 เปเบฅเบฐเบชเปเบฒเบเบเบฒเบเบฐเบฅเบฒเบเบเบตเปเบกเบตเบเบฒเบเบดเบเบฑเบ. เบชเปเบฒเบ Glue Crawler เบเบฒเบ console AWS Glue เปเบฅเบฐเปเบเบตเปเบก bucket เบเปเบญเบเบเบตเปเบเปเบฒเบเปเบเบฑเบเบเปเปเบกเบนเบ. เบเปเบฒเบเบชเบฒเบกเบฒเบเบเปเบฒเปเบเปเบเบปเบงเบเบงเบฒเบเปเบงเบฑเบเบซเบเบถเปเบเบชเปเบฒเบฅเบฑเบเบซเบผเบฒเบเป buckets, เปเบเบเปเบฅเบฐเบเบตเบเบตเปเบกเบฑเบเบเบฐเบชเปเบฒเบเบเบฒเบเบฐเบฅเบฒเบเปเบเบเบฒเบเบเปเปเบกเบนเบเบเบตเปเบฅเบฐเบเบธเปเบงเปเบเปเบงเบเบเบทเปเบเบตเปเบเบปเบเบเบฑเบเบเบทเปเบเบญเบ buckets. เบเปเบฒเบเปเบฒเบเบงเบฒเบเปเบเบเบเบตเปเบเบฐเปเบเปเบเปเปเบกเบนเบเบเบตเปเปเบเบฑเบเบเบปเบเบเบฐเบเบด, เปเบซเปเปเบเปเปเบเบงเปเบฒเบเปเบฒเบเบปเบเปเบงเบฅเบฒเบเบฒเบเปเบเบตเบเบเบปเบงเบเบญเบ Crawler เปเบซเปเปเบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบเบเบงเบฒเบกเบเปเบญเบเบเบฒเบเบเบญเบเบเปเบฒเบ. เบเบงเบเปเบฎเบปเบฒเปเบเปเบเบปเบงเบเบงเบฒเบเปเบงเบฑเบเบญเบฑเบเบเบฝเบงเบชเปเบฒเบฅเบฑเบเบเบฒเบเบฐเบฅเบฒเบเบเบฑเบเบซเบกเบปเบ, เปเบเบดเปเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบธเบเปเบเบปเปเบงเปเบกเบ.
เบเบฒเบเบฐเบฅเบฒเบเปเบเปเบเบชเปเบงเบ
เบซเบผเบฑเบเบเบฒเบเบเบฒเบเปเบเบตเบเบเบปเบงเบเบฑเปเบเบเปเบฒเบญเบดเบเบเบญเบเบเบปเบงเบเบงเบฒเบเปเบงเบฑเบ, เบเบฒเบเบฐเบฅเบฒเบเบชเปเบฒเบฅเบฑเบเปเบเปเบฅเบฐเบเบฑเบเบเบตเปเบชเบฐเปเบเบเบเบงเบเบเบฐเบเบฒเบเบปเบเบขเบนเปเปเบเบเบฒเบเบเปเปเบกเบนเบเบเบตเปเบฅเบฐเบเบธเปเบงเปเปเบเบเบฒเบเบเบฑเปเบเบเปเบฒ. เปเบเบตเบ Athena console เปเบฅเบฐเบเบญเบเบซเบฒเบเบฒเบเบฐเบฅเบฒเบเบเบตเปเบกเบตเบเบฑเบเบเบถเบ 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 megabytes เบเบญเบเบเปเปเบกเบนเบเปเบเบเบธเบเบเปเปเบกเบนเบเบเบตเปเบกเบตเบเบฑเบเบเบถเบเบเบฝเบเปเบเปเบซเบเบถเปเบเบญเบฒเบเบดเบ. เบกเบฒเบฅเบญเบเปเบเปเบเบฒเบเบเบฑเปเบเบเบญเบเบเบฒเบกเบเบฒเบเปเบเปเบเบชเปเบงเบ:
เปเบงเบเบถเปเบเปเบฅเบฑเบเบเปเบญเบ, เปเบเปเบชเปเบฒเบเบฑเบเบเบตเปเบชเบธเบ - เบเบฝเบเปเบเป 1.23 megabytes เบเบญเบเบเปเปเบกเบนเบ! เบกเบฑเบเบเบฐเบกเบตเบฅเบฒเบเบฒเบเบทเบเบเบงเปเบฒเบซเบผเบฒเบเบเปเบฒเบเปเปเปเบกเปเบเบชเปเบฒเบฅเบฑเบเบเปเบฒเปเบชเบธเบเบเบตเป 10 megabytes เบเปเปเบเปเบฒเบฎเปเบญเบเบเปเบขเบนเปเปเบเบฅเบฒเบเบฒ. เปเบเปเบกเบฑเบเบเบฑเบเบเบตเบเบงเปเบฒเบซเบผเบฒเบ, เปเบฅเบฐเปเบเบเบธเบเบเปเปเบกเบนเบเบเบฐเบซเบเบฒเบเปเบซเบเป, เบเบงเบฒเบกเปเบเบเบเปเบฒเบเบเบฐเบเบฐเบเบฑเบเปเบเบซเบผเบฒเบ.
เบเบฒเบเบชเปเบฒเบ dashboard เปเบเบเปเบเป Cube.js
เปเบเบทเปเบญเบเบฐเบเบญเบ dashboard, เบเบงเบเปเบฎเบปเบฒเปเบเปเบเบญเบเบเบฒเบเบงเบดเปเบเบฒเบฐ Cube.js. เบกเบฑเบเบกเบตเบซเบเปเบฒเบเบตเปเบเปเบญเบเบเปเบฒเบเบซเบผเบฒเบ, เปเบเปเบเบงเบเปเบฎเบปเบฒเบชเบปเบเปเบเบชเบญเบเบขเปเบฒเบ: เบเบงเบฒเบกเบชเบฒเบกเบฒเบเปเบเบเบฒเบเบเปเบฒเปเบเปเบเบปเบงเบเบญเบเบเบฒเบเปเบเปเบเบเบฑเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเปเบฅเบฐเบเบฒเบเบฅเบงเบเบฅเบงเบกเบเปเปเบกเบนเบเบฅเปเบงเบเบซเบเปเบฒ. เบกเบฑเบเปเบเป schema เบเปเปเบกเบนเบ
เบกเบฒเบชเปเบฒเบเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบ Cube.js เปเปเป. เปเบเบทเปเบญเบเบเบฒเบเบเบงเบเปเบฎเบปเบฒเปเบเป AWS stack เบขเบนเปเปเบฅเปเบง, เบกเบฑเบเบชเบปเบกเปเบซเบเบชเบปเบกเบเบปเบเบเบตเปเบเบฐเปเบเป Lambda เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบดเบเบเบฑเปเบ. เบเปเบฒเบโเบชเบฒโเบกเบฒเบโเบเปเบฒโเปเบเปโเปเบกเปโเปเบเบโเบชเบฐโเปเบเบโเบญเบญเบโเบชเปเบฒโเบฅเบฑเบโเบเบฒเบโเบเบฐโเบฅเบดเบโเปเบเปโเบเปเบฒโเบซเบฒเบโเบงเปเบฒโเบเปเบฒเบโเบงเบฒเบโเปเบเบโเบเบตเปโเบเบฐโเปเบเบฑเบโเปเบเบปเปเบฒโเบเบฒเบ backend Cube.js เปเบ Heroku เบซเบผเบท Dockerโ. เปเบญเบเบฐเบชเบฒเบเบญเบฐเบเบดเบเบฒเบเบเบปเบเบญเบทเปเบ
$ 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`
}
}
});
เปเบเบเบตเปเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบฒเบฅเบฑเบเปเบเปเบเบปเบงเปเบ
เบเบงเบเปเบฎเบปเบฒเบเบฑเบเบเปเบฒเบเบปเบ metrics เปเบฅเบฐเบเบปเบงเบเปเบฒเบเบปเบเบเบฒเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเบเบตเปเบเบฐเบชเบฐเปเบเบเบขเบนเปเปเบ dashboard เปเบฅเบฐเบเปเบฒเบเบปเบเบเบฒเบเบฅเบงเบเบฅเบงเบกเบฅเปเบงเบเบซเบเปเบฒ. Cube.js เบเบฐเบชเปเบฒเบเบเบฒเบเบฐเบฅเบฒเบเปเบเบตเปเบกเปเบเบตเบกเบเบตเปเบกเบตเบเปเปเบกเบนเบเบฅเบงเบกเบฅเปเบงเบเบซเบเปเบฒเปเบฅเบฐเบเบฐเบเบฑเบเบเบธเบเบเปเปเบกเบนเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเปเบกเบทเปเบญเบกเบฑเบเบกเบฒเบฎเบญเบ. เบเบตเปเบเปเปเบเบฝเบเปเบเปเปเบฅเบฑเปเบเบเบฒเบเบชเบญเบเบเบฒเบก, เปเบเปเบเบฑเบเบซเบผเบธเบเบเปเบญเบเบเปเบฒเปเบเปเบเปเบฒเบเบเบญเบเบเบฒเบเบเปเบฒเปเบเป Athena.
เปเบซเปเปเบเบตเปเบกเบเปเปเบกเบนเบเบเบตเปเปเบชเปเปเบเบฅเป schema เบเปเปเบกเบนเบ:
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`
)
}
}
}
เบเบงเบเปเบฎเบปเบฒเบฅเบฐเบเบธเปเบเบฎเบนเบเปเบเบเบเบตเปเบงเปเบฒเบกเบฑเบเปเบเบฑเบเบชเบดเปเบเบเปเบฒเปเบเบฑเบเบเบตเปเบเบฐเบฅเบงเบเบฅเบงเบกเบเปเปเบกเบนเบเบฅเปเบงเบเบซเบเปเบฒเบชเปเบฒเบฅเบฑเบเบเบธเบ metrics เบเบตเปเปเบเป, เปเบฅเบฐเปเบเปเบเบฒเบเปเบเปเบเบเบฑเบเปเบเบเปเบเบทเบญเบ.
เปเบเบเบฑเบเบเบธเบเบฑเบเบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบเบฐเบเบญเบ dashboard เปเบเป!
Cube.js backend เปเบซเป
เปเบเบตเบเปเบงเบต Cube.js เบเบญเบกเบฎเบฑเบเบเบฒเบเบฎเปเบญเบเบเปเปเบ
{
"measures": ["Logs.errorCount"],
"timeDimensions": [
{
"dimension": "Logs.createdAt",
"dateRange": ["2019-01-01", "2019-01-07"],
"granularity": "day"
}
]
}
เปเบซเปเบเบดเบเบเบฑเปเบเบฅเบนเบเบเปเบฒเบ Cube.js เปเบฅเบฐเบซเปเบญเบเบชเบฐเปเบธเบเบญเบปเบเบเบฐเบเบญเบ React เบเปเบฒเบ NPM:
$ npm i --save @cubejs-client/core @cubejs-client/react
เบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบปเปเบฒเบชเปเบงเบเบเบฐเบเบญเบ cubejs
ะธ QueryRenderer
เปเบเบทเปเบญเบเบฒเบงเปเบซเบฅเบเบเปเปเบกเบนเบ, เปเบฅเบฐเปเบเบฑเบเบเปเบฒ dashboard:
เบฅเบฐเบซเบฑเบ dashboard
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>
);
}}
/>
)
}
เปเบซเบผเปเบ dashboard เบกเบตเบขเบนเป
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com