Amazon Athena рд░ Cube.js рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Nginx рд▓рдЧ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдЙрддреНрдкрд╛рджрдирд╣рд░реВ рд╡рд╛ рддрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ, рдЬрд╕реНрддреИ Prometheus + Grafana, Nginx рдХреЛ рд╕рдЮреНрдЪрд╛рд▓рди рдирд┐рдЧрд░рд╛рдиреА рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред рдпреЛ рдЕрдиреБрдЧрдорди рд╡рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд▓рд╛рдЧреА рдПрдХ рд░рд╛рдореНрд░реЛ рд╡рд┐рдХрд▓реНрдк рд╣реЛ, рддрд░ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд▓рд╛рдЧреА рдзреЗрд░реИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫреИрдиред рдХреБрдиреИ рдкрдирд┐ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕реНрд░реЛрддрдорд╛, nginx рд▓рдЧрд╣рд░реВрдмрд╛рдЯ рдбрд╛рдЯрд╛рдХреЛ рдорд╛рддреНрд░рд╛ рджреНрд░реБрдд рд░реВрдкрдорд╛ рдмрдвреНрджреИ рдЧрдПрдХреЛ рдЫ, рд░ рдареВрд▓реЛ рдорд╛рддреНрд░рд╛рдорд╛ рдбрд╛рдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрди, рдпреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рддрд╛рд░реНрдХрд┐рдХ рдЫред

рдпрд╕ рд▓реЗрдЦрдорд╛ рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рдмрддрд╛рдЙрдиреЗрдЫреБ рдХрд┐ рддрдкрд╛рдИрдВ рдХрд╕рд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдПрдереЗрдирд╛ рд▓рдЧрд╣рд░реВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрди, Nginx рд▓рд╛рдИ рдЙрджрд╛рд╣рд░рдгрдХреЛ рд░реВрдкрдорд╛ рд▓рд┐рдПрд░, рд░ рдо рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд cube.js рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдпрд╕ рдбреЗрдЯрд╛рдмрд╛рдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдбреНрдпрд╛рд╕рдмреЛрд░реНрдб рдХрд╕рд░реА рдЬрдореНрдорд╛ рдЧрд░реНрдиреЗ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрдиреЗрдЫреБред рдпрд╣рд╛рдБ рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЫ:

Amazon Athena рд░ Cube.js рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Nginx рд▓рдЧ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕

TL:DR;
рд╕рдорд╛рдкреНрдд рдбреНрдпрд╛рд╕рдмреЛрд░реНрдбрдорд╛ рд▓рд┐рдЩреНрдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН.

рд╣рд╛рдореАрд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдЬрд╛рдирдХрд╛рд░реА рд╕рдЩреНрдХрд▓рди рдЧрд░реНрди рдкреНрд░рд╡рд╛рд╣рд┐рдд, рдкреНрд░рд╢реЛрдзрди рдХреЛ рд▓рд╛рдЧреА - AWS Kinesis рдбрд╛рдЯрд╛ рдлрд╛рдпрд░рд╣реЛрд╕ ╨╕ AWS рдЧреЛрдВрджрднрдгреНрдбрд╛рд░рдгрдХреЛ рд▓рд╛рдЧрд┐ - AWS S3ред рдпреЛ рдмрдиреНрдбрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рддрдкрд╛рдИрдВ nginx рд▓рдЧрд╣рд░реВ рдорд╛рддреНрд░ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рддрд░ рдЕрдиреНрдп рдШрдЯрдирд╛рд╣рд░реВ, рд╕рд╛рдереИ рдЕрдиреНрдп рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рд▓рдЧрд╣рд░реВ рдкрдирд┐ред рддрдкрд╛рдЗрдБ рддрдкрд╛рдЗрдБрдХреЛ рд╕реНрдЯреНрдпрд╛рдХ рдХреЛ рд▓рд╛рдЧреА рд╕рдорд╛рди рднрд╛рдЧрд╣рд░реБ рд╕рдВрдЧ рдХреЗрд╣рд┐ рднрд╛рдЧрд╣рд░реБ рд▓рд╛рдИ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА, рддрдкрд╛рдЗрдБ рд╕рд┐рдзреИ nginx рдмрд╛рдЯ kinesis рдорд╛ рд▓рдЧ рд▓реЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, 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 рдорд╛ рдбрд╛рдЯрд╛рд╕рдБрдЧ рдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрди рд╕рдХреНрдЫред рд▓реЗрдЦрдорд╛ рдкрдЫрд┐ рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рдмрддрд╛рдЙрдиреЗрдЫреБ рдХрд┐ рдХрд╕рд░реА рд▓рдЧрд╣рд░реВ рдердкреНрди рд░ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрдиреЗ, рддрд░ рдкрд╣рд┐рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ S3 рдорд╛ рд╕рдлрд╛ рдмрд╛рд▓реНрдЯреА рдЪрд╛рд╣рд┐рдиреНрдЫ, рдЬрд╕рдорд╛ рдЕрд░реВ рдХреЗрд╣рд┐ рдкрдирд┐ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдиреЗ рдЫреИрдиред рддрдкрд╛рдЗрдБ рдХреБрди рдХреНрд╖реЗрддреНрд░рдорд╛ рддрдкрд╛рдЗрдБрдХреЛ рдмрд╛рд▓реНрдЯреА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реБрдиреЗрдЫ рдкрд╣рд┐рд▓реЗ рдиреИ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрди рд▓рд╛рдпрдХ рдЫ, рдХрд┐рдирдХрд┐ рдПрдереЗрдирд╛ рд╕рдмреИ рдХреНрд╖реЗрддреНрд░рд╣рд░реВрдорд╛ рдЙрдкрд▓рдмреНрдз рдЫреИрдиред

рдПрдереЗрдирд╛ рдХрдиреНрд╕реЛрд▓рдорд╛ рд╕рд░реНрдХрд┐рдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ

рд▓рдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдПрдереЗрдирд╛рдорд╛ рдПрдЙрдЯрд╛ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реНред рдпрджрд┐ рддрдкрд╛рдЗрдБ Kinesis Firehose рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдпреЛрдЬрдирд╛ рдмрдирд╛рдЙрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ рдпреЛ рд▓реЗрдЦрди рд░ рдкрдвреНрди рджреБрд╡реИрдХреЛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рдЫред рдПрдереЗрдирд╛ рдХрдиреНрд╕реЛрд▓ рдЦреЛрд▓реНрдиреБрд╣реЛрд╕реН рд░ рддрд╛рд▓рд┐рдХрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

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 рд╕реНрдЯреНрд░реАрдо рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ

Kinesis Firehose рд▓реЗ Nginx рдмрд╛рдЯ S3 рдорд╛ рдкреНрд░рд╛рдкреНрдд рдбрд╛рдЯрд╛рд▓рд╛рдИ YYYY/MM/DD/HH рдврд╛рдБрдЪрд╛рдорд╛ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрд╣рд░реВрдорд╛ рд╡рд┐рднрд╛рдЬрди рдЧрд░реА рдЪрдпрди рдЧрд░рд┐рдПрдХреЛ рдврд╛рдБрдЪрд╛рдорд╛ рд▓реЗрдЦреНрдиреЗрдЫред рдбрд╛рдЯрд╛ рдкрдвреНрджрд╛ рдпреЛ рдХрд╛рдордорд╛ рдЖрдЙрдиреЗрдЫред рддрдкрд╛рдИрд▓реЗ рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, fluentd рдмрд╛рдЯ S3 рдорд╛ рд╕рд┐рдзреИ рд▓реЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рддрд░ рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рддрдкрд╛рдИрд▓реЗ JSON рд▓реЗрдЦреНрдиреБрдкрд░реНрдиреЗрдЫ, рд░ рдлрд╛рдЗрд▓рд╣рд░реВрдХреЛ рдареВрд▓реЛ рдЖрдХрд╛рд░рдХреЛ рдХрд╛рд░рдгрд▓реЗ рдпреЛ рдЕрд╕рдХреНрд╖рдо рдЫред рдердк рд░реВрдкрдорд╛, PrestoDB рд╡рд╛ рдПрдереЗрдирд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛, JSON рд╕рдмреИрднрдиреНрджрд╛ рдврд┐рд▓реЛ рдбреЗрдЯрд╛ рдврд╛рдБрдЪрд╛ рд╣реЛред рддреНрдпрд╕реИрд▓реЗ Kinesis Firehose рдХрдиреНрд╕реЛрд▓ рдЦреЛрд▓реНрдиреБрд╣реЛрд╕реН, "рдбрд┐рд▓рд┐рднрд░реА рд╕реНрдЯреНрд░рд┐рдо рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН" рдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН, "рдбрд┐рд▓рд┐рднрд░реА" рдлрд┐рд▓реНрдбрдорд╛ "рдкреНрд░рддреНрдпрдХреНрд╖ PUT" рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН:

Amazon Athena рд░ Cube.js рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Nginx рд▓рдЧ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕

рдЕрд░реНрдХреЛ рдЯреНрдпрд╛рдмрдорд╛, "рд░реЗрдХрд░реНрдб рдврд╛рдБрдЪрд╛ рд░реВрдкрд╛рдиреНрддрд░рдг" - "рд╕рдХреНрд╖рдо" рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рд░реЗрдХрд░реНрдбрд┐рдЩ рдврд╛рдБрдЪрд╛рдХреЛ рд░реВрдкрдорд╛ "Apache ORC" рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдХреЗрд╣рд┐ рдЕрдиреБрд╕рдиреНрдзрд╛рди рдЕрдиреБрд╕рд╛рд░ рдУрд╡реЗрди рдУ'рдорд╛рд▓реА, рдпреЛ PrestoDB рд░ Athena рдХреЛ рд▓рд╛рдЧрд┐ рдЗрд╖реНрдЯрддрдо рдврд╛рдБрдЪрд╛ рд╣реЛред рд╣рд╛рдореАрд▓реЗ рдорд╛рдерд┐ рдмрдирд╛рдПрдХреЛ рддрд╛рд▓рд┐рдХрд╛рд▓рд╛рдИ рд╕реНрдХрд┐рдорд╛рдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдХрд┐рдиреЗрд╕рд┐рд╕рдорд╛ рдХреБрдиреИ рдкрдирд┐ S3 рд╕реНрдерд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ; рддрд╛рд▓рд┐рдХрд╛рдмрд╛рдЯ рдорд╛рддреНрд░ рд╕реНрдХреАрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред рддрд░ рдпрджрд┐ рддрдкрд╛рдЗрдБ рдлрд░рдХ S3 рд╕реНрдерд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рдпреЛ рддрд╛рд▓рд┐рдХрд╛рдмрд╛рдЯ рдпреА рд░реЗрдХрд░реНрдбрд╣рд░реВ рдкрдвреНрди рд╕рдХреНрд╖рдо рд╣реБрдиреБрд╣реБрдиреЗ рдЫреИрдиред

Amazon Athena рд░ Cube.js рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Nginx рд▓рдЧ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕

рд╣рд╛рдореАрд▓реЗ рднрдгреНрдбрд╛рд░рдгрдХреЛ рд▓рд╛рдЧрд┐ S3 рдЪрдпрди рдЧрд░реНрдЫреМрдВ рд░ рд╣рд╛рдореАрд▓реЗ рдкрд╣рд┐рд▓реЗ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрдХреЛ рдмрд╛рд▓реНрдЯреАред Aws рдЧреНрд▓реБ рдХреНрд░рд▓рд░, рдЬрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдо рдХреЗрд╣рд┐ рдкрдЫрд┐ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреБ, S3 рдмрд╛рд▓реНрдЯреАрдорд╛ рдЙрдкрд╕рд░реНрдЧрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рд╕рдХреНрджреИрди, рддреНрдпрд╕реИрд▓реЗ рдпрд╕рд▓рд╛рдИ рдЦрд╛рд▓реА рдЫреЛрдбреНрдиреБ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫред

Amazon Athena рд░ Cube.js рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Nginx рд▓рдЧ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕

рдмрд╛рдБрдХреА рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рддрдкрд╛рдИрдВрдХреЛ рд▓реЛрдбрдХреЛ рдЖрдзрд╛рд░рдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ; рдо рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рддрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреБред рдиреЛрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ S3 рдХрдореНрдкреНрд░реЗрд╕рди рдЙрдкрд▓рдмреНрдз рдЫреИрди, рддрд░ ORC рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ рдиреЗрдЯрд┐рдн рдХрдореНрдкреНрд░реЗрд╕рди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред

рдкреНрд░рд╡рд╛рд╣рд┐рдд

рдЕрдм рд╣рд╛рдореАрд▓реЗ рд▓рдЧрд╣рд░реВ рднрдгреНрдбрд╛рд░рдг рд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реЗрдХрд╛ рдЫреМрдВ, рд╣рд╛рдореАрд▓реЗ рдкрдард╛рдЙрдиреЗ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ рдкреНрд░рд╡рд╛рд╣рд┐рдд, рдХрд┐рдирдХрд┐ рдо рд░реБрдмреАрд▓рд╛рдИ рдорд╛рдпрд╛ рдЧрд░реНрдЫреБ, рддрд░ рддрдкрд╛рдИрдВ Logstash рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд╡рд╛ рд╕рд┐рдзреИ kinesis рдорд╛ рд▓рдЧрд╣рд░реВ рдкрдард╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред 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 рдЪрд▓рд╛рдЙрдБрдЫреМрдВ, рдЬрд╕рдорд╛ 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 рдорд╛ рд▓рдЧрд╣рд░реВ рдкрдард╛рдЙрдБрджреИ kinesis firehose рдкреНрд▓рдЧрдЗрди:

<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>

рдПрдереЗрдирд╛

рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рд╕рдмреИ рдХреБрд░рд╛ рд╕рд╣реА рд░реВрдкрдорд╛ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрдиреБрднрдпреЛ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдХреЗрд╣реА рд╕рдордп рдкрдЫрд┐ (рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛, Kinesis рд░реЗрдХрд░реНрдбрд╣рд░реВрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ 10 рдорд┐рдиреЗрдЯрдорд╛ рдПрдХ рдкрдЯрдХ рдбрд╛рдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджрдЫ) рддрдкрд╛рдИрдВрд▓реЗ S3 рдорд╛ рд▓рдЧ рдлрд╛рдЗрд▓рд╣рд░реВ рджреЗрдЦреНрдиреБрдкрд░реНрдЫред Kinesis Firehose рдХреЛ "рдирд┐рдЧрд░рд╛рдиреА" рдореЗрдиреБрдорд╛ рддрдкрд╛рдИрд▓реЗ S3 рдорд╛ рдХрддрд┐ рдбрд╛рдЯрд╛ рд░реЗрдХрд░реНрдб рдЧрд░рд┐рдПрдХреЛ рдЫ, рд╕рд╛рдереИ рддреНрд░реБрдЯрд┐рд╣рд░реВ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред Kinesis рднреВрдорд┐рдХрд╛рдорд╛ S3 рдмрд╛рд▓реНрдЯреАрдорд╛ рд▓реЗрдЦреНрдиреЗ рдкрд╣реБрдБрдЪ рджрд┐рди рдирдмрд┐рд░реНрд╕рдиреБрд╣реЛрд╕реНред рдпрджрд┐ Kinesis рд▓реЗ рдХреЗрд╣рд┐ рдкрд╛рд░реНрд╕ рдЧрд░реНрди рд╕рдХреЗрди рднрдиреЗ, рдпрд╕рд▓реЗ рдПрдЙрдЯреИ рдмрд╛рд▓реНрдЯреАрдорд╛ рддреНрд░реБрдЯрд┐рд╣рд░реВ рдердкреНрдиреЗрдЫред

рдЕрдм рддрдкрд╛рдИрдВ рдПрдереЗрдирд╛ рдорд╛ рдбрд╛рдЯрд╛ рд╣реЗрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рд╣рд╛рдореАрд▓реЗ рддреНрд░реБрдЯрд┐рд╣рд░реВ рдлрд┐рд░реНрддрд╛ рдЧрд░реЗрдХрд╛ рдирд╡реАрдирддрдо рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реМрдВ:

SELECT * FROM "db_name"."table_name" WHERE status > 499 ORDER BY created_at DESC limit 10;

рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдзрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмреИ рд░реЗрдХрд░реНрдбрд╣рд░реВ рд╕реНрдХреНрдпрд╛рди рдЧрд░реНрджреИ

рдЕрдм рд╣рд╛рдореНрд░рд╛ рд▓рдЧрд╣рд░реВ рдкреНрд░рд╢реЛрдзрди рдЧрд░рд┐рдПрдХреЛ рдЫ рд░ ORC рдорд╛ S3 рдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдПрдХреЛ рдЫ, рд╕рдВрдХреБрдЪрд┐рдд рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐ рддрдпрд╛рд░ рдЫред рдХрд┐рдиреЗрд╕рд┐рд╕ рдлрд╛рдпрд░рд╣реЛрд╕рд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдкреНрд░рддреНрдпреЗрдХ рдШрдгреНрдЯрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрд╣рд░реВрдорд╛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрдпреЛред рдпрджреНрдпрдкрд┐, рдЬрдмрд╕рдореНрдо рддрд╛рд▓рд┐рдХрд╛ рд╡рд┐рднрд╛рдЬрди рдЧрд░рд┐рдПрдХреЛ рдЫреИрди, рдПрдереЗрдирд╛рд▓реЗ рджреБрд░реНрд▓рдн рдЕрдкрд╡рд╛рджрд╣рд░реВ рд╕рд╣рд┐рдд, рд╣рд░реЗрдХ рдЕрдиреБрд░реЛрдзрдорд╛ рд╕рдмреИ-рд╕рдордп рдбрд╛рдЯрд╛ рд▓реЛрдб рдЧрд░реНрдиреЗрдЫред рдпреЛ рджреБрдИ рдХрд╛рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ рдареВрд▓реЛ рд╕рдорд╕реНрдпрд╛ рд╣реЛ:

  • рдбрд╛рдЯрд╛рдХреЛ рдорд╛рддреНрд░рд╛ рдирд┐рд░рдиреНрддрд░ рдмрдвреНрджреИ рдЫ, рдкреНрд░рд╢реНрдирд╣рд░реВ рдврд┐рд▓реЛ рдЧрд░реНрджреИ;
  • рдПрдереЗрдирд╛рд▓рд╛рдИ рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдз рдиреНрдпреВрдирддрдо резреж MB рдХреЛ рд╕рд╛рде рд╕реНрдХреНрдпрд╛рди рдЧрд░рд┐рдПрдХреЛ рдбрд╛рдЯрд╛рдХреЛ рднреЛрд▓реНрдпреБрдордХреЛ рдЖрдзрд╛рд░рдорд╛ рдмрд┐рд▓ рдЧрд░рд┐рдиреНрдЫред

рдпрд╕рд▓рд╛рдИ рдареАрдХ рдЧрд░реНрди, рд╣рд╛рдореА AWS рдЧреНрд▓реБ рдХреНрд░рд▓рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ, рдЬрд╕рд▓реЗ S3 рдорд╛ рдбреЗрдЯрд╛ рдХреНрд░рд▓ рдЧрд░реНрдиреЗрдЫ рд░ рдЧреНрд▓реБ рдореЗрдЯрд╛рд╕реНрдЯреЛрд░рдорд╛ рд╡рд┐рднрд╛рдЬрди рдЬрд╛рдирдХрд╛рд░реА рд▓реЗрдЦреНрдиреЗрдЫред рдпрд╕рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдПрдереЗрдирд╛ рдХреНрд╡реЗрд░реА рдЧрд░реНрджрд╛ рдлрд┐рд▓реНрдЯрд░рдХреЛ рд░реВрдкрдорд╛ рд╡рд┐рднрд╛рдЬрдирд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреЗрдЫ, рд░ рдпрд╕рд▓реЗ рдХреНрд╡реЗрд░реАрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрд╣рд░реВ рдорд╛рддреНрд░ рд╕реНрдХреНрдпрд╛рди рдЧрд░реНрдиреЗрдЫред

Amazon Glue Crawler рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ

Amazon Glue Crawler рд▓реЗ S3 рдмрд╛рд▓реНрдЯреАрдорд╛ рднрдПрдХрд╛ рд╕рдмреИ рдбрд╛рдЯрд╛ рд╕реНрдХреНрдпрд╛рди рдЧрд░реНрдЫ рд░ рд╡рд┐рднрд╛рдЬрдирд╣рд░реВ рд╕рд╣рд┐рдд рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрдЫред AWS рдЧреНрд▓реБ рдХрдиреНрд╕реЛрд▓рдмрд╛рдЯ рдЧреНрд▓реБ рдХреНрд░рд▓рд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рддрдкрд╛рдИрдВрд▓реЗ рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдиреЗ рдмрд╛рд▓реНрдЯреА рдердкреНрдиреБрд╣реЛрд╕реНред рддрдкрд╛рдИрдВрд▓реЗ рдзреЗрд░реИ рдмрд╛рд▓реНрдЯрд┐рдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рдХреНрд░рд▓рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЬрд╕рдорд╛ рдпрд╕рд▓реЗ рдмрд╛рд▓реНрдЯреАрд╣рд░реВрдХреЛ рдирд╛рдорд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреЗ рдирд╛рдорд╣рд░реВрдХрд╛ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫред рдпрджрд┐ рддрдкрд╛рдЗрдБ рдпреЛ рдбреЗрдЯрд╛ рдирд┐рдпрдорд┐рдд рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдпреЛрдЬрдирд╛ рдмрдирд╛рдЙрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБрдХрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВ рдЕрдиреБрд░реВрдк рдХреНрд░рд▓рд░рдХреЛ рд╕реБрд░реБрд╡рд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рдирд┐рд╢реНрдЪрд┐рдд рд╣реБрдиреБрд╣реЛрд╕реНред рд╣рд╛рдореА рд╕рдмреИ рдЯреЗрдмрд▓рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рдХреНрд░рд▓рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ, рдЬреБрди рд╣рд░реЗрдХ рдШрдгреНрдЯрд╛ рдЪрд▓реНрдЫред

рд╡рд┐рднрд╛рдЬрд┐рдд рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ

рдХреНрд░рд▓рд░рдХреЛ рдкрд╣рд┐рд▓реЛ рд╕реБрд░реБрд╡рд╛рдд рдкрдЫрд┐, рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрдпрд╛рди рдЧрд░рд┐рдПрдХреЛ рдмрд╛рд▓реНрдЯрд┐рдирдХреЛ рд▓рд╛рдЧрд┐ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕рдорд╛ рджреЗрдЦрд╛ рдкрд░реНрджрдЫред рдПрдереЗрдирд╛ рдХрдиреНрд╕реЛрд▓ рдЦреЛрд▓реНрдиреБрд╣реЛрд╕реН рд░ 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 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдз рдХреЛ рд▓рд╛рдЧреА рдЫреИрдиред рддрд░ рдпреЛ рдЕрдЭреИ рдзреЗрд░реИ рд░рд╛рдореНрд░реЛ рдЫ, рд░ рдареВрд▓реЛ рдбреЗрдЯрд╛рд╕реЗрдЯрд╣рд░реВрдорд╛ рднрд┐рдиреНрдирддрд╛ рдзреЗрд░реИ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реБрдиреЗрдЫред

Cube.js рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдбреНрдпрд╛рд╕рдмреЛрд░реНрдб рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджреИ

рдбреНрдпрд╛рд╕рдмреЛрд░реНрдб рдЬрдореНрдорд╛ рдЧрд░реНрди, рд╣рд╛рдореА Cube.js рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВред рдпрд╕рдорд╛ рдзреЗрд░реИ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдЫрдиреН, рддрд░ рд╣рд╛рдореА рджреБрдИрдорд╛ рд░реБрдЪрд┐ рд░рд╛рдЦреНрдЫреМрдВ: рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рд╡рд┐рднрд╛рдЬрди рдлрд┐рд▓реНрдЯрд░рд╣рд░реВ рд░ рдбреЗрдЯрд╛ рдкреВрд░реНрд╡-рдПрдХрддреНрд░реАрдХрд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛ред рдпрд╕рд▓реЗ рдбрд╛рдЯрд╛ рд╕реНрдХрд┐рдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ рдбрд╛рдЯрд╛ рд╕реНрдХреАрдорд╛, SQL рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рд░ рдбрд╛рдЯрд╛рдмреЗрд╕ рдХреНрд╡реЗрд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди Javascript рдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛред рд╣рд╛рдореАрд▓реЗ рдбрд╛рдЯрд╛ рд╕реНрдХрд┐рдорд╛рдорд╛ рд╡рд┐рднрд╛рдЬрди рдлрд┐рд▓реНрдЯрд░ рдХрд╕рд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рднрдиреЗрд░ рд╕рдВрдХреЗрдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдПрдЙрдЯрд╛ рдирдпрд╛рдБ 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рд╡рд┐рднрд╛рдЬрди рдлрд┐рд▓реНрдЯрд░рдХреЛ рд╕рд╛рде SQL рдХреНрд╡реЗрд░реА рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиред

рд╣рд╛рдореАрд▓реЗ рдбреНрдпрд╛рд╕рдмреЛрд░реНрдбрдорд╛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рд░ рдкреВрд░реНрд╡-рдПрдХрддреНрд░реАрдХрд░рдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЪрд╛рд╣рдиреЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд░ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдкрдирд┐ рд╕реЗрдЯ рдЧрд░реНрдЫреМрдВред 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 рдмреНрдпрд╛рдХрдЗрдиреНрдб рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ REST API рд░ рд▓реЛрдХрдкреНрд░рд┐рдп рдлреНрд░рдиреНрдЯ-рдПрдиреНрдб рдлреНрд░реЗрдорд╡рд░реНрдХрдХрд╛ рд▓рд╛рдЧрд┐ рдЧреНрд░рд╛рд╣рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВрдХреЛ рд╕реЗрдЯред рд╣рд╛рдореА рдбреНрдпрд╛рд╕рдмреЛрд░реНрдб рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдЧреНрд░рд╛рд╣рдХрдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВред Cube.js рд▓реЗ рдбрд╛рдЯрд╛ рдорд╛рддреНрд░ рдЙрдкрд▓рдмреНрдз рдЧрд░рд╛рдЙрдБрдЫ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рднрд┐рдЬреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЪрд╛рд╣рд┐рдиреНрдЫ - рдорд▓рд╛рдИ рдпреЛ рдордирдкрд░реНрдЫ рд░рд┐рдЪрд╛рд░реНрдЯрд╣рд░реВ, рддрд░ рддрдкрд╛рдИрдВ рдХреБрдиреИ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

Cube.js рд╕рд░реНрднрд░рд▓реЗ рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрджрдЫ JSON рдврд╛рдБрдЪрд╛, рдЬрд╕рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрджрдЫред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, Nginx рд▓реЗ рджрд┐рдирдорд╛ рдХрддрд┐ рддреНрд░реБрдЯрд┐рд╣рд░реВ рджрд┐рдпреЛ рднрдиреЗрд░ рдЧрдгрдирд╛ рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ рдирд┐рдореНрди рдЕрдиреБрд░реЛрдз рдкрдард╛рдЙрдиреБ рдкрд░реНрдЫ:

{
  "measures": ["Logs.errorCount"],
  "timeDimensions": [
    {
      "dimension": "Logs.createdAt",
      "dateRange": ["2019-01-01", "2019-01-07"],
      "granularity": "day"
    }
  ]
}

NPM рдорд╛рд░реНрдлрдд Cube.js рдХреНрд▓рд╛рдЗрдиреНрдЯ рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрдореНрдкреЛрдиреЗрдиреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реМрдВ:

$ 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди