Нгинк Π»ΠΎΠ³ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ° користСћи Амазон АтхСна ΠΈ Π¦ΡƒΠ±Π΅.јс

ΠžΠ±ΠΈΡ‡Π½ΠΎ сС ΠΊΠΎΠΌΠ΅Ρ€Ρ†ΠΈΡ˜Π°Π»Π½ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈ ΠΈΠ»ΠΈ Π³ΠΎΡ‚ΠΎΠ²Π΅ Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π΅ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΎΠ³ ΠΊΠΎΠ΄Π°, ΠΊΠ°ΠΎ ΡˆΡ‚ΠΎ су ΠŸΡ€ΠΎΠΌΠ΅Ρ‚Ρ…Π΅ΡƒΡ + Π“Ρ€Π°Ρ„Π°Π½Π°, користС Π·Π° ΠΏΡ€Π°Ρ›Π΅ΡšΠ΅ ΠΈ Π°Π½Π°Π»ΠΈΠ·Ρƒ Ρ€Π°Π΄Π° Нгинк-Π°. Ово јС Π΄ΠΎΠ±Ρ€Π° ΠΎΠΏΡ†ΠΈΡ˜Π° Π·Π° ΠΏΡ€Π°Ρ›Π΅ΡšΠ΅ ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΡƒ Ρƒ Ρ€Π΅Π°Π»Π½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Ρƒ, Π°Π»ΠΈ нијС баш Π·Π³ΠΎΠ΄Π½Π° Π·Π° ΠΈΡΡ‚ΠΎΡ€ΠΈΡ˜ΡΠΊΡƒ Π°Π½Π°Π»ΠΈΠ·Ρƒ. На Π±ΠΈΠ»ΠΎ ΠΊΠΎΠΌ ΠΏΠΎΠΏΡƒΠ»Π°Ρ€Π½ΠΎΠΌ рСсурсу, ΠΎΠ±ΠΈΠΌ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° ΠΈΠ· Π½Π³ΠΈΠ½ΠΊ Π΄Π½Π΅Π²Π½ΠΈΠΊΠ° Π±Ρ€Π·ΠΎ растС, Π° Π·Π° Π°Π½Π°Π»ΠΈΠ·Ρƒ Π²Π΅Π»ΠΈΠΊΠ΅ ΠΊΠΎΠ»ΠΈΡ‡ΠΈΠ½Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ јС користити Π½Π΅ΡˆΡ‚ΠΎ ΡΠΏΠ΅Ρ†ΠΈΡ˜Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΈΡ˜Π΅.

Π£ ΠΎΠ²ΠΎΠΌ Ρ‡Π»Π°Π½ΠΊΡƒ Ρ›Ρƒ Π²Π°ΠΌ Ρ€Π΅Ρ›ΠΈ ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ користити Атина Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌ Π΄Π½Π΅Π²Π½ΠΈΠΊΠ΅, ΡƒΠ·ΠΈΠΌΠ°Ρ˜ΡƒΡ›ΠΈ Нгинк ΠΊΠ°ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ›Ρƒ ΠΊΠ°ΠΊΠΎ Π΄Π° саставим Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡ΠΊΡƒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Ρƒ Ρ‚Π°Π±Π»Ρƒ ΠΎΠ΄ ΠΎΠ²ΠΈΡ… ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° користСћи ΠΎΠΏΠ΅Π½-соурцС Ρ†ΡƒΠ±Π΅.јс Ρ„Ρ€Π°ΠΌΠ΅Π²ΠΎΡ€ΠΊ. Π•Π²ΠΎ ΠΊΠΎΠΌΠΏΠ»Π΅Ρ‚Π½Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ Ρ€Π΅ΡˆΠ΅ΡšΠ°:

Нгинк Π»ΠΎΠ³ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ° користСћи Амазон АтхСна ΠΈ Π¦ΡƒΠ±Π΅.јс

Π’Π›:Π”Π ;
Π’Π΅Π·Π° Π΄ΠΎ Π³ΠΎΡ‚ΠΎΠ²Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Π΅ Ρ‚Π°Π±Π»Π΅.

Π—Π° ΠΏΡ€ΠΈΠΊΡƒΠΏΡ™Π°ΡšΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ˜Π° којС користимо Π€Π»ΡƒΠ΅Π½Ρ‚Π΄, Π·Π° ΠΎΠ±Ρ€Π°Π΄Ρƒ - АВБ КинСсис Π”Π°Ρ‚Π° ЀирСхосС ΠΈ АВБ Π»Π΅ΠΏΠ°ΠΊ, Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅ΡšΠ΅ - АВБ Π‘3. ΠšΠΎΡ€ΠΈΡΡ‚Π΅Ρ›ΠΈ овај ΠΏΠ°ΠΊΠ΅Ρ‚, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚ΠΈΡ‚Π΅ Π½Π΅ само Π½Π³ΠΈΠ½ΠΊ Π΅Π²ΠΈΠ΄Π΅Π½Ρ†ΠΈΡ˜Π΅, Π²Π΅Ρ› ΠΈ Π΄Ρ€ΡƒΠ³Π΅ Π΄ΠΎΠ³Π°Ρ’Π°Ρ˜Π΅, ΠΊΠ°ΠΎ ΠΈ Π΅Π²ΠΈΠ΄Π΅Π½Ρ†ΠΈΡ˜Π΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… услуга. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΠΈ Π½Π΅ΠΊΠ΅ Π΄Π΅Π»ΠΎΠ²Π΅ сличним Π·Π° свој стСк, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ писати Π΄Π½Π΅Π²Π½ΠΈΠΊΠ΅ Ρƒ кинСсис Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈΠ· Π½Π³ΠΈΠ½ΠΊ-Π°, Π·Π°ΠΎΠ±ΠΈΠ»Π°Π·Π΅Ρ›ΠΈ Ρ„Π»ΡƒΠ΅Π½Ρ‚Π΄, ΠΈΠ»ΠΈ користити логстасх Π·Π° ΠΎΠ²ΠΎ.

ΠŸΡ€ΠΈΠΊΡƒΠΏΡ™Π°ΡšΠ΅ Нгинк Π΄Π½Π΅Π²Π½ΠΈΠΊΠ°

ΠŸΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π½ΠΎ, Нгинк Π΅Π²ΠΈΠ΄Π΅Π½Ρ†ΠΈΡ˜Π΅ ΠΈΠ·Π³Π»Π΅Π΄Π°Ρ˜Ρƒ ΠΎΡ‚ΠΏΡ€ΠΈΠ»ΠΈΠΊΠ΅ ΠΎΠ²Π°ΠΊΠΎ:

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 Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅ΡšΠ΅ ΠΈ ΠΊΠ°Π½Ρ‚Ρƒ ΠΊΠΎΡ˜Ρƒ смо Ρ€Π°Π½ΠΈΡ˜Π΅ ΠΊΡ€Π΅ΠΈΡ€Π°Π»ΠΈ. Авс Π“Π»ΡƒΠ΅ Π¦Ρ€Π°Π²Π»Π΅Ρ€, ΠΎ ΠΊΠΎΠΌΠ΅ Ρ›Ρƒ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΠΈ ΠΌΠ°Π»ΠΎ каснијС, Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π°Π΄ΠΈ са прСфиксима Ρƒ Π‘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>
        );
      }}
    />
  )
}

Π˜Π·Π²ΠΎΡ€ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Π΅ Ρ‚Π°Π±Π»Π΅ су доступни Π½Π° Π¦ΠΎΠ΄Π΅Π‘Π°Π½Π΄Π±ΠΎΠΊ.

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

Π”ΠΎΠ΄Π°Ρ˜ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€