Monitoring is only available for Enterprise changefeeds.
SHOW JOBS SQL statements using the job ID.
By default, changefeeds treat errors as retryable except for some specific terminal errors that are non-retryable.
- retryable: The changefeed will automatically retry whatever caused the error. (You may need to intervene so that the changefeed can resume.)
- non-retryable: The changefeed has encountered a terminal error and fails.
- When the changefeed cannot verify the target table’s schema. For example, the table is offline or there are types within the table that the changefeed cannot handle.
- The changefeed cannot convert the data to the specified output format. For example, there are Avro types that changefeeds do not support, or a CDC query is using an unsupported or malformed expression.
- The terminal error happens as part of established changefeed behavior. For example, you have specified the
schema_change_policy=stopoption and a schema change happens.
Monitor a changefeed
Changefeed progress is exposed as a high-water timestamp that advances as the changefeed progresses. This is a guarantee that all changes before or at the timestamp have been emitted. You can monitor a changefeed:- On the Changefeeds dashboard of the DB Console.
- On the Jobs page of the DB Console. Hover over the high-water timestamp to view the system time.
-
Using
SHOW CHANGEFEED JOB <job_id>: - Using Prometheus and Alertmanager to track and alert on changefeed metrics. See the Monitor CockroachDB with Prometheus tutorial for steps to set up Prometheus. See the Recommended changefeed metrics to track section for the essential metrics to alert you when a changefeed encounters a retryable error, or enters a failed state.
You can use the high-water timestamp to start a new changefeed where another ended.
Recommended changefeed metrics to track
By default, changefeeds will retry errors with some exceptions. We recommend setting up monitoring for the following metrics to track retryable errors to avoid an over-accumulation of garbage, and non-retryable errors to alert on changefeeds in a failed state:changefeed.max_behind_nanos: When a changefeed’s high-water mark timestamp is at risk of falling behind the cluster’s garbage collection window.changefeed.error_retries: The total number of retryable errors encountered by all changefeeds.changefeed.failures: The total number of changefeed jobs that have failed.
Protected timestamp and garbage collection monitoring
Protected timestamps will protect changefeed data from garbage collection in particular scenarios, but if a changefeed lags too far behind, the protected changes could cause data storage issues. Refer to Protect Changefeed Data from Garbage Collection for detail on when changefeed data is protected from garbage collection. You can monitor changefeed jobs for protected timestamp usage. We recommend setting up monitoring for the following metrics:jobs.changefeed.protected_age_sec: Tracks the age of the oldest protected timestamp record protected by changefeed jobs. We recommend monitoring ifprotected_age_secis greater thangc.ttlseconds. Asprotected_age_secincreases, garbage accumulation increases. Garbage collection will not progress on a table, database, or cluster if the protected timestamp record is present.jobs.changefeed.currently_paused: Tracks the number of changefeed jobs currently considered paused. Since paused changefeed jobs can accumulate garbage, it is important to monitor the number of paused changefeeds.jobs.changefeed.expired_pts_records: Tracks the number of expired protected timestamp records owned by changefeed jobs. You can monitor this metric in conjunction with thegc_protect_expires_afteroption.jobs.changefeed.protected_record_count: Tracks the number of protected timestamp records held by changefeed jobs.
Schema registry metrics
If you are running a changefeed with theconfluent_schema_registry option, set up monitoring for the following metrics:
changefeed.schema_registry.retry_count: The number of retries encountered when sending requests to the schema registry. A non-zero value could indicate incorrect configuration of the schema registry or changefeed parameters.changefeed.schema_registry.registrations: The number of registration attempts with the schema registry.
Using changefeed metrics labels
An Enterprise license is required to use metrics labels in changefeeds.
http://{host}:{http-port}/_status/vars, viewable via the Prometheus endpoint. An aggregated metric of all changefeeds is also measured.
It is necessary to consider the following when applying metrics labels to changefeeds:
- The
server.child_metrics.enabledcluster setting must be set totruebefore using themetrics_labeloption.server.child_metrics.enabledis enabled by default in Standard and Basic. - Metrics label information is sent to the
_status/varsendpoint, but will not show up indebug.zipor the DB Console. - Introducing labels to isolate a changefeed’s metrics can increase cardinality significantly. There is a limit of 1024 unique labels in place to prevent cardinality explosion. That is, when labels are applied to high-cardinality data (data with a higher number of unique values), each changefeed with a label then results in more metrics data to multiply together, which will grow over time. This will have an impact on performance as the metric-series data per changefeed quickly populates against its label.
- The maximum length of a metrics label is 128 bytes.
true:
metrics_label option with the label name as its value:
http://{host}:{http-port}/_status/vars shows the defined changefeed(s) by label and the aggregated metric for all changefeeds. This output also shows the default scope, which will include changefeeds started without a metrics label:
Metrics
Monitoring and measuring changefeed latency
Changefeeds can encounter latency in events processing. This latency is the total time CockroachDB takes to:- Commit writes to the database.
- Encode changefeed messages.
- Deliver the message to the sink.
- Event latency: Measure the difference between an event’s MVCC timestamp and when it is put into the memory buffer or acknowledged at the sink.
- Lagging ranges: Track the number of ranges that are behind in a changefeed.
Event latency
To monitor for changefeeds encountering latency in how events are emitting, track the following metrics:admit_latency: The difference between the event’s MVCC timestamp and the time the event is put into the memory buffer.commit_latency: The difference between the event’s MVCC timestamp and the time it is acknowledged by the downstream sink. If the sink is batching events, the difference is between the oldest event and when the acknowledgment is recorded.
The
admit_latency and commit_latency metrics do not update for backfills during initial scans or backfills for schema changes. This is because a full table scan may contain rows that were written far in the past, which would lead to inaccurate changefeed latency measurements if the events from these scans were included in admit_latency adn commit_latency.metrics_label option when starting a changefeed to differentiate metrics per changefeed.
We recommend using the p99 commit_latency aggregation for alerting and to set SLAs for your changefeeds. Refer to the Changefeed Dashboard Commit Latency graph to track this metric in the DB Console.
If your changefeed is experiencing elevated latency, you can use these metrics to:
- Review
admit_latencyversuscommit_latencyto calculate the time events are moving from the memory buffer to the downstream sink. - Compare the
commit_latencyP99, P90, P50 latency percentiles to investigate performance over time.
Lagging ranges
Use thechangefeed.lagging_ranges metric to track the number of ranges that are behind in a changefeed. This is calculated based on the changefeed options:
lagging_ranges_thresholdsets a duration from the present that determines the length of time a range is considered to be lagging behind, which will then track in thelagging_rangesmetric. Note that ranges undergoing an initial scan for longer than the threshold duration are considered to be lagging. Starting a changefeed with an initial scan on a large table will likely increment the metric for each range in the table. As ranges complete the initial scan, the number of ranges lagging behind will decrease.- Default:
3m
- Default:
lagging_ranges_polling_intervalsets the interval rate for when lagging ranges are checked and thelagging_rangesmetric is updated. Polling adds latency to thelagging_rangesmetric being updated. For example, if a range falls behind by 3 minutes, the metric may not update until an additional minute afterward.- Default:
1m
- Default:
changefeed.total_ranges metric to monitor the number of ranges that are watched by aggregator processors participating in the changefeed job. If you’re experiencing lagging ranges, changefeed.total_ranges may indicate that the number of ranges watched by aggregator processors in the job is unbalanced. You may want to try pausing the changefeed and then resuming it, so that the changefeed replans the work in the cluster. changefeed.total_ranges shares the same polling interval as the changefeed.lagging_ranges metric, which is controlled by the lagging_ranges_polling_interval option.
Debug a changefeed
Using logs
For Enterprise changefeeds, use log information to debug connection issues (i.e.,kafka: client has run out of available brokers to talk to (Is your cluster reachable?)). Debug by looking for lines in the logs with [kafka-producer] in them:
Using SHOW CHANGEFEED JOBS
For Enterprise changefeeds, use SHOW CHANGEFEED JOBS to check the status of your changefeed jobs:
SHOW JOBS.
Using the DB Console
On the Custom Chart debug page of the DB Console:- To add a chart, click Add Chart.
-
Select
changefeed.error_retriesfrom the Metric Name dropdown menu. A graph of changefeed restarts due to retryable errors will display.

