1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// Copyright 2025 Lablup Inc. and Jeongkyu Shin
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Prometheus `/metrics` HTTP handler.
//!
//! Renders the merged reader outputs from [`AppState`] through the shared
//! exposition writer in [`crate::api::metrics::render`]. Kept separate from
//! the SSE / snapshot handlers (issue #193) so adding new routes does not
//! force a rebuild of this unchanged hot path.
//!
//! Status-code contract (issue #324): this endpoint answers `200` for its
//! entire lifetime, including the window between the listener binding and
//! the first collection cycle landing. It is deliberately *not* a
//! readiness probe, because turning it into one would break every scraper
//! that already treats a non-200 as a failed target. What changed in #324
//! is that the body is no longer empty in that window: the exposition
//! carries `all_smi_up 0` plus build info until the first cycle completes,
//! then `all_smi_up 1` plus the full metric set. Consumers that need a
//! yes/no gate use `/-/ready` (see [`crate::api::handlers::ready`]).
use State;
use Arc;
use RwLock;
use crateis_ready;
use crate;
use crateAppState;
pub type SharedState = ;
pub async