PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
health_status.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
19#pragma once
20
21#include <chrono>
22#include <cstdint>
23#include <optional>
24#include <string>
25#include <string_view>
26
28
36enum class health_level {
38 healthy,
39
42
45};
46
52[[nodiscard]] constexpr std::string_view to_string(health_level level) noexcept {
53 switch (level) {
55 return "healthy";
57 return "degraded";
59 return "unhealthy";
60 default:
61 return "unknown";
62 }
63}
64
71 bool connected{false};
72
74 std::optional<std::chrono::system_clock::time_point> last_connected;
75
77 std::uint32_t active_connections{0};
78
80 std::optional<std::chrono::milliseconds> response_time;
81
83 std::optional<std::string> error_message;
84};
85
92 bool writable{false};
93
95 bool readable{false};
96
98 std::uint64_t total_bytes{0};
99
101 std::uint64_t used_bytes{0};
102
104 std::uint64_t available_bytes{0};
105
107 [[nodiscard]] double usage_percent() const noexcept {
108 if (total_bytes == 0) {
109 return 0.0;
110 }
111 return static_cast<double>(used_bytes) / static_cast<double>(total_bytes) *
112 100.0;
113 }
114
116 std::optional<std::string> error_message;
117};
118
125 std::uint32_t active_associations{0};
126
128 std::uint32_t max_associations{100};
129
131 std::uint64_t total_associations{0};
132
134 std::uint64_t failed_associations{0};
135};
136
143 std::uint64_t total_instances{0};
144
146 std::uint64_t total_studies{0};
147
149 std::uint64_t total_series{0};
150
152 std::uint64_t successful_stores{0};
153
155 std::uint64_t failed_stores{0};
156};
157
164 std::uint16_t major{1};
165
167 std::uint16_t minor{0};
168
170 std::uint16_t patch{0};
171
173 std::string build_id;
174
176 std::chrono::system_clock::time_point startup_time{
177 std::chrono::system_clock::now()};
178
180 [[nodiscard]] std::chrono::seconds uptime() const noexcept {
181 return std::chrono::duration_cast<std::chrono::seconds>(
182 std::chrono::system_clock::now() - startup_time);
183 }
184
186 [[nodiscard]] std::string version_string() const {
187 return std::to_string(major) + "." + std::to_string(minor) + "." +
188 std::to_string(patch);
189 }
190};
191
216
218 std::chrono::system_clock::time_point timestamp{
219 std::chrono::system_clock::now()};
220
223
226
229
232
235
237 std::optional<std::string> message;
238
247 void update_level() noexcept {
248 if (!database.connected) {
250 return;
251 }
252
253 if (!storage.writable || !storage.readable) {
255 return;
256 }
257
258 // Check for degraded conditions
259 if (storage.usage_percent() > 90.0) {
261 return;
262 }
263
267 return;
268 }
269
271 }
272
277 [[nodiscard]] bool is_healthy() const noexcept {
279 }
280
285 [[nodiscard]] bool is_operational() const noexcept {
287 }
288};
289
290} // namespace kcenon::pacs::monitoring
constexpr std::string_view to_string(health_level level) noexcept
Convert health level to string representation.
health_level
Overall health level indicator.
@ healthy
All components healthy, system fully operational.
@ degraded
Some non-critical components degraded, system operational.
@ unhealthy
Critical components failing, system may not function correctly.
std::uint32_t active_associations
Number of currently active associations.
std::uint64_t failed_associations
Number of failed associations.
std::uint32_t max_associations
Maximum concurrent associations allowed.
std::uint64_t total_associations
Total associations since server start.
Database connection health information.
std::optional< std::chrono::milliseconds > response_time
Database response time in milliseconds.
std::optional< std::string > error_message
Error message if connection failed.
bool connected
Whether database connection is active.
std::optional< std::chrono::system_clock::time_point > last_connected
Last successful connection timestamp.
std::uint32_t active_connections
Number of active database connections.
Comprehensive health status of the PACS system.
void update_level() noexcept
Calculate overall health level from component status.
storage_status storage
Storage subsystem status.
version_info version
Version and uptime information.
health_level level
Overall health level.
std::optional< std::string > message
Optional human-readable status message.
bool is_operational() const noexcept
Check if the system is at least operational.
database_status database
Database connection status.
std::chrono::system_clock::time_point timestamp
Timestamp of this health check.
bool is_healthy() const noexcept
Check if the system is healthy.
association_metrics associations
DICOM association metrics.
storage_metrics metrics
Storage operation metrics.
DICOM storage operation statistics.
std::uint64_t successful_stores
Successful C-STORE operations.
std::uint64_t total_instances
Total DICOM instances stored.
std::uint64_t total_studies
Total studies in the archive.
std::uint64_t failed_stores
Failed C-STORE operations.
std::uint64_t total_series
Total series in the archive.
Storage subsystem health information.
bool writable
Whether storage is writable.
std::optional< std::string > error_message
Error message if storage check failed.
double usage_percent() const noexcept
Storage usage percentage (0-100)
std::uint64_t used_bytes
Used storage space in bytes.
std::uint64_t available_bytes
Available storage space in bytes.
bool readable
Whether storage is readable.
std::uint64_t total_bytes
Total storage capacity in bytes.
PACS system version information.
std::chrono::system_clock::time_point startup_time
Server startup timestamp.
std::string build_id
Build identifier (e.g., git commit hash)
std::uint16_t major
Major version number.
std::string version_string() const
Get version as string (e.g., "1.0.0")
std::chrono::seconds uptime() const noexcept
Calculate uptime duration.
std::uint16_t patch
Patch version number.
std::uint16_t minor
Minor version number.