Service Catalog Skill
Use this skill to discover and query Service Catalog entities — services,
databases, operations, database operations, JVMs, JVM GC, Kubernetes pods, and
transactions — and their columnar metrics (latency, error rate, health, resource
usage, etc.) via the v2 Service Catalog API.
CLI Commands
| Command |
Purpose |
Key flags |
cx service-catalog entity-types |
List entity types this account has data for |
- |
cx service-catalog schema <entity-type> |
Columns/labels schema for one entity type |
- |
cx service-catalog entities <entity-type> |
Known entities of one type (e.g. service names) |
- |
cx service-catalog data <entity-type> |
Aggregated column data across every entity of a type |
--start, --end, --column (required, repeatable); --group-by, --filter, --aggregation, --limit, --sort-column, --sort-order |
cx service-catalog entity-data <entity-type> <entity-id> |
Column data for one named entity (drilldown) |
--start, --end, --column (required, repeatable); --group-by, --filter, --aggregation |
- All commands are read-only and support
-o json / -o toon for
structured output.
- Entity type accepts short forms:
service, database, operation,
database-operation, jvm, jvm-gc, k8s-pod, transaction (case-insensitive,
hyphens or underscores). The full proto name (ENTITY_TYPE_K8S_POD) also works.
Unknown values are rejected client-side before any request is made.
--start/--end accept now, now-1h-style relative expressions, or
RFC3339 timestamps.
--column is required and repeatable — discover valid column ids with
cx service-catalog schema <entity-type> first; the API rejects unknown ones.
--filter label=value1,value2 is repeatable across distinct labels only
(filters AND together); combine multiple values for the same label with commas
rather than repeating the flag — repeating a label is rejected client-side.
--aggregation is table (default behavior when combined with --limit/
--sort-column/--sort-order) or timeseries. --limit, --sort-column,
and --sort-order only apply to table — the backend silently ignores them
for timeseries, so the CLI rejects that combination up front rather than
sending a request whose flags are quietly dropped.
entity-data percent-encodes the entity id for you — pass it as returned by
entities (e.g. checkout/api), quoted if it contains /.
Inspection Workflow
Four steps, and only because each one supplies an input the next one requires:
entity-types gives valid <entity-type> values, schema gives valid
--column ids, entities gives the entity-id for a drilldown.
Discover what entity types exist — never guess, they vary by account:
cx service-catalog entity-types -o json
Check the schema for one entity type to find valid column ids and
filterable/groupable labels:
cx service-catalog schema service -o json
List known entities of that type (e.g. service names):
cx service-catalog entities service -o json
Query data — aggregated across all entities, or scoped to one. Column
ids, filter/group-by labels, and entity ids below are placeholders — always
substitute values returned by schema/entities for the entity type in
question, they vary by account and entity type:
cx service-catalog data <entity-type> --start now-1h --end now \
--column <column-id> --column <column-id> -o json
cx service-catalog entity-data <entity-type> <entity-id> --start now-1h --end now \
--column <column-id> -o json
Examples
The commands below use service and k8s-pod for concreteness, but every
<column-id>, <filterable-label>, <groupable-label>, and <entity-id>
must come from that entity type's own schema/entities output — never
assume a column or label from one entity type exists on another.
Top 5 entities by a metric in the last hour
cx service-catalog schema service -o json # discover column ids first
cx service-catalog data service --start now-1h --end now \
--column <column-id> --aggregation table \
--sort-column <column-id> --sort-order desc --limit 5 -o json
Filter to one label value
cx service-catalog schema service -o json # discover filterable_labels first
cx service-catalog data service --start now-1h --end now \
--column <column-id> --column <column-id> \
--filter <filterable-label>=<value> -o json
Group by a label
cx service-catalog schema service -o json # discover groupable_labels first
cx service-catalog data service --start now-1h --end now \
--column <column-id> --group-by <groupable-label> -o json
Kubernetes pod resource saturation
cx service-catalog schema k8s-pod -o json # discover column ids first
cx service-catalog data k8s-pod --start now-1h --end now \
--column <column-id> --column <column-id> --column <column-id> -o json
Latency over time for one entity
cx service-catalog entities service -o json # discover entity ids first
cx service-catalog entity-data service <entity-id> --start now-24h --end now \
--column <column-id> --aggregation timeseries -o json
Just the rows
# Table responses live under .rows; timeseries under .series
cx service-catalog data service --start now-1h --end now \
--column <column-id> -o json | jq '.rows'
Key Principles
- Discover before querying —
entity-types and schema are cheap and
answer "what's valid here" before spending a data/entity-data call on a
guess.
--column values are per-entity-type — a column valid for service may
not exist for k8s-pod; always re-check schema when switching entity types.
- Malformed responses are errors, not silent empty results — a column that
is neither a value nor an error (or both) fails loudly rather than producing
a partial or empty row, so a non-zero exit means investigate, not "no data".
- A column-level error is not a command failure — an individual column can
come back as
{"error": "..."} inside an otherwise successful row (e.g. a
query timeout for just that column); check per-column before assuming the
whole request failed.
table vs timeseries are mutually exclusive result shapes — table
responses are flat rows suitable for -o json | jq '.rows'; timeseries
responses nest datapoints per series and are best consumed as raw JSON rather
than forced into a table.
- Use
-o json with jq for filtering; use -o toon for token-efficient
output in agent contexts.
- Multi-profile fan-out works on every subcommand — repeat
-p <profile> to
compare the same entity type/data across accounts; rows and series are tagged
with profile when more than one is given.
Related Skills
cx-infra — infrastructure resource health (hosts, containers) is a
distinct concept from Service Catalog entity health; use cx-infra for
host/instance-level monitoring and this skill for application/service-level
APM entities.
cx-telemetry-querying — once a service or pod name surfaces from this
skill's commands, pivot to raw telemetry: cx logs "filter $l.subsystemname == '<service>'" or cx search-fields "<name>" -s value to find related log/span
fields. Correlate a latency or error spike with the underlying logs/spans.
cx-alerts — cx alerts list --name "<service-name>" finds alert
definitions matching a service surfaced by this skill.
cx-dashboards — cx dashboards search "<service-name> ..." finds
dashboards built around a service found here.
1---2name: cx-service-catalog3description: Query Coralogix's Service Catalog (APM v2 entities) with the `cx service-catalog` CLI — discover entity types, list known entities, check their schema, and pull aggregated or timeseries data for services, databases, operations, JVMs, and Kubernetes pods. Use when the user asks to "list services", "what entity types exist", "show me service latency", "check error rate for a service", "which pods are using the most memory", "database operation performance", "JVM GC pauses", "service health over time", "compare services by latency", "what columns are available for this entity type", "service catalog schema", or wants to explore APM entities and their metrics.4---56# Service Catalog Skill78Use this skill to discover and query **Service Catalog entities** — services,9databases, operations, database operations, JVMs, JVM GC, Kubernetes pods, and10transactions — and their columnar metrics (latency, error rate, health, resource11usage, etc.) via the v2 Service Catalog API.1213## CLI Commands1415| Command | Purpose | Key flags |16|---|---|---|17| `cx service-catalog entity-types` | List entity types this account has data for | - |18| `cx service-catalog schema <entity-type>` | Columns/labels schema for one entity type | - |19| `cx service-catalog entities <entity-type>` | Known entities of one type (e.g. service names) | - |20| `cx service-catalog data <entity-type>` | Aggregated column data across every entity of a type | `--start`, `--end`, `--column` (required, repeatable); `--group-by`, `--filter`, `--aggregation`, `--limit`, `--sort-column`, `--sort-order` |21| `cx service-catalog entity-data <entity-type> <entity-id>` | Column data for one named entity (drilldown) | `--start`, `--end`, `--column` (required, repeatable); `--group-by`, `--filter`, `--aggregation` |2223- All commands are **read-only** and support `-o json` / `-o toon` for24 structured output.25- **Entity type accepts short forms**: `service`, `database`, `operation`,26 `database-operation`, `jvm`, `jvm-gc`, `k8s-pod`, `transaction` (case-insensitive,27 hyphens or underscores). The full proto name (`ENTITY_TYPE_K8S_POD`) also works.28 Unknown values are rejected client-side before any request is made.29- `--start`/`--end` accept `now`, `now-1h`-style relative expressions, or30 RFC3339 timestamps.31- `--column` is **required** and repeatable — discover valid column ids with32 `cx service-catalog schema <entity-type>` first; the API rejects unknown ones.33- `--filter label=value1,value2` is repeatable **across distinct labels only**34 (filters AND together); combine multiple values for the same label with commas35 rather than repeating the flag — repeating a label is rejected client-side.36- `--aggregation` is `table` (default behavior when combined with `--limit`/37 `--sort-column`/`--sort-order`) or `timeseries`. **`--limit`, `--sort-column`,38 and `--sort-order` only apply to `table`** — the backend silently ignores them39 for `timeseries`, so the CLI rejects that combination up front rather than40 sending a request whose flags are quietly dropped.41- `entity-data` percent-encodes the entity id for you — pass it as returned by42 `entities` (e.g. `checkout/api`), quoted if it contains `/`.4344## Inspection Workflow4546Four steps, and only because each one supplies an input the next one requires:47`entity-types` gives valid `<entity-type>` values, `schema` gives valid48`--column` ids, `entities` gives the `entity-id` for a drilldown.49501. **Discover what entity types exist** — never guess, they vary by account:5152 ```bash53 cx service-catalog entity-types -o json54 ```55562. **Check the schema** for one entity type to find valid column ids and57 filterable/groupable labels:5859 ```bash60 cx service-catalog schema service -o json61 ```62633. **List known entities** of that type (e.g. service names):6465 ```bash66 cx service-catalog entities service -o json67 ```68694. **Query data** — aggregated across all entities, or scoped to one. Column70 ids, filter/group-by labels, and entity ids below are placeholders — always71 substitute values returned by `schema`/`entities` for the entity type in72 question, they vary by account and entity type:7374 ```bash75 cx service-catalog data <entity-type> --start now-1h --end now \76 --column <column-id> --column <column-id> -o json7778 cx service-catalog entity-data <entity-type> <entity-id> --start now-1h --end now \79 --column <column-id> -o json80 ```8182## Examples8384The commands below use `service` and `k8s-pod` for concreteness, but every85`<column-id>`, `<filterable-label>`, `<groupable-label>`, and `<entity-id>`86must come from that entity type's own `schema`/`entities` output — never87assume a column or label from one entity type exists on another.8889### Top 5 entities by a metric in the last hour9091```bash92cx service-catalog schema service -o json # discover column ids first93cx service-catalog data service --start now-1h --end now \94 --column <column-id> --aggregation table \95 --sort-column <column-id> --sort-order desc --limit 5 -o json96```9798### Filter to one label value99100```bash101cx service-catalog schema service -o json # discover filterable_labels first102cx service-catalog data service --start now-1h --end now \103 --column <column-id> --column <column-id> \104 --filter <filterable-label>=<value> -o json105```106107### Group by a label108109```bash110cx service-catalog schema service -o json # discover groupable_labels first111cx service-catalog data service --start now-1h --end now \112 --column <column-id> --group-by <groupable-label> -o json113```114115### Kubernetes pod resource saturation116117```bash118cx service-catalog schema k8s-pod -o json # discover column ids first119cx service-catalog data k8s-pod --start now-1h --end now \120 --column <column-id> --column <column-id> --column <column-id> -o json121```122123### Latency over time for one entity124125```bash126cx service-catalog entities service -o json # discover entity ids first127cx service-catalog entity-data service <entity-id> --start now-24h --end now \128 --column <column-id> --aggregation timeseries -o json129```130131### Just the rows132133```bash134# Table responses live under .rows; timeseries under .series135cx service-catalog data service --start now-1h --end now \136 --column <column-id> -o json | jq '.rows'137```138139## Key Principles140141- **Discover before querying** — `entity-types` and `schema` are cheap and142 answer "what's valid here" before spending a `data`/`entity-data` call on a143 guess.144- **`--column` values are per-entity-type** — a column valid for `service` may145 not exist for `k8s-pod`; always re-check `schema` when switching entity types.146- **Malformed responses are errors, not silent empty results** — a column that147 is neither a value nor an error (or both) fails loudly rather than producing148 a partial or empty row, so a non-zero exit means investigate, not "no data".149- **A column-level error is not a command failure** — an individual column can150 come back as `{"error": "..."}` inside an otherwise successful row (e.g. a151 query timeout for just that column); check per-column before assuming the152 whole request failed.153- **`table` vs `timeseries` are mutually exclusive result shapes** — `table`154 responses are flat rows suitable for `-o json | jq '.rows'`; `timeseries`155 responses nest datapoints per series and are best consumed as raw JSON rather156 than forced into a table.157- **Use `-o json` with `jq`** for filtering; use `-o toon` for token-efficient158 output in agent contexts.159- **Multi-profile fan-out** works on every subcommand — repeat `-p <profile>` to160 compare the same entity type/data across accounts; rows and series are tagged161 with `profile` when more than one is given.162163## Related Skills164165- **`cx-infra`** — infrastructure resource health (hosts, containers) is a166 distinct concept from Service Catalog entity health; use `cx-infra` for167 host/instance-level monitoring and this skill for application/service-level168 APM entities.169- **`cx-telemetry-querying`** — once a service or pod name surfaces from this170 skill's commands, pivot to raw telemetry: `cx logs "filter $l.subsystemname ==171 '<service>'"` or `cx search-fields "<name>" -s value` to find related log/span172 fields. Correlate a latency or error spike with the underlying logs/spans.173- **`cx-alerts`** — `cx alerts list --name "<service-name>"` finds alert174 definitions matching a service surfaced by this skill.175- **`cx-dashboards`** — `cx dashboards search "<service-name> ..."` finds176 dashboards built around a service found here.