Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Explore the new Cortex UI redesign in our overview video:
Cortex Internal Developer Portal makes it easy to ensure ownership, enforce standards, and unlock developer self-service, in weeks — not years.
An entity is an object that represents a software construct. A defined collection of entities is known as a catalog. All entities are represented in YAML, can pull in data from integrations, and can be Scorecarded.
Each entity has its own page that centralizes data related to it, allowing you to quickly access the information you're looking for. Learn more in the Entity details page documentation.
You can create your own entity types or use one of the default entity types.
By default, Cortex supports the following entity types:
Services: The default type and the core of your catalog, used for entities such as microservices, libraries, components, etc – essentially any codebase-like module. Learn more in Add services.
Domains: An entity that allows you to group your services, resources, and other domains into hierarchical, logical units. Learn more in Add domains.
Teams: An entity to store all of your team data. Learn more in Add teams.
Cortex also supports pulling in resources directly from AWS, Azure Resources, and Google Cloud as their corresponding types out of the box.
In addition, you can create custom entity types to fit your organization's needs. Learn more in Add custom entity types.
Whether you use the UI or GitOps to manage entities, every entity in your Cortex catalogs is defined by a YAML file called the Cortex entity descriptor, also referred to as an entity's Cortex YAML
(stemming from cortex.yaml
, the name of the file that powers the GitOps approach.)
Each file is a fully compliant OpenAPI 3 spec file, with our own Cortex-specific extensions.
Any additional metadata you want to add to your descriptor belongs in the info
section. Throughout the docs, you'll see snippets that start with x-cortex-*
– make sure to add this to the info
section.
Note that it is not currently supported to include comments in YAML files.
By default, your account is configured to edit entities through the UI. We recommend starting with the UI editor, which includes a built-in YAML editor, then switching over to GitOps when ready for a wider rollout.
If you want to use GitOps to manage your entity YAML files, you can change this setting:
In Cortex, navigate to Settings > GitOps.
Scroll down to the "Options by entity type" tile.
To only allow editing of entities via GitOps, toggle off the setting next to Enable UI editing for new entity types.
To only allow creation of entities via GitOps, toggle off the setting next to Enable UI importing for new entities.
When using GitOps, you can define any number of entities in any repository.
Domain definitions should live in the .cortex/domains
directory in your repository.
Team definitions should live in the .cortex/teams
directory in your repository.
You may store all of your entity definitions in a single repository or you can store the YAML in the repository of the corresponding service.
See the single repository example below:
Read more in Using GitOps for Cortex.
Entity tag
The entity tag - the value of x-cortex-tag
in an entity's YAML file - is a unique identifier that's used throughout Cortex. For example, the entity tag is used to declare dependencies on other entities or look up information using the Cortex Slack Bot.
The entity tag must be globally unique across all entities. It is possible to customize the entity tag.
Cortex ID
A Cortex ID (CID) is a unique, immutable entity ID that can be used outside of Cortex for historical tracking and reporting. It can be used in the API, in CQL queries, in-app, and you can use it with the Cortex Slack Bot. The ID is automatically generated by Cortex and it is 18 characters in length.
In Cortex, the CID for an entity appears in the URL for an entity and at the top of an entity page:
The CID does not appear in an entity's YAML file, as it cannot be modified.
After an entity is imported or created, it will automatically belong to a catalog based on the entity type criteria set for each catalog. When you create a custom catalog, you can set the entity type criteria.
For the default catalogs, the entity type criteria is set by default:
The Services catalog contains service
entity types
The Domains catalog contains domain
entity types
The Teams catalog contains team
entity types
The Infrastructure catalog contains any entities that are not the types service
, domain
, or team
.
By default, any custom entity types you create will belong to the Infrastructure catalog. If you do not want the entity type to belong to this catalog, you can add the entity type to a different catalog.
The All entities page lists all entities that have been imported into Cortex, across all types. This page will open to the Mine tab when a user owns any entities; otherwise, it will default to the All entities tab.
Once you’ve imported entities, you’ll be able to see the entity’s name and tag. In the beginning, you may have just a few dozen entities, but eventually you may have hundreds, if not thousands, of entities across all catalogs.
There are several ways to search and filter your entities list:
To find specific entities, use the search bar in the upper right corner of the entities list and type to search.
Click Name to select whether you want to sort by name or identifier, and whether to sort ascending or descending.
Click Display to choose whether to show archived entities in the list, and select which columns to display alongside entities. Learn more about the performance indicator columns below.
Click Filter to narrow down your list by AWS account ID or region, domain, entity type, group, team, or user.
Click Display to select whether to display the following key performance indicators as columns alongside entities:
Incidents: Displays how many active incidents are associated with a given entity. This information is pulled from FireHydrant, PagerDuty, and Rootly.
Health: When you click into this column in an entity's row, you can view more information on:
Monitors: Shows how entities are performing against monitors you’ve created in your APM. When an entity is passing all monitors, this cell will display All OK
; otherwise, it will display Failing
, Warning
, or No Data
, along with how many monitors the entity is not hitting. This information is pulled from Datadog.
Error rate: Shows the percentage of transactions that result in a failure during a pre-specified window. This information is pulled from New Relic.
If you have not set up an integration needed to populate a column, that column will not appear on the "All entities" page or on specific catalogs. If an integration is established, but the data and/or configuration for an entity do not exist, the cell will display “None.”
To view all entity types, go to Catalogs > All Entities then click the Entity types tab.
A Cortex logo appears next to built-in entity types. When you hover over the logo, you will see a "Powered by Cortex" banner:
The other entity types in the list are custom types.
To learn more about adding each type of entity, see their documentation pages:
If you want to adjust these settings per entity type, you can disable the toggles for individual entity types. In the list of entity types, disable the toggles next to UI editing and UI importing to use a GitOps approach instead of the UI.
Apdex (Application Performance Index): Ratio of the number of satisfied and tolerating requests to the total number requests made. This information is pulled from New Relic.
A catalog is a defined selection of entities. You can use catalogs to track and store information about all of the components that make up your infrastructure. This includes everything from services and domains to AWS S3 buckets and RDS, Google Cloud resources, or Azure Resources.
While entities are defined by YAML files, catalogs themselves are not defined by a YAML file and must be created in the Cortex UI. Think of catalogs as a folder containing a collection of entities, with each entity defined by its own YAML file. An entity can belong to multiple catalogs, so you can also think of a catalog as a filter that defines which entity types to group together.
In the example screen shot below, the Services page contains a list of all entities that belong to the Service catalog:
By default, Cortex comes with four built-in catalogs:
Services contains all service entities.
Infrastructure contains all entities representing your infrastructure assets.
Cortex pulls in resources directly from AWS, Azure Resources, or Google Cloud, as their corresponding types out of the box. These resources are automatically added to the Infrastructure catalog.
Domains contains all domain entities and displays them in a hierarchical view.
Teams contains all team entities and displays them in a hierarchical view alongside a leaderboard based on Scorecards.
You can choose to rename these catalogs to fit your own taxonomy, but note that the custom names of these default catalogs will not override the references to their default names throughout the app. Instead, you could choose to create additional custom catalogs.
To customize your Cortex instance to your organization's needs, you can also define custom catalogs in Cortex to represent your infrastructure. See Create custom catalogs below.
Click Catalogs from the main nav to view your list of catalogs. You must have the View catalogs
permission.
You can view and manage all entities in your Cortex account under Catalogs > All Entities. You can organize entities into catalogs to make it easier to find and manage them.
On that page you can also create entity types, which determine the types entities you’ll import into Cortex.
Cortex comes with built-in entity types to get you started quickly. These entity types do not have a definition schema, and instead fetch details on demand from the original source. You can also create your own entity types.
To view all entity types, go to Catalogs > All Entities then click the Entity types tab.
On the All catalogs page, you’ll find all pre-defined and custom catalogs in Cortex.
This page will reflect the same list of catalogs you find in the Catalogs dropdown menu in the main nav.
Just like "All entities", "All catalogs" includes a search bar and a sort function, as well as a toggle for displaying or hiding Drafts.
From this page, you can create new catalogs and edit existing ones.
You can create catalogs in the Cortex UI. For each catalog, you set the criteria that determines which entities belong to that catalog. In addition, you can define custom entity types to categorize the entities that live in your catalogs.
Because catalogs are not defined by a YAML file, it is not possible to create them via a GitOps workflow.
To create, edit, and delete catalogs, you must have the Edit catalogs
permission.
To create a new catalog:
At the top of the "All catalogs" page, click Create catalog.
Configure the "Create catalog" form:
Name: Enter a name for the catalog.
Description: Optionally, enter a description of the catalog.
Display icon: an icon to appear alongside the catalog throughout the app.
URL: Enter a unique URL slug.
By default, the URL slug will be generated based on the catalog’s name, but you can use the URL field to create a custom slug.
Add entity types: In this section, you will define the entities that are included in your catalog. All entities that match the criteria defined in this section will be automatically included in the catalog. To create a catalog, you need to add at least one entity type. Catalogs can include a combination of any entity types, or can include just one type.
Selection type: Choose whether to include or exclude the entity types you select.
Entity types: Select from the entity types you've created.
Include or Exclude groups: Choose groups to include or exclude.
CQL expression: Optionally, enter a specific CQL expression to fine-tune your catalog based on specific criteria.
Draft: Choose whether to save the catalog as a draft or publish it. Only admins and managers have the ability to view drafts.
Click Save catalog.
Once the catalog is created, you’ll find it under Catalogs > All catalogs, automatically populated with all entities that apply based on the entity types you've created.
To edit a catalog:
In Cortex, go to Catalogs > All catalogs. Click into the catalog you want to edit, then click Edit catalog at the top of the page.
This will bring you back to the catalog creation page, with all the details from your last save.
Make any changes necessary to the catalog.
At the bottom of the page, click Save catalog.
You can use the audit log to track changes made to any of your catalogs. Catalog updates will be listed as CATALOG
in the Type column, and the updated catalog will be listed under the Entity column.
The Action column will indicate whether a catalog was created, deleted, or updated.
After an entity is imported or created, it will automatically belong to a catalog based on the entity type criteria set for each catalog. When you create a custom catalog, you can set the entity type criteria.
For the default catalogs, the entity type criteria is set by default:
The Services catalog contains service
entity types
The Domains catalog contains domain
entity types
The Teams catalog contains team
entity types
The Infrastructure catalog contains any entities that are not the types service
, domain
, or team
.
By default, any custom entity types you create will belong to the Infrastructure catalog. If you do not want the entity type to belong to this catalog, you can add the entity type to a different catalog.
You must have the Configure appearance settings
permission to configure the catalog display.
By default, catalogs will appear in alphabetical order, but you can manually adjust the order that the catalogs appear in the main nav.
Navigate to Settings > Workspace > Main sidebar to drag and drop catalogs into your preferred order:
Teams serve as both an entity representing your organization in Cortex and as owners for different entities in the catalogs. Teams offers a centralized place for the most important information about each group, making it easier for everyone to find what they need.
Teams can be assessed via Scorecards, interact with integrations, and leverage custom data. They can also be configured in a hierarchy.
To view your teams, navigate to Catalogs > Teams.
When you open the Teams catalog page, you'll see Mine and All, which denote teams you belong to and all teams at your organization, respectively. The teams that appear under "All" will automatically display as a hierarchy, whereas those under "Mine" will be listed individually.
On the right side of the Teams catalog page, see the Scorecard Leaderboard, which highlights the ten best-performing teams within your organization.
The leaderboard is calculated from the average of Scorecard scores for all entities owned by a team. Change in rank is based on the team's score 7 days ago. You can use the dropdown to select a different Scorecard, allowing you to view the leaderboard based on specific Scorecards.
The leaderboard gamifies entity quality and encourages team members to achieve goals. This creates a culture of accountability, where everyone has visibility into how they're performing.
Each team has its own details page, where you can view key details about the team. Click a team from the Teams catalog page to view its details.
At the top of a team details page, you’ll find on-call information, Slack channels, and parent and children teams.
Additional information appears in tabs on the team's details page:
The Overview tab includes:
On-call information.
Linked Slack channels.
Where the selected team belongs within the broader hierarchy.
How the team is performing across Scorecards. By default, this will show the level that the team’s entities have reached in each Scorecard.
On the right, enable the toggle next to Aggregate children scores to include child entities in the Scorecard overview.
A list of recent events associated with this team, such as alerts from PagerDuty.
The Members tab includes a list of all team members, as well as their contact information. You can also add tags for each user to signify each member’s role on the team. When available, Cortex will also pull in profile photos from your Git provider.
The Entities tab shows a list of all entities that the team owns.
The Dependencies tab shows any incoming or outgoing dependencies associated with this team.
Teams not only allow you to collect vital information in a single place, but are also crucial for ownership. Rather than assign an entity to individual team members, you can assign ownership to an entire team. This makes it easy to assign multiple team members to an entity, and it ensures that when a team’s composition changes, ownership is updated accordingly.
Read more in the Ownership documentation.
You can create teams:
By importing them from a connected integration (e.g., Workday, GitHub)
Manually in the Cortex UI
Via the entity descriptor YAML through GitOps
Via the API
You can configure teams to reflect the actual hierarchy at your organization while creating or importing teams in Cortex. A team can be defined as the parent of one or more teams while also being the child of another team.
When you access the Teams catalog, individual teams and parent teams are displayed by default. Parent teams have an arrow next to their name, indicating that you can expand to view children teams.
In the above example, My Company
is a parent team with 7 child teams nested under it.
See the tabs below for instructions on each method.
If you have an existing source of truth for your teams and team members, we recommend importing teams. By integrating with your identity provider at this stage, Cortex will automatically sync team pages with your source of truth so you don't have to update information in more than one place when people join or leave teams.
Each integration syncs teams daily.
You can only import entities from integrations that have already been configured.
Teams from the following integrations can be imported:
Before following the import process, you must configure table mappings.
For the Workday integration, you can enable automatic import of discovered teams.
After configuring an integration that includes teams, follow these steps to import teams:
In Cortex, navigate to Catalogs > All entities, then click Import entities.
Select the integration to import from.
If you have a large volume of entites, click Filter in the upper right corner of the results list to select and apply entity type filters.
At the bottom of the page, click Next step.
Edit the details for the entity:
Type: Select Team
.
Name: Enter a human readable name for your team.
Identifier: This field is auto-populated based on your entity name. It is a unique identifier for your entity. This is also known as the x-cortex-tag
.
Description: Enter a description of the team to help others understand its purpose.
Groups: Select groups to segment your entity.
Members: Select members of your team. Team members will be marked as owners of entities and receive notifications about entities owned by the team if notifications are enabled.
Links: Add links to external documentation, such as runbooks, docs, logs, or custom categories.
Slack channels: Link the team's associated Slack channel. If notifications are configured, the team will receive notifications here.
You must have the Slack integration configured before linking a channel.
Parents and Children: Define parent and children teams. This is where you configure the hierarchy for your entity. These can be visualized in the relationship graph.
On-call: Configure the on-call service associated with this team. When selected, you will see the latest on-call information displayed on the team's details page.
Click Confirm import.
If you don’t have an identity provider with updated team information, you can create a team manually within Cortex. Because teams are important for effective ownership, it's recommended that you create teams in Cortex even if you don't have a single source of truth for team information.
In Cortex, navigate to Catalogs > Teams, then click Import teams.
Configure the form:
Configure the team details:
Type: Select Team
.
Name: Enter a human readable name for your team.
Identifier: This field is auto-populated based on your entity name. It is a unique identifier for your entity. This is also known as the x-cortex-tag
.
Description: Enter a description of the team to help others understand its purpose.
Groups: Select groups to segment your entity.
Members: Select members of your team. Team members will be marked as owners of entities and receive notifications about entities owned by the team if notifications are enabled.
Links: Add links to external documentation, such as runbooks, docs, logs, or custom categories.
Slack channels: Link the team's associated Slack channel. If notifications are configured, the team will receive notifications here.
You must have the Slack integration configured before linking a channel.
Parents and Children: Define parent and children teams. This is where you configure the hierarchy for your entity. These can be visualized in the relationship graph.
On-call: Configure the on-call service associated with this team. When selected, you will see the latest on-call information displayed on the team's details page.
Click Confirm import.
Once you've created a team, you can view it on the Teams page within the hierarchy. If you haven't added parents or children, you can disable View as hierarchy to see the list of all teams.
You can manually create teams in Cortex and define them in the entity descriptor.
You can also define teams as owners via entity descriptors. See the Ownership documentation for more information.
If your entity is a team, you must specify x-cortex-type
as team
.
The x-cortex-team
tag has two main sections: groups
and members
.
Adding groups to the team entity descriptor
Use groups
to link your team entity with a team on a different platform that you have integrated with Cortex. You can only link one group to a team entity.
For example, you can specify:
Under groups
, when you specify okta-security-team
, your team will contain all the members from your okta-security-team
.
Now, if you specify the okta-security-team
in your x-cortex-owners
on any of your other entities, they will automatically recognize example-team
as a team that owns their entity.
Adding team members to the team entity descriptor
members
can be used to add individual members to your team when you have a use case for a team entity that doesn't correspond exactly to a team on one of your integrations. Members support roles
. For example, the following entity includes a member who has the product-manager
role and a member who has both the engineering-manager
role and manager
role:
After specifying the YAML example above, your team now will contain Product Manager
and Engineering Manager
. If product-manager@cortex.io
or engineering-manager@cortex.io
were to correspond with the email of an actual account in Cortex, they would start seeing example-team
being displayed as a team that they're a part of (i.e., it would start showing up in their Mine
tab in catalogs that contain teams).
Roles must be defined for your workspace in your Entity Settings page, under the "Teams" tab.
Team children
You can define a list of other teams as children, allowing you to represent a hierarchy of how your teams are modeled across your workspace, using the x-cortex-children
tag.
This hierarchy is available to look at in the Teams catalog page.
Team parents
Team children allow you to define the team relationship from the top-down, but in some cases it may be easier to define the team hierarchy from the bottom-up. For these cases, x-cortex-parents
can be added to any entity's YAML to define its parents.
Example cortex.yaml
Note: the YAML definition for a team entity can take file names other than cortex.yaml
or cortex.yml
; see the GitOps example repository structure.
You can create, update, and delete teams using the Cortex API.
It is possible to edit entities after creating them:
Navigate to the entity's page.
In the upper right corner, click Configure entity.
Make any desired changes.
Note: The only field you cannot edit is the identifier.
At the bottom of the screen, click Save changes.
You can manually create a team member role:
In Cortex, navigate to Settings > Entities > Teams.
Click Add role.
In the "Add role" modal, configure the role:
Role name: Enter the role's name.
Tag: The tag - a unique identifier for the role - automatically populates based on the role name.
Role description: Enter a description of the role.
Enable notifications by default: If notifications are enabled, members with this role will receive relevant updates on Scorecards, Initiatives, and more.
Click Save.
You can apply a role only to manually-created team members. Team members who were imported from an identity integration will retain the role that was imported.
To apply a role:
In Cortex, navigate to Catalogs > Teams.
Click into a team.
In the upper right corner, click Configure entity.
Click Members.
Next to a team member, click the edit icon.
In the side panel, add a new team role.
Click Update.
Under Settings > Entities > Teams, there are several settings relating to teams:
In this section, you can select which identity providers will be used to sync team and team memberships into Cortex.
When importing teams, you will see the option to import from the enabled IdPs listed here.
When enabled, any discovered teams and team relationships from Workday are automatically imported.
In order for teams to be imported, Workday needs to be enabled under the Enabled identity providers section on this settings page. The Workday report must include the managerEmail
field in order for team relationships to be auto imported.
When enabled, entities can only be edited by specific members of the team that own them. Read more about this feature in Team ownership entity editing.
When enabled, all team members will be granted edit access. You will not be able to turn off edit access for individual members in your teams configuration when this is enabled.
When enabled, Cortex will automatically assign roles to team members based on your enabled identity providers. Leave this option disabled to assign team roles manually.
This process is described above, under Adding team member roles.
Each entity has its own page that centralizes data related to the entity, allowing developers to reduce context switching.
While viewing entities in a catalog, or from the Catalogs > All entities page, click an entity name to open that entity's details page.
When you first open an entity, see an overview of relevant information. If there are any active incidents, you will see them at the top of the page, in addition to recent events, on-call, owners, Slack or Microsoft Teams channels, groups, repository, language, and related domains.
During an incident, the entity details page allows you to quickly find the information you need all in one place: the active incident itself, who owns the entity and who is on-call, which Slack channel to communicate in, dependencies that could be affected, and the most recent deploys.
If data is not available for a field on the entity page, it will not appear in the overview. For example, if you do not have the Slack integration configured, then the "Slack channels" field will not be displayed.
In the left sidebar of an entity, drill further into the entity's recent deploys, events, security vulnerabilities, monitoring metrics, and more, giving you the insight you need to solve an incident quickly and efficiently.
In the sidebar, click into each category for more information:
API explorer: Pulls from API documentation added to your entity.
Events: Recent events such as deploys and other integration events.
Links & docs: Documentation links you have added to the entity, along with documentation pulled from the related repository.
On-call & incidents: On-call information from Opsgenie, PagerDuty, Splunk On-Call (formerly VictorOps), and xMatters, and incidents pulled from incident.io, PagerDuty, FireHydrant, and Rootly.
Owners: See the teams who own the entity, the related Slack or Microsoft Teams channels, and a list of team members.
Learn more about how to define entity owners in Defining ownership.
Entity YAML: View the entity YAML that defines this entity.
Scorecards: A list of any Scorecards that are in progress where this entity is being scored. In additional, see the average score, median score, and a graph showing the entity's scores over time.
Initiatives: A list of all active Initiatives for this entity, including the Scorecard's current level and the due date of the Initiative.
Workflows: A list of Workflows that include this entity. If any Workflows are pending approval and you were designated as an approver when the Workflow was created, you will see the pending approval at the top of this page. This page also includes a list of recently run Workflows and the ability to run any related Workflows.
Under the "Connections" header, integration data for the entity is contextually grouped. When you configure integrations, data will be pulled in to the following sections on the entity details page:
CI/CD: Pulls from deploys API, Azure DevOps, Bitbucket, Buildkite, CircleCI, GitHub, and GitLab.
Custom data & metrics: Pulls from custom data and Eng Intelligence custom metrics.
Environments: Pulls from AWS and Kubernetes.
Issue tracking: Pulls from Azure DevOps, ClickUp, GitHub, GitLab, and Jira.
Monitoring: Pulls from Coralogix, Datadog, Dynatrace, Google Observability Cloud, Lightstep, New Relic, Prometheus, Splunk Observability Cloud (formerly SignalFX), and Sumo Logic.
Packages: Pulls from the packages API and any packages automatically discovered from your configured git repositories.
Repository: Pulls from Azure DevOps, Bitbucket, GitHub, and GitLab.
Integration settings: This page lists the integrations that are enabled and connected for this entity.
Under the "Plugins" header, see any plugins in your workspace that are relevant to this entity.
Learn more about entities in Manging entities.
To ensure a smooth and successful implementation, most of our customers partner with Cortex Professional Services (PS) for expert guidance and hands-on assistance. If you've already purchased a PS engagement, your dedicated team will be reaching out soon to kick things off.
If you haven’t engaged with PS yet, don’t worry—you can still take advantage of our expertise! Reach out to learn how we can support your implementation and adoption journey so you get the most out of Cortex.
You can access your Cortex workspace using the workspace ID provided to you by your Cortex team. Or, if you are deploying Cortex on-premises, the Cortex team will provide you with access to an installer.
Your initial login will be configured to use Google for Single Sign-On (SSO).
After accessing your account, you can add users to your Cortex workspace.
We recommend having at least two users with the Admin
role configured to ensure redundancy of access.
Go further
We recommend reviewing the following resources:
We recommend configuring at least one integration from each of the following categories:
Configuring an on-call provider allows you to map services and other entities to the proper on-call rotations and manage alerts.
Configuring a communication provider allows you to receive timely notifications and collaborate seamlessly with team members.
Connecting your teams and team members in Cortex allows you to efficiently track ownership of entities.
Go further
It would also be beneficial to configure integrations for categories such as:
After you’ve configured some basic integrations, you can start importing your entities. Connecting your entities to Cortex allows you to easily track ownership and create Scorecards to enforce standards and track progress on related projects.
Before importing entities, consider your data modeling approach.
Identify the key entities that you want to represent in your Cortex catalogs.
Navigate to Catalogs > All entities.
Click Import entities.
Follow the on-screen prompts to import the entities that Cortex discovered from your integrations.
As you integrate additional tools with Cortex, it can also become possible to streamline work during an incident, efficiently track issues, monitor your code for vulnerabilities, and more. See the documentation for a full list of available integrations.
Cortex supports connecting teams from the following integrations:
Go further
When you first start using Cortex, we recommend creating an onboarding Scorecard to ensure that your entities are configured with the basics.
To get started:
From the main nav, click Scorecards.
Click Create Scorecard.
Cortex offers templates to help you get started with common use cases. Click the Onboarding Scorecard.
Review the default integrations, levels, and rules that are included in the template. You’ll get a chance to edit these on the next page. Click Continue.
Configure your Scorecard, making any modifications necessary.
For in-depth instructions on creating Scorecards, see Creating and editing Scorecards.
When you are finished, click Save Scorecard.
Go further
Congratulations - you are on the path to achieving engineering excellence with Cortex!
Now that you’ve completed your first steps, we recommend exploring the following topics:
Reach out to your Customer Success Manager for more information on enabling this feature.
Reach out to your Customer Success Manager for more information on enabling this feature.
Services are a default entity type in Cortex, used for entities such as microservices, libraries, components, etc – essentially any codebase-like module.
To view services, click Catalogs > Services from the main nav.
When you open the Services page, you'll see tabs labeled Mine and All, which denote services you own and all services visible to you in your Cortex workspace.
At the top of your services list, you can choose how the list is displayed:
Name: Click Name, then choose whether to sort by name or identifier, and whether the sort order should be ascending or descending.
Display: Click Display, then choose whether to display hierarchies, whether to show archived, and which columns to display.
You can create services:
By importing them from a connected integration
Manually in the Cortex UI
You can import services directly from third-party integrations:
In Cortex, navigate to Catalogs > All entities, then click Import entities.
Select the integration to import from.
If you have a large volume of entites, click Filter in the upper right corner of the results list to select and apply entity type filters.
At the bottom of the page, click Next step.
Edit the details for the entity:
Type: Select Service.
Entity name: Enter a human readable name.
Identifier: This field is auto-populated based on your entity name. It is a unique identifier for your entity. This is also known as the x-cortex-tag
.
Description: Enter a description of the entity to help others understand its purpose.
Links: Add links to external documentation, such as runbooks, docs, logs, or custom categories.
On-call: Configure on-call information.
Repository: Select the repository associated with this entity.
Click Confirm import.
To create a service:
In the main nav of Cortex, click Catalogs > Services.
At the top of the Services page, click +Import entities.
Configure the form:
Type: Select Service.
Entity name: Enter a human readable name.
Identifier: This field is auto-populated based on your entity name. It is a unique identifier for your entity. This is also known as the x-cortex-tag
.
Description: Enter a description of the entity to help others understand its purpose.
Owners: Define ownership for your entity. We recommend selecting team owners to keep your ownership information up-to-date through any future personnel changes.
Links: Add links to external documentation, such as runbooks, docs, logs, or custom categories.
On-call: Configure on-call information.
Repository: Select the repository associated with this entity.
When you are finished, click Confirm import at the bottom of the page.
Service entity descriptor
A barebones spec file has the OpenAPI version, along with an info
section that contains some basic details.
Required fields
The only required fields under info
are the title
, x-cortex-tag
, and x-cortex-type
. The description is optional, but we highly recommend adding descriptions to all of your entities.
Example cortex.yaml for a service
It is possible to edit entities after creating them:
Navigate to the entity's page.
In the upper right corner, click Configure entity.
Make any desired changes.
Note: The only field you cannot edit is the identifier.
At the bottom of the screen, click Save changes.
Incoming dependencies are inferred based the outgoing dependency definitions.
When a dependency deprecates its API or makes backwards incompatible changes, Cortex surfaces these issues via these methods:
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.
Cortex can automatically discover dependencies from your integrations:
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.
Navigate to the entity where you need to define a dependency.
In the upper right corner of the entity details page, click Configure entity.
Click the Hierarchy tab.
In the dropdown menu, choose an entity.
Optionally, select an endpoint.
Click Add.
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:
YAML is the source of truth. If a dependency has already been set through the cortex.yaml
, the API will return an error.
Endpoints are optional. 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.
Create a dependency
POST /api/v1/catalog//dependencies/?method=&path=
Retrieve a dependency
GET /api/v1/catalog//dependencies/?method=&path=
Update a dependency
PUT /api/v1/catalog//dependencies/?method=&path=
PUT replaces entire object. 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
.
Delete a dependency
DELETE /api/v1/catalog//dependencies/?method=&path=
Bulk create or update dependencies
PUT /api/v1/catalog/dependencies
:::caution PUT replaces entire object 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
. :::
Cortex syncs AWS dependencies every day at 8:00 a.m. UTC. All other dependencies sync at 12:00 a.m. UTC.
If you need to sync dependencies manually:
Navigate to Tools > Relationship graphs.
Tagging
Use groups to segment entities.
For example, you could segment by tiers (tier-0
to indicate high priority), type (backend, frontend, library, API), or language (Python, Java).
Filtering throughout Cortex
For example, you may want a Scorecard to only apply to Python services or a catalog that only shows tier-0 services.
Reporting
You could aggregate Scorecard scores by a specific group, such as a tier.
For example, viewing a Production Readiness Scorecard broken down by tier.
While viewing an entity, its groups are listed at the top of the page:
Click the group name to view a list of all other entities that are tagged with this group.
You can define groups via an entity's YAML, directly in the Cortex UI, or via the API.
Note the following considerations:
If a group has been set in the entity descriptor YAML, an API call will not overwrite the existing value.
Groups created via the API will not appear in the entity descriptor YAML.
Groups created via the API cannot be removed via the Cortex UI.
To create a group in the UI:
Navigate to the entity that you want to apply a group to.
Click the magnifying glass icon at the bottom of the main nav, or click Catalogs > All entities and search for the entity from that page.
In the upper right corner of the entity page, click Configure entity.
Click into the Groups field.
To apply an existing group, type to search then click on the group.
To create a new group, type the group name into the field, then click the group name in the dropdown. The group will be created and applied to the entity.
At the bottom of the page, click Save.
Groups are defined as a list of tags.
Groups may not contain whitespace characters.
To determine whether or not to use groups or custom data, consider whether your use case would be considered "tagging" with a definite enum of values (backend
vs frontend
), or more freeform metadata availability-zones: [east, west]
.
Every entity in the catalog is associated with an entity type. Entity type definitions require a type
and a JSON schema that outlines the attributes that entities should conform to.
A Cortex logo appears next to built-in entity types. When you hover over the logo, you will see a "Powered by Cortex" banner:
The other entity types in the list are custom types.
You can create custom entity types:
Manually in the Cortex UI
When creating an entity type, keep in mind that these will ultimately dictate how you import specific entities later on.
To create, edit, and delete entity types, your user or API key must have the Edit entity types
permission.
In Cortex, navigate to Catalogs > All entities.
Click the Entity types tab, then click Create entity type.
Configure the form:
Name: Enter a human-readable name that will appear in the catalog for this entity type.
Type: Enter a unique identifier that corresponds to the entity type. This will be used to specify the type defined in the YAML definitions for imported entities.
Description: Optionally, enter a description for the entity type.
Display icon: Select an icon to appear alongside the entity type throughout the app.
Schema: Define a JSON schema that will be used to validate the x-cortex-validation
block of a given entity’s YAML.
This is not required to create an entity type, but will be useful if you want to enforce certain attributes about entities, such as a region or version number. Attributes defined in the schema will be required when creating an entity of that type, which can then be validated in Scorecards.
In the example screen shot, we’ve created a custom entity called Employee
— this is what we’ll use to represent individuals at our organization. In the schema section, you can see that each profile is required to include an employee’s location and their dream vacation. This means every time you create an Employee entity, you’ll define each employee’s location and dream vacation in a schema for that entity.
At the bottom of the page, click Create.
After saving, the entity type will appear in the Entity types tab under Catalogs > All entities, and you will be able to import entities of that type.
In the main nav of Cortex, click Catalogs > All entities.
At the top of the Services page, click +Import entities.
Configure the form:
Type: Select your custom entity type.
Entity name: Enter a human readable name for your entity.
Identifier: This field is auto-populated based on your entity name. It is a unique identifier for your entity. This is also known as the x-cortex-tag
.
Description: Enter a description of the entity to help others understand its purpose.
Links: Add links to external documentation, such as runbooks, docs, logs, or custom categories.
On-call: Configure on-call information.
Repository: Select the repository associated with this entity.
When you are finished, click Confirm import at the bottom of the page.
The JSON schema for a custom entity type ensures consistency and validation when creating entities of that type. The attributes listed under required
in the schema must be defined for entities of that type according to the outlined properties
.
Defining a JSON schema also enables visibility on an entity's detail page. The schema and the defined properties will appear under the Entity Metadata section on the Overview page, making it easy for users to identify key specs.
It is possible to edit entities after creating them:
Navigate to the entity's page.
In the upper right corner, click Configure entity.
Make any desired changes.
Note: The only field you cannot edit is the identifier.
At the bottom of the screen, click Save changes.
In some instances, you may want to use custom data instead of a custom entity type.
It is possible to create an entity type with an empty properties schema:
A schema is ideal for enforcing static properties across all entities, while custom data allows users to augment and update attributes.
Cortex is your source of truth to external docs. Instead of digging through wikis and other resources, you can aggregate docs on the relevant entities in Cortex in the following ways:
Links appear on an entity details page in the Links & docs section:
On entities, you can add links to docs, runbooks, tech specs, dashboards, and more.
In Cortex, navigate to an entity.
In the upper right corner of the entity details page, click Configure entity.
Click the Links tab.
Click +Add.
Configure the link:
To create a new type, enter the type name then click the name in the dropdown.
Name: Enter a name for the link.
URL: Enter the URL.
Description: Add a description of the link.
Click Add.
In the entity descriptor, add a list of link
objects:
name
, type
, and url
are required.
Cortex automatically embeds markdown files from the docs
folder of your repo or from the root directory. If Cortex detects relevant files, these docs show up under the Links & docs page in an entity's sidebar.
If you have specs checked into your git repository, you can embed it by adding it as a relative URL with type openapi
. For example:
In addition to providing the ability to link to specs within the service repo, Cortex also allows for links that reference other git repositories that aren't necessarily associated with your entity but still within your organization.
Power users can also specify a branch
parameter between the second and the third colon separated group, in the form github:org/repo:branch:path/to/file
. If this parameter is omitted, we will use the repository's default branch.
The request body is the following, in JSON format. See API Docs for authentication details.
Converting YAML or JSON to string You can use a lightweight utility like jq to take your yaml/json and generate a string that can be used for your request:
e.g. $(cat my_file.yaml | jq -Rsa)
If you have specs checked into your Git repository, you can embed it by adding it as a relative URL with type async_api
. For example:
The type
field is an optional enum of three types: datadog
, grafana
, or newrelic
.
The url
field is the src
value for the iframe
embed generated by your dashboard tool.
You must use your tool's embed URL for individual charts.
It is possible to display content from a source other than Datadog, Grafana, or New Relic. To do this, do not specify an option for the type
field. The URL you add must be publicly accessible or provide cross-platform authentication for Cortex to view and display the iframe. For example, if the content is accessible via VPN, then you should be able to view it in Cortex while on the VPN.
/slack links <tag-or-id>
to list all documentation links for an entity
/slack links [type] <tag-or-id>
to list specific types of documentation links for an entity
For example:
To list all documentation links for an entity with ID en29f044598b112345
, you could run the following command in Slack:
/cortex links en29f044598b112345
To list the OpenAPI specs for an entity with tag plugin-extension
, you could run the following command in Slack:
/cortex links openapi plugin-extension
Ownership is a core use case of Cortex, as many organizations seek to establish clear ownership of services, data, and other entities. Entities should be owned within Cortex to ensure appropriate action can be driven using Scorecards and Initiatives.
Ownership can be defined by accepting Cortex's automated recommendations for ownership, pulled in from third-party integrations, or defined manually in the Cortex UI.
When viewing an entity, the owners appear in the metadata bar at the top of the page:
Click into the team name to view the team's entity page, including a list of members and a list of entities owned by that team.
You can define owners based on:
A team
We recommend setting up teams as owners. If you link a group
in your YAML file from a different platform (such as Okta), the members of the team will be automatically updated in Cortex if anyone leaves your organization and is removed from your integrated identity provider.
A user email address
Owners can be defined:
By accepting Cortex's automated recommendations for owners, based on repository activity
Automatically if Cortex detects that an entity is owned by a team that does not yet exist in Cortex
If an entity's YAML references a team, but that team doesn't have a corresponding entry within Cortex, Cortex will automatically create a team. The team will include a label that says Automatically created by Cortex.
Directly in the Cortex UI
Search for and select the entity whose ownership you want to edit.
In the upper right corner of the entity's page, click Configure entity.
Click the Owners tab, then click +Add next to Teams or Users.
Add team:
Select a team from the dropdown menu, then click Add.
Add user:
Select a user from the dropdown menu, then click Add.
You can also add a user who is not listed in Cortex. To do this, enter an email address into the Email address field, then click Add.
The x-cortex-owners
field allows you to define a list of owners of type email or group.
Cortex recognizes groups from the following integrations:
The value of provider
is the name of the integration that the group is coming from. The available list is:
ACTIVE_DIRECTORY
AZURE_DEVOPS
BAMBOO_HR
CORTEX: Use when referring to a team defined in Cortex; these teams do not map to identities from a connected integration.
GITHUB
GITLAB
OKTA
OPSGENIE
SERVICE_NOW
WORKDAY
name
is a case-sensitive field that refers to the following:
if your provider is CORTEX
, name
corresponds to the x-cortex-tag
for the Cortex team you want to identify as an owner
otherwise, name
corresponds to the upstream identifier of your owner from your integration
You can pull in all resources from AWS, and Cortex syncs those owners automatically based on their tags in AWS, allowing you to easily keep the resource owners up to date.
You can filter the entity list by owner:
In the upper right corner, click Filter.
Teams can exist within hierarchies. You can view a list of all entities that are owned by the parent team and all children teams in the hierarchy:
Navigate to the parent team's page in Cortex.
Click the Entities tab.
Click Display, then enable the toggle next to Inherited Children.
Click Done.
The list will now display all entities owned by the parent and its children teams. Note that this setting does not persist when you navigate away from the page.
Choose Import discovered entities.
On the following page, after the integration sync is complete, a list of entities from the integration are displayed. Check the boxes next to any entities you want to import.
If you selected more than one entity: After the first entity is configured, click the name of the next entity on the right to navigate to the detail editor for that entity.
Choose Create entities manually.
We’re excited for you to start using Cortex to achieve engineering excellence! If you don’t have an account yet, .
This guide walks through setting up your account, configuring your first integrations, and connecting your — services, infrastructure, teams, and more — with Cortex. After you’ve followed these steps, reach out to the Cortex team with any questions you have.
If you do not use a Google domain email address, work with the Cortex team on initial access and .
: Stay informed about onboarding status for users in Cortex.
: Assign default roles to users or create and assign custom roles with granular permissions.
: You can use the IP allowlist to control where your Cortex workspace can be accessed from.
Git providers: , , , or
Configuring a git provider allows you to discover and track ownership of entities, view important information about your repositories in Cortex, and use git data in to understand key metrics.
On-call providers: , , (formerly VictorOps), or
Communication providers: or
Teams and ownership providers: , , , , , , , , , and
Infrastructure: , , , and
Issue tracking: , , , ,
Code quality and security: , , , , , ,
Read more about entities and the default entity types in the .
If needed, .
to track and store information about the entities that make up your infrastructure.
serve as both an entity representing your organization in Cortex and as owners for entities in the catalogs. Ownership is a core use case of Cortex, as organizations seek to establish clear ownership of services, data, and other entities. Ownership also drives which users will receive notifications from Cortex, including alerts for on-call changes, when an entity is re-evaluated and its Scorecard changes, and more.
Teams can be assessed via , interact with integrations, and leverage custom data. They can also be configured in a hierarchy. In addition, team data can be tracked and analyzed in . You can manually create teams in Cortex or you can pull in teams from integrations.
(formerly Azure Active Directory)
Create to segment your entities.
Enhance your entities with to provide additional context and improve searchability.
Add to entities to keep everyone informed.
You can use to establish best practices, track migration, promote accountability among teams, enforce standardization across entities, or define maturity standards.
Use to prioritize specific rules in a Scorecard and set deadlines for team members to accomplish tasks.
: You can manage your entities directly in the browser-based Cortex workspace, or you can follow a GitOps approach. We recommend starting in your Cortex workspace, then if desired, switching to GitOps before a broader rollout at your organization.
: Automate running sequential actions and development workflows based on contextual data that exist inside your workspace.
: If you have a unique use case for tools or work with third parties that Cortex does not have an integration with or needs to pull in data from internal systems, we offer the option to build a plugin.
: View key metrics and high-level data to gain insights into services, bottlenecks in the pull request lifecycle, incident response, and more.
: Learn about additional settings and features to further customize your experience: API keys, audit logs, notifications, and more.
Filter: To narrow the scope of your list, click Filter then select criteria you'd like to filter by.
Via the entity descriptor YAML through
Via the
Choose Import discovered entities.
On the following page, after the integration sync is complete, a list of entities from the integration are displayed. Check the boxes next to any entities you want to import.
Groups: Select your entity.
Owners: Define for your entity. We recommend selecting team owners to keep your ownership information up-to-date through any future personnel changes.
You may see owners that Cortex . You can accept or reject the recommendations.
Parents: Define parent domains. This is where you configure the hierarchy for your entity. These can be visualized in the .
Dependencies: Select entities that this entity depends on. These can be visualized in the .
If you selected more than one entity: After the first entity is configured, click the name of the next entity on the right to navigate to the detail editor for that entity.
Choose Create entities manually.
Groups: Select your entity.
Parents: Define parent domains. This is where you configure the hierarchy for your entity. These can be visualized in the .
Dependencies: Select entities that this entity depends on. These can be visualized in the .
You can create, update, and delete services using the .
In Cortex, you have the ability to define outgoing dependencies on other entities. Cortex can also automatically for some integrations. Having dependencies defined powers the ability to when a dependency deprecates its API or makes backwards incompatible changes, and the ability to visualize dependencies in a .
In Cortex, you can visualize dependencies using the relationship graph at Tools > Relationship graphs. See the for more information.
Breaking API changes are listed in your Cortex workspace under .
In the Dependencies block, click +Add entity.
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 below.
In the UI, the paths will appear in the Endpoint dropdown:
See for authentication details.
In the upper right corner of the page, click the menu icon, then click Sync dependencies.
Groups are a tagging system that can be used to group a set of together, enabling a variety of use cases including:
Use groups to include or exclude certain entities from , , , and more.
You can use the API to add groups to an entity. See the .
When should I use groups instead of ?
Cortex comes with several built-in entity types, but you can to extend your catalogs.
To view all entity types, go to Catalogs > All Entities then click the .
Via the entity descriptor YAML through
Via the
If you want entities of the new entity type to automatically belong to a specific catalog, you can configure the catalog's defined entity types while or you can to update the entity types.
If your entity is of a different type, you must specify x-cortex-type
and x-cortex-definition
. The x-cortex-definition
field is validated against the . If your custom entity type does not have specific requirements, entities of that type still need a non-null definition specified, like x-cortex-definition: {}
.
Note: the YAML definition for a custom entity can use file names other than cortex.yaml
or cortex.yml
. Please refer to the for more details.
You can create, update, and delete entity types using the .
After , you can start creating entities of that type:
Choose Create entities manually.
Schema: Enter a JSON schema to define your custom entity. See below for more information.
Groups: Select your entity.
Owners: Define for your entity. We recommend selecting team owners to keep your ownership information up-to-date through any future personnel changes.
Parents: Define parent domains. This is where you configure the hierarchy for your entity. These can be visualized in the .
Dependencies: Select entities that this entity depends on. These can be visualized in the .
Custom entity type definitions are powered by the open-source project.
After an entity is imported or created, it will automatically belong to a catalog based on the entity type criteria set for each catalog. When you , you can set the entity type criteria.
By default, any you create will belong to the Infrastructure catalog. If you do not want the entity type to belong to this catalog, you can add the entity type to a different catalog's definition.
This entity type will display in the catalogs, but entities of this type won't be validated against certain specs. Such properties can instead be defined using .
If you have configured the , you can use Slack Bot commands to .
Before editing an entity via the UI, make sure that UI editing is enabled on the under the GitOps tab.
Type: Select the .
Learn more about , , and types below.
The value of type
can be defined based on your organization's preferences. Common examples include dashboard, documentation, healthcheck, logs, metrics, and runbook. See the sections below on this page describing , , and .
You can quickly look up links using the .
Cortex uses the for rendering the documents.
When , Cortex supports embedding OpenAPI or AsyncAPI specs, embedding specs from your repository, adding relative links to a repository that isn't associated with the entity, and embedding charts (from Datadog, Grafana, New Relic, or other sources). You can also create a custom type while .
Cortex supports displaying Swagger/OpenAPI or AsyncAPI specs for each entity in the API explorer on an . You can also authorize your API and run queries directly in the API explorer.
You can use your file as an OpenAPI spec file. As mentioned in the , the entity descriptor file extends the OpenAPI spec, so you can implement the spec directly in this file.
You may have existing or external specs you want to display in the API explorer from sources such as Swagger Hub or GitHub Raw URL. Add these to the JSON or YAML spec file under the block, with the type openapi
.
Using your , you can also send your OpenAPI JSON or YAML file to the public /api/v1/catalog/documentation/openapi
for each of your entities. One API doc per entity can be uploaded and it will automatically show up as an API Doc
entry in the dropdown in the API explorer.
You may have existing or external specs you want to display in the API explorer from sources such as Swagger Hub or GitHub Raw URL. Add these to the JSON or YAML spec file under the block, with the type async_api
.
Cortex supports embedding charts from , , or directly into an entity for quick access. To view embedded charts, click the Dashboard page in the .
If you're using Grafana and seeing errors in your Grafana embeds, make sure your Grafana instance .
If you have configured the , you can use commands to list documentation directly in Slack:
The type
corresponds to the type of documentation (e.g., openapi
, documentation
, etc.). Replace <tag-or-id>
with the .
The Slack Bot links
command works for any docs links listed under x-cortex-links
. Note that it does not list the listed under x-cortex-dashboards
.
By mapping every service and resource to its responsible , issues get resolved faster, accountability is clear, and decisions happen quickly.
Ownership drives which users will receive from Cortex, including alerts for on-call changes, when is needed on an assigned entity, when an entity is re-evaluated and its Scorecard changes, and more.
You can who will be defined as owners for your entities.
By pulling information from third-party integrations in the
The ability to must be enabled.
If an entity does not have an owner and Cortex has recommendations for who the owner should be, it will be flagged in the "Owners" section of an entity details page overview, in the "Owners" sidebar link on an entity details page, and it will appear during the import process when .
On an entity details page next to the "Owners" field, click Recommendations.
Review the suggested owners. To accept a recommendation, check the box next to the recommended owner then click Add owners.
In Cortex, navigate to .
Cortex can automatically discover ownership for your AWS resources using their owner
tag. To enable this, make sure that your AWS resources have an owner tag matching the x-cortex-tag
of the corresponding Cortex team and enable the Sync ownership from AWS toggle in .
To see a list of entities you own, navigate to then click the Mine tab:
Under , click the All tab.
In the left side of the filter modal, click Teams. Select teams from the dropdown, then click Apply at the bottom.
Read more about hierarchies in .
Under , there are several settings relating to teams. Read more about these in the .
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
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
type
Type of entity and/or required component: array
, boolean
, integer
, null
, number
, object
, or string
Yes
required
Required specs for the entity type
properties
Properties of the required specs (including type
)
Yes only if the required
field is not null
spec
string
The json or yaml as a string
Custom data extends the out-of-the-box metadata that Cortex provides via integrations, enhancing your use of catalogs and augmenting details available for your entities. This data can also be used to write CQL queries and Scorecard rules.
Custom data can be defined manually in the entity descriptor, added to entities programmatically via a REST API, or sent through a webhook.
There are a few ways you can add custom data to an entity: the entity descriptor, a POST
REST endpoint, or a simple webhook.
Adding custom data via entity descriptor is optimal for low-volume, human-maintained data because it requires updating the entity's YAML when the data changes.
Using a REST API is a better option for data that comes from an automated process, like a CI/CD pipeline.
The simplest way to describe information in the YAML is to define an object.
key
Key or title for the custom data. Anything defined before the :
will serve as the key
.
✓
value
Value for the custom data. Anything defined after the :
is the value
.
✓
Custom data can be of any type, including scalars (strings, numbers, booleans), objects, and lists.
When you add custom data to an entity's YAML, you'll see the key
and value
pairs on an entity's Custom data page.
Custom data added via entity descriptor will display with a YAML
tag.
You can add a description to data by explicitly defining it along with the key
and value
pairs. While key
and value
pairs can be defined with any terms when a description is not added, value:
must explicitly be defined when a description is included.
key
Key or title for the custom data. Anything defined before the :
will serve as the key
.
✓
value
Value for the key; should be defined explicitly with value:
✓
description
Description of the custom data
✓
Note: While the description
field is always optional, it is technically "required" to add a description to custom data.
You can pipe custom data directly into Cortex by POST
ing to /api/v1/catalog/{tag}/custom-data
where {tag}
is the x-cortex-tag
for a given entity.
The request body requires the following in JSON format:
key
string
Key or title for the custom data
✓
value
object
Value for the custom data
✓
description
string
Description of the custom data
See the API docs for authentication details.
If a key has already been set through the entity descriptor, an API call will NOT overwrite the existing value. Instead, it will simply return the existing value.
If a key
is defined in the entity descriptor, the API cannot override the key. You'll see YAML
as the source
value in the response body if you encounter this situation.
To explicitly overwrite values set in the YAML file, use the force=true
flag as a query parameter.
Custom data added via API will display with a API
tag.
You can use the bulk upload endpoint to upload multiple keys for one or more entities.
PUT
data in the following format to /api/v1/catalog/custom-data
:
You can include multiple key
and value
objects for each tag. The object conforms to the same shape as the single upload API.
You can use custom data webhooks to create unique URLs that you can use to directly POST
arbitrary JSON payloads without auth or an explicit entity tag in the URL if you do not have obvious access to the entity tag or the ability to add authentication headers.
With this method, you can tell Cortex how to process the payload and map it to an entity. For example, the payload may include a data.tag
field that corresponds to the entity tag.
Go to Custom integrations settings in Cortex.
Create a custom integration for the webhook:
Name: A human-readable name for the webhook.
Entity tag JQ: The JQ expression that Cortex will use to extract the entity tag from the payload (e.g. .data.entityTag
). **If the tag Cortex extracts from the payload is not identical to the entity tag in Cortex, the endpoint will throw a 400.
Key: The unique key that will be used in CQL queries with the syntax integration(key)
. Data will be stored under the key
for entities, just like when adding data via entity descriptor or REST API.
Save the integration and copy the provided webhook URL.
cURL any JSON your heart desires to this URL!
The data can be used exactly the same way as custom data defined through the entity descriptor or the API.
Custom data added via webhook will display with an INTEGRATION
tag.
If the webhook payload does not contain a value that maps to the exact entity tag you can tell Cortex alternative mappings to look up when processing payloads.
When processing a payload, Cortex takes the output of the Entity tag JQ field in step 2 above and searches for an entity with that value as a tag. If no such entity exists, Cortex checks whether an entity has registered the value as an alternative mapping; if so, the payload is attached to that entity.
Cortex applies a data source hierarchy to determine how to handle a case where the same key
is defined from multiple sources.
The entity descriptor is the source of truth. If a key is defined there, the API or webhooks cannot override the key.
You can override keys defined in the YAML by adding a force=true
parameter when using an API, but when the entity descriptor is eventually re-processed, the data provided via the API will be overwritten.
Catalogs contain a lot of useful metadata about entities, including ownership and data from integrations. However, you may have your own custom fields that you want to include that would make exploring the catalog easier.
These can include things like:
Which AWS zones is this deployed in?
What databases does the entity consume?
When was the last successful CI run?
If the answers to these questions fit a pre-enumerated list, consider using groups. Groups are displayed on entity detail pages and can easily be applied in catalog filters.
Custom data for cataloging makes the most sense when the data is more flexible.
Custom data can then be queried against by using the Query builder, explored with CQL reports, or viewed on an entity's details page.
Cortex makes it easy to write Scorecard rules based on custom data that exists in your catalogs. When adding a rule, you can select Custom data from Choose an integration in the form editor and follow the flow. Cortex will automatically supply variables based on the custom data you've defined.
Using the custom data API to push data into Cortex is a great way to extend your Scorecards. You can send in entire JSON payloads and use jq
to process them in a Scorecard or use it as an input to a custom OPA Policy
as a Scorecard rule.
Cortex supports integrations across essential use cases for engineering excellence, including alert management, error and issue tracking, git, ownership, security, and more.
See the Integrations page on the Cortex web site to filter available integrations by use case.
Cortex has built a distributed self-throttling system to ensure that certain functionality, such as CQL evaluations or background syncs to pull data from integrations, are not going over the rate limit thresholds for specific vendors. It handles different rate limit thresholds for different APIs within the same integration, which is common for git APIs such as Bitbucket.
The system is designed to proactively throttle before hitting a 429 from the vendor, and it works regardless of how many evaluators are trying to access that integration. Note that this system does not track other requests with the same token or undocumented limits set by vendors.
In Cortex, use the relationship graph to better understand:
Dependencies
Visualize how entities relate to one another
Domains
See a hierarchical diagram of your software architecture
Teams
View your company's team structure
You can access the relationship graph in different ways:
From the main nav: Navigate to Tools > Relationship graphs. By default, the page displays all entities with dependencies and how they relate to one another.
From an entity details page:
At the top of the page, choose which relationships you want to view: Dependencies, domains, or teams.
You can apply filters to narrow the scope of the graph:
Click Filters at the top of the page.
Apply filters for the following options:
Sources
Groups
Entity types
Degrees from selected node
The page will automatically apply your selected filters and reload the visualization.
At the top of the graph, click Display options to select:
A Scorecard to filter the graph by
Whether to hide team nodes without children
Whether to hide archived entities
In the graph, click an entity to open a modal with the ability to:
Filter by this node
Go directly to its entity details page
View a list of its child entities or dependencies
You must have the Configure settings
permission.
Under Settings > Relationship graph, you can select whether to display dependencies, domains, or teams by default when you first open the relationship graph.
Terraform is an infrastructure-as-code tool that lets you provision, manage, and update infrastructure. Terraform can help you manage databases, s3 buckets, clusters, and every other component that comprises your infra.
Terraform’s ability to manage resources comes from providers, which are plugins that enable interaction with cloud providers, SaaS providers, and other APIs. Providers allow you to define as code what a resource looks like.
The instructions on this page apply to Terraform Cloud, the web-based interface for Terraform.
Provision a new instance
Terraform will automatically provide you with a starter workspace when you begin — our example workspace is named "tfc-guide-example".
Update the instance name in the Terraform variables.tf
file.
All Terraform modules come with a file called variables.tf
. As part of the Terraform script, we can enter variables for a given set, like region or instance type. In the example screen shot below, the variable name is "My Other Great Instance".
Note: Terraform modules also come with a main.tf
file, which contains instructions and information about the action. In our example, the main.tf
file describes the instance that we’re going to create through Terraform.
In Terraform Cloud, navigate to the Run page. Verify that the changes you made to the instance name in variables.tf
have applied.
In Terraform, there are two primary commands: plan
and apply
.
The plan
command creates a plan and preview of the changes that will be made to your infrastructure. During the plan stage, Terraform assesses the main.tf
file with variables and compares it against the state. If there are differences, Terraform prompts you to approve and apply the change.
When you navigate to the run that was triggered by updating variables.tf
, you can see that the plan was automatically conducted. In this case, the plan was to create an instance with the name provided earlier. Verify that the run displays a "Plan finished" message.
In AWS, you can confirm that the instance exists and that the Terraform action was successful:
Cortex not only integrates with Terraform, but can enhance your use of it. Once the integration is set up, you’ll use a Scaffolder step in a Workflow to interact with Terraform.
You must have the Configure Scaffolder templates
permission.
Create a Cookiecutter JSON file that is equivalent to your Terraform module.
Register your template in Cortex.
After you have added the template to Cortex, you can create a Workflow that includes a Scaffolder block using the template.
Run the Workflow. When you run it, Cortex will automatically open a pull request against the selected repository.
To verify that the process worked, open Terraform Cloud and navigate to Runs.
Any runs that originate from Cortex will have "[Cortex Scaffolder]" at the start of their name. When we navigate into one of these runs, we can see that it was planned and finished but not yet applied, and we can see how many changes were proposed.
Terraform Cloud also has an API that can be used to make updates without following the pull request workflow. You can use a Workflow in Cortex to execute a run through the API. If a run is set to automatically apply, then Cortex will handle the rest of the process.
Create a Workflow in Cortex.
Add a user input block.
Define inputs for Instance name
, Region
, and Instance type
.
Add an HTTP request block. Configure the following fields:
HTTP method: Select POST
.
URL: Enter the URL for the Terraform API you want to call.
Headers: Add Authorization: Bearer {{token}}
and Content-type: application/(name)
.
Payload: Build the payload by referencing the outputs of the "User input" block, e.g., {{actions.input.outputs.instance-name}}
Save the Workflow. After saving, click Run at the top of the Workflow to run it.
When the Workflow is run in Cortex, it will override data in the variables.tf
file with information that was entered in the fields.
In Terraform Cloud, you can verify that the action was successful and the run was queued. Runs triggered by actions are named "Triggered via API."
Once the run has been applied, you can also verify it in AWS. In the example screen shot below, the instance name has been changed.
Domains offer a way to group entities into hierarchical units. You can group by product area, functionality, systems, business units, or something unique to your organization. With this feature, you can cluster entities into a single, hierarchical domain that can include both parents and children.
You can define a list of other entities as children for a domain, allowing you to represent a hierarchy of how your entities are modeled across your workspace. This hierarchy is available to view in the Domains catalog, on a domain entity's details page, and in the relationship graph. The domain hierarchy can also be used to configure ownership inheritance, helping you keep track of ownership in case of personnel changes at your organization.
You can view all domains under Catalogs > Domains.
To display domains in a hierarchy:
Click Display at the top of the domains list.
Click Done.
You can also view the hierarchy for a given domain on its entity details page. If the domain has parents or children, those will appear on the Relationships page.
In the entity's side bar, click Relationships, then click the Hierachy tab.
At the top of the domain, click View in domains tree to visualize your domain hierarchy in the relationship graph.
You can create domains:
By importing them from a connected integration
Manually in the Cortex UI
Via the entity descriptor YAML through GitOps
Via the API
For simplicity, we recommend adding the highest-level domain first and then selecting it as the parent for subsequent domains. However, you can add parents and children to any domain at any point.
You can import domains directly from third-party integrations:
In Cortex, navigate to Catalogs > All entities, then click Import entities.
Select the integration to import from.
If you have a large volume of entites, click Filter in the upper right corner of the results list to select and apply entity type filters.
At the bottom of the page, click Next step.
Edit the details for the entity:
Type: Select Domain.
Entity name: Enter a human readable name.
Identifier: This field is auto-populated based on your entity name. It is a unique identifier for your entity. This is also known as the x-cortex-tag
.
Description: Enter a description of the entity to help others understand its purpose.
Groups: Optionally select groups to segment your entity.
Owners: Define ownership for your entity. We recommend selecting team owners to keep your ownership information up-to-date through any future personnel changes. You may see owners that Cortex recommends based on repository activity. You can accept or reject the recommendations.
When adding an owner, you can also configure one of the following inheritance options:
Append: Select this option to add your entity as an additional owner to all of its child entities.
Fallback: Select this option to add your entity as an owner to child entities if the child entity has no other valid owners.
None: Select this option if you do not want to configure inheritance. The owner will own the domain you are creating, but will not be configured as an appended or a fallback owner.
Parents and Children: Define parent and children domains. This is where you configure the hierarchy for your domain. These can be visualized in the relationship graph.
On-call: Configure on-call information.
Repository: Select the repository associated with this entity.
When you are finished, click Confirm import at the bottom of the page.
Click Confirm import.
In the main nav of Cortex, click Catalogs > Domains.
At the top of the Domains page, click +Import entities.
Configure the form:
Type: Select Domain.
Entity name: Enter a human readable name.
Identifier: This field is auto-populated based on your entity name. It is a unique identifier for your entity. This is also known as the x-cortex-tag
.
Description: Enter a description of the entity to help others understand its purpose.
Groups: Optionally select groups to segment your entity.
Owners: Define ownership for your entity. We recommend selecting team owners to keep your ownership information up-to-date through any future personnel changes.
When adding an owner, you can also configure one of the following inheritance options:
Append: Select this option to add your entity as an additional owner to all of its child entities.
Fallback: Select this option to add your entity as an owner to child entities if the child entity has no other valid owners.
None: Select this option if you do not want to configure inheritance. The owner will own the domain you are creating, but will not be configured as an appended or a fallback owner.
Parents and Children: Define parent and children domains. This is where you configure the hierarchy for your domain. These can be visualized in the relationship graph.
On-call: Configure on-call information.
Repository: Select the repository associated with this entity.
When you are finished, click Confirm import at the bottom of the page.
If your entity is a domain, you must specify x-cortex-type
as domain
:
Domain hierarchies
These can be defined in two ways:
From the parent entity YAML
Define children entities using the x-cortex-children
tag in the parent entity YAML.
From the child entity YAML
Define parent entities using the x-cortex-parents
tag in the child entity YAML.
While defining these relationships top-down (on the parent entity) or bottom-up (on the child entity) will both result in a hierarchy, you may choose one or the other depending on your workflow. For example, if you are frequently making changes to a group of children domains, it may be more efficient to have the children defined on the parent YAML.
Domain children
Define a list of other entities as children for a domain, allowing you to represent a hierarchy of how your entities are modeled across your workspace using the x-cortex-children
tag.
Domain parents
Define another entity as the parent for a domain, allowing you to represent a hierachy of how your entities are modeled across your workspace using the x-cortex-parents
tag.
Note: Parents must be of type domain
.
Ownership inheritance
A common use case for domains is defining ownership for the subtree of entities. Instead of defining ownership individually for every entity in your catalog, you can define ownership at the domain level and have that pass down to all of its children.
The inheritance
type for each owner can be one of APPEND
, FALLBACK
, or NONE
. If not set, inheritance is defaulted to NONE
.
APPEND
: This owner is appended to the list of owners for all child entities.
FALLBACK
: In the case where a child has no valid owners, including fallbacks, this fallback will be assigned as the owner. Note that this only applies to a child entity down the hierarchy; it is not the fallback for the parent domain itself.
NONE
: This owner owns the domain, but not necessarily any of its children (no inheritance).
Example cortex.yaml
Note: the YAML definition for a domain entity can take file names other than cortex.yaml
or cortex.yml
; see the GitOps example repository structure.
You can create, update, and delete domains using the Cortex API.
It is possible to edit entities after creating them:
Navigate to the entity's page.
In the upper right corner, click Configure entity.
Make any desired changes.
Note: The only field you cannot edit is the identifier.
At the bottom of the screen, click Save changes.
Cortex’s On-call Assistant leverages the PagerDuty integration to automatically surface the most vital information about entity health and metadata when an incident is triggered. On-call Assistant notifies the user(s) responsible for an incident via Slack, including information about the affected entity, recent deployments, ownership, and links to get more details, including dependencies, runbooks, and logs.
On-call Assistant helps users respond to incidents in real time, simplifying the incident response process and helping to reduce MTTR. It can also drive adoption and engagement through links to the catalogs and Scorecards.
When an incident is triggered in PagerDuty, On-call Assistant will notify relevant users via Slack. This alert will include information about the affected entity, deploy details, and ownership information so an on-call team member can reach out to other relevant parties about the incident.
Developers can access entity information that is already in Cortex directly from the Slack notification to quickly resolve issues. On-call Assistant provides a direct link to view the alert in PagerDuty, so you can also quickly access the incident from its source.
You must have the PagerDuty integration configured.
You must create an API key in PagerDuty with the Write
permission.
If you create an API key with Read-only
permissions, you will also need to configure a webhook to get the On-call Assistant working.
To enable, navigate to Settings > PagerDuty and toggle on Enable On-call Assistant.
If you added PagerDuty API key with Write
permissions, enabling the On-Call Assistant will create a webhook subscription in PagerDuty, allowing Cortex to receive events when incidents are triggered, escalated, or unacknowledged.
If you added PagerDuty API key with Read-only
permissions, you must also configure a webhook subscription.
Copy the webhook URL. You will need this in the next steps.
In PagerDuty, add a new webhook.
Paste the Cortex webhook URL into the Webhook URL field.
Choose Account
for scope type.
Select the following in Event Subscription:
incident.escalated
incident.reopened
incident.triggered
incident.unacknowledged
A secret will be generated. Copy the secret. You will need it in the next step.
Click Save at the bottom of the side panel.
You may have over a hundred repositories in GitHub, and eventually, you will likely import all of them into Cortex. This much information can make it difficult to know at a glance that all repositories are accounted for and all new projects are being imported into and tracked within Cortex.
You can find the Discovery audit under Tools in the main nav.
On this page, see a list of recent changes in your environment that aren't yet reflected in Cortex, including newly created repositories, services, and resources discovered from your integrations.
To search, click the magnifying glass icon in the upper right corner of the list.
To filter, click Filter in the upper right corner of the list. Select your filtering criteria, then click Apply.
Cortex will tag detected changes to signify whether an entity or repository has been discovered, archived, or deleted.
You can import, delete, or ignore the entities listed in Discovery audit.
If Cortex detects a new service or resource, you can import it directly from this page:
Click +
in the row containing the new entity:
Configure the entity details.
Click Confirm import.
If Cortex no longer detects a given entity, you also have the ability to delete that entity or repository directly from this page:
Click the trash can icon in the row containing the entity:
In the confirmation window, click Delete.
The confirmation window gives you the opportunity to review all potentially impacted services before deleting, so you don’t unintentionally remove something from Cortex.
If an event appears within the Discovery audit, but is irrelevant — for example, a test project that doesn’t need to be imported into Cortex — you can ignore it:
Click the hide icon in the row containing the entity:
The entity will now appear in the Ignored tab of the Discovery audit. The ignore action is persistent, so the event won’t appear again within the discovered list.
From the ignored list, you can move the entity back to the Discovered tab by clicking the eye icon.
In this guide, you'll learn how to set up and use the BugSnag integration to drive insights into values such as:
Outstanding errors
Error frequency
To configure the integration, provide the following information:
Auth token: Auth token generated from BugSnag
Organization slug: BugSnag organization for your instance; you can find this in settings or in your BugSnag URL (https://app.bugsnag.com/organizations//stability-center
)
Host (optional): URL for your BugSnag instance without the API path (e.g. bugsnag.getcortexapp.com
)
This is only needed if you're using a custom/self-hosted BugSnag instance
Once the integration with BugSnag is established, you'll be able to pull in error data to an entity's details page. You can find the total number of detected errors and a full list on the Error tracking page in the side panel.
With the BugSnag integration, you can create Scorecard rules and write CQL queries based on BugSnag errors.
The following options are available to get assistance from the Cortex Customer Engineering team:
Chat: Available in the Resource Center
Slack: Users with a connected Slack channel will have a workflow added to their account. From here, you can either @CortexTechnicalSupport or add a :ticket:
reaction to a question in Slack, and the team will respond directly.
Don’t have a Slack channel? Talk with your Customer Success Manager.
Integrating Buildkite with Cortex allows you to:
Pull in metrics about your builds and pipelines
Before getting started:
You must be a member of a Buildkite organization to generate and use an access token for it.
In Cortex, click your avatar in the lower left corner, then click Settings.
Under "Integrations," click Buildkite.
Configure the Buildkite integration form:
API token: Enter your Buildkite API token.
Organizational slug: Enter the slug for your Buildkite organization.
This can be found in your organization's Buildkite settings, or at the end of your Buildkite URL after navigating to Pipelines.
Click Save.
By default, Cortex will use the entity tag (e.g. my-entity
) for your Buildkite pipeline. For example, if your entity tag is my-pipeline
, then the corresponding pipeline tag in Buildkite should also be my-pipeline
.
Cortex will also use the the GitHub, GitLab, Bitbucket, or Azure DevOps repository to connect entities to Buildkite pipelines. For example, if the GitHub repo associated with your Buildkite pipeline is my-org/repo
, then entities in Cortex that also live in my-org/repo
will populate with details from that pipeline.
You can add Buildkite pipelines to an entity by defining the pipeline slug or tags with one of the following blocks in the entity descriptor:
The slug for your pipeline can be found in the Buildkite URL for a given pipeline (e.g., https://buildkite.com//
).
Once the Buildkite integration is established, Cortex will automatically pull in pipeline data to an entity's page. You can access this data from the CI/CD page in the entity's side panel.
You can find a list of pipeline runs for each pipeline linked to a given entity on this page:
Pipeline slug/tag
Action (e.g. "scheduled build")
Timestamp
Branch
State
With the Buildkite integration, you can create Scorecard rules and write CQL queries based on Buildkite pipelines.
The following options are available to get assistance from the Cortex Customer Engineering team:
Chat: Available in the Resource Center
Slack: Users with a connected Slack channel will have a workflow added to their account. From here, you can either @CortexTechnicalSupport or add a :ticket:
reaction to a question in Slack, and the team will respond directly.
Don’t have a Slack channel? Talk with your Customer Success Manager.
Checkmarx is an automated application security platform that checks source code for security vulnerabilities and compliance issues. Integrate Cortex with Checkmarx to drive insight into the vulnerabilities detected on your entities.
Before getting started, create a user with access to the sast_rest_api
scope.
In Cortex, click your avatar in the lower left corner, then click Settings.
Under "Integrations", click Checkmarx.
Click Add configuration.
Configure the Checkmarx integration form:
Username and Password: Enter the username and password for the user with access to sast_rest_api
.
Host: Enter the full URL of your Checkmarx instance.
Click Save.
By default, Cortex will use your associated Git repository (e.g. repo-name
) or the service tag as the "best guess" for the Checkmarx project name.
If your repository and entity names don’t cleanly match the Checkmarx CxSAST project names, or if you have multiple Checkmarx projects for a service, you can add a Checkmarx project ID (recommended) or a Checkmarx project name in the Cortex entity descriptor.
We recommend using the project ID as it is a unique identifier across projects.
Example using project IDs:
Example using both project IDs and names:
Once the integration is established, vulnerabilities pulled from Checkmarx will be available for each entity in the Code and Security block in the Overview tab.
While viewing an entity, click Code & security > Checkmarx. On this page, view the number of vulnerabilities per severity and a link directly to your Checkmarx instance.
With the Checkmarx integration, you can create Scorecard rules and write CQL queries based on Checkmarx details.
Does Cortex support integrating with Checkmarx One?
No, Cortex does not currently support Checkmarx one. Only Checkmarx SAST is supported for this integration.
The following options are available to get assistance from the Cortex Customer Engineering team:
Chat: Available in the Resource Center
Slack: Users with a connected Slack channel will have a workflow added to their account. From here, you can either @CortexTechnicalSupport or add a :ticket:
reaction to a question in Slack, and the team will respond directly.
Don’t have a Slack channel? Talk with your Customer Success Manager.
Integrating Cortex with Azure DevOps allows you to:
Automatically discover and track ownership of Azure DevOps entities
Follow a GitOps workflow with Azure DevOps
View information about your Azure DevOps repositories on an entity's details page, including: The repo associated with the entity, recent commits and releases in the event timeline, the most-used language in the files for that entity, the top code contributors, and their number of contributions.
View information about pull requests and work items in the dev homepage
Use Azure DevOps metrics in Eng Intelligence to understand key metrics and gain insight into services, incident response, and more.
Before you get started:
Analytics: read
Build: read
Code: read
Code: write
Code: manage
Graph & Identity: read
Work Items: read
and write
In Cortex, click your avatar in the lower left corner, then click Settings.
Under "Integrations", click Azure DevOps.
Click Add configuration.
Configure the Azure DevOps integration form:
Organization: Enter the slug for your Azure DevOps organization.
Username: Enter the username for your personal access token.
Personal access token: Enter your Azure DevOps personal access token.
Host: Optionally, if you are using a self-managed setup, enter your hostname.
Click Save.
Cortex supports mapping multiple identities for a single user if you have multiple configurations of Azure DevOps. See the Identity mapping documentation for more information.
To define an Azure DevOps repository for a given entity, add the x-cortex-git
block to the entity's descriptor.
Only one repository can be defined for in a given entity's YAML in the x-cortex-git
block.
To define Azure DevOps work items for a given entity, add the x-cortex-azure-devops
block to the entity's descriptor. If there is no work item registrations, but the entity matches a repository, we will pull in all work items from the repository's project with a tag that matches the Cortex entity name, Cortex entity tag, or the repository name.
Ownership of each entity through Azure DevOps is defined through an owner of type group
.
name
is a case-sensitive field that corresponds to the upstream identifier of your owner from Azure DevOps.
You can add Azure DevOps pipelines under the x-cortex-azure-devops
block:
Cortex maps users' email addresses to discovered Azure DevOps accounts.
Initiatives allow you to set deadlines for specific rules or a set of rules in a given Scorecard and send notifications to users about upcoming due dates.
From the Issues tab of an Initiative, you can automatically create a Azure DevOps work item from a failing rule:
Click Create issue.
In the modal that appears, fill out the form:
Integration: If you have multiple task tracking tools, select Azure DevOps from the Integration dropdown.
Name: Enter a name for the configuration.
Project: Select from the dropdown.
Options available in the dropdown are pulled in from the specific Azure DevOps instances configured in Settings.
Choose to include or exclude groups of entities, or define a more advanced filter.
The issue configuration will apply to all entities that meet the filter criteria. Once an entity is passing the rule, Cortex will automatically close the associated ticket.
The Azure DevOps integration will populate the Repo detail block on an entity's details page.
In the Recent activity preview, you'll find the recent commits and releases. These will also appear in the event timeline.
These data will appear for entities imported from a Git source or those that have a Git repo defined in their YAMLs.
Events
On an entity's Events page, you can find all of the commits and releases associated with that entity. Each is hyperlinked to the commit or release page in Azure DevOps and includes a timestamp.
CI/CD
From the CI/CD > Azure DevOps page in the entity's sidebar, see a history of pipeline runs.
Repository
You can access more detailed information pulled from Azure DevOps under Repository in the sidebar. At the top of the repository page, you'll find the repo associated with that entity and the most-used language in files for that entity. In the Top contributors block, you'll find the three users who have contributed the most code and the number of their contributions.
In the Commits section, you'll find the 10 most recent commits and metadata about each. Below Commits is the Recent releases section, which includes the 5 most recent releases.
Issue tracking
Pull requests and work items from Azure DevOps are refreshed every 5 minutes.
Average PR open to close time
Avg time to first review
Avg time to approval
PRs opened
Weekly PRs merged
Avg PRs reviewed/week
Avg commits per PR
With the Azure DevOps integration, you can create Scorecard rules and write CQL queries based on Azure DevOps work items.
Cortex conducts a background sync of Azure DevOps identities every day at 10 a.m. UTC. Pull requests and work items are refreshed every 5 minutes.
The following options are available to get assistance from the Cortex Customer Engineering team:
Chat: Available in the Resource Center
Slack: Users with a connected Slack channel will have a workflow added to their account. From here, you can either @CortexTechnicalSupport or add a :ticket:
reaction to a question in Slack, and the team will respond directly.
Don’t have a Slack channel? Talk with your Customer Success Manager.
While viewing an entity, click the Dependencies tab. In the row containing the entity you want to view in a graph, click the 3 dots icon, then click View in relationship graph.
While viewing a domain or team entity, locate an entity under the Hierarchy header. In the row containing the entity you want to view in a graph, click the 3 dots icon, then click View in relationship graph.
In this file, we defined the region and instance name. You’ll then update the fields in the variables.tf
file so it knows to pull information from the Cookiecutter JSON.
Enable to toggle next to Display hierarchy.
Choose Import discovered entities.
On the following page, after the integration sync is complete, a list of entities from the integration are displayed. Check the boxes next to any entities you want to import.
If you selected more than one entity: After the first entity is configured, click the name of the next entity on the right to navigate to the detail editor for that entity.
Choose Create entities manually.
In Cortex, on the PagerDuty settings page, click Configure webhook.
Navigate back to the browser window where your Cortex instance is open. In the Webhook configuration Secret field, enter the secret that you generated in PagerDuty.
The guarantees confidence in your catalogs by listing all changes that Cortex has detected. Cortex compares everything that exists within the system to what it discovers within your git tool, APM tool, Kubernetes cluster, and other crucial integrations, giving you insight into changes happening across your environments.
The first time you use the Discovery audit, there may be a lot to review. To narrow the scope of your list and start with changes that are the highest priority for you, search or filter the list by integration or entity type.
For detailed instructions on creating a new entity, see the relevant docs page for the entity type: , , .
is an application stability monitoring platform that provides error tracking and analytics. By integrating BugSnag with Cortex, you can view errors alongside other key metrics and gain greater understanding into your entities' operational maturity.
In order to connect Cortex to your BugSnag instance, you’ll first need to create a in the My Account section of .
Once you've created the auth token, you can configure the integration in Cortex from the .
If you're using a self-hosted instance of BugSnag, you'll need to verify that your Cortex instance is able to reach the BugSnag instance. We route our requests through a static IP address. Reach out to support at to receive details about our static IP. If you're unable to directly allowlist our static IP, you can route requests through a secondary proxy in your network that has this IP allowlisted and have that proxy route traffic to your BugSnag instance.
Each error in the list will display with an Error
, Info
, or Warning
tag based on the applied to a given error in BugSnag.
See more examples in the in Cortex.
To set a more specific standard, you can also create a rule based on a .
Email: , or open a support ticket in the in app Resource Center
is a continuous integration and delivery platform that enablers users to run fast, secure, and scalable pipelines on their own infrastructure.
Create that track progress and drive alignment on projects involving your Buildkite pipelines
Create a with read-only permissions for pipelines and builds.
In Cortex, navigate to the :
The for a build will appear as a tag next to the pipeline slug/tag (e.g. canceled
, passed
, or failed
).
See more examples in the in Cortex.
Email: , or open a support ticket in the in app Resource Center
This integration is supported for .
If you're using a self-hosted instance of Checkmarx, you'll need to verify that your Cortex instance is able to reach the Checkmarx instance. We route our requests through a static IP address. Reach out to support at to receive details about our static IP. If you're unable to directly allowlist our static IP, you can route requests through a secondary proxy in your network that has this IP allowlisted and have that proxy route traffic to your Checkmarx instance.
In Cortex, navigate to the :
See more examples in the in Cortex.
Email: , or open a support ticket in the in app Resource Center
is a Microsoft-owned version control system used for managing the software development lifecycle.
If you pull in , you can also see pipeline runs and builds in the CI/CD section of an entity's details page.
If you enable the , you will also see a list of open work items on entity pages.
in Cortex
Create that track progress and drive alignment on projects involving your repositories, Azure DevOps work items, and Azure DevOps pipeline data.
Add a with at least the following scopes enabled:
If using the with Azure DevOps, you must also enable:
In Cortex, navigate to the :
On the , you can choose whether Azure DevOps work items should be pulled in from Azure DevOps. Cortex recommends disabling this option if your organization does not use work items or if you are worried about running into rate limit issues.
See the for instructions on importing entities.
In an entity's YAML, you can define a , , , and .
Before adding work items to your entity YAML, make sure you have in your integration settings.
Learn more about ownership in .
Learn more about Azure DevOps pipelines in .
You can confirm users' Azure DevOps accounts are connected from .
Select the and the Sub-item Type from the respective dropdowns. Then, select how the sub-items's fields should be populated on issue creation and status change.
In the Issue tracking section, you can find a list of open . Each work item will show the title, summary, assignees, priority, and date created.
The Azure DevOps integration enables Cortex to pull information about pull requests and work items into the Dev homepage. You can find your open pull requests under the , any pull requests assigned to you for review under the , and any work items assigned to you under the .
The also uses pull request data from Azure DevOps to generate metrics:
Read more about how Eng Intelligence tracks metrics for teams and users in the .
See more examples in the in Cortex.
Email: , or open a support ticket in the in app Resource Center
project
Project key defined in BugSnag
✓
slug
Slug for the Buildkite pipeline
✓
tag
Tag for the Buildkite pipeline
✓
project
The name of the project as listed under the "Projects" tab when you are logged into Azure DevOps (on the https://dev.azure.com// screen)
✓
repository
The repo name you see when you navigate to the "Repos" section of Azure DevOps
✓
basepath
If the entity is in a monorepo (e.g. in a subdirectory), use this field to define the subdir
alias
Alias for the configuration in Cortex (only needed if you have opted into multi-account support)
projects
List of the projects
✓
name
The project name as listed under the "Projects" tab when you are logged into Azure DevOps (on the https://dev.azure.com// screen)
✓
wiqls
List of WIQL conditions to filter work items fetched
alias
Alias for the configuration in Cortex (only needed if you have opted into multi-account support)
piepelines
List of the pipelines
✓
projects
List of the projects
✓
name
The project name as listed under the "Projects" tab when you are logged into Azure DevOps (on the https://dev.azure.com// screen)
✓
pipelines:id
The Azure DevOps system.definitionID
for the pipeline.
✓
CircleCI is continuous integration and continuous delivery platform that can be used to implement DevOps best practices. By integrating CircleCI with Cortex, you can conveniently access information about your workflows & pipelines.
In this guide, you'll learn how to set up and use the CircleCI integration to drive insights into your CI/CD infrastructure.
In order to connect Cortex to your CircleCI instance, you’ll need to create a CircleCI API token.
Once you’ve created a CircleCI API token, you can configure the integration in Cortex from the CircleCI page in settings.
From the CircleCI settings page, you’ll see the option to Add CircleCI configuration.
Account alias: Used to tie entity registrations to different configuration accounts
API token: Personal access token generated earlier
Host: URL for your CircleCI instance if self-hosted, e.g. https://cortex.circleci.com
Configure the integration for multiple CircleCI accounts
The CircleCI integration has multi-account support. You can add a configuration for each additional by repeating the process above.
Each configuration requires an alias, which Cortex uses to correlate the designated with registrations for various entities. Registrations can also use a default configuration without a listed alias. You can edit aliases and default configurations from the CircleCI page in your Cortex settings. Select the edit icon next to a given configuration and toggle Set as default on. If you only have one configuration, it will automatically be set as the default.
Self-hosted CircleCI instances
If you’re using a self-hosted instance of CircleCI, you’ll need to verify that your Cortex instance is able to reach the CircleCI instance. We route our requests through a static IP address. Reach out to support at help@cortex.io to receive details about our static IP. If you're unable to directly allowlist our static IP, you can route requests through a secondary proxy in your network that has this IP allowlisted and have that proxy route traffic to your CircleCI instance.
You can set up the CircleCI integration for an entity by specifying its project slug in the x-cortex-circle-ci
section of the entity descriptor.
With the CircleCI integration, you can find metric & pipeline details on an entity's details page as long as that entity is associated with a project from your CircleCI instance.
Click CI/CD > CircleCI in the entity's sidebar to find the metric & pipeline details for that entity.
With the CircleCI integration, you can create Scorecard rules and write CQL queries based on CircleCI metrics and pipelines.
See more examples in the CQL Explorer in Cortex.
The following options are available to get assistance from the Cortex Customer Engineering team:
Email: help@cortex.io, or open a support ticket in the in app Resource Center
Chat: Available in the Resource Center
Slack: Users with a connected Slack channel will have a workflow added to their account. From here, you can either @CortexTechnicalSupport or add a :ticket:
reaction to a question in Slack, and the team will respond directly.
Don’t have a Slack channel? Talk with your Customer Success Manager.
Coralogix is an observability and security platform. Integrate Cortex with Coralogix to drive insights into alerts.
After setting up the integration, relevant alerts from Coralogix will appear in your entity pages. While viewing an entity, click Integrations > Coralogix in its sidebar to view the list of alerts.
Before getting started, generate a Coralogix API key.
In Cortex, navigate to the Coralogix settings page:
In Cortex, click your avatar in the lower left corner, then click Settings.
Under "Integrations", click Coralogix.
Click Add configuration.
Configure the Coralogix integration form:
Account alias: Enter your account alias.
API key: Enter your Coralogix API key.
Region: Select your region.
Click Save.
By default, Cortex will use the entity name or entity tag (e.g. my-service
) as the "best guess" for the Coralogix alert application name. For example, if your entity name is "My Service" and your entity tag is “my-service”, then the corresponding application name in Coralogix should be “My Service” or "my-service".
If your Coralogix application names don’t cleanly match the Cortex entity identifier, you can override this in the Cortex entity descriptor.
Coralogix alerts can be listed in the Catalog under the Coralogix
section. We support application names in the YAML for pulling Coralogix alerts.
With the Coralogix integration, you can create Scorecard rules and write CQL queries based on Coralogix alerts.
See more examples in the CQL Explorer in Cortex.
ArgoCD is a declarative, GitOps continuous delivery tool for Kubernetes. You can use ArgoCD to drive insights into values such as:
Deploys
To send Cortex information about syncs in ArgoCD, you can use ArgoCD notification Webhooks to call the Cortex flexible deploy REST endpoint.
Here is an example of what a argocd-notifications-cm
config map may look like:
The above example assumes your ArgoCD application's name matches the x-cortex-tag
. In this case, each application in ArgoCD can subscribe to the same trigger.
If your application name doesn't match the x-cortex-tag
, add a value/pair to the info section of the Application manifest. Then, instead of using .app.metadata.name
in the url, use .app.spec.info[0].value
.
The last step is to subscribe your application to the webhook. You do this by adding a label annotation in the Application spec in the following format:
For example, if we want to subscribe an application to the example webhook above, our Application yaml may look something like this:
Make sure the encoded Cortex API Key does not contain an extra line. Use a tool like https://www.base64encode.org/ to ensure your encoded key does not contain an extra line.
The notification webhook is managed by the argocd-notifications-controller
which will have a pod running in your ArgoCD namespace.
Assuming the ArgoCD is running in the argocd
namepsace, run the following command to get the list of pods:
kubectl get pods -n argocd
This will return a list of pods similar to the ones listed below:
In this example, the pod managing the webhook notifications is argocd-notifications-controller-6cd988b564-sql55
. To get the logs, run the following command:
kubectl logs argocd-notifications-controller-6cd988b564-sql55 -n argocd
If your trigger was successful, you should seem something similar to this:
The following options are available to get assistance from the Cortex Customer Engineering team:
Email: help@cortex.io, or open a support ticket in the in app Resource Center
Chat: Available in the Resource Center
Slack: Users with a connected Slack channel will have a workflow added to their account. From here, you can either @CortexTechnicalSupport or add a :ticket:
reaction to a question in Slack, and the team will respond directly.
Don’t have a Slack channel? Talk with your Customer Success Manager.
FireHydrant is an incident management platform that emphasizes reliability and consistency across the entire incident response lifecycle. By integrating FireHydrant with Cortex, you can drive insights into past incidents and trigger new incidents directly from the platform.
In order to connect Cortex to your FireHydrant instance, you’ll need to create a FireHydrant API key.
Once you've created the API key, you can add it under API token in FireHydrant settings in Cortex. After you've pasted in the API key, click save.
See the Create services documentation for instructions on importing entities.
For a given entity, you can define FireHydrant services by ID or slug. Each of these has the same field definitions.
identifier
Service ID or slug
✓
identifierType
Type of identifier (ID
or SLUG
)
✓
You can find the service ID value by visiting FireHydrant → Catalog → Services
. The URL for the service will also contain the ID (e.g. https://app.firehydrant.io/catalog/services//incidents
).
If you prefer to use the service slug in the registration instead, you can find it on the right-hand side of the service page in FireHydrant.
When active incidents are detected in FireHydrant, Cortex will display incident information on an entity's details page in the Overview tab. .
On-call and incidents
Detected incidents will appear in the entity's On-call & incidents page.
Each issue will be listed with its title and description (when available). Cortex will also display the status for an issue as a badge next to its name:
Acknowledged
Closed
Detected
Identified
Investigating
Mitigated
Postmortem completed
Postmortem started
Resolved
Started
The issue's severity will also appear in a badge (e.g. SEV0
, SEV1
, SEV2
).
While viewing an entity in Cortex, you can trigger an incident in FireHydrant:
In Cortex, navigate to an entity. On the left side of an entity details page, click On-call & incidents.
In the upper right side of the entity's "On-call" page, click Trigger incident.
Configure the incident modal:
Summary: Enter a title for the incident.
Description: Enter a description of the incident.
Severity: Select a severity level.
Condition: Nature of the incident - Unavailable
, Partially Unavailable
, Degraded
, Bug
, or Operational
.
At the bottom of the modal, click Trigger incident.
A confirmation screen will appear. In the confirmation, click the link to view the incident in FireHydrant.
With the FireHydrant integration, you can create Scorecard rules and write CQL queries based on FireHydrant incidents.
See more examples in the CQL Explorer in Cortex.
The following options are available to get assistance from the Cortex Customer Engineering team:
Email: help@cortex.io, or open a support ticket in the in app Resource Center
Chat: Available in the Resource Center
Slack: Users with a connected Slack channel will have a workflow added to their account. From here, you can either @CortexTechnicalSupport or add a :ticket:
reaction to a question in Slack, and the team will respond directly.
Don’t have a Slack channel? Talk with your Customer Success Manager.
Microsoft Entra ID, formerly known as Azure Active Directory, is an identity service that provides SSO and authentication.
Integrating Cortex with Entra ID allows you to:
Automatically discover and track Entra ID teams and team memberships
Track ownership of entities
Create Scorecards that track progress and drive alignment on projects involving your Entra ID teams
Follow Microsoft's documentation to register a new single tenant Entra ID application.
In your Entra ID admin center, navigate to your new application, and then to API Permissions. Add the following permissions:
Microsoft APIs > Microsoft Graph > Application permissions > User > User.Read.All
Microsoft APIs > Microsoft Graph > Application permissions > Group > Group.Read.All
Click Grant Admin Consent to grant permissions for all accounts in the directory.
Navigate to Certificates & secrets and click New client secret.
Note that you will need to rotate the secret before the expiration date you set for it.
Navigate to the application's Overview page and copy the client ID. You will need the client ID and secret in the next steps.
In Cortex, navigate to the Azure Active Directory settings page:
In Cortex, click your avatar in the lower left corner, then click Settings.
Under "Integrations", click Azure Active Directory.
Click Add configuration.
Configure the integration form:
Tenant ID: Enter your Entra ID tenant ID.
Client ID and Client secret: Enter the client ID and secret you generated in the previous steps.
Click Save.
You will be redirected to the Azure Active Directory settings page in Cortex, where you can optionally set a group filter to limit which groups are pulled in from Entra ID.
See the Create services documentation for instructions on importing entities.
The group name is case-sensitive and should be exactly the same as in Entra ID.
Under Catalogs > Teams, you will see teams and team members pulled in from Entra ID.
If you have ownership of entities set up, then Azure AD teams and users will be listed in the Owners page for an entity.
With the Entra ID integration, you can create Scorecard rules and write CQL queries based on Entra ID teams.
See more examples in the CQL Explorer in Cortex.
Cortex conducts an ownership sync every day at 6 a.m. UTC.
Why were all my Entra ID users unexpectedly deleted after rotating my client secret?
Updating your configuration can cause a temporary deletion of users. When you delete the old secret from your Azure AD configuration in Cortex, a sync is triggered to delete the users. The addition of the new secret to your configuration will trigger a sync to add the users. There may be a delay before seeing the users re-added.
The following are all the ways to get assistance from our customer engineering team. Please use the option that is best for your users:
Email: help@cortex.io, or open a support ticket in the in app Resource Center
Chat: Available in the Resource Center
Slack: Users with a connected Slack channel will have a workflow added to their account. From here, you can either @CortexTechnicalSupport or add a :ticket:
reaction to a question in Slack, and the team will respond directly.
Don’t have a Slack channel? Talk with your customer success manager.
Cortex conducts an ownership sync every day at 6 a.m. UTC.
Why were all my Entra ID users unexpectedly deleted after rotating my client secret?
Updating your configuration can cause a temporary deletion of users. When you delete the old secret from your Azure AD configuration in Cortex, a sync is triggered to delete the users. The addition of the new secret to your configuration will trigger a sync to add the users. There may be a delay before seeing the users re-added.
The following options are available to get assistance from the Cortex Customer Engineering team:
Email: help@cortex.io, or open a support ticket in the in app Resource Center
Chat: Available in the Resource Center
Slack: Users with a connected Slack channel will have a workflow added to their account. From here, you can either @CortexTechnicalSupport or add a :ticket:
reaction to a question in Slack, and the team will respond directly.
Don’t have a Slack channel? Talk with your Customer Success Manager.
Azure Resources provides on-demand cloud computing platforms and APIs. Cortex uses the Azure Resource API to pull in resource details and import entities such as SQL servers, virtual machines, virtual networks, load balancers, and others.
Integrate Azure Resources with Cortex to drive insights into:
Catalogs
Dependencies
After the integration is configured, your resources from Azure will be visible in Cortex.
Before getting started, you will need the following information. These can be found in the Enterprise applications section of Azure:
Azure tenant ID
Azure client ID and client secret
Azure subscription ID
Ensure that the service principal for the subscription ID has a Reader role.
In Cortex, navigate to the Azure Resources settings page:
In Cortex, click your avatar in the lower left corner, then click Settings.
Under "Integrations", click Azure Resources.
Click Add configuration.
Configure the Azure Resources integration form:
Account alias: Enter your Azure account alias. Account aliases are used to tie service registrations to different configuration accounts.
Azure tenant ID: Enter your Azure tenant ID.
Client ID and Client secret: Enter your Azure client ID and secret.
Subscription ID: Enter your Azure subscription ID.
Click Save.
You will be redirected to the Azure Resources Settings page in Cortex, where you can optionally choose to include only specified Azure resource types for this integration.
You can configure automatic import from Azure:
In Cortex, navigate to the Entities Settings page.
Next to Auto import from AWS, Azure, and/or Google Cloud, click the toggle to enable the import.
Cortex can automatically discover ownership for your Azure resources. To configure this:
Make sure that your Azure resources have a tag matching the x-cortex-tag
of the corresponding Cortex team
Enable the “Sync ownership from Azure” toggle in the Azure Resources Settings page in Cortex.
By default, Cortex looks for the owner
tag. You can also customize the tag key name on the Settings page.
Cortex syncs ownership from Azure Resources every day at 6 a.m. UTC.
Cortex automatically discovers dependencies between your services and resources by scanning for resources with specific Azure Resources tags. By default, a service will have dependencies on any Cortex resource that has a corresponding Azure Resources resource with Azure Resources tag key = "service" and tag value = the service's Cortex tag.
On the Azure Resources settings page, you can customize the tag key names for dependencies.
For more information on defining dependencies, please see the Dependencies documentation.
See the Create services documentation for instructions on importing entities.
You can associate a Cortex entity with one or more Azure Resources entities. Cortex will display those Azure Resources entities' metadata on the Cortex entity page.
When the entity is connected to Azure, the entity YAML will look like the following:
With the Azure Resources integration, you can create Scorecard rules and write CQL queries based on Azure Resources details.
See more examples in the CQL Explorer in Cortex.
Cortex conducts a background sync of Azure Resources every day at 10 a.m. UTC and an ownership sync every day at 6 a.m. UTC.
Why is the Azure resource type microsoft-resources-subscriptions-resourcegroups
not pulling in Azure Resource details?
Cortex pulls from the Azure Resource API, but not from the Azure Resource Group API. If you would like to submit a feature request for support of Azure Resource Groups, please contact our customer engineering team.
The following options are available to get assistance from the Cortex Customer Engineering team:
Email: help@cortex.io, or open a support ticket in the in app Resource Center
Chat: Available in the Resource Center
Slack: Users with a connected Slack channel will have a workflow added to their account. From here, you can either @CortexTechnicalSupport or add a :ticket:
reaction to a question in Slack, and the team will respond directly.
Don’t have a Slack channel? Talk with your Customer Success Manager.
Amazon Web Services (AWS) provides on-demand cloud computing platforms and APIs.
Integrating Cortex with AWS allows you to:
Track AWS entities in the catalog
Automatically discover and track ownership of AWS entities and dependencies
You can also enable auto-import of any discovered entities of known types.
Create Scorecards that track progress and drive alignment on projects involving your AWS resources
If you are on a self-hosted Cortex instance, see the On-premises AWS setup page.
In Cortex, navigate to the AWS settings page:
In Cortex, click your avatar in the lower left corner, then click Settings.
Under "Integrations", click AWS.
Click Add configuration.
In the modal, the JSON configuration, Cortex AWS account ID, and External ID are displayed. Keep this browser window open, as you will need these in the next steps.
For each account:
Log in to your AWS Management Console and open the IAM console.
Click Policies, then choose Create policy.
Switch to the JSON editor. Copy the JSON starting policy from Cortex, and paste it into the JSON editor.
This policy allows Cortex to list all resources, resource types, and resource tags.
If you are pulling in ECS resources, add the following actions to the JSON policy:
For each resource type that you want to import into Cortex, add policies for reading that type of AWS resource.
For example, if you want to import resources of type "AWS::IAM::Role", we'll need to have permission to "iam:ListRoles", "iam:ListAttachedRolePolicies", "iam:GetRole", and "iam:ListRolePolicies". Because this is a dynamic feature, Cortex does not automatically determine this. One option is to start with ReadOnlyAccess permissions and remove sensitive permissions as deemed necessary.
Click Review Policy, enter a name, then click Create Policy.
See the AWS documentation for more information: Create IAM policies.
This section is specific to cloud-based Cortex accounts. If you are on a self-hosted Cortex instance, please see the AWS account setup guide for self-hosted Cortex.
In AWS, navigate to Roles > Create Role.
For the trusted entity type, select Another AWS account.
In the Account ID field, enter the Cortex AWS account ID that was displayed in Cortex in the earlier steps.
Click Require External ID, then enter the Cortex external ID that was displayed in Cortex in the earlier steps.
Click Next.
Select your newly created policy, and click Next.
Enter a name for your role. Optionally, configure tags. When you are finished, click Create Role.
Search for your new role in the list and copy its name. You will need this in the next steps.
In the upper right corner of AWS, click your name. In the dropdown that appears, copy your AWS account ID. You will need these in the next steps.
Note that if you use multiple AWS accounts, they will share a common rotatable externalId
.
Navigate back to the browser window containing your Cortex AWS settings page.
Configure the AWS integration form:
Account ID: Enter the AWS account ID you obtained in the previous steps.
IAM role: Enter the role name you obtained in the previous steps.
Click Save.
Cortex will pull all the types you included in the IAM policy under the Cloud Control types field in the Settings section. If resource types aren't appearing in the list, there is likely a permission issue, and the role isn’t set up to discover Cloud Control types. Make sure that "cloudformation:ListTypes", "cloudformation:ListResources", and "cloudformation:GetResource" are added to the IAM policy, so Cortex can pull the list of all available types from AWS.
To select your cloud control types:
In the Cloud control types field, select the types you want Cortex to discover/import.
Click Save cloud control types.
Some Cloud Control types are not currently supported. If the type you're looking to import is in the list, please reach out to support@cortex.io to submit a feature request.
You can configure automatic import from AWS:
In Cortex, navigate to the Entities Settings page.
Next to Auto import from AWS, Azure, and/or Google Cloud, click the toggle to enable the import.
If you do not have automatic import enabled, you can manually import.
By default, Cortex will search for resources across all AWS regions, but you can limit that to specific regions in the Cortex AWS settings page.
See the Create services documentation for instructions on importing entities.
Cortex automatically discovers dependencies between your services and resources by scanning for resources with specific AWS tags. By default, a service will have dependencies on any Cortex resource that has a corresponding AWS resource with AWS tag key = "service" and tag value = the service's Cortex tag. In your Cortex settings under the AWS integration section, you can customize the tag key names, or leave them blank to use "service" as the key name.
Cortex syncs AWS tags daily at 8 a.m. UTC. To manually refresh the tags, navigate to the relationship graph in your workspace, click the menu in the upper right corner, then click Sync dependencies.
Use key/value pairs in the entity descriptor for discovery
You can also use explicit tag key/value pairs in the x-cortex-dependency
block for AWS dependency discovery. Instead of making a service depend on a resource based on service tags, Cortex will make a service depend on a resource if any of the resource's AWS tags match the explicitly defined key/value pairs in the service's x-cortex-dependency
block. For example, the service below will have dependencies on any AWS resource with tag (key = aws:cloudformation:my-key-1
, value = arn:aws:cloudformation:my-region:my-value-1
) or tag (key = aws:cloudformation:my-key-2
, value = arn:aws:cloudformation:my-region:my-value-2
).
For more information on dependencies, see the Dependencies documentation.
Cortex can automatically discover ownership for your AWS resources. To enable this, make sure that your AWS resources have a tag matching the x-cortex-tag
of the corresponding Cortex team and enable the “Sync ownership from AWS” toggle in the Settings page. By default, we look for the owner
tag. You can also customize the tag key name.
Cortex syncs ownership from AWS every day at 6 am UTC.
You can associate a Cortex entity with one or more AWS entities. For certain AWS resource types, Cortex will display those AWS entities' metadata on the Cortex entity page.
Multiple ECS services on a single entity
You can associate a Cortex entity with multiple ECS services:
The values for clusterArn and serviceArn are defined in ECS.
Cortex will pull recent changes from your AWS environment into the discovery audit. Here, you can find new entities in AWS that have not been imported into the catalog - these will have the tag New AWS Resource - as well as entities in the catalog that no longer exist in AWS - these will have the tag AWS Resource Not Detected.
The following keys are supported when searching for your AWS entities in Cortex under Catalogs > All Entities:
aws-account-id
- Account ID number
aws-account-name
- Account alias
aws-region
- AWS region of the resource
aws-type
- AWS type of the resource
aws-name
- AWS name of the resource
aws-identifier
- The primary identifier of a resource
aws-secondary-identifier
- The secondary identifier of a resouce
aws-type:"AWS::EC2" AND aws-region:"us-west"
: Search for entities of category EC2 in the any of us-west regions
aws-account-id: "234512324"
: Search for all entities from the account 234512324
aws-name:"aws-identifier-of-resource" AND aws-account-name:"test-account"
: Search for entity with identifier aws-identifier-of-resource in the account with alias test-account
With the AWS integration, you can create Scorecard rules and write CQL queries based on AWS resources.
See more examples in the CQL Explorer in Cortex.