ΠΠ±ΠΈΡΠ½ΠΎ ΡΠ΅ ΠΊΠΎΠΌΠ΅ΡΡΠΈΡΠ°Π»Π½ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈ ΠΈΠ»ΠΈ Π³ΠΎΡΠΎΠ²Π΅ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π΅ ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΎΠ³ ΠΊΠΎΠ΄Π°, ΠΊΠ°ΠΎ ΡΡΠΎ ΡΡ ΠΡΠΎΠΌΠ΅ΡΡ Π΅ΡΡ + ΠΡΠ°ΡΠ°Π½Π°, ΠΊΠΎΡΠΈΡΡΠ΅ Π·Π° ΠΏΡΠ°ΡΠ΅ΡΠ΅ ΠΈ Π°Π½Π°Π»ΠΈΠ·Ρ ΡΠ°Π΄Π° ΠΠ³ΠΈΠ½ΠΊ-Π°. ΠΠ²ΠΎ ΡΠ΅ Π΄ΠΎΠ±ΡΠ° ΠΎΠΏΡΠΈΡΠ° Π·Π° ΠΏΡΠ°ΡΠ΅ΡΠ΅ ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΈΡΠΈΠΊΡ Ρ ΡΠ΅Π°Π»Π½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Ρ, Π°Π»ΠΈ Π½ΠΈΡΠ΅ Π±Π°Ρ Π·Π³ΠΎΠ΄Π½Π° Π·Π° ΠΈΡΡΠΎΡΠΈΡΡΠΊΡ Π°Π½Π°Π»ΠΈΠ·Ρ. ΠΠ° Π±ΠΈΠ»ΠΎ ΠΊΠΎΠΌ ΠΏΠΎΠΏΡΠ»Π°ΡΠ½ΠΎΠΌ ΡΠ΅ΡΡΡΡΡ, ΠΎΠ±ΠΈΠΌ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΠΈΠ· Π½Π³ΠΈΠ½ΠΊ Π΄Π½Π΅Π²Π½ΠΈΠΊΠ° Π±ΡΠ·ΠΎ ΡΠ°ΡΡΠ΅, Π° Π·Π° Π°Π½Π°Π»ΠΈΠ·Ρ Π²Π΅Π»ΠΈΠΊΠ΅ ΠΊΠΎΠ»ΠΈΡΠΈΠ½Π΅ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΡΠΈ Π½Π΅ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΡΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΈΡΠ΅.
Π£ ΠΎΠ²ΠΎΠΌ ΡΠ»Π°Π½ΠΊΡ ΡΡ Π²Π°ΠΌ ΡΠ΅ΡΠΈ ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΡΠΈ
Π’Π:ΠΠ ;
ΠΠ° ΠΏΡΠΈΠΊΡΠΏΡΠ°ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΠ° ΠΊΠΎΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠΎ
ΠΡΠΈΠΊΡΠΏΡΠ°ΡΠ΅ ΠΠ³ΠΈΠ½ΠΊ Π΄Π½Π΅Π²Π½ΠΈΠΊΠ°
ΠΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π½ΠΎ, ΠΠ³ΠΈΠ½ΠΊ Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅ ΠΈΠ·Π³Π»Π΅Π΄Π°ΡΡ ΠΎΡΠΏΡΠΈΠ»ΠΈΠΊΠ΅ ΠΎΠ²Π°ΠΊΠΎ:
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" "-"
ΠΠΎΠ³Ρ ΡΠ΅ ΡΠ°ΡΡΠ»Π°Π½ΠΈΡΠΈ, Π°Π»ΠΈ ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π»Π°ΠΊΡΠ΅ ΠΈΡΠΏΡΠ°Π²ΠΈΡΠΈ ΠΠ³ΠΈΠ½ΠΊ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡ ΡΠ°ΠΊΠΎ Π΄Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈ Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅ Ρ ΠΠ‘ΠΠ-Ρ:
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;
Π‘3 Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠ΅
ΠΠ° ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠ΅ Π΄Π½Π΅Π²Π½ΠΈΠΊΠ° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ΠΌΠΎ Π‘3. ΠΠ²ΠΎ Π²Π°ΠΌ ΠΎΠΌΠΎΠ³ΡΡΠ°Π²Π° Π΄Π° ΡΡΠ²Π°ΡΠ΅ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅ Π½Π° ΡΠ΅Π΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΡ, ΠΏΠΎΡΡΠΎ ΠΡΡ Π΅Π½Π° ΠΌΠΎΠΆΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π΄Π° ΡΠ°Π΄ΠΈ ΡΠ° ΠΏΠΎΠ΄Π°ΡΠΈΠΌΠ° Ρ Π‘3. ΠΠ°ΡΠ½ΠΈΡΠ΅ Ρ ΡΠ»Π°Π½ΠΊΡ ΡΡ Π²Π°ΠΌ ΡΠ΅ΡΠΈ ΠΊΠ°ΠΊΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ Π΄ΠΎΠ΄Π°ΡΠΈ ΠΈ ΠΎΠ±ΡΠ°Π΄ΠΈΡΠΈ Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅, Π°Π»ΠΈ ΠΏΡΠ²ΠΎ Π½Π°ΠΌ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½Π° ΡΠΈΡΡΠ° ΠΊΠ°Π½ΡΠ° Ρ Π‘3, Ρ ΠΊΠΎΡΠΎΡ Π½ΠΈΡΡΠ° Π΄ΡΡΠ³ΠΎ Π½Π΅ΡΠ΅ Π±ΠΈΡΠΈ ΡΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅Π½ΠΎ. ΠΡΠ΅Π΄ΠΈ ΡΠ½Π°ΠΏΡΠ΅Π΄ ΡΠ°Π·ΠΌΠΈΡΠ»ΠΈΡΠΈ Ρ ΠΊΠΎΠΌ ΡΠ΅Π³ΠΈΠΎΠ½Ρ ΡΠ΅ΡΠ΅ ΠΏΡΠ°Π²ΠΈΡΠΈ ΡΠ²ΠΎΡΡ ΠΊΠΎΡΠΏΡ, ΡΠ΅Ρ ΠΡΡ Π΅Π½Π° Π½ΠΈΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Π° Ρ ΡΠ²ΠΈΠΌ ΡΠ΅Π³ΠΈΠΎΠ½ΠΈΠΌΠ°.
ΠΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΊΠΎΠ»Π° Ρ ΠΡΡ Π΅Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»ΠΈ
Π₯Π°ΡΠ΄Π΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠΎ ΡΠ°Π±Π΅Π»Ρ Ρ ΠΡΠ΅Π½ΠΈ Π·Π° Π΄Π½Π΅Π²Π½ΠΈΠΊΠ΅. ΠΠΎΡΡΠ΅Π±Π°Π½ ΡΠ΅ ΠΈ Π·Π° ΠΏΠΈΡΠ°ΡΠ΅ ΠΈ Π·Π° ΡΠΈΡΠ°ΡΠ΅ Π°ΠΊΠΎ ΠΏΠ»Π°Π½ΠΈΡΠ°ΡΠ΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΠΈΠ½Π΅ΡΠΈΡ Π€ΠΈΡΠ΅Ρ ΠΎΡΠ΅. ΠΡΠ²ΠΎΡΠΈΡΠ΅ ΠΡΡ Π΅Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Ρ ΠΈ ΠΊΡΠ΅ΠΈΡΠ°ΡΡΠ΅ ΡΠ°Π±Π΅Π»Ρ:
ΠΡΠ΅ΠΈΡΠ°ΡΠ΅ Π‘ΠΠ ΡΠ°Π±Π΅Π»Π΅
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');
ΠΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΠΈΠ½Π΅ΡΠΈΡ Π€ΠΈΡΠ΅Ρ ΠΎΡΠ΅ Π‘ΡΡΠ΅Π°ΠΌ-Π°
ΠΠΈΠ½Π΅ΡΠΈΡ Π€ΠΈΡΠ΅Ρ ΠΎΡΠ΅ ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ ΠΏΡΠΈΠΌΡΠ΅Π½Π΅ ΠΎΠ΄ ΠΠ³ΠΈΠ½ΠΊ-Π° Π·Π°ΠΏΠΈΡΠ°ΡΠΈ Ρ Π‘3 Ρ ΠΈΠ·Π°Π±ΡΠ°Π½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΡ, ΠΏΠΎΠ΄Π΅Π»ΠΈΠ²ΡΠΈ ΠΈΡ Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌΠ΅ Ρ ΡΠΎΡΠΌΠ°ΡΡ ΠΠΠΠ/ΠΠ/ΠΠ/Π₯Π₯. ΠΠ²ΠΎ ΡΠ΅ Π²Π°ΠΌ Π΄ΠΎΠ±ΡΠΎ Π΄ΠΎΡΠΈ ΠΏΡΠΈΠ»ΠΈΠΊΠΎΠΌ ΡΠΈΡΠ°ΡΠ° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°. ΠΠΎΠΆΠ΅ΡΠ΅, Π½Π°ΡΠ°Π²Π½ΠΎ, ΠΏΠΈΡΠ°ΡΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Ρ Π‘3 ΠΈΠ· ΡΠ»ΡΠ΅Π½ΡΠ΄-Π°, Π°Π»ΠΈ Ρ ΠΎΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°ΡΡ ΡΠ΅ΡΠ΅ ΠΌΠΎΡΠ°ΡΠΈ Π΄Π° ΠΏΠΈΡΠ΅ΡΠ΅ ΠΠ‘ΠΠ, Π° ΡΠΎ ΡΠ΅ Π½Π΅Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΎ Π·Π±ΠΎΠ³ Π²Π΅Π»ΠΈΠΊΠ΅ Π²Π΅Π»ΠΈΡΠΈΠ½Π΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°. ΠΠΎΡΠ΅Π΄ ΡΠΎΠ³Π°, ΠΊΠ°Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΡΠ΅ΡΡΠΎΠΠ ΠΈΠ»ΠΈ ΠΡΡ Π΅Π½Π°, ΠΠ‘ΠΠ ΡΠ΅ Π½Π°ΡΡΠΏΠΎΡΠΈΡΠΈ ΡΠΎΡΠΌΠ°Ρ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°. ΠΠ°ΠΊΠ»Π΅, ΠΎΡΠ²ΠΎΡΠΈΡΠ΅ ΠΠΈΠ½Π΅ΡΠΈΡ Π€ΠΈΡΠ΅Ρ ΠΎΡΠ΅ ΠΊΠΎΠ½Π·ΠΎΠ»Ρ, ΠΊΠ»ΠΈΠΊΠ½ΠΈΡΠ΅ Π½Π° βΠΡΠ΅ΠΈΡΠ°Ρ ΡΠΎΠΊ ΠΈΡΠΏΠΎΡΡΠΊΠ΅β, ΠΈΠ·Π°Π±Π΅ΡΠΈΡΠ΅ βΠ΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΠ£Π’β Ρ ΠΏΠΎΡΡ βΠΈΡΠΏΠΎΡΡΠΊΠ°β:
ΠΠ° ΡΠ»Π΅Π΄Π΅ΡΠΎΡ ΠΊΠ°ΡΡΠΈΡΠΈ ΠΈΠ·Π°Π±Π΅ΡΠΈΡΠ΅ βΠΠΎΠ½Π²Π΅ΡΠ·ΠΈΡΠ° ΡΠΎΡΠΌΠ°ΡΠ° Π·Π°ΠΏΠΈΡΠ°β - βΠΠΌΠΎΠ³ΡΡΠ΅Π½ΠΎβ ΠΈ ΠΈΠ·Π°Π±Π΅ΡΠΈΡΠ΅ βΠΠΏΠ°ΡΡ
Π΅ ΠΠ Π¦β ΠΊΠ°ΠΎ ΡΠΎΡΠΌΠ°Ρ ΡΠ½ΠΈΠΌΠ°ΡΠ°. ΠΡΠ΅ΠΌΠ° Π½Π΅ΠΊΠΈΠΌ ΠΈΡΡΡΠ°ΠΆΠΈΠ²Π°ΡΠΈΠΌΠ°
ΠΠΈΡΠ°ΠΌΠΎ Π‘3 Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠ΅ ΠΈ ΠΊΠ°Π½ΡΡ ΠΊΠΎΡΡ ΡΠΌΠΎ ΡΠ°Π½ΠΈΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ°Π»ΠΈ. ΠΠ²Ρ ΠΠ»ΡΠ΅ Π¦ΡΠ°Π²Π»Π΅Ρ, ΠΎ ΠΊΠΎΠΌΠ΅ ΡΡ Π³ΠΎΠ²ΠΎΡΠΈΡΠΈ ΠΌΠ°Π»ΠΎ ΠΊΠ°ΡΠ½ΠΈΡΠ΅, Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ°Π΄ΠΈ ΡΠ° ΠΏΡΠ΅ΡΠΈΠΊΡΠΈΠΌΠ° Ρ Π‘3 ΠΊΠ°Π½ΡΠΈ, ΠΏΠ° ΡΠ΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° Π³Π° ΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΠΏΡΠ°Π·Π½ΠΈΠΌ.
ΠΡΠ΅ΠΎΡΡΠ°Π»Π΅ ΠΎΠΏΡΠΈΡΠ΅ ΡΠ΅ ΠΌΠΎΠ³Ρ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠΈ Ρ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ ΠΎΠ΄ Π²Π°ΡΠ΅Π³ ΠΎΠΏΡΠ΅ΡΠ΅ΡΠ΅ΡΠ°; ΠΎΠ±ΠΈΡΠ½ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠΌ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π½Π΅. ΠΠΌΠ°ΡΡΠ΅ Π½Π° ΡΠΌΡ Π΄Π° Π‘3 ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡΠ° Π½ΠΈΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Π°, Π°Π»ΠΈ ΠΠ Π¦ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π½ΠΎ ΠΊΠΎΡΠΈΡΡΠΈ ΠΈΠ·Π²ΠΎΡΠ½Ρ ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡΡ.
Π€Π»ΡΠ΅Π½ΡΠ΄
Π‘Π°Π΄Π° ΠΊΠ°Π΄Π° ΡΠΌΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π»ΠΈ ΡΡΠ²Π°ΡΠ΅ ΠΈ ΠΏΡΠΈΡΠ΅ΠΌ Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅, ΠΌΠΎΡΠ°ΠΌΠΎ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ΅ΠΌΠΎ ΡΠ»Π°ΡΠ΅. ΠΠΎΡΠΈΡΡΠΈΡΠ΅ΠΌΠΎ
ΠΡΠ²ΠΎ, ΠΏΠΎΡΡΠ΅Π±Π½Π° Π½Π°ΠΌ ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΡΠ»ΡΠ΅Π½Ρ.ΡΠΎΠ½Ρ. ΠΠ°ΠΏΡΠ°Π²ΠΈΡΠ΅ Π³Π° ΠΈ Π΄ΠΎΠ΄Π°ΡΡΠ΅ ΠΈΠ·Π²ΠΎΡ:
ΠΠΎΡΡ ΠΠ‘ΠΠ£ΠΠΠ‘
Π²Π΅Π·Π°ΡΠΈ 0.0.0.0
Π‘Π°Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠΊΡΠ΅Π½Π΅ΡΠ΅ Π€Π»ΡΠ΅Π½ΡΠ΄ ΡΠ΅ΡΠ²Π΅Ρ. ΠΠΊΠΎ Π²Π°ΠΌ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½Π° Π½Π°ΠΏΡΠ΅Π΄Π½ΠΈΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°, ΠΈΠ΄ΠΈΡΠ΅ Π½Π°
$ 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 ΡΠ΅ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π½ΠΈ Π€Π»ΡΠ΅Π½ΡΠ΄ ΠΏΠΎΡΡ.
Π‘Π°Π΄Π° ΠΊΠ°Π΄Π° ΠΈΠΌΠ°ΠΌΠΎ ΠΏΠΎΠΊΡΠ΅Π½ΡΡ Π€Π»ΡΠ΅Π½ΡΠ΄, ΠΌΠΎΠΆΠ΅ΠΌΠΎ ΡΠ°ΠΌΠΎ ΠΏΠΎΡΠ»Π°ΡΠΈ ΠΠ³ΠΈΠ½ΠΊ Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅. ΠΠ±ΠΈΡΠ½ΠΎ ΠΏΠΎΠΊΡΠ΅ΡΠ΅ΠΌΠΎ ΠΠ³ΠΈΠ½ΠΊ Ρ ΠΠΎΡΠΊΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΡ, Ρ ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°ΡΡ ΠΠΎΡΠΊΠ΅Ρ ΠΈΠΌΠ° ΠΈΠ·Π²ΠΎΡΠ½ΠΈ Π΄ΡΠ°ΡΠ²Π΅Ρ Π·Π° Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ°ΡΠ΅ Π·Π° Π€Π»ΡΠ΅Π½ΡΠ΄:
$ 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
ΠΠΊΠΎ ΠΠ³ΠΈΠ½ΠΊ ΠΏΠΎΠΊΡΠ΅Π½Π΅ΡΠ΅ Π΄ΡΡΠ³Π°ΡΠΈΡΠ΅, ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΡΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅, ΠΈΠΌΠ° Π€Π»ΡΠ΅Π½ΡΠ΄
Π₯Π°ΡΠ΄Π΅ Π΄Π° Π΄ΠΎΠ΄Π°ΠΌΠΎ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Ρ Π°Π½Π°Π»ΠΈΠ·Ρ Π΄Π½Π΅Π²Π½ΠΈΠΊΠ° Ρ Π€Π»ΡΠ΅Π½Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡ:
<filter YOUR-NGINX-TAG.*>
@type parser
key_name log
emit_invalid_record_to_error false
<parse>
@type json
</parse>
</filter>
Π ΡΠ»Π°ΡΠ΅ Π΄Π½Π΅Π²Π½ΠΈΠΊΠ° Ρ ΠΠΈΠ½Π΅ΡΠΈΡ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ
<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 ΠΌΠΈΠ½ΡΡΠ°) ΡΡΠ΅Π±Π°Π»ΠΎ Π±ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅ Ρ Π‘3. Π£ ΠΌΠ΅Π½ΠΈΡΡ βΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³β ΠΠΈΠ½Π΅ΡΠΈΡ Π€ΠΈΡΠ΅Ρ ΠΎΡΠ΅-Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠ΄Π΅ΡΠΈ ΠΊΠΎΠ»ΠΈΠΊΠΎ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΡΠ΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠ΅Π½ΠΎ Ρ Π‘3, ΠΊΠ°ΠΎ ΠΈ Π³ΡΠ΅ΡΠΊΠ΅. ΠΠ΅ Π·Π°Π±ΠΎΡΠ°Π²ΠΈΡΠ΅ Π΄Π° Π΄Π°ΡΠ΅ ΠΏΡΠΈΡΡΡΠΏ Π·Π° ΠΏΠΈΡΠ°ΡΠ΅ Ρ Π‘3 Π±ΡΡΠΊΠ΅Ρ ΡΠ»ΠΎΠ·ΠΈ ΠΠΈΠ½Π΅ΡΠΈΡ. ΠΠΊΠΎ ΠΠΈΠ½Π΅ΡΠΈΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° Π½Π΅ΡΡΠΎ, Π΄ΠΎΠ΄Π°ΡΠ΅ Π³ΡΠ΅ΡΠΊΠ΅ Ρ ΠΈΡΡΡ ΠΊΠ°Π½ΡΡ.
Π‘Π°Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ Ρ ΠΡΠ΅Π½ΠΈ. Π₯Π°ΡΠ΄Π΅ Π΄Π° ΠΏΡΠΎΠ½Π°ΡΠ΅ΠΌΠΎ Π½Π°ΡΠ½ΠΎΠ²ΠΈΡΠ΅ Π·Π°Ρ ΡΠ΅Π²Π΅ Π·Π° ΠΊΠΎΡΠ΅ ΡΠΌΠΎ Π²ΡΠ°ΡΠΈΠ»ΠΈ Π³ΡΠ΅ΡΠΊΠ΅:
SELECT * FROM "db_name"."table_name" WHERE status > 499 ORDER BY created_at DESC limit 10;
Π‘ΠΊΠ΅Π½ΠΈΡΠ°ΡΠ΅ ΡΠ²ΠΈΡ Π·Π°ΠΏΠΈΡΠ° Π·Π° ΡΠ²Π°ΠΊΠΈ Π·Π°Ρ ΡΠ΅Π²
Π‘Π°Π΄Π° ΡΡ Π½Π°ΡΠΈ Π΄Π½Π΅Π²Π½ΠΈΡΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈ ΠΈ ΡΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅Π½ΠΈ Ρ Π‘3 Ρ ΠΠ Π¦-Ρ, ΠΊΠΎΠΌΠΏΡΠΈΠΌΠΎΠ²Π°Π½ΠΈ ΠΈ ΡΠΏΡΠ΅ΠΌΠ½ΠΈ Π·Π° Π°Π½Π°Π»ΠΈΠ·Ρ. ΠΠΈΠ½Π΅ΡΠΈΡ Π€ΠΈΡΠ΅Ρ ΠΎΡΠ΅ ΠΈΡ ΡΠ΅ ΡΠ°ΠΊ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΠΎ Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌΠ΅ Π·Π° ΡΠ²Π°ΠΊΠΈ ΡΠ°Ρ. ΠΠ΅ΡΡΡΠΈΠΌ, ΡΠ²Π΅ Π΄ΠΎΠΊ ΡΠ°Π±Π΅Π»Π° Π½ΠΈΡΠ΅ ΠΏΠ°ΡΡΠΈΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π°, ΠΡΠ΅Π½Π° ΡΠ΅ ΡΡΠΈΡΠ°Π²Π°ΡΠΈ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ ΡΠ²ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½Π° Π½Π° ΡΠ²Π°ΠΊΠΈ Π·Π°Ρ ΡΠ΅Π², ΡΠ° ΡΠ΅ΡΠΊΠΈΠΌ ΠΈΠ·ΡΠ·Π΅ΡΠΈΠΌΠ°. ΠΠ²ΠΎ ΡΠ΅ Π²Π΅Π»ΠΈΠΊΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΈΠ· Π΄Π²Π° ΡΠ°Π·Π»ΠΎΠ³Π°:
- ΠΠ±ΠΈΠΌ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΡΡΠ°Π»Π½ΠΎ ΡΠ°ΡΡΠ΅, ΡΡΠΏΠΎΡΠ°Π²Π°ΡΡΡΠΈ ΡΠΏΠΈΡΠ΅;
- ΠΡΡ Π΅Π½Π° ΡΠ΅ Π½Π°ΠΏΠ»Π°ΡΡΡΠ΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Ρ ΠΊΠΎΠ»ΠΈΡΠΈΠ½Π΅ ΡΠΊΠ΅Π½ΠΈΡΠ°Π½ΠΈΡ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°, ΡΠ° Π½Π°ΡΠΌΠ°ΡΠ΅ 10 ΠΠ ΠΏΠΎ Π·Π°Ρ ΡΠ΅Π²Ρ.
ΠΠ° Π±ΠΈΡΠΌΠΎ ΠΎΠ²ΠΎ ΠΏΠΎΠΏΡΠ°Π²ΠΈΠ»ΠΈ, ΠΊΠΎΡΠΈΡΡΠΈΠΌΠΎ ΠΠΠ‘ ΠΠ»ΡΠ΅ Π¦ΡΠ°Π²Π»Π΅Ρ, ΠΊΠΎΡΠΈ ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°ΡΠΈ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ Ρ Π‘3 ΠΈ Π·Π°ΠΏΠΈΡΠ°ΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΠ΅ ΠΎ ΠΏΠ°ΡΡΠΈΡΠΈΡΠΈ Ρ ΠΠ»ΡΠ΅ ΠΠ΅ΡΠ°ΡΡΠΎΡΠ΅. ΠΠ²ΠΎ ΡΠ΅ Π½Π°ΠΌ ΠΎΠΌΠΎΠ³ΡΡΠΈΡΠΈ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠΎ ΠΏΠ°ΡΡΠΈΡΠΈΡΠ΅ ΠΊΠ°ΠΎ ΡΠΈΠ»ΡΠ΅Ρ ΠΊΠ°Π΄Π° ΠΏΠΎΡΡΠ°Π²ΡΠ°ΠΌΠΎ ΡΠΏΠΈΡΠ΅ Π·Π° ΠΡΡ Π΅Π½Ρ, ΠΈ ΡΠΊΠ΅Π½ΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΌΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌΠ΅ Π½Π°Π²Π΅Π΄Π΅Π½Π΅ Ρ ΡΠΏΠΈΡΡ.
ΠΠΎΠ΄Π΅ΡΠ°Π²Π°ΡΠ΅ ΠΠΌΠ°Π·ΠΎΠ½ ΠΠ»ΡΠ΅ Π¦ΡΠ°Π²Π»Π΅Ρ-Π°
ΠΠΌΠ°Π·ΠΎΠ½ ΠΠ»ΡΠ΅ Π¦ΡΠ°Π²Π»Π΅Ρ ΡΠΊΠ΅Π½ΠΈΡΠ° ΡΠ²Π΅ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ Ρ Π‘3 ΠΊΠ°Π½ΡΠΈ ΠΈ ΠΊΡΠ΅ΠΈΡΠ° ΡΠ°Π±Π΅Π»Π΅ ΡΠ° ΠΏΠ°ΡΡΠΈΡΠΈΡΠ°ΠΌΠ°. ΠΡΠ΅ΠΈΡΠ°ΡΡΠ΅ ΠΠ»ΡΠ΅ Π¦ΡΠ°Π²Π»Π΅Ρ ΡΠ° ΠΠΠ‘ ΠΠ»ΡΠ΅ ΠΊΠΎΠ½Π·ΠΎΠ»Π΅ ΠΈ Π΄ΠΎΠ΄Π°ΡΡΠ΅ ΠΊΠ°Π½ΡΡ Π³Π΄Π΅ ΡΡΠ²Π°ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΡΠ΅Π΄Π°Π½ ΠΏΠΎΠΏΠΈΡΠΈΠ²Π°Ρ Π·Π° Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ Π³ΡΡΠΏΠ°, Ρ ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°ΡΡ ΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ°ΡΠΈ ΡΠ°Π±Π΅Π»Π΅ Ρ Π½Π°Π²Π΅Π΄Π΅Π½ΠΎΡ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΡΠ° ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° ΠΊΠΎΡΠ° ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ°ΡΡ Π½Π°Π·ΠΈΠ²ΠΈΠΌΠ° Π±ΡΡΠΊΠ΅ΡΡ. ΠΠΊΠΎ ΠΏΠ»Π°Π½ΠΈΡΠ°ΡΠ΅ Π΄Π° ΡΠ΅Π΄ΠΎΠ²Π½ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΎΠ²Π΅ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅, ΠΎΠ±Π°Π²Π΅Π·Π½ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΈΡΠ΅ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ ΠΏΠΎΠΊΡΠ΅ΡΠ°ΡΠ° Π¦ΡΠ°Π²Π»Π΅Ρ-Π° ΡΠ°ΠΊΠΎ Π΄Π° ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ° Π²Π°ΡΠΈΠΌ ΠΏΠΎΡΡΠ΅Π±Π°ΠΌΠ°. ΠΠΎΡΠΈΡΡΠΈΠΌΠΎ ΡΠ΅Π΄Π°Π½ Π¦ΡΠ°Π²Π»Π΅Ρ Π·Π° ΡΠ²Π΅ ΡΠ°Π±Π΅Π»Π΅, ΠΊΠΎΡΠΈ ΡΠ°Π΄ΠΈ ΡΠ²Π°ΠΊΠΎΠ³ ΡΠ°ΡΠ°.
ΠΠ°ΡΡΠΈΡΠΈΠΎΠ½ΠΈΡΠ°Π½ΠΈ ΡΡΠΎΠ»ΠΎΠ²ΠΈ
ΠΠ°ΠΊΠΎΠ½ ΠΏΡΠ²ΠΎΠ³ ΠΏΠΎΠΊΡΠ΅ΡΠ°ΡΠ° ΠΏΠΎΠΏΠΈΡΠΈΠ²Π°ΡΠ°, ΡΠ°Π±Π΅Π»Π΅ Π·Π° ΡΠ²Π°ΠΊΡ ΡΠΊΠ΅Π½ΠΈΡΠ°Π½Ρ ΠΊΠΎΡΠΏΡ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ°Π²Π΅ Ρ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Π½Π°Π²Π΅Π΄Π΅Π½ΠΎΡ Ρ ΠΏΠΎΠ΄Π΅ΡΠ°Π²Π°ΡΠΈΠΌΠ°. ΠΡΠ²ΠΎΡΠΈΡΠ΅ ΠΡΡ Π΅Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Ρ ΠΈ ΠΏΡΠΎΠ½Π°ΡΠΈΡΠ΅ ΡΠ°Π±Π΅Π»Ρ ΡΠ° ΠΠ³ΠΈΠ½ΠΊ Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ°ΠΌΠ°. Π₯Π°ΡΠ΄Π΅ Π΄Π° ΠΏΠΎΠΊΡΡΠ°ΠΌΠΎ Π½Π΅ΡΡΠΎ Π΄Π° ΠΏΡΠΎΡΠΈΡΠ°ΠΌΠΎ:
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 XNUMX. Π°ΠΏΡΠΈΠ»Π° XNUMX. ΠΠ»ΠΈ ΠΊΠΎΠ»ΠΈΠΊΠΎ ΡΠ΅ ΠΎΠ²ΠΎ Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΈΡΠ΅ ΠΎΠ΄ ΠΏΡΠΊΠΎΠ³ ΡΠΈΡΠ°ΡΠ° ΠΈΠ· Π½Π΅ΠΏΠ°ΡΡΠΈΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π΅ ΡΠ°Π±Π΅Π»Π΅? Π₯Π°ΡΠ΄Π΅ Π΄Π° ΡΠ°Π·Π½Π°ΠΌΠΎ ΠΈ ΠΈΠ·Π°Π±Π΅ΡΠ΅ΠΌΠΎ ΠΈΡΡΠ΅ Π·Π°ΠΏΠΈΡΠ΅, ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΡΡΠΈ ΠΈΡ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΡΠΊΠΎΡ ΠΎΠ·Π½Π°ΡΠΈ:
3.59 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ ΠΈ 244.34 ΠΌΠ΅Π³Π°Π±Π°ΡΡΠ° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Π½Π° ΡΠΊΡΠΏΡ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΡΠ° ΡΠ°ΠΌΠΎ ΡΠ΅Π΄ΠΌΠΈΡΠΎΠΌ Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅. Π₯Π°ΡΠ΄Π΅ Π΄Π° ΠΏΡΠΎΠ±Π°ΠΌΠΎ ΡΠΈΠ»ΡΠ΅Ρ ΠΏΠΎ ΠΏΠ°ΡΡΠΈΡΠΈΡΠΈ:
ΠΠ°Π»ΠΎ Π±ΡΠΆΠ΅, Π°Π»ΠΈ Π½Π°ΡΠ²Π°ΠΆΠ½ΠΈΡΠ΅ - ΡΠ°ΠΌΠΎ 1.23 ΠΌΠ΅Π³Π°Π±Π°ΡΡΠ° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°! ΠΠΈΠ»ΠΎ Π±ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈΠ½ΠΈΡΠ΅ Π΄Π° Π½Π΅ΠΌΠ° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈΡ 10 ΠΌΠ΅Π³Π°Π±Π°ΡΡΠ° ΠΏΠΎ Π·Π°Ρ ΡΠ΅Π²Ρ Ρ ΡΠ΅Π½ΠΈ. ΠΠ»ΠΈ ΠΈ Π΄Π°ΡΠ΅ ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΡΠ΅, Π° Π½Π° Π²Π΅Π»ΠΈΠΊΠΈΠΌ ΡΠΊΡΠΏΠΎΠ²ΠΈΠΌΠ° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΡΠ΅ Π±ΠΈΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠΌΠΏΡΠ΅ΡΠΈΠ²Π½ΠΈΡΠ°.
ΠΡΠ°Π²ΡΠ΅ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½Π΅ ΡΠ°Π±Π»Π΅ ΠΏΠΎΠΌΠΎΡΡ Π¦ΡΠ±Π΅.ΡΡ
ΠΠ° ΡΠΊΠ»Π°ΠΏΠ°ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½Π΅ ΡΠ°Π±Π»Π΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠΎ Π¦ΡΠ±Π΅.ΡΡ Π°Π½Π°Π»ΠΈΡΠΈΡΠΊΠΈ ΠΎΠΊΠ²ΠΈΡ. ΠΠΌΠ° Π΄ΠΎΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡΠ°, Π°Π»ΠΈ Π½Π°Ρ Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π΄Π²Π΅: ΠΌΠΎΠ³ΡΡΠ½ΠΎΡΡ Π°ΡΡΠΎΠΌΠ°ΡΡΠΊΠΎΠ³ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ° ΠΏΠ°ΡΡΠΈΡΠΈΠΎΠ½ΠΈΡ
ΡΠΈΠ»ΡΠ΅ΡΠ° ΠΈ ΠΏΡΠ΅ΡΡ
ΠΎΠ΄Π½ΠΎ Π°Π³ΡΠ΅Π³ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°. ΠΠΎΡΠΈΡΡΠΈ ΡΠ΅ΠΌΡ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°
Π₯Π°ΡΠ΄Π΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠΎ Π½ΠΎΠ²Ρ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡ Π¦ΡΠ±Π΅.ΡΡ. ΠΠΎΡΡΠΎ Π²Π΅Ρ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠΎ ΠΠΠ‘ ΡΡΠ΅ΠΊ, Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠ΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠΎ ΠΠ°ΠΌΠ±Π΄Π° Π·Π° ΠΏΡΠΈΠΌΠ΅Π½Ρ. ΠΠΎΠΆΠ΅ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΡΠΈ Π΅ΠΊΡΠΏΡΠ΅ΡΠ½ΠΈ ΡΠ°Π±Π»ΠΎΠ½ Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ Π°ΠΊΠΎ ΠΏΠ»Π°Π½ΠΈΡΠ°ΡΠ΅ Π΄Π° ΡΠ³ΠΎΡΡΠΈΡΠ΅ ΠΏΠΎΠ·Π°Π΄ΠΈΠ½Ρ Π¦ΡΠ±Π΅.ΡΡ Ρ Π₯Π΅ΡΠΎΠΊΡ ΠΈΠ»ΠΈ ΠΠΎΡΠΊΠ΅Ρ-Ρ. ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° ΠΎΠΏΠΈΡΡΡΠ΅ Π΄ΡΡΠ³Π΅
$ npm install -g cubejs-cli
$ cubejs create nginx-log-analytics -t serverless -d athena
ΠΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Π΅ ΠΎΠΊΡΡΠΆΠ΅ΡΠ° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠΈΡΡΡΠΏΠ° Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Ρ ΡΡΠ±Π΅.ΡΡ. ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡ ΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ°ΡΠΈ .Π΅Π½Π² Π΄Π°ΡΠΎΡΠ΅ΠΊΡ Ρ ΠΊΠΎΡΠΎΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ΄ΡΠ΅Π΄ΠΈΡΠΈ ΡΠ²ΠΎΡΠ΅ ΠΊΡΡΡΠ΅Π²Π΅ Π·Π°
Π‘Π°Π΄Π° Π½Π°ΠΌ ΡΡΠ΅Π±Π°
Π£ ΠΈΠΌΠ΅Π½ΠΈΠΊΡ schema
, ΠΊΡΠ΅ΠΈΡΠ°ΡΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΡ Logs.js
. ΠΠ²ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΌΠΎΠ΄Π΅Π»Π° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Π·Π° Π½Π³ΠΈΠ½ΠΊ:
Π¨ΠΈΡΡΠ° ΠΌΠΎΠ΄Π΅Π»Π°
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`
}
}
});
ΠΠ²Π΄Π΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Ρ
Π’Π°ΠΊΠΎΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΡΠ°ΠΌΠΎ ΠΌΠ΅ΡΡΠΈΠΊΠ΅ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ ΠΊΠΎΡΠ΅ ΠΆΠ΅Π»ΠΈΠΌΠΎ Π΄Π° ΠΏΡΠΈΠΊΠ°ΠΆΠ΅ΠΌΠΎ Π½Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π½ΠΎΡ ΡΠ°Π±Π»ΠΈ ΠΈ Π½Π°Π²ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠ΅-Π°Π³ΡΠ΅Π³Π°ΡΠΈΡΠ΅. Π¦ΡΠ±Π΅.ΡΡ ΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ°ΡΠΈ Π΄ΠΎΠ΄Π°ΡΠ½Π΅ ΡΠ°Π±Π΅Π»Π΅ ΡΠ° ΡΠ½Π°ΠΏΡΠ΅Π΄ Π°Π³ΡΠ΅Π³ΠΈΡΠ°Π½ΠΈΠΌ ΠΏΠΎΠ΄Π°ΡΠΈΠΌΠ° ΠΈ Π°ΡΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΡΠ΅ Π°ΠΆΡΡΠΈΡΠ°ΡΠΈ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ ΠΊΠ°ΠΊΠΎ ΡΡΠΈΠ³Π½Ρ. ΠΠ²ΠΎ Π½Π΅ ΡΠ°ΠΌΠΎ Π΄Π° ΡΠ±ΡΠ·Π°Π²Π° ΡΠΏΠΈΡΠ΅, Π²Π΅Ρ ΠΈ ΡΠΌΠ°ΡΡΡΠ΅ ΡΡΠΎΡΠΊΠΎΠ²Π΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ° ΠΡΡ Π΅Π½Π΅.
Π₯Π°ΡΠ΄Π΅ Π΄Π° Π΄ΠΎΠ΄Π°ΠΌΠΎ ΠΎΠ²Π΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΠ΅ Ρ Π΄Π°ΡΠΎΡΠ΅ΠΊΡ ΡΠ΅ΠΌΠ΅ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°:
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`
)
}
}
}
Π£ ΠΎΠ²ΠΎΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ Π½Π°Π²ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ ΠΏΡΠ΅ΡΡ
ΠΎΠ΄Π½ΠΎ Π°Π³ΡΠ΅Π³ΠΈΡΠ°ΡΠΈ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ Π·Π° ΡΠ²Π΅ ΠΊΠΎΡΠΈΡΡΠ΅Π½Π΅ ΠΌΠ΅ΡΡΠΈΠΊΠ΅ ΠΈ ΠΊΠΎΡΠΈΡΡΠΈΡΠΈ ΠΏΠ°ΡΡΠΈΡΠΈΠΎΠ½ΠΈΡΠ°ΡΠ΅ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ΡΠΈΠΌΠ°.
Π‘Π°Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌΠΎ ΡΠ°ΡΡΠ°Π²ΠΈΡΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½Ρ ΡΠ°Π±Π»Ρ!
Π¦ΡΠ±Π΅.ΡΡ Π±Π°ΡΠΊΠ΅Π½Π΄ ΠΏΡΡΠΆΠ°
Π¦ΡΠ±Π΅.ΡΡ ΡΠ΅ΡΠ²Π΅Ρ ΠΏΡΠΈΡ
Π²Π°ΡΠ° Π·Π°Ρ
ΡΠ΅Π² Ρ
{
"measures": ["Logs.errorCount"],
"timeDimensions": [
{
"dimension": "Logs.createdAt",
"dateRange": ["2019-01-01", "2019-01-07"],
"granularity": "day"
}
]
}
Π₯Π°ΡΠ΄Π΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠΎ Π¦ΡΠ±Π΅.ΡΡ ΠΊΠ»ΠΈΡΠ΅Π½ΡΠ° ΠΈ Π Π΅Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΠΏΡΠ΅ΠΊΠΎ ΠΠΠ-Π°:
$ 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>
);
}}
/>
)
}
ΠΠ·Π²ΠΎΡΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½Π΅ ΡΠ°Π±Π»Π΅ ΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΈ Π½Π°
ΠΠ·Π²ΠΎΡ: Π²Π²Π².Ρ Π°Π±Ρ.ΡΠΎΠΌ