| 248 | g_params.max_latency_bkt = g_params.min_latency_bkt + 11 |
| 249 | |
| 250 | def compute_deltas(self, previous: 'LatencyRecord') -> None: |
| 251 | # timestamp delta (usec); convert to seconds for rates |
| 252 | self.delta_time = self.data.get('timestamp', 0) - previous.data.get('timestamp', 0) |
| 253 | time_factor = self.delta_time / 1e6 if self.delta_time > 0 else 1.0 |
| 254 | |
| 255 | for bucket in list(self.data.keys()): |
| 256 | if bucket == 'timestamp': |
| 257 | continue |
| 258 | |
| 259 | write_bucket = bucket |
| 260 | if bucket > g_params.max_latency_bkt: |
| 261 | write_bucket = g_params.max_latency_bkt |
| 262 | if bucket < g_params.min_latency_bkt: |
| 263 | write_bucket = g_params.min_latency_bkt |
| 264 | |
| 265 | delta_count = self.data.get(bucket, 0) - previous.data.get(bucket, 0) |
| 266 | # Frequency: events per second |
| 267 | self.frequency_histogram[write_bucket] += (delta_count / time_factor) |
| 268 | |
| 269 | # Intensity: approximate time waited per second |
| 270 | # Oracle histograms bucket differently vs BPF/SystemTap/DTrace (factor-of-2 difference). |
| 271 | # Oracle: ~ 3/4 * bucket_value * waits; ST/DTrace: ~ 3/2 * bucket_value * waits |
| 272 | if self.data_source == 'oracle': |
| 273 | self.intensity_histogram[write_bucket] += (0.75 * delta_count * (2 ** bucket)) / time_factor |
| 274 | elif self.data_source in ('bpf', 'systemtap', 'dtrace'): |
| 275 | self.intensity_histogram[write_bucket] += (1.5 * delta_count * (2 ** bucket)) / time_factor |
| 276 | else: |
| 277 | raise ValueError("Invalid datasource. Use one of: bpf, systemtap, dtrace, oracle.") |
| 278 | |
| 279 | self.max_frequency = max(self.frequency_histogram[g_params.min_latency_bkt:g_params.max_latency_bkt + 1]) |
| 280 | self.sum_frequency = sum(self.frequency_histogram[g_params.min_latency_bkt:g_params.max_latency_bkt + 1]) |
| 281 | self.max_intensity = max(self.intensity_histogram[g_params.min_latency_bkt:g_params.max_latency_bkt + 1]) |
| 282 | self.sum_intensity = sum(self.intensity_histogram[g_params.min_latency_bkt:g_params.max_latency_bkt + 1]) |
| 283 | |
| 284 | |
| 285 | class ArrayOfLatencyRecords: |