Amin'ny ankapobeny, ny vokatra ara-barotra na ny loharano misokatra efa vonona, toy ny Prometheus + Grafana, dia ampiasaina hanaraha-maso sy hamakafaka ny fiasan'ny Nginx. Ity dia safidy tsara ho an'ny fanaraha-maso na famakafakana amin'ny fotoana tena izy, saingy tsy mety amin'ny famakafakana ara-tantara. Amin'ny loharano malaza rehetra, mitombo haingana ny habetsaky ny angona avy amin'ny logs nginx, ary ny famakafakana angon-drakitra be dia be, dia lojika ny fampiasana zavatra manokana kokoa.
Amin'ity lahatsoratra ity dia hilaza aminao ny fomba azonao ampiasaina
TL:DR;
Mba hanangonana vaovao ampiasainay
Manangona logs Nginx
Amin'ny alΓ lan'ny default, ny logs Nginx dia toa izao:
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" "-"
Azo alaina izy ireo, saingy mora kokoa ny manitsy ny konfigurasi Nginx mba hamokarana logs ao amin'ny 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 ho fitahirizana
Mba hitehirizana logs dia hampiasa S3 izahay. Izany dia ahafahanao mitahiry sy manadihady logs amin'ny toerana iray, satria i Athena dia afaka miasa amin'ny angona ao amin'ny S3 mivantana. Any aoriana ao amin'ny lahatsoratra dia holazaiko aminao ny fomba hanampiana sy fanodinana logs, fa mila siny madio amin'ny S3 aloha isika, izay tsy misy zavatra hafa hotehirizina. Tena ilaina ny mandinika mialoha izay faritra hamoronanao ny siny, satria tsy misy any amin'ny faritra rehetra i Athena.
Mamorona faritra ao amin'ny console Athena
Andao hamorona latabatra ao Athena ho an'ny logs. Ilaina amin'ny fanoratana sy famakiana raha mikasa ny hampiasa Kinesis Firehose ianao. Sokafy ny console Athena ary mamorona latabatra:
Famoronana latabatra 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');
Mamorona Kinesis Firehose Stream
Kinesis Firehose dia hanoratra ny angon-drakitra voaray avy amin'ny Nginx mankany S3 amin'ny endrika voafantina, mizara izany ho lahatahiry amin'ny endrika YYYY/MM/DD/HH. Tena ilaina izany rehefa mamaky angon-drakitra. Azonao atao, mazava ho azy, manoratra mivantana amin'ny S3 avy amin'ny fluentd, fa amin'ity tranga ity dia tsy maintsy manoratra JSON ianao, ary tsy mahomby izany noho ny haben'ny rakitra. Fanampin'izany, rehefa mampiasa PrestoDB na Athena, JSON no format data miadana indrindra. Sokafy ny console Kinesis Firehose, tsindrio ny "Create delivery stream", safidio ny "direct PUT" ao amin'ny saha "delivery":
Ao amin'ny tabilao manaraka, safidio ny "Record format conversion" - "Enabled" ary safidio ny "Apache ORC" ho endrika firaketana. Araka ny fikarohana sasany
Mifidiana S3 ho fitahirizana sy ny siny noforoninay teo aloha. Aws Glue Crawler, izay horesahiko ato aoriana kely, dia tsy afaka miasa amin'ny prefix ao anaty siny S3, noho izany dia zava-dehibe ny mamela azy ho foana.
Ny safidy sisa dia azo ovaina arakaraka ny entanao; Matetika aho no mampiasa ny default. Mariho fa tsy misy ny famoretana S3, fa ny ORC dia mampiasa famandrihan-toerana amin'ny alΓ lan'ny default.
fluentd
Amin'izao fotoana izao dia efa nanamboatra ny fitehirizana sy ny fandraisana ny logs isika, mila manitsy ny fandefasana. Hampiasaintsika
Voalohany, mila ny fichier configuration fluent.conf isika. Mamorona azy ary ampio loharano:
seranan-tsambo 24224
fatotra 0.0.0.0
Afaka manomboka ny mpizara Fluentd ianao izao. Raha mila fanitsiana mandroso kokoa ianao dia mandehana any
$ 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
Ity fanitsiana ity dia mampiasa ny lalana /fluentd/log
amin'ny cache logs alohan'ny handefasana. Afaka manao tsy misy an'io ianao, fa rehefa manomboka indray ianao, dia mety ho very daholo ny zavatra rehetra voatahiry amin'ny asa mihemotra. Azonao atao koa ny mampiasa seranana rehetra; 24224 no seranan-tsambo Fluentd default.
Ankehitriny rehefa manana Fluentd mihazakazaka isika dia afaka mandefa ny logs Nginx any. Matetika izahay no mitantana Nginx ao anaty container Docker, ka i Docker dia manana mpamily logging teratany ho an'ny 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
Raha toa ianao ka mihazakazaka Nginx amin'ny fomba hafa dia afaka mampiasa rakitra log ianao, manana ny Fluentd
Andao ampidirintsika ao amin'ny configuration Fluent ny log parsing efa namboarina etsy ambony:
<filter YOUR-NGINX-TAG.*>
@type parser
key_name log
emit_invalid_record_to_error false
<parse>
@type json
</parse>
</filter>
Ary mandefa logs amin'ny Kinesis mampiasa
<match YOUR-NGINX-TAG.*>
@type kinesis_firehose
region region
delivery_stream_name <YOUR-KINESIS-STREAM-NAME>
aws_key_id <YOUR-AWS-KEY-ID>
aws_sec_key <YOUR_AWS-SEC_KEY>
</match>
Athena
Raha efa namboarinao tsara ny zava-drehetra, dia rehefa afaka kelikely (amin'ny alΓ lan'ny default, ny firaketana Kinesis dia nahazo angon-drakitra indray mandeha isaky ny 10 minitra) dia tokony hahita rakitra log ianao ao amin'ny S3. Ao amin'ny menio "fanaraha-maso" an'ny Kinesis Firehose dia azonao jerena ny habetsaky ny angona voarakitra ao amin'ny S3, ary koa ny fahadisoana. Aza adino ny manome fidirana an-tsoratra amin'ny siny S3 amin'ny anjara asan'ny Kinesis. Raha tsy afaka namaky zavatra i Kinesis, dia hanampy ireo lesoka amin'ny siny iray ihany.
Afaka mijery ny angon-drakitra ao amin'ny Athena ianao izao. Andeha hojerentsika ny fangatahana farany izay namerenantsika lesoka:
SELECT * FROM "db_name"."table_name" WHERE status > 499 ORDER BY created_at DESC limit 10;
Fikarohana ny rakitra rehetra ho an'ny fangatahana tsirairay
Ankehitriny dia nokarakaraina sy voatahiry ao amin'ny S3 ao amin'ny ORC ny logs, voatsindry ary vonona ho an'ny fanadihadiana. Kinesis Firehose aza dia nandamina azy ireo ho lahatahiry isaky ny ora. Na izany aza, raha mbola tsy mizarazara ny latabatra, Athena dia hampiditra angon-drakitra amin'ny fotoana rehetra amin'ny fangatahana rehetra, miaraka amin'ny tranga tsy fahita firy. Olana lehibe izany noho ny antony roa:
- Tsy mitsaha-mitombo ny habetsaky ny angona, mampiadana ny fangatahana;
- Athena dia apetraka amin'ny habetsaky ny angon-drakitra notarafina, miaraka amin'ny 10 MB farafahakeliny isaky ny fangatahana.
Mba hamahana izany dia mampiasa AWS Glue Crawler izahay, izay handady ny angon-drakitra ao amin'ny S3 ary hanoratra ny fampahalalana fizarana amin'ny Glue Metastore. Izany dia ahafahantsika mampiasa fizarazarana ho sivana rehefa manontany an'i Athena, ary ny lahatahiry voatondro ao amin'ny fangatahana ihany no hijerena azy.
Mametraka Amazon Glue Crawler
Ny Amazon Glue Crawler dia mijery ny angona rehetra ao amin'ny siny S3 ary mamorona latabatra misy fizarazarana. Mamorona Glue Crawler avy amin'ny console AWS Glue ary ampio siny iray hitehirizanao ny angona. Azonao atao ny mampiasa crawler iray ho an'ny siny maromaro, amin'izay dia hamorona latabatra ao amin'ny angon-drakitra voatondro miaraka amin'ny anarana mifanandrify amin'ny anaran'ny siny. Raha mikasa ny hampiasa ity angona ity tsy tapaka ianao, dia ataovy azo antoka ny manamboatra ny fandaharam-potoanan'ny Crawler mba hifanaraka amin'ny filanao. Mampiasa Crawler iray ho an'ny latabatra rehetra izahay, izay mandeha isan'ora.
latabatra fisarahana
Aorian'ny fandefasana voalohany ny crawler dia tokony hiseho ao amin'ny angon-drakitra voatondro ao amin'ny firafitry ny tabilao isaky ny siny notarafina. Sokafy ny console Athena ary tadiavo ny latabatra misy logs Nginx. Andeha isika hanandrana hamaky zavatra:
SELECT * FROM "default"."part_demo_kinesis_bucket"
WHERE(
partition_0 = '2019' AND
partition_1 = '04' AND
partition_2 = '08' AND
partition_3 = '06'
);
Ity fanontaniana ity dia hisafidy ireo firaketana rehetra voaray teo anelanelan'ny 6 maraina sy 7 maraina tamin'ny 8 aprily 2019. Fa maninona no mahomby kokoa noho ny famakiana latabatra tsy misy fisarahana fotsiny? Andeha hojerentsika sy hisafidy ireo rakitsoratra mitovy amin'izany, hanivana azy ireo amin'ny mari-pamantarana:
3.59 segondra ary 244.34 megabytes amin'ny angon-drakitra miaraka amin'ny diary herinandro monja. Andeha isika hanandrana sivana amin'ny fisarahana:
Haingana kely, fa ny zava-dehibe indrindra - angona 1.23 megabytes ihany! Ho mora kokoa izany raha tsy amin'ny 10 megabytes farafahakeliny isaky ny fangatahana amin'ny vidiny. Saingy mbola tsara kokoa izany, ary amin'ny angon-drakitra lehibe dia ho mahavariana kokoa ny fahasamihafana.
Manangana dashboard mampiasa Cube.js
Mba hanangonana ny dashboard dia mampiasa ny rafitra analytical Cube.js izahay. Manana fiasa be dia be izy io, saingy liana amin'ny roa izahay: ny fahafahana mampiasa ny sivana fisarahana ho azy sy ny fanangonana data mialoha. Mampiasa schema data izy io
Andao hamorona fampiharana Cube.js vaovao. Satria efa mampiasa ny AWS stack isika, dia lojika ny fampiasana Lambda amin'ny fametrahana. Azonao atao ny mampiasa ny maodely express ho an'ny taranaka raha mikasa ny hampiantrano ny Cube.js backend ao amin'ny Heroku na Docker ianao. Ny antontan-taratasy dia mamaritra ny hafa
$ npm install -g cubejs-cli
$ cubejs create nginx-log-analytics -t serverless -d athena
Ny fari-piainan'ny tontolo iainana dia ampiasaina hanamboarana ny fidirana amin'ny angona ao amin'ny cube.js. Ny mpamokatra dia hamorona rakitra .env izay ahafahanao mamaritra ny fanalahidinao
Ankehitriny dia mila
Ao amin'ny lahatahiry schema
, mamorona rakitra Logs.js
. Ity misy ohatra modely data ho an'ny nginx:
Kaody modely
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`
}
}
});
Eto isika dia mampiasa ny variable
Nametraka ny metrika sy ny masontsivana tiana haseho eo amin'ny solaitrabe ihany koa izahay ary mamaritra mialoha ny fanangonana. Ny Cube.js dia hamorona tabilao fanampiny miaraka amin'ny angona voaangona mialoha ary hanavao ho azy ny angona rehefa tonga. Tsy vitan'ny hoe manafaingana ny fanontaniana izany, fa mampihena ihany koa ny vidin'ny fampiasana Athena.
Andeha ampidirintsika amin'ny rakitra schema data ity fampahalalana ity:
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`
)
}
}
}
Nofaritanay ato amin'ity maodely ity fa ilaina ny manangom-bokatra mialoha ho an'ny metrika rehetra ampiasaina, ary mampiasa ny fizarazarana isam-bolana.
Ankehitriny dia afaka manangona ny dashboard isika!
Cube.js backend dia manome
Ny mpizara Cube.js dia manaiky ny fangatahana
{
"measures": ["Logs.errorCount"],
"timeDimensions": [
{
"dimension": "Logs.createdAt",
"dateRange": ["2019-01-01", "2019-01-07"],
"granularity": "day"
}
]
}
Andao hametraka ny mpanjifa Cube.js sy ny tranomboky singa React amin'ny alΓ lan'ny NPM:
$ npm i --save @cubejs-client/core @cubejs-client/react
Manafatra singa izahay cubejs
ΠΈ QueryRenderer
hisintona ny angona, ary hanangona ny dashboard:
Kaody dashboard
import React from 'react';
import { LineChart, Line, XAxis, YAxis } from 'recharts';
import cubejs from '@cubejs-client/core';
import { QueryRenderer } from '@cubejs-client/react';
const cubejsApi = cubejs(
'YOUR-CUBEJS-API-TOKEN',
{ apiUrl: 'http://localhost:4000/cubejs-api/v1' },
);
export default () => {
return (
<QueryRenderer
query={{
measures: ['Logs.errorCount'],
timeDimensions: [{
dimension: 'Logs.createdAt',
dateRange: ['2019-01-01', '2019-01-07'],
granularity: 'day'
}]
}}
cubejsApi={cubejsApi}
render={({ resultSet }) => {
if (!resultSet) {
return 'Loading...';
}
return (
<LineChart data={resultSet.rawData()}>
<XAxis dataKey="Logs.createdAt"/>
<YAxis/>
<Line type="monotone" dataKey="Logs.errorCount" stroke="#8884d8"/>
</LineChart>
);
}}
/>
)
}
Hita ao amin'ny
Source: www.habr.com