Historia fontis nostri aperti: quomodo analytica opera fecimus in Go et in promptu publice fecimus?

Nunc, fere omnis societas in mundo colligit statisticam de actionibus usoris in ope interretiali. Motus patet - societates scire cupiunt quomodo eorum producti/wesite adhibetur et melius eorum utentes intellegit. Nimirum in foro instrumenta multa sunt ad solvendam hanc quaestionem - e systematibus analyticis quae in forma ashboardorum et graphorum notitias praebent (exem. gr. Google Analytics) ad Rostra Customer Data, quae ex diversis fontibus in quibusvis horreis (exem. gr. Pars).

Sed invenimus quaestionem nondum solutam. Ita natus est EventNative β€” aperta opera analytica. Lege quare decrevimus nostrum proprium obsequium evolvere, quid nobis dare, et quid exitus esset (cum fragmentis codicis).

Historia fontis nostri aperti: quomodo analytica opera fecimus in Go et in promptu publice fecimus?

Cur nostrum servitium excolere debemus?

Nonaginta, quantum potuimus, supervivimus. MMXIX, API Primum Customer Data rostris elaboravimus kSensequae effecit ut notitias ex diversis fontibus aggregaret (Facebook ads, Stripe, Salesforce Google fabula, Google Analytica, etc.) pro commodius analysi analysi, clientelas cognoscendi, etc. Animadvertimus multos users utentes suggestu nostro pro analysi analytica specie Google Analyticorum (infra GA). Locuti sumus cum aliquibus usoribus et invenimus nos egent notitias analyticas pro suo producto ut GA accipiant, sed Google exemplaria data et pro multis, GA Interface User commoditatis norma non est. Colloquia satis habuimus cum usoribus nostris et intelleximus multos etiam suggestu Segmento utentes (quod obiter ante alteram diem erat. vendidit pro $ 3.2 sescenti).

Segmentum pixel html struxerunt in opibus interretialibus et notitia de moribus utentium utentium in datorum definitorum (exempli gratia Postgres). Sed Segmentum etiam downside habet - pretium. Exempli gratia, si subsidii telae 90,000 MTU (menses investigati utentes), debes 1,000 $ per mensem fisco solvere. Tertia quaestio etiam fuit - tractus quidam navigatri (ut AdBlock) collectionem analyticorum obstruxit, quia... http petitiones ex pasco missae sunt ad GA et Segmentum ditiones. Ex voluntate clientium nostrorum, ministerium analyticum creavimus, quod plenam notitiarum copiam colligit (sine sampling), liberum est et in infrastructura nostra operari potest.

Quomodo opera opera

Ministerium ex tribus partibus consistit: pixel html (quam postea in typographo rescripsimus), pars server in lingua GO impletur et institutum est ut Redshift et BigQuery uti database in domo instrumenti (postea subsidium addiderunt pro Postgres, ClickHouse et Snowflake).

Placuit structuram GA et Segmentum immutata eventus relinquere. Omnia quae opus erant duplicare debebant ex subsidiis interretialibus ubi pixel ad tergum nostrum instituitur. Hoc ut evenit, non difficile est. Pixela Javascript praeripuit methodum bibliothecae originalis GA cum nova una quae eventum in systemate nostro duplicavit.

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

Segmento pixel omnia simpliciora sunt, medias rationes habet, quarum una utebamur.


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

Certe praeter describendi facultatem nos adiecimus mittendi arbitra- jsonem;


//ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° событий с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ 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'
});

Deinceps de parte ministri fama. Backendula petitiones http accipere debet, eas cum informationis replere, exempli gratia, datas geo (gratias) maxmind pro hoc) et recita in datorum. Ministerium quam maxime opportunum facere voluimus ut cum minima configuratione adhiberi possit. Insecuti sumus functionality determinandi schema data secundum structuram eventus advenientis. Data genera valores definiuntur. Res nidificant resolutis et in plana structura reducuntur;

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

Autem, vestit nunc simpliciter convertuntur ad chordas quia Non omnes databases relativi agros repetitos sustinent. Possibile est etiam nomina campi mutare vel ea delere utentes ad libitum destinata praecepta. Permittunt tibi schema data mutare, si opus est vel unum genus in aliud emittere. Exempli gratia, si json ager filum cum indicatione temporis contineat (field_3_sub_field_1_sub_sub_field_1 ab exemplo supra), tum ut campum in datorum signo cum indicatione temporis crearet, regulam destinatam in configuratione scribere debes. Aliis verbis, notitia generis agri primo valore json determinatur, et deinde ratio regulae (si figuratur) applicatur. Notae notae 4 principales notae sunt: ​​NERVUS, FLOAT64, INT64 et TIMESTAMP. Tabulae mapping et speciei praecepta mittentes sic spectant:

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

Algorithmus ad determinandum genus notitiae:

  • conversus json structuram ad plana structuram
  • ad determinandum genus notitia ex agris values
  • applicare mapping et generis mittentes praecepta

Inde advenientis json compages ;

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

schema de notitia habebitur;

"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

Nos etiam putavimus utentis usoris notitias in datorum partiendis vel dividendis configurare posse secundum alias normas et facultatem efficiendi ut nomen mensae constanti vel expressio in schemate. In exemplo infra, eventus salvus erit ad mensam cum nomine computato secundum valores agri product_type et _timestamp (exempli gratia supplies_2020_10):

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

Sed structura advenientium eventuum mutare potest tempore runtime. Algorithmum insecuti sumus ad differentiam reprimendam inter structuram mensae exsistentis et structuram eventus advenientis. Si differentia inveniatur, mensa novis agris renovabitur. Ad hoc faciendum, interrogationi SQL commissura utere:

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

Architecture

Historia fontis nostri aperti: quomodo analytica opera fecimus in Go et in promptu publice fecimus?

Cur necesse est res tabellae rationi scribere, et non tantum directe datorum scribere? Database non semper bene faciunt cum de magnis interiectis numeris (Postgres suasiones). Ad hoc Facere, Logger eventus ad limam scribit ineuntes et in separato goroutine (thread) fasciculus lector tabellam legit, notitia convertitur et determinatur. Post Mensam procurator certos facit schema mensae hodiernum esse, notitia in una massa scribenda datorum. Postea facultatem addimus facultatem scribendi data directe datorum, sed hoc modo utimur pro eventibus non numerosis, verbi gratia, conversionibus.

Patefacio fons et consilia in posterum

Aliquando, servitium coepit spectare quasi productum plenae emissarium et placuit eam aperire Source. In statu, integrationes cum Postgres, ClickHouse, BigQuery, Redshift, S3, Snowflake adimpletae sunt. All integrations support both batch and streaming modos of data loading. Adiecta subsidia petitionum per API.

Ratio integrationis hodiernae hoc modo spectat:

Historia fontis nostri aperti: quomodo analytica opera fecimus in Go et in promptu publice fecimus?

Etsi servitium independenter adhiberi potest (exempli gratia Docker utens), nos etiam habemus hosted version, in qua cum notitia horreis integrationem constituere potes, CNAME ad tuum regnum adde et in numero eventuum statistica visum. Consilia immediata nostra consilia facultates aggregare debent non solum statistica ex ope interreti, sed etiam notitias ex fontibus extraneis datas, easque ad quascumque electionis tuae repono conservandas!

β†’ GitHub
β†’ Π”окумСнтация
β†’ et dissolutus est

Laetamur si EventNative auxilia problemata tua solve!

Tantum usores descripserunt in aliquet participare possunt. InscribeTe gratissimum esse.

Quid systema statistica collectio in tuo comitatu adhibetur?

  • 48,0%Google Analytics12

  • 4,0%Segment1

  • 16,0%Alius (scribere in comment) 4

  • 32,0%Impleri tuum service8

25 utentes censuerunt. 6 Utentes abstinuerunt.

Source: www.habr.com