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
Men, nou jwenn yon pwoblèm ki poko rezoud. Se konsa te fèt
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
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
//входящий 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
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
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 (
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:
Malgre ke sèvis la ka itilize poukont (pa egzanp lè l sèvi avèk Docker), nou genyen tou
→
→
→
Nou pral kontan si EventNative ede rezoud pwoblèm ou yo!
Se sèlman itilizatè ki anrejistre ki ka patisipe nan sondaj la.
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