Nginx log analytics mampiasa Amazon Athena sy Cube.js

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 Athena hamakafaka ny logs, maka an'i Nginx ho ohatra, ary hasehoko ny fomba fanangonana dashboard analytique avy amin'ity data ity amin'ny fampiasana ny open-source cube.js framework. Ity ny rafitra vahaolana feno:

Nginx log analytics mampiasa Amazon Athena sy Cube.js

TL:DR;
Rohy mankany amin'ny dashboard vita.

Mba hanangonana vaovao ampiasainay fluentd, ho an'ny fanodinana - AWS Kinesis Data Firehose ΠΈ Lakaoly AWS, ho fitahirizana - AWS S3. Amin'ny fampiasana an'ity fehezam-boninkazo ity dia azonao atao ny mitahiry tsy ny logs nginx, fa ny hetsika hafa, ary koa ny logs amin'ny serivisy hafa. Azonao atao ny manolo ny ampahany sasany mitovy amin'ny stack anao, ohatra, azonao atao ny manoratra logs amin'ny kinesis mivantana avy amin'ny nginx, miala amin'ny fluentd, na mampiasa logstash amin'izany.

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

Nginx log analytics mampiasa Amazon Athena sy Cube.js

Ao amin'ny tabilao manaraka, safidio ny "Record format conversion" - "Enabled" ary safidio ny "Apache ORC" ho endrika firaketana. Araka ny fikarohana sasany Owen O'Malley, ity no endrika tsara indrindra ho an'ny PrestoDB sy Athena. Mampiasa ny tabilao noforoninay etsy ambony izahay ho skema. Mariho fa azonao atao ny mamaritra ny toerana misy S3 amin'ny kinesis; ny skema ihany no ampiasaina avy amin'ny latabatra. Fa raha manondro toerana S3 hafa ianao, dia tsy ho afaka hamaky ireo firaketana ireo avy amin'ity latabatra ity ianao.

Nginx log analytics mampiasa Amazon Athena sy Cube.js

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.

Nginx log analytics mampiasa Amazon Athena sy Cube.js

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 fluentd, satria tiako i Ruby, fa afaka mampiasa Logstash ianao na mandefa logs amin'ny kinesis mivantana. Ny mpizara Fluentd dia azo atomboka amin'ny fomba maro, holazaiko aminao ny momba ny docker satria tsotra sy mety.

Voalohany, mila ny fichier configuration fluent.conf isika. Mamorona azy ary ampio loharano:

karazana handroso
seranan-tsambo 24224
fatotra 0.0.0.0

Afaka manomboka ny mpizara Fluentd ianao izao. Raha mila fanitsiana mandroso kokoa ianao dia mandehana any Hub docker Misy torolalana amin'ny antsipiriany, anisan'izany ny fomba fanangonana ny sarinao.

$ 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 fichier tail plugin.

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 kinesis firehose plugin:

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

Nginx log analytics mampiasa Amazon Athena sy Cube.js

3.59 segondra ary 244.34 megabytes amin'ny angon-drakitra miaraka amin'ny diary herinandro monja. Andeha isika hanandrana sivana amin'ny fisarahana:

Nginx log analytics mampiasa Amazon Athena sy Cube.js

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 data schema, nosoratana tamin'ny Javascript mba hamoronana SQL sy hanaovana fangatahana angon-drakitra. Mila manondro fotsiny ny fomba fampiasana ny sivana fisarahana ao amin'ny schema data.

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 fomba fampiantranoana.

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

Ankehitriny dia mila data schema, izay hanoroantsika tsara ny fomba fitehirizana ny diantsika. Any ianao dia afaka mamaritra ny fomba kajy ny metrika ho an'ny dashboards.

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 FILTER_PARAMShamorona fangatahana SQL miaraka amin'ny sivana fisarahana.

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. Fizarana mialoha ny fanangonana afaka manafaingana ny fanangonana sy fanavaozana ny angona.

Ankehitriny dia afaka manangona ny dashboard isika!

Cube.js backend dia manome HAFA API ary andiana tranomboky mpanjifa ho an'ny rafitra malaza eo anoloana. Hampiasa ny kinova React an'ny mpanjifa izahay hananganana ny dashboard. Ny Cube.js ihany no manome angona, ka mila tranomboky momba ny maso isika - tiako izany recharts, fa afaka mampiasa na inona na inona ianao.

Ny mpizara Cube.js dia manaiky ny fangatahana format JSON, izay mamaritra ny metrika ilaina. Ohatra, raha manisa ny isan'ny lesoka nomen'i Nginx isan'andro dia mila mandefa ity fangatahana manaraka ity ianao:

{
  "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 ΠΈ QueryRendererhisintona 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 kaody sandbox.

Source: www.habr.com

Add a comment