ہمارے اوپن سورس کی تاریخ: کس طرح ہم نے Go میں تجزیاتی سروس بنائی اور اسے عوامی طور پر دستیاب کیا۔

فی الحال، دنیا کی تقریباً ہر کمپنی ویب وسائل پر صارف کے اعمال کے بارے میں اعداد و شمار جمع کرتی ہے۔ محرک واضح ہے - کمپنیاں جاننا چاہتی ہیں کہ ان کی پروڈکٹ/ویب سائٹ کس طرح استعمال کی جاتی ہے اور اپنے صارفین کو بہتر طریقے سے سمجھنا چاہتی ہیں۔ یقیناً، اس مسئلے کو حل کرنے کے لیے مارکیٹ میں ٹولز کی ایک بڑی تعداد موجود ہے - تجزیاتی نظام سے جو ڈیش بورڈز اور گراف کی شکل میں ڈیٹا فراہم کرتے ہیں (مثال کے طور پر گوگل کے تجزیات) کسٹمر ڈیٹا پلیٹ فارم پر، جو آپ کو کسی بھی گودام میں مختلف ذرائع سے ڈیٹا اکٹھا کرنے اور جمع کرنے کی اجازت دیتا ہے (مثال کے طور پر قطعہ).

لیکن ہمیں ایک مسئلہ ملا جو ابھی تک حل نہیں ہوا ہے۔ یوں پیدا ہوا۔ EventNative - اوپن سورس اینالیٹکس سروس۔ اس بارے میں پڑھیں کہ ہم نے اپنی سروس تیار کرنے کا فیصلہ کیوں کیا، اس نے ہمیں کیا دیا، اور آخر نتیجہ کیا نکلا (کوڈ کے ٹکڑوں کے ساتھ)۔

ہمارے اوپن سورس کی تاریخ: کس طرح ہم نے Go میں تجزیاتی سروس بنائی اور اسے عوامی طور پر دستیاب کیا۔

ہمیں اپنی خدمت کیوں تیار کرنی چاہئے؟

یہ نوے کی دہائی تھی، ہم جتنا ممکن ہو سکے بچ گئے۔ 2019، ہم نے API پہلا کسٹمر ڈیٹا پلیٹ فارم تیار کیا۔ kSenseجس نے مختلف ذرائع سے ڈیٹا اکٹھا کرنا ممکن بنایا (فیس بک اشتہارات، اسٹرائپ، سیلز فورس، گوگل پلے، گوگل تجزیات، وغیرہ) مزید آسان ڈیٹا تجزیہ، انحصار کی شناخت وغیرہ کے لیے۔ ہم نے دیکھا ہے کہ بہت سے صارفین ڈیٹا کے تجزیہ کے لیے ہمارا پلیٹ فارم استعمال کرتے ہیں خاص طور پر Google Analytics (اس کے بعد GA)۔ ہم نے کچھ صارفین سے بات کی اور پتہ چلا کہ انہیں اپنے پروڈکٹ کے لیے تجزیاتی ڈیٹا کی ضرورت ہے جو وہ GA کے ذریعے حاصل کرتے ہیں، لیکن گوگل کے نمونے کا ڈیٹا اور بہت سے لوگوں کے لیے، GA یوزر انٹرفیس سہولت کا معیار نہیں ہے۔ ہم نے اپنے صارفین کے ساتھ کافی بات چیت کی اور محسوس کیا کہ بہت سے لوگ سیگمنٹ پلیٹ فارم بھی استعمال کر رہے ہیں (جو کہ ویسے، دوسرے دن ہی تھا 3.2 بلین ڈالر میں فروخت ہوا۔).

انہوں نے اپنے ویب وسائل پر سیگمنٹ جاوا اسکرپٹ پکسل انسٹال کیا اور ان کے صارفین کے رویے کے بارے میں ڈیٹا کو مخصوص ڈیٹا بیس میں لوڈ کیا گیا (مثال کے طور پر پوسٹگریس)۔ لیکن سیگمنٹ کا بھی منفی پہلو ہے - قیمت۔ مثال کے طور پر، اگر کسی ویب وسیلہ میں 90,000 MTU (ماہانہ ٹریک شدہ صارفین) ہیں، تو آپ کو کیشیئر کو ~1,000$ فی ماہ ادا کرنے کی ضرورت ہے۔ ایک تیسرا مسئلہ بھی تھا - کچھ براؤزر ایکسٹینشنز (جیسے AdBlock) نے تجزیات کا مجموعہ بلاک کر دیا کیونکہ... براؤزر سے HTTP درخواستیں GA اور Segment ڈومینز کو بھیجی گئیں۔ اپنے کلائنٹس کی خواہشات کی بنیاد پر، ہم نے ایک تجزیاتی سروس بنائی ہے جو ڈیٹا کا مکمل سیٹ جمع کرتی ہے (بغیر نمونے کے)، مفت ہے اور ہمارے اپنے بنیادی ڈھانچے پر کام کر سکتی ہے۔

سروس کیسے کام کرتی ہے۔

سروس تین حصوں پر مشتمل ہے: ایک جاوا اسکرپٹ پکسل (جسے ہم نے بعد میں ٹائپ اسکرپٹ میں دوبارہ لکھا)، سرور کا حصہ GO زبان میں لاگو کیا گیا ہے، اور اسے Redshift اور BigQuery کو اندرون خانہ ڈیٹا بیس کے طور پر استعمال کرنے کا منصوبہ بنایا گیا تھا۔ پوسٹگریس، کلک ہاؤس اور سنو فلیک)۔

GA اور سیگمنٹ ایونٹس کے ڈھانچے کو بغیر کسی تبدیلی کے چھوڑنے کا فیصلہ کیا گیا۔ بس اس کی ضرورت تھی ویب وسائل سے تمام ایونٹس کو نقل کرنا جہاں پکسل ہمارے بیک اینڈ پر انسٹال ہے۔ جیسا کہ یہ پتہ چلتا ہے، یہ کرنا مشکل نہیں ہے. جاوا اسکرپٹ پکسل نے اصل GA لائبریری طریقہ کو ایک نئے کے ساتھ اوور رائیڈ کر دیا، جس نے ہمارے سسٹم میں ایونٹ کو ڈپلیکیٹ کیا۔

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

سیگمنٹ پکسل کے ساتھ سب کچھ آسان ہے؛ اس میں مڈل ویئر کے طریقے ہیں، جن میں سے ایک ہم استعمال کرتے ہیں۔


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

واقعات کو کاپی کرنے کے علاوہ، ہم نے صوابدیدی 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'
});

اگلا، آئیے سرور کے حصے کے بارے میں بات کرتے ہیں۔ پسدید کو HTTP درخواستوں کو قبول کرنا چاہئے، انہیں اضافی معلومات سے بھرنا چاہئے، مثال کے طور پر، جیو ڈیٹا (شکریہ زیادہ سے زیادہ دماغ اس کے لیے) اور اسے ڈیٹا بیس میں ریکارڈ کریں۔ ہم سروس کو ہر ممکن حد تک آسان بنانا چاہتے تھے تاکہ اسے کم سے کم کنفیگریشن کے ساتھ استعمال کیا جا سکے۔ ہم نے آنے والے json ایونٹ کی ساخت کی بنیاد پر ڈیٹا اسکیما کا تعین کرنے کی فعالیت کو نافذ کیا ہے۔ ڈیٹا کی اقسام کی تعریف قدروں سے ہوتی ہے۔ گھریلو اشیاء گل جاتی ہیں اور ایک فلیٹ ڈھانچے میں کم ہوجاتی ہیں:

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

تاہم، arrays کو فی الحال صرف سٹرنگز میں تبدیل کر دیا گیا ہے کیونکہ تمام متعلقہ ڈیٹا بیس بار بار فیلڈز کی حمایت نہیں کرتے ہیں۔ میدان کے ناموں کو تبدیل کرنا یا اختیاری نقشہ سازی کے قواعد کا استعمال کرتے ہوئے انہیں حذف کرنا بھی ممکن ہے۔ وہ آپ کو ضرورت پڑنے پر ڈیٹا اسکیما کو تبدیل کرنے یا ایک ڈیٹا کی قسم کو دوسری میں تبدیل کرنے کی اجازت دیتے ہیں۔ مثال کے طور پر، اگر json فیلڈ میں ٹائم اسٹیمپ کے ساتھ ایک تار ہوتا ہے (فیلڈ_3_سب_فیلڈ_1_سب_سب_فیلڈ_1 اوپر کی مثال سے)، پھر ٹائم اسٹیمپ کی قسم کے ساتھ ڈیٹا بیس میں ایک فیلڈ بنانے کے لیے، آپ کو کنفیگریشن میں میپنگ رول لکھنا ہوگا۔ دوسرے الفاظ میں، فیلڈ کے ڈیٹا کی قسم کا تعین پہلے json ویلیو سے کیا جاتا ہے، اور پھر ٹائپ کاسٹنگ رول (اگر کنفیگر ہو) لاگو ہوتا ہے۔ ہم نے ڈیٹا کی 4 اہم اقسام کی نشاندہی کی ہے: STRING، FLOAT64، INT64 اور TIMESTAMP۔ نقشہ سازی اور ٹائپ کاسٹنگ کے قوانین اس طرح نظر آتے ہیں:

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

ڈیٹا کی قسم کا تعین کرنے کے لیے الگورتھم:

  • json ڈھانچے کو فلیٹ ڈھانچے میں تبدیل کریں۔
  • اقدار کے ذریعہ فیلڈز کے ڈیٹا کی قسم کا تعین کرنا
  • نقشہ سازی اور ٹائپ کاسٹنگ کے قوانین کا اطلاق کرنا

پھر آنے والے 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"
    }
}

ڈیٹا سکیما حاصل کیا جائے گا:

"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

ہم نے یہ بھی سوچا کہ صارف کو دوسرے معیارات کے مطابق ڈیٹا بیس میں تقسیم کاری یا ڈیٹا کو تقسیم کرنے کے قابل ہونا چاہیے اور ٹیبل کا نام مستقل یا مستقل کے ساتھ سیٹ کرنے کی صلاحیت کو نافذ کرنا چاہیے۔ اظہار ترتیب میں. نیچے دی گئی مثال میں، ایونٹ کو ایک ٹیبل میں محفوظ کیا جائے گا جس کا نام پروڈکٹ_ٹائپ اور _ٹائم اسٹیمپ فیلڈز کی قدروں کی بنیاد پر حساب کیا جائے گا (مثال کے طور پر سپلائیز_2020_10):

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

تاہم، آنے والے واقعات کا ڈھانچہ رن ٹائم پر تبدیل ہو سکتا ہے۔ ہم نے موجودہ ٹیبل کی ساخت اور آنے والے ایونٹ کی ساخت کے درمیان فرق کو جانچنے کے لیے ایک الگورتھم نافذ کیا ہے۔ اگر کوئی فرق پایا جاتا ہے تو، ٹیبل کو نئے فیلڈز کے ساتھ اپ ڈیٹ کیا جائے گا۔ ایسا کرنے کے لیے، پیچ SQL استفسار کا استعمال کریں:

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

فن تعمیر

ہمارے اوپن سورس کی تاریخ: کس طرح ہم نے Go میں تجزیاتی سروس بنائی اور اسے عوامی طور پر دستیاب کیا۔

آپ کو فائل سسٹم پر واقعات لکھنے کی ضرورت کیوں ہے، اور نہ صرف انہیں براہ راست ڈیٹا بیس پر لکھنا ہے؟ بڑی تعداد میں داخلوں سے نمٹنے کے دوران ڈیٹا بیس ہمیشہ اچھی کارکردگی کا مظاہرہ نہیں کرتے ہیں (پوسٹگریس کی سفارشات)۔ ایسا کرنے کے لیے، Logger آنے والے واقعات کو فائل میں لکھتا ہے اور ایک الگ گوروٹین (تھریڈ) میں فائل ریڈر فائل کو پڑھتا ہے، پھر ڈیٹا کو تبدیل کرکے طے کیا جاتا ہے۔ جب ٹیبل مینیجر اس بات کو یقینی بناتا ہے کہ ٹیبل اسکیما اپ ٹو ڈیٹ ہے، ڈیٹا کو ڈیٹا بیس میں ایک بیچ میں لکھا جائے گا۔ اس کے بعد، ہم نے ڈیٹا بیس میں براہ راست ڈیٹا لکھنے کی صلاحیت شامل کی، لیکن ہم اس موڈ کو ایسے واقعات کے لیے استعمال کرتے ہیں جو متعدد نہیں ہیں - مثال کے طور پر، تبدیلیاں۔

اوپن سورس اور مستقبل کے منصوبے

کسی وقت، سروس ایک مکمل پروڈکٹ کی طرح نظر آنے لگی اور ہم نے اسے اوپن سورس پر جاری کرنے کا فیصلہ کیا۔ فی الحال، Postgres، ClickHouse، BigQuery، Redshift، S3، Snowflake کے ساتھ انضمام کو نافذ کیا گیا ہے۔ تمام انضمام ڈیٹا لوڈنگ کے بیچ اور اسٹریمنگ دونوں طریقوں کی حمایت کرتے ہیں۔ API کے ذریعے درخواستوں کے لیے تعاون شامل کر دیا گیا۔

موجودہ انضمام اسکیم اس طرح نظر آتی ہے:

ہمارے اوپن سورس کی تاریخ: کس طرح ہم نے Go میں تجزیاتی سروس بنائی اور اسے عوامی طور پر دستیاب کیا۔

اگرچہ سروس کو آزادانہ طور پر استعمال کیا جاسکتا ہے (مثال کے طور پر ڈوکر کا استعمال کرتے ہوئے)، ہمارے پاس بھی ہے۔ میزبان ورژن، جس میں آپ ڈیٹا گودام کے ساتھ انضمام ترتیب دے سکتے ہیں، اپنے ڈومین میں ایک CNAME شامل کر سکتے ہیں اور واقعات کی تعداد کے اعدادوشمار دیکھ سکتے ہیں۔ ہمارے فوری منصوبے یہ ہیں کہ نہ صرف ویب وسائل سے اعداد و شمار کو جمع کرنے کی صلاحیت کو، بلکہ بیرونی ڈیٹا کے ذرائع سے ڈیٹا کو بھی شامل کریں اور انہیں اپنی پسند کے کسی بھی ذخیرہ میں محفوظ کریں!

→ GitHub کے
→ ریکارڈز
→ ناپختہ

اگر EventNative آپ کے مسائل کو حل کرنے میں مدد کرتا ہے تو ہمیں خوشی ہوگی!

سروے میں صرف رجسٹرڈ صارفین ہی حصہ لے سکتے ہیں۔ سائن ان، برائے مہربانی.

آپ کی کمپنی میں شماریات جمع کرنے کا کون سا نظام استعمال ہوتا ہے؟

  • 48,0٪گوگل تجزیات 12

  • 4,0٪سیگمنٹ 1

  • 16,0٪ایک اور (تبصرے میں لکھیں) 4

  • 32,0٪آپ کی خدمت کو نافذ کیا8

25 صارفین نے ووٹ دیا۔ 6 صارفین غیر حاضر رہے۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں