De ghnáth, úsáidtear táirgí tráchtála nó roghanna foinse oscailte réamhdhéanta, mar Prometheus + Grafana, chun monatóireacht agus anailís a dhéanamh ar oibriú Nginx. Is rogha maith é seo le haghaidh monatóireachta nó anailísíochta fíor-ama, ach níl sé an-áisiúil le haghaidh anailíse stairiúil. Ar aon acmhainn tóir, tá méid na sonraí ó logaí nginx ag fás go tapa, agus chun anailís a dhéanamh ar mhéid mór sonraí, tá sé loighciúil rud éigin níos speisialaithe a úsáid.
San Airteagal seo inseoidh mé duit conas is féidir leat é a úsáid
TL:DR;
Chun eolas a bhailiú úsáidimid
Logs Nginx a bhailiú
De réir réamhshocraithe, breathnaíonn logaí Nginx rud éigin mar seo:
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" "-"
Is féidir iad a pharsáil, ach tá sé i bhfad níos éasca cumraíocht Nginx a cheartú ionas go dtáirgeann sé logaí i 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 le haghaidh stórála
Chun logaí a stóráil, úsáidfimid S3. Ligeann sé seo duit logaí a stóráil agus a anailísiú in aon áit amháin, mar is féidir le Athena oibriú le sonraí i S3 go díreach. Níos déanaí san alt inseoidh mé duit conas logaí a chur leis agus a phróiseáil i gceart, ach ar dtús ní mór dúinn buicéad glan i S3, nach stórálfar aon rud eile. Is fiú smaoineamh roimh ré cén réigiún ina mbeidh do bhuicéad á chruthú agat, mar níl Athena ar fáil i ngach réigiún.
Ciorcad a chruthú i gconsól Athena
A ligean ar a chruthú tábla i Athena do logs. Tá sé ag teastáil le haghaidh scríbhneoireachta agus léitheoireachta araon má tá sé beartaithe agat Kinesis Firehose a úsáid. Oscail consól Athena agus cruthaigh tábla:
Cruthú tábla 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');
Cruthú Kinesis Firehose Stream
Scríobhfaidh Kinesis Firehose na sonraí a fuarthas ó Nginx go S3 san fhormáid roghnaithe, á roinnt ina eolairí san fhormáid BBBB/MM/DD/HH. Beidh sé seo áisiúil agus sonraí á léamh. Is féidir leat, ar ndóigh, scríobh go díreach chuig S3 ó fluentd, ach sa chás seo beidh ort JSON a scríobh, agus tá sé seo mí-éifeachtach mar gheall ar mhéid mór na gcomhad. Ina theannta sin, agus PrestoDB nó Athena á n-úsáid, is é JSON an fhormáid sonraí is moille. Mar sin oscail consól Kinesis Firehose, cliceáil “Cruthaigh sruth seachadta”, roghnaigh “PUT díreach” sa réimse “seachadadh”:
Sa cluaisín seo chugainn, roghnaigh "Taifead comhshó formáid" - "Cumasaithe" agus roghnaigh "Apache ORC" mar an fhormáid taifeadta. De réir roinnt taighde
Roghnaimid S3 le haghaidh stórála agus an buicéad a chruthaigh muid níos luaithe. Ní féidir le Aws Glue Crawler, ar a mbeidh mé ag caint faoi beagán níos déanaí, oibriú le réimíreanna i mbuicéad S3, mar sin tá sé tábhachtach é a fhágáil folamh.
Is féidir na roghanna eile a athrú ag brath ar d’ualach; de ghnáth bainim úsáid as na cinn réamhshocraithe. Tabhair faoi deara nach bhfuil comhbhrú S3 ar fáil, ach úsáideann ORC comhbhrú dúchais de réir réamhshocraithe.
líofa
Anois go bhfuil stóráil agus logaí glactha cumraithe againn, ní mór dúinn an seoladh a chumrú. Úsáidfimid
Gcéad dul síos, ní mór dúinn an comhad cumraíochta fluent.conf. Cruthaigh é agus cuir foinse leis:
port 24224
ceangal 0.0.0.0
Anois is féidir leat an freastalaí Fluentd a thosú. Má theastaíonn cumraíocht níos forbartha uait, téigh go dtí
$ 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
Úsáideann an chumraíocht seo an cosán /fluentd/log
chun logaí a thaisceadh roimh iad a sheoladh. Is féidir leat a dhéanamh gan é seo, ach ansin nuair a atosú tú, is féidir leat a chailleadh gach rud i dtaisce le saothair ais-bhriseadh. Is féidir leat aon phort a úsáid freisin; is é 24224 an calafort réamhshocraithe Fluentd.
Anois go bhfuil Fluentd ag rith againn, is féidir linn logaí Nginx a sheoladh ann. De ghnáth ritheann muid Nginx i gcoimeádán Docker, agus sa chás sin tá tiománaí logála dúchais ag Docker do 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
Má ritheann tú Nginx ar bhealach difriúil, is féidir leat comhaid logála a úsáid, tá Fluentd
Cuirimis an pharsáil loga atá cumraithe thuas leis an gcumraíocht Líofa:
<filter YOUR-NGINX-TAG.*>
@type parser
key_name log
emit_invalid_record_to_error false
<parse>
@type json
</parse>
</filter>
Agus logs a sheoladh chuig Kinesis ag baint úsáide as
<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>
Fiachra
Má tá gach rud cumraithe i gceart agat, ansin tar éis tamaill (de réir réamhshocraithe, taifid Kinesis sonraí a fuarthas uair amháin gach 10 nóiméad) ba chóir duit a fheiceáil comhaid logáil isteach i S3. Sa roghchlár “monatóireacht” de Kinesis Firehose is féidir leat a fheiceáil cé mhéad sonraí a thaifeadtar in S3, chomh maith le hearráidí. Ná déan dearmad rochtain scríofa a thabhairt don bhuicéad S3 ar ról Kinesis. Mura bhféadfadh Kinesis rud éigin a pharsáil, cuirfidh sé na hearráidí leis an buicéad céanna.
Anois is féidir leat féachaint ar na sonraí in Athena. Faighimid na hiarratais is déanaí ar chuireamar earráidí ar ais ina leith:
SELECT * FROM "db_name"."table_name" WHERE status > 499 ORDER BY created_at DESC limit 10;
Gach taifead a scanadh do gach iarratas
Anois tá ár logaí próiseáilte agus stóráilte i S3 in ORC, comhbhrúite agus réidh le haghaidh anailíse. D'eagraigh Kinesis Firehose fiú iad ina n-eolairí ar feadh gach uair an chloig. Mar sin féin, chomh fada agus nach bhfuil an tábla deighilte, lódálfaidh Athena sonraí uile-aimseartha ar gach iarratas, cé is moite d’eisceachtaí annamh. Is fadhb mhór í seo ar dhá chúis:
- Tá líon na sonraí ag fás i gcónaí, ag cur moill ar cheisteanna;
- Gearrtar bille ar Athena bunaithe ar mhéid na sonraí a scanadh, le 10 MB ar a laghad in aghaidh an iarratais.
Chun é seo a shocrú, úsáidimid AWS Glue Crawler, a dhéanfaidh na sonraí a chraobhscaoileadh in S3 agus a scríobhfaidh an fhaisnéis deighilte chuig an Glue Metastore. Ligfidh sé seo dúinn deighiltí a úsáid mar scagaire agus Athena á bhfiosrú, agus ní dhéanfaidh sé ach na heolairí atá sonraithe sa cheist a scanadh.
Amazon Glue Crawler a bhunú
Scanann Amazon Glue Crawler na sonraí go léir sa bhuicéad S3 agus cruthaíonn sé táblaí le deighiltí. Cruthaigh Crawler Gliú ó chonsól AWS Glue agus cuir buicéad leis ina stórálann tú na sonraí. Is féidir leat crawler amháin a úsáid le haghaidh roinnt buicéid, agus sa chás sin cruthóidh sé táblaí sa bhunachar sonraí sonraithe le hainmneacha a mheaitseálann ainmneacha na buicéid. Má tá sé ar intinn agat na sonraí seo a úsáid go rialta, déan cinnte sceideal seolta Crawler a chumrú chun freastal ar do chuid riachtanas. Bainimid úsáid as Crawler amháin do gach tábla, a ritheann gach uair an chloig.
Táblaí deighilte
Tar éis an crawler a sheoladh den chéad uair, ba cheart go mbeadh táblaí le haghaidh gach buicéad scanta le feiceáil sa bhunachar sonraí atá sonraithe sna socruithe. Oscail an consól Athena agus aimsigh an tábla le logaí Nginx. Déanaimis iarracht rud éigin a léamh:
SELECT * FROM "default"."part_demo_kinesis_bucket"
WHERE(
partition_0 = '2019' AND
partition_1 = '04' AND
partition_2 = '08' AND
partition_3 = '06'
);
Roghnóidh an cheist seo na taifid go léir a gheofar idir 6 am agus 7 a.m. an 8 Aibreán, 2019. Ach cé chomh héifeachtach is atá sé seo ná díreach léamh ó thábla neamhdheighilte? Déanaimis na taifid chéanna a fháil amach agus a roghnú, agus iad á scagadh de réir stampa ama:
3.59 soicind agus 244.34 meigeavata sonraí ar thacar sonraí gan ach seachtain de logaí. Bainimis triail as scagaire trí dheighilt:
Beagán níos tapúla, ach is tábhachtaí - ach 1.23 meigibheart de shonraí! Bheadh sé i bhfad níos saoire mura mbeadh an t-íosmhéid 10 meigibheart in aghaidh an iarratais sa phraghsáil. Ach tá sé i bhfad níos fearr fós, agus ar thacair sonraí móra beidh an difríocht i bhfad níos suntasaí.
Deais a thógáil ag baint úsáide as Cube.js
Chun an painéal a chur le chéile, bainimid úsáid as creat anailíse Cube.js. Tá go leor feidhmeanna aige, ach tá suim againn i dhá cheann: an cumas scagairí deighilte agus réamh-chomhbhailiú sonraí a úsáid go huathoibríoch. Úsáideann sé scéimre sonraí
Cruthaimis feidhmchlár nua Cube.js. Ós rud é go bhfuil cruach AWS á úsáid againn cheana féin, tá sé loighciúil Lambda a úsáid lena imscaradh. Is féidir leat an teimpléad sainráite a úsáid le haghaidh giniúna má tá sé beartaithe agat an t-inneall Cube.js a óstáil i Heroku nó Docker. Déanann an doiciméadú cur síos ar dhaoine eile
$ npm install -g cubejs-cli
$ cubejs create nginx-log-analytics -t serverless -d athena
Úsáidtear athróga comhshaoil chun rochtain ar bhunachar sonraí a chumrú in cube.js. Cruthóidh an gineadóir comhad .env inar féidir leat do chuid eochracha a shonrú le haghaidh
Anois ní mór dúinn
San eolaire schema
, cruthaigh comhad Logs.js
. Seo sampla de shamhail sonraí do nginx:
Cóid samhail
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`
}
}
});
Anseo táimid ag baint úsáide as an athróg
Socraímid freisin na méadrachtaí agus na paraiméadair is mian linn a thaispeáint ar an deais agus sonraítear réamh-chomhiomláin. Cruthóidh Cube.js táblaí breise le sonraí réamh-chomhiomlánaithe agus déanfaidh sé na sonraí a nuashonrú go huathoibríoch de réir mar a thagann sé. Ní hamháin go gcuireann sé seo dlús le fiosruithe, ach laghdaíonn sé an costas a bhaineann le Athena a úsáid.
Cuirimis an fhaisnéis seo leis an gcomhad scéimre sonraí:
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`
)
}
}
}
Sonraímid sa mhúnla seo go bhfuil sé riachtanach sonraí a réamh-chomhiomlánú le haghaidh na méadrachta go léir a úsáidtear, agus úsáid a bhaint as deighilt de réir míosa.
Anois is féidir linn an painéal a chur le chéile!
Soláthraíonn inneall Cube.js
Glacann freastalaí Cube.js leis an iarratas i
{
"measures": ["Logs.errorCount"],
"timeDimensions": [
{
"dimension": "Logs.createdAt",
"dateRange": ["2019-01-01", "2019-01-07"],
"granularity": "day"
}
]
}
Déanaimis an cliant Cube.js agus an leabharlann comhpháirteanna React a shuiteáil trí NPM:
$ npm i --save @cubejs-client/core @cubejs-client/react
Allmhairímid comhpháirteanna cubejs
и QueryRenderer
chun na sonraí a íoslódáil, agus an painéal a bhailiú:
Cóid painéal
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>
);
}}
/>
)
}
Tá foinsí deais ar fáil ag
Foinse: will.com