Compute a measurement report on the fly
Fetches lineage data for the specified component versions, runs the measurement comparison, and returns the result without persisting.
curl --request GET \
--url https://{hostname}.gable.ai/v0/measurements/generate \
--header 'X-API-KEY: <api-key>'import requests
url = "https://{hostname}.gable.ai/v0/measurements/generate"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://{hostname}.gable.ai/v0/measurements/generate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{hostname}.gable.ai/v0/measurements/generate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://{hostname}.gable.ai/v0/measurements/generate"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://{hostname}.gable.ai/v0/measurements/generate")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{hostname}.gable.ai/v0/measurements/generate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"metadata": {
"baseTimestamp": "<string>",
"compareTimestamp": "<string>",
"comparisonDate": "<string>",
"componentName": "<string>",
"baseNamespace": "<string>",
"compareNamespace": "<string>",
"baseComponentId": "<string>",
"compareComponentId": "<string>",
"baseVersionId": "<string>",
"compareVersionId": "<string>",
"baseScaPrimeVersion": "<string>",
"compareScaPrimeVersion": "<string>",
"filterSet": {
"name": "<string>",
"includedPaths": 123,
"totalPaths": 123
},
"mappingJoinMultiplicity": {
"baseDuplicateKeyCount": 123,
"compareDuplicateKeyCount": 123,
"crossProductKeyCount": 123,
"extraJoinedRows": 123,
"samples": [
{
"pathPayloadName": "<string>",
"ingressField": "<string>",
"egressField": "<string>",
"baseCount": 123,
"compareCount": 123,
"joinedRows": 123,
"extraJoinedRows": 123
}
]
}
},
"summary": {
"fullyQualified": {
"total": 123,
"full": 123,
"partial": 123,
"missing": 123,
"highQualityTotal": 123,
"highQualityFull": 123,
"highQualityPartial": 123,
"highQualityMissing": 123,
"lowQualityTotal": 123,
"lowQualityFull": 123,
"lowQualityPartial": 123,
"lowQualityMissing": 123
},
"partiallyQualified": {
"total": 123,
"full": 123,
"partial": 123,
"missing": 123,
"highQualityTotal": 123,
"highQualityFull": 123,
"highQualityPartial": 123,
"highQualityMissing": 123,
"lowQualityTotal": 123,
"lowQualityFull": 123,
"lowQualityPartial": 123,
"lowQualityMissing": 123
}
},
"paths": [
{
"pathId": "<string>",
"ingress": {
"id": "<string>",
"payloadName": "<string>",
"signatureName": "<string>",
"schemaName": "<string>"
},
"egress": {
"id": "<string>",
"payloadName": "<string>",
"signatureName": "<string>",
"schemaName": "<string>"
},
"notes": "<string>",
"dimensions": {},
"details": {
"ingressFields": [
{
"fieldName": "<string>",
"fieldType": "<string>"
}
],
"egressFields": [
{
"fieldName": "<string>",
"fieldType": "<string>"
}
],
"mappings": [
{
"ingressField": "<string>",
"egressField": "<string>"
}
],
"codeSteps": [
{
"stepOrder": 123,
"ingressField": "<string>",
"egressField": "<string>"
}
],
"pathAnchors": [
{
"anchorName": "<string>",
"filePath": "<string>",
"baseLine": "<string>",
"compareLine": "<string>"
}
]
}
}
],
"extraPaths": [
{
"extraPathId": "<string>",
"ingressPayload": "<string>",
"egressPayload": "<string>",
"pathPayloadName": "<string>"
}
]
}{
"message": "<string>",
"id": 123,
"title": "<string>"
}{
"message": "<string>",
"id": 123,
"title": "<string>"
}{
"message": "<string>",
"id": 123,
"title": "<string>"
}Authorizations
Query Parameters
Component to measure.
Version to evaluate against the base.
Base (ground-truth) version ID. Defaults to latest if omitted.
Component ID for the compare version. Defaults to componentId if omitted. Use when comparing across namespaces.
When true, use raw scan data. When false, use projected data.
true, false When true, apply IE inclusion filtering to lineage data before generating the measurement report.
true, false Optional ID of a payload filter set to apply. Only honored when the base namespace is ground truth; restricts the report to the filter set's payloads.
Response
Computed measurement report
Top-level object containing all comparison data between a base and compare lineage export.
Timestamps, file paths, and component info.
Show child attributes
Show child attributes
Aggregate counts and percentages.
Show child attributes
Show child attributes
Per-path comparison results.
Show child attributes
Show child attributes
Paths in compare but not in base.
Show child attributes
Show child attributes
curl --request GET \
--url https://{hostname}.gable.ai/v0/measurements/generate \
--header 'X-API-KEY: <api-key>'import requests
url = "https://{hostname}.gable.ai/v0/measurements/generate"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://{hostname}.gable.ai/v0/measurements/generate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{hostname}.gable.ai/v0/measurements/generate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://{hostname}.gable.ai/v0/measurements/generate"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://{hostname}.gable.ai/v0/measurements/generate")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{hostname}.gable.ai/v0/measurements/generate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"metadata": {
"baseTimestamp": "<string>",
"compareTimestamp": "<string>",
"comparisonDate": "<string>",
"componentName": "<string>",
"baseNamespace": "<string>",
"compareNamespace": "<string>",
"baseComponentId": "<string>",
"compareComponentId": "<string>",
"baseVersionId": "<string>",
"compareVersionId": "<string>",
"baseScaPrimeVersion": "<string>",
"compareScaPrimeVersion": "<string>",
"filterSet": {
"name": "<string>",
"includedPaths": 123,
"totalPaths": 123
},
"mappingJoinMultiplicity": {
"baseDuplicateKeyCount": 123,
"compareDuplicateKeyCount": 123,
"crossProductKeyCount": 123,
"extraJoinedRows": 123,
"samples": [
{
"pathPayloadName": "<string>",
"ingressField": "<string>",
"egressField": "<string>",
"baseCount": 123,
"compareCount": 123,
"joinedRows": 123,
"extraJoinedRows": 123
}
]
}
},
"summary": {
"fullyQualified": {
"total": 123,
"full": 123,
"partial": 123,
"missing": 123,
"highQualityTotal": 123,
"highQualityFull": 123,
"highQualityPartial": 123,
"highQualityMissing": 123,
"lowQualityTotal": 123,
"lowQualityFull": 123,
"lowQualityPartial": 123,
"lowQualityMissing": 123
},
"partiallyQualified": {
"total": 123,
"full": 123,
"partial": 123,
"missing": 123,
"highQualityTotal": 123,
"highQualityFull": 123,
"highQualityPartial": 123,
"highQualityMissing": 123,
"lowQualityTotal": 123,
"lowQualityFull": 123,
"lowQualityPartial": 123,
"lowQualityMissing": 123
}
},
"paths": [
{
"pathId": "<string>",
"ingress": {
"id": "<string>",
"payloadName": "<string>",
"signatureName": "<string>",
"schemaName": "<string>"
},
"egress": {
"id": "<string>",
"payloadName": "<string>",
"signatureName": "<string>",
"schemaName": "<string>"
},
"notes": "<string>",
"dimensions": {},
"details": {
"ingressFields": [
{
"fieldName": "<string>",
"fieldType": "<string>"
}
],
"egressFields": [
{
"fieldName": "<string>",
"fieldType": "<string>"
}
],
"mappings": [
{
"ingressField": "<string>",
"egressField": "<string>"
}
],
"codeSteps": [
{
"stepOrder": 123,
"ingressField": "<string>",
"egressField": "<string>"
}
],
"pathAnchors": [
{
"anchorName": "<string>",
"filePath": "<string>",
"baseLine": "<string>",
"compareLine": "<string>"
}
]
}
}
],
"extraPaths": [
{
"extraPathId": "<string>",
"ingressPayload": "<string>",
"egressPayload": "<string>",
"pathPayloadName": "<string>"
}
]
}{
"message": "<string>",
"id": 123,
"title": "<string>"
}{
"message": "<string>",
"id": 123,
"title": "<string>"
}{
"message": "<string>",
"id": 123,
"title": "<string>"
}