PaÅ”laik gandrÄ«z katrs uzÅÄmums pasaulÄ apkopo statistiku par lietotÄja darbÄ«bÄm tÄ«mekļa resursÄ. MotivÄcija ir skaidra ā uzÅÄmumi vÄlas uzzinÄt, kÄ tiek izmantots viÅu produkts/vietne, un labÄk izprast savus lietotÄjus. Protams, tirgÅ« ir pieejams liels skaits rÄ«ku Ŕīs problÄmas risinÄÅ”anai ā no analÄ«tikas sistÄmÄm, kas nodroÅ”ina datus informÄcijas paneļu un grafiku veidÄ (piemÄram, ) uz klientu datu platformu, kas ļauj vÄkt un apkopot datus no dažÄdiem avotiem jebkurÄ noliktavÄ (piemÄram, ).
Bet mÄs atradÄm problÄmu, kas vÄl nav atrisinÄta. TÄ piedzima ā atvÄrtÄ koda analÄ«zes pakalpojums. Lasiet par to, kÄpÄc mÄs nolÄmÄm izstrÄdÄt savu pakalpojumu, ko tas mums sniedza un kÄds bija gala rezultÄts (ar koda daļÄm).
KÄpÄc mums paÅ”iem jÄattÄ«sta savs pakalpojums?
Bija deviÅdesmitie gadi, mÄs izdzÄ«vojÄm, kÄ varÄjÄm. 2019. gadÄ mÄs izstrÄdÄjÄm API First Customer Data Platform kSense, kas ļÄva apkopot datus no dažÄdiem avotiem (Facebook reklÄmas, Stripe, Salesforce, Google play, Google Analytics u.c.) ÄrtÄkai datu analÄ«zei, atkarÄ«bu noteikÅ”anai utt. Esam ievÄrojuÅ”i, ka daudzi lietotÄji izmanto mÅ«su platformu datu analÄ«zei, Ä«paÅ”i Google Analytics (turpmÄk GA). MÄs runÄjÄm ar dažiem lietotÄjiem un noskaidrojÄm, ka viÅiem ir nepiecieÅ”ami sava produkta analÄ«tikas dati, ko viÅi saÅem, izmantojot GA, taÄu un daudziem GA lietotÄja interfeiss nav ÄrtÄ«bas standarts. Mums bija pietiekami daudz sarunu ar saviem lietotÄjiem un sapratÄm, ka daudzi arÄ« izmantoja segmentu platformu (kas, starp citu, bija tikai citu dienu ).
ViÅi savÄ tÄ«mekļa resursÄ instalÄja segmenta javascript pikseļu, un dati par lietotÄju uzvedÄ«bu tika ielÄdÄti norÄdÄ«tajÄ datu bÄzÄ (piemÄram, Postgres). TaÄu Segmentam ir arÄ« savs mÄ«nuss ā cena. PiemÄram, ja tÄ«mekļa resursam ir 90,000 1,000 MTU (ikmÄneÅ”a izsekotie lietotÄji), tad kasierim ir jÄmaksÄ ~XNUMX USD mÄnesÄ«. Bija arÄ« treÅ”Ä problÄma ā daži pÄrlÅ«kprogrammas paplaÅ”inÄjumi (piemÄram, AdBlock) bloÄ·Äja analÄ«tikas apkopoÅ”anu, jo... http pieprasÄ«jumi no pÄrlÅ«kprogrammas tika nosÅ«tÄ«ti uz GA un Segment domÄniem. Pamatojoties uz mÅ«su klientu vÄlmÄm, esam izveidojuÅ”i analÄ«tikas pakalpojumu, kas savÄc pilnu datu kopumu (bez paraugu ÅemÅ”anas), ir bezmaksas un var darboties savÄ infrastruktÅ«rÄ.
KÄ pakalpojums darbojas
Pakalpojums sastÄv no trim daļÄm: javascript pikseļa (kuru vÄlÄk pÄrrakstÄ«jÄm maŔīnrakstÄ), servera daļa ir realizÄta GO valodÄ, kÄ arÄ« bija plÄnots izmantot Redshift un BigQuery kÄ iekÅ”Äjo datu bÄzi (vÄlÄk pievienoja atbalstu Postgres, ClickHouse un Snowflake).
Tika nolemts GA un segmentu notikumu struktÅ«ru atstÄt nemainÄ«gu. Viss, kas bija nepiecieÅ”ams, bija dublÄt visus notikumus no tÄ«mekļa resursa, kurÄ pikselis ir instalÄts, uz mÅ«su aizmugursistÄmu. KÄ izrÄdÄs, to nav grÅ«ti izdarÄ«t. Javascript pikselis ignorÄja sÄkotnÄjo GA bibliotÄkas metodi ar jaunu, kas dublÄja notikumu mÅ«su sistÄmÄ.
//'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);
});
});
}
Ar Segment pikseļu viss ir vienkÄrÅ”Äk; tam ir starpprogrammatÅ«ras metodes, no kurÄm vienu mÄs izmantojÄm.
//'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.');
}
Papildus notikumu kopÄÅ”anai esam pievienojuÅ”i iespÄju nosÅ«tÄ«t patvaļīgu JSON:
//ŠŃŠæŃŠ°Š²ŠŗŠ° ŃŠ¾Š±ŃŃŠøŠ¹ Ń ŠæŃŠ¾ŠøŠ·Š²Š¾Š»ŃŠ½ŃŠ¼ 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'
});
TÄlÄk parunÄsim par servera daļu. AizmugursistÄmai vajadzÄtu pieÅemt http pieprasÄ«jumus, aizpildÄ«t tos ar papildu informÄciju, piemÄram, Ä£eogrÄfiskajiem datiem (paldies Å”im) un ierakstiet to datu bÄzÄ. MÄs vÄlÄjÄmies pakalpojumu padarÄ«t pÄc iespÄjas ÄrtÄku, lai to varÄtu izmantot ar minimÄlu konfigurÄciju. MÄs esam ieviesuÅ”i datu shÄmas noteikÅ”anas funkcionalitÄti, pamatojoties uz ienÄkoÅ”Ä JSON notikuma struktÅ«ru. Datu tipus nosaka vÄrtÄ«bas. Ligzdotie objekti tiek sadalÄ«ti un samazinÄti lÄ«dz plakanai struktÅ«rai:
//вŃ
оГŃŃŠøŠ¹ 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"
}TomÄr paÅ”laik masÄ«vi tiek vienkÄrÅ”i pÄrveidoti par virknÄm, jo Ne visas relÄciju datu bÄzes atbalsta atkÄrtotus laukus. Ir iespÄjams arÄ« mainÄ«t lauku nosaukumus vai dzÄst tos, izmantojot izvÄles kartÄÅ”anas noteikumus. Tie ļauj mainÄ«t datu shÄmu, ja nepiecieÅ”ams, vai pÄrveidot vienu datu tipu citÄ. PiemÄram, ja json laukÄ ir virkne ar laikspiedolu (field_3_sub_field_1_sub_sub_field_1 no iepriekÅ” minÄtÄ piemÄra), tad, lai datu bÄzÄ izveidotu lauku ar laikspiedola veidu, konfigurÄcijÄ ir jÄieraksta kartÄÅ”anas kÄrtula. Citiem vÄrdiem sakot, lauka datu tipu vispirms nosaka json vÄrtÄ«ba, un pÄc tam tiek lietots tipa apraides kÄrtula (ja tÄ ir konfigurÄta). MÄs esam identificÄjuÅ”i 4 galvenos datu tipus: STRING, FLOAT64, INT64 un TIMESTAMP. KartÄÅ”anas un veidu izdalīŔanas noteikumi izskatÄs Å”Ädi:
rules:
- "/field_1/subfield_1 -> " #ŠæŃŠ°Š²ŠøŠ»Š¾ ŃŠ“Š°Š»ŠµŠ½ŠøŃ ŠæŠ¾Š»Ń
- "/field_2/subfield_1 -> /field_10/subfield_1" #ŠæŃŠ°Š²ŠøŠ»Š¾ ŠæŠµŃŠµŠ½Š¾Ńа полŃ
- "/field_3/subfield_1/subsubfield_1 -> (timestamp) /field_20" #ŠæŃŠ°Š²ŠøŠ»Š¾ ŠæŠµŃŠµŠ½Š¾Ńа ŠæŠ¾Š»Ń Šø ŠæŃŠøŠ²ŠµŠ“ŠµŠ½ŠøŃ ŃŠøŠæŠ°
Algoritms datu veida noteikŔanai:
- pÄrveidot json struktÅ«ru plakanÄ struktÅ«rÄ
- lauku datu tipa noteikÅ”ana pÄc vÄrtÄ«bÄm
- piemÄrojot kartÄÅ”anas un tipu lieÅ”anas noteikumus
PÄc tam no ienÄkoÅ”Äs JSON struktÅ«ras:
{
"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"
}
}
tiks iegÅ«ta datu shÄma:
"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
MÄs arÄ« domÄjÄm, ka lietotÄjam jÄspÄj konfigurÄt sadalīŔanu vai sadalÄ«t datus datu bÄzÄ pÄc citiem kritÄrijiem un ieviesÄm iespÄju iestatÄ«t tabulas nosaukumu ar konstantu vai konfigurÄcijÄ. TÄlÄk esoÅ”ajÄ piemÄrÄ notikums tiks saglabÄts tabulÄ ar nosaukumu, kas aprÄÄ·inÄts, pamatojoties uz lauku product_type un _timestamp vÄrtÄ«bÄm (piemÄram, piegÄdes_2020_10):
tableName: '{{.product_type}}_{{._timestamp.Format "2006_01"}}'
TomÄr ienÄkoÅ”o notikumu struktÅ«ra izpildes laikÄ var mainÄ«ties. MÄs esam ieviesuÅ”i algoritmu, lai pÄrbaudÄ«tu atŔķirÄ«bu starp esoÅ”Äs tabulas struktÅ«ru un ienÄkoÅ”Ä notikuma struktÅ«ru. Ja tiek konstatÄta atŔķirÄ«ba, tabula tiks atjauninÄta ar jauniem laukiem. Lai to izdarÄ«tu, izmantojiet ielÄpa SQL vaicÄjumu:
#ŠŃŠøŠ¼ŠµŃ Š“Š»Ń Postgres
ALTER TABLE "schema"."table" ADD COLUMN new_column character varyingArhitektūra

KÄpÄc notikumi jÄraksta failu sistÄmÄ, nevis tikai tieÅ”Ä veidÄ datu bÄzÄ? Datu bÄzes ne vienmÄr darbojas labi, strÄdÄjot ar lielu skaitu ieliktÅu (). Lai to izdarÄ«tu, Logger ieraksta ienÄkoÅ”os notikumus failÄ un atseviÅ”Ä·Ä gorutÄ«nÄ (pavedienÄ) Failu lasÄ«tÄjs nolasa failu, pÄc tam tiek konvertÄti un noteikti dati. Kad tabulu pÄrvaldnieks ir pÄrliecinÄjies, ka tabulas shÄma ir atjauninÄta, dati tiks ierakstÄ«ti datu bÄzÄ vienÄ partijÄ. PÄc tam mÄs pievienojÄm iespÄju rakstÄ«t datus tieÅ”i datu bÄzÄ, bet mÄs izmantojam Å”o režīmu notikumiem, kuru skaits nav liels, piemÄram, reklÄmguvumiem.
Open Source un nÄkotnes plÄni
KÄdÄ brÄ«dÄ« pakalpojums sÄka izskatÄ«ties kÄ pilnvÄrtÄ«gs produkts, un mÄs nolÄmÄm to izlaist atvÄrtÄ koda versijÄ. Å obrÄ«d ir ieviestas integrÄcijas ar Postgres, ClickHouse, BigQuery, Redshift, S3, Snowflake. Visas integrÄcijas atbalsta gan pakeÅ”u, gan straumÄÅ”anas datu ielÄdes režīmus. Pievienots atbalsts pieprasÄ«jumiem, izmantojot API.
PaÅ”reizÄjÄ integrÄcijas shÄma izskatÄs Å”Ädi:

Lai gan pakalpojumu var izmantot neatkarÄ«gi (piemÄram, izmantojot Docker), arÄ« mums ir , kurÄ varat iestatÄ«t integrÄciju ar datu noliktavu, pievienot savam domÄnam CNAME un skatÄ«t statistiku par notikumu skaitu. MÅ«su tuvÄkie plÄni ir pievienot iespÄju apkopot ne tikai statistiku no tÄ«mekļa resursiem, bet arÄ« datus no ÄrÄjiem datu avotiem un saglabÄt tos jebkurÄ jÅ«su izvÄlÄtÄ krÄtuvÄ!
ā
ā
ā
MÄs priecÄsimies, ja EventNative palÄ«dzÄs atrisinÄt jÅ«su problÄmas!
AptaujÄ var piedalÄ«ties tikai reÄ£istrÄti lietotÄji. , lÅ«dzu.
KÄda statistikas vÄkÅ”anas sistÄma tiek izmantota jÅ«su uzÅÄmumÄ?
48,0%Google Analytics12
4,0%Segments 1
16,0%VÄl viens (raksti komentÄros)4
32,0%Ieviesa jūsu pakalpojumu8
Nobalsoja 25 lietotÄji. 6 lietotÄji atturÄjÄs.
Avots: www.habr.com
