Istwa sous louvri nou an: ki jan nou te fè yon sèvis analytics nan Go epi fè li disponib piblikman

Kounye a, prèske chak konpayi nan mond lan kolekte estatistik sou aksyon itilizatè sou yon resous entènèt. Motivasyon an klè - konpayi yo vle konnen ki jan pwodwi/sit entènèt yo itilize ak pi byen konprann itilizatè yo. Natirèlman, gen yon gwo kantite zouti sou mache a pou rezoud pwoblèm sa a - soti nan sistèm analytics ki bay done sou fòm tablodbò ak graf (pa egzanp Google Analytics) nan Platfòm Done Kliyan, ki pèmèt ou kolekte epi rasanble done ki soti nan diferan sous nan nenpòt depo (pa egzanp Segman).

Men, nou jwenn yon pwoblèm ki poko rezoud. Se konsa te fèt EventNative — sèvis analytik sous louvri. Li sou poukisa nou deside devlope pwòp sèvis nou an, sa li te ban nou, ak ki rezilta final la te (avèk moso kòd).

Istwa sous louvri nou an: ki jan nou te fè yon sèvis analytics nan Go epi fè li disponib piblikman

Poukisa nou ta dwe devlope pwòp sèvis nou an?

Se te ane 2019 yo, nou te siviv jan nou te kapab. XNUMX, nou devlope API First Customer Data Platform kSense, ki te fè li posib pou rasanble done ki soti nan diferan sous (Anons Facebook, Stripe, Salesforce, Google Play, Google Analytics, elatriye) pou analiz done ki pi pratik, idantifye depandans, elatriye. Nou remake ke anpil itilizatè sèvi ak platfòm nou an pou analiz done espesyalman Google Analytics (apwe sa GA). Nou te pale ak kèk itilizatè yo epi nou te dekouvri ke yo bezwen done analiz pou pwodwi yo ke yo resevwa lè l sèvi avèk GA, men Google echantiyon done epi pou anpil moun, koòdone itilizatè GA a se pa estanda konvenyans. Nou te gen ase konvèsasyon ak itilizatè nou yo e nou te reyalize ke anpil moun t ap itilize platfòm Segment la tou (ki, bò wout la, te jis lòt jou a. vann 3.2 milya dola).

Yo enstale yon piksèl JavaScript Segman sou resous entènèt yo ak done sou konpòtman itilizatè yo te chaje nan baz done a espesifye (pa egzanp Postgres). Men, Segman tou gen inconvénient li yo - pri a. Pou egzanp, si yon resous entènèt gen 90,000 MTU (itilizatè swiv chak mwa), Lè sa a, ou bezwen peye ~ 1,000 $ pa mwa kesye a. Te gen yon twazyèm pwoblèm tou - kèk ekstansyon navigatè (tankou AdBlock) bloke koleksyon an nan analiz paske ... Demann http nan navigatè a te voye bay domèn GA ak Segman. Dapre volonte kliyan nou yo, nou te kreye yon sèvis analytics ki kolekte yon seri done konplè (san yo pa pran echantiyon), se gratis epi yo ka travay sou pwòp enfrastrikti nou an.

Ki jan sèvis la ap travay

Sèvis la konsiste de twa pati: yon piksèl javascript (ki pita nou te reekri nan tape), pati sèvè a aplike nan lang GO a, epi li te planifye pou itilize Redshift ak BigQuery kòm yon baz done anndan kay la (pita yo te ajoute sipò pou Postgres, ClickHouse ak Snowflake).

Li te deside kite estrikti evènman GA ak Segman yo chanje. Tout sa ki te bezwen se te kopi tout evènman ki soti nan resous entènèt la kote pixel la enstale nan backend nou an. Kòm li vire soti, sa a se pa difisil fè. Piksèl Javascript la pase metòd orijinal bibliyotèk GA a ak yon nouvo, ki te double evènman an nan sistèm nou an.

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

Avèk pixel Segment la, tout bagay se pi senp; li gen metòd middleware, youn nan yo nou itilize.


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

Anplis kopye evènman yo, nou te ajoute kapasite pou voye json abitrè:


//Отправка событий с произвольным 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'
});

Apre sa, ann pale sou pati nan sèvè. Backend la ta dwe aksepte demann http, ranpli yo ak plis enfòmasyon, pou egzanp, done geo (mèsi maxmind pou sa) epi anrejistre li nan baz done a. Nou te vle fè sèvis la kòm pratik ke posib pou li ka itilize ak konfigirasyon minim. Nou te aplike fonksyonalite pou detèmine chema done ki baze sou estrikti evènman json k ap vini an. Kalite done yo defini pa valè. Objè nich yo dekonpoze epi redwi a yon estrikti plat:

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

Sepandan, etalaj yo kounye a tou senpleman konvèti nan fisèl paske Se pa tout baz done relasyon yo sipòte jaden repete. Li posib tou pou chanje non jaden oswa efase yo lè l sèvi avèk règ kat opsyonèl. Yo pèmèt ou chanje chema done a si sa nesesè oswa konvèti yon kalite done nan yon lòt. Pou egzanp, si yon jaden json gen yon fisèl ak timestamp (field_3_sub_field_1_sub_sub_field_1 soti nan egzanp ki anwo a), Lè sa a, yo nan lòd yo kreye yon jaden nan baz done a ak kalite a timestamp, ou bezwen ekri yon règ kat nan konfigirasyon an. Nan lòt mo, kalite done jaden an detèmine premye pa valè json, ak Lè sa a, règ la Distribisyon kalite (si configuré) aplike. Nou te idantifye 4 kalite done prensipal yo: STRING, FLOAT64, INT64 ak TIMESTAMP. Kat jeyografik ak kalite depoze règ yo sanble sa a:

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

Algorithm pou detèmine kalite done:

  • konvèti estrikti json nan estrikti plat
  • detèmine kalite done nan jaden pa valè
  • aplike kat jeyografik ak kalite depoze règ

Lè sa a, soti nan estrikti a json fèk ap rantre:

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

yo pral jwenn chema done yo:

"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

Nou menm tou nou te panse ke itilizatè a ta dwe kapab configured partitioning oswa divize done nan baz done a dapre lòt kritè ak aplike kapasite nan mete non tab la ak yon konstan oswa ekspresyon nan konfigirasyon an. Nan egzanp ki anba a, evènman an pral sove sou yon tab ak yon non kalkile ki baze sou valè pwodwi_type ak _timestamp jaden yo (pa egzanp founiti_2020_10):

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

Sepandan, estrikti evènman k ap fèk ap rantre yo ka chanje nan tan exécution. Nou te aplike yon algorithm tcheke diferans ki genyen ant estrikti a nan yon tab ki deja egziste ak estrikti a nan yon evènman fèk ap rantre. Si yo jwenn yon diferans, yo pral mete ajou tablo a ak nouvo jaden yo. Pou fè sa, sèvi ak rekèt SQL patch la:

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

achitekti

Istwa sous louvri nou an: ki jan nou te fè yon sèvis analytics nan Go epi fè li disponib piblikman

Poukisa ou bezwen ekri evènman yo nan sistèm dosye a, epi yo pa jis ekri yo dirèkteman nan baz done a? Baz done pa toujou fè byen lè yo fè fas ak gwo kantite foure (Rekòmandasyon Postgres). Pou fè sa, Logger ekri evènman fèk ap rantre nan yon dosye ak nan yon goroutine separe (fil) lektè File li dosye a, Lè sa a, done yo konvèti ak detèmine. Apre manadjè Table a asire w ke chema tab la ajou, done yo pral ekri nan baz done a nan yon sèl pakèt. Imedyatman, nou te ajoute kapasite nan ekri done dirèkteman nan baz done a, men nou itilize mòd sa a pou evènman ki pa anpil - pou egzanp, konvèsyon.

Open Source ak plan pou lavni

Nan kèk pwen, sèvis la te kòmanse sanble ak yon pwodwi konplè epi nou te deside lage li nan Open Source. Kounye a, entegrasyon ak Postgres, ClickHouse, BigQuery, Redshift, S3, Snowflake yo te aplike. Tout entegrasyon sipòte tou de mòd pakèt ak difizyon nan chaj done. Te ajoute sipò pou demann atravè API.

Konplo entegrasyon aktyèl la sanble sa a:

Istwa sous louvri nou an: ki jan nou te fè yon sèvis analytics nan Go epi fè li disponib piblikman

Malgre ke sèvis la ka itilize poukont (pa egzanp lè l sèvi avèk Docker), nou genyen tou hébergé vèsyon pipiti de youn, kote ou ka mete kanpe entegrasyon ak yon depo done, ajoute yon CNAME nan domèn ou epi wè estatistik sou kantite evènman yo. Plan imedya nou yo se ajoute kapasite nan total non sèlman estatistik ki soti nan yon resous entènèt, men tou done ki soti nan sous done ekstèn epi sove yo nan nenpòt depo ou chwazi!

→ GitHub
→ Dokimantasyon
→ Kanson

Nou pral kontan si EventNative ede rezoud pwoblèm ou yo!

Se sèlman itilizatè ki anrejistre ki ka patisipe nan sondaj la. Enskri, tanpri.

Ki sistèm koleksyon estatistik yo itilize nan konpayi ou a?

  • 48,0%Google Analytics12

  • 4,0%Segman 1

  • 16,0%Yon lòt (ekri nan kòmantè yo)4

  • 32,0%Aplike sèvis ou a 8

25 itilizatè yo te vote. 6 itilizatè te absteni.

Sous: www.habr.com

Add nouvo kòmantè