Skip to content

[feature](metrics) Add the changelog monitor to the Master FE - #69848

Open
morningman wants to merge 3 commits into
apache:masterfrom
morningman:changelog-monitor-t1
Open

morningman wants to merge 3 commits into
apache:masterfrom
morningman:changelog-monitor-t1

Conversation

@morningman

@morningman morningman commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

What problem does this PR solve?

Issue Number: #69907

Related PR: None

Problem Summary:

In short. Table streams and IVM materialized views export no metrics, and the signals an operator needs from them (is an MV fresh, is a stream about to fall behind its changelog TTL) are too costly to compute while /metrics is scraped. This PR adds a daemon of the Master FE that samples into an immutable snapshot, renders the snapshot in /metrics, and puts the first series on it: the changelog kept by the tables, and the health of the sampling itself. The state of the streams and of the IVM materialized views comes with follow-up PRs on this framework.

Background. A table with changelog.enable keeps a changelog, which table streams and IVM materialized views consume. Their state shows only in system tables (table_streams, table_stream_consumption, mv_infos()), which have to be queried one by one, and SHOW DATA lists the changelog size of each table as ChangelogSize.

The problem, and what it cost.

  • No alert can watch the changelog: nothing in /metrics says how much changelog the tables keep, or whether the streams and IVM materialized views keep up with it.
  • The coming signals need per-partition state: offsets, visible versions, and in cloud mode a MetaService call. MetricRepo.getMetric renders the whole /metrics response under one lock, so computing them there would make every scrape pay for a walk over the metadata.
  • A gauge that every FE exports and a non-Master FE sets to 0, the way the routine load lag does, drags a min or max across the FEs to 0.

How this PR fixes it.

  • ChangelogMonitor, a daemon of the Master FE: every changelog_monitor_interval_seconds it samples, builds an immutable ChangelogMonitorSnapshot, and replaces the previous one at once. A round that fails keeps the previous snapshot and counts the failure.
  • MetricVisitor.visitChangelogMonitor, beside visitCloudTableStats, renders the series from the latest snapshot. Only the Master exports them: another FE exports none of them rather than 0, and a new Master exports none of the sampled series until its first round completes. The JSON and core outputs of /metrics render nothing.
  • The first series:
Series Type Value
doris_fe_changelog_retained_bytes{scope="single_replica"} gauge the changelog kept by all the tables, counting one replica of each tablet
doris_fe_changelog_retained_bytes{scope="all_replicas"} gauge the same over all the replicas, which is what SHOW DATA lists as ChangelogSize; not exported in cloud mode, where a tablet keeps one copy in the shared storage
doris_fe_changelog_monitor_last_sample_timestamp_seconds gauge when the latest round completed
doris_fe_changelog_monitor_sample_duration_seconds gauge how long the latest round took
doris_fe_changelog_monitor_sample_failures_total counter the rounds that failed since this FE became the Master

The last three let an alert tell stale data (time() - doris_fe_changelog_monitor_last_sample_timestamp_seconds > 120, or the series absent) from a healthy state.

  • Two FE configs, mutable, Master-only and EXPERIMENTAL like the other table stream configs: enable_changelog_monitor (true), which takes effect with enable_feature_changelog only, so a cluster without the changelog feature exports nothing new; and changelog_monitor_interval_seconds (15), which the daemon checks every second, so a change applies at once.

Results.

Case Before After
/metrics of the Master, enable_feature_changelog on no changelog series the five series above
/metrics of any other FE — none of them
enable_feature_changelog or enable_changelog_monitor off — none of them, and no sampling
all_replicas against the ChangelogSize total of SHOW DATA PROPERTIES ("entire_warehouse" = "true") — equal (1340323 bytes on both, local cluster)

Classes, and how they call each other.

  • ChangelogMonitor (org.apache.doris.changelog): the daemon. buildSnapshot sums OlapTable.getChangelogSize(true) and getChangelogSize(false) over the tables of the internal catalog, from the statistics that TabletStatMgr or CloudTabletStatMgr refreshes.
  • ChangelogMonitorSnapshot (org.apache.doris.changelog): what one round sampled; never changes once built.
  • MetricVisitor.visitChangelogMonitor: implemented by PrometheusMetricVisitor, empty in JsonMetricVisitor and SimpleCoreMetricVisitor; called by MetricRepo.getMetric after visitCloudTableStats.
  • Env: holds the monitor and starts it with the other daemons of the Master.
Env.startMasterOnlyDaemonThreads
  └─ ChangelogMonitor.start()             checks every second; a round each changelog_monitor_interval_seconds
        └─ buildSnapshot()                sums OlapTable.getChangelogSize(true / false)
              └─ volatile ChangelogMonitorSnapshot   replaced as a whole
                        ▲
MetricRepo.getMetric ─► PrometheusMetricVisitor.visitChangelogMonitor()   Master only

Nothing else changes: no persisted metadata, no thrift or proto change, and the existing series are untouched.

Release note

With enable_feature_changelog on, the Master FE exports doris_fe_changelog_retained_bytes{scope} and the health of its sampling, doris_fe_changelog_monitor_last_sample_timestamp_seconds, doris_fe_changelog_monitor_sample_duration_seconds and doris_fe_changelog_monitor_sample_failures_total. New FE configs enable_changelog_monitor and changelog_monitor_interval_seconds.

Check List (For Author)

  • Test

    • Regression test
    • Unit Test
    • Manual test (add detailed scripts or steps below)
    • No need to test or manual test. Explain why:
      • This is a refactor/code format and no logic has been changed.
      • Previous test can cover this change.
      • No code files have been changed.
      • Other reason

    Unit test: ChangelogMonitorTest checks that a round sums the changelog that SHOW DATA reads from the table statistics, that a failed round keeps the previous snapshot and counts the failure, and that rounds follow the interval, a shorter interval applies at the next check, and a disabled monitor samples nothing and drops its snapshot. ChangelogMonitorMetricsTest checks the exact text of the series, also through MetricRepo.getMetric; only the failure counter before the first round; nothing on a Follower, or with the monitor or the changelog feature disabled; single_replica only in cloud mode; nothing in the JSON and core outputs.

    Regression test: changelog_p0/test_changelog_monitor_metrics, run on a local shared-nothing cluster (not in cloud mode). On the /metrics of the Master, all_replicas (single_replica in cloud mode) equals the ChangelogSize total of SHOW DATA PROPERTIES ("entire_warehouse" = "true"); the health series are present and fresh; no other FE exports them; nothing once the monitor is disabled.

    Manual: promtool check metrics on the /metrics of the Master reports no parsing error and no lint finding on the new series.

  • Behavior changed:

    • No.
    • Yes.

    With enable_feature_changelog on, the /metrics of the Master FE has the new series, and a daemon of the Master sums the table statistics every 15 seconds. Nothing changes otherwise.

  • Does this need documentation?

    • No.
    • Yes.

    Together with the rest of the changelog and IVM monitoring, in a follow-up doc PR.

Check List (For Reviewer who merge this PR)

  • Confirm the release note
  • Confirm test cases
  • Confirm document
  • Add branch pick label

### What problem does this PR solve?

Issue Number: None

Related PR: None

Problem Summary: Table streams and IVM materialized views have no
metrics. How much changelog the tables keep shows only in `SHOW DATA`,
and nothing lets an alert tell whether an IVM materialized view is
fresh or a stream is about to fall behind its changelog TTL. Those
signals need per-partition state that costs a walk over the metadata,
and in cloud mode a MetaService call, so they cannot be computed while
`/metrics` is scraped: `MetricRepo.getMetric` renders the whole
response under one lock.

This adds the framework the coming signals are rendered from, and the
first series on it.

- `ChangelogIvmMonitor`, a daemon of the Master FE, samples every
  `changelog_ivm_monitor_interval_seconds`, builds an immutable
  `ChangelogIvmMonitorSnapshot` and replaces the previous one at once.
  A round that fails keeps the previous snapshot and counts the
  failure.
- `MetricVisitor.visitChangelogIvmMonitor`, beside
  `visitCloudTableStats`, renders the series from the latest snapshot.
  Only the Master exports them. Another FE exports none rather than 0,
  so a `min` or `max` across the FEs is not dragged to 0, and a new
  Master exports none of the sampled series until its first round
  completes. The JSON and core outputs of `/metrics` render nothing.
- `doris_fe_changelog_retained_bytes{scope}` is the changelog kept by
  all the tables, summed from the table statistics that `SHOW DATA`
  reports as `ChangelogSize`: `single_replica` counts one replica of
  each tablet and `all_replicas` all of them. Cloud mode exports
  `single_replica` only, as a tablet keeps one copy in the shared
  storage.
- `doris_fe_changelog_ivm_monitor_last_sample_timestamp_seconds`,
  `doris_fe_changelog_ivm_monitor_sample_duration_seconds` and
  `doris_fe_changelog_ivm_monitor_sample_failures_total` are the health
  of the monitor, so that an alert tells stale data (the latest round
  long ago, or the series absent) from a healthy state.

Two FE configs, mutable, Master-only and EXPERIMENTAL like the other
table stream configs: `enable_changelog_ivm_monitor` (true) takes
effect with `enable_feature_changelog` only, so a cluster without the
changelog feature exports nothing new; `changelog_ivm_monitor_interval_seconds`
(15) is checked every second, so a change applies at once.

The state of the streams and of the IVM materialized views, their
series of their own and the quota on those come with follow-up PRs on
this framework.

### Release note

With `enable_feature_changelog` on, the Master FE exports
`doris_fe_changelog_retained_bytes{scope}` and the health of its
sampling, `doris_fe_changelog_ivm_monitor_last_sample_timestamp_seconds`,
`doris_fe_changelog_ivm_monitor_sample_duration_seconds` and
`doris_fe_changelog_ivm_monitor_sample_failures_total`. New FE configs
`enable_changelog_ivm_monitor` and `changelog_ivm_monitor_interval_seconds`.

### Check List (For Author)

- Test: Unit Test, Regression test, Manual test
    - `ChangelogIvmMonitorTest`: a round sums the changelog that
      `SHOW DATA` reads from the table statistics; a failed round keeps
      the previous snapshot and counts the failure; rounds follow the
      interval, a shorter interval applies at the next check, and a
      disabled monitor samples nothing and drops its snapshot.
    - `ChangelogIvmMonitorMetricsTest`: the exact text of the series,
      also through `MetricRepo.getMetric`; only the failure counter
      before the first round; nothing on a Follower or with the monitor
      or the changelog feature disabled; `single_replica` only in cloud
      mode; nothing in the JSON and core outputs.
    - `changelog_p0/test_changelog_ivm_monitor_metrics` (run locally,
      not in cloud mode): on the `/metrics` of the Master,
      `all_replicas` (`single_replica` in cloud mode) equals the
      `ChangelogSize` total of
      `SHOW DATA PROPERTIES ("entire_warehouse" = "true")`; the health
      series are present and fresh; no other FE exports them; nothing
      once the monitor is disabled.
    - Manual: `promtool check metrics` on the `/metrics` of the Master
      reports no parsing error and no lint finding on the new series.
- Behavior changed: Yes. With `enable_feature_changelog` on, the
  `/metrics` of the Master FE has the four new families, and a Master
  daemon sums the table statistics every 15 seconds. Nothing changes
  otherwise.
- Does this need documentation: Yes, together with the rest of the
  changelog and IVM monitoring, in a follow-up doc PR.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@hello-stephen

Copy link
Copy Markdown
Contributor

Thank you for your contribution to Apache Doris.
Don't know what should be done next? See How to process your PR.

Please clearly describe your PR:

  1. What problem was fixed (it's best to include specific error reporting information). How it was fixed.
  2. Which behaviors were modified. What was the previous behavior, what is it now, why was it modified, and what possible impacts might there be.
  3. What features were added. Why was this function added?
  4. Which code was refactored and why was this part of the code refactored?
  5. Which functions were optimized and what is the difference before and after the optimization?

@morningman

Copy link
Copy Markdown
Contributor Author

/review

@morningman

Copy link
Copy Markdown
Contributor Author

run buildall

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed PR 69848 at the pinned head 0b70734 against base 2a4191c. The new Master-only monitor, immutable snapshot publication, failure retention/counter, Prometheus-only rendering, and cloud/shared-nothing changelog semantics match the stated feature goal and SHOW DATA aggregation. Catalog/database collections are concurrent-map snapshots, table statistics are volatile whole-object replacements, and no new lock, RPC, journal, persistence, thrift/protobuf, or FE role-transfer defect was found. All MetricVisitor implementations and the inspected unit/regression paths are covered; the tests were not executed because this review is static-only under the review contract.

One verified P2 finding is included inline: the enable gate is checked only before sampling and snapshots are published unconditionally. Disabling and re-enabling within the one-second polling window, or disabling during a long catalog walk, can expose a snapshot from the disabled period after re-enable. No existing inline findings apply, and no additional user review focus was supplied.

All three review lanes completed their assigned coverage and independently rechecked the candidate. Every other risk was dismissed with evidence, so this review converged in round 1 with no remaining unresolved candidate.

Review converged after 1 round(s).


@Override
protected void runAfterCatalogReady() {
if (!isEnabled()) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[P2] Clear or reject snapshots across monitor disable/re-enable transitions. runAfterCatalogReady() checks isEnabled() before sample(), but sample() publishes unconditionally. If enable_changelog_ivm_monitor is set false during a catalog walk, or toggled false/true within the one-second polling interval, snapshot can still contain a sample from the disabled window; when the flag is true again, PrometheusMetricVisitor exports it. Add an enable-generation (or a post-build enable check) so re-enabling cannot expose a snapshot from the disabled period.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The mechanism is right, but the snapshot exported in either case is never older than the one a monitor that was never disabled would export at that moment.

  • The monitor checks the flag every second. A disable that lasts until the next check drops the snapshot, and after re-enabling, the series are missing until a round completes. That is what dropping it is for: after a long disable, the first round can take a while, and a snapshot hours old must not be exported in the meantime (testRoundsFollowTheIntervalAndStopWhileDisabled).
  • What the daemon does not see is a toggle shorter than one check, or a disable during a walk that is undone before the next check. The snapshot exported afterwards is then the latest round, taken before the disable or finishing as it happened, and doris_fe_changelog_ivm_monitor_last_sample_timestamp_seconds says when it was taken. Nothing in it comes from a disabled period.
  • While the monitor is disabled, nothing is exported: the visitor checks isEnabled(), and the next check drops the snapshot.
  • A check of the flag before publishing would not cover either case, since both checks see it on. An enable generation needs a callback on the config (ConfHandler) for a window of under a second with no observable difference.

So I'm keeping it as it is.

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 28347 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 0b70734e169d7354224a34486456ec5effa25911, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17591	5143	5048	5048
q2	2149	314	250	250
q3	10255	1437	816	816
q4	4682	463	335	335
q5	7430	799	519	519
q6	183	186	151	151
q7	740	793	600	600
q8	9256	1297	1076	1076
q9	5462	4208	4182	4182
q10	6808	1290	995	995
q11	437	242	224	224
q12	632	394	275	275
q13	18114	3603	3054	3054
q14	274	278	249	249
q15	q16	727	711	665	665
q17	1203	749	567	567
q18	7052	6190	6141	6141
q19	1112	984	606	606
q20	370	327	225	225
q21	5023	2117	2300	2117
q22	343	292	252	252
Total cold run time: 99843 ms
Total hot run time: 28347 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	5569	5568	5550	5550
q2	697	586	517	517
q3	5236	5398	4934	4934
q4	1978	2140	1554	1554
q5	5269	5163	5523	5163
q6	267	206	159	159
q7	2353	2110	1885	1885
q8	3092	2862	2717	2717
q9	8021	8015	8150	8015
q10	3727	3678	3181	3181
q11	606	436	434	434
q12	711	688	508	508
q13	3401	3988	3231	3231
q14	301	308	298	298
q15	q16	687	698	643	643
q17	8247	7621	7008	7008
q18	12913	12233	12972	12233
q19	938	795	788	788
q20	2132	2168	1914	1914
q21	5562	4575	4661	4575
q22	503	466	417	417
Total cold run time: 72210 ms
Total hot run time: 65724 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 151148 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 0b70734e169d7354224a34486456ec5effa25911, data reload: false

query5	4315	575	436	436
query6	433	203	189	189
query7	4816	449	226	226
query8	327	170	154	154
query9	8744	3229	3254	3229
query10	484	304	268	268
query11	6002	3868	3592	3592
query12	151	91	89	89
query13	1240	464	348	348
query14	6146	3926	3711	3711
query14_1	3415	3460	3424	3424
query15	204	198	188	188
query16	942	467	421	421
query17	841	675	560	560
query18	2430	435	309	309
query19	210	173	137	137
query20	90	84	85	84
query21	216	127	109	109
query22	13122	13033	12746	12746
query23	13456	12822	12406	12406
query23_1	12652	12631	12425	12425
query24	7370	848	480	480
query24_1	485	491	490	490
query25	540	420	369	369
query26	1255	259	141	141
query27	2757	445	287	287
query28	4606	2069	2052	2052
query29	1593	600	463	463
query30	309	215	188	188
query31	1012	934	823	823
query32	148	95	93	93
query33	526	303	249	249
query34	901	854	525	525
query35	731	761	641	641
query36	842	815	742	742
query37	126	99	89	89
query38	1797	1743	1699	1699
query39	791	778	746	746
query39_1	720	734	739	734
query40	227	118	98	98
query41	71	74	68	68
query42	91	90	82	82
query43	342	366	307	307
query44	1338	709	728	709
query45	177	189	169	169
query46	841	970	612	612
query47	2986	2872	2583	2583
query48	294	313	218	218
query49	578	402	294	294
query50	694	271	209	209
query51	10511	10265	10538	10265
query52	78	77	74	74
query53	196	219	154	154
query54	227	195	178	178
query55	72	66	65	65
query56	221	205	211	205
query57	1632	1604	1550	1550
query58	282	264	255	255
query59	2139	2186	1997	1997
query60	294	227	224	224
query61	156	145	148	145
query62	389	338	272	272
query63	187	156	160	156
query64	2757	970	757	757
query65	3307	3271	3285	3271
query66	1786	411	334	334
query67	20170	20077	19950	19950
query68	2885	1030	645	645
query69	394	287	249	249
query70	849	778	774	774
query71	285	237	217	217
query72	2655	2603	2279	2279
query73	520	528	307	307
query74	4623	4513	4309	4309
query75	2322	2302	1909	1909
query76	2321	1019	599	599
query77	352	379	271	271
query78	9797	9673	9188	9188
query79	1510	851	538	538
query80	1224	425	347	347
query81	579	319	281	281
query82	582	141	100	100
query83	304	191	183	183
query84	306	129	106	106
query85	853	423	380	380
query86	398	238	233	233
query87	2010	1923	1814	1814
query88	3853	2799	2777	2777
query89	335	282	240	240
query90	1862	165	170	165
query91	163	148	138	138
query92	96	84	89	84
query93	1128	1027	585	585
query94	656	297	261	261
query95	563	399	316	316
query96	672	511	241	241
query97	2467	2432	2312	2312
query98	162	153	152	152
query99	757	754	652	652
Total cold run time: 236058 ms
Total hot run time: 151148 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 24.54 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 0b70734e169d7354224a34486456ec5effa25911, data reload: false

query1	0.00	0.00	0.00
query2	0.10	0.05	0.05
query3	0.26	0.08	0.08
query4	1.61	0.11	0.11
query5	0.23	0.24	0.24
query6	1.18	0.67	0.68
query7	0.04	0.01	0.01
query8	0.06	0.04	0.04
query9	0.39	0.35	0.35
query10	0.59	0.57	0.58
query11	0.19	0.14	0.15
query12	0.18	0.14	0.14
query13	0.48	0.49	0.49
query14	1.02	1.00	1.00
query15	0.61	0.60	0.61
query16	0.35	0.34	0.35
query17	1.15	1.14	1.13
query18	0.20	0.19	0.20
query19	2.13	1.99	1.98
query20	0.02	0.02	0.01
query21	15.49	0.18	0.13
query22	4.95	0.05	0.05
query23	16.29	0.31	0.13
query24	3.14	0.47	0.39
query25	0.11	0.05	0.05
query26	0.95	0.22	0.16
query27	0.05	0.04	0.04
query28	3.85	0.80	0.37
query29	12.51	4.22	3.37
query30	0.28	0.15	0.10
query31	2.76	0.54	0.32
query32	3.23	0.60	0.49
query33	3.18	3.33	3.28
query34	15.31	4.00	3.40
query35	3.31	3.34	3.35
query36	0.54	0.44	0.42
query37	0.09	0.07	0.06
query38	0.04	0.04	0.04
query39	0.04	0.03	0.03
query40	0.16	0.14	0.15
query41	0.08	0.03	0.03
query42	0.04	0.03	0.03
query43	0.04	0.03	0.04
Total cold run time: 97.23 s
Total hot run time: 24.54 s

@hello-stephen

Copy link
Copy Markdown
Contributor

FE Regression Coverage Report

Increment line coverage 85.53% (65/76) 🎉
Increment coverage report
Complete coverage report

morningman and others added 2 commits November 3, 2026 11:53
…elog monitor

### What problem does this PR solve?

Issue Number: apache#69907

Related PR: apache#69848

Problem Summary:

The names of the monitor read as if it watched IVM only: `ChangelogIvmMonitor`, `enable_changelog_ivm_monitor`, `doris_fe_changelog_ivm_monitor_*`. It samples the changelog the tables keep, the table streams reading it, those users create as well as the internal streams of the IVM materialized views, and the IVM materialized views over those streams, so it is now named after the changelog:

- `ChangelogIvmMonitor` -> `ChangelogMonitor`, `ChangelogIvmMonitorSnapshot` -> `ChangelogMonitorSnapshot`, `Env.getChangelogMonitor()`, `MetricVisitor.visitChangelogMonitor()`, and the daemon thread `changelog-monitor`.
- FE configs `enable_changelog_ivm_monitor` -> `enable_changelog_monitor` and `changelog_ivm_monitor_interval_seconds` -> `changelog_monitor_interval_seconds`.
- `doris_fe_changelog_ivm_monitor_last_sample_timestamp_seconds`, `doris_fe_changelog_ivm_monitor_sample_duration_seconds` and `doris_fe_changelog_ivm_monitor_sample_failures_total` -> `doris_fe_changelog_monitor_*`.
- The tests `ChangelogMonitorTest`, `ChangelogMonitorMetricsTest` and `changelog_p0/test_changelog_monitor_metrics`.

None of the old names has been released. Nothing else changes.

### Release note

None

### Check List (For Author)

- Test: Unit Test
    - `ChangelogMonitorTest`, `ChangelogMonitorMetricsTest`
- Behavior changed: No
- Does this need documentation: No

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…g monitor

### What problem does this PR solve?

Issue Number: apache#69907

Related PR: apache#69848

Problem Summary:

Where the monitor drops its snapshot, the comment said that once enabled again, the monitor must not export what it sampled before it was disabled. The monitor reads the flag at its checks, once a second, so this holds for a disable a check finds. A toggle between two checks, or a disable during a round undone before the next check, goes unseen, and the latest round is then exported as if the monitor had never been disabled. The comment now says what is dropped and when. No code changes.

### Release note

None

### Check List (For Author)

- Test: No need to test (a comment only)
- Behavior changed: No
- Does this need documentation: No

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@morningman morningman changed the title [feature](metrics) Add the changelog and IVM monitor to the Master FE [feature](metrics) Add the changelog monitor to the Master FE Nov 3, 2026
@morningman

Copy link
Copy Markdown
Contributor Author

/review

@morningman

Copy link
Copy Markdown
Contributor Author

run buildall

@github-actions

github-actions Bot commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

Codex automated review failed and did not complete.

Error: Selected model is at capacity. Please try a different model.
Workflow run: https://github.com/apache/doris/actions/runs/41590085770

Please inspect the workflow logs and rerun the review after the underlying issue is resolved.

@hello-stephen

Copy link
Copy Markdown
Contributor

FE UT Coverage Report

Increment line coverage 100.00% (76/76) 🎉
Increment coverage report
Complete coverage report

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 28739 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 2102a6abb6464c690b5a3696c50e3ab330bf0f57, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17584	5172	5043	5043
q2	2120	337	295	295
q3	10171	1381	831	831
q4	4690	453	337	337
q5	7445	808	529	529
q6	185	184	157	157
q7	771	789	606	606
q8	9251	1361	1103	1103
q9	5489	4208	4201	4201
q10	6810	1287	1010	1010
q11	433	249	222	222
q12	633	400	292	292
q13	18095	4082	3042	3042
q14	282	276	246	246
q15	q16	727	714	655	655
q17	1200	768	568	568
q18	7015	6205	6118	6118
q19	1241	954	599	599
q20	380	337	224	224
q21	5798	2386	2451	2386
q22	366	327	275	275
Total cold run time: 100686 ms
Total hot run time: 28739 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	5998	5852	6123	5852
q2	732	616	589	589
q3	5639	5803	5271	5271
q4	2039	2126	1567	1567
q5	5788	5824	5577	5577
q6	231	186	142	142
q7	2250	2053	1822	1822
q8	2985	2656	2670	2656
q9	7919	7494	7489	7489
q10	3610	3584	3113	3113
q11	580	398	374	374
q12	659	655	499	499
q13	3344	3567	3067	3067
q14	299	299	263	263
q15	q16	659	673	619	619
q17	7669	7015	6907	6907
q18	12974	12187	12884	12187
q19	901	797	776	776
q20	2144	2153	1918	1918
q21	5536	4583	4681	4583
q22	498	428	427	427
Total cold run time: 72454 ms
Total hot run time: 65698 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 28233 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 2102a6abb6464c690b5a3696c50e3ab330bf0f57, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17579	5171	5041	5041
q2	2157	312	239	239
q3	10245	1366	799	799
q4	4678	467	342	342
q5	7461	778	527	527
q6	180	183	154	154
q7	751	807	598	598
q8	9242	1286	1058	1058
q9	5530	4183	4183	4183
q10	6834	1273	995	995
q11	418	244	223	223
q12	630	399	284	284
q13	18081	3577	3007	3007
q14	271	276	245	245
q15	q16	713	708	672	672
q17	1221	745	565	565
q18	6988	6153	6112	6112
q19	1109	959	597	597
q20	387	323	216	216
q21	4708	2121	2268	2121
q22	340	287	255	255
Total cold run time: 99523 ms
Total hot run time: 28233 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	5587	5575	5569	5569
q2	680	547	586	547
q3	5197	5356	4900	4900
q4	1974	2142	1551	1551
q5	5216	5135	5413	5135
q6	257	206	159	159
q7	2414	2040	1850	1850
q8	3077	2715	2652	2652
q9	8120	8061	7974	7974
q10	3741	3746	3284	3284
q11	611	446	430	430
q12	700	729	519	519
q13	3651	3862	3296	3296
q14	334	324	303	303
q15	q16	678	749	649	649
q17	8254	7228	6878	6878
q18	12994	12151	12911	12151
q19	896	767	793	767
q20	2152	2144	1940	1940
q21	5540	4603	4644	4603
q22	497	447	418	418
Total cold run time: 72570 ms
Total hot run time: 65575 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 151423 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 2102a6abb6464c690b5a3696c50e3ab330bf0f57, data reload: false

query5	4313	591	452	452
query6	425	207	190	190
query7	4808	449	227	227
query8	319	169	151	151
query9	8795	3138	3151	3138
query10	453	301	248	248
query11	5932	3879	3578	3578
query12	149	91	85	85
query13	1238	429	325	325
query14	6133	3904	3649	3649
query14_1	3431	3385	3412	3385
query15	206	194	179	179
query16	959	464	412	412
query17	853	654	526	526
query18	2405	432	311	311
query19	200	167	138	138
query20	87	95	83	83
query21	218	129	108	108
query22	13023	13106	12845	12845
query23	13555	12983	12517	12517
query23_1	12710	12590	12632	12590
query24	7544	864	474	474
query24_1	484	492	486	486
query25	559	419	363	363
query26	1264	256	156	156
query27	2830	454	286	286
query28	5623	2131	2111	2111
query29	1580	612	477	477
query30	303	226	189	189
query31	1025	938	825	825
query32	140	94	91	91
query33	520	306	246	246
query34	924	887	527	527
query35	757	778	644	644
query36	838	873	727	727
query37	129	97	82	82
query38	1807	1736	1709	1709
query39	802	798	744	744
query39_1	741	732	759	732
query40	232	111	91	91
query41	68	62	63	62
query42	83	83	79	79
query43	344	362	304	304
query44	1321	700	722	700
query45	178	180	167	167
query46	823	954	563	563
query47	3053	2938	2809	2809
query48	299	315	225	225
query49	578	400	284	284
query50	680	282	216	216
query51	10563	10692	10359	10359
query52	76	85	72	72
query53	181	207	154	154
query54	239	189	188	188
query55	69	67	63	63
query56	208	208	199	199
query57	1689	1611	1577	1577
query58	281	265	254	254
query59	2137	2206	1967	1967
query60	311	245	216	216
query61	147	145	143	143
query62	398	346	286	286
query63	192	160	168	160
query64	2708	955	733	733
query65	3342	3334	3269	3269
query66	1765	412	291	291
query67	20119	20309	20048	20048
query68	3062	1014	623	623
query69	372	280	243	243
query70	853	800	822	800
query71	291	230	212	212
query72	2671	2530	2264	2264
query73	525	522	297	297
query74	4626	4517	4320	4320
query75	2346	2295	1896	1896
query76	2306	1023	592	592
query77	340	370	260	260
query78	9739	9730	9191	9191
query79	1021	900	531	531
query80	531	440	321	321
query81	550	321	270	270
query82	582	130	104	104
query83	304	202	179	179
query84	325	126	106	106
query85	827	432	389	389
query86	330	235	230	230
query87	2007	1953	1803	1803
query88	3781	2768	2773	2768
query89	320	286	240	240
query90	1898	166	163	163
query91	169	150	126	126
query92	98	89	86	86
query93	993	1011	598	598
query94	446	299	253	253
query95	570	324	298	298
query96	680	490	236	236
query97	2451	2444	2359	2359
query98	156	148	146	146
query99	779	766	651	651
Total cold run time: 235891 ms
Total hot run time: 151423 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 24.3 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 2102a6abb6464c690b5a3696c50e3ab330bf0f57, data reload: false

query1	0.01	0.00	0.01
query2	0.10	0.05	0.05
query3	0.26	0.09	0.09
query4	1.61	0.10	0.10
query5	0.23	0.24	0.25
query6	1.16	0.68	0.66
query7	0.03	0.00	0.00
query8	0.06	0.04	0.04
query9	0.41	0.35	0.35
query10	0.58	0.56	0.60
query11	0.19	0.14	0.14
query12	0.18	0.15	0.14
query13	0.48	0.48	0.48
query14	1.04	1.03	1.01
query15	0.62	0.61	0.61
query16	0.34	0.36	0.35
query17	1.15	1.14	1.16
query18	0.20	0.18	0.20
query19	2.09	2.00	1.97
query20	0.02	0.01	0.01
query21	15.49	0.19	0.13
query22	4.93	0.06	0.05
query23	16.26	0.33	0.12
query24	3.09	0.51	0.41
query25	0.10	0.06	0.05
query26	0.80	0.21	0.15
query27	0.05	0.03	0.05
query28	3.37	0.78	0.35
query29	12.47	4.16	3.28
query30	0.29	0.12	0.09
query31	2.77	0.54	0.34
query32	3.23	0.62	0.51
query33	3.20	3.16	3.22
query34	15.32	4.02	3.37
query35	3.31	3.32	3.35
query36	0.55	0.43	0.43
query37	0.09	0.07	0.07
query38	0.05	0.04	0.04
query39	0.04	0.03	0.03
query40	0.19	0.15	0.14
query41	0.09	0.03	0.03
query42	0.04	0.04	0.04
query43	0.04	0.04	0.04
Total cold run time: 96.53 s
Total hot run time: 24.3 s

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants