Anailísíocht logála Nginx ag baint úsáide as Amazon Athena agus Cube.js

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 Fiachra chun logaí a anailísiú, ag glacadh Nginx mar shampla, agus taispeánfaidh mé conas painéal anailíse a chur le chéile ó na sonraí seo ag baint úsáide as an gcreat foinse oscailte cube.js. Seo é an ailtireacht réitigh iomlán:

Anailísíocht logála Nginx ag baint úsáide as Amazon Athena agus Cube.js

TL:DR;
Nasc leis an painéal críochnaithe.

Chun eolas a bhailiú úsáidimid líofa, le haghaidh próiseála - Firehose Sonraí Kinesis AWS и Gliú AWS, le haghaidh stórála - AWS S3. Ag baint úsáide as an bundle seo, is féidir leat ní hamháin logaí nginx a stóráil, ach freisin imeachtaí eile, chomh maith le logaí seirbhísí eile. Is féidir leat codanna den chineál céanna a athsholáthar le haghaidh do chairn, mar shampla, is féidir leat logs a scríobh chuig kinesis go díreach ó nginx, ag seachaint fluentd, nó logstash a úsáid le haghaidh seo.

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

Anailísíocht logála Nginx ag baint úsáide as Amazon Athena agus Cube.js

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 Eoin O'Malley, is é seo an fhormáid is fearr le haghaidh PrestoDB agus Athena. Bainimid úsáid as an tábla a chruthaigh muid thuas mar scéimre. Tabhair faoi deara gur féidir leat aon suíomh S3 a shonrú i gcinesis; ní úsáidtear ach an scéimre ón tábla. Ach má shonraíonn tú suíomh S3 difriúil, ní bheidh tú in ann na taifid seo a léamh ón tábla seo.

Anailísíocht logála Nginx ag baint úsáide as Amazon Athena agus Cube.js

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.

Anailísíocht logála Nginx ag baint úsáide as Amazon Athena agus Cube.js

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 líofa, mar is breá liom Ruby, ach is féidir leat Logstash a úsáid nó logs a sheoladh chuig kinesis go díreach. Is féidir an freastalaí líofa a sheoladh ar bhealaí éagsúla, inseoidh mé duit faoi docker toisc go bhfuil sé simplí agus áisiúil.

Gcéad dul síos, ní mór dúinn an comhad cumraíochta fluent.conf. Cruthaigh é agus cuir foinse leis:

cineál aghaidh
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í Mol dugaire Tá treoir mhionsonraithe ann, lena n-áirítear conas do íomhá a chur le chéile.

$ 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 breiseán eireaball comhaid.

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 Breiseán 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>

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:

Anailísíocht logála Nginx ag baint úsáide as Amazon Athena agus Cube.js

3.59 soicind agus 244.34 meigeavata sonraí ar thacar sonraí gan ach seachtain de logaí. Bainimis triail as scagaire trí dheighilt:

Anailísíocht logála Nginx ag baint úsáide as Amazon Athena agus Cube.js

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í scéimre sonraí, scríofa i Javascript chun SQL a ghiniúint agus chun ceist bhunachar sonraí a rith. Ní mór dúinn ach a léiriú conas an scagaire deighilte a úsáid sa 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 modhanna óstála.

$ 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 Fiachra.

Anois ní mór dúinn scéimre sonraí, ina léireoimid go díreach conas a stóráiltear ár logaí. Is féidir leat a shonrú freisin conas méadracht a ríomh le haghaidh deais.

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 FILTER_PARAMSchun ceist SQL a ghiniúint le scagaire deighilte.

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. Deighilt réamh-chomhiomlánaithe is féidir leis bailiú agus nuashonrú sonraí a bhrostú go suntasach.

Anois is féidir linn an painéal a chur le chéile!

Soláthraíonn inneall Cube.js REST API agus sraith de leabharlanna cliant le haghaidh creataí tosaigh coitianta. Bainfimid úsáid as an leagan React den chliant chun an painéal a thógáil. Ní sholáthraíonn Cube.js ach sonraí, mar sin beidh leabharlann léirshamhlaithe de dhíth orainn - is maith liom é recharts, ach is féidir leat úsáid a bhaint as aon.

Glacann freastalaí Cube.js leis an iarratas i formáid JSON, a shonraíonn an mhéadracht riachtanach. Mar shampla, chun cé mhéad earráidí a thug Nginx sa lá a ríomh, ní mór duit an t-iarratas seo a leanas a sheoladh:

{
  "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 и QueryRendererchun 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 bosca gainimh cód.

Foinse: will.com

Add a comment