Dependencies
In Cortex, you have the ability to define outgoing dependencies on other entities. Cortex can also automatically discover dependencies for some integrations. Having dependencies defined powers the ability to notify owners when a dependency deprecates its API or makes backwards incompatible changes, and the ability to visualize dependencies in a relationship graph.
Incoming dependencies are inferred based the outgoing dependency definitions.
Visualize dependencies in the relationship graph
In Cortex, you can visualize dependencies using the relationship graph at Tools > Relationship graphs. See the Relationship graph documentation for more information.
Automated dependency notifications
When a dependency deprecates its API or makes backwards incompatible changes, Cortex surfaces these issues via these methods:
- Breaking API changes are listed in your Cortex workspace under Settings > Breaking API changes.
- Cortex attempts to automatically make comments on PRs containing breaking OpenAPI changes that have downstream dependencies that Cortex knows about.
- If a breaking change is merged to the default branch, Cortex alerts dependency owners via Slack that a breaking change was merged.
Discovery
Cortex can automatically discover dependencies from your integrations:
How to define dependencies
You can define dependencies manually via an entity's YAML descriptor, via the Cortex UI (if UI editing is enabled), or via the API.
Your user or API key need the Edit entities
permission.
- Cortex UI
- Entity descriptor
- API
To define dependencies in the Cortex UI:
- Navigate to the entity where you need to define a dependency.
- In the upper right corner of the entity details page, click Configure entity.
- In the entity's left sidebar, click Dependencies.
- Click Add dependencies next to services or resources.
- In the form, select an entity to add as a dependency.
- Optionally, select an endpoint.
- In order for an endpoint to populate in this dropdown, it must first be defined as a path in the entity's YAML file. See "Set an endpoint for a dependency" below.
- Click Save dependency.
Set an endpoint for a dependency
Before you can select an endpoint from the dropdown when manually defining a dependency, that endpoint must be defined as a path in the entity's YAML file. See the example below:
openapi: 3.0.1
info:
title: Endpoint Example Service
description: "This is an example"
x-cortex-tag: endpoint-example-service
x-cortex-type: service
paths:
/hello/world:
get:
description: Some description
requestBody:
description: optional
responses:
"200":
description: optional
deprecated: false
/this/also/works:
put:
deprecated: false
In the UI, the paths will appear in the Endpoint dropdown:
The x-cortex-dependency
field allows you to define a list of outgoing dependencies. A dependency should be directed towards an outgoing service or resource, or more granularly, to a specific endpoint of that entity.
info:
x-cortex-dependency:
- tag: braavos
method: GET
path: /2.0/users/{username}
description: ensure user has payment information configured
metadata:
tags:
- billing
- identity
prod: true
Field | Description | Optional? |
---|---|---|
tag | The tag of the entity this entity depends on, i.e. the callee. See x-cortex-tag | No |
method | HTTP method if depending on a specific endpoint | Required if path is present |
path | The actual endpoint this dependency refers to | Required if method is present |
description | A description of the dependency. | Yes |
metadata | JSON metadata tags for the relationship. Supports arbitrary objects. | Yes |
See API Docs for authentication details.
If a dependency has already been set through the cortex.yaml
, the API will return an error.
A dependency optionally references an endpoint (method
and path
) of the callee, and this must already be defined in the callee's cortex.yaml
within the paths
field. If no endpoint is referenced it is assumed that the caller depends on all endpoints of the callee.
For all requests method
or path
are optional, however if one is present the other must also be present.
When interacting with an existing dependency, the method
and path
must be specified correctly to identify it.
Field | Description | Optional? |
---|---|---|
callerTag | The tag of the caller. | No |
calleeTag | The tag the caller depends on. | No |
method | HTTP method if depending on a specific endpoint | Required if path is present |
path | The actual endpoint (as defined in the OpenAPI file) the caller depends on | Required if method is present |
description | A description of the dependency. | Yes |
metadata | JSON metadata tags for the relationship. Supports arbitrary objects. | Yes |
{
"callerTag": "my-service",
"calleeTag": "braavos",
"path": "/2.0/users/{username}",
"method": "GET",
"description": "ensure user has payment information configured",
"metadata": {
"tags": ["billing", "identity"],
"prod": true
}
}
Create a dependency
POST /api/v1/catalog/{caller-tag}/dependencies/{callee-tag}?method={method}&path={path}
{
"description": "ensure user has payment information configured",
"metadata": {
"tags": ["billing", "identity"],
"prod": true
}
}
Retrieve a dependency
GET /api/v1/catalog/{caller-tag}/dependencies/{callee-tag}?method={method}&path={path}
Update a dependency
PUT /api/v1/catalog/{caller-tag}/dependencies/{callee-tag}?method={method}&path={path}
The request body is considered a modified version of the already existing entity. Leaving a field out of the JSON will be interpreted as null
.
{
"description": "ensure user has payment information configured",
"metadata": {
"tags": ["billing", "identity"],
"prod": false
}
}
Delete a dependency
DELETE /api/v1/catalog/{caller-tag}/dependencies/{callee-tag}?method={method}&path={path}
Bulk create or update dependencies
PUT /api/v1/catalog/dependencies
The request body is considered a modified version of the already existing entity. Leaving a field out of the JSON will be interpreted as null
.
{
"values": {
"my-service": [
{
"tag": "braavos",
"path": "/2.0/users/{username}",
"method": "GET",
"description": "ensure user has payment information configured",
"metadata": {
"tags": ["billing", "identity"],
"prod": true
}
}
],
"my-other-service": [
{
"tag": "my-service",
"path": "/1.0/widget/{id}",
"method": "GET",
"description": "get widget",
"metadata": {
"tags": ["widget"],
"prod": true
}
}
]
}
}
Sync dependencies
Cortex syncs dependencies every day at 12:00 a.m. UTC.
If you need to sync dependencies manually:
- Navigate to Tools > Relationship graphs.
- Click Sync dependencies at the top of the page.