(
self,
thread_ids: Sequence[int] | None = None,
function_ids: Sequence[int] | None = None,
start_ms: int | None = None,
end_ms: int | None = None,
metric: str = "malloc",
scope: str = "inclusive",
split: str = "auto",
resolution: int | None = None,
)
| 842 | return items |
| 843 | |
| 844 | def query_series( |
| 845 | self, |
| 846 | thread_ids: Sequence[int] | None = None, |
| 847 | function_ids: Sequence[int] | None = None, |
| 848 | start_ms: int | None = None, |
| 849 | end_ms: int | None = None, |
| 850 | metric: str = "malloc", |
| 851 | scope: str = "inclusive", |
| 852 | split: str = "auto", |
| 853 | resolution: int | None = None, |
| 854 | ) -> SeriesResponse: |
| 855 | metric = _normalize_metric_name(metric) |
| 856 | start_tick, end_tick = self._normalize_window(start_ms, end_ms) |
| 857 | selected_threads = self._normalize_thread_ids(thread_ids) |
| 858 | selected_functions = self._normalize_function_ids(function_ids) |
| 859 | selected_threads = self._narrow_thread_ids_by_functions(selected_threads, selected_functions) |
| 860 | split_mode = self._infer_split(split, selected_threads, selected_functions) |
| 861 | leaf_match_lookup = self._build_leaf_match_lookup(selected_functions, scope) |
| 862 | leaf_filter = frozenset(leaf_match_lookup) if leaf_match_lookup else None |
| 863 | |
| 864 | if end_tick < start_tick: |
| 865 | end_tick = start_tick |
| 866 | tick_count = ((end_tick - start_tick) // self.reader.sample_interval_ms) + 1 if self.reader.sample_interval_ms else 1 |
| 867 | ticks = [start_tick + index * self.reader.sample_interval_ms for index in range(tick_count)] |
| 868 | raw_metric = "net" if metric == "live" else metric |
| 869 | |
| 870 | accumulator: dict[tuple[Any, ...], list[float]] = {} |
| 871 | baselines: dict[tuple[Any, ...], float] = defaultdict(float) |
| 872 | |
| 873 | if metric == "live" and start_tick > self.reader.default_start_tick(): |
| 874 | for _tick_ms, thread_id, leaf_node_id, malloc_bytes, free_bytes in self._iter_records( |
| 875 | self.reader.default_start_tick(), |
| 876 | start_tick - self.reader.sample_interval_ms, |
| 877 | selected_threads, |
| 878 | leaf_filter=leaf_filter, |
| 879 | ): |
| 880 | keys = self._series_keys( |
| 881 | thread_id, |
| 882 | leaf_node_id, |
| 883 | selected_functions, |
| 884 | split_mode, |
| 885 | leaf_match_lookup, |
| 886 | ) |
| 887 | if not keys: |
| 888 | continue |
| 889 | delta = float(malloc_bytes - free_bytes) |
| 890 | for key in keys: |
| 891 | baselines[key] += delta |
| 892 | |
| 893 | for tick_ms, thread_id, leaf_node_id, malloc_bytes, free_bytes in self._iter_records( |
| 894 | start_tick, end_tick, selected_threads, leaf_filter=leaf_filter |
| 895 | ): |
| 896 | keys = self._series_keys( |
| 897 | thread_id, |
| 898 | leaf_node_id, |
| 899 | selected_functions, |
| 900 | split_mode, |
| 901 | leaf_match_lookup, |
no test coverage detected