Skip to content

metrics,grafana: show changefeed downstream type#4251

Open
wlwilliamx wants to merge 2 commits intopingcap:masterfrom
wlwilliamx:metrics/changefeed-downstream-type-panel
Open

metrics,grafana: show changefeed downstream type#4251
wlwilliamx wants to merge 2 commits intopingcap:masterfrom
wlwilliamx:metrics/changefeed-downstream-type-panel

Conversation

@wlwilliamx
Copy link
Collaborator

@wlwilliamx wlwilliamx commented Feb 24, 2026

What problem does this PR solve?

Issue Number: close #4250

What is changed and how it works?

  • Add a constant-gauge metric ticdc_owner_changefeed_downstream_info{namespace|keyspace_name, changefeed, downstream_type} 1 to expose downstream type per changefeed.
  • Derive downstream_type from the sink-uri scheme and normalize it to a small stable set (e.g. mysql+ssl -> mysql, pulsar+https -> pulsar, gs -> gcs, azure -> azblob).
  • Add a filterable table panel in the Changefeed section of the TiCDC Grafana dashboard to show each changefeed's downstream type.

Check List

Tests

  • Unit test
  • Manual test
CleanShot 2026-02-25 at 11 57 10@2x

Questions

Will it cause performance regression or break compatibility?

No. This PR only adds an additive metric and dashboard panel, and the per-changefeed metric update is on the same 5s loop as existing changefeed metrics.

Do you need to update user documentation, design documentation or monitoring documentation?

Monitoring dashboard is updated.

Release note

Add a changefeed downstream type metric and show it in the TiCDC Grafana Changefeed section.

Summary by CodeRabbit

  • New Features

    • Expose changefeed downstream type and TiDB confirmation as new metrics; add Grafana table panels showing downstream types.
  • Bug Fixes

    • Safer handling and cleanup when changefeed info is missing to prevent nil-related issues and stale metric labels.
  • Behavior

    • Metrics now update and remove downstream-type and TiDB-confirmation labels when feeds change or are removed/shutdown.
  • Tests

    • Added unit tests validating downstream-type extraction from sink URIs.

@ti-chi-bot ti-chi-bot bot added release-note Denotes a PR that will be considered when it comes time to generate release notes. size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. labels Feb 24, 2026
@gemini-code-assist
Copy link

Summary of Changes

Hello @wlwilliamx, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances TiCDC's monitoring capabilities by providing clear visibility into the downstream replication targets of each changefeed. By introducing a new metric and integrating it into the Grafana dashboard, operators can now quickly identify the type of sink (e.g., MySQL, Kafka, S3) a changefeed is writing to, which improves operational insight and simplifies the process of understanding data flow within the system.

Highlights

  • New Metric for Downstream Type: A new constant-gauge metric, ticdc_owner_changefeed_downstream_info, has been introduced to expose the downstream type for each changefeed, labeled by namespace/keyspace, changefeed ID, and the normalized downstream type.
  • Sink-URI Scheme Normalization: A utility function was added to derive and normalize the downstream_type from the sink-URI scheme (e.g., mysql+ssl becomes mysql, gs becomes gcs), ensuring a small, stable set of label values and preventing sensitive information leakage.
  • Grafana Dashboard Integration: A new filterable table panel has been added to the 'Changefeed' section of the TiCDC Grafana dashboard, allowing users to easily view the downstream type for each changefeed.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • coordinator/changefeed/changefeed.go
    • Added GetInfo and SetInfo methods with nil checks and lazy initialization for ChangeFeedInfo.
  • coordinator/changefeed/changefeed_db.go
    • Implemented deletion of ChangefeedDownstreamInfoGauge labels when a changefeed is removed to prevent stale metric data.
  • coordinator/controller.go
    • Introduced a cache (changefeedDownstreamTypeCache) to manage and clean up ChangefeedDownstreamInfoGauge labels when changefeed sink-URIs are updated or changefeeds are removed.
    • Updated the collectMetrics function to periodically update the new ChangefeedDownstreamInfoGauge for all active changefeeds.
  • metrics/grafana/ticdc_new_arch.json
    • Added a new table panel named "Changefeed Downstream Type" to the "Changefeed" section of the Grafana dashboard.
  • metrics/nextgengrafana/ticdc_new_arch_next_gen.json
    • Added a new table panel named "Changefeed Downstream Type" to the "Changefeed" section of the next-gen Grafana dashboard.
  • metrics/nextgengrafana/ticdc_new_arch_with_keyspace_name.json
    • Added a new table panel named "Changefeed Downstream Type" to the "Changefeed" section of the keyspace-named Grafana dashboard.
  • pkg/metrics/changefeed.go
    • Defined and registered the ChangefeedDownstreamInfoGauge metric, which exposes downstream type information.
  • pkg/metrics/downstream_type.go
    • Created a new file containing the DownstreamTypeFromSinkURI function, which normalizes sink-URI schemes into stable downstream type labels.
  • pkg/metrics/downstream_type_test.go
    • Added unit tests for the DownstreamTypeFromSinkURI function to ensure correct normalization of various sink-URI schemes.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 24, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds downstream-type inference and metrics for changefeeds, nil-safe GetInfo/SetInfo on in-memory ChangeFeedInfo, updates owner/controller and changefeed lifecycle to set and clean per-changefeed downstream metrics, updates MySQL/TiDB sink runtime metrics, and adds Grafana table panels showing changefeed → downstream_type.

Changes

Cohort / File(s) Summary
Metrics core & inference
pkg/metrics/changefeed.go, pkg/metrics/downstream_type.go, pkg/metrics/downstream_type_test.go
Add ChangefeedDownstreamInfoGauge and ChangefeedDownstreamIsTiDBGauge, register them, and implement DownstreamTypeFromSinkURI with unit tests for scheme normalization.
Changefeed in-memory accessors
coordinator/changefeed/changefeed.go
Add nil-safe GetInfo() and SetInfo() methods for the in-memory ChangeFeedInfo pointer with lazy initialization in setter.
Controller & lifecycle metric updates
coordinator/controller.go, coordinator/changefeed/changefeed_db.go
collectMetrics now reads ChangeFeedInfo, computes normalized downstream_type, updates ChangefeedDownstreamInfoGauge, caches per-display-name downstream types, and purges stale labels for removed feeds; StopByChangefeedID deletes downstream metric labels when a feed is removed.
Sink runtime metric updates
downstreamadapter/sink/mysql/sink.go
Set or delete ChangefeedDownstreamIsTiDBGauge for MySQL/TiDB sinks during New and delete on Close to reflect TiDB confirmation.
Grafana dashboards
metrics/grafana/ticdc_new_arch.json, metrics/nextgengrafana/ticdc_new_arch_next_gen.json, metrics/nextgengrafana/ticdc_new_arch_with_keyspace_name.json
Add a "Changefeed Downstream Type" table panel (id 60029) in the Changefeed row that queries the new metric and presents {keyspace/keyspace_name, changefeed, downstream_type}.

Sequence Diagram(s)

sequenceDiagram
  participant Owner as Owner Controller
  participant CF as Changefeed (in-memory)
  participant Metrics as Prometheus Gauges
  participant Prom as Prometheus Scraper
  participant Graf as Grafana

  Owner->>CF: GetInfo() -> read displayName, SinkURI
  CF-->>Owner: ChangeFeedInfo (may be nil)
  Owner->>Metrics: DownstreamTypeFromSinkURI(SinkURI) -> set Gauge{keyspace,changefeed,downstream_type}=1
  Owner->>Metrics: delete old Gauge label if downstream_type changed or feed removed
  Prom->>Metrics: scrape metrics endpoint
  Graf->>Prom: query ticdc_owner_changefeed_downstream_info{...}
  Graf-->>User: render table of keyspace/changefeed/downstream_type
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels

lgtm, approved

Suggested reviewers

  • wk989898
  • hongyunyan
  • asddongmen
  • flowbehappy

Poem

🐰 I sniffed the URI, I found its type,
I hop and set a gauge so dashboards look nice.
Owner asks, I tell — tidy and bright,
Grafana shows rows in the soft evening light.
Hooray for labels — carrots for insight!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding metrics and Grafana dashboard visualization for changefeed downstream type.
Linked Issues check ✅ Passed The PR implementation fully addresses all coding requirements from issue #4250: new metrics for downstream type, scheme normalization, dashboard panel, and unit/manual tests.
Out of Scope Changes check ✅ Passed All code changes are directly scoped to implementing the downstream type metric feature and dashboard visualization; no unrelated modifications detected.
Description check ✅ Passed PR description follows the template with all required sections: issue reference, detailed problem statement, changes and implementation details, comprehensive test coverage (unit and manual tests with screenshot evidence), and clear answers to compatibility and documentation questions. Release note is properly provided.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a new metric to expose the downstream type of a changefeed, which is a valuable addition for monitoring. The implementation includes defining the metric, logic for populating it in the controller, and cleanup procedures. A new utility to derive the downstream type from the sink URI is also added, along with comprehensive unit tests. The Grafana dashboards are updated to display this new information. The overall approach is solid, but I've found a critical issue that could lead to a panic.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
coordinator/changefeed/changefeed_db.go (1)

133-153: Merge the duplicate if remove blocks.

The downstream info gauge cleanup at lines 143–153 adds a second if remove check immediately after the first one (lines 133–141). Both guards cover the same condition; folding them together removes the redundancy and makes the removal path read as a single unit.

♻️ Proposed refactor
 	if remove {
 		log.Info("remove changefeed", zap.String("changefeed", cf.ID.String()))
 		delete(db.changefeeds, cfID)
 		delete(db.changefeedDisplayNames, cf.ID.DisplayName)
 		delete(db.stopped, cfID)
+		info := cf.GetInfo()
+		if info != nil {
+			downstreamType := metrics.DownstreamTypeFromSinkURI(info.SinkURI)
+			metrics.ChangefeedDownstreamInfoGauge.DeleteLabelValues(
+				cfID.Keyspace(),
+				cfID.Name(),
+				downstreamType,
+			)
+		}
 	} else {
 		log.Info("stop changefeed", zap.String("changefeed", cfID.String()))
 		db.stopped[cfID] = cf
 	}
-
-	if remove {
-		info := cf.GetInfo()
-		if info != nil {
-			downstreamType := metrics.DownstreamTypeFromSinkURI(info.SinkURI)
-			metrics.ChangefeedDownstreamInfoGauge.DeleteLabelValues(
-				cfID.Keyspace(),
-				cfID.Name(),
-				downstreamType,
-			)
-		}
-	}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@coordinator/changefeed/changefeed_db.go` around lines 133 - 153, There are
two adjacent "if remove" blocks; merge them so the removal path is a single
block: move the downstream gauge cleanup (using cf.GetInfo(),
metrics.DownstreamTypeFromSinkURI(info.SinkURI), and
metrics.ChangefeedDownstreamInfoGauge.DeleteLabelValues(cfID.Keyspace(),
cfID.Name(), downstreamType)) into the first "if remove" that already deletes
db.changefeeds, db.changefeedDisplayNames and db.stopped, and remove the second
redundant "if remove" branch so all removal-related actions for cfID/cf occur
together.
pkg/metrics/downstream_type_test.go (1)

36-46: Consider adding test cases for the remaining Pulsar variants and canonical GCS/AzBlob schemes.

The implementation handles four Pulsar schemes (pulsar, pulsar+ssl, pulsar+http, pulsar+https) and the canonical GCS (gcs://) and AzBlob (azblob://) schemes, but the test matrix only exercises pulsar://, pulsar+https://, gs://, and azure://. Additionally, an empty-string URI ("") is an untested edge case that the implementation silently maps to "unknown".

➕ Suggested additional test cases
 		{sinkURI: "pulsar://127.0.0.1:6650/topic", expectedLabel: "pulsar"},
 		{sinkURI: "pulsar+https://127.0.0.1:8443/topic", expectedLabel: "pulsar"},
+		{sinkURI: "pulsar+ssl://127.0.0.1:6651/topic", expectedLabel: "pulsar"},
+		{sinkURI: "pulsar+http://127.0.0.1:8080/topic", expectedLabel: "pulsar"},
 		{sinkURI: "file:///tmp/ticdc", expectedLabel: "file"},
 		{sinkURI: "s3://bucket/prefix", expectedLabel: "s3"},
 		{sinkURI: "gs://bucket/prefix", expectedLabel: "gcs"},
+		{sinkURI: "gcs://bucket/prefix", expectedLabel: "gcs"},
 		{sinkURI: "azure://bucket/prefix", expectedLabel: "azblob"},
+		{sinkURI: "azblob://bucket/prefix", expectedLabel: "azblob"},
 		{sinkURI: "noop://bucket/prefix", expectedLabel: "noop"},
 		{sinkURI: "blackhole:///", expectedLabel: "blackhole"},
 		{sinkURI: "127.0.0.1:3306", expectedLabel: "unknown"},
 		{sinkURI: "mysql://[::1", expectedLabel: "unknown"},
+		{sinkURI: "", expectedLabel: "unknown"},
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/metrics/downstream_type_test.go` around lines 36 - 46, The test matrix in
pkg/metrics/downstream_type_test.go omits several URI variants that the
production code handles; update the table of cases (entries using sinkURI and
expectedLabel) in the test (the downstream type test) to add rows for
pulsar+ssl://..., pulsar+http://..., the canonical gcs:// and azblob:// schemes,
and an empty-string "" case expecting "unknown"; ensure you use the same
sinkURI/expectedLabel fields so the existing loop/assert logic exercises these
new cases.
metrics/grafana/ticdc_new_arch.json (1)

4635-4645: Consider using format: "table" to simplify the transformation chain.

With instant: true, the Prometheus data source can return a table response (format: "table") where label columns are already promoted — making the labelsToFields transformation redundant. The organize step is still needed to reorder/hide columns.

♻️ Proposed simplification
             "expr": "max by (namespace, changefeed, downstream_type) (ticdc_owner_changefeed_downstream_info{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", namespace=~\"$namespace\", changefeed=~\"$changefeed\"})",
-            "format": "time_series",
+            "format": "table",
             "instant": true,
             "refId": "A"

Then remove the now-redundant labelsToFields transformation:

         "transformations": [
-          {
-            "id": "labelsToFields",
-            "options": {}
-          },
           {
             "id": "organize",
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@metrics/grafana/ticdc_new_arch.json` around lines 4635 - 4645, The panel
"Changefeed Downstream Type" is using instant: true but still requests
time_series format and applies a redundant labelsToFields transformation; change
the query block to use format: "table" (keeping instant: true) so Prometheus
returns label columns directly, then remove the labelsToFields transformation
entry and keep the organize/other transformations to reorder or hide columns;
look for the panel title "Changefeed Downstream Type", the query with expr
"ticdc_owner_changefeed_downstream_info...", and the transformation object with
"id": "labelsToFields" to make these edits.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@coordinator/changefeed/changefeed.go`:
- Around line 115-121: The SetInfo method currently dereferences a nil receiver
because the condition mixes c == nil with c.info == nil; first guard against a
nil receiver by returning immediately if c == nil, then handle lazy
initialization of c.info: if c.info == nil create a new atomic.Pointer via
atomic.NewPointer(info) and assign it to c.info, else call c.info.Store(info);
reference the Changefeed.SetInfo method, the receiver c, the field c.info,
atomic.NewPointer and c.info.Store to locate and apply the fix.

---

Nitpick comments:
In `@coordinator/changefeed/changefeed_db.go`:
- Around line 133-153: There are two adjacent "if remove" blocks; merge them so
the removal path is a single block: move the downstream gauge cleanup (using
cf.GetInfo(), metrics.DownstreamTypeFromSinkURI(info.SinkURI), and
metrics.ChangefeedDownstreamInfoGauge.DeleteLabelValues(cfID.Keyspace(),
cfID.Name(), downstreamType)) into the first "if remove" that already deletes
db.changefeeds, db.changefeedDisplayNames and db.stopped, and remove the second
redundant "if remove" branch so all removal-related actions for cfID/cf occur
together.

In `@metrics/grafana/ticdc_new_arch.json`:
- Around line 4635-4645: The panel "Changefeed Downstream Type" is using
instant: true but still requests time_series format and applies a redundant
labelsToFields transformation; change the query block to use format: "table"
(keeping instant: true) so Prometheus returns label columns directly, then
remove the labelsToFields transformation entry and keep the organize/other
transformations to reorder or hide columns; look for the panel title "Changefeed
Downstream Type", the query with expr
"ticdc_owner_changefeed_downstream_info...", and the transformation object with
"id": "labelsToFields" to make these edits.

In `@pkg/metrics/downstream_type_test.go`:
- Around line 36-46: The test matrix in pkg/metrics/downstream_type_test.go
omits several URI variants that the production code handles; update the table of
cases (entries using sinkURI and expectedLabel) in the test (the downstream type
test) to add rows for pulsar+ssl://..., pulsar+http://..., the canonical gcs://
and azblob:// schemes, and an empty-string "" case expecting "unknown"; ensure
you use the same sinkURI/expectedLabel fields so the existing loop/assert logic
exercises these new cases.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7e03137 and f965e24.

📒 Files selected for processing (9)
  • coordinator/changefeed/changefeed.go
  • coordinator/changefeed/changefeed_db.go
  • coordinator/controller.go
  • metrics/grafana/ticdc_new_arch.json
  • metrics/nextgengrafana/ticdc_new_arch_next_gen.json
  • metrics/nextgengrafana/ticdc_new_arch_with_keyspace_name.json
  • pkg/metrics/changefeed.go
  • pkg/metrics/downstream_type.go
  • pkg/metrics/downstream_type_test.go

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@pkg/metrics/downstream_type.go`:
- Around line 41-45: The downstream label for MySQL schemes currently returns
"mysql/tidb" in the switch handling config.MySQLScheme and
config.MySQLSSLScheme; change it to return "mysql" instead so it matches the
normalization spec and the PR screenshot, and rely on the existing
ChangefeedDownstreamIsTiDBGauge metric to indicate confirmed TiDB instances;
update the accompanying comment in downstream_type.go (around the MySQL/SSL
case) to reflect that SSL maps to "mysql" and TiDB confirmation is conveyed
separately.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ce14bf6 and 8f84d76.

📒 Files selected for processing (7)
  • downstreamadapter/sink/mysql/sink.go
  • metrics/grafana/ticdc_new_arch.json
  • metrics/nextgengrafana/ticdc_new_arch_next_gen.json
  • metrics/nextgengrafana/ticdc_new_arch_with_keyspace_name.json
  • pkg/metrics/changefeed.go
  • pkg/metrics/downstream_type.go
  • pkg/metrics/downstream_type_test.go
🚧 Files skipped from review as they are similar to previous changes (5)
  • pkg/metrics/changefeed.go
  • pkg/metrics/downstream_type_test.go
  • metrics/grafana/ticdc_new_arch.json
  • metrics/nextgengrafana/ticdc_new_arch_next_gen.json
  • metrics/nextgengrafana/ticdc_new_arch_with_keyspace_name.json

@wlwilliamx wlwilliamx force-pushed the metrics/changefeed-downstream-type-panel branch from 8f84d76 to 0f84dea Compare February 24, 2026 09:51
@wlwilliamx wlwilliamx force-pushed the metrics/changefeed-downstream-type-panel branch from 0f84dea to 06343b6 Compare February 24, 2026 09:55
@ti-chi-bot ti-chi-bot bot added needs-1-more-lgtm Indicates a PR needs 1 more LGTM. approved labels Feb 24, 2026
@ti-chi-bot ti-chi-bot bot added the lgtm label Feb 25, 2026
@ti-chi-bot
Copy link

ti-chi-bot bot commented Feb 25, 2026

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: asddongmen, lidezhu

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@ti-chi-bot ti-chi-bot bot removed the needs-1-more-lgtm Indicates a PR needs 1 more LGTM. label Feb 25, 2026
@ti-chi-bot
Copy link

ti-chi-bot bot commented Feb 25, 2026

[LGTM Timeline notifier]

Timeline:

  • 2026-02-24 13:09:12.074985772 +0000 UTC m=+187624.589780391: ☑️ agreed by lidezhu.
  • 2026-02-25 05:23:01.771762504 +0000 UTC m=+246054.286557112: ☑️ agreed by asddongmen.

@ti-chi-bot
Copy link

ti-chi-bot bot commented Feb 25, 2026

@wlwilliamx: The following tests failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
pull-cdc-kafka-integration-heavy 06343b6 link unknown /test pull-cdc-kafka-integration-heavy
pull-cdc-kafka-integration-light 06343b6 link unknown /test pull-cdc-kafka-integration-light

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved lgtm release-note Denotes a PR that will be considered when it comes time to generate release notes. size/XL Denotes a PR that changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Grafana: Add a panel to show downstream type per changefeed

3 participants