Gaur egun, munduko ia enpresa guztiek erabiltzaileen ekintzei buruzko estatistikak biltzen dituzte web baliabide batean. Motibazioa argia da: enpresek euren produktua/webgunea nola erabiltzen den jakin nahi dute eta erabiltzaileak hobeto ulertu. Jakina, arazo hau konpontzeko tresna ugari daude merkatuan: aginte-panel eta grafiko moduan datuak ematen dituzten analisi-sistemetatik (adibidez.
Baina oraindik konpondu ez den arazo bat aurkitu dugu. Beraz, jaioa
Zergatik garatu behar dugu gure zerbitzua?
Laurogeita hamarreko hamarkada zen, ahal genuen bezala bizirik atera ginen. 2019an, First Customer Data Platform APIa garatu genuen kSense, zeinak iturri ezberdinetako datuak (Facebook iragarkiak, Stripe, Salesforce, Google play, Google Analytics, etab.) batu ahal izateko, datuen azterketa erosoagoa izan dadin, mendekotasunak identifikatu eta abar. Erabiltzaile askok gure datu analitiko plataforma erabiltzen dutela ohartu gara, zehazki Google Analytics (aurrerantzean GA deitzen dena). Erabiltzaile batzuekin hitz egin dugu eta jakin dugu produktuen analisi-datuak behar dituztela, GA erabiliz jasotzen dituztenak, baina
Segment javascript pixel bat instalatu zuten beren web baliabidean eta erabiltzailearen portaeraren datuak datu-base zehatz batean kargatu ziren (adibidez, Postgres). Baina Segmentuak ere badu bere alde txarra: prezioa. Esate baterako, web-baliabide batek 90,000 MTU baditu (hilabeteko erabiltzaileen jarraipena), orduan ~ $ 1,000 ordaindu behar dizkiozu hilero kutxazainari. Hirugarren arazo bat ere egon zen: arakatzaileen luzapen batzuek (adibidez, AdBlock) analisien bilduma blokeatu zuten. Arakatzailearen http eskaerak GA eta Segment domeinuetara bidali ziren. Gure bezeroen nahian oinarrituta, datu-multzo osoa (laginketarik gabe) biltzen duen analitika-zerbitzu bat sortu dugu, doan eta gure azpiegituran lan egin dezakeena.
Zerbitzuak nola funtzionatzen duen
Zerbitzuak hiru zati ditu: javascript pixel bat (gero mekanografian berridatzi genuena), GO hizkuntzan inplementatutako zerbitzari zati bat, eta Redshift eta BigQuery barneko datu-base gisa erabiltzea aurreikusi zen (gero Postgres-erako laguntza gehitu zuten. , ClickHouse eta Snowflake).
GA eta Segment ekitaldien egitura aldatu gabe uztea erabaki zuten. Beharrezkoa zen pixela instalatuta dagoen web-baliabidetik gertaera guztiak gure backendera bikoiztea. Bihurtzen denez, hau egitea erraza da. Javascript pixelak jatorrizko GA liburutegiaren metodoa gainidatzi zuen gure sisteman gertaera bikoiztu zuen berri batekin.
//'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);
});
});
}
Segment pixelarekin dena sinpleagoa da, middleware metodoak ditu eta horietako bat erabili dugu.
//'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.');
}
Gertaerak kopiatzeaz gain, json arbitrarioa bidaltzeko gaitasuna gehitu dugu:
//ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΠΎΠ±ΡΡΠΈΠΉ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ 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'
});
Jarraian, hitz egin dezagun zerbitzariari buruz. Backend-ek http eskaerak onartu beharko lituzke, informazio gehigarriz bete, adibidez, geodatuak (eskerrik asko
//Π²Ρ
ΠΎΠ΄ΡΡΠΈΠΉ 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"
}
Hala ere, gaur egun matrizeak kate bihurtzen dira. datu-base erlazional guztiek ez dituzte eremu errepikatuak onartzen. Eremu izenak aldatzea edo kentzea ere posible da aukerako mapa-arauak erabiliz. Datu-eskema aldatzeko aukera ematen dute, behar izanez gero, edo datu-mota bat beste batera igortzeko. Adibidez, json eremuak denbora-zigilua duen kate bat badu (eremua_3_azpi_eremua_1_azpi_eremua_1 goiko adibidetik), orduan datu-basean denbora-zigilu motako eremu bat sortzeko, konfigurazioan mapa-arau bat idatzi behar duzu. Beste era batera esanda, eremuaren datu-mota json balioaren arabera zehazten da lehenik, eta, ondoren, motaren casting-araua (konfiguratuta badago) aplikatzen da. 4 datu mota nagusi identifikatu ditugu: STRING, FLOAT64, INT64 eta TIMESTAMP. Mapeatzeko eta igortzeko arauak honelakoak dira:
rules:
- "/field_1/subfield_1 -> " #ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ»Ρ
- "/field_2/subfield_1 -> /field_10/subfield_1" #ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ° ΠΏΠΎΠ»Ρ
- "/field_3/subfield_1/subsubfield_1 -> (timestamp) /field_20" #ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ° ΠΏΠΎΠ»Ρ ΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠΈΠΏΠ°
Datu mota zehazteko algoritmoa:
- bihurtu json struct egitura laua
- eremuen datu mota balioen bidez zehaztea
- mapaketa- eta mota-galdaketa-arauak aplikatuz
Ondoren, sarrerako json egituratik:
{
"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"
}
}
datu-eskema lortuko da:
"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
Erabiltzaileak datu-basean beste irizpide batzuen arabera partizioak edo zatiketak konfiguratzeko gai izan behar zuela ere pentsatu genuen eta taularen izena konstante edo konstante gisa ezartzeko gaitasuna ezarri genuen.
tableName: '{{.product_type}}_{{._timestamp.Format "2006_01"}}'
Hala ere, sarrerako gertaeren egitura alda daiteke exekuzioan. Lehendik dagoen taula baten egituraren eta sarrerako gertaera baten egituraren arteko aldea egiaztatzeko algoritmo bat ezarri dugu. Alderik aurkitzen bada, taula eremu berriekin eguneratuko da. Horretarako, erabili adabaki SQL kontsulta:
#ΠΡΠΈΠΌΠ΅Ρ Π΄Π»Ρ Postgres
ALTER TABLE "schema"."table" ADD COLUMN new_column character varying
arkitektura
Zergatik idatzi behar dituzu gertaerak fitxategi-sisteman, eta ez zuzenean datu-basean idatzi? Datu-baseek ez dute beti errendimendu altua erakusten txertaketa kopuru handiarekin (
Kode irekia eta etorkizuneko planak
Noizbait, zerbitzua erabateko produktu bat bezala bihurtu zen eta Open Sourcen jartzea erabaki genuen. Momentuz, Postgres, ClickHouse, BigQuery, Redshift, S3, Snowflake-ekin integrazioak ezarri dira. Integrazio guztiek batch eta streaming datuak kargatzeko moduak onartzen dituzte. API bidezko eskaeretarako laguntza gehitu da.
Egungo integrazio-eskemak honela dauka:
Zerbitzua modu independentean erabil daitekeen arren (adibidez, Docker erabiliz), badugu ere
β
β
β
Pozik egongo gara EventNativek zure arazoak konpontzen lagunduko badizu!
Erregistratutako erabiltzaileek soilik parte hartu dezakete inkestan.
Zein estatistikak biltzeko sistema erabiltzen den zure enpresan
-
48,0%Google Analytics12
-
4,0%Segmentua 1
-
16,0%Beste batzuk (idatzi iruzkinetan) 4
-
32,0%Zure zerbitzua ezarri duzu8
25 erabiltzailek eman dute botoa. 6 erabiltzaile abstenitu ziren.
Iturria: www.habr.com