22
33namespace App \Services ;
44
5+ use App \Enums \ResultStatus ;
56use App \Models \Result ;
67use App \Settings \DataIntegrationSettings ;
78use Illuminate \Support \Facades \Cache ;
@@ -44,6 +45,21 @@ protected function registerMetrics(CollectorRegistry $registry, Result $result):
4445 $ labelNames = array_keys ($ labels );
4546 $ labelValues = array_values ($ labels );
4647
48+ // Info metric - always exported so users can see test status (including failures)
49+ $ infoGauge = $ registry ->getOrRegisterGauge (
50+ 'speedtest_tracker ' ,
51+ 'result_id ' ,
52+ 'Speedtest result id ' ,
53+ $ labelNames
54+ );
55+ $ infoGauge ->set ($ result ->id , $ labelValues );
56+
57+ // Only export numeric metrics for completed tests
58+ // Failed/incomplete tests won't have valid measurements
59+ if ($ result ->status !== ResultStatus::Completed) {
60+ return ;
61+ }
62+
4763 // Download speed in bytes
4864 $ downloadBytesGauge = $ registry ->getOrRegisterGauge (
4965 'speedtest_tracker ' ,
@@ -96,7 +112,7 @@ protected function registerMetrics(CollectorRegistry $registry, Result $result):
96112 'Ping jitter in milliseconds ' ,
97113 $ labelNames
98114 );
99- $ pingJitterGauge ->set ($ result ->ping_jitter ?? 0 , $ labelValues );
115+ $ pingJitterGauge ->set ($ result ->ping_jitter , $ labelValues );
100116
101117 // Download jitter
102118 $ downloadJitterGauge = $ registry ->getOrRegisterGauge (
@@ -105,7 +121,7 @@ protected function registerMetrics(CollectorRegistry $registry, Result $result):
105121 'Download jitter in milliseconds ' ,
106122 $ labelNames
107123 );
108- $ downloadJitterGauge ->set ($ result ->download_jitter ?? 0 , $ labelValues );
124+ $ downloadJitterGauge ->set ($ result ->download_jitter , $ labelValues );
109125
110126 // Upload jitter
111127 $ uploadJitterGauge = $ registry ->getOrRegisterGauge (
@@ -114,7 +130,7 @@ protected function registerMetrics(CollectorRegistry $registry, Result $result):
114130 'Upload jitter in milliseconds ' ,
115131 $ labelNames
116132 );
117- $ uploadJitterGauge ->set ($ result ->upload_jitter ?? 0 , $ labelValues );
133+ $ uploadJitterGauge ->set ($ result ->upload_jitter , $ labelValues );
118134
119135 // Packet loss
120136 $ packetLossGauge = $ registry ->getOrRegisterGauge (
@@ -123,7 +139,7 @@ protected function registerMetrics(CollectorRegistry $registry, Result $result):
123139 'Packet loss percentage ' ,
124140 $ labelNames
125141 );
126- $ packetLossGauge ->set ($ result ->packet_loss ?? 0 , $ labelValues );
142+ $ packetLossGauge ->set ($ result ->packet_loss , $ labelValues );
127143
128144 // Ping latency low/high
129145 $ pingLowGauge = $ registry ->getOrRegisterGauge (
@@ -132,15 +148,15 @@ protected function registerMetrics(CollectorRegistry $registry, Result $result):
132148 'Ping low latency in milliseconds ' ,
133149 $ labelNames
134150 );
135- $ pingLowGauge ->set ($ result ->ping_low ?? 0 , $ labelValues );
151+ $ pingLowGauge ->set ($ result ->ping_low , $ labelValues );
136152
137153 $ pingHighGauge = $ registry ->getOrRegisterGauge (
138154 'speedtest_tracker ' ,
139155 'ping_high_ms ' ,
140156 'Ping high latency in milliseconds ' ,
141157 $ labelNames
142158 );
143- $ pingHighGauge ->set ($ result ->ping_high ?? 0 , $ labelValues );
159+ $ pingHighGauge ->set ($ result ->ping_high , $ labelValues );
144160
145161 // Download latency metrics (IQM = Interquartile Mean - more reliable than average)
146162 $ downloadLatencyIqmGauge = $ registry ->getOrRegisterGauge (
@@ -149,23 +165,23 @@ protected function registerMetrics(CollectorRegistry $registry, Result $result):
149165 'Download latency interquartile mean in milliseconds ' ,
150166 $ labelNames
151167 );
152- $ downloadLatencyIqmGauge ->set ($ result ->downloadlatencyiqm ?? 0 , $ labelValues );
168+ $ downloadLatencyIqmGauge ->set ($ result ->downloadlatencyiqm , $ labelValues );
153169
154170 $ downloadLatencyLowGauge = $ registry ->getOrRegisterGauge (
155171 'speedtest_tracker ' ,
156172 'download_latency_low_ms ' ,
157173 'Download latency low in milliseconds ' ,
158174 $ labelNames
159175 );
160- $ downloadLatencyLowGauge ->set ($ result ->downloadlatency_low ?? 0 , $ labelValues );
176+ $ downloadLatencyLowGauge ->set ($ result ->downloadlatency_low , $ labelValues );
161177
162178 $ downloadLatencyHighGauge = $ registry ->getOrRegisterGauge (
163179 'speedtest_tracker ' ,
164180 'download_latency_high_ms ' ,
165181 'Download latency high in milliseconds ' ,
166182 $ labelNames
167183 );
168- $ downloadLatencyHighGauge ->set ($ result ->downloadlatency_high ?? 0 , $ labelValues );
184+ $ downloadLatencyHighGauge ->set ($ result ->downloadlatency_high , $ labelValues );
169185
170186 // Upload latency metrics
171187 $ uploadLatencyIqmGauge = $ registry ->getOrRegisterGauge (
@@ -174,23 +190,23 @@ protected function registerMetrics(CollectorRegistry $registry, Result $result):
174190 'Upload latency interquartile mean in milliseconds ' ,
175191 $ labelNames
176192 );
177- $ uploadLatencyIqmGauge ->set ($ result ->uploadlatencyiqm ?? 0 , $ labelValues );
193+ $ uploadLatencyIqmGauge ->set ($ result ->uploadlatencyiqm , $ labelValues );
178194
179195 $ uploadLatencyLowGauge = $ registry ->getOrRegisterGauge (
180196 'speedtest_tracker ' ,
181197 'upload_latency_low_ms ' ,
182198 'Upload latency low in milliseconds ' ,
183199 $ labelNames
184200 );
185- $ uploadLatencyLowGauge ->set ($ result ->uploadlatency_low ?? 0 , $ labelValues );
201+ $ uploadLatencyLowGauge ->set ($ result ->uploadlatency_low , $ labelValues );
186202
187203 $ uploadLatencyHighGauge = $ registry ->getOrRegisterGauge (
188204 'speedtest_tracker ' ,
189205 'upload_latency_high_ms ' ,
190206 'Upload latency high in milliseconds ' ,
191207 $ labelNames
192208 );
193- $ uploadLatencyHighGauge ->set ($ result ->uploadlatency_high ?? 0 , $ labelValues );
209+ $ uploadLatencyHighGauge ->set ($ result ->uploadlatency_high , $ labelValues );
194210
195211 // Bytes transferred during test
196212 $ downloadedBytesGauge = $ registry ->getOrRegisterGauge (
@@ -199,15 +215,15 @@ protected function registerMetrics(CollectorRegistry $registry, Result $result):
199215 'Total bytes downloaded during test ' ,
200216 $ labelNames
201217 );
202- $ downloadedBytesGauge ->set ($ result ->downloaded_bytes ?? 0 , $ labelValues );
218+ $ downloadedBytesGauge ->set ($ result ->downloaded_bytes , $ labelValues );
203219
204220 $ uploadedBytesGauge = $ registry ->getOrRegisterGauge (
205221 'speedtest_tracker ' ,
206222 'uploaded_bytes ' ,
207223 'Total bytes uploaded during test ' ,
208224 $ labelNames
209225 );
210- $ uploadedBytesGauge ->set ($ result ->uploaded_bytes ?? 0 , $ labelValues );
226+ $ uploadedBytesGauge ->set ($ result ->uploaded_bytes , $ labelValues );
211227
212228 // Test duration
213229 $ downloadElapsedGauge = $ registry ->getOrRegisterGauge (
@@ -216,15 +232,15 @@ protected function registerMetrics(CollectorRegistry $registry, Result $result):
216232 'Download test duration in milliseconds ' ,
217233 $ labelNames
218234 );
219- $ downloadElapsedGauge ->set ($ result ->download_elapsed ?? 0 , $ labelValues );
235+ $ downloadElapsedGauge ->set ($ result ->download_elapsed , $ labelValues );
220236
221237 $ uploadElapsedGauge = $ registry ->getOrRegisterGauge (
222238 'speedtest_tracker ' ,
223239 'upload_elapsed_ms ' ,
224240 'Upload test duration in milliseconds ' ,
225241 $ labelNames
226242 );
227- $ uploadElapsedGauge ->set ($ result ->upload_elapsed ?? 0 , $ labelValues );
243+ $ uploadElapsedGauge ->set ($ result ->upload_elapsed , $ labelValues );
228244 }
229245
230246 protected function buildLabels (Result $ result ): array
0 commit comments