micromegas 0.1.3__tar.gz → 0.1.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {micromegas-0.1.3 → micromegas-0.1.6}/PKG-INFO +1 -1
- micromegas-0.1.6/micromegas/__init__.py +10 -0
- micromegas-0.1.6/micromegas/client.py +182 -0
- micromegas-0.1.6/micromegas/perfetto.py +205 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/request.py +16 -0
- micromegas-0.1.6/micromegas/time.py +30 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/pyproject.toml +1 -1
- micromegas-0.1.3/micromegas/__init__.py +0 -4
- micromegas-0.1.3/micromegas/client.py +0 -92
- micromegas-0.1.3/micromegas/perfetto.py +0 -64
- {micromegas-0.1.3 → micromegas-0.1.6}/README.md +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/common/android_energy_consumer_descriptor_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/common/android_log_constants_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/common/builtin_clock_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/common/descriptor_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/common/gpu_counter_descriptor_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/common/perf_events_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/common/protolog_common_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/common/sys_stats_counters_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/common/trace_stats_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/android_game_intervention_list_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/android_input_event_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/android_log_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/android_polled_state_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/android_sdk_sysprop_guard_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/android_system_property_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/network_trace_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/packages_list_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/pixel_modem_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/protolog_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/surfaceflinger_layers_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/surfaceflinger_transactions_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/chrome/chrome_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/chrome/v8_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/data_source_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/etw/etw_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/ftrace/ftrace_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/gpu/gpu_counter_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/gpu/vulkan_memory_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/inode_file/inode_file_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/interceptor_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/interceptors/console_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/power/android_power_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/process_stats/process_stats_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/profiling/heapprofd_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/profiling/java_hprof_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/profiling/perf_event_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/statsd/atom_ids_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/statsd/statsd_tracing_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/sys_stats/sys_stats_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/system_info/system_info_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/test_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/trace_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/config/track_event/track_event_config_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/android_game_intervention_list_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/android_log_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/android_system_property_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/camera_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/frame_timeline_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/gpu_mem_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/graphics/rect_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/graphics_frame_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/initial_display_state_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/network_trace_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/packages_list_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/pixel_modem_events_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/protolog_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/shell_transition_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/surfaceflinger_common_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/surfaceflinger_layers_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/surfaceflinger_transactions_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/winscope_extensions_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/chrome/chrome_benchmark_metadata_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/chrome/chrome_metadata_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/chrome/chrome_trace_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/chrome/chrome_trigger_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/chrome/v8_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/clock_snapshot_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/etw/etw_event_bundle_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/etw/etw_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/etw/etw_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/extension_descriptor_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/filesystem/inode_file_map_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/android_fs_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/binder_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/block_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/cgroup_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/clk_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/cma_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/compaction_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/cpuhp_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/cros_ec_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/dcvsh_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/dma_fence_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/dmabuf_heap_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/dpu_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/drm_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ext4_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/f2fs_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/fastrpc_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/fence_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/filemap_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ftrace_event_bundle_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ftrace_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ftrace_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ftrace_stats_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/g2d_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/generic_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/google_icc_trace_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/google_irm_trace_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/gpu_mem_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/gpu_scheduler_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/hyp_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/i2c_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ion_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ipi_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/irq_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/kgsl_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/kmem_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/kvm_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/lowmemorykiller_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/lwis_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/mali_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/mdss_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/mm_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/net_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/oom_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/panel_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/perf_trace_counters_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/power_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/printk_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/raw_syscalls_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/regulator_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/rpm_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/samsung_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/sched_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/scm_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/sde_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/signal_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/skb_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/sock_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/sync_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/synthetic_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/systrace_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/task_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/tcp_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/thermal_exynos_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/thermal_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/trusty_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ufs_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/v4l2_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/virtio_gpu_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/virtio_video_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/vmscan_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/workqueue_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/gpu/gpu_counter_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/gpu/gpu_log_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/gpu/gpu_render_stage_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/gpu/vulkan_api_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/gpu/vulkan_memory_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/interned_data/interned_data_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/memory_graph_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/perfetto/perfetto_metatrace_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/perfetto/tracing_service_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/power/android_energy_estimation_breakdown_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/power/android_entity_state_residency_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/power/battery_counters_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/power/power_rails_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/profiling/deobfuscation_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/profiling/heap_graph_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/profiling/profile_common_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/profiling/profile_packet_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/profiling/smaps_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ps/process_stats_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ps/process_tree_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/remote_clock_sync_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/statsd/statsd_atom_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/sys_stats/sys_stats_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/system_info/cpu_info_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/system_info_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/test_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/trace_packet_defaults_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/trace_packet_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/trace_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/trace_uuid_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_active_processes_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_application_state_info_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_compositor_scheduler_state_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_content_settings_event_info_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_frame_reporter_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_histogram_sample_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_keyed_service_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_latency_info_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_legacy_ipc_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_message_pump_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_mojo_event_info_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_process_descriptor_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_renderer_scheduler_state_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_thread_descriptor_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_user_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_window_handle_event_info_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/counter_descriptor_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/debug_annotation_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/log_message_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/pixel_modem_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/process_descriptor_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/range_of_interest_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/screenshot_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/source_location_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/task_execution_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/thread_descriptor_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/track_descriptor_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/track_event_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/translation/translation_table_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/trigger_pb2.py +0 -0
- {micromegas-0.1.3 → micromegas-0.1.6}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ui_state_pb2.py +0 -0
@@ -0,0 +1,182 @@
|
|
1
|
+
from . import request
|
2
|
+
from . import time
|
3
|
+
import cbor2
|
4
|
+
|
5
|
+
|
6
|
+
class Client:
|
7
|
+
def __init__(self, base_url, headers={}):
|
8
|
+
self.analytics_base_url = base_url + "analytics/"
|
9
|
+
self.headers = headers
|
10
|
+
|
11
|
+
def find_process(self, process_id):
|
12
|
+
return request.request(
|
13
|
+
self.analytics_base_url + "find_process",
|
14
|
+
{"process_id": process_id},
|
15
|
+
headers=self.headers,
|
16
|
+
)
|
17
|
+
|
18
|
+
def query_processes(self, begin, end, limit):
|
19
|
+
return request.request(
|
20
|
+
self.analytics_base_url + "query_processes",
|
21
|
+
{
|
22
|
+
"begin": time.format_datetime(begin),
|
23
|
+
"end": time.format_datetime(end),
|
24
|
+
"limit": limit,
|
25
|
+
},
|
26
|
+
headers=self.headers,
|
27
|
+
)
|
28
|
+
|
29
|
+
def query_streams(self, begin, end, limit, process_id=None, tag_filter=None):
|
30
|
+
args = {
|
31
|
+
"begin": time.format_datetime(begin),
|
32
|
+
"end": time.format_datetime(end),
|
33
|
+
"limit": limit,
|
34
|
+
"process_id": process_id,
|
35
|
+
"tag_filter": tag_filter,
|
36
|
+
}
|
37
|
+
|
38
|
+
return request.request(
|
39
|
+
self.analytics_base_url + "query_streams",
|
40
|
+
args,
|
41
|
+
headers=self.headers,
|
42
|
+
)
|
43
|
+
|
44
|
+
def query_blocks(self, begin, end, limit, stream_id):
|
45
|
+
args = {
|
46
|
+
"begin": time.format_datetime(begin),
|
47
|
+
"end": time.format_datetime(end),
|
48
|
+
"limit": limit,
|
49
|
+
"stream_id": stream_id,
|
50
|
+
}
|
51
|
+
|
52
|
+
return request.request(
|
53
|
+
self.analytics_base_url + "query_blocks",
|
54
|
+
args,
|
55
|
+
headers=self.headers,
|
56
|
+
)
|
57
|
+
|
58
|
+
def query_spans(self, begin, end, limit, stream_id):
|
59
|
+
return request.request(
|
60
|
+
self.analytics_base_url + "query_spans",
|
61
|
+
{
|
62
|
+
"begin": time.format_datetime(begin),
|
63
|
+
"end": time.format_datetime(end),
|
64
|
+
"limit": limit,
|
65
|
+
"stream_id": stream_id,
|
66
|
+
},
|
67
|
+
headers=self.headers,
|
68
|
+
)
|
69
|
+
|
70
|
+
def query_thread_events(self, begin, end, limit, stream_id):
|
71
|
+
return request.request(
|
72
|
+
self.analytics_base_url + "query_thread_events",
|
73
|
+
{
|
74
|
+
"begin": time.format_datetime(begin),
|
75
|
+
"end": time.format_datetime(end),
|
76
|
+
"limit": limit,
|
77
|
+
"stream_id": stream_id,
|
78
|
+
},
|
79
|
+
headers=self.headers,
|
80
|
+
)
|
81
|
+
|
82
|
+
def query_log_entries(
|
83
|
+
self,
|
84
|
+
begin,
|
85
|
+
end,
|
86
|
+
limit=None, # Necessary if stream_id is specified, ignored otherwise
|
87
|
+
stream_id=None, # If none, query is run on cached lakehouse using query engine
|
88
|
+
sql=None, # Necessary if stream_id is None, ignored otherwise
|
89
|
+
):
|
90
|
+
return request.request(
|
91
|
+
self.analytics_base_url + "query_log_entries",
|
92
|
+
{
|
93
|
+
"begin": time.format_datetime(begin),
|
94
|
+
"end": time.format_datetime(end),
|
95
|
+
"limit": limit,
|
96
|
+
"stream_id": stream_id,
|
97
|
+
"sql": sql,
|
98
|
+
},
|
99
|
+
headers=self.headers,
|
100
|
+
)
|
101
|
+
|
102
|
+
def query_metrics(self, begin, end, limit=None, stream_id=None, sql=None):
|
103
|
+
return request.request(
|
104
|
+
self.analytics_base_url + "query_metrics",
|
105
|
+
{
|
106
|
+
"begin": time.format_datetime(begin),
|
107
|
+
"end": time.format_datetime(end),
|
108
|
+
"limit": limit,
|
109
|
+
"stream_id": stream_id,
|
110
|
+
"sql": sql,
|
111
|
+
},
|
112
|
+
headers=self.headers,
|
113
|
+
)
|
114
|
+
|
115
|
+
def query_view(self, view_set_name, view_instance_id, begin, end, sql):
|
116
|
+
return request.request(
|
117
|
+
self.analytics_base_url + "query_view",
|
118
|
+
{
|
119
|
+
"view_set_name": view_set_name,
|
120
|
+
"view_instance_id": view_instance_id,
|
121
|
+
"begin": time.format_datetime(begin),
|
122
|
+
"end": time.format_datetime(end),
|
123
|
+
"sql": sql,
|
124
|
+
},
|
125
|
+
headers=self.headers,
|
126
|
+
)
|
127
|
+
|
128
|
+
def query_partitions(self):
|
129
|
+
args = {}
|
130
|
+
return request.request(
|
131
|
+
self.analytics_base_url + "query_partitions",
|
132
|
+
args,
|
133
|
+
headers=self.headers,
|
134
|
+
)
|
135
|
+
|
136
|
+
def __stream_request(self, endpoint, args):
|
137
|
+
response = request.streamed_request(
|
138
|
+
self.analytics_base_url + endpoint,
|
139
|
+
args,
|
140
|
+
headers=self.headers,
|
141
|
+
)
|
142
|
+
while response.raw.readable():
|
143
|
+
try:
|
144
|
+
print(cbor2.load(response.raw))
|
145
|
+
except cbor2.CBORDecodeEOF:
|
146
|
+
break
|
147
|
+
|
148
|
+
def create_or_update_partitions(
|
149
|
+
self, view_set_name, view_instance_id, begin, end, partition_delta_seconds
|
150
|
+
):
|
151
|
+
args = {
|
152
|
+
"view_set_name": view_set_name,
|
153
|
+
"view_instance_id": view_instance_id,
|
154
|
+
"begin": time.format_datetime(begin),
|
155
|
+
"end": time.format_datetime(end),
|
156
|
+
"partition_delta_seconds": partition_delta_seconds,
|
157
|
+
}
|
158
|
+
self.__stream_request("create_or_update_partitions", args)
|
159
|
+
|
160
|
+
def merge_partitions(
|
161
|
+
self, view_set_name, view_instance_id, begin, end, partition_delta_seconds
|
162
|
+
):
|
163
|
+
args = {
|
164
|
+
"view_set_name": view_set_name,
|
165
|
+
"view_instance_id": view_instance_id,
|
166
|
+
"begin": time.format_datetime(begin),
|
167
|
+
"end": time.format_datetime(end),
|
168
|
+
"partition_delta_seconds": partition_delta_seconds,
|
169
|
+
}
|
170
|
+
self.__stream_request("merge_partitions", args)
|
171
|
+
|
172
|
+
def retire_partitions(
|
173
|
+
self, view_set_name, view_instance_id, begin, end, partition_delta_seconds
|
174
|
+
):
|
175
|
+
args = {
|
176
|
+
"view_set_name": view_set_name,
|
177
|
+
"view_instance_id": view_instance_id,
|
178
|
+
"begin": time.format_datetime(begin),
|
179
|
+
"end": time.format_datetime(end),
|
180
|
+
"partition_delta_seconds": partition_delta_seconds,
|
181
|
+
}
|
182
|
+
self.__stream_request("retire_partitions", args)
|
@@ -0,0 +1,205 @@
|
|
1
|
+
import crc
|
2
|
+
from tqdm import tqdm
|
3
|
+
|
4
|
+
|
5
|
+
# hack to allow perfetto proto imports
|
6
|
+
# you can then import the protos like this: from protos.perfetto.trace import trace_pb2
|
7
|
+
def load_perfetto_protos():
|
8
|
+
import sys
|
9
|
+
import pathlib
|
10
|
+
|
11
|
+
perfetto_folder = pathlib.Path(__file__).parent.absolute() / "thirdparty/perfetto"
|
12
|
+
sys.path.append(str(perfetto_folder))
|
13
|
+
|
14
|
+
|
15
|
+
def crc64_str(s):
|
16
|
+
calculator = crc.Calculator(crc.Crc64.CRC64)
|
17
|
+
return calculator.checksum(str.encode(s))
|
18
|
+
|
19
|
+
|
20
|
+
def generate_batches(df_blocks):
|
21
|
+
nb_events_threshold = 1024 * 1024
|
22
|
+
begin = df_blocks.iloc[0]["begin_time"]
|
23
|
+
end = df_blocks.iloc[0]["end_time"]
|
24
|
+
nb_events = 0
|
25
|
+
for index, block in df_blocks.iterrows():
|
26
|
+
nb_events += block["nb_objects"]
|
27
|
+
end = block["end_time"]
|
28
|
+
if nb_events > nb_events_threshold:
|
29
|
+
yield (begin, end, nb_events)
|
30
|
+
begin = block["end_time"]
|
31
|
+
nb_events = 0
|
32
|
+
if nb_events > 0:
|
33
|
+
yield (begin, end, nb_events)
|
34
|
+
|
35
|
+
|
36
|
+
class Writer:
|
37
|
+
"""
|
38
|
+
Fetches thread events from the analytics server and formats them in the perfetto format.
|
39
|
+
Traces can be viewed using https://ui.perfetto.dev/
|
40
|
+
"""
|
41
|
+
|
42
|
+
def __init__(self, client, process_id, exe):
|
43
|
+
load_perfetto_protos()
|
44
|
+
from protos.perfetto.trace import trace_pb2, trace_packet_pb2
|
45
|
+
|
46
|
+
self.names = {}
|
47
|
+
self.categories = {}
|
48
|
+
self.source_locations = {}
|
49
|
+
self.first = True
|
50
|
+
self.client = client
|
51
|
+
self.trace = trace_pb2.Trace()
|
52
|
+
self.packets = self.trace.packet
|
53
|
+
self.process_uuid = crc64_str(process_id)
|
54
|
+
|
55
|
+
packet = trace_packet_pb2.TracePacket()
|
56
|
+
packet.track_descriptor.uuid = self.process_uuid
|
57
|
+
packet.track_descriptor.process.pid = 1
|
58
|
+
packet.track_descriptor.process.process_name = exe
|
59
|
+
self.packets.append(packet)
|
60
|
+
|
61
|
+
def get_name_iid(self, name):
|
62
|
+
iid = self.names.get(name)
|
63
|
+
is_new = False
|
64
|
+
if iid is None:
|
65
|
+
is_new = True
|
66
|
+
iid = len(self.names) + 1
|
67
|
+
self.names[name] = iid
|
68
|
+
return iid, is_new
|
69
|
+
|
70
|
+
def get_category_iid(self, cat):
|
71
|
+
iid = self.categories.get(cat)
|
72
|
+
is_new = False
|
73
|
+
if iid is None:
|
74
|
+
is_new = True
|
75
|
+
iid = len(self.categories) + 1
|
76
|
+
self.categories[cat] = iid
|
77
|
+
return iid, is_new
|
78
|
+
|
79
|
+
def get_location_iid(self, loc):
|
80
|
+
iid = self.source_locations.get(loc)
|
81
|
+
is_new = False
|
82
|
+
if iid is None:
|
83
|
+
is_new = True
|
84
|
+
iid = len(self.source_locations) + 1
|
85
|
+
self.source_locations[loc] = iid
|
86
|
+
return iid, is_new
|
87
|
+
|
88
|
+
def append_thread(self, stream_id, thread_name, thread_id):
|
89
|
+
from protos.perfetto.trace import trace_pb2, trace_packet_pb2, track_event
|
90
|
+
|
91
|
+
df_blocks = self.client.query_blocks(
|
92
|
+
begin=None, end=None, limit=100_000, stream_id=stream_id
|
93
|
+
)
|
94
|
+
if df_blocks.empty:
|
95
|
+
return
|
96
|
+
|
97
|
+
packet = trace_packet_pb2.TracePacket()
|
98
|
+
thread_uuid = crc64_str(stream_id)
|
99
|
+
packet.track_descriptor.uuid = thread_uuid
|
100
|
+
packet.track_descriptor.parent_uuid = self.process_uuid
|
101
|
+
packet.track_descriptor.thread.pid = 1
|
102
|
+
packet.track_descriptor.thread.tid = thread_id
|
103
|
+
packet.track_descriptor.thread.thread_name = thread_name
|
104
|
+
self.packets.append(packet)
|
105
|
+
trusted_packet_sequence_id = 1
|
106
|
+
|
107
|
+
batches = list(generate_batches(df_blocks))
|
108
|
+
for begin, end, limit in tqdm(batches, unit="event batches"):
|
109
|
+
df_spans = self.client.query_spans(
|
110
|
+
begin, end, limit=limit, stream_id=stream_id
|
111
|
+
)
|
112
|
+
begin_ns = df_spans["begin"].astype("int64")
|
113
|
+
end_ns = df_spans["end"].astype("int64")
|
114
|
+
for index, span in df_spans.iterrows():
|
115
|
+
packet = trace_packet_pb2.TracePacket()
|
116
|
+
packet.timestamp = begin_ns[index]
|
117
|
+
packet.track_event.type = (
|
118
|
+
track_event.track_event_pb2.TrackEvent.Type.TYPE_SLICE_BEGIN
|
119
|
+
)
|
120
|
+
packet.track_event.track_uuid = thread_uuid
|
121
|
+
span_name = span["name"]
|
122
|
+
name_iid, new_name = self.get_name_iid(span_name)
|
123
|
+
packet.track_event.name_iid = name_iid
|
124
|
+
category_iid, new_category = self.get_category_iid(span["target"])
|
125
|
+
packet.track_event.category_iids.append(category_iid)
|
126
|
+
|
127
|
+
source_location = (span["filename"], span["line"])
|
128
|
+
source_location_iid, new_source_location = self.get_location_iid(source_location)
|
129
|
+
packet.track_event.source_location_iid = source_location_iid
|
130
|
+
if self.first:
|
131
|
+
# this is necessary for interning to work
|
132
|
+
self.first = False
|
133
|
+
packet.first_packet_on_sequence = True
|
134
|
+
packet.sequence_flags = 3
|
135
|
+
else:
|
136
|
+
packet.sequence_flags = 2
|
137
|
+
|
138
|
+
if new_name:
|
139
|
+
event_name = packet.interned_data.event_names.add()
|
140
|
+
event_name.iid = name_iid
|
141
|
+
event_name.name = span_name
|
142
|
+
if new_category:
|
143
|
+
cat_name = packet.interned_data.event_categories.add()
|
144
|
+
cat_name.iid = category_iid
|
145
|
+
cat_name.name = span["target"]
|
146
|
+
if new_source_location:
|
147
|
+
loc = packet.interned_data.source_locations.add()
|
148
|
+
loc.iid = source_location_iid
|
149
|
+
loc.file_name = source_location[0]
|
150
|
+
loc.line_number = source_location[1]
|
151
|
+
|
152
|
+
packet.trusted_packet_sequence_id = trusted_packet_sequence_id
|
153
|
+
self.packets.append(packet)
|
154
|
+
|
155
|
+
packet = trace_packet_pb2.TracePacket()
|
156
|
+
packet.timestamp = end_ns[index]
|
157
|
+
packet.track_event.type = (
|
158
|
+
track_event.track_event_pb2.TrackEvent.Type.TYPE_SLICE_END
|
159
|
+
)
|
160
|
+
packet.track_event.track_uuid = thread_uuid
|
161
|
+
packet.track_event.name_iid = name_iid
|
162
|
+
packet.track_event.category_iids.append(category_iid)
|
163
|
+
packet.track_event.source_location_iid = source_location_iid
|
164
|
+
packet.sequence_flags = 2
|
165
|
+
packet.trusted_packet_sequence_id = trusted_packet_sequence_id
|
166
|
+
|
167
|
+
self.packets.append(packet)
|
168
|
+
|
169
|
+
def write_file(self, filename):
|
170
|
+
with open(filename, "wb") as f:
|
171
|
+
f.write(self.trace.SerializeToString())
|
172
|
+
|
173
|
+
|
174
|
+
def get_process_cpu_streams(client, process_id):
|
175
|
+
def prop_to_dict(props):
|
176
|
+
prop_dict = {}
|
177
|
+
for p in props:
|
178
|
+
prop_dict[p["key"]] = p["value"]
|
179
|
+
return prop_dict
|
180
|
+
|
181
|
+
def get_thread_name(prop_dict):
|
182
|
+
return prop_dict["thread-name"]
|
183
|
+
|
184
|
+
def get_thread_id(prop_dict):
|
185
|
+
return int(prop_dict["thread-id"])
|
186
|
+
|
187
|
+
df_streams = client.query_streams(
|
188
|
+
begin=None, end=None, limit=1024, tag_filter="cpu", process_id=process_id
|
189
|
+
)
|
190
|
+
df_streams["properties"] = df_streams["properties"].apply(prop_to_dict)
|
191
|
+
df_streams["thread_name"] = df_streams["properties"].apply(get_thread_name)
|
192
|
+
df_streams["thread_id"] = df_streams["properties"].apply(get_thread_id)
|
193
|
+
return df_streams
|
194
|
+
|
195
|
+
|
196
|
+
def write_process_trace(client, process_id, trace_filepath):
|
197
|
+
process_df = client.find_process(process_id)
|
198
|
+
assert process_df.shape[0] == 1
|
199
|
+
process = process_df.iloc[0]
|
200
|
+
streams = get_process_cpu_streams(client, process_id)
|
201
|
+
writer = Writer(client, process_id, process["exe"])
|
202
|
+
for index, stream in tqdm(list(streams.iterrows()), unit="threads"):
|
203
|
+
stream_id = stream["thread_id"]
|
204
|
+
writer.append_thread(stream["stream_id"], stream["thread_name"], stream_id)
|
205
|
+
writer.write_file(trace_filepath)
|
@@ -18,3 +18,19 @@ def request(url, args, headers={}):
|
|
18
18
|
)
|
19
19
|
table = pq.read_table(io.BytesIO(response.content))
|
20
20
|
return table.to_pandas()
|
21
|
+
|
22
|
+
def streamed_request(url, args, headers={}):
|
23
|
+
response = requests.post(
|
24
|
+
url,
|
25
|
+
headers=headers,
|
26
|
+
data=cbor2.dumps(args),
|
27
|
+
stream=True,
|
28
|
+
timeout=300,
|
29
|
+
)
|
30
|
+
if response.status_code != 200:
|
31
|
+
raise Exception(
|
32
|
+
"http request url={2} failed with code={0} text={1}".format(
|
33
|
+
response.status_code, response.text, url
|
34
|
+
)
|
35
|
+
)
|
36
|
+
return response
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import datetime
|
2
|
+
import pandas
|
3
|
+
import re
|
4
|
+
|
5
|
+
def format_datetime(value):
|
6
|
+
nonetype = type(None)
|
7
|
+
match type(value):
|
8
|
+
case datetime.datetime:
|
9
|
+
if value.tzinfo is None:
|
10
|
+
raise RuntimeError("datetime needs a valid time zone")
|
11
|
+
return value.isoformat()
|
12
|
+
case pandas.Timestamp:
|
13
|
+
return value.isoformat()
|
14
|
+
case nonetype:
|
15
|
+
return None
|
16
|
+
raise RuntimeError("value of unknown type in format_datetime")
|
17
|
+
|
18
|
+
def parse_time_delta(user_string):
|
19
|
+
parser = re.compile("(\\d+)([mhd])")
|
20
|
+
m = parser.match(user_string)
|
21
|
+
nbr = int(m.group(1))
|
22
|
+
unit = m.group(2)
|
23
|
+
if unit == "m":
|
24
|
+
return datetime.timedelta(minutes=nbr)
|
25
|
+
elif unit == "h":
|
26
|
+
return datetime.timedelta(hours=nbr)
|
27
|
+
elif unit == "d":
|
28
|
+
return datetime.timedelta(days=nbr)
|
29
|
+
else:
|
30
|
+
raise RuntimeError("invalid time delta: " + user_string)
|
@@ -1,92 +0,0 @@
|
|
1
|
-
from . import request
|
2
|
-
|
3
|
-
|
4
|
-
class Client:
|
5
|
-
def __init__(self, base_url, headers={}):
|
6
|
-
self.analytics_base_url = base_url + "analytics/"
|
7
|
-
self.headers = headers
|
8
|
-
|
9
|
-
def query_processes(self, begin, end, limit):
|
10
|
-
return request.request(
|
11
|
-
self.analytics_base_url + "query_processes",
|
12
|
-
{"begin": begin.isoformat(), "end": end.isoformat(), "limit": limit},
|
13
|
-
headers=self.headers,
|
14
|
-
)
|
15
|
-
|
16
|
-
def query_streams(self, begin, end, limit, process_id=None, tag_filter=None):
|
17
|
-
args = {
|
18
|
-
"begin": begin.isoformat(),
|
19
|
-
"end": end.isoformat(),
|
20
|
-
"limit": limit,
|
21
|
-
"process_id": process_id,
|
22
|
-
"tag_filter": tag_filter,
|
23
|
-
}
|
24
|
-
|
25
|
-
return request.request(
|
26
|
-
self.analytics_base_url + "query_streams",
|
27
|
-
args,
|
28
|
-
headers=self.headers,
|
29
|
-
)
|
30
|
-
|
31
|
-
def query_blocks(self, begin, end, limit, stream_id):
|
32
|
-
args = {
|
33
|
-
"begin": begin.isoformat(),
|
34
|
-
"end": end.isoformat(),
|
35
|
-
"limit": limit,
|
36
|
-
"stream_id": stream_id,
|
37
|
-
}
|
38
|
-
|
39
|
-
return request.request(
|
40
|
-
self.analytics_base_url + "query_blocks",
|
41
|
-
args,
|
42
|
-
headers=self.headers,
|
43
|
-
)
|
44
|
-
|
45
|
-
def query_spans(self, begin, end, limit, stream_id):
|
46
|
-
return request.request(
|
47
|
-
self.analytics_base_url + "query_spans",
|
48
|
-
{
|
49
|
-
"begin": begin.isoformat(),
|
50
|
-
"end": end.isoformat(),
|
51
|
-
"limit": limit,
|
52
|
-
"stream_id": stream_id,
|
53
|
-
},
|
54
|
-
headers=self.headers,
|
55
|
-
)
|
56
|
-
|
57
|
-
def query_thread_events(self, begin, end, limit, stream_id):
|
58
|
-
return request.request(
|
59
|
-
self.analytics_base_url + "query_thread_events",
|
60
|
-
{
|
61
|
-
"begin": begin.isoformat(),
|
62
|
-
"end": end.isoformat(),
|
63
|
-
"limit": limit,
|
64
|
-
"stream_id": stream_id,
|
65
|
-
},
|
66
|
-
headers=self.headers,
|
67
|
-
)
|
68
|
-
|
69
|
-
def query_log_entries(self, begin, end, limit, stream_id):
|
70
|
-
return request.request(
|
71
|
-
self.analytics_base_url + "query_log_entries",
|
72
|
-
{
|
73
|
-
"begin": begin.isoformat(),
|
74
|
-
"end": end.isoformat(),
|
75
|
-
"limit": limit,
|
76
|
-
"stream_id": stream_id,
|
77
|
-
},
|
78
|
-
headers=self.headers,
|
79
|
-
)
|
80
|
-
|
81
|
-
def query_metrics(self, begin, end, limit, stream_id):
|
82
|
-
return request.request(
|
83
|
-
self.analytics_base_url + "query_metrics",
|
84
|
-
{
|
85
|
-
"begin": begin.isoformat(),
|
86
|
-
"end": end.isoformat(),
|
87
|
-
"limit": limit,
|
88
|
-
"stream_id": stream_id,
|
89
|
-
},
|
90
|
-
headers=self.headers,
|
91
|
-
)
|
92
|
-
|
@@ -1,64 +0,0 @@
|
|
1
|
-
import crc
|
2
|
-
|
3
|
-
# hack to allow perfetto proto imports
|
4
|
-
# you can then import the protos like this: from protos.perfetto.trace import trace_pb2
|
5
|
-
def load_perfetto_protos():
|
6
|
-
import sys
|
7
|
-
import pathlib
|
8
|
-
perfetto_folder = pathlib.Path(__file__).parent.absolute() / "thirdparty/perfetto"
|
9
|
-
sys.path.append(str(perfetto_folder))
|
10
|
-
|
11
|
-
def crc64_str(s):
|
12
|
-
calculator = crc.Calculator(crc.Crc64.CRC64)
|
13
|
-
return calculator.checksum(str.encode(s))
|
14
|
-
|
15
|
-
class Writer:
|
16
|
-
def __init__( self, client, process_id, exe ):
|
17
|
-
load_perfetto_protos()
|
18
|
-
from protos.perfetto.trace import trace_pb2, trace_packet_pb2
|
19
|
-
self.client = client
|
20
|
-
self.trace = trace_pb2.Trace()
|
21
|
-
self.packets = self.trace.packet
|
22
|
-
self.process_uuid = crc64_str(process_id)
|
23
|
-
|
24
|
-
packet = trace_packet_pb2.TracePacket()
|
25
|
-
packet.track_descriptor.uuid = self.process_uuid
|
26
|
-
packet.track_descriptor.process.pid = 1
|
27
|
-
packet.track_descriptor.process.process_name = exe
|
28
|
-
self.packets.append(packet)
|
29
|
-
|
30
|
-
def append_thread( self, begin, end, stream_id, thread_name, thread_id ):
|
31
|
-
from protos.perfetto.trace import trace_pb2, trace_packet_pb2, track_event
|
32
|
-
packet = trace_packet_pb2.TracePacket()
|
33
|
-
thread_uuid = crc64_str(stream_id)
|
34
|
-
packet.track_descriptor.uuid = thread_uuid
|
35
|
-
packet.track_descriptor.parent_uuid = self.process_uuid
|
36
|
-
packet.track_descriptor.thread.pid = 1
|
37
|
-
packet.track_descriptor.thread.tid = thread_id
|
38
|
-
packet.track_descriptor.thread.thread_name = thread_name
|
39
|
-
self.packets.append(packet)
|
40
|
-
trusted_packet_sequence_id = 1
|
41
|
-
|
42
|
-
df_events = self.client.query_thread_events(begin, end, limit=1024*1024, stream_id = stream_id)
|
43
|
-
df_events["ns"] = df_events["timestamp"].astype('int64')
|
44
|
-
for index, event in df_events.iterrows():
|
45
|
-
packet = trace_packet_pb2.TracePacket()
|
46
|
-
packet.timestamp = event["ns"]
|
47
|
-
if event["event_type"] == "begin":
|
48
|
-
packet.track_event.type = track_event.track_event_pb2.TrackEvent.Type.TYPE_SLICE_BEGIN
|
49
|
-
elif event["event_type"] == "end":
|
50
|
-
packet.track_event.type = track_event.track_event_pb2.TrackEvent.Type.TYPE_SLICE_END
|
51
|
-
else:
|
52
|
-
raise Exception("unknown event type")
|
53
|
-
packet.track_event.track_uuid = thread_uuid
|
54
|
-
packet.track_event.name = event["name"]
|
55
|
-
packet.trusted_packet_sequence_id = trusted_packet_sequence_id
|
56
|
-
self.packets.append(packet)
|
57
|
-
|
58
|
-
def write_file( self, filename ):
|
59
|
-
with open(filename, "wb") as f:
|
60
|
-
f.write(self.trace.SerializeToString())
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|