שאילתה באמצעות Federation API
במדריך הזה מוסבר איך לשלוח שאילתות לנתונים ב-Manufacturing Data Engine (MDE) באמצעות Federation API בתרחישי שימוש אופייניים.
הפדרציה מספקת גישה לחלקים מנתוני ההגדרה, לנתונים שמאוחסנים ב-BigQuery או ב-Bigtable.
כדי להשתמש ב-Federation API כדי לשלוח שאילתות לנתונים ב-Bigtable, צריך לוודא שפרסתם את MDE עם הערך הנכון של size. מידע נוסף זמין בקטע על הגדלים. צריך לבחור גודל שמאפשר פריסה של משימת כתיבה נדרשת של Dataflow וגם של מופע Bigtable. בדרך כלל, כל מה שגדול מ-Pilot כולל את התלות הנדרשת.
מבוא
Federation API הוא API טיפוסי בארכיטקטורת REST שמחזיר מבני JSON. כדי לגשת ל-API, צריך להשתמש ב-proxy של MDE או לחשוף אותו באמצעות שרת proxy לאימות זהויות (IAP).
הנתונים שזמינים דרך ה-API הם:
| הנתונים הזמינים | נתיב הבסיס של ה-API באמצעות מנהרה |
|---|---|
| קבלת רשומות מ-BigLake | /data/v1/bigquery |
| קבלת רשומות מ-Bigtable | /data/v1/bigtable |
| אחזור מופע של מטא-נתונים מהמרכז לניהול מטא-נתונים | /data/v1/metadata |
| איך מקבלים סוגים ותגים מ-Config Manager | /data/v1/config |
במקרים מסוימים, שמות המאפיינים מקוצרים כדי להבטיח ביצועים תקינים כשמעבירים מטען ייעודי (payload) גדול של JSON ברשת. אפשר לכלול בתגובה קטע של כותרות שמסביר את הקיצורים.
הפרמטרים הכלליים של שאילתות שמשמשים בחלקים השונים של ה-API הם:
| פרמטר של שאילתה | תיאור |
|---|---|
includeMetrics |
התשובה כוללת מדדים שקשורים לשאילתות. |
includeHeader |
התגובה כוללת כותרת עם הסבר על הקיצור וסטטיסטיקות של התגובה. |
includeMetadata |
כשמחזירים רשומות, הפרמטר הזה מציין אם לכלול שדות של מטא-נתונים בתגובה. הפעולה הזו יכולה להגדיל באופן משמעותי את גודל התשובה, ויכול להיות שהיא לא נחוצה. |
nextPageToken |
אם יש נתונים נוספים מעבר לנתונים שמוחזרים, מוחזר nextPageToken שאפשר לספק בבקשה הבאה כדי לקבל את הדף הבא. ב-Bigtable, תמיד מסופק nextPageToken כי אין דרך לדעת אם יש רשומות נוספות זמינות או לא. |
includeIds |
צריך לכלול את מזהי השורות ואת מזהי ההודעות מהמקור. |
בדוגמה הבאה מוצגת בקשה עם שלושה מפרמטרים השאילתה:
GET http://localhost:8080/data/v1/bigquery/records/primepaintingrobot-01-airhumidity/default-numeric-records/latest?includeMetrics=true&includeHeader=true&includeMetadata=true
תגובה לדוגמה עם שלושת הפרמטרים של השאילתה תיראה בערך כך:
{
"header": {
"startTime": "1691060884507",
"endTime": "1691060884507",
"tagCount": 1,
"dataRecordCount": 1,
"dataFields": {
"d": "duration",
"dp": "discretePayload",
"cp": "continuousPayload",
"its": "ingestTimestamp",
"cmr": "cloudMetadataRef",
"sdi": "sourceMessageId",
"np": "numericPayload",
"id": "id",
"v": "value",
"em": "embeddedMetadata",
"et": "eventTimestampEnd",
"mcm": "materializedCloudMetadata",
"t": "eventTimestamp",
"st": "eventTimestampStart"
}
},
"tags": [
{
"tagName": "primepaintingrobot-01-airhumidity",
"data": [
{
"t": "1691060884507000",
"np": {
"v": 80.7
},
"em": "{\"datatype\":\"float\",\"description\":\"This is a fake prime painting robot on NodeRed\",\"deviceID\":\"75c18751-7a94-453e-86f5-67be2b0c8fd4\",\"deviceName\":\"primepaintingrobot-01\",\"headers\":{},\"messageClassName\":\"default-numeric-value\",\"metadata\":{\"brand\":\"Philips\",\"measurementUnit\":\"percentage\",\"sensorType\":\"humidity\",\"shift\":\"Shift 4\"},\"registerId\":\"a2635b62-0e89-40ff-b172-13eea37a92c2\",\"success\":true,\"unit\":\"percentage\"}",
"mcm": "{}",
"cmr": "{}"
}
],
"typeName": "default-numeric-records"
}
],
"metrics": {
"totalTimeMS": 2766
}
}
ה-API תומך בדגימת יתר בצד השרת. כדי להשתמש בתכונה הזו, צריך לציין מרווח זמן לדגימה בדחיסה בפורמט:sample=Duration,Unit,Aggregation
לדוגמה: sample=[10,MINUTE,MEAN]
פרמטרים מותרים:
-
Duration:Int– מספר שלם שמייצג את מרווח הדגימה. -
Unit:{SECOND, MINUTE, HOUR}– יחידת הזמן של המרווח. -
Aggregation:{MEAN, SUM,MAX, MIN, COUNT}– פונקציית הצבירה להחלה.
אפשר לבצע דגימת חסר של נתונים מ-Bigtable ומ-Bigtable. סוגי הצבירה הזמינים תלויים גם באב-טיפוס.
קבלת רשומות מ-BigQuery
זוהי בקשה לדוגמה לקבלת הרשומה האחרונה עבור מספר תגים עם שילוב סוגים מ-BigQuery:
GET http://localhost:8080/data/v1/bigquery/records/default-numeric-records?tags=station-a-powerusage,station-b-powerusage&startTimestamp=1691057738790&endTimestamp=1691061338790&pageSize=100
דוגמה לתשובה:
{
"header": {
"startTime": "1691061786759",
"endTime": "1691061786759",
"tagCount": 1,
"dataRecordCount": 1,
"dataFields": {
"d": "duration",
"dp": "discretePayload",
"cp": "continuousPayload",
"its": "ingestTimestamp",
"cmr": "cloudMetadataRef",
"sdi": "sourceMessageId",
"np": "numericPayload",
"id": "id",
"v": "value",
"em": "embeddedMetadata",
"et": "eventTimestampEnd",
"mcm": "materializedCloudMetadata",
"t": "eventTimestamp",
"st": "eventTimestampStart"
}
},
"tags": [
{
"tagName": "primepaintingrobot-01-airhumidity",
"data": [
{
"t": "1691061786759000",
"np": {
"v": 81.79
},
"em": "{\"datatype\":\"float\",\"description\":\"This is a fake prime painting robot on NodeRed\",\"deviceID\":\"75c18751-7a94-453e-86f5-67be2b0c8fd4\",\"deviceName\":\"primepaintingrobot-01\",\"headers\":{},\"messageClassName\":\"default-numeric-value\",\"metadata\":{\"brand\":\"Philips\",\"measurementUnit\":\"percentage\",\"sensorType\":\"humidity\",\"shift\":\"Shift 4\"},\"registerId\":\"a2635b62-0e89-40ff-b172-13eea37a92c2\",\"success\":true,\"unit\":\"percentage\"}",
"mcm": "{}",
"cmr": "{}"
}
],
"typeName": "default-numeric-records"
}
],
"metrics": {
"totalTimeMS": 2371
}
}
זוהי בקשה לדוגמה לאחזור רשומות של שילובים ספציפיים של תגים וסוגים, ושל טווחי זמן התחלה וסיום מ-BigQuery:
GET http://localhost:8080/data/v1/bigquery/records/default-numeric-records?tags=station-a-powerusage,station-b-powerusage&startTimestamp=1691057738790&endTimestamp=1691061338790&pageSize=100
תגובה לדוגמה חלקית תיראה כך:
{
"tags": [
{
"tagName": "station-a-powerusage",
"data": [
{
"t": "1691061419653000",
"np": {
"v": 14.174
}
},
{
"t": "1691061418653000",
"np": {
"v": 17.979
}
},
בדוגמה הבאה של בקשה מתקבלים רשומות של שילוב של תגים וסוג מ-BigQuery עם דגימת יתר (הערך המינימלי לכל חלון של חמש דקות בטווח הזמן שצוין):
GET http://localhost:8080/data/v1/bigquery/records/default-numeric-records?tags=station-a-powerusage,station-b-powerusage&startTimestamp=1691058375905&endTimestamp=1691061975905&pageSize=1000&sample=5,MINUTE,MIN
דוגמה לתשובה:
{
"tags": [
{
"tagName": "station-a-powerusage",
"data": [
{
"t": "1691061775669000",
"agg": {
"v": 12.019
}
},
{
"t": "1691061475669000",
"agg": {
"v": 12.022
}
}
]
},
{
"tagName": "station-b-powerusage",
"data": [
{
"t": "1691061775702000",
"agg": {
"v": 34.092
}
},
{
"t": "1691061475702000",
"agg": {
"v": 34.201
}
}
]
}
],
"nextPageToken": "LTU3NjUwMTA5OS4w"
}
בקשת הדוגמה הבאה מקבלת רשומות מסוג מקובץ על סמך שני ערכים מקובצים מ-BigQuery:
GET http://localhost:8080/data/v1/bigquery/clusteredrecords/clustered-energy-consumption-numeric-records?clusterColumnValues=DK,AAR&startTimestamp=1691062260871&endTimestamp=1691065860871
תגובה לדוגמה חלקית תיראה כך:
{
"tags": [
{
"tagName": "energymonitor2-line-total-energy",
"data": [
{
"t": "1691065853667000",
"np": {
"v": 15.148
}
},
[...]
{
"tagName": "energymonitor6-line-total-energy",
"data": [
{
"t": "1691065853710000",
"np": {
"v": 15.015
}
},
{
"t": "1691065852710000",
"np": {
"v": 18.468
}
},
[...]
בדוגמה הבאה מוצגת בקשה לאחזור תגים מסוג מסוים:
GET http://localhost:8080/data/v1/bigquery/tags/default-numeric-records?startTimestamp=1690942297865&endTimestamp=1691062297865&includeHeader=true
תגובה לדוגמה חלקית תיראה כך:
{
"header": {
"tagCount": 56,
"dataRecordCount": 56,
"dataFields": {
"typeName": "typeName",
"tagName": "tagName",
"version": "typeVersion"
}
},
"tags": [
{
"tagName": "sb01_d_voltage",
"typeVersion": "1",
"typeName": "default-numeric-records"
},
{
"tagName": "JGC_001",
"typeVersion": "1",
"typeName": "default-numeric-records"
},
קבלת רשומות מ-Bigtable
זוהי דוגמה לבקשה לקבלת רשומות לשילוב של תגים, סוג וטווח זמן (זמן התחלה וזמן סיום) מ-Bigtable:
GET http://localhost:8080/data/v1/bigtable/records/default-numeric-records?startTimestamp=1687462558476&endTimestamp=1691062558476&tags=clearcoatingrobot-01-airpressure,primepaintingrobot-01-airhumidity
תגובה לדוגמה חלקית תיראה כך:
{
"tags": [
{
"tagName": "clearcoatingrobot-01-airpressure",
"data": [
{
"t": "1691062557069",
"np": {
"v": 757.18
}
},
{
"t": "1691062556068",
"np": {
"v": 763.71
}
},
הדוגמה הבאה מציגה בקשה לקבלת הרשומה האחרונה לשילוב של תג וסוג מ-Bigtable:
GET http://localhost:8080/data/v1/bigtable/records/clearcoatingrobot-01-airpressure/default-numeric-records/latest?includeHeader=true
דוגמה לתשובה:
{
"header": {
"startTime": "1691062700094",
"endTime": "1691062700094",
"tagCount": 1,
"dataRecordCount": 1,
"dataFields": {
"d": "duration",
"dp": "discretePayload",
"cp": "continuousPayload",
"its": "ingestTimestamp",
"cmr": "cloudMetadataRef",
"sdi": "sourceMessageId",
"np": "numericPayload",
"id": "id",
"v": "value",
"em": "embeddedMetadata",
"et": "eventTimestampEnd",
"mcm": "materializedCloudMetadata",
"t": "eventTimestamp",
"st": "eventTimestampStart"
}
},
"tags": [
{
"tagName": "clearcoatingrobot-01-airpressure",
"data": [
{
"t": "1691062700094",
"np": {
"v": 764.91
}
}
],
"typeName": "default-numeric-records"
}
]
}
אחזור מופע של מטא-נתונים מהמרכז לניהול מטא-נתונים
הדוגמה הבאה היא של בקשה לקבלת מופע של מטא-נתונים ממנהל המטא-נתונים:
GET http://localhost:8080/data/v1/metadata/instances/41e9a32b-e85f-4a9a-a6a2-a3784855e859?includeHeader=true
תגובה לדוגמה חלקית תיראה כך:
{
"header": {
"dataFields": {
"i": "instance",
"bv": "bucketVersion",
"bnam": "bucketName",
"bnum": "bucketNumber",
"nk": "naturalKey",
"ct": "createdTimestamp",
"iid": "instanceId"
}
},
"metadataInstances": [
{
"iid": "41e9a32b-e85f-4a9a-a6a2-a3784855e859",
"bnum": 357,
"bnam": "source",
"bv": 1,
"nk": "mce",
"i": "{\"source\":\"Manufacturing Connect edge\"}",
"ct": "1689781556451"
}
]
}
איך מקבלים סוגים ותגים מ-Config Manager
הדוגמה הבאה היא בקשה לקבלת תגים מ-Config Manager:
GET http://localhost:8080/data/v1/config/tags?includeHeader=true&pageSize=10
תגובה לדוגמה חלקית תיראה כך:
{
"header": {
"tagCount": 10,
"dataFields": {
"types": "types",
"createdTimestamp": "createdTimestamp",
"tagName": "tagName",
"id": "id"
}
},
"tags": [
{
"id": "613db120-fed4-4584-a3b1-9468d7228edb",
"tagName": "MCe-tag-single-string",
"types": ["default-discrete-records"],
"createdTimestamp": "1689781665469"
},
{
"id": "3b42c8c3-3261-4a30-8af8-d2bde1ca72de",
"tagName": "MCe-tag-array-event-3",
"types": ["default-discrete-records"],
"createdTimestamp": "1689781665458"
},
{
"id": "73e198c8-0ffc-4064-bf42-6c60e413c845",
"tagName": "MCe-tag-array-event-2",
"types": ["default-discrete-records"],
"createdTimestamp": "1689781665541"
},
{
"id": "01822a93-f917-4c9c-a1a9-49ba7ee98bff",
"tagName": "MCe-tag-array-event-0",
"types": ["default-discrete-records"],
"createdTimestamp": "1689781665470"
},
{
"id": "7bccbbd2-9e65-4bb5-b0c7-48ab9531712d",
"tagName": "MCe-tag-array-numeric",
"types": ["default-complex-numeric-records"],
"createdTimestamp": "1689781667366"
},
{
"id": "85804705-64a6-494b-a105-c5b8b52ae147",
"tagName": "stampingmachine-09-vibration",
"types": ["default-complex-numeric-records"],
"createdTimestamp": "1689781667445"
},
{
"id": "c33732fb-28b3-43d6-a9ed-8d0c228f1eeb",
"tagName": "primepaintingrobot-01-viscosity",
"types": ["default-numeric-records"],
"createdTimestamp": "1689781669547"
},
{
"id": "50bbb41e-c378-4740-ba9e-0c6f84b44ca7",
"tagName": "MCe-tag-array-event-1",
"types": ["default-discrete-records"],
"createdTimestamp": "1689781665555"
},
{
"id": "39666ff1-738a-4c12-b1d9-370c41ca777f",
"tagName": "MCe-tag-single-event",
"types": ["default-discrete-records"],
"createdTimestamp": "1689781665543"
},
{
"id": "45ea101b-d077-4a91-96d7-aca35b5f20c1",
"tagName": "stampingmachine-09-vibration-1",
"types": ["default-numeric-records"],
"createdTimestamp": "1689781669291"
}
],
"nextPageToken": "LTE4MDA5NTU0MzAuQUFBQUFhRnhTRlYwREFuRnVQcjBBMGx5K1JDVURPdFBtbmN0RW5lUHRGV2o3OE5M"
}
זוהי דוגמה לבקשה לקבלת סוגים מאשף ההגדרות:
GET http://localhost:8080/data/v1/config/types?includeHeader=true&pageSize=5
דוגמה לתשובה:
{
"header": {
"typeCount": 5,
"dataFields": {
"active": "active",
"typeName": "typeName",
"archetypeName": "archetypeName",
"createdTimestamp": "createdTimestamp",
"id": "id"
}
},
"types": [
{
"typeName": "default-complex-numeric-records",
"archetypeName": "DISCRETE_DATA_SERIES",
"createdTimestamp": "1689781557147",
"id": "4ec777fc-f078-4465-81fd-d70e7a1df329",
"active": true
},
{
"typeName": "default-continuous-records",
"archetypeName": "CONTINUOUS_DATA_SERIES",
"createdTimestamp": "1689781557805",
"id": "d684637a-b751-49d5-82c2-8941aa4c1ef4",
"active": true
},
{
"typeName": "default-clustered-numeric-records",
"archetypeName": "CLUSTERED_NUMERIC_DATA_SERIES",
"createdTimestamp": "1689781557979",
"id": "e2dbbab1-ad15-4445-b0db-59bb17b96a54",
"active": true
},
{
"typeName": "default-numeric-records",
"archetypeName": "NUMERIC_DATA_SERIES",
"createdTimestamp": "1689781556887",
"id": "0f6fc49f-a463-4948-ab65-e4c4f66192b9",
"active": true
},
{
"typeName": "default-discrete-records",
"archetypeName": "DISCRETE_DATA_SERIES",
"createdTimestamp": "1689781557444",
"id": "94327246-5ec3-4777-9154-a968dd546c90",
"active": true
}
],
"nextPageToken": "LTYxMjI4MTg4OC5BQUFBQVVzR25vRVpkMGplSU9FZUc1N2VJY2h0clNqQXhUOUN4QmYxSXZ6UGpjY3U="
}