almeidajeff opened a new pull request, #4222:
URL: https://github.com/apache/ambari/pull/4222
## What changes were proposed in this pull request?
On a freshly installed cluster, VMAGENT never receives component scrape
targets for
HDFS/YARN/HBase. The per-host telemetry assignment stays empty until
something unrelated
forces a recompile — a cluster config change, or an ambari-server restart.
Root cause, following the chain:
1. `ServiceComponentHostImpl` publishes `ServiceComponentInstalledEvent`
from its constructor,
right after persisting the host component row with desired state `INIT`.
2. `TelemetryHolder` subscribes to that event as its only per-component hook.
3. `TelemetryAssignmentCompiler.compileCluster()` skips any component that
is not in an
installed state, and `isInstalled()` accepts only `INSTALLED`,
`STARTING`, `STARTED`,
`STOPPING`, `UPGRADING`, `DISABLED` and `UNKNOWN` — `INIT` is not among
them.
4. `handleEvent()`, which processes the real state transitions, refreshes
`HostLevelParamsHolder` but never `TelemetryHolder`.
So the only assignment ever compiled for a host is the one built at `INIT`,
which by
definition contains no component targets, and nothing revisits it on the
normal
install/start path.
Changes:
- `ServiceComponentHostImpl` now refreshes `TelemetryHolder` inside
`handleEvent()`, in the
same block that already publishes `HostComponentsUpdateEvent` on a real
status change.
- `TelemetryHolder.getCurrentData(Long)` is widened from `protected` to
`public` so it is
callable from there, matching how `HostLevelParamsHolder` already exposes
it.
## How was this patch tested?
Two new tests, both run on trunk with this patch applied:
-
**`TelemetryAssignmentCompilerTest.testTargetsAppearOnlyAfterComponentLeavesInitState`**
—
asserts a component in `INIT` contributes no targets while `INSTALLED` and
`STARTED` each
contribute one. This documents why subscribing to
`ServiceComponentInstalledEvent` cannot
work, independently of the fix.
-
**`ServiceComponentHostTest.testTelemetryIsRefreshedOnComponentStateTransition`**
— asserts
that a real state transition repopulates the host's telemetry assignment.
The cached
assignment is dropped after `createEvent()` rather than before, because
creating a config
publishes `ClusterConfigChangedEvent`, which `TelemetryHolder` also
refreshes on — the very
mechanism that masks this bug on a real cluster.
```
$ mvn -pl ambari-server surefire:test \
-Dtest='TelemetryAssignmentCompilerTest,ServiceComponentHostTest#testTelemetryIsRefreshedOnComponentStateTransition'
[INFO] T E S T S
[INFO] Running
org.apache.ambari.server.agent.stomp.TelemetryAssignmentCompilerTest
[INFO] Running
org.apache.ambari.server.state.svccomphost.ServiceComponentHostTest
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.590
s -- in org.apache.ambari.server.agent.stomp.TelemetryAssignmentCompilerTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 21.39
s -- in org.apache.ambari.server.state.svccomphost.ServiceComponentHostTest
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS
```
The second test was verified to be a genuine regression test: with the
`TelemetryHolder` refresh in `handleEvent()` reverted, it fails as expected.
```
[ERROR]
ServiceComponentHostTest.testTelemetryIsRefreshedOnComponentStateTransition:576
A real state transition must refresh the host's telemetry assignment
[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
[INFO] BUILD FAILURE
```
Not covered by automated tests: the end-to-end behaviour on a live cluster
(installing
VICTORIAMETRICS alongside HDFS/YARN/HBase and confirming VMAGENT receives
component scrape
targets with no unrelated config change).
<img width="2090" height="971" alt="image"
src="https://github.com/user-attachments/assets/12e4f09c-9a96-415e-86a9-d13b517da2cc"
/>
<img width="2089" height="967" alt="image"
src="https://github.com/user-attachments/assets/c0e30106-78fe-4460-b3f4-1bfc02dcd66d"
/>
<img width="2081" height="932" alt="image"
src="https://github.com/user-attachments/assets/dc2b73e8-4994-463c-a4fc-9c873064d927"
/>
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]