L-istorja tas-sors miftuħ tagħna: kif għamilna servizz analitiku f'Go u għamilna disponibbli pubblikament

Bħalissa, kważi kull kumpanija fid-dinja tiġbor statistika dwar l-azzjonijiet tal-utent fuq riżors tal-web. Il-motivazzjoni hija ċara - il-kumpaniji jridu jkunu jafu kif jintuża l-prodott/websajt tagħhom u jifhmu aħjar lill-utenti tagħhom. Naturalment, hemm numru kbir ta’ għodod fis-suq biex issolvi din il-problema - minn sistemi analitiċi li jipprovdu data fil-forma ta’ dashboards u graphs (pereżempju Google Analytics) għall-Pjattaforma tad-Dejta tal-Klijent, li jippermettulek tiġbor u tiġbor dejta minn sorsi differenti fi kwalunkwe maħżen (pereżempju segment).

Imma sibna problema li għadha ma ġietx solvuta. Hekk twieled EventNative — servizz analitiku open-source. Aqra dwar għaliex iddeċidejna li niżviluppaw is-servizz tagħna stess, dak li tana, u x'kien ir-riżultat finali (b'biċċiet ta 'kodiċi).

L-istorja tas-sors miftuħ tagħna: kif għamilna servizz analitiku f'Go u għamilna disponibbli pubblikament

Għaliex għandna niżviluppaw is-servizz tagħna stess?

Kienu s-snin disgħin, baqgħu ħajjin mill-aħjar li stajna. 2019, żviluppajna l-API First Customer Data Platform kSense, li għamilha possibbli li tiġi aggregata dejta minn sorsi differenti (reklami Facebook, Stripe, Salesforce, Google play, Google Analytics, eċċ.) għal analiżi tad-dejta aktar konvenjenti, identifikazzjoni tad-dipendenzi, eċċ. Aħna ndunajna li ħafna utenti jużaw il-pjattaforma tagħna għall-analiżi tad-dejta speċifikament Google Analytics (minn hawn 'il quddiem GA). Tkellimna ma' xi utenti u sibna li għandhom bżonn id-dejta analitika għall-prodott tagħhom li jirċievu bl-użu ta' GA, iżda Google kampjuni tad-dejta u għal ħafna, l-interface tal-Utent GA mhuwiex l-istandard ta 'konvenjenza. Kellna biżżejjed konversazzjonijiet mal-utenti tagħna u rrealizzajna li ħafna kienu qed jużaw ukoll il-pjattaforma Segment (li, anzi, kienet biss il-ġurnata l-oħra mibjugħa għal $3.2 biljun).

Installaw pixel javascript Segment fuq ir-riżors tal-web tagħhom u d-dejta dwar l-imġieba tal-utenti tagħhom ġiet mgħobbija fid-database speċifikata (per eżempju Postgres). Iżda Segment għandu wkoll l-iżvantaġġ tiegħu - il-prezz. Pereżempju, jekk riżorsa tal-web għandha 90,000 MTU (utenti tracked kull xahar), allura trid tħallas ~ 1,000 $ fix-xahar lill-kaxxier. Kien hemm ukoll it-tielet problema - xi estensjonijiet tal-browser (bħal AdBlock) imblukkaw il-ġbir tal-analiżi minħabba... It-talbiet http mill-browser intbagħtu lid-dominji GA u Segment. Ibbażat fuq ix-xewqat tal-klijenti tagħna, ħloqna servizz analitiku li jiġbor sett sħiħ ta 'dejta (mingħajr kampjunar), huwa b'xejn u jista' jaħdem fuq l-infrastruttura tagħna stess.

Kif jaħdem is-servizz

Is-servizz jikkonsisti fi tliet partijiet: pixel javascript (li aktar tard ktibna mill-ġdid bit-tajpja), il-parti tas-server hija implimentata bil-lingwa GO, u kien ippjanat li jintużaw Redshift u BigQuery bħala database interna (aktar tard żiedu appoġġ għal Postgres, ClickHouse u Snowflake).

Ġie deċiż li l-istruttura tal-avvenimenti tal-GA u tas-Segment titħalla mhux mibdula. Dak kollu li kien meħtieġ kien li jiġu duplikati l-avvenimenti kollha mir-riżors tal-web fejn il-pixel huwa installat fuq il-backend tagħna. Kif jirriżulta, dan mhuwiex diffiċli li tagħmel. Il-pixel Javascript qabeż il-metodu oriġinali tal-librerija GA b'wieħed ġdid, li dduplikat l-avveniment fis-sistema tagħna.

//'ga' - стандартное название переменной Google Analytics
if (window.ga) {
    ga(tracker => {
        var originalSendHitTask = tracker.get('sendHitTask');
        tracker.set('sendHitTask', (model) => {
            var payLoad = model.get('hitPayload');
            //отправка оригинального события в GA
            originalSendHitTask(model);
            let jsonPayload = this.parseQuery(payLoad);
            //отправка события в наш сервис
            this.send3p('ga', jsonPayload);
        });
    });
}

Bil-pixel Segment kollox huwa aktar sempliċi; għandu metodi middleware, li wieħed minnhom użajna.


//'analytics' - стандартное название переменной Segment
if (window.analytics) {
    if (window.analytics.addSourceMiddleware) {
        window.analytics.addSourceMiddleware(chain => {
            try {
		//дублирование события в наш сервис
                this.send3p('ajs', chain.payload);
            } catch (e) {
                LOG.warn('Failed to send an event', e)
            }
	    //отправка оригинального события в Segment
            chain.next(chain.payload);
        });
    } else {
        LOG.warn("Invalid interceptor state. Analytics js initialized, but not completely");
    }
} else {
    LOG.warn('Analytics.js listener is not set.');
}

Minbarra l-ikkupjar tal-avvenimenti, żidna l-abbiltà li nibagħtu json arbitrarju:


//Отправка событий с произвольным json объектом
eventN.track('product_page_view', {
    product_id: '1e48fb70-ef12-4ea9-ab10-fd0b910c49ce',
    product_price: 399.99,
    price_currency: 'USD'
    product_release_start: '2020-09-25T12:38:27.763000Z'
});

Sussegwentement, ejja nitkellmu dwar il-parti tas-server. Il-backend għandu jaċċetta talbiet http, jimlahom b'informazzjoni addizzjonali, pereżempju, data ġeografika (grazzi maxmind għal dan) u rreġistraha fid-database. Ridna nagħmlu s-servizz kemm jista’ jkun konvenjenti sabiex ikun jista’ jintuża b’konfigurazzjoni minima. Implimentajna l-funzjonalità li tiddetermina l-iskema tad-dejta bbażata fuq l-istruttura tal-avveniment json li jkun dieħel. It-tipi tad-dejta huma definiti minn valuri. Oġġetti mdaħħla huma dekomposti u mnaqqsa għal struttura ċatta:

//входящий json
{
  "field_1":  {
    "sub_field_1": "text1",
    "sub_field_2": 100
  },
  "field_2": "text2",
  "field_3": {
    "sub_field_1": {
      "sub_sub_field_1": "2020-09-25T12:38:27.763000Z"
    }
  }
}

//результат
{
  "field_1_sub_field_1":  "text1",
  "field_1_sub_field_2":  100,
  "field_2": "text2",
  "field_3_sub_field_1_sub_sub_field_1": "2020-09-25T12:38:27.763000Z"
}

Madankollu, arrays bħalissa huma sempliċement konvertiti għal kordi minħabba Mhux id-databases relazzjonali kollha jappoġġjaw oqsma ripetuti. Huwa wkoll possibbli li tibdel l-ismijiet tal-qasam jew tħassarhom bl-użu ta' regoli tal-mapping fakultattivi. Huma jippermettulek tibdel l-iskema tad-dejta jekk meħtieġ jew tikkonverti tip ta 'dejta għal ieħor. Pereżempju, jekk qasam json ikun fih string b'timestamp (field_3_sub_field_1_sub_sub_field_1 mill-eżempju ta 'hawn fuq), imbagħad sabiex toħloq qasam fid-database bit-tip ta' timestamp, għandek bżonn tikteb regola ta 'mapping fil-konfigurazzjoni. Fi kliem ieħor, it-tip tad-dejta tal-qasam huwa ddeterminat l-ewwel mill-valur json, u mbagħad tiġi applikata r-regola tal-ikkastjar tat-tip (jekk konfigurat). Aħna identifikajna 4 tipi ta' dejta ewlenin: STRING, FLOAT64, INT64 u TIMESTAMP. Ir-regoli tal-immappjar u tal-ikkastjar tat-tip jidhru bħal dan:

rules:
  - "/field_1/subfield_1 -> " #правило удаления поля
  - "/field_2/subfield_1 -> /field_10/subfield_1" #правило переноса поля
  - "/field_3/subfield_1/subsubfield_1 -> (timestamp) /field_20" #правило переноса поля и приведения типа

Algoritmu għad-determinazzjoni tat-tip tad-dejta:

  • jikkonverti l-istruttura json għal struttura ċatta
  • tiddetermina t-tip ta' data ta' oqsma bil-valuri
  • l-applikazzjoni tar-regoli tal-immappjar u l-ikkastjar tat-tip

Imbagħad mill-istruttura json li tidħol:

{
    "product_id":  "1e48fb70-ef12-4ea9-ab10-fd0b910c49ce",
    "product_price": 399.99,
    "price_currency": "USD",
    "product_type": "supplies",
    "product_release_start": "2020-09-25T12:38:27.763000Z",
    "images": {
      "main": "picture1",
      "sub":  "picture2"
    }
}

l-iskema tad-dejta se tinkiseb:

"product_id" character varying,
"product_price" numeric (38,18),
"price_currency" character varying,
"product_type" character varying,
"product_release_start" timestamp,
"images_main" character varying,
"images_sub" character varying

Ħsibna wkoll li l-utent għandu jkun jista 'jikkonfigura partizzjoni jew jaqsam id-data fid-database skond kriterji oħra u implimenta l-abbiltà li jissettja l-isem tal-mejda b'kostanti jew espressjoni fil-konfigurazzjoni. Fl-eżempju hawn taħt, l-avveniment se jiġi ssejvjat f'tabella b'isem ikkalkulat ibbażat fuq il-valuri tal-oqsma product_type u _timestamp (per eżempju provvisti_2020_10):

tableName: '{{.product_type}}_{{._timestamp.Format "2006_01"}}'

Madankollu, l-istruttura ta 'avvenimenti deħlin tista' tinbidel waqt ir-runtime. Implimentajna algoritmu biex tivverifika d-differenza bejn l-istruttura ta 'tabella eżistenti u l-istruttura ta' avveniment li jkun dieħel. Jekk tinstab differenza, it-tabella tiġi aġġornata b'oqsma ġodda. Biex tagħmel dan, uża l-mistoqsija SQL tal-garża:

#Пример для Postgres
ALTER TABLE "schema"."table" ADD COLUMN new_column character varying

arkitettura

L-istorja tas-sors miftuħ tagħna: kif għamilna servizz analitiku f'Go u għamilna disponibbli pubblikament

Għaliex għandek bżonn tikteb avvenimenti fis-sistema tal-fajls, u mhux biss tiktebhom direttament fid-database? Id-databases mhux dejjem jaħdmu tajjeb meta jittrattaw għadd kbir ta’ inserzjonijiet (Rakkomandazzjonijiet ta' Postgres). Biex tagħmel dan, Logger jikteb avvenimenti deħlin f'fajl u f'goroutine separata (ħajta) Il-qarrej tal-fajl jaqra l-fajl, imbagħad id-dejta tiġi kkonvertita u determinata. Wara li l-maniġer tal-Tabella jiżgura li l-iskema tat-tabella hija aġġornata, id-dejta tinkiteb fid-database f'lott wieħed. Sussegwentement, żidna l-abbiltà li tikteb id-dejta direttament fid-database, iżda nużaw din il-modalità għal avvenimenti li mhumiex numerużi - pereżempju, konverżjonijiet.

Open Source u pjanijiet għall-futur

F'xi punt, is-servizz beda jidher qisu prodott sħiħ u ddeċidejna li nirħilsu lil Open Source. Bħalissa, ġew implimentati l-integrazzjonijiet ma' Postgres, ClickHouse, BigQuery, Redshift, S3, Snowflake. L-integrazzjonijiet kollha jappoġġjaw kemm il-modi tal-lott kif ukoll l-istreaming tat-tagħbija tad-dejta. Appoġġ miżjud għal talbiet permezz tal-API.

L-iskema ta' integrazzjoni attwali tidher bħal din:

L-istorja tas-sors miftuħ tagħna: kif għamilna servizz analitiku f'Go u għamilna disponibbli pubblikament

Għalkemm is-servizz jista 'jintuża b'mod indipendenti (per eżempju bl-użu ta' Docker), għandna wkoll verżjoni ospitata, li fiha tista' twaqqaf integrazzjoni ma' maħżen tad-dejta, żid CNAME mad-dominju tiegħek u tara l-istatistika dwar in-numru ta' avvenimenti. Il-pjanijiet immedjati tagħna huma li nżidu l-abbiltà li nġabru mhux biss statistika minn riżors tal-web, iżda wkoll dejta minn sorsi ta 'dejta esterni u ssalvahom fi kwalunkwe ħażna tal-għażla tiegħek!

→ GitHub
→ Dokumentazzjoni
→ Slack

Inkunu ferħanin jekk EventNative jgħin biex issolvi l-problemi tiegħek!

Utenti reġistrati biss jistgħu jipparteċipaw fl-istħarriġ. Idħol, ta 'xejn.

Liema sistema ta' ġbir ta' statistika tintuża fil-kumpanija tiegħek?

  • 48,0%Google Analytics12

  • 4,0%Segment1

  • 16,0%Ie[or (ikteb fil-kummenti)4

  • 32,0%Implimenta s-servizz tiegħek8

Ivvutaw 25 utent. 6 utenti astjenew.

Sors: www.habr.com

Żid kumment