рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдЙрддреНрдкрд╛рджрдирд╣рд░реВ рд╡рд╛ рддрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ, рдЬрд╕реНрддреИ 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 рдорд╛ рдбрд╛рдЯрд╛рд╕рдБрдЧ рдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрди рд╕рдХреНрдЫред рд▓реЗрдЦрдорд╛ рдкрдЫрд┐ рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рдмрддрд╛рдЙрдиреЗрдЫреБ рдХрд┐ рдХрд╕рд░реА рд▓рдЧрд╣рд░реВ рдердкреНрди рд░ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрдиреЗ, рддрд░ рдкрд╣рд┐рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ 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" рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН:
рдЕрд░реНрдХреЛ рдЯреНрдпрд╛рдмрдорд╛, "рд░реЗрдХрд░реНрдб рдврд╛рдБрдЪрд╛ рд░реВрдкрд╛рдиреНрддрд░рдг" - "рд╕рдХреНрд╖рдо" рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рд░реЗрдХрд░реНрдбрд┐рдЩ рдврд╛рдБрдЪрд╛рдХреЛ рд░реВрдкрдорд╛ "Apache ORC" рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдХреЗрд╣рд┐ рдЕрдиреБрд╕рдиреНрдзрд╛рди рдЕрдиреБрд╕рд╛рд░
рд╣рд╛рдореАрд▓реЗ рднрдгреНрдбрд╛рд░рдгрдХреЛ рд▓рд╛рдЧрд┐ S3 рдЪрдпрди рдЧрд░реНрдЫреМрдВ рд░ рд╣рд╛рдореАрд▓реЗ рдкрд╣рд┐рд▓реЗ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрдХреЛ рдмрд╛рд▓реНрдЯреАред Aws рдЧреНрд▓реБ рдХреНрд░рд▓рд░, рдЬрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдо рдХреЗрд╣рд┐ рдкрдЫрд┐ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреБ, 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 рдЪрд▓рд╛рдЙрдБрдЫреМрдВ, рдЬрд╕рдорд╛ 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>
рдПрдереЗрдирд╛
рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рд╕рдмреИ рдХреБрд░рд╛ рд╕рд╣реА рд░реВрдкрдорд╛ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрдиреБрднрдпреЛ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдХреЗрд╣реА рд╕рдордп рдкрдЫрд┐ (рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛, 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 рдмрдЬреЗрдХреЛ рдмреАрдЪрдорд╛ рдкреНрд░рд╛рдкреНрдд рднрдПрдХрд╛ рд╕рдмреИ рд░реЗрдХрд░реНрдбрд╣рд░реВ рдЪрдпрди рдЧрд░реНрдиреЗрдЫред рддрд░ рдпреЛ рдЧреИрд░-рд╡рд┐рднрд╛рдЬрди рддрд╛рд▓рд┐рдХрд╛рдмрд╛рдЯ рдкрдвреНрдиреБ рднрдиреНрджрд╛ рдХрддреНрддрд┐ рдмрдвреА рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рдЫ? рдЯрд╛рдЗрдорд╕реНрдЯреНрдпрд╛рдореНрдк рджреНрд╡рд╛рд░рд╛ рдлрд┐рд▓реНрдЯрд░ рдЧрд░реНрджреИ, рдПрдЙрдЯреИ рд░реЗрдХрд░реНрдбрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реМрдВ рд░ рдЪрдпрди рдЧрд░реМрдВ:
3.59 рд╕реЗрдХреЗрдиреНрдб рд░ 244.34 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдбреЗрдЯрд╛ рдбреЗрдЯрд╛рд╕реЗрдЯрдорд╛ рд▓рдЧрд╣рд░реВрдХреЛ рдПрдХ рд╣рдкреНрддрд╛рдХреЛ рд╕рд╛рдеред рд╡рд┐рднрд╛рдЬрди рджреНрд╡рд╛рд░рд╛ рдлрд┐рд▓реНрдЯрд░ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ:
рдереЛрд░реИ рдЫрд┐рдЯреЛ, рддрд░ рд╕рдмреИрднрдиреНрджрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг - рдХреЗрд╡рд▓ рез.реирей рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдбрд╛рдЯрд╛! рдпреЛ рдзреЗрд░реИ рд╕рд╕реНрддреЛ рд╣реБрдиреЗрдЫ рдпрджрд┐ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рдг рдорд╛ рдиреНрдпреВрдирддрдо 1.23 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдз рдХреЛ рд▓рд╛рдЧреА рдЫреИрдиред рддрд░ рдпреЛ рдЕрдЭреИ рдзреЗрд░реИ рд░рд╛рдореНрд░реЛ рдЫ, рд░ рдареВрд▓реЛ рдбреЗрдЯрд╛рд╕реЗрдЯрд╣рд░реВрдорд╛ рднрд┐рдиреНрдирддрд╛ рдзреЗрд░реИ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реБрдиреЗрдЫред
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"
}
]
}
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