วัดผลการใช้งานข้อมูลในองค์กรด้วย Data Domain Usage Monitoring — Part 2

Burasakorn Sabyeying
CJ Express Tech (TILDI)
6 min read2 days ago

บทความนี้เป็นภาคต่อพาร์ทที่แล้ว

ซึ่งพาร์ทที่แล้วเราเล่าว่า Data Product คืออะไร และ Data Mesh มีหน้าตายังไง สามารถช่วยองค์กรในด้านใดบ้าง

ในพาร์ทนี้เราจะเล่าด้าน technical โดยพูดถึงวิธี implement เจ้า Data Usage Monitoring ตั้งแต่ data source ที่นำมาใช้วิเคราะห์ข้อมูล, หน้าตา pipeline จากต้นน้ำยันปลายน้ำ และหน้าตาข้อมูลสุดท้าย (Data Model) ที่นำไปปั้นใส่ Dashboard หรือ Looker Studio

Table of Contents
- เข้าใจลักษณะขององค์กร
- แล้วเราอยากรู้อะไร?
- Data Sources
- Pipeline
- Data Model
- Looker Studio
- สรุป

เข้าใจลักษณะขององค์กร

ก่อนที่เราจะเริ่มตามหาว่าเราจะใช้ข้อมูลที่ไหนเพื่อนำมาวิเคราะห์ได้บ้าง เราต้องเข้าใจก่อนว่าโดยทั่วไปแล้วองค์กรใช้ข้อมูลกันยังไง

สำหรับที่ CJ Express แล้ว เราสามารถพูดได้ว่าเราเป็น Google BigQuery (Lover) เลยก็ว่าได้ เพราะเป็นเครื่องมือที่ค่อนข้างสะดวกในการหา insights ของข้อมูล และ performance การ query ค่อนข้างดี

เพียงแค่รู้ SQL เราก็สามารถเสกทุกอย่างได้ในพริบตา

ดังนั้นหลังจากที่ดึงข้อมูลมา transform อะไรเสร็จสิ้นแล้ว Data Engineer จะพยายามนำข้อมูลนี้ไป serve ให้บน BigQuery เพื่อให้ user นั้นใช้งานง่ายที่สุด

ในขณะเดียวกัน Analytics Engineer ก็ช่วยปั้น Data Model และนำไป serve บน BigQuery เช่นกัน

และ Data Analyst เองก็นำก้อนดาต้านี้ไปหมุน dashboard และทำ report เพื่อตอบโจทย์ business

โดยทุก Data Product ที่ Data Engineer, Analytics Engineer, Data Analyst เป็นคนสร้างขึ้นมา เราจะนำขึ้น DataHub ที่ทำตัวเป็น Data Discovery กลาง เพื่อให้บุคคลอื่นๆในองค์กรสามารถเข้ามา shopping ดูได้ว่าองค์กรเรามีข้อมูลอะไรให้บริการบ้าง (จากรูปคือเส้นสีส้มและไปถึงฝั่งขวา)

DataHub ทำหน้าที่เหมือนตัวแสดงผล, ค้นหา, ทำความเข้าใจลักษณะข้อมูลที่พร้อมให้ใช้ ซึ่งเรา install ataHub และ host และ manage เองบน Kubernetes ไม่ได้ใช้ DataHub Managed service แบบเสียตัง

แล้วเราอยากรู้อะไร?

คำถามที่สำคัญมากๆ (เส้นสีม่วง)

  • เราจะรู้ได้ไงว่าหลังจากที่ทั้ง 3 role ขนและปั้นข้อมูลให้เสร็จสรรพขึ้น BigQuery พร้อมให้บริการแล้ว (Domain A, B, C) มันมีคนใช้ data จริงๆไหม ?
  • เราจะรู้ได้ไงว่า Domain C ใช้ข้อมูลจาก Domain อะไรบ้าง ?
  • เราจะรู้ได้ไงว่า user ที่ใช้หรือ query ข้อมูล เขาเป็นใคร? อยู่ตำแหน่งอะไรในองค์กร?

Data Sources

ต้นทางของข้อมูลจะมี 3 ตัวคือ

  1. Table ที่ให้บริการบน DataHub
  2. ข้อมูลการใช้งาน data
  3. ข้อมูลคนในองค์กร

1. Table ที่ให้บริการบน DataHub

จริงๆมีหลายวิธีในการดึงข้อมูลจาก DataHub เลย

ในเคสนี้เราจะดึงจาก DataHub OpenAPI ที่เขามีเตรียมไว้ให้แล้ว ซึ่งมันทำให้เราสามารถดึงพวก BigQuery Dataset จากใน DataHub ได้ผ่าน REST-API ซึ่งเข้าไปแล้วจะเป็น SWAGGER ว่ามี API อะไรให้ใช้บ้าง

ซึ่ง structure ใน DataHub จะมี 2 ตัว

โดยที่ Dataset นั้นจะถูกผูกอยู่ใน Domain อีกที เหมือนที่ Data Product เป็นของ Domain team นั้นๆ

ดึงข้อมูล DataHub dataset

โดยเราจะใช้ API openapi/v2/entity/dataset โดยเพิ่ม params aspects=domains ไปด้วย เพื่อให้มันคืน dataset แบบแนบ domain

curl -X 'GET' \\\\
'<https://<your_datahub_link>/openapi/v2/entity/dataset?systemMetadata=false&aspects=domains&count=10&query=%2A>' \\\\
-H 'accept: application/json'

โดยผลลัพท์จะได้เป็น json มา

example response:

"entities": [
{
"urn": "urn:li:dataset:(urn:li:dataPlatform:bigquery,<gcp_project_id>.member_master_serving.member_consent,PROD)",
"datasetKey": {
"value": {
"__type": "DatasetKey",
"platform": "urn:li:dataPlatform:bigquery",
"name": "<gcp_project_id>.member_master_serving.member_consent",
"origin": "PROD"
}
},
"domains": {
"value": {
"__type": "Domains",
"domains": [
"urn:li:domain:AAAA-BBBBBB-CCCCCCCCCC"
]
}
}
},

ผลลัพท์จะให้ entities โดยคืน URN (Uniform Resource Name) ซึ่งเป็นการใช้เรียก resource ต่างๆใน DataHub

ซึ่ง URN ก็จะบอกว่ามี Dataset และ domain อะไรบ้าง

ในตัวอย่างนี้เราแสดงผลแค่เพียง 1 ค่า ความจริงแล้วมี URN หลายตัวเลย

แล้วเรา convert ตัวนี้ให้เป็นตาราง

ซึ่งค่า Domain ที่เราได้จะเป็น urn ที่ unique แบบอ่านไม่รู้เรื่อง เราเลยต้องเรียก API ตัว domain อีกตัว

ดึงข้อมูล DataHub domain

openapi/v2/entity/domain

curl -X 'GET' \\
'https://<your_datahub_link>/openapi/v2/entity/domain?systemMetadata=false&aspects=domainProperties&count=10&query=%2A' \\
-H 'accept: application/json'

response:

{
"scrollId": "eyJzb3J0IjpbInVybjpsaTpkb21haW46NWVjMTQwZTMtMTMxOS00NTQ1LTlhMGMtOWJiMmJiNjAxMDI0Il0sInBpdElkIjpudWxsLCJleHBpcmF0aW9uVGltZSI6MH0=",
"entities": [
{
"urn": "urn:li:domain:AAAA-BBBBBB-CCCCCCCCCC",
"domainKey": {
"value": {
"__type": "DomainKey",
"id": "AAAA-BBBBBB-CCCCCCCCCC"
}
},
"domainProperties": {
"value": {
"__type": "DomainProperties",
"name": "Member Master",
"created": {
"time": 1714122172343,
"actor": "urn:li:corpuser:datahub"
}
}
}
},
{
"urn": "urn:li:domain:DDDD-EEEEE-FFFFFFFFFFF",
"domainKey": {
"value": {
"__type": "DomainKey",
"id": "DDDD-EEEEE-FFFFFFFFFFF"
}
},
"domainProperties": {
"value": {
"__type": "DomainProperties",
"name": "Product Master",
"created": {
"time": 1708681656734,
"actor": "urn:li:corpuser:datahub"
}
}
}
}
]
}

จะเห็นได้ว่าใน domainProperties มันจะให้ค่า name ที่อ่านรู้เรื่องมาให้

คราวนี้เรา convert มาเป็นตาราง

ขั้นตอนถัดไปก็เพียง merge 2 table นี้เข้าด้วยกัน ก็จะแมปได้ว่า dataset นี้เป็นของ domain อะไร

2. ข้อมูล log การใช้งาน data

— ดึงข้อมูล query จาก INFORMATION_SCHEMA.JOBS_BY_PROJECT

เมื่อเรา query 1 ครั้งใน BigQuery จะเกิดเป็น 1 Job ในโปรเจคนั้น

โชคดีที่ BigQuery มีสิ่งนี้มาให้ นั่นคือ view ที่เราสามารถดูข้อมูล Job ที่เกิดขึ้นใน GCP โปรเจคนั้นๆได้

โดยการ query จาก

[PROJECT_ID.]`region-REGION`.INFORMATION_SCHEMA.JOBS[_BY_PROJECT]

ความเทพของมันคือ มันมี field ที่ชื่อว่า referenced_tables ที่จะคืนค่าว่า query นั้นใช้จาก project, dataset, table ไหน

พูดไปอาจจะไม่เห็นภาพ งั้นเราลอง query และโชว์ผลลัพท์ให้ดูดีกว่า

query:

result:

นั่นคือ เรา query ที่โปรเจค domain_c_project (โปรเจคเรารันใน BigQuery) ด้วย query ด้านล่าง

select * from `domain_a_project.member_master_serving.member_consent` limit 10

โดยการใช้ table ที่อ้างอิงใน query คือโปรเจค domain_a_project

  • ref_tables เป็นคนบอกว่าต้นทางคืออะไรบ้าง นั่นคือ
  • ref_tables.project_id = domain_a_project
  • ref_tables.dataset_id = member_master_serving
  • ref_tables.table_id = member_consent

หรืออีกตัวอย่าง ที่ advance ขึ้นมาหน่อย

สมมติเรามี query ที่ค่อนข้างซับซ้อนมากๆ มีการ join table ถึง 5 ตัวเลย

  • table ทั้ง 5 นั้นมาจาก sales-project, branch-project, และ ecommerce-project
  • เรา query ที่โปรเจค ecommerce-project
  • นั่นหมายความว่า producer project จะเป็น sales-project, branch-project นั่นเอง แต่ในเคสนี้ table ใน branch-project ไม่ได้อยู่บน DataHub ก็จะไม่ถูกนับว่าเป็น producer project จึงเหลือเพียง sales-projectนั่นเอง
  • consumer project จะมีเพียง ecommerce-project เนื่องจากเราคิวรี่ที่โปรเจคนี้

3. ข้อมูลคนในองค์กร

สำหรับข้อมูลตรงนี้ก็ไม่ซับซ้อนอะไร ก็เป็นข้อมูลคนในองค์กรว่าใครทำหน้าที่อะไร, อยู่ทีมอะไร ซึ่งจะมาเสริมมิติให้กับ data model ของเราว่าคนที่ใช้งานข้อมูลเขาเป็นใคร เขาเป็น data analyst รึเปล่า หรือเป็น superuser ที่สามารถใช้ข้อมูลได้คล่องแคล่วอิสระ และเราจะช่วยเหลือเขายังไงได้บ้าง

Pipeline

สำหรับ pipeline เราดึงข้อมูลจาก 3 sources แบบ automate โดยใช้ Airflow เข้ามาช่วยจัดการ task ต่างๆและรันแบบ daily

โดยที่ทั้ง 3 ต้นทางนี้จะ join รวมกันที่ serving zone และได้ผลลัพท์คือ master_serving

ซึ่ง master_serving ของเรานั้น แท้จริงแล้วคือไฟล์ parquet ที่มีการทำ partitioning ไว้ master_serving/year=xxxx/month=xx/day=xx เก็บไว้ใน Google Cloud Storage

โดยที่เราสร้างเทเบิล BigQuery ขึ้นมา เป็นประเภท BigLake table เนื่องจากมันให้ข้อดีมากกว่า BigQuery External table ทั่วไปในด้านใน grant access และความสามารถด้าน Row-level security, column-security และ Data Mask

Data Model

Data ที่ join กันแล้ว หน้าตาแบบไหน ?

ยกตัวอย่างเช่น คุณ dante หัวหน้าแผนก C เข้าไปคิวรี่ที่โปรเจค cdp-pj โดยใน query มีการอ้างอิงที่ table ในโปรเจค assortment-pj ที่ table ชื่อ pog_article มาจาก domain ชื่อ Planogram (POG) ในวันที่ 18 มิถุนายน 2024

มันจะทำให้เรารู้ว่า table ต้นทางนี้ถูกใช้โดยโปรเจคไหน

Looker Studio

สุดท้ายแล้ว เราก็ create report โดยเลือกต้นทางเป็น BigQuery

และเลือก project, dataset, table เป็นเจ้า master_serving ที่เราปั้นเอาไว้

และหลังจากนั้นก็ customize report ได้ดั่งใจนึก

คำอธิบายของ report นี้จะอยู่ในพาร์ทแรกค่ะ

ซึ่ง report ในหน้านี้นั้น เราใช้ฟีเจอร์ที่ชื่อว่า Data Masking เพื่อ sensor sentitive ทั้งหลาย

สรุป

เราเชื่อมั่นว่า report นี้จะเข้ามาตอบคำถามที่เราสงสัยมาตลอดว่าการสร้าง Data Platform และการนำคอนเซ็ปต์ Data Mesh มาใช้ในองค์กรนั้นจะถูกวัดผลได้อย่างไร มีบุคคลเข้ามาใช้จริงๆหรือไม่

และเราก็หวังว่า metric ต่างๆในหน้านี้จะเป็นการช่วยติดตามผลลัพท์ได้ ไม่ว่าจะฝั่งคนผลิต data product เอง (producer) หรือผู้ใช้งาน data product (consumer)

และหวังว่าในอนาคต ตัวเลข นี้จะเพิ่มมากขึ้นและทำให้เราเข้าใจในตัว user ผู้ใช้มากขึ้น

เพิ่มเติม

dashboard นี้จะเน้นที่ usage เป็นหัวใจ หากมองเป็นเรื่อง cost เป็นหลักก็จะมีอีก dashboard ที่ในมิติด้าน cost โดยเฉพาะ และอัพเดทแบบ hourly ที่เร็วกว่าความต้องการใน Data Usage ตัวนี้

สามารถศึกษาได้ในบทความ FinOps ที่เราและ Nitit Taepant เขียนไว้ค่ะ

--

--

Burasakorn Sabyeying
CJ Express Tech (TILDI)

Data engineer at CJ Express. Women Techmakers Ambassador. GDG Cloud Bangkok team. Moved to Mesodiar.com