Services
The Services catalog is the system map agents use to reason about ownership, blast radius, and which components show up in a given Flow. Each Service entry carries a human description, a durable agent-curated context describing the Service, and the breakdown Dimensions its health is measured along.
Service: firetiger.observability.v1.ServiceCatalogService
Resource name pattern: services/{service_id}
Access: Read-write
Methods
The standard AIP-compliant CRUD surface plus a recommendation-lifecycle surface is available. Request/response shapes are in proto/firetiger/observability/v1/services.proto and follow the same patterns as other resources documented here (e.g. Tags).
Service methods
| RPC | HTTP |
|---|---|
CreateService |
POST /v1/catalog/services |
GetService |
GET /v1/catalog/{name=services/*} |
ListServices |
GET /v1/catalog/services |
UpdateService |
PATCH /v1/catalog/{service.name=services/*} |
DeleteService |
DELETE /v1/catalog/{name=services/*} |
RecommendService |
POST /v1/catalog/services:recommend |
AcceptService |
POST /v1/catalog/{name=services/*}:accept |
ArchiveService |
POST /v1/catalog/{name=services/*}:archive |
RestoreService |
POST /v1/catalog/{name=services/*}:restore |
RecommendServiceObservability |
POST /v1/catalog/{parent=services/*}:recommendObservability |
RecreateServiceExpertSession |
POST /v1/catalog/{name=services/*}:recreateExpertSession |
ServiceDimension methods
A ServiceDimension is a service-local health breakdown axis nested under a Service (services/{service}/dimensions/{dimension}). It replaces the deprecated top-level Service.dimensions list for Service observability: Objectives and Indicators bind to a ServiceDimension.
| RPC | HTTP |
|---|---|
CreateServiceDimension |
POST /v1/catalog/{parent=services/*}/dimensions |
GetServiceDimension |
GET /v1/catalog/{name=services/*/dimensions/*} |
ListServiceDimensions |
GET /v1/catalog/{parent=services/*}/dimensions |
UpdateServiceDimension |
PATCH /v1/catalog/{service_dimension.name=services/*/dimensions/*} |
DeleteServiceDimension |
DELETE /v1/catalog/{name=services/*/dimensions/*} |
AcceptServiceDimension |
POST /v1/catalog/{name=services/*/dimensions/*}:accept |
ArchiveServiceDimension |
POST /v1/catalog/{name=services/*/dimensions/*}:archive |
RestoreServiceDimension |
POST /v1/catalog/{name=services/*/dimensions/*}:restore |
Recommendation lifecycle
Services and ServiceDimensions are both first-class catalog resources that carry a state, and both flow through the same recommendation lifecycle:
- System discovery stores newly-discovered catalog entries via
RecommendService. The recommended Service is persisted as a real resource inSERVICE_STATE_RECOMMENDEDand its Service Expert is provisioned immediately. - Each Service’s Expert then proposes its breakdown dimensions, Objectives, and backing Indicators via
RecommendServiceObservability. Recommended ServiceDimensions land inSERVICE_DIMENSION_STATE_RECOMMENDED. - A customer accepts a recommendation (
AcceptService/AcceptServiceDimension) to promote it to the*_ACTIVEstate, or archives it (ArchiveService/ArchiveServiceDimension) to dismiss it into the*_ARCHIVEDstate. Restore (RestoreService/RestoreServiceDimension) brings an archived resource back. User-created Services default toSERVICE_STATE_ACTIVE. AcceptServicebulk-activates the Service’s accepted breakdown and Objectives; archived child Objectives are skipped.
Recommendation metadata is carried on the resource itself: recommendation_confidence, recommendation_evidence, and recommendation_reasoning (see field tables below).
Service resource
| Field | Type | Behavior | Description |
|---|---|---|---|
name |
string | Output only | Format: services/{service} |
display_name |
string | Required | Short, scannable label shown in headers and Service lists (1–200 chars) |
description |
string | Optional | One-paragraph, human-facing overview of what the Service is |
context |
string | Optional | Durable, structured Markdown describing the Service, read by agents and rendered on the Service page. Agents curate it into canonical sections (purpose, code references, Service and Provider dependencies, invariants, failure modes and known bugs); it holds steady-state knowledge, not point-in-time evidence or timestamps. Customer-editable |
expert_session |
string | Output only | The per-Service service-expert agent session that proposes and maintains this Service’s Objectives, Indicators, and Dimensions. Format: agents/{agent}/sessions/{session} |
dimensions |
string[] | Optional, deprecated | The firetiger.dimensions.v1 Dimensions this Service’s health is broken down by — its declared deployment shape (e.g. environment, region, cloud). Each entry is a dimensions/{dimension} resource name. Superseded by the nested ServiceDimension resource; use CreateServiceDimension/ListServiceDimensions instead |
state |
ServiceState | Output only | Lifecycle state. User-created Services default to SERVICE_STATE_ACTIVE; system-recommended Services persist in SERVICE_STATE_RECOMMENDED until accepted or archived. See ServiceState |
recommendation_confidence |
RecommendationConfidence | Optional | Agent’s confidence in this recommendation. See RecommendationConfidence |
recommendation_evidence |
string[] | Optional | Supporting evidence the agent cited when recommending this Service |
recommendation_reasoning |
string | Optional | Free-text rationale for why this Service was recommended |
etag |
string | Output only | Optimistic-concurrency token returned by Get and required on Update; stale etags fail with ABORTED |
create_time / update_time / delete_time |
timestamp | Output only | Standard AIP lifecycle timestamps |
UpdateService is field-masked: send the Service with an update_mask listing the paths to write (e.g. context). state, expert_session, and the other output-only fields are server-managed and ignored on Create/Update.
ServiceDimension resource
| Field | Type | Behavior | Description |
|---|---|---|---|
name |
string | Output only | Format: services/{service}/dimensions/{dimension} |
display_name |
string | Required | Short, scannable label for the breakdown axis (1–200 chars) |
description |
string | Optional | One-line, human-facing description of what this axis splits on |
state |
ServiceDimensionState | Output only | Lifecycle state. Recommended dimensions persist in SERVICE_DIMENSION_STATE_RECOMMENDED until accepted or archived. See ServiceDimensionState |
source_column |
string | Optional | Suggested or observed query output column for this axis. Indicator DimensionBindings still carry the authoritative per-query column mapping; this lets the Service page preview recommended dimensions before an Objective is opened |
recommendation_confidence |
RecommendationConfidence | Optional | Agent’s confidence in this recommendation. See RecommendationConfidence |
recommendation_evidence |
string[] | Optional | Supporting evidence the agent cited when recommending this dimension |
recommendation_reasoning |
string | Optional | Free-text rationale for why this dimension was recommended |
etag |
string | Output only | Optimistic-concurrency token returned by Get and required on Update; stale etags fail with ABORTED |
create_time / update_time / delete_time |
timestamp | Output only | Standard AIP lifecycle timestamps |
UpdateServiceDimension is field-masked: send the ServiceDimension with an update_mask of the paths to write. Output-only fields (state, etag, timestamps) are server-managed and ignored on Create/Update.
Enums
ServiceState
| Value | Description |
|---|---|
SERVICE_STATE_UNSPECIFIED |
Default zero value; not a valid persisted state |
SERVICE_STATE_RECOMMENDED |
System-recommended Service awaiting accept/archive |
SERVICE_STATE_ACTIVE |
Accepted (or user-created) Service |
SERVICE_STATE_ARCHIVED |
Dismissed recommendation; hidden from active views |
ServiceDimensionState
| Value | Description |
|---|---|
SERVICE_DIMENSION_STATE_UNSPECIFIED |
Default zero value; not a valid persisted state |
SERVICE_DIMENSION_STATE_RECOMMENDED |
Recommended breakdown axis awaiting accept/archive |
SERVICE_DIMENSION_STATE_ACTIVE |
Accepted dimension |
SERVICE_DIMENSION_STATE_ARCHIVED |
Dismissed recommendation |
RecommendationConfidence
| Value | Description |
|---|---|
RECOMMENDATION_CONFIDENCE_UNSPECIFIED |
Confidence not set |
RECOMMENDATION_CONFIDENCE_HIGH |
High confidence |
RECOMMENDATION_CONFIDENCE_MEDIUM |
Medium confidence |
RECOMMENDATION_CONFIDENCE_LOW |
Low confidence |
Revision history (AIP-162)
Revision history is served by the legacy firetiger.objectives.v1.ServicesService, which exposes the same services/{service} resource plus two read RPCs. Every mutation (Create, Update, Delete, Undelete) atomically writes a revision row recording who changed the resource, what kind of change, and when.
ListServiceRevisions
List the revision history of one Service. Default order is reverse-chronological (newest first).
GET /v1/{parent=services/*}/revisions
or as a Connect RPC:
POST /firetiger.objectives.v1.ServicesService/ListServiceRevisions
Request body
| Field | Type | Required | Description |
|---|---|---|---|
parent |
string | Yes | Resource name of the Service whose revisions to list. Format: services/{service} |
page_size |
integer | No | Maximum revisions per page |
page_token |
string | No | Token from a previous ListServiceRevisionsResponse |
filter |
string | No | AIP-160 filter over name, revision_number, operation, actor_subject, actor_kind, create_time |
order_by |
string | No | AIP-132 ordering. Defaults to create_time desc |
Example
curl -X POST "https://api.cloud.firetiger.com/firetiger.objectives.v1.ServicesService/ListServiceRevisions" \
-u "$USERNAME:$PASSWORD" \
-H "Content-Type: application/json" \
-d '{"parent": "services/checkout-api", "page_size": 50}'
Response
{
"serviceRevisions": [
{
"name": "services/checkout-api/revisions/3",
"snapshot": { "name": "services/checkout-api", "displayName": "Checkout API v3", "...": "..." },
"createTime": "2026-05-14T18:10:11Z",
"operation": "REVISION_OPERATION_UPDATE",
"actor": { "subject": "user_2abc", "kind": "ACTOR_KIND_USER" }
}
],
"nextPageToken": ""
}
GetServiceRevision
Return a single revision by its AIP-162 nested-collection name.
GET /v1/{name=services/*/revisions/*}
or:
POST /firetiger.objectives.v1.ServicesService/GetServiceRevision
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | Yes | Format: services/{service}/revisions/{n} where n is a positive integer |
Example
curl -X POST "https://api.cloud.firetiger.com/firetiger.objectives.v1.ServicesService/GetServiceRevision" \
-u "$USERNAME:$PASSWORD" \
-H "Content-Type: application/json" \
-d '{"name": "services/checkout-api/revisions/2"}'
Notes
- History starts at opt-in time. Services that existed before this revision API shipped have no historical revisions until their next mutation.
Purge(force delete) cascades to revisions atomically.- See Flows for the same revision pattern applied to the Flows resource.