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
Imma sibna problema li għadha ma ġietx solvuta. Hekk twieled
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
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
//входящий 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
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
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 (
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:
Għalkemm is-servizz jista 'jintuża b'mod indipendenti (per eżempju bl-użu ta' Docker), għandna wkoll
→
→
→
Inkunu ferħanin jekk EventNative jgħin biex issolvi l-problemi tiegħek!
Utenti reġistrati biss jistgħu jipparteċipaw fl-istħarriġ.
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