Skip to content

The Service Catalog and Ownership

The Service Catalog answers a question none of metrics, logs, or traces can answer alone: who owns this service, what does it depend on, and where does its code actually live.

Metrics, logs, and traces are all things a service emits. A Service Catalog entry is different — it is a definition you declare about the service, adapted here for a billing-service:

apiVersion: v3
kind: service
metadata:
name: billing-service
owner: billing-team
spec:
dependsOn:
- service: checkout-service
datadog:
codeLocations:
- repositoryURL: https://github.com/org/billing-service.git
paths:
- "**"

metadata.owner is who to page. A metrics dashboard does not say who to notify at 3 a.m. when it fires. A log line does not say who wrote the service that produced it. A trace does not carry a Slack channel. metadata.owner is literally that missing field — a durable pointer to a team, independent of whether that team’s alert routing even happens to be wired correctly into a monitor today.

spec.dependsOn: an edge you declare, not one traffic infers

Section titled “spec.dependsOn: an edge you declare, not one traffic infers”

Compare spec.dependsOn with the Service Map from the APM module. The Service Map is auto-generated by observing live trace traffic between services — it shows what actually called what over the network, right now. spec.dependsOn is different: it is a manually declared edge in the Catalog, which means it can capture relationships that never generate a single span. billing-service might depend on a shared message queue that checkout-service publishes to asynchronously — no direct call, no trace connects them — or on a nightly batch job that reads a database table checkout-service owns. The Service Map shows you what talked to what; dependsOn lets you also declare what depends on what, including relationships that tracing was never going to see in the first place.

datadog.codeLocations: mapping a service to its source

Section titled “datadog.codeLocations: mapping a service to its source”

repositoryURL and paths tie the abstract billing-service identity to an actual git repository, so tooling built on top of the Catalog — code security scanning, ownership-based review requirements — knows exactly where the code that produces this service’s telemetry lives, rather than someone maintaining that mapping in a spreadsheet or a wiki page that goes stale the moment it is written.

The piece the telemetry pipelines can’t provide

Section titled “The piece the telemetry pipelines can’t provide”

Metrics show resource usage. Logs show events. Traces show a request’s actual path through your services. None of the three can tell you who is responsible for a service, what it depends on beyond whatever happened to generate traffic today, or which repository to open to fix it. The Service Catalog is a small, deliberately-declared layer that exists specifically to answer those questions, and it stays useful even for a service that has no live traffic at all right now.

flowchart LR
  S["billing-service\n(Service Catalog entry)"] --> O["owner: billing-team"]
  S --> D["dependsOn: checkout-service"]
  S --> C["codeLocations: github.com/org/billing-service"]
  D -.not necessarily seen in.-> Tr[APM traces]
A Catalog entry, independent of live telemetry
What question does metadata.owner in a Service Catalog entry answer that a trace or a metric cannot?
How does spec.dependsOn differ from the Service Map built in the APM module?
What does datadog.codeLocations map a service definition to?
Which of the following can the Service Catalog answer that metrics, logs, and traces alone cannot?