Ang kasaysayan sa among bukas nga tinubdan: kung giunsa namo paghimo ang serbisyo sa analytics sa Go ug gihimo kini nga magamit sa publiko

Sa pagkakaron, halos tanang kompaniya sa kalibotan nangolekta og mga estadistika bahin sa mga aksyon sa tiggamit sa usa ka kapanguhaan sa web. Klaro ang panukmod - gusto sa mga kompanya nga mahibal-an kung giunsa ang ilang produkto / website gigamit ug mas masabtan ang ilang mga tiggamit. Siyempre, adunay daghang mga himan sa merkado aron masulbad kini nga problema - gikan sa mga sistema sa analytics nga naghatag mga datos sa porma sa mga dashboard ug mga graph (pananglitan Google Analytics) ngadto sa Customer Data Platform, nga nagtugot kanimo sa pagkolekta ug pagtipon sa datos gikan sa lain-laing mga tinubdan sa bisan unsang storage (pananglitan, Segment).

Apan nakakita kami og problema nga wala pa masulbad. Busa natawo EventNative β€” open-source nga serbisyo sa analytics. Mahitungod sa nganong miadto kami sa pagpalambo sa among kaugalingong serbisyo, unsa ang gihatag niini kanamo ug unsa ang nahitabo sa katapusan (nga adunay mga piraso sa code), basaha ubos sa pagputol.

Ang kasaysayan sa among bukas nga tinubdan: kung giunsa namo paghimo ang serbisyo sa analytics sa Go ug gihimo kini nga magamit sa publiko

Nganong kinahanglan natong pauswagon ang atong kaugalingong serbisyo?

Nineties kadto, nakalahutay kami kutob sa among mahimo. 2019, among gihimo ang First Customer Data Platform API kSense, nga nagtugot sa pagtipon sa datos gikan sa lain-laing mga tinubdan (Facebook ads, Stripe, Salesforce, Google play, Google Analytics, ug uban pa) alang sa mas sayon ​​​​nga pagtuki sa datos, pag-ila sa mga dependency, ug uban pa. Namatikdan namo nga daghang tiggamit ang naggamit sa among data analytics platform, partikular ang Google Analytics (gitawag dinhi nga GA). Nakigsulti kami sa pipila ka mga tiggamit ug nahibal-an nga kinahanglan nila ang ilang data sa analytics sa produkto, nga ilang nadawat gamit ang GA, apan Mga sampol nga datos sa Google ug alang sa daghang GA User Interface dili usa ka sumbanan sa kasayon. Kami adunay igo nga mga panag-istoryahanay sa among mga tiggamit ug nakaamgo nga daghan usab ang migamit sa Segment nga plataporma (nga, sa ingon, pipila lang ka adlaw ang milabay gibaligya sa $3.2 bilyon).

Nag-instalar sila og Segment javascript pixel sa ilang web resource ug ang ilang data sa pamatasan sa tiggamit gikarga sa usa ka piho nga database (eg Postgres). Apan ang Segment usab adunay minus - ang presyo. Pananglitan, kung ang usa ka kapanguhaan sa web adunay 90,000 MTU (buwan nga gisubay nga mga tiggamit), nan kinahanglan nimo nga magbayad ~ $ 1,000 matag bulan sa cashier. Adunay usab usa ka ikatulo nga problema - pipila ka mga extension sa browser (sama sa AdBlock) gibabagan ang pagkolekta sa mga analytics. Ang mga hangyo sa http gikan sa browser gipadala sa mga domain sa GA ug Segment. Pinasukad sa gusto sa among mga kliyente, naghimo kami usa ka serbisyo sa pag-analisa nga nagkolekta usa ka kompleto nga set sa datos (nga wala’y sampling), nga wala’y bayad ug mahimong magamit sa among kaugalingon nga imprastraktura.

Giunsa ang serbisyo molihok

Ang serbisyo naglangkob sa tulo ka bahin: usa ka javascript pixel (nga sa ulahi among gisulat pag-usab sa typescript), usa ka bahin sa server nga gipatuman sa GO nga pinulongan, ug kini giplanohan nga gamiton ang Redshift ug BigQuery isip usa ka in-house nga database (sa ulahi ilang gidugang ang suporta alang sa Postgres , ClickHouse ug Snowflake).

Ang istruktura sa mga panghitabo nakahukom ang GA ug Segment nga dili mausab. Ang tanan nga gikinahanglan mao ang pagdoble sa tanan nga mga panghitabo gikan sa kapanguhaan sa web diin ang pixel gi-install sa among backend. Ingon nga kini nahimo, kini dali nga buhaton. Gi-override sa Javascript pixel ang orihinal nga pamaagi sa library sa GA gamit ang bag-o nga nagdoble sa panghitabo sa among sistema.

//'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);
        });
    });
}

Uban sa Segment pixel, ang tanan mas simple, kini adunay middleware nga mga pamaagi, ug among gigamit ang usa niini.


//'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.');
}

Dugang sa pagkopya sa mga panghitabo, gidugang namo ang abilidad sa pagpadala sa arbitraryong 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'
});

Sunod, maghisgot kita bahin sa bahin sa server. Ang backend kinahanglan nga modawat sa mga hangyo sa http, pun-on kini sa dugang nga impormasyon, pananglitan, geodata (salamat maxmind alang niini) ug pagsulat sa database. Gusto namon nga himuon nga kombenyente ang serbisyo kutob sa mahimo aron magamit kini nga adunay gamay nga pagsumpo. Among gipatuman ang gamit sa pagtino sa data schema base sa istruktura sa umaabot nga event json. Ang mga tipo sa datos gihubit pinaagi sa mga kantidad. Ang mga salag nga butang nadugta ug nahimong patag nga istruktura:

//входящий 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"
}

Bisan pa, ang mga array sa pagkakaron yano nga nakabig sa mga kuwerdas. dili tanang relational database nagsuporta sa balikbalik nga field. Posible usab nga usbon ang mga ngalan sa field o tangtangon kini gamit ang opsyonal nga mga lagda sa pagmapa. Gitugotan ka nila nga usbon ang eskema sa datos, kung kinahanglan, o ihulog ang usa ka tipo sa datos sa lain. Pananglitan, kung ang field sa json adunay sulud nga adunay usa ka timestamp (field_3_sub_field_1_sub_sub_field_1 gikan sa panig-ingnan sa ibabaw), unya aron makahimo usa ka uma sa database nga adunay tipo sa timestamp, kinahanglan nimo nga magsulat usa ka lagda sa mapping sa pagsumpo. Sa laing pagkasulti, ang tipo sa datos sa natad gitino una sa json nga kantidad, ug dayon ang tipo nga pagmando sa paghulma (kung gi-configure) gipadapat. Nailhan namo ang 4 ka nag-unang matang sa datos: STRING, FLOAT64, INT64 ug TIMESTAMP. Ang mga lagda sa mapping ug casting ingon niini:

rules:
  - "/field_1/subfield_1 -> " #ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ удалСния поля
  - "/field_2/subfield_1 -> /field_10/subfield_1" #ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ пСрСноса поля
  - "/field_3/subfield_1/subsubfield_1 -> (timestamp) /field_20" #ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ пСрСноса поля ΠΈ привСдСния Ρ‚ΠΈΠΏΠ°

Algorithm sa pagtino sa tipo sa datos:

  • i-convert ang json struct ngadto sa flat struct
  • pagtino sa tipo sa datos sa mga natad pinaagi sa mga kantidad
  • pagpadapat sa mapping ug type casting rules

Unya gikan sa umaabot nga istruktura sa json:

{
    "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"
    }
}

data schema makuha:

"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

Naghunahuna usab kami nga ang user kinahanglan nga makahimo sa pag-set up sa partitioning o split data sa database sumala sa ubang mga criteria ug gipatuman ang abilidad sa pagtakda sa ngalan sa lamesa isip usa ka kanunay o ekspresyon sa configuration. Sa pananglitan sa ubos, ang panghitabo ma-save sa usa ka lamesa nga adunay ngalan nga gikalkula base sa mga kantidad sa product_type ug _timestamp fields (pananglitan mga suplay_2020_10):

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

Bisan pa, ang istruktura sa umaabot nga mga panghitabo mahimong mabag-o sa oras sa pagdagan. Nagpatuman kami og usa ka algorithm alang sa pagsusi sa kalainan tali sa istruktura sa usa ka kasamtangan nga lamesa ug sa istruktura sa usa ka umaabot nga panghitabo. Kung adunay makit-an nga kalainan, ang lamesa ma-update sa bag-ong mga natad. Aron mahimo kini, gamita ang patch SQL query:

#ΠŸΡ€ΠΈΠΌΠ΅Ρ€ для Postgres
ALTER TABLE "schema"."table" ADD COLUMN new_column character varying

arkitektura

Ang kasaysayan sa among bukas nga tinubdan: kung giunsa namo paghimo ang serbisyo sa analytics sa Go ug gihimo kini nga magamit sa publiko

Ngano nga kinahanglan nimo nga isulat ang mga panghitabo sa file system, ug dili lang isulat kini direkta sa database? Ang mga database dili kanunay magpakita sa taas nga pasundayag nga adunay daghang gidaghanon sa mga pagsal-ot (mga rekomendasyon sa postgres). Aron mahimo kini, ang Logger nagsulat sa umaabot nga mga panghitabo sa usa ka file ug naa na sa usa ka separado nga goroutine (thread) Ang file reader nagbasa sa file, unya ang pagbag-o ug kahulugan sa data scheme mahitabo. Human masiguro sa manedyer sa lamesa nga ang eskema sa lamesa mao ang pinakabag-o, ang datos isulat sa database sa usa ka batch. Pagkahuman, gidugang namon ang abilidad sa pagsulat sa data direkta sa database, apan gigamit namon kini nga mode alang sa mga panghitabo nga dili daghan - pananglitan, mga pagkakabig.

Open Source ug mga plano sa umaabot

Sa usa ka punto, ang serbisyo nahimong sama sa usa ka hingpit nga produkto ug nakahukom kami nga ibutang kini sa Open Source. Sa pagkakaron, ang mga panagsama sa Postgres, ClickHouse, BigQuery, Redshift, S3, Snowflake gipatuman. Gisuportahan sa tanan nga mga panagsama ang mga mode sa pagkarga sa datos sa batch ug streaming. Gidugang nga suporta alang sa mga hangyo pinaagi sa API.

Ang kasamtangan nga laraw sa panagsama ingon niini:

Ang kasaysayan sa among bukas nga tinubdan: kung giunsa namo paghimo ang serbisyo sa analytics sa Go ug gihimo kini nga magamit sa publiko

Bisan kung ang serbisyo mahimong magamit nga independente (pananglitan, gamit ang Docker), aduna usab kami gi-host nga bersyon, diin mahimo nimong i-set up ang integrasyon sa data warehouse, makadugang ug CNAME sa imong domain, ug tan-awon ang estadistika sa gidaghanon sa mga panghitabo. Ang among hinanali nga mga plano mao ang pagdugang sa abilidad sa pagtipon dili lamang sa mga estadistika gikan sa usa ka kapanguhaan sa web, apan usab sa mga datos gikan sa gawas nga mga tinubdan sa datos ug i-save kini sa bisan unsang storage nga imong gusto!

β†’ GitHub
β†’ Π”окумСнтация
β†’ nga tapulan

Malipay kami kung ang EventNative makatabang kanimo sa pagsulbad sa imong mga problema!

Ang mga rehistradong tiggamit lamang ang makaapil sa survey. Sign in, walay sapayan.

Unsa nga sistema sa pagkolekta sa istatistika ang gigamit sa imong kompanya

  • 48,0%Google Analytics12

  • 4,0%Segment1

  • 16,0%Uban pa (isulat sa mga komento) 4

  • 32,0%Gipatuman ang imong serbisyo8

25 ka tiggamit ang nagboto. 6 ka tiggamit ang nag-abstain.

Source: www.habr.com

Idugang sa usa ka comment