חיפוש שושלת נתונים בכמה אזורים באמצעות אוטומציה בצד השרת

במסמך הזה מוסבר איך לחפש שושלת נתונים חוצה אזורים עם כמה רמות באמצעות searchLineageStreaming API.

ה-API‏ searchLineageStreaming מבצע חיפוש לרוחב בכיוון שצוין (במעלה הזרם או במורד הזרם), החל מקבוצה מוגדרת של ישויות שורש, ומחזיר גרף שושלת נתונים מאוחד כתגובה של סטרימינג בזמן אמת.

בניגוד לממשקי API רגילים לחיפוש מקורות נתונים, שעלולים להגיע לזמן קצוב לתפוגה בגרפים גדולים של פרויקטים מרובים, searchLineageStreaming מספק תשובות בזמן אמת במנות. אפשר להשתמש ב-API הזה כשיוצרים כלים שצריכים לעבור על ארכיטקטורות נתונים רחבות, עמוקות או חוצות אזורים בלי שיתרחשו פסק זמן של בקשות.

מידע נוסף זמין במאמר מידע על חיפוש שושלת נתונים בכמה אזורים.

יכולות עיקריות

היכולות של searchLineageStreaming API כוללות:

  • חיפוש לרוחב: סורק את תרשים שושלת הנתונים שכבה אחר שכבה, ומחשב בצורה מדויקת את העומק של כל נכס מקושר.

  • תשובה בסטרימינג: מחזירה תתי-גרפים וקישורי שושלת נתונים כפי שהם מתגלים על ידי מערכת ה-Backend. השיטה הזו יעילה מאוד לגרפים רחבים או עוצמתיים של שושלות נתונים, ומונעת מצבים של זמן קצוב לתפוגה לבקשה.

  • מעקב אחרי מקורות נתונים בכמה מיקומים וכמה פרויקטים: למרות שמציינים רק פרויקט חיוב אחד בנתיב הבקשה, ה-API מגלה באופן אוטומטי את קישורי השושלת ועוקב אחריהם בכמה פרויקטים ובכמה מיקומים גיאוגרפיים, בתנאי שיש לכם את ההרשאות הנדרשות. Google Cloud

  • שושלת נתונים ברמת העמודה: תומך בחיפוש תלות ברמת העמודה בין נכסים.

  • חיפושים עם תו כללי: מאפשרים לאחזר את כל שושלת הנתונים ברמת העמודה של ישות ספציפית על ידי הוספת הסיומת * לשם המוגדר במלואו (FQN).

  • תובנות לגבי פייפליינים: אפשר לאחזר מטא-נתונים לגבי פייפליינים (תהליכים) שיצרו את קישורי שושלת הנתונים.

לפני שמתחילים

לפני ששולחים בקשות ל-API, חשוב לוודא שמתקיימות הדרישות המוקדמות הבאות בנושאי אבטחה וסביבה:

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות לחיפוש קישורים של שושלת הנתונים, צריך לבקש מהאדמין להקצות לכם את תפקיד ה-IAM‏ Data Lineage Viewer (roles/datalineage.viewer) בפרויקטים שבהם מאוחסנים הקישורים והתהליכים של שושלת הנתונים. כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

זהו תפקיד שמוגדר מראש וכולל את ההרשאות שנדרשות לחיפוש קישורים של שושלת נתונים. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:

ההרשאות הנדרשות

כדי לחפש קישורים של מעקב אחר מקורות נתונים, נדרשות ההרשאות הבאות:

  • חיפוש של שושלת ברמת הישות: datalineage.events.get בפרויקט שבו מאוחסן הקישור
  • חיפוש שושלת ברמת העמודה: datalineage.events.getFields בפרויקט שבו הקישור מאוחסן
  • אחזור פרטים מלאים על תהליך צינור: datalineage.processes.get בפרויקט שבו התהליך מאוחסן

יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.

הגדרת היקף משאבים

כשמגדירים את בקשת ה-API, צריך להבחין בין המשאב שמשמש לחיוב אדמיניסטרטיבי לבין המיקומים בפועל שנסרקים על ידי ה-API:

  • נתיב ההורה לחיוב: הנתיב parent בבקשת כתובת ה-URL חייב להיות בפורמט projects/project/locations/location. השילוב הספציפי הזה של פרויקט ומיקום משמש באופן בלעדי להערכת מכסות החיוב ומגבלות הקצב של יצירת בקשות ל-API.

  • מיקומי טירגוט: מגדירים באופן מפורש את האזורים שרוצים שהקצה העורפי יסרוק במערך locations בגוף הבקשה.

הגדרת אימות

מאתחלים משתנה סביבה עם אסימון גישה Google Cloud כדי לאמת את הפקודות של curl:

export ACCESS_TOKEN=$(gcloud auth print-access-token)

דוגמאות לשימוש

בדוגמאות הבאות נעשה שימוש בנקודת הקצה datalineage.googleapis.com.

חיפוש בנתוני שושלת רב-רמתיים של כמה פרויקטים

כדי לבצע חיפוש מעמיק של שושלת נתונים שחוצה כמה רמות של הגרף וסורק פרויקטים שונים של Google Cloud , צריך להגדיר את המשתנים הבאים:

  • מגדירים את limits.maxDepth לעומק החיפוש הרצוי (אפשר להזין ערכים מ-1 עד 100).

  • מאכלסים את המערך locations באזורי היעד שרוצים שהקצה העורפי יבצע הצלבת נתונים לגביהם (לדוגמה, ["us", "us-east1"]).

C#‎

C#

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי C#ההוראות להגדרה במאמר מדריך למתחילים לעבודה עם Knowledge Catalog באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Knowledge Catalog C# API.

כדי לבצע אימות לקטלוג הידע, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

using Google.Api.Gax.Grpc;
using Google.Api.Gax.ResourceNames;
using Google.Cloud.DataCatalog.Lineage.V1;
using System.Threading.Tasks;

public sealed partial class GeneratedLineageClientSnippets
{
    /// <summary>Snippet for SearchLineageStreaming</summary>
    /// <remarks>
    /// This snippet has been automatically generated and should be regarded as a code template only.
    /// It will require modifications to work:
    /// - It may require correct/in-range values for request initialization.
    /// - It may require specifying regional endpoints when creating the service client as shown in
    ///   https://cloud.google.com/dotnet/docs/reference/help/client-configuration#endpoint.
    /// </remarks>
    public async Task SearchLineageStreamingRequestObject()
    {
        // Create client
        LineageClient lineageClient = LineageClient.Create();
        // Initialize request argument(s)
        SearchLineageStreamingRequest request = new SearchLineageStreamingRequest
        {
            ParentAsLocationName = LocationName.FromProjectLocation("[PROJECT]", "[LOCATION]"),
            Locations = { "", },
            RootCriteria = new SearchLineageStreamingRequest.Types.RootCriteria(),
            Direction = SearchLineageStreamingRequest.Types.SearchDirection.Unspecified,
            Filters = new SearchLineageStreamingRequest.Types.SearchFilters(),
            Limits = new SearchLineageStreamingRequest.Types.SearchLimits(),
        };
        // Make the request, returning a streaming response
        using LineageClient.SearchLineageStreamingStream response = lineageClient.SearchLineageStreaming(request);

        // Read streaming responses from server until complete
        // Note that C# 8 code can use await foreach
        AsyncResponseStream<SearchLineageStreamingResponse> responseStream = response.GetResponseStream();
        while (await responseStream.MoveNextAsync())
        {
            SearchLineageStreamingResponse responseItem = responseStream.Current;
            // Do something with streamed response
        }
        // The response stream has completed
    }
}

Java

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaההוראות להגדרה במאמר מדריך למתחילים לעבודה עם Knowledge Catalog באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Knowledge Catalog Java API.

כדי לבצע אימות לקטלוג הידע, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

import com.google.api.gax.rpc.ServerStream;
import com.google.cloud.datacatalog.lineage.v1.LineageClient;
import com.google.cloud.datacatalog.lineage.v1.LocationName;
import com.google.cloud.datacatalog.lineage.v1.SearchLineageStreamingRequest;
import com.google.cloud.datacatalog.lineage.v1.SearchLineageStreamingResponse;
import java.util.ArrayList;

public class AsyncSearchLineageStreaming {

  public static void main(String[] args) throws Exception {
    asyncSearchLineageStreaming();
  }

  public static void asyncSearchLineageStreaming() throws Exception {
    // This snippet has been automatically generated and should be regarded as a code template only.
    // It will require modifications to work:
    // - It may require correct/in-range values for request initialization.
    // - It may require specifying regional endpoints when creating the service client as shown in
    // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
    try (LineageClient lineageClient = LineageClient.create()) {
      SearchLineageStreamingRequest request =
          SearchLineageStreamingRequest.newBuilder()
              .setParent(LocationName.of("[PROJECT]", "[LOCATION]").toString())
              .addAllLocations(new ArrayList<String>())
              .setRootCriteria(SearchLineageStreamingRequest.RootCriteria.newBuilder().build())
              .setFilters(SearchLineageStreamingRequest.SearchFilters.newBuilder().build())
              .setLimits(SearchLineageStreamingRequest.SearchLimits.newBuilder().build())
              .build();
      ServerStream<SearchLineageStreamingResponse> stream =
          lineageClient.searchLineageStreamingCallable().call(request);
      for (SearchLineageStreamingResponse response : stream) {
        // Do something when a response is received.
      }
    }
  }
}

Node.js

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaההוראות להגדרה במאמר מדריך למתחילים לעבודה עם Knowledge Catalog באמצעות ספריות לקוח.

כדי לבצע אימות לקטלוג הידע, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

/**
 * This snippet has been automatically generated and should be regarded as a code template only.
 * It will require modifications to work.
 * It may require correct/in-range values for request initialization.
 * TODO(developer): Uncomment these variables before running the sample.
 */
/**
 *  Required. The project and location to initiate the search from.
 */
// const parent = 'abc123'
/**
 *  Required. The locations to search in.
 */
// const locations = ['abc','def']
/**
 *  Required. Criteria for the root of the search.
 */
// const rootCriteria = {}
/**
 *  Required. Direction of the search.
 */
// const direction = {}
/**
 *  Optional. Filters for the search.
 */
// const filters = {}
/**
 *  Optional. Limits for the search.
 */
// const limits = {}

// Imports the Lineage library
const {LineageClient} = require('@google-cloud/lineage').v1;

// Instantiates a client
const lineageClient = new LineageClient();

async function callSearchLineageStreaming() {
  // Construct request
  const request = {
    parent,
    locations,
    rootCriteria,
    direction,
  };

  // Run request
  const stream = await lineageClient.searchLineageStreaming(request);
  stream.on('data', (response) => { console.log(response) });
  stream.on('error', (err) => { throw(err) });
  stream.on('end', () => { /* API call completed */ });
}

callSearchLineageStreaming();

Python

Python

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonההוראות להגדרה במאמר מדריך למתחילים לעבודה עם Knowledge Catalog באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Knowledge Catalog Python API.

כדי לבצע אימות לקטלוג הידע, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

# This snippet has been automatically generated and should be regarded as a
# code template only.
# It will require modifications to work:
# - It may require correct/in-range values for request initialization.
# - It may require specifying regional endpoints when creating the service
#   client as shown in:
#   https://googleapis.dev/python/google-api-core/latest/client_options.html
from google.cloud import datacatalog_lineage_v1


def sample_search_lineage_streaming():
    # Create a client
    client = datacatalog_lineage_v1.LineageClient()

    # Initialize request argument(s)
    request = datacatalog_lineage_v1.SearchLineageStreamingRequest(
        parent="parent_value",
        locations=["locations_value1", "locations_value2"],
        direction="UPSTREAM",
    )

    # Make the request
    stream = client.search_lineage_streaming(request=request)

    # Handle the response
    for response in stream:
        print(response)

Ruby

Ruby

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Rubyההוראות להגדרה במאמר מדריך למתחילים לעבודה עם Knowledge Catalog באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Knowledge Catalog Ruby API.

כדי לבצע אימות לקטלוג הידע, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

require "google/cloud/data_catalog/lineage/v1"

##
# Snippet for the search_lineage_streaming call in the Lineage service
#
# This snippet has been automatically generated and should be regarded as a code
# template only. It will require modifications to work:
# - It may require correct/in-range values for request initialization.
# - It may require specifying regional endpoints when creating the service
# client as shown in https://cloud.google.com/ruby/docs/reference.
#
# This is an auto-generated example demonstrating basic usage of
# Google::Cloud::DataCatalog::Lineage::V1::Lineage::Client#search_lineage_streaming.
#
def search_lineage_streaming
  # Create a client object. The client can be reused for multiple calls.
  client = Google::Cloud::DataCatalog::Lineage::V1::Lineage::Client.new

  # Create a request. To set request fields, pass in keyword arguments.
  request = Google::Cloud::DataCatalog::Lineage::V1::SearchLineageStreamingRequest.new

  # Call the search_lineage_streaming method to start streaming.
  output = client.search_lineage_streaming request

  # The returned object is a streamed enumerable yielding elements of type
  # ::Google::Cloud::DataCatalog::Lineage::V1::SearchLineageStreamingResponse
  output.each do |current_response|
    p current_response
  end
end

REST

כדי לחפש את מקורות הנתונים, משתמשים בשיטה searchLineageStreaming.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud שמשמש לחיוב אדמיניסטרטיבי ולבדיקת מכסות.
  • LOCATION_ID: ה Google Cloud מיקום, כמו us-central1.
  • SOURCE_PROJECT_ID: מזהה הפרויקט שבו נמצא טבלת המקור. Google Cloud
  • DATASET_ID: מזהה מערך הנתונים ב-BigQuery.
  • TABLE_ID: מזהה הטבלה ב-BigQuery.

ה-method של ה-HTTP וכתובת ה-URL:

POST https://datalineage.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID:searchLineageStreaming

תוכן בקשת JSON:

{
  "parent": "projects/PROJECT_ID/locations/LOCATION_ID",
  "locations": [
    "LOCATION_ID",
    "us-east1",
    "us-central1"
  ],
  "rootCriteria": {
    "entities": {
      "entities": [
        {
          "fullyQualifiedName": "bigquery:SOURCE_PROJECT_ID.DATASET_ID.TABLE_ID"
        }
      ]
    }
  },
  "direction": "DOWNSTREAM",
  "limits": {
    "maxDepth": 10,
    "maxResults": 5000
  }
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
  "links": [
    {
      "source": {
        "fullyQualifiedName": "bigquery:project-prod.dataset.source_table"
      },
      "target": {
        "fullyQualifiedName": "bigquery:project-prod.dataset.target_table"
      },
      "depth": 1,
      "location": "us"
    }
  ]
}

חיפוש בכמה מיקומים גיאוגרפיים

כדי לצמצם או להרחיב את הסריקה של גרף השושלת, משנים את האזורים הגיאוגרפיים שמועברים בשדה המערך החוזר locations.

לדוגמה:

curl -H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-X POST https://datalineage.googleapis.com/v1/projects/my-billing-project/locations/us:searchLineageStreaming \
--data '{
  "parent": "projects/my-billing-project/locations/us",
  "locations": ["us", "europe-west1", "asia-south2"],
  "rootCriteria": {
    "entities": {
      "entities": [{
        "fullyQualifiedName": "bigquery:my-project.dataset.global_table"
      }]
    }
  },
  "direction": "DOWNSTREAM"
}'

כברירת מחדל, ה-API משמיט את פרטי התהליך (maxProcessPerLink ברירת המחדל היא 0). כדי לאחזר את שמות המשאבים של צינורות הנתונים שיצרו את קישורי הנתונים, צריך להגדיר את limits.maxProcessPerLink למספר שלם חיובי שאינו אפס.

לדוגמה:

curl -H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-X POST https://datalineage.googleapis.com/v1/projects/my-billing-project/locations/us:searchLineageStreaming \
--data '{
  "parent": "projects/my-billing-project/locations/us",
  "locations": ["us"],
  "rootCriteria": {
    "entities": {
      "entities": [{
        "fullyQualifiedName": "bigquery:my-project.dataset.target_table"
      }]
    }
  },
  "direction": "UPSTREAM",
  "limits": {
    "maxProcessPerLink": 5
  }
}'

התנהגות התגובה: הזרם שמתקבל מאכלס את השדה links[].processes בהודעות תהליך שמכילות רק את שם משאב המערכת המוחלט (למשל, projects/my-project/locations/us/processes/my-process).

אחזור פרטים מלאים של תהליך באמצעות FieldMask

אם אתם צריכים מטא-נתונים מבניים מלאים לגבי צינור (כמו displayName, attributes או origin) במקום רק שם המשאב, אתם צריכים להשתמש ב-API FieldMask:

  1. צריך לספק ערך שאינו אפס במאפיין limits.maxProcessPerLink.

  2. מוסיפים fields פרמטר שאילתה לנתיב כתובת ה-URL, ומציינים את links.processes.process יחד עם שדות נדרשים אחרים.

לדוגמה:

curl -H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-X POST "https://datalineage.googleapis.com/v1/projects/my-billing-project/locations/us:searchLineageStreaming?fields=links.processes.process,links.source,links.target,links.depth" \
--data '{
  "parent": "projects/my-billing-project/locations/us",
  "locations": ["us"],
  "rootCriteria": {
    "entities": {
      "entities": [{
        "fullyQualifiedName": "bigquery:my-project.dataset.target_table"
      }]
    }
  },
  "direction": "UPSTREAM",
  "limits": {
    "maxProcessPerLink": 5
  }
}'

חיפוש של שושלת נתונים ברמת הטבלה וברמת העמודה

אפשר לחפש שושלת נתונים ברמת הטבלה (ברמת הנכס) וברמת העמודה (ברמת השדה) בבקשה אחת, על ידי ציון כמה ישויות בrootCriteria.entities.entities הרשימה:

  • עבור שושלת נתונים ברמת הטבלה, השמיטו את המערך field.

  • כדי להציג את שושלת הנתונים ברמת העמודה, מציינים עמודה אחת במערך field.

לדוגמה:

curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json" \
     -X POST https://datalineage.googleapis.com/v1/projects/my-billing-project/locations/us:searchLineageStreaming \
     --data '{
       "parent": "projects/my-billing-project/locations/us",
       "locations": ["us"],
       "rootCriteria": {
         "entities": {
           "entities": [
             {
               "fullyQualifiedName": "bigquery:my-project.dataset.table_a"
             },
             {
               "fullyQualifiedName": "bigquery:my-project.dataset.table_b",
               "field": ["email"]
             }
           ]
         }
       },
       "direction": "DOWNSTREAM"
     }'

שימוש בתווים כלליים לחיפוש בשביל שרשרת מקורות נתונים ברמת העמודה

כדי לחפש את כל שורות הנתונים ברמת העמודה שזמינות לטבלה ספציפית בלי לפרט כל עמודה בנפרד, משתמשים בתו הכללי * כערך היחיד במערך field.

לדוגמה:

curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json" \
     -X POST https://datalineage.googleapis.com/v1/projects/my-billing-project/locations/us:searchLineageStreaming \
     --data '{
       "parent": "projects/my-billing-project/locations/us",
       "locations": ["us"],
       "rootCriteria": {
         "entities": {
           "entities": [{
             "fullyQualifiedName": "bigquery:my-project.dataset.my_table",
             "field": ["*"]
           }]
         }
       },
       "direction": "DOWNSTREAM"
     }'

סינון תוצאות של שרשרת המקור

אפשר לצמצם את תוצאות החיפוש של שושלת הנתונים בעזרת הבלוק filters בגוף הבקשה.

סינון לפי סוג התלות

כדי להגביל את התוצאות לסוגים ספציפיים של תלות, כמו עותקים ישירים (EXACT_COPY) או טרנספורמציות כמו סינון וקיבוץ (OTHER), משתמשים במסנן dependencyTypes.

לדוגמה:

curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json" \
     -X POST https://datalineage.googleapis.com/v1/projects/my-billing-project/locations/us:searchLineageStreaming \
     --data '{
       "parent": "projects/my-billing-project/locations/us",
       "locations": ["us"],
       "rootCriteria": {
         "entities": {
           "entities": [{
             "fullyQualifiedName": "bigquery:my-project.dataset.my_table"
           }]
         }
       },
       "direction": "DOWNSTREAM",
       "filters": {
         "dependencyTypes": ["EXACT_COPY"]
       }
     }'

כדי לוודא שהחיפוש יחזיר רק את היסטוריית השינויים ברמת הטבלה ויכלול רק את היסטוריית השינויים ברמת העמודה, צריך להגדיר את המסנן entitySet לערך ENTITIES.

לדוגמה:

curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json" \
     -X POST https://datalineage.googleapis.com/v1/projects/my-billing-project/locations/us:searchLineageStreaming \
     --data '{
       "parent": "projects/my-billing-project/locations/us",
       "locations": ["us"],
       "rootCriteria": {
         "entities": {
           "entities": [{
             "fullyQualifiedName": "bigquery:my-project.dataset.my_table"
           }]
         }
       },
       "direction": "DOWNSTREAM",
       "filters": {
         "entitySet": "ENTITIES"
       }
     }'

סינון לפי טווח זמן

אתם יכולים להגביל את תוצאות החיפוש של שושלת נתונים לפרק זמן מסוים.

לדוגמה, כדי לחפש נתוני שושלת שנוצרו אחרי חותמת זמן ספציפית, משתמשים בבקשה הבאה:

curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json" \
     -X POST https://datalineage.googleapis.com/v1/projects/my-billing-project/locations/us:searchLineageStreaming \
     --data '{
       "parent": "projects/my-billing-project/locations/us",
       "locations": ["us"],
       "rootCriteria": {
         "entities": {
           "entities": [{
             "fullyQualifiedName": "bigquery:my-project.dataset.my_table"
           }]
         }
       },
       "direction": "DOWNSTREAM",
       "filters": {
         "timeRange": {
           "startTime": "2026-01-01T00:00:00Z"
         }
       }
     }'

פתרון בעיות: טיפול במיקומים שלא ניתן להגיע אליהם ובגרפים חלקיים

ממשק ה-API של הסטרימינג סורק בו-זמנית קבוצה מבוזרת של פרויקטים ומיקומים, ולכן יכול להיות שחלק מהאזורים המרוחקים לא יפעלו באופן זמני, לא יגיבו או לא יוגדרו בצורה נכונה במהלך ההפעלה.

  • הסימפטום: הפריסה של תרשים שרשרת המקורות שמוחזרת נראית לא שלמה או שחסרים בה קפיצות אזוריות צפויות.

  • אבחון: כדי להגן על תקינות הנתונים, הזרם searchLineageStreamingResponse מאכלס שדה ייעודי unreachable (מחרוזת חוזרת) עם מיקומים בעייתיים, בפורמט projects/PROJECT_NUMBER/locations/LOCATION (לדוגמה, projects/123456789/locations/us-east1).

  • שיטה מומלצת: תמיד כדאי לבנות את אפליקציות הלקוח כך שיבדקו את השדה unreachable כדי לוודא שהנתונים מלאים לפני העיבוד של הגרף.

המאמרים הבאים