diff --git a/docs/synq/core.md b/docs/synq/core.md deleted file mode 100644 index 7076c27..0000000 --- a/docs/synq/core.md +++ /dev/null @@ -1,265 +0,0 @@ -# Protocol Documentation - - -## Table of Contents - -- [synq/core/v1/platforms.proto](#synq_core_v1_platforms-proto) - - [Platform](#synq-core-v1-Platform) - -- [synq/core/v1/entity.proto](#synq_core_v1_entity-proto) - - [Asset](#synq-core-v1-Asset) - - [Entity](#synq-core-v1-Entity) - - [EntityRef](#synq-core-v1-EntityRef) - - [Monitor](#synq-core-v1-Monitor) - - [MonitorSegment](#synq-core-v1-MonitorSegment) - -- [synq/core/v1/entity_type.proto](#synq_core_v1_entity_type-proto) - - [EntityType](#synq-core-v1-EntityType) - -- [Scalar Value Types](#scalar-value-types) - - - - -

Top

- -## synq/core/v1/platforms.proto - - - - - - - -### Platform -Platforms supported by Synq. - -| Name | Number | Description | -| ---- | ------ | ----------- | -| PLATFORM_UNSPECIFIED | 0 | | -| PLATFORM_BIGQUERY | 10 | | -| PLATFORM_LOOKER | 20 | | -| PLATFORM_DBT | 30 | | -| PLATFORM_DBT_CLOUD | 31 | | -| PLATFORM_DBT_SELF_HOSTED | 32 | | -| PLATFORM_SNOWFLAKE | 50 | | -| PLATFORM_REDSHIFT | 80 | | -| PLATFORM_TABLEAU | 110 | | -| PLATFORM_AIRFLOW | 120 | | -| PLATFORM_CLICKHOUSE | 130 | | -| PLATFORM_POSTGRES | 160 | | -| PLATFORM_MYSQL | 170 | | - - - - - - - - - - - -

Top

- -## synq/core/v1/entity.proto - - - - - -### Asset -Entity: Asset. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| asset_path | [string](#string) | | | -| platform | [Platform](#synq-core-v1-Platform) | | | - - - - - - - - -### Entity -Entity in Synq. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| asset | [Asset](#synq-core-v1-Asset) | | | -| monitor | [Monitor](#synq-core-v1-Monitor) | | | -| monitor_segment | [MonitorSegment](#synq-core-v1-MonitorSegment) | | | - - - - - - - - -### EntityRef -Lightweight reference to an Entity - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| path | [string](#string) | | Unique path for entity. | -| type | [EntityType](#synq-core-v1-EntityType) | | Type of entity. | -| name | [string](#string) | optional | Human friendly name. | - - - - - - - - -### Monitor -Entity: Monitor - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| monitor_path | [string](#string) | | | - - - - - - - - -### MonitorSegment -Entity: Monitor Segment - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| monitor_path | [string](#string) | | | -| metric_id | [string](#string) | | | -| segment | [string](#string) | | | - - - - - - - - - - - - - - - - -

Top

- -## synq/core/v1/entity_type.proto - - - - - - - -### EntityType -Type of Entity. -This enum lists all the types currently supported by Synq. - -| Name | Number | Description | -| ---- | ------ | ----------- | -| ENTITY_TYPE_UNSPECIFIED | 0 | | -| ENTITY_TYPE_FOLDER | 1 | | -| ENTITY_TYPE_BQ_PROJECT | 101 | | -| ENTITY_TYPE_BQ_DATASET | 102 | | -| ENTITY_TYPE_BQ_TABLE | 103 | | -| ENTITY_TYPE_BQ_VIEW | 105 | | -| ENTITY_TYPE_LOOKER_LOOK | 201 | | -| ENTITY_TYPE_LOOKER_EXPLORE | 203 | | -| ENTITY_TYPE_LOOKER_VIEW | 207 | | -| ENTITY_TYPE_LOOKER_DASHBOARD | 208 | | -| ENTITY_TYPE_DBT_MODEL | 301 | | -| ENTITY_TYPE_DBT_TEST | 302 | | -| ENTITY_TYPE_DBT_SOURCE | 303 | | -| ENTITY_TYPE_DBT_MACRO | 304 | | -| ENTITY_TYPE_DBT_PROJECT | 306 | | -| ENTITY_TYPE_DBT_METRIC | 307 | | -| ENTITY_TYPE_DBT_SNAPSHOT | 310 | | -| ENTITY_TYPE_DBT_SEED | 311 | | -| ENTITY_TYPE_DBT_ANALYSIS | 312 | | -| ENTITY_TYPE_DBT_EXPOSURE | 313 | | -| ENTITY_TYPE_DBT_GROUP | 314 | | -| ENTITY_TYPE_DBT_CLOUD_ACCOUNT | 351 | | -| ENTITY_TYPE_DBT_CLOUD_PROJECT | 352 | | -| ENTITY_TYPE_DBT_CLOUD_JOB | 353 | | -| ENTITY_TYPE_DBT_CLOUD_JOB_STEP | 354 | | -| ENTITY_TYPE_SNOWFLAKE_PROJECT | 501 | | -| ENTITY_TYPE_SNOWFLAKE_DATASET | 502 | | -| ENTITY_TYPE_SNOWFLAKE_TABLE | 503 | | -| ENTITY_TYPE_SNOWFLAKE_ACCOUNT | 505 | | -| ENTITY_TYPE_SNOWFLAKE_DATABASE | 506 | | -| ENTITY_TYPE_SNOWFLAKE_SCHEMA | 507 | | -| ENTITY_TYPE_SNOWFLAKE_VIEW | 508 | | -| ENTITY_TYPE_REDSHIFT_DATABASE | 801 | | -| ENTITY_TYPE_REDSHIFT_SCHEMA | 802 | | -| ENTITY_TYPE_REDSHIFT_TABLE | 803 | | -| ENTITY_TYPE_REDSHIFT_VIEW | 805 | | -| ENTITY_TYPE_TABLEAU_EMBEDDED | 1101 | | -| ENTITY_TYPE_TABLEAU_PUBLISHED | 1102 | | -| ENTITY_TYPE_TABLEAU_CUSTOM_SQL | 1103 | | -| ENTITY_TYPE_TABLEAU_TABLE | 1104 | | -| ENTITY_TYPE_TABLEAU_SHEET | 1105 | | -| ENTITY_TYPE_TABLEAU_DASHBOARD | 1106 | | -| ENTITY_TYPE_AIRFLOW_DAG | 1201 | | -| ENTITY_TYPE_AIRFLOW_TASK | 1202 | | -| ENTITY_TYPE_CLICKHOUSE_DATABASE | 1301 | | -| ENTITY_TYPE_CLICKHOUSE_SCHEMA | 1302 | | -| ENTITY_TYPE_CLICKHOUSE_TABLE | 1303 | | -| ENTITY_TYPE_CLICKHOUSE_VIEW | 1305 | | -| ENTITY_TYPE_ANOMALY_INTEGRATION | 1401 | | -| ENTITY_TYPE_ANOMALY_MONITOR | 1403 | | -| ENTITY_TYPE_ANOMALY_MONITOR_SEGMENT | 1404 | | -| ENTITY_TYPE_POSTGRES_DATABASE | 1601 | | -| ENTITY_TYPE_POSTGRES_SCHEMA | 1602 | | -| ENTITY_TYPE_POSTGRES_TABLE | 1603 | | -| ENTITY_TYPE_POSTGRES_VIEW | 1605 | | -| ENTITY_TYPE_MYSQL_DATABASE | 1701 | | -| ENTITY_TYPE_MYSQL_SCHEMA | 1702 | | -| ENTITY_TYPE_MYSQL_TABLE | 1703 | | -| ENTITY_TYPE_MYSQL_VIEW | 1705 | | - - - - - - - - - - -## Scalar Value Types - -| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | -| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | -| double | | double | double | float | float64 | double | float | Float | -| float | | float | float | float | float32 | float | float | Float | -| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | -| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | -| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | -| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | -| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | -| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | -| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | - diff --git a/docs/synq/entities.mdx b/docs/synq/entities.mdx new file mode 100644 index 0000000..d34be75 --- /dev/null +++ b/docs/synq/entities.mdx @@ -0,0 +1,1446 @@ + + + + + Protocol Documentation + + + + + + + + + + +

Protocol Documentation

+ +

Table of Contents

+ +
+ +
+ + + +
+

synq/entities/v1/entities_service.proto

Top +
+

+ + +

BatchGetEntitiesRequest

+

BatchGetEntitiesRequest is the request message for the BatchGetEntities method.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
idsIdentifierrepeated

Identifiers of the entities to get.

+ + + + + +

BatchGetEntitiesResponse

+

BatchGetEntitiesResponse is the response message for the BatchGetEntities method.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
entitiesEntityrepeated

The entities that were retrieved.

+ + + + + +

DeleteEntityRequest

+

DeleteEntityRequest is the request message for the DeleteEntity method.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
idIdentifier

Identifier of the entity to delete.

+ + + + + +

DeleteEntityResponse

+

DeleteEntityResponse is the response message for the DeleteEntity method.

+ + + + + +

GetEntityRequest

+

GetEntityRequest is the request message for the GetEntity method.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
idIdentifier

Identifier of the entity to get.

+ + + + + +

GetEntityResponse

+

GetEntityResponse is the response message for the GetEntity method.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
entityEntity

The entity that was retrieved.

+ + + + + +

UpsertEntityRequest

+

UpsertEntityRequest is the request message for the UpsertEntity method.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
entityEntity

The entity to create or update.

+ + + + + +

UpsertEntityResponse

+

UpsertEntityResponse is the response message for the UpsertEntity method.

+ + + + + + + + + + + +

EntitiesService

+

EntitiesService is a service for managing custom entities. Entities can represent

various data platform concepts such as services, consumers, applications or data pipelines

that are not natively available in Synq.

Entities are identified by a unique identifier and can be created, updated, read and deleted.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
GetEntityGetEntityRequestGetEntityResponse

Get specific entity by its identifier.

BatchGetEntitiesBatchGetEntitiesRequestBatchGetEntitiesResponse

Get multiple entities by their identifiers.

UpsertEntityUpsertEntityRequestUpsertEntityResponse

Create or update an entity. If the entity does not exist, it will be created, otherwise it will be updated. Entities are identified and deduplicated by their Identifier in a scope of a given customer workspace.

DeleteEntityDeleteEntityRequestDeleteEntityResponse

Delete an entity by its identifier. If the entity does not exist, it will be a no-op.

+ + + + +
+

synq/entities/v1/entities.proto

Top +
+

+ + +

Entity

+

Entity is the base type for all entities in the system. Its always attached to a given

client workspace and can be uniquely identified by its id.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
workspacestring

Immutable workspace identifier that this entity belongs to.

idIdentifier

Unique identifier for this entity.

namestring

Name of the entity that is displayed to the user.

descriptionstring

Description of the entity that is displayed in relevant contexts.

created_atgoogle.protobuf.Timestamp

Timestamp when the entity was created.

updated_atgoogle.protobuf.Timestamp

Timestamp when the entity was last updated.

deleted_atgoogle.protobuf.Timestamp

Timestamp when the entity was deleted. If this is set, the entity is considered deleted.

synq_pathstring

Return only value. Synq Path to the entity. This is a unique path that can be used to access the entity in the Synq's UI.

synq_catalog_urlstring

Return only value. Synq URL to the entity. This is a unique URL that can be used to access the entity in the Synq's UI.

+ + + + + + + + + + + + + +
+

synq/entities/v1/identifiers.proto

Top +
+

+ + +

AirflowDagIdentifier

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
integration_idstring

Synq integration_id that identifies the Airflow instance

dag_idstring

Airflow dag_id that identifies the DAG

+ + + + + +

AirflowTaskIdentifier

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
integration_idstring

Synq integration_id that identifies the Airflow instance

dag_idstring

Airflow dag_id that identifies the DAG

task_idstring

Airflow task_id that identifies the task within the DAG

+ + + + + +

BigqueryTableIdentifier

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
projectstring

BigQuery project

datasetstring

BigQuery dataset id

tablestring

BigQuery table name

+ + + + + +

ClickhouseTableIdentifier

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
hoststring

Clickhouse host inclusive of port

schemastring

Clickhouse database

tablestring

Clickhouse table

+ + + + + +

CustomIdentifier

+

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
idstring

Id that identifies the custom entity +The Id should be unique within the custom entity Identifier.

+ + + + + +

DatabricksTableIdentifier

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
workspacestring

catalogstring

Databricks catalog

schemastring

Databricks schema

tablestring

Databricks table or view

+ + + + + +

DataproductIdentifier

+

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
idstring

Dataproduct id that identifies the Dataproduct

+ + + + + +

DbtCloudNodeIdentifier

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
project_idstring

Your dbt Cloud project id

account_idstring

Your dbt Cloud account id

node_idstring

Dbt node_id that identifies one of dbt DAG nodes (model, test, etc)

+ + + + + +

DbtCoreNodeIdentifier

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
integration_idstring

Synq integration_id that identifies the dbt Core project

node_idstring

Dbt node_id that identifies one of dbt DAG nodes (model, test, etc)

+ + + + + +

Identifier

+

Identifier is a unique reference to an entity in Synq system. Entity identifiers

are designed to closely mimic identifiers used by data platforms and tools. To construct

an identifier, you need to know the kind of the entity and the ids that you would normally

use to identify it in the data platform or tool. For example, to identify a table in BigQuery,

you would need to know the project, dataset, and table names.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
dbt_core_nodeDbtCoreNodeIdentifier

Dbt node that identifies one of dbt DAG nodes (model, test, etc) in dbt Core project

dbt_cloud_nodeDbtCloudNodeIdentifier

Dbt node that identifies one of dbt DAG nodes (model, test, etc) in dbt Cloud project

bigquery_tableBigqueryTableIdentifier

BigQuery table identifier

snowflake_tableSnowflakeTableIdentifier

Snowflake table identifier

redshift_tableRedshiftTableIdentifier

Redshift table identifier

postgres_tablePostgresTableIdentifier

Postgres table identifier

mysql_tableMysqlTableIdentifier

Mysql table identifier

clickhouse_tableClickhouseTableIdentifier

Clickhouse table identifier

databricks_tableDatabricksTableIdentifier

Databricks table identifier

airflow_dagAirflowDagIdentifier

Airflow DAG identifier

airflow_taskAirflowTaskIdentifier

Airflow task identifier within a given DAG

customCustomIdentifier

Custom identifier to be used with all custom created entities

dataproductDataproductIdentifier

Dataproduct identifier

synq_pathSynqPathIdentifier

SynqPath identifier

+ + + + + +

MysqlTableIdentifier

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
hoststring

Mysql host inclusive of port

schemastring

Mysql database

tablestring

Mysql table

+ + + + + +

PostgresTableIdentifier

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
hoststring

Postgres host inclusive of port

databasestring

Postgres database

schemastring

Postgres schema

tablestring

Postgres table

+ + + + + +

RedshiftTableIdentifier

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
clusterstring

Redshift cluster

databasestring

Redshift database

schemastring

Redshift schema

tablestring

Redshift table

+ + + + + +

SnowflakeTableIdentifier

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
accountstring

Snowflake account

databasestring

Snowflake database

schemastring

Snowflake schema

tablestring

Snowflake table

+ + + + + +

SynqPathIdentifier

+

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
pathstring

Synq path that identifies the Synq entity, needs to be one of supported paths

+ + + + + + + + + + + + + +

Scalar Value Types

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
.proto TypeNotesC++JavaPythonGoC#PHPRuby
doubledoubledoublefloatfloat64doublefloatFloat
floatfloatfloatfloatfloat32floatfloatFloat
int32Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.int32intintint32intintegerBignum or Fixnum (as required)
int64Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.int64longint/longint64longinteger/stringBignum
uint32Uses variable-length encoding.uint32intint/longuint32uintintegerBignum or Fixnum (as required)
uint64Uses variable-length encoding.uint64longint/longuint64ulonginteger/stringBignum or Fixnum (as required)
sint32Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.int32intintint32intintegerBignum or Fixnum (as required)
sint64Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.int64longint/longint64longinteger/stringBignum
fixed32Always four bytes. More efficient than uint32 if values are often greater than 2^28.uint32intintuint32uintintegerBignum or Fixnum (as required)
fixed64Always eight bytes. More efficient than uint64 if values are often greater than 2^56.uint64longint/longuint64ulonginteger/stringBignum
sfixed32Always four bytes.int32intintint32intintegerBignum or Fixnum (as required)
sfixed64Always eight bytes.int64longint/longint64longinteger/stringBignum
boolboolbooleanbooleanboolboolbooleanTrueClass/FalseClass
stringA string must always contain UTF-8 encoded or 7-bit ASCII text.stringStringstr/unicodestringstringstringString (UTF-8)
bytesMay contain any arbitrary sequence of bytes.stringByteStringstr[]byteByteStringstringString (ASCII-8BIT)
+ + + diff --git a/docs/synq/example.md b/docs/synq/example.md deleted file mode 100644 index 628cc61..0000000 --- a/docs/synq/example.md +++ /dev/null @@ -1,535 +0,0 @@ -# Protocol Documentation - - -## Table of Contents - -- [synq/example/v2/example_service.proto](#synq_example_v2_example_service-proto) - - [AddExampleRequest](#synq-example-v2-AddExampleRequest) - - [AddExampleResponse](#synq-example-v2-AddExampleResponse) - - [ExampleResponse](#synq-example-v2-ExampleResponse) - - [GetExampleRequest](#synq-example-v2-GetExampleRequest) - - [GetExampleResponse](#synq-example-v2-GetExampleResponse) - - [ListExamplesRequest](#synq-example-v2-ListExamplesRequest) - - [ListExamplesResponse](#synq-example-v2-ListExamplesResponse) - - [RemoveExampleRequest](#synq-example-v2-RemoveExampleRequest) - - [RemoveExampleResponse](#synq-example-v2-RemoveExampleResponse) - - [UpdateExampleRequest](#synq-example-v2-UpdateExampleRequest) - - [UpdateExampleResponse](#synq-example-v2-UpdateExampleResponse) - - - [ExampleService](#synq-example-v2-ExampleService) - -- [synq/example/v2/example.proto](#synq_example_v2_example-proto) - - [Example](#synq-example-v2-Example) - -- [synq/example/v1/example_service.proto](#synq_example_v1_example_service-proto) - - [AddExampleRequest](#synq-example-v1-AddExampleRequest) - - [AddExampleResponse](#synq-example-v1-AddExampleResponse) - - [ExampleResponse](#synq-example-v1-ExampleResponse) - - [GetExampleRequest](#synq-example-v1-GetExampleRequest) - - [GetExampleResponse](#synq-example-v1-GetExampleResponse) - - [ListExamplesRequest](#synq-example-v1-ListExamplesRequest) - - [ListExamplesResponse](#synq-example-v1-ListExamplesResponse) - - [RemoveExampleRequest](#synq-example-v1-RemoveExampleRequest) - - [RemoveExampleResponse](#synq-example-v1-RemoveExampleResponse) - - [UpdateExampleRequest](#synq-example-v1-UpdateExampleRequest) - - [UpdateExampleResponse](#synq-example-v1-UpdateExampleResponse) - - - [ExampleService](#synq-example-v1-ExampleService) - -- [synq/example/v1/example.proto](#synq_example_v1_example-proto) - - [Example](#synq-example-v1-Example) - -- [Scalar Value Types](#scalar-value-types) - - - - -

Top

- -## synq/example/v2/example_service.proto - - - - - -### AddExampleRequest -AddExampleRequest contains the parameters required to create an example. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| text | [string](#string) | | The example itself. | -| description | [string](#string) | optional | Optional description of the example. | -| is_visible | [bool](#bool) | | Whether the example is visible to users. | - - - - - - - - -### AddExampleResponse -Response contains the created example. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| example | [Example](#synq-example-v2-Example) | | | - - - - - - - - -### ExampleResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| example | [Example](#synq-example-v2-Example) | | | - - - - - - - - -### GetExampleRequest -GetExampleRequest gets an example by its ID. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [string](#string) | | | - - - - - - - - -### GetExampleResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| example | [Example](#synq-example-v2-Example) | | | - - - - - - - - -### ListExamplesRequest -ListExamplesRequest streams examples from the server. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| ids | [string](#string) | repeated | | - - - - - - - - -### ListExamplesResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| example | [Example](#synq-example-v2-Example) | | | - - - - - - - - -### RemoveExampleRequest -RemoveExampleRequest removes an example by its ID. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [string](#string) | | | - - - - - - - - -### RemoveExampleResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| success | [bool](#bool) | | | - - - - - - - - -### UpdateExampleRequest -UpdateExampleRequest contains updateable fields inside an example. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| text | [string](#string) | optional | Optional update of the example text. | -| description | [string](#string) | optional | Optional update of the example description. | -| is_visible | [bool](#bool) | optional | Optional update of example visibility. | - - - - - - - - -### UpdateExampleResponse -Response with updated example. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| example | [Example](#synq-example-v2-Example) | | | - - - - - - - - - - - - - - -### ExampleService -ExamplesService is a sample service to display how documentation in protos will work. -The service implements a basic CRUD API and contains server streaming example. - -| Method Name | Request Type | Response Type | Description | -| ----------- | ------------ | ------------- | ------------| -| AddExample | [AddExampleRequest](#synq-example-v2-AddExampleRequest) | [AddExampleResponse](#synq-example-v2-AddExampleResponse) | AddExample adds the given example to the system. | -| UpdateExample | [UpdateExampleRequest](#synq-example-v2-UpdateExampleRequest) | [UpdateExampleResponse](#synq-example-v2-UpdateExampleResponse) | UpdateExample updates the given example. Throws an error if the example was not found. | -| GetExample | [GetExampleRequest](#synq-example-v2-GetExampleRequest) | [GetExampleResponse](#synq-example-v2-GetExampleResponse) | GetExample returns the requested example. | -| ListExamples | [ListExamplesRequest](#synq-example-v2-ListExamplesRequest) | [ListExamplesResponse](#synq-example-v2-ListExamplesResponse) stream | ListExamples streams the requested examples. | -| RemoveExample | [RemoveExampleRequest](#synq-example-v2-RemoveExampleRequest) | [RemoveExampleResponse](#synq-example-v2-RemoveExampleResponse) | RemoveExample removes the provided example from the system. Fails silently if the example was not found. | - - - - - - -

Top

- -## synq/example/v2/example.proto - - - - - -### Example -Example is the core model of this package. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [string](#string) | | `id` is generated by the system when a new example is created. It is required to refer to an example in any future operations (like update or remove). | -| text | [string](#string) | | The example itself. | -| description | [string](#string) | optional | Optional description of the example. | -| is_visible | [bool](#bool) | | Whether the example is visible to users. | -| created_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | Example creation time. | -| updated_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | Example last update time. | - - - - - - - - - - - - - - - - -

Top

- -## synq/example/v1/example_service.proto - - - - - -### AddExampleRequest -AddExampleRequest contains the parameters required to create an example. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| text | [string](#string) | | The example itself. | -| description | [string](#string) | optional | Optional description of the example. | - - - - - - - - -### AddExampleResponse -Response contains the created example. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| example | [Example](#synq-example-v1-Example) | | | - - - - - - - - -### ExampleResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| example | [Example](#synq-example-v1-Example) | | | - - - - - - - - -### GetExampleRequest -GetExampleRequest gets an example by its ID. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [string](#string) | | | - - - - - - - - -### GetExampleResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| example | [Example](#synq-example-v1-Example) | | | - - - - - - - - -### ListExamplesRequest -ListExamplesRequest streams examples from the server. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| ids | [string](#string) | repeated | | - - - - - - - - -### ListExamplesResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| example | [Example](#synq-example-v1-Example) | | | - - - - - - - - -### RemoveExampleRequest -RemoveExampleRequest removes an example by its ID. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [string](#string) | | | - - - - - - - - -### RemoveExampleResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| success | [bool](#bool) | | | - - - - - - - - -### UpdateExampleRequest -UpdateExampleRequest contains updateable fields inside an example. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [string](#string) | | Id of the example to update | -| text | [string](#string) | optional | Optional update of the example text. | -| description | [string](#string) | optional | Optional update of the example description. | - - - - - - - - -### UpdateExampleResponse -Response with updated example. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| example | [Example](#synq-example-v1-Example) | | | - - - - - - - - - - - - - - -### ExampleService -ExamplesService is a sample service to display how documentation in protos will work. -The service implements a basic CRUD API and contains server streaming example. - -| Method Name | Request Type | Response Type | Description | -| ----------- | ------------ | ------------- | ------------| -| AddExample | [AddExampleRequest](#synq-example-v1-AddExampleRequest) | [AddExampleResponse](#synq-example-v1-AddExampleResponse) | AddExample adds the given example to the system. | -| UpdateExample | [UpdateExampleRequest](#synq-example-v1-UpdateExampleRequest) | [UpdateExampleResponse](#synq-example-v1-UpdateExampleResponse) | UpdateExample updates the given example. Throws an error if the example was not found. | -| GetExample | [GetExampleRequest](#synq-example-v1-GetExampleRequest) | [GetExampleResponse](#synq-example-v1-GetExampleResponse) | GetExample returns the requested example. | -| ListExamples | [ListExamplesRequest](#synq-example-v1-ListExamplesRequest) | [ListExamplesResponse](#synq-example-v1-ListExamplesResponse) stream | ListExamples streams the requested examples. | -| RemoveExample | [RemoveExampleRequest](#synq-example-v1-RemoveExampleRequest) | [RemoveExampleResponse](#synq-example-v1-RemoveExampleResponse) | RemoveExample removes the provided example from the system. Fails silently if the example was not found. | - - - - - - -

Top

- -## synq/example/v1/example.proto - - - - - -### Example -Example is the core model of this package. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [string](#string) | | `id` is generated by the system when a new example is created. It is required to refer to an example in any future operations (like update or remove). | -| text | [string](#string) | | The example itself. | -| description | [string](#string) | optional | Optional description of the example. | -| created_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | Example creation time. | -| updated_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | Example last update time. | - - - - - - - - - - - - - - - -## Scalar Value Types - -| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | -| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | -| double | | double | double | float | float64 | double | float | Float | -| float | | float | float | float | float32 | float | float | Float | -| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | -| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | -| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | -| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | -| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | -| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | -| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | - diff --git a/docs/synq/lineage.mdx b/docs/synq/lineage.mdx new file mode 100644 index 0000000..3aa7244 --- /dev/null +++ b/docs/synq/lineage.mdx @@ -0,0 +1,1193 @@ + + + + + Protocol Documentation + + + + + + + + + + +

Protocol Documentation

+ +

Table of Contents

+ +
+ +
+ + + +
+

synq/lineage/v1/relationships.proto

Top +
+

+ + +

Relationship

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
upstreamsynq.entities.v1.Identifier

downstreamsynq.entities.v1.Identifier

+ + + + + + + + + + + + + +
+

synq/lineage/v1/lineage.proto

Top +
+

+ + +

CllDetails

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
columnsColumnrepeated

Column details for CLL.

cll_stateCllState

State of the CLL parse. UNSPECIFIED if CLL was not requested.

cll_messagesstringrepeated

Messages related to CLL. +e.g. Description of parse errors, etc.

+ + + + + +

Column

+

Column in a table-like asset (used in CLL mode).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
column_idstring

ID string for the column. This is the parsed column name.

namestringoptional

Original column name as fetched from the table.

native_typestringoptional

Column type as fetched from the table.

+ + + + + +

ColumnDependency

+

Indicates data flow between columns.

Source columns are used to compute value of target columns.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
source_node_idxuint32

Index of source node in the lineage nodes list.

source_node_column_idstring

target_node_idxuint32

Index of target node in the lineage nodes list.

target_node_column_idstring

+ + + + + +

Lineage

+

Lineage defines the lineage of table-like entities.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
nodesLineageNoderepeated

Nodes in the lineage with their identities and columns.

node_dependenciesNodeDependencyrepeated

All edges in the lineage between nodes. +This can be parsed to create a graph of all the nodes.

is_cllbool

Indicates whether the lineage was filtered for column level lineage (CLL).

column_dependenciesColumnDependencyrepeated

Dependencies between columns. Populated only for CLL.

+ + + + + +

LineageNode

+

Node in a lineage graph representing one or more entities (e.g. database table).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
idssynq.entities.v1.Identifierrepeated

All entities which have the same identity as this node. Must be at least one item. +These are sorted by closeness to the type of the start point entities. +e.g. if requesting lineage of a DBT source, first entity should be from DBT, similarly when viewing table it will be other tables.

positionNodePosition

Position of the node in the lineage.

cll_detailsCllDetailsoptional

Populated only for Column Level Lineage (CLL).

+ + + + + +

NodeDependency

+

Indicates data flow between nodes.

Source nodes are used to compute value of target nodes.

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
source_node_idxuint32

Index of source node in the lineage nodes list.

target_node_idxuint32

Index of target node in the lineage nodes list.

+ + + + + + + +

CllState

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
CLL_STATE_UNSPECIFIED0

Unspecified state.

CLL_STATE_PARSE_FAILED1

Parsing of the asset SQL failed. No upstream dependencies can be found.

CLL_STATE_EXTRACTION_FAILED2

Extraction of the asset SQL failed. Some unsupported SQL features may be used. Some details might be missing.

CLL_STATE_RESOLUTION_FAILED3

Not all columns or tables were found upstream, lineage is not complete.

CLL_STATE_OK10

No known issues present.

+ +

NodePosition

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
NODE_POSITION_UNSPECIFIED0

NODE_POSITION_START_NODE1

Node is one of the requested start point.

NODE_POSITION_UPSTREAM2

Node is upstream of the requested start point.

NODE_POSITION_DOWNSTREAM3

Node is downstream of the requested start point.

+ + + + + + + +
+

synq/lineage/v1/relationships_service.proto

Top +
+

+ + +

DeleteRelationshipsRequest

+

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
relationshipsRelationshiprepeated

+ + + + + +

DeleteRelationshipsResponse

+

+ + + + + +

UpsertRelationshipsRequest

+

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
relationshipsRelationshiprepeated

+ + + + + +

UpsertRelationshipsResponse

+

+ + + + + + + + + + + +

RelationshipsService

+

RelationshipsService allow management of relationships between entities. Relationships can

be created, updated, and deleted between 2 custom entities, or between a custom entity and Synq native entity.enum

There is no option to create relationships between 2 Synq native entities (dbt model, BI dashboard, etc.).

+ + + + + + + + + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
UpsertRelationshipsUpsertRelationshipsRequestUpsertRelationshipsResponse

Create or update relationships between entities. If the relationship already exists, it will be updated, otherwise it will be created.

DeleteRelationshipsDeleteRelationshipsRequestDeleteRelationshipsResponse

Delete relationships between entities. If the relationship does not exist, it will be ignored.

+ + + + +
+

synq/lineage/v1/lineage_service.proto

Top +
+

+ + +

EntitiesStartPoint

+

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
entitiessynq.entities.v1.Identifierrepeated

+ + + + + +

EntityColumnsStartPoint

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
idsynq.entities.v1.Identifier

column_namesstringrepeated

+ + + + + +

GetLineageRequest

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
lineage_directionLineageDirection

start_pointGetLineageStartPoint

max_depthint32optional

+ + + + + +

GetLineageResponse

+

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
lineageLineage

+ + + + + +

GetLineageStartPoint

+

Possible starting points to get lineage from.

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
entitiesEntitiesStartPoint

entity_columnsEntityColumnsStartPoint

+ + + + + + + +

LineageDirection

+

Direction of the lineage to query.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
LINEAGE_DIRECTION_UNSPECIFIED0

LINEAGE_DIRECTION_UPSTREAM1

LINEAGE_DIRECTION_DOWNSTREAM2

LINEAGE_DIRECTION_UPSTREAM_DOWNSTREAM3

+ + + + + +

LineageService

+

LineageService allows you to fetch:

* Entity level lineage from a starting point of one or more entities.

* Column Level lineage from a starting point of multiple columns of a single entity.

+ + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
GetLineageGetLineageRequestGetLineageResponse

+ + + + +

Scalar Value Types

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
.proto TypeNotesC++JavaPythonGoC#PHPRuby
doubledoubledoublefloatfloat64doublefloatFloat
floatfloatfloatfloatfloat32floatfloatFloat
int32Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.int32intintint32intintegerBignum or Fixnum (as required)
int64Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.int64longint/longint64longinteger/stringBignum
uint32Uses variable-length encoding.uint32intint/longuint32uintintegerBignum or Fixnum (as required)
uint64Uses variable-length encoding.uint64longint/longuint64ulonginteger/stringBignum or Fixnum (as required)
sint32Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.int32intintint32intintegerBignum or Fixnum (as required)
sint64Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.int64longint/longint64longinteger/stringBignum
fixed32Always four bytes. More efficient than uint32 if values are often greater than 2^28.uint32intintuint32uintintegerBignum or Fixnum (as required)
fixed64Always eight bytes. More efficient than uint64 if values are often greater than 2^56.uint64longint/longuint64ulonginteger/stringBignum
sfixed32Always four bytes.int32intintint32intintegerBignum or Fixnum (as required)
sfixed64Always eight bytes.int64longint/longint64longinteger/stringBignum
boolboolbooleanbooleanboolboolbooleanTrueClass/FalseClass
stringA string must always contain UTF-8 encoded or 7-bit ASCII text.stringStringstr/unicodestringstringstringString (UTF-8)
bytesMay contain any arbitrary sequence of bytes.stringByteStringstr[]byteByteStringstringString (ASCII-8BIT)
+ + + diff --git a/docs/synq/schemas.md b/docs/synq/schemas.md deleted file mode 100644 index 84aafb9..0000000 --- a/docs/synq/schemas.md +++ /dev/null @@ -1,322 +0,0 @@ -# Protocol Documentation - - -## Table of Contents - -- [synq/schemas/v1/lineage.proto](#synq_schemas_v1_lineage-proto) - - [CllDetails](#synq-schemas-v1-CllDetails) - - [Column](#synq-schemas-v1-Column) - - [ColumnDependency](#synq-schemas-v1-ColumnDependency) - - [Lineage](#synq-schemas-v1-Lineage) - - [LineageNode](#synq-schemas-v1-LineageNode) - - [NodeDependency](#synq-schemas-v1-NodeDependency) - - - [CllState](#synq-schemas-v1-CllState) - - [NodePosition](#synq-schemas-v1-NodePosition) - -- [synq/schemas/v1/lineage_service.proto](#synq_schemas_v1_lineage_service-proto) - - [EntitiesStartPoint](#synq-schemas-v1-EntitiesStartPoint) - - [EntityColumnsStartPoint](#synq-schemas-v1-EntityColumnsStartPoint) - - [GetLineageRequest](#synq-schemas-v1-GetLineageRequest) - - [GetLineageResponse](#synq-schemas-v1-GetLineageResponse) - - [GetLineageStartPoint](#synq-schemas-v1-GetLineageStartPoint) - - - [LineageDirection](#synq-schemas-v1-LineageDirection) - - - [LineageService](#synq-schemas-v1-LineageService) - -- [Scalar Value Types](#scalar-value-types) - - - - -

Top

- -## synq/schemas/v1/lineage.proto - - - - - -### CllDetails - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| columns | [Column](#synq-schemas-v1-Column) | repeated | Column details for CLL. | -| cll_state | [CllState](#synq-schemas-v1-CllState) | | State of the CLL parse. UNSPECIFIED if CLL was not requested. | -| cll_messages | [string](#string) | repeated | Messages related to CLL. e.g. Description of parse errors, etc. | - - - - - - - - -### Column -Column in a table-like asset (used in CLL mode). - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| column_id | [string](#string) | | ID string for the column. This is the parsed column name. | -| name | [string](#string) | optional | Original column name as fetched from the table. | -| native_type | [string](#string) | optional | Column type as fetched from the table. | - - - - - - - - -### ColumnDependency -Indicates data flow between columns. -Source columns are used to compute value of target columns. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| source_node_idx | [uint32](#uint32) | | Index of source node in the lineage nodes list. | -| source_node_column_id | [string](#string) | | | -| target_node_idx | [uint32](#uint32) | | Index of target node in the lineage nodes list. | -| target_node_column_id | [string](#string) | | | - - - - - - - - -### Lineage -Lineage defines the lineage of table-like entities. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| nodes | [LineageNode](#synq-schemas-v1-LineageNode) | repeated | Nodes in the lineage with their identities and columns. | -| node_dependencies | [NodeDependency](#synq-schemas-v1-NodeDependency) | repeated | All edges in the lineage between nodes. This can be parsed to create a graph of all the nodes. | -| is_cll | [bool](#bool) | | Indicates whether the lineage was filtered for column level lineage (CLL). | -| column_dependencies | [ColumnDependency](#synq-schemas-v1-ColumnDependency) | repeated | Dependencies between columns. Populated only for CLL. | - - - - - - - - -### LineageNode -Node in a lineage graph representing one or more entiities (e.g. database table). - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| entities | [synq.core.v1.EntityRef](#synq-core-v1-EntityRef) | repeated | All entities which have the same identity as this node. Must be at least one item. These are sorted by closeness to the type of the start point entities. e.g. if requesting lineage of a DBT source, first entity should be from DBT, similarly when viewing table it will be other tables. | -| position | [NodePosition](#synq-schemas-v1-NodePosition) | | Position of the node in the lineage. | -| cll_details | [CllDetails](#synq-schemas-v1-CllDetails) | optional | Populated only for Column Level Lineage (CLL). | - - - - - - - - -### NodeDependency -Indicates data flow between nodes. -Source nodes are used to compute value of target nodes. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| source_node_idx | [uint32](#uint32) | | Index of source node in the lineage nodes list. | -| target_node_idx | [uint32](#uint32) | | Index of target node in the lineage nodes list. | - - - - - - - - - - -### CllState - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| CLL_STATE_UNSPECIFIED | 0 | Unspecified state. | -| CLL_STATE_PARSE_FAILED | 1 | Parsing of the asset SQL failed. No upstream dependencies can be found. | -| CLL_STATE_EXTRACTION_FAILED | 2 | Extraction of the asset SQL failed. Some unsupported SQL features may be used. Some details might be missing. | -| CLL_STATE_RESOLUTION_FAILED | 3 | Not all columns or tables were found upstream, lineage is not complete. | -| CLL_STATE_OK | 10 | No known issues present. | - - - - - -### NodePosition - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| NODE_POSITION_UNSPECIFIED | 0 | | -| NODE_POSITION_START_NODE | 1 | Node is one of the requested start point. | -| NODE_POSITION_UPSTREAM | 2 | Node is upstream of the requested start point. | -| NODE_POSITION_DOWNSTREAM | 3 | Node is downstream of the requested start point. | - - - - - - - - - - - -

Top

- -## synq/schemas/v1/lineage_service.proto - - - - - -### EntitiesStartPoint - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| entities | [synq.core.v1.EntityRef](#synq-core-v1-EntityRef) | repeated | | - - - - - - - - -### EntityColumnsStartPoint - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| entitiy | [synq.core.v1.EntityRef](#synq-core-v1-EntityRef) | | | -| column_ids | [string](#string) | repeated | | - - - - - - - - -### GetLineageRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| lineage_direction | [LineageDirection](#synq-schemas-v1-LineageDirection) | | | -| start_point | [GetLineageStartPoint](#synq-schemas-v1-GetLineageStartPoint) | | | -| max_depth | [int32](#int32) | optional | | - - - - - - - - -### GetLineageResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| lineage | [Lineage](#synq-schemas-v1-Lineage) | | | - - - - - - - - -### GetLineageStartPoint -Possible starting points to get lineage from. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| entities | [EntitiesStartPoint](#synq-schemas-v1-EntitiesStartPoint) | | | -| entity_columns | [EntityColumnsStartPoint](#synq-schemas-v1-EntityColumnsStartPoint) | | | - - - - - - - - - - -### LineageDirection -Direction of the lineage to query. - -| Name | Number | Description | -| ---- | ------ | ----------- | -| LINEAGE_DIRECTION_UNSPECIFIED | 0 | | -| LINEAGE_DIRECTION_UPSTREAM | 1 | | -| LINEAGE_DIRECTION_DOWNSTREAM | 2 | | -| LINEAGE_DIRECTION_UPSTREAM_DOWNSTREAM | 3 | | - - - - - - - - - -### LineageService -LineageService allows you to fetch: -* Entity level lineage from a starting point of one or more entities. -* Column Level lineage from a starting point of multiple columns of a single entity. - -| Method Name | Request Type | Response Type | Description | -| ----------- | ------------ | ------------- | ------------| -| GetLineage | [GetLineageRequest](#synq-schemas-v1-GetLineageRequest) | [GetLineageResponse](#synq-schemas-v1-GetLineageResponse) | | - - - - - -## Scalar Value Types - -| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | -| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | -| double | | double | double | float | float64 | double | float | Float | -| float | | float | float | float | float32 | float | float | Float | -| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | -| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | -| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | -| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | -| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | -| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | -| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | - diff --git a/docs/synq/status.mdx b/docs/synq/status.mdx new file mode 100644 index 0000000..214164f --- /dev/null +++ b/docs/synq/status.mdx @@ -0,0 +1,984 @@ + + + + + Protocol Documentation + + + + + + + + + + +

Protocol Documentation

+ +

Table of Contents

+ +
+ +
+ + + +
+

synq/status/v1/entity_incidents_service.proto

Top +
+

+ + +

BatchGetIncidentsRequest

+

BatchGetIncidentsRequest is the request message for the BatchGetIssues method.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
requestsGetIncidentsRequestrepeated

+ + + + + +

BatchGetIncidentsResponse

+

BatchGetIncidentsResponse is the response message for the BatchGetIssues method.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
responsesGetIncidentsResponserepeated

+ + + + + +

GetIncidentsRequest

+

GetIncidentsRequest is the request message for the GetEntity method.

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
idsynq.entities.v1.Identifier

Identifier of the entity to get incidents for.

fetch_upstream_incidentsbool

Retrieve incidents of upstream entities.

+ + + + + +

GetIncidentsResponse

+

GetIncidentsResponse is the response message for the GetEntity method.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
idsynq.entities.v1.Identifier

Identifier of the entity.

entity_open_incidentsEntityIncidentrepeated

Open incident associated with the entity requested.

upstream_open_incidentsEntityIncidentrepeated

Open incidents associated with the upstream entities if requested.

+ + + + + + + + + + + +

EntityIncidentsService

+

EntityIncidentsService is the service which retrieves entity status.

+ + + + + + + + + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
GetIncidentsGetIncidentsRequestGetIncidentsResponse

Get specific entity status by its identifier.

BatchGetIncidentsBatchGetIncidentsRequestBatchGetIncidentsResponse

Get multiple entity statuses by their identifiers.

+ + + + +
+

synq/status/v1/entity_issues_service.proto

Top +
+

+ + +

BatchGetIssuesStatusRequest

+

BatchGetIssuesStatusRequest is the request message for the BatchGetIssues method.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
requestsGetIssuesStatusRequestrepeated

+ + + + + +

BatchGetIssuesStatusResponse

+

BatchGetIssuesStatusResponse is the response message for the BatchGetIssues method.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
responsesGetIssuesStatusResponserepeated

+ + + + + +

GetIssuesStatusRequest

+

GetIssuesStatusRequest is the request message for the GetEntity method.

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
idsynq.entities.v1.Identifier

Identifier of the entity to get status for.

fetch_upstream_statusbool

Retrieve status of upstream entities.

+ + + + + +

GetIssuesStatusResponse

+

GetIssuesStatusResponse is the response message for the GetEntity method.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
idsynq.entities.v1.Identifier

Identifier of the entity.

entity_issues_statusIssueStatus

Status of the entity requested.

entity_issues_summaryGetIssuesStatusResponse.IssuesSummary

upstream_issues_statusIssueStatus

Optionally, the status of all upstream entities.

upstream_issues_summaryGetIssuesStatusResponse.IssuesSummary

+ + + + + +

GetIssuesStatusResponse.IssuesSummary

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
total_countint32

Number of issues for the entity.

warn_countint32

Number of issues for the entity with status 'warn'.

error_countint32

Number of issues for the entity with status 'error'.

critical_countint32

Number of issues for the entity with status 'critical'.

+ + + + + + + + + + + +

EntityIssuesService

+

EntityIssuesService is the service which retrieves entity issues status.

+ + + + + + + + + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
GetIssuesStatusGetIssuesStatusRequestGetIssuesStatusResponse

Get specific entity status by its identifier.

BatchGetIssuesStatusBatchGetIssuesStatusRequestBatchGetIssuesStatusResponse

Get multiple entity statuses by their identifiers.

+ + + + +
+

synq/status/v1/entity_incidents.proto

Top +
+

+ + +

EntityIncident

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
idstring

Unique identifier of the incident.

urlstring

URL of the incident.

namestring

Name of the incident give by the user.

created_bystring

Information about author of the incident.

created_atgoogle.protobuf.Timestamp

Time when the incident was created.

updated_bystring

Information about the user who last updated the incident.

updated_atgoogle.protobuf.Timestamp

Time when the incident was last updated.

is_resolvedbool

Indicates if all issues inside the incident are resolved.

+ + + + + + + + + + + + + +
+

synq/status/v1/entity_issues.proto

Top +
+

+ + + + +

IssueStatus

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
ISSUE_STATUS_UNSPECIFIED0

ISSUE_STATUS_OK10

ISSUE_STATUS_WARN20

ISSUE_STATUS_ERROR30

ISSUE_STATUS_CRITICAL40

+ + + + + + + +

Scalar Value Types

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
.proto TypeNotesC++JavaPythonGoC#PHPRuby
doubledoubledoublefloatfloat64doublefloatFloat
floatfloatfloatfloatfloat32floatfloatFloat
int32Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.int32intintint32intintegerBignum or Fixnum (as required)
int64Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.int64longint/longint64longinteger/stringBignum
uint32Uses variable-length encoding.uint32intint/longuint32uintintegerBignum or Fixnum (as required)
uint64Uses variable-length encoding.uint64longint/longuint64ulonginteger/stringBignum or Fixnum (as required)
sint32Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.int32intintint32intintegerBignum or Fixnum (as required)
sint64Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.int64longint/longint64longinteger/stringBignum
fixed32Always four bytes. More efficient than uint32 if values are often greater than 2^28.uint32intintuint32uintintegerBignum or Fixnum (as required)
fixed64Always eight bytes. More efficient than uint64 if values are often greater than 2^56.uint64longint/longuint64ulonginteger/stringBignum
sfixed32Always four bytes.int32intintint32intintegerBignum or Fixnum (as required)
sfixed64Always eight bytes.int64longint/longint64longinteger/stringBignum
boolboolbooleanbooleanboolboolbooleanTrueClass/FalseClass
stringA string must always contain UTF-8 encoded or 7-bit ASCII text.stringStringstr/unicodestringstringstringString (UTF-8)
bytesMay contain any arbitrary sequence of bytes.stringByteStringstr[]byteByteStringstringString (ASCII-8BIT)
+ + + diff --git a/docs/synq/v1.mdx b/docs/synq/v1.mdx new file mode 100644 index 0000000..7c38246 --- /dev/null +++ b/docs/synq/v1.mdx @@ -0,0 +1,499 @@ + + + + + Protocol Documentation + + + + + + + + + + +

Protocol Documentation

+ +

Table of Contents

+ +
+ +
+ + + +
+

synq/v1/scope_authorization.proto

Top +
+

+ + +

ScopeAuthorization

+

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
scopesScoperepeated

+ + + + + + + +

Scope

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
SCOPE_UNSPECIFIED0

SCOPE_ENTITY_READ1

SCOPE_ENTITY_EDIT2

SCOPE_LINEAGE_READ10

SCOPE_LINEAGE_EDIT11

SCOPE_STATUS_READ20

+ + + +

File-level Extensions

+ + + + + + + + + + + + + + + +
ExtensionTypeBaseNumberDescription
scope_authorizationScopeAuthorization.google.protobuf.MethodOptions50010

+ + + + + +

Scalar Value Types

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
.proto TypeNotesC++JavaPythonGoC#PHPRuby
doubledoubledoublefloatfloat64doublefloatFloat
floatfloatfloatfloatfloat32floatfloatFloat
int32Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.int32intintint32intintegerBignum or Fixnum (as required)
int64Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.int64longint/longint64longinteger/stringBignum
uint32Uses variable-length encoding.uint32intint/longuint32uintintegerBignum or Fixnum (as required)
uint64Uses variable-length encoding.uint64longint/longuint64ulonginteger/stringBignum or Fixnum (as required)
sint32Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.int32intintint32intintegerBignum or Fixnum (as required)
sint64Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.int64longint/longint64longinteger/stringBignum
fixed32Always four bytes. More efficient than uint32 if values are often greater than 2^28.uint32intintuint32uintintegerBignum or Fixnum (as required)
fixed64Always eight bytes. More efficient than uint64 if values are often greater than 2^56.uint64longint/longuint64ulonginteger/stringBignum
sfixed32Always four bytes.int32intintint32intintegerBignum or Fixnum (as required)
sfixed64Always eight bytes.int64longint/longint64longinteger/stringBignum
boolboolbooleanbooleanboolboolbooleanTrueClass/FalseClass
stringA string must always contain UTF-8 encoded or 7-bit ASCII text.stringStringstr/unicodestringstringstringString (UTF-8)
bytesMay contain any arbitrary sequence of bytes.stringByteStringstr[]byteByteStringstringString (ASCII-8BIT)
+ + + diff --git a/protos/synq/core/v1/entity.proto b/protos/synq/core/v1/entity.proto deleted file mode 100644 index 180714d..0000000 --- a/protos/synq/core/v1/entity.proto +++ /dev/null @@ -1,42 +0,0 @@ -syntax = "proto3"; - -package synq.core.v1; - -import "synq/core/v1/entity_type.proto"; -import "synq/core/v1/platforms.proto"; - -option go_package = "github.com/getsynq/api/core/v1"; - -// Lightweight reference to an Entity -message EntityRef { - string path = 1; // Unique path for entity. - EntityType type = 2; // Type of entity. - optional string name = 3; // Human friendly name. -} - -// Entity in Synq. -message Entity { - oneof data { - Asset asset = 1; - Monitor monitor = 2; - MonitorSegment monitor_segment = 3; - } -} - -// Entity: Asset. -message Asset { - string asset_path = 1; - Platform platform = 2; -} - -// Entity: Monitor -message Monitor { - string monitor_path = 1; -} - -// Entity: Monitor Segment -message MonitorSegment { - string monitor_path = 1; - string metric_id = 2; - string segment = 3; -} diff --git a/protos/synq/core/v1/entity_type.proto b/protos/synq/core/v1/entity_type.proto deleted file mode 100644 index 8ae820d..0000000 --- a/protos/synq/core/v1/entity_type.proto +++ /dev/null @@ -1,103 +0,0 @@ -syntax = "proto3"; - -package synq.core.v1; - -option go_package = "github.com/getsynq/api/core/v1"; - -// Type of Entity. -// This enum lists all the types currently supported by Synq. -enum EntityType { - ENTITY_TYPE_UNSPECIFIED = 0; - ENTITY_TYPE_FOLDER = 1; - - // BIGQUERY 1XX - - ENTITY_TYPE_BQ_PROJECT = 101; - ENTITY_TYPE_BQ_DATASET = 102; - ENTITY_TYPE_BQ_TABLE = 103; - ENTITY_TYPE_BQ_VIEW = 105; - - // LOOKER 2XX - - ENTITY_TYPE_LOOKER_LOOK = 201; - ENTITY_TYPE_LOOKER_EXPLORE = 203; - ENTITY_TYPE_LOOKER_VIEW = 207; - ENTITY_TYPE_LOOKER_DASHBOARD = 208; - - // DBT 3XX - - ENTITY_TYPE_DBT_MODEL = 301; - ENTITY_TYPE_DBT_TEST = 302; - ENTITY_TYPE_DBT_SOURCE = 303; - ENTITY_TYPE_DBT_MACRO = 304; - ENTITY_TYPE_DBT_PROJECT = 306; - ENTITY_TYPE_DBT_METRIC = 307; - ENTITY_TYPE_DBT_SNAPSHOT = 310; - ENTITY_TYPE_DBT_SEED = 311; - ENTITY_TYPE_DBT_ANALYSIS = 312; - ENTITY_TYPE_DBT_EXPOSURE = 313; - ENTITY_TYPE_DBT_GROUP = 314; - - // DBT 35X - - ENTITY_TYPE_DBT_CLOUD_ACCOUNT = 351; - ENTITY_TYPE_DBT_CLOUD_PROJECT = 352; - ENTITY_TYPE_DBT_CLOUD_JOB = 353; - ENTITY_TYPE_DBT_CLOUD_JOB_STEP = 354; - - // SNOWFLAKE 5XX - - ENTITY_TYPE_SNOWFLAKE_PROJECT = 501; - ENTITY_TYPE_SNOWFLAKE_DATASET = 502; - ENTITY_TYPE_SNOWFLAKE_TABLE = 503; - ENTITY_TYPE_SNOWFLAKE_ACCOUNT = 505; - ENTITY_TYPE_SNOWFLAKE_DATABASE = 506; - ENTITY_TYPE_SNOWFLAKE_SCHEMA = 507; - ENTITY_TYPE_SNOWFLAKE_VIEW = 508; - - // REDSHIFT 8XX - - ENTITY_TYPE_REDSHIFT_DATABASE = 801; - ENTITY_TYPE_REDSHIFT_SCHEMA = 802; - ENTITY_TYPE_REDSHIFT_TABLE = 803; - ENTITY_TYPE_REDSHIFT_VIEW = 805; - - // TABLEAU 11xx - - ENTITY_TYPE_TABLEAU_EMBEDDED = 1101; - ENTITY_TYPE_TABLEAU_PUBLISHED = 1102; - ENTITY_TYPE_TABLEAU_CUSTOM_SQL = 1103; - ENTITY_TYPE_TABLEAU_TABLE = 1104; - ENTITY_TYPE_TABLEAU_SHEET = 1105; - ENTITY_TYPE_TABLEAU_DASHBOARD = 1106; - - // AIRFLOW 12xx - - ENTITY_TYPE_AIRFLOW_DAG = 1201; - ENTITY_TYPE_AIRFLOW_TASK = 1202; - - // CLICKHOUSE 13XX - - ENTITY_TYPE_CLICKHOUSE_DATABASE = 1301; - ENTITY_TYPE_CLICKHOUSE_SCHEMA = 1302; - ENTITY_TYPE_CLICKHOUSE_TABLE = 1303; - ENTITY_TYPE_CLICKHOUSE_VIEW = 1305; - - ENTITY_TYPE_ANOMALY_INTEGRATION = 1401; - ENTITY_TYPE_ANOMALY_MONITOR = 1403; - ENTITY_TYPE_ANOMALY_MONITOR_SEGMENT = 1404; - - // POSTGRES 16XX - - ENTITY_TYPE_POSTGRES_DATABASE = 1601; - ENTITY_TYPE_POSTGRES_SCHEMA = 1602; - ENTITY_TYPE_POSTGRES_TABLE = 1603; - ENTITY_TYPE_POSTGRES_VIEW = 1605; - - // MYSQL 17XX - - ENTITY_TYPE_MYSQL_DATABASE = 1701; - ENTITY_TYPE_MYSQL_SCHEMA = 1702; - ENTITY_TYPE_MYSQL_TABLE = 1703; - ENTITY_TYPE_MYSQL_VIEW = 1705; -} diff --git a/protos/synq/core/v1/platforms.proto b/protos/synq/core/v1/platforms.proto deleted file mode 100644 index 86cff52..0000000 --- a/protos/synq/core/v1/platforms.proto +++ /dev/null @@ -1,23 +0,0 @@ -syntax = "proto3"; - -package synq.core.v1; - -option go_package = "github.com/getsynq/api/core/v1"; - -// Platforms supported by Synq. -enum Platform { - reserved 60, 70, 90, 140, 150, 1000; - PLATFORM_UNSPECIFIED = 0; - PLATFORM_BIGQUERY = 10; - PLATFORM_LOOKER = 20; - PLATFORM_DBT = 30; - PLATFORM_DBT_CLOUD = 31; - PLATFORM_DBT_SELF_HOSTED = 32; - PLATFORM_SNOWFLAKE = 50; - PLATFORM_REDSHIFT = 80; - PLATFORM_TABLEAU = 110; - PLATFORM_AIRFLOW = 120; - PLATFORM_CLICKHOUSE = 130; - PLATFORM_POSTGRES = 160; - PLATFORM_MYSQL = 170; -} diff --git a/protos/synq/entities/v1/entities.proto b/protos/synq/entities/v1/entities.proto new file mode 100644 index 0000000..9e520e7 --- /dev/null +++ b/protos/synq/entities/v1/entities.proto @@ -0,0 +1,39 @@ +syntax = "proto3"; + +package synq.entities.v1; + +import "buf/validate/validate.proto"; +import "google/protobuf/timestamp.proto"; +import "synq/entities/v1/identifiers.proto"; + +option go_package = "github.com/getsynq/api/entities/v1"; + +// Entity is the base type for all entities in the system. Its always attached to a given +// client workspace and can be uniquely identified by its id. +message Entity { + // Immutable workspace identifier that this entity belongs to. + string workspace = 1; + + // Unique identifier for this entity. + Identifier id = 2 [(buf.validate.field).required = true]; + + // Name of the entity that is displayed to the user. + string name = 3 [(buf.validate.field).required = true]; + + // Description of the entity that is displayed in relevant contexts. + string description = 4; + + // Timestamp when the entity was created. + google.protobuf.Timestamp created_at = 5; + + // Timestamp when the entity was last updated. + google.protobuf.Timestamp updated_at = 6; + + // Timestamp when the entity was deleted. If this is set, the entity is considered deleted. + google.protobuf.Timestamp deleted_at = 7; + + // Return only value. Synq Path to the entity. This is a unique path that can be used to access the entity in the Synq's UI. + string synq_path = 8; + // Return only value. Synq URL to the entity. This is a unique URL that can be used to access the entity in the Synq's UI. + string synq_catalog_url = 9; +} diff --git a/protos/synq/entities/v1/entities_service.proto b/protos/synq/entities/v1/entities_service.proto new file mode 100644 index 0000000..23b0346 --- /dev/null +++ b/protos/synq/entities/v1/entities_service.proto @@ -0,0 +1,96 @@ +syntax = "proto3"; + +package synq.entities.v1; + +import "buf/validate/validate.proto"; +import "synq/entities/v1/entities.proto"; +import "synq/entities/v1/identifiers.proto"; +import "synq/v1/scope_authorization.proto"; + +option go_package = "github.com/getsynq/api/entities/v1"; + +// EntitiesService is a service for managing custom entities. Entities can represent +// various data platform concepts such as services, consumers, applications or data pipelines +// that are not natively available in Synq. +// +// Entities are identified by a unique identifier and can be created, updated, read and deleted. +// +service EntitiesService { + // Get specific entity by its identifier. + rpc GetEntity(GetEntityRequest) returns (GetEntityResponse) { + option (synq.v1.scope_authorization) = { + scopes: [ + SCOPE_ENTITY_READ + ] + }; + } + + // Get multiple entities by their identifiers. + rpc BatchGetEntities(BatchGetEntitiesRequest) returns (BatchGetEntitiesResponse) { + option (synq.v1.scope_authorization) = { + scopes: [ + SCOPE_ENTITY_READ + ] + }; + } + + // Create or update an entity. If the entity does not exist, it will be created, otherwise it will be updated. Entities are identified and deduplicated by their Identifier in a scope of a given customer workspace. + rpc UpsertEntity(UpsertEntityRequest) returns (UpsertEntityResponse) { + option (synq.v1.scope_authorization) = { + scopes: [ + SCOPE_ENTITY_EDIT + ] + }; + } + + // Delete an entity by its identifier. If the entity does not exist, it will be a no-op. + rpc DeleteEntity(DeleteEntityRequest) returns (DeleteEntityResponse) { + option (synq.v1.scope_authorization) = { + scopes: [ + SCOPE_ENTITY_EDIT + ] + }; + } +} + +// GetEntityRequest is the request message for the GetEntity method. +message GetEntityRequest { + // Identifier of the entity to get. + Identifier id = 1 [(buf.validate.field).required = true]; +} + +// GetEntityResponse is the response message for the GetEntity method. +message GetEntityResponse { + // The entity that was retrieved. + Entity entity = 1; +} + +// BatchGetEntitiesRequest is the request message for the BatchGetEntities method. +message BatchGetEntitiesRequest { + // Identifiers of the entities to get. + repeated Identifier ids = 1 [(buf.validate.field).required = true]; +} + +// BatchGetEntitiesResponse is the response message for the BatchGetEntities method. +message BatchGetEntitiesResponse { + // The entities that were retrieved. + repeated Entity entities = 1; +} + +// UpsertEntityRequest is the request message for the UpsertEntity method. +message UpsertEntityRequest { + // The entity to create or update. + entities.v1.Entity entity = 1 [(buf.validate.field).required = true]; +} + +// UpsertEntityResponse is the response message for the UpsertEntity method. +message UpsertEntityResponse {} + +// DeleteEntityRequest is the request message for the DeleteEntity method. +message DeleteEntityRequest { + // Identifier of the entity to delete. + Identifier id = 1 [(buf.validate.field).required = true]; +} + +// DeleteEntityResponse is the response message for the DeleteEntity method. +message DeleteEntityResponse {} diff --git a/protos/synq/entities/v1/identifiers.proto b/protos/synq/entities/v1/identifiers.proto new file mode 100644 index 0000000..6bc18b1 --- /dev/null +++ b/protos/synq/entities/v1/identifiers.proto @@ -0,0 +1,227 @@ +syntax = "proto3"; + +package synq.entities.v1; + +import "buf/validate/validate.proto"; + +option go_package = "github.com/getsynq/api/entities/v1"; + +// Identifier is a unique reference to an entity in Synq system. Entity identifiers +// are designed to closely mimic identifiers used by data platforms and tools. To construct +// an identifier, you need to know the kind of the entity and the ids that you would normally +// use to identify it in the data platform or tool. For example, to identify a table in BigQuery, +// you would need to know the project, dataset, and table names. +message Identifier { + oneof id { + option (buf.validate.oneof).required = true; + // Dbt node that identifies one of dbt DAG nodes (model, test, etc) in dbt Core project + DbtCoreNodeIdentifier dbt_core_node = 1; + + // Dbt node that identifies one of dbt DAG nodes (model, test, etc) in dbt Cloud project + DbtCloudNodeIdentifier dbt_cloud_node = 2; + + // BigQuery table identifier + BigqueryTableIdentifier bigquery_table = 3; + + // Snowflake table identifier + SnowflakeTableIdentifier snowflake_table = 4; + + // Redshift table identifier + RedshiftTableIdentifier redshift_table = 5; + + // Postgres table identifier + PostgresTableIdentifier postgres_table = 6; + + // Mysql table identifier + MysqlTableIdentifier mysql_table = 7; + + // Clickhouse table identifier + ClickhouseTableIdentifier clickhouse_table = 8; + + // Databricks table identifier + DatabricksTableIdentifier databricks_table = 14; + + // Airflow DAG identifier + AirflowDagIdentifier airflow_dag = 9; + + // Airflow task identifier within a given DAG + AirflowTaskIdentifier airflow_task = 10; + + // Custom identifier to be used with all custom created entities + CustomIdentifier custom = 11; + + // Dataproduct identifier + DataproductIdentifier dataproduct = 12; + + // SynqPath identifier + SynqPathIdentifier synq_path = 13; + } +} + +// +// DBT +// + +message DbtCoreNodeIdentifier { + // Synq integration_id that identifies the dbt Core project + string integration_id = 1 [ + (buf.validate.field).required = true, + (buf.validate.field).string.uuid = true + ]; + + // Dbt node_id that identifies one of dbt DAG nodes (model, test, etc) + string node_id = 2 [(buf.validate.field).required = true]; +} + +message DbtCloudNodeIdentifier { + // Your dbt Cloud project id + string project_id = 1 [(buf.validate.field).required = true]; + + // Your dbt Cloud account id + string account_id = 2; + + // Dbt node_id that identifies one of dbt DAG nodes (model, test, etc) + string node_id = 3 [(buf.validate.field).required = true]; +} + +// +// DATA PLATFORMS +// + +message BigqueryTableIdentifier { + // BigQuery project + string project = 1 [(buf.validate.field).required = true]; + + // BigQuery dataset id + string dataset = 2 [(buf.validate.field).required = true]; + + // BigQuery table name + string table = 3 [(buf.validate.field).required = true]; +} + +message SnowflakeTableIdentifier { + // Snowflake account + string account = 1 [(buf.validate.field).required = true]; + + // Snowflake database + string database = 2 [(buf.validate.field).required = true]; + + // Snowflake schema + string schema = 3 [(buf.validate.field).required = true]; + + // Snowflake table + string table = 4 [(buf.validate.field).required = true]; +} + +message RedshiftTableIdentifier { + // Redshift cluster + string cluster = 1 [(buf.validate.field).required = true]; + + // Redshift database + string database = 2 [(buf.validate.field).required = true]; + + // Redshift schema + string schema = 3 [(buf.validate.field).required = true]; + + // Redshift table + string table = 4 [(buf.validate.field).required = true]; +} + +message PostgresTableIdentifier { + // Postgres host inclusive of port + string host = 1 [(buf.validate.field).required = true]; + + // Postgres database + string database = 2 [(buf.validate.field).required = true]; + + // Postgres schema + string schema = 3 [(buf.validate.field).required = true]; + + // Postgres table + string table = 4 [(buf.validate.field).required = true]; +} + +message MysqlTableIdentifier { + // Mysql host inclusive of port + string host = 1 [(buf.validate.field).required = true]; + + // Mysql database + string schema = 2 [(buf.validate.field).required = true]; + + // Mysql table + string table = 3 [(buf.validate.field).required = true]; +} + +message ClickhouseTableIdentifier { + // Clickhouse host inclusive of port + string host = 1 [(buf.validate.field).required = true]; + + // Clickhouse database + string schema = 2 [(buf.validate.field).required = true]; + + // Clickhouse table + string table = 3 [(buf.validate.field).required = true]; +} + +message DatabricksTableIdentifier { + string workspace = 1 [(buf.validate.field).required = true]; + + // Databricks catalog + string catalog = 2 [(buf.validate.field).required = true]; + + // Databricks schema + string schema = 3 [(buf.validate.field).required = true]; + + // Databricks table or view + string table = 4 [(buf.validate.field).required = true]; +} + +message AirflowDagIdentifier { + // Synq integration_id that identifies the Airflow instance + string integration_id = 1 [(buf.validate.field).required = true]; + + // Airflow dag_id that identifies the DAG + string dag_id = 2 [(buf.validate.field).required = true]; +} + +message AirflowTaskIdentifier { + // Synq integration_id that identifies the Airflow instance + string integration_id = 1 [(buf.validate.field).required = true]; + + // Airflow dag_id that identifies the DAG + string dag_id = 2 [(buf.validate.field).required = true]; + + // Airflow task_id that identifies the task within the DAG + string task_id = 3 [(buf.validate.field).required = true]; +} + +// +// CUSTOM +// + +message CustomIdentifier { + // Id that identifies the custom entity + // The Id should be unique within the custom entity Identifier. + string id = 1 [(buf.validate.field).required = true]; +} + +// +// DATAPRODUCT +// + +message DataproductIdentifier { + // Dataproduct id that identifies the Dataproduct + string id = 1 [ + (buf.validate.field).required = true, + (buf.validate.field).string.uuid = true + ]; +} + +// +// SYNQ PATH +// + +message SynqPathIdentifier { + // Synq path that identifies the Synq entity, needs to be one of supported paths + string path = 1 [(buf.validate.field).required = true]; +} diff --git a/protos/synq/example/v1/example.proto b/protos/synq/example/v1/example.proto deleted file mode 100644 index 4c0a010..0000000 --- a/protos/synq/example/v1/example.proto +++ /dev/null @@ -1,22 +0,0 @@ -syntax = "proto3"; - -package synq.example.v1; - -import "google/protobuf/timestamp.proto"; - -option go_package = "github.com/getsynq/api/example/v1"; - - -/** - * Example is the core model of this package. - */ -message Example { - // `id` is generated by the system when a new example is created. - // It is required to refer to an example in any future operations (like update or remove). - string id = 1; - /* The example itself. */ - string text = 2; - optional string description = 3; /// Optional description of the example. - google.protobuf.Timestamp created_at = 4; /// Example creation time. - google.protobuf.Timestamp updated_at = 5; /// Example last update time. -} diff --git a/protos/synq/example/v1/example_service.proto b/protos/synq/example/v1/example_service.proto deleted file mode 100644 index 6fa30fa..0000000 --- a/protos/synq/example/v1/example_service.proto +++ /dev/null @@ -1,88 +0,0 @@ -syntax = "proto3"; - -package synq.example.v1; - -import "synq/example/v1/example.proto"; - -option go_package = "github.com/getsynq/api/example/v1"; - - -// ExamplesService is a sample service to display how documentation in protos will work. -// The service implements a basic CRUD API and contains server streaming example. -service ExampleService { - // AddExample adds the given example to the system. - rpc AddExample(AddExampleRequest) returns (AddExampleResponse) {} - - // UpdateExample updates the given example. - // Throws an error if the example was not found. - rpc UpdateExample(UpdateExampleRequest) returns (UpdateExampleResponse) {} - - // GetExample returns the requested example. - rpc GetExample(GetExampleRequest) returns (GetExampleResponse) {} - - // ListExamples streams the requested examples. - rpc ListExamples(ListExamplesRequest) returns (stream ListExamplesResponse) {} - - // RemoveExample removes the provided example from the system. - // Fails silently if the example was not found. - rpc RemoveExample(RemoveExampleRequest) returns (RemoveExampleResponse) {} -} - -/** - * AddExampleRequest contains the parameters required to create an example. - */ -message AddExampleRequest { - /* The example itself. */ - string text = 1; - optional string description = 2; /// Optional description of the example. -} - -// Response contains the created example. -message AddExampleResponse { - Example example = 1; -} - -/** - * UpdateExampleRequest contains updateable fields inside an example. - */ -message UpdateExampleRequest { - string id = 1; /// Id of the example to update - optional string text = 2; /// Optional update of the example text. - optional string description = 3; /// Optional update of the example description. -} - -// Response with updated example. -message UpdateExampleResponse { - Example example = 1; -} - -// GetExampleRequest gets an example by its ID. -message GetExampleRequest { - string id = 1; -} - -message GetExampleResponse { - Example example = 1; -} - -// ListExamplesRequest streams examples from the server. -message ListExamplesRequest { - repeated string ids = 1; -} - -message ExampleResponse { - Example example = 1; -} - -message ListExamplesResponse { - Example example = 1; -} - -// RemoveExampleRequest removes an example by its ID. -message RemoveExampleRequest { - string id = 1; -} - -message RemoveExampleResponse { - bool success = 1; -} diff --git a/protos/synq/example/v2/example.proto b/protos/synq/example/v2/example.proto deleted file mode 100644 index 02caf73..0000000 --- a/protos/synq/example/v2/example.proto +++ /dev/null @@ -1,23 +0,0 @@ -syntax = "proto3"; - -package synq.example.v2; - -import "google/protobuf/timestamp.proto"; - -option go_package = "github.com/getsynq/api/example/v2"; - - -/** - * Example is the core model of this package. - */ -message Example { - // `id` is generated by the system when a new example is created. - // It is required to refer to an example in any future operations (like update or remove). - string id = 1; - /* The example itself. */ - string text = 2; - optional string description = 3; /// Optional description of the example. - bool is_visible = 4; /// Whether the example is visible to users. - google.protobuf.Timestamp created_at = 5; /// Example creation time. - google.protobuf.Timestamp updated_at = 6; /// Example last update time. -} diff --git a/protos/synq/example/v2/example_service.proto b/protos/synq/example/v2/example_service.proto deleted file mode 100644 index 7f538f6..0000000 --- a/protos/synq/example/v2/example_service.proto +++ /dev/null @@ -1,90 +0,0 @@ -syntax = "proto3"; - -package synq.example.v2; - -import "synq/example/v2/example.proto"; - -option go_package = "github.com/getsynq/api/example/v2"; - - -// ExamplesService is a sample service to display how documentation in protos will work. -// The service implements a basic CRUD API and contains server streaming example. -service ExampleService { - // AddExample adds the given example to the system. - rpc AddExample(AddExampleRequest) returns (AddExampleResponse) {} - - // UpdateExample updates the given example. - // Throws an error if the example was not found. - rpc UpdateExample(UpdateExampleRequest) returns (UpdateExampleResponse) {} - - // GetExample returns the requested example. - rpc GetExample(GetExampleRequest) returns (GetExampleResponse) {} - - // ListExamples streams the requested examples. - rpc ListExamples(ListExamplesRequest) returns (stream ListExamplesResponse) {} - - // RemoveExample removes the provided example from the system. - // Fails silently if the example was not found. - rpc RemoveExample(RemoveExampleRequest) returns (RemoveExampleResponse) {} -} - -/** - * AddExampleRequest contains the parameters required to create an example. - */ -message AddExampleRequest { - /* The example itself. */ - string text = 1; - optional string description = 2; /// Optional description of the example. - bool is_visible = 3; /// Whether the example is visible to users. -} - -// Response contains the created example. -message AddExampleResponse { - Example example = 1; -} - -/** - * UpdateExampleRequest contains updateable fields inside an example. - */ -message UpdateExampleRequest { - optional string text = 1; /// Optional update of the example text. - optional string description = 2; /// Optional update of the example description. - optional bool is_visible = 3; /// Optional update of example visibility. -} - -// Response with updated example. -message UpdateExampleResponse { - Example example = 1; -} - -// GetExampleRequest gets an example by its ID. -message GetExampleRequest { - string id = 1; -} - -message GetExampleResponse { - Example example = 1; -} - -// ListExamplesRequest streams examples from the server. -message ListExamplesRequest { - repeated string ids = 1; -} - -message ListExamplesResponse { - Example example = 1; -} - -message ExampleResponse { - Example example = 1; -} - - -// RemoveExampleRequest removes an example by its ID. -message RemoveExampleRequest { - string id = 1; -} - -message RemoveExampleResponse { - bool success = 1; -} diff --git a/protos/synq/schemas/v1/lineage.proto b/protos/synq/lineage/v1/lineage.proto similarity index 90% rename from protos/synq/schemas/v1/lineage.proto rename to protos/synq/lineage/v1/lineage.proto index a2a2b01..4133053 100644 --- a/protos/synq/schemas/v1/lineage.proto +++ b/protos/synq/lineage/v1/lineage.proto @@ -1,11 +1,10 @@ syntax = "proto3"; -package synq.schemas.v1; +package synq.lineage.v1; -import "synq/core/v1/entity.proto"; - -option go_package = "github.com/getsynq/api/schemas/v1"; +import "synq/entities/v1/identifiers.proto"; +option go_package = "github.com/getsynq/api/lineage/v1"; // Lineage defines the lineage of table-like entities. message Lineage { @@ -44,12 +43,12 @@ enum NodePosition { NODE_POSITION_DOWNSTREAM = 3; // Node is downstream of the requested start point. } -// Node in a lineage graph representing one or more entiities (e.g. database table). +// Node in a lineage graph representing one or more entities (e.g. database table). message LineageNode { // All entities which have the same identity as this node. Must be at least one item. // These are sorted by closeness to the type of the start point entities. // e.g. if requesting lineage of a DBT source, first entity should be from DBT, similarly when viewing table it will be other tables. - repeated core.v1.EntityRef entities = 1; + repeated entities.v1.Identifier ids = 1; // Position of the node in the lineage. NodePosition position = 2; // Populated only for Column Level Lineage (CLL). @@ -69,7 +68,7 @@ message CllDetails { // Column in a table-like asset (used in CLL mode). message Column { string column_id = 1; // ID string for the column. This is the parsed column name. - optional string name = 2; // Original column name as fetched from the table. + optional string name = 2; // Original column name as fetched from the table. optional string native_type = 3; // Column type as fetched from the table. } diff --git a/protos/synq/schemas/v1/lineage_service.proto b/protos/synq/lineage/v1/lineage_service.proto similarity index 69% rename from protos/synq/schemas/v1/lineage_service.proto rename to protos/synq/lineage/v1/lineage_service.proto index f97e9b0..b4aa442 100644 --- a/protos/synq/schemas/v1/lineage_service.proto +++ b/protos/synq/lineage/v1/lineage_service.proto @@ -1,18 +1,24 @@ syntax = "proto3"; -package synq.schemas.v1; +package synq.lineage.v1; -import "synq/core/v1/entity.proto"; -import "synq/schemas/v1/lineage.proto"; - -option go_package = "github.com/getsynq/api/schemas/v1"; +import "synq/entities/v1/identifiers.proto"; +import "synq/lineage/v1/lineage.proto"; +import "synq/v1/scope_authorization.proto"; +option go_package = "github.com/getsynq/api/lineage/v1"; // LineageService allows you to fetch: // * Entity level lineage from a starting point of one or more entities. // * Column Level lineage from a starting point of multiple columns of a single entity. service LineageService { - rpc GetLineage(GetLineageRequest) returns (GetLineageResponse) {} + rpc GetLineage(GetLineageRequest) returns (GetLineageResponse) { + option (synq.v1.scope_authorization) = { + scopes: [ + SCOPE_LINEAGE_READ + ] + }; + } } message GetLineageRequest { @@ -42,10 +48,10 @@ message GetLineageStartPoint { } message EntitiesStartPoint { - repeated core.v1.EntityRef entities = 1; + repeated entities.v1.Identifier entities = 1; } message EntityColumnsStartPoint { - core.v1.EntityRef entitiy = 1; - repeated string column_ids = 2; + entities.v1.Identifier id = 1; + repeated string column_names = 2; } diff --git a/protos/synq/lineage/v1/relationships.proto b/protos/synq/lineage/v1/relationships.proto new file mode 100644 index 0000000..416675b --- /dev/null +++ b/protos/synq/lineage/v1/relationships.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package synq.lineage.v1; + +import "buf/validate/validate.proto"; +import "synq/entities/v1/identifiers.proto"; + +option go_package = "github.com/getsynq/api/lineage/v1"; + +message Relationship { + entities.v1.Identifier upstream = 1 [(buf.validate.field).required = true]; + entities.v1.Identifier downstream = 2 [(buf.validate.field).required = true]; +} diff --git a/protos/synq/lineage/v1/relationships_service.proto b/protos/synq/lineage/v1/relationships_service.proto new file mode 100644 index 0000000..9b0afce --- /dev/null +++ b/protos/synq/lineage/v1/relationships_service.proto @@ -0,0 +1,44 @@ +syntax = "proto3"; + +package synq.lineage.v1; + +import "buf/validate/validate.proto"; +import "synq/lineage/v1/relationships.proto"; +import "synq/v1/scope_authorization.proto"; + +option go_package = "github.com/getsynq/api/lineage/v1"; + +// RelationshipsService allow management of relationships between entities. Relationships can +// be created, updated, and deleted between 2 custom entities, or between a custom entity and Synq native entity.enum +// There is no option to create relationships between 2 Synq native entities (dbt model, BI dashboard, etc.). +service RelationshipsService { + // Create or update relationships between entities. If the relationship already exists, it will be updated, otherwise it will be created. + rpc UpsertRelationships(UpsertRelationshipsRequest) returns (UpsertRelationshipsResponse) { + option (synq.v1.scope_authorization) = { + scopes: [ + SCOPE_LINEAGE_EDIT + ] + }; + } + + // Delete relationships between entities. If the relationship does not exist, it will be ignored. + rpc DeleteRelationships(DeleteRelationshipsRequest) returns (DeleteRelationshipsResponse) { + option (synq.v1.scope_authorization) = { + scopes: [ + SCOPE_LINEAGE_EDIT + ] + }; + } +} + +message UpsertRelationshipsRequest { + repeated Relationship relationships = 1 [(buf.validate.field).required = true]; +} + +message UpsertRelationshipsResponse {} + +message DeleteRelationshipsRequest { + repeated Relationship relationships = 1 [(buf.validate.field).required = true]; +} + +message DeleteRelationshipsResponse {} diff --git a/protos/synq/status/v1/entity_incidents.proto b/protos/synq/status/v1/entity_incidents.proto new file mode 100644 index 0000000..cfb8cef --- /dev/null +++ b/protos/synq/status/v1/entity_incidents.proto @@ -0,0 +1,31 @@ +syntax = "proto3"; + +package synq.status.v1; + +import "google/protobuf/timestamp.proto"; + +option go_package = "github.com/getsynq/api/status/v1"; + +message EntityIncident { + // Unique identifier of the incident. + string id = 1; + + // URL of the incident. + string url = 2; + + // Name of the incident give by the user. + string name = 3; + + // Information about author of the incident. + string created_by = 4; + // Time when the incident was created. + google.protobuf.Timestamp created_at = 5; + + // Information about the user who last updated the incident. + string updated_by = 6; + // Time when the incident was last updated. + google.protobuf.Timestamp updated_at = 7; + + // Indicates if all issues inside the incident are resolved. + bool is_resolved = 8; +} diff --git a/protos/synq/status/v1/entity_incidents_service.proto b/protos/synq/status/v1/entity_incidents_service.proto new file mode 100644 index 0000000..79d830f --- /dev/null +++ b/protos/synq/status/v1/entity_incidents_service.proto @@ -0,0 +1,60 @@ +syntax = "proto3"; + +package synq.status.v1; + +import "buf/validate/validate.proto"; +import "synq/entities/v1/identifiers.proto"; +import "synq/status/v1/entity_incidents.proto"; +import "synq/v1/scope_authorization.proto"; + +option go_package = "github.com/getsynq/api/status/v1"; + +// EntityIncidentsService is the service which retrieves entity status. +// +service EntityIncidentsService { + // Get specific entity status by its identifier. + rpc GetIncidents(GetIncidentsRequest) returns (GetIncidentsResponse) { + option (synq.v1.scope_authorization) = { + scopes: [ + SCOPE_STATUS_READ + ] + }; + } + + // Get multiple entity statuses by their identifiers. + rpc BatchGetIncidents(BatchGetIncidentsRequest) returns (BatchGetIncidentsResponse) { + option (synq.v1.scope_authorization) = { + scopes: [ + SCOPE_STATUS_READ + ] + }; + } +} + +// GetIncidentsRequest is the request message for the GetEntity method. +message GetIncidentsRequest { + // Identifier of the entity to get incidents for. + synq.entities.v1.Identifier id = 1 [(buf.validate.field).required = true]; + // Retrieve incidents of upstream entities. + bool fetch_upstream_incidents = 2; +} + +// GetIncidentsResponse is the response message for the GetEntity method. +message GetIncidentsResponse { + // Identifier of the entity. + synq.entities.v1.Identifier id = 1 [(buf.validate.field).required = true]; + // Open incident associated with the entity requested. + repeated EntityIncident entity_open_incidents = 2; + // Open incidents associated with the upstream entities if requested. + repeated EntityIncident upstream_open_incidents = 3; +} + +// BatchGetIncidentsRequest is the request message for the BatchGetIssues method. +message BatchGetIncidentsRequest { + repeated GetIncidentsRequest requests = 1 [(buf.validate.field).required = true]; +} + +// BatchGetIncidentsResponse is the response message for the BatchGetIssues method. +message BatchGetIncidentsResponse { + repeated GetIncidentsResponse responses = 1 [(buf.validate.field).required = true]; +} diff --git a/protos/synq/status/v1/entity_issues.proto b/protos/synq/status/v1/entity_issues.proto new file mode 100644 index 0000000..91ec829 --- /dev/null +++ b/protos/synq/status/v1/entity_issues.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package synq.status.v1; + +option go_package = "github.com/getsynq/api/status/v1"; + +enum IssueStatus { + ISSUE_STATUS_UNSPECIFIED = 0; + ISSUE_STATUS_OK = 10; + ISSUE_STATUS_WARN = 20; + ISSUE_STATUS_ERROR = 30; + ISSUE_STATUS_CRITICAL = 40; +} diff --git a/protos/synq/status/v1/entity_issues_service.proto b/protos/synq/status/v1/entity_issues_service.proto new file mode 100644 index 0000000..25a8894 --- /dev/null +++ b/protos/synq/status/v1/entity_issues_service.proto @@ -0,0 +1,73 @@ +syntax = "proto3"; + +package synq.status.v1; + +import "buf/validate/validate.proto"; +import "synq/entities/v1/identifiers.proto"; +import "synq/status/v1/entity_issues.proto"; +import "synq/v1/scope_authorization.proto"; + +option go_package = "github.com/getsynq/api/status/v1"; + +// EntityIssuesService is the service which retrieves entity issues status. +// +service EntityIssuesService { + // Get specific entity status by its identifier. + rpc GetIssuesStatus(GetIssuesStatusRequest) returns (GetIssuesStatusResponse) { + option (synq.v1.scope_authorization) = { + scopes: [ + SCOPE_STATUS_READ + ] + }; + } + + // Get multiple entity statuses by their identifiers. + rpc BatchGetIssuesStatus(BatchGetIssuesStatusRequest) returns (BatchGetIssuesStatusResponse) { + option (synq.v1.scope_authorization) = { + scopes: [ + SCOPE_STATUS_READ + ] + }; + } +} + +// GetIssuesStatusRequest is the request message for the GetEntity method. +message GetIssuesStatusRequest { + // Identifier of the entity to get status for. + synq.entities.v1.Identifier id = 1 [(buf.validate.field).required = true]; + // Retrieve status of upstream entities. + bool fetch_upstream_status = 2; +} + +// GetIssuesStatusResponse is the response message for the GetEntity method. +message GetIssuesStatusResponse { + message IssuesSummary { + // Number of issues for the entity. + int32 total_count = 1; + // Number of issues for the entity with status 'warn'. + int32 warn_count = 2; + // Number of issues for the entity with status 'error'. + int32 error_count = 3; + // Number of issues for the entity with status 'critical'. + int32 critical_count = 4; + } + + // Identifier of the entity. + synq.entities.v1.Identifier id = 1 [(buf.validate.field).required = true]; + // Status of the entity requested. + IssueStatus entity_issues_status = 2; + IssuesSummary entity_issues_summary = 3; + // Optionally, the status of all upstream entities. + IssueStatus upstream_issues_status = 4; + IssuesSummary upstream_issues_summary = 5; +} + +// BatchGetIssuesStatusRequest is the request message for the BatchGetIssues method. +message BatchGetIssuesStatusRequest { + repeated GetIssuesStatusRequest requests = 1 [(buf.validate.field).required = true]; +} + +// BatchGetIssuesStatusResponse is the response message for the BatchGetIssues method. +message BatchGetIssuesStatusResponse { + repeated GetIssuesStatusResponse responses = 1 [(buf.validate.field).required = true]; +} diff --git a/protos/synq/v1/scope_authorization.proto b/protos/synq/v1/scope_authorization.proto new file mode 100644 index 0000000..3e4ad45 --- /dev/null +++ b/protos/synq/v1/scope_authorization.proto @@ -0,0 +1,27 @@ +syntax = "proto3"; +package synq.v1; + +import "google/protobuf/descriptor.proto"; + +option go_package = "github.com/getsynq/api/v1"; + +extend google.protobuf.MethodOptions { + ScopeAuthorization scope_authorization = 50010; +} + +enum Scope { + SCOPE_UNSPECIFIED = 0; + + SCOPE_ENTITY_READ = 1; + SCOPE_ENTITY_EDIT = 2; + + SCOPE_LINEAGE_READ = 10; + SCOPE_LINEAGE_EDIT = 11; + + SCOPE_STATUS_READ = 20; +} + + +message ScopeAuthorization { + repeated Scope scopes = 1; +} \ No newline at end of file diff --git a/scripts/copy_protos.sh b/scripts/copy_protos.sh old mode 100644 new mode 100755 index 83c9335..51d9976 --- a/scripts/copy_protos.sh +++ b/scripts/copy_protos.sh @@ -28,7 +28,7 @@ for pd in "${proto_dirs[@]}"; do # ensure dest exists mkdir -p $dest echo "$pd -> $dest" - rsync -avW --include='*.proto' --no-compress "${pd}/" "${dest}/" --delete + rsync -avW --include='*.proto' "${pd}/" "${dest}/" --delete done set +e diff --git a/scripts/generate_docs.sh b/scripts/generate_docs.sh old mode 100644 new mode 100755 index d0c352d..e275064 --- a/scripts/generate_docs.sh +++ b/scripts/generate_docs.sh @@ -1,11 +1,14 @@ #!/bin/bash +MY_PATH="$(dirname -- "${BASH_SOURCE[0]}")" +TEMPLATE = "$MY_PATH/../templates/grpc-md.tmpl" + PROTOS_DIR="." DOCS_DIR="./tmp" set -e -VALID_ARGS=$(getopt -o p:d: --long protos:,docs: -- "$@") +VALID_ARGS=$(getopt -o p:d:I: --long protos:,docs: -- "$@") if [[ $? -ne 0 ]]; then exit 1; fi @@ -21,6 +24,10 @@ while [ : ]; do DOCS_DIR=$2 shift 2 ;; + -I) + PROTOC_OPTS="$PROTOC_OPTS --proto_path=$2" + shift 2 + ;; --) shift; break ;; @@ -44,9 +51,8 @@ for module_dir in $module_dirs; do version=`basename $version_dir` proto_files=`find $version_dir -name *.proto -type f` if [[ "${proto_files}" != "" ]]; then - protoc --proto_path=${PROTOS_DIR} \ - --doc_out="${DOCS_DIR}/${module}/" \ - --doc_opt=markdown,${version}.md \ + protoc --proto_path=${PROTOS_DIR} $PROTOC_OPTS \ + --doc_out=$TEMPLATE,"${version}.mdx:${DOCS_DIR}/${module}/" \ ${proto_files} fi done @@ -55,5 +61,7 @@ for module_dir in $module_dirs; do fi done +rm -rf tmp + set +e exit 0 diff --git a/scripts/generate_docs_simple.sh b/scripts/generate_docs_simple.sh new file mode 100755 index 0000000..49d6958 --- /dev/null +++ b/scripts/generate_docs_simple.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +PROTOS_DIR="." + +set -e + +VALID_ARGS=$(getopt -o I: -- "$@") +if [[ $? -ne 0 ]]; then + exit 1; +fi + +PROTOC_OPTS="" +eval set -- "$VALID_ARGS" +while [ : ]; do + case "$1" in + -I) + PROTOC_OPTS="$PROTOC_OPTS --proto_path=$2" + shift 2 + ;; + --) shift; + break + ;; + esac +done + +echo "Generating docs..." + +# Find all .proto files in subdirectories +proto_files=$(find "${PROTOS_DIR}" -type f -name "*.proto") + +protoc --proto_path="${PROTOS_DIR}" ${PROTOC_OPTS}\ + --doc_out=_repo/templates/grpc-md.tmpl,api.mdx:. \ + ${proto_files} + +mv api.mdx ../../docs/api-reference/api.mdx + +set +e +exit 0 \ No newline at end of file diff --git a/scripts/test_compile.sh b/scripts/test_compile.sh old mode 100644 new mode 100755 index be5c4cb..880ce62 --- a/scripts/test_compile.sh +++ b/scripts/test_compile.sh @@ -6,13 +6,22 @@ DIRTY=false set -e -VALID_ARGS=$(getopt -o dp:g: --long dirty,protos:,gen: -- "$@") +PATH="/opt/homebrew/opt/gnu-getopt/bin:$PATH" + +# Parse the options +VALID_ARGS=$(getopt -o dp:g:I: --long dirty,protos:,gen: -- "$@") if [[ $? -ne 0 ]]; then - exit 1; + exit 1 fi +# Evaluate the parsed options eval set -- "$VALID_ARGS" -while [ : ]; do + +PROTOC_OPTS="" + +echo $@ + +while true; do case "$1" in -d | --dirty) DIRTY=true @@ -22,6 +31,10 @@ while [ : ]; do PROTOS_DIR=$2 shift 2 ;; + -I) + PROTOC_OPTS="$PROTOC_OPTS --proto_path=$2" + shift 2 + ;; -g | --gen) GEN_DIR=$2 shift 2 @@ -29,6 +42,10 @@ while [ : ]; do --) shift; break ;; + *) + echo "Unknown option: $1" >&2 + exit 1 + ;; esac done @@ -49,7 +66,7 @@ for module_dir in $module_dirs; do version=`basename $version_dir` proto_files=`find $version_dir -name *.proto -type f` if [[ "${proto_files}" != "" ]]; then - protoc --proto_path=${PROTOS_DIR} \ + protoc --proto_path=${PROTOS_DIR} $PROTOC_OPTS \ --go_out=${GEN_DIR} \ --go-grpc_out=${GEN_DIR} \ --doc_out=${DOCS_DIR}/${module} \ diff --git a/templates/grpc-md-orig.tmpl b/templates/grpc-md-orig.tmpl new file mode 100644 index 0000000..4bae028 --- /dev/null +++ b/templates/grpc-md-orig.tmpl @@ -0,0 +1,76 @@ + +# API Reference + +# Table of Contents +{{range .Files}} +{{if .HasServices}} +- Services + {{range .Services}} - [{{.Name}}](#{{.FullName | lower | replace "." ""}}) + {{end}} +{{end}} +{{if .HasMessages}} +- Messages + {{range .Messages}} - [{{.LongName}}](#{{.LongName | lower | replace "." ""}}) + {{end}} +{{end}} +{{if .HasEnums}} +- Enums + {{range .Enums}} - [{{.LongName}}](#{{.LongName | lower | replace "." ""}}) + {{end}} +{{end}} +{{end}} +- [Scalar Value Types](#scalar-value-types) + +{{range .Files}} + +{{range .Services -}} +# {{.Name}} {#{{.FullName | lower | replace "." ""}}} +{{.Description}} + +{{range .Methods -}} +## {{.Name}} + +> **rpc** {{.Name}}([{{.RequestLongType}}](#{{.RequestLongType | lower | replace "." ""}})) + [{{.ResponseLongType}}](#{{.ResponseLongType | lower | replace "." ""}}) + +{{ .Description}} +{{end}} +{{end}} + +# Messages +{{range .Messages}} + +## {{.LongName}} {#{{.LongName | lower | replace "." ""}}} +{{.Description}} + +{{if .HasFields}} +| Field | Type | Description | +| ----- | ---- | ----------- | +{{range .Fields -}} + | {{if .IsOneof}}[**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) {{.OneofDecl}}.{{end}}{{.Name}} | [{{if .IsMap}}map {{else}}{{.Label}} {{end}}{{.LongType}}](#{{.LongType | lower | replace "." ""}}) | {{if .Description}}{{nobr .Description}}{{if .DefaultValue}} Default: {{.DefaultValue}}{{end}}{{else}}none{{end}} | +{{end}} +{{end}} +{{end}} + +# Enums +{{range .Enums}} + +## {{.LongName}} {#{{.LongName | lower | replace "." ""}}} +{{.Description}} + +| Name | Number | Description | +| ---- | ------ | ----------- | +{{range .Values -}} + | {{.Name}} | {{.Number}} | {{if .Description}}{{nobr .Description}}{{else}}none{{end}} | +{{end}} + +{{end}} +{{end}} + +# Scalar Value Types + +| .proto Type | Notes | C++ Type | Java Type | Python Type | +| ----------- | ----- | -------- | --------- | ----------- | +{{range .Scalars -}} + |

{{.ProtoType}} | {{.Notes}} | {{.CppType}} | {{.JavaType}} | {{.PythonType}} | +{{end}} \ No newline at end of file diff --git a/templates/grpc-md.tmpl b/templates/grpc-md.tmpl new file mode 100644 index 0000000..00f5fc8 --- /dev/null +++ b/templates/grpc-md.tmpl @@ -0,0 +1,61 @@ +## Services + +{{range .Files}} +{{range .Services -}} +### {{.Name}} +({{.FullName}}) + +{{.Description}} + +{{range .Methods -}} +#### {{.Name}} + +{{.Name}} ([{{.RequestType}}](#{{.RequestType | lower | replace "." ""}})) [{{.ResponseType}}](#{{.ResponseType | lower | replace "." ""}}) + +{{ .Description}} + +{{end}} +{{end}} +{{end}} + +## Messages + +{{range .Files}} +{{range .Messages}} +### {{.LongName}} + +({{.FullName}}) + +{{.Description}} + +{{if .HasFields}} +| Field | Type | Description | +| ----- | ---- | ----------- | +{{range .Fields -}} + | {{if .IsOneof}}[**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) {{.OneofDecl}}.{{end}}{{.Name}} | [{{if .IsMap}}map {{else}}{{.Label}} {{end}}{{.Type}}](#{{.Type | lower | replace "." ""}}) | {{if .Description}}{{nobr .Description}}{{if .DefaultValue}} Default: {{.DefaultValue}}{{end}}{{else}}none{{end}} | +{{end}} +{{end}} + + +{{end}} + +{{end}} + +# Enums +{{range .Files}} +{{range .Enums}} + +### {{.LongName}} + +({{.FullName}}) + +{{.Description}} + +| Name | Number | Description | +| ---- | ------ | ----------- | +{{range .Values -}} + | {{.Name}} | {{.Number}} | {{if .Description}}{{nobr .Description}}{{else}}none{{end}} | +{{end}} + +{{end}} +{{end}} \ No newline at end of file