micromegas 0.1.3__tar.gz → 0.1.7__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.
Files changed (216) hide show
  1. {micromegas-0.1.3 → micromegas-0.1.7}/PKG-INFO +2 -1
  2. micromegas-0.1.7/micromegas/__init__.py +10 -0
  3. micromegas-0.1.7/micromegas/client.py +170 -0
  4. micromegas-0.1.7/micromegas/perfetto.py +205 -0
  5. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/request.py +16 -0
  6. micromegas-0.1.7/micromegas/time.py +30 -0
  7. {micromegas-0.1.3 → micromegas-0.1.7}/pyproject.toml +2 -1
  8. micromegas-0.1.3/micromegas/__init__.py +0 -4
  9. micromegas-0.1.3/micromegas/client.py +0 -92
  10. micromegas-0.1.3/micromegas/perfetto.py +0 -64
  11. {micromegas-0.1.3 → micromegas-0.1.7}/README.md +0 -0
  12. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/common/android_energy_consumer_descriptor_pb2.py +0 -0
  13. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/common/android_log_constants_pb2.py +0 -0
  14. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/common/builtin_clock_pb2.py +0 -0
  15. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/common/descriptor_pb2.py +0 -0
  16. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/common/gpu_counter_descriptor_pb2.py +0 -0
  17. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/common/perf_events_pb2.py +0 -0
  18. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/common/protolog_common_pb2.py +0 -0
  19. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/common/sys_stats_counters_pb2.py +0 -0
  20. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/common/trace_stats_pb2.py +0 -0
  21. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/android_game_intervention_list_config_pb2.py +0 -0
  22. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/android_input_event_config_pb2.py +0 -0
  23. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/android_log_config_pb2.py +0 -0
  24. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/android_polled_state_config_pb2.py +0 -0
  25. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/android_sdk_sysprop_guard_config_pb2.py +0 -0
  26. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/android_system_property_config_pb2.py +0 -0
  27. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/network_trace_config_pb2.py +0 -0
  28. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/packages_list_config_pb2.py +0 -0
  29. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/pixel_modem_config_pb2.py +0 -0
  30. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/protolog_config_pb2.py +0 -0
  31. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/surfaceflinger_layers_config_pb2.py +0 -0
  32. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/android/surfaceflinger_transactions_config_pb2.py +0 -0
  33. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/chrome/chrome_config_pb2.py +0 -0
  34. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/chrome/v8_config_pb2.py +0 -0
  35. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/data_source_config_pb2.py +0 -0
  36. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/etw/etw_config_pb2.py +0 -0
  37. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/ftrace/ftrace_config_pb2.py +0 -0
  38. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/gpu/gpu_counter_config_pb2.py +0 -0
  39. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/gpu/vulkan_memory_config_pb2.py +0 -0
  40. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/inode_file/inode_file_config_pb2.py +0 -0
  41. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/interceptor_config_pb2.py +0 -0
  42. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/interceptors/console_config_pb2.py +0 -0
  43. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/power/android_power_config_pb2.py +0 -0
  44. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/process_stats/process_stats_config_pb2.py +0 -0
  45. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/profiling/heapprofd_config_pb2.py +0 -0
  46. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/profiling/java_hprof_config_pb2.py +0 -0
  47. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/profiling/perf_event_config_pb2.py +0 -0
  48. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/statsd/atom_ids_pb2.py +0 -0
  49. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/statsd/statsd_tracing_config_pb2.py +0 -0
  50. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/sys_stats/sys_stats_config_pb2.py +0 -0
  51. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/system_info/system_info_pb2.py +0 -0
  52. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/test_config_pb2.py +0 -0
  53. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/trace_config_pb2.py +0 -0
  54. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/config/track_event/track_event_config_pb2.py +0 -0
  55. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/android_game_intervention_list_pb2.py +0 -0
  56. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/android_log_pb2.py +0 -0
  57. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/android_system_property_pb2.py +0 -0
  58. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/camera_event_pb2.py +0 -0
  59. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/frame_timeline_event_pb2.py +0 -0
  60. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/gpu_mem_event_pb2.py +0 -0
  61. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/graphics/rect_pb2.py +0 -0
  62. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/graphics_frame_event_pb2.py +0 -0
  63. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/initial_display_state_pb2.py +0 -0
  64. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/network_trace_pb2.py +0 -0
  65. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/packages_list_pb2.py +0 -0
  66. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/pixel_modem_events_pb2.py +0 -0
  67. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/protolog_pb2.py +0 -0
  68. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/shell_transition_pb2.py +0 -0
  69. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/surfaceflinger_common_pb2.py +0 -0
  70. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/surfaceflinger_layers_pb2.py +0 -0
  71. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/surfaceflinger_transactions_pb2.py +0 -0
  72. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/android/winscope_extensions_pb2.py +0 -0
  73. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/chrome/chrome_benchmark_metadata_pb2.py +0 -0
  74. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/chrome/chrome_metadata_pb2.py +0 -0
  75. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/chrome/chrome_trace_event_pb2.py +0 -0
  76. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/chrome/chrome_trigger_pb2.py +0 -0
  77. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/chrome/v8_pb2.py +0 -0
  78. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/clock_snapshot_pb2.py +0 -0
  79. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/etw/etw_event_bundle_pb2.py +0 -0
  80. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/etw/etw_event_pb2.py +0 -0
  81. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/etw/etw_pb2.py +0 -0
  82. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/extension_descriptor_pb2.py +0 -0
  83. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/filesystem/inode_file_map_pb2.py +0 -0
  84. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/android_fs_pb2.py +0 -0
  85. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/binder_pb2.py +0 -0
  86. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/block_pb2.py +0 -0
  87. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/cgroup_pb2.py +0 -0
  88. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/clk_pb2.py +0 -0
  89. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/cma_pb2.py +0 -0
  90. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/compaction_pb2.py +0 -0
  91. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/cpuhp_pb2.py +0 -0
  92. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/cros_ec_pb2.py +0 -0
  93. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/dcvsh_pb2.py +0 -0
  94. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/dma_fence_pb2.py +0 -0
  95. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/dmabuf_heap_pb2.py +0 -0
  96. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/dpu_pb2.py +0 -0
  97. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/drm_pb2.py +0 -0
  98. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ext4_pb2.py +0 -0
  99. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/f2fs_pb2.py +0 -0
  100. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/fastrpc_pb2.py +0 -0
  101. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/fence_pb2.py +0 -0
  102. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/filemap_pb2.py +0 -0
  103. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ftrace_event_bundle_pb2.py +0 -0
  104. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ftrace_event_pb2.py +0 -0
  105. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ftrace_pb2.py +0 -0
  106. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ftrace_stats_pb2.py +0 -0
  107. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/g2d_pb2.py +0 -0
  108. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/generic_pb2.py +0 -0
  109. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/google_icc_trace_pb2.py +0 -0
  110. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/google_irm_trace_pb2.py +0 -0
  111. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/gpu_mem_pb2.py +0 -0
  112. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/gpu_scheduler_pb2.py +0 -0
  113. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/hyp_pb2.py +0 -0
  114. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/i2c_pb2.py +0 -0
  115. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ion_pb2.py +0 -0
  116. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ipi_pb2.py +0 -0
  117. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/irq_pb2.py +0 -0
  118. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/kgsl_pb2.py +0 -0
  119. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/kmem_pb2.py +0 -0
  120. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/kvm_pb2.py +0 -0
  121. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/lowmemorykiller_pb2.py +0 -0
  122. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/lwis_pb2.py +0 -0
  123. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/mali_pb2.py +0 -0
  124. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/mdss_pb2.py +0 -0
  125. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/mm_event_pb2.py +0 -0
  126. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/net_pb2.py +0 -0
  127. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/oom_pb2.py +0 -0
  128. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/panel_pb2.py +0 -0
  129. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/perf_trace_counters_pb2.py +0 -0
  130. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/power_pb2.py +0 -0
  131. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/printk_pb2.py +0 -0
  132. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/raw_syscalls_pb2.py +0 -0
  133. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/regulator_pb2.py +0 -0
  134. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/rpm_pb2.py +0 -0
  135. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/samsung_pb2.py +0 -0
  136. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/sched_pb2.py +0 -0
  137. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/scm_pb2.py +0 -0
  138. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/sde_pb2.py +0 -0
  139. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/signal_pb2.py +0 -0
  140. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/skb_pb2.py +0 -0
  141. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/sock_pb2.py +0 -0
  142. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/sync_pb2.py +0 -0
  143. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/synthetic_pb2.py +0 -0
  144. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/systrace_pb2.py +0 -0
  145. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/task_pb2.py +0 -0
  146. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/tcp_pb2.py +0 -0
  147. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/thermal_exynos_pb2.py +0 -0
  148. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/thermal_pb2.py +0 -0
  149. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/trusty_pb2.py +0 -0
  150. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/ufs_pb2.py +0 -0
  151. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/v4l2_pb2.py +0 -0
  152. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/virtio_gpu_pb2.py +0 -0
  153. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/virtio_video_pb2.py +0 -0
  154. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/vmscan_pb2.py +0 -0
  155. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ftrace/workqueue_pb2.py +0 -0
  156. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/gpu/gpu_counter_event_pb2.py +0 -0
  157. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/gpu/gpu_log_pb2.py +0 -0
  158. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/gpu/gpu_render_stage_event_pb2.py +0 -0
  159. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/gpu/vulkan_api_event_pb2.py +0 -0
  160. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/gpu/vulkan_memory_event_pb2.py +0 -0
  161. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/interned_data/interned_data_pb2.py +0 -0
  162. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/memory_graph_pb2.py +0 -0
  163. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/perfetto/perfetto_metatrace_pb2.py +0 -0
  164. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/perfetto/tracing_service_event_pb2.py +0 -0
  165. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/power/android_energy_estimation_breakdown_pb2.py +0 -0
  166. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/power/android_entity_state_residency_pb2.py +0 -0
  167. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/power/battery_counters_pb2.py +0 -0
  168. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/power/power_rails_pb2.py +0 -0
  169. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/profiling/deobfuscation_pb2.py +0 -0
  170. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/profiling/heap_graph_pb2.py +0 -0
  171. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/profiling/profile_common_pb2.py +0 -0
  172. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/profiling/profile_packet_pb2.py +0 -0
  173. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/profiling/smaps_pb2.py +0 -0
  174. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ps/process_stats_pb2.py +0 -0
  175. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ps/process_tree_pb2.py +0 -0
  176. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/remote_clock_sync_pb2.py +0 -0
  177. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/statsd/statsd_atom_pb2.py +0 -0
  178. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/sys_stats/sys_stats_pb2.py +0 -0
  179. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/system_info/cpu_info_pb2.py +0 -0
  180. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/system_info_pb2.py +0 -0
  181. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/test_event_pb2.py +0 -0
  182. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/trace_packet_defaults_pb2.py +0 -0
  183. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/trace_packet_pb2.py +0 -0
  184. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/trace_pb2.py +0 -0
  185. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/trace_uuid_pb2.py +0 -0
  186. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_active_processes_pb2.py +0 -0
  187. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_application_state_info_pb2.py +0 -0
  188. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_compositor_scheduler_state_pb2.py +0 -0
  189. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_content_settings_event_info_pb2.py +0 -0
  190. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_frame_reporter_pb2.py +0 -0
  191. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_histogram_sample_pb2.py +0 -0
  192. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_keyed_service_pb2.py +0 -0
  193. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_latency_info_pb2.py +0 -0
  194. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_legacy_ipc_pb2.py +0 -0
  195. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_message_pump_pb2.py +0 -0
  196. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_mojo_event_info_pb2.py +0 -0
  197. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_process_descriptor_pb2.py +0 -0
  198. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_renderer_scheduler_state_pb2.py +0 -0
  199. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_thread_descriptor_pb2.py +0 -0
  200. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_user_event_pb2.py +0 -0
  201. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/chrome_window_handle_event_info_pb2.py +0 -0
  202. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/counter_descriptor_pb2.py +0 -0
  203. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/debug_annotation_pb2.py +0 -0
  204. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/log_message_pb2.py +0 -0
  205. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/pixel_modem_pb2.py +0 -0
  206. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/process_descriptor_pb2.py +0 -0
  207. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/range_of_interest_pb2.py +0 -0
  208. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/screenshot_pb2.py +0 -0
  209. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/source_location_pb2.py +0 -0
  210. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/task_execution_pb2.py +0 -0
  211. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/thread_descriptor_pb2.py +0 -0
  212. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/track_descriptor_pb2.py +0 -0
  213. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/track_event/track_event_pb2.py +0 -0
  214. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/translation/translation_table_pb2.py +0 -0
  215. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/trigger_pb2.py +0 -0
  216. {micromegas-0.1.3 → micromegas-0.1.7}/micromegas/thirdparty/perfetto/protos/perfetto/trace/ui_state_pb2.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: micromegas
3
- Version: 0.1.3
3
+ Version: 0.1.7
4
4
  Summary: Python analytics client for https://github.com/madesroches/micromegas/
5
5
  Author: Marc-Antoine Desroches
6
6
  Author-email: madesroches@gmail.com
@@ -16,6 +16,7 @@ Requires-Dist: protobuf (>=5.27.1,<6.0.0)
16
16
  Requires-Dist: pyarrow (>=16.0.0,<17.0.0)
17
17
  Requires-Dist: requests (>=2.31.0,<3.0.0)
18
18
  Requires-Dist: tabulate (>=0.9.0,<0.10.0)
19
+ Requires-Dist: tqdm (>=4.66.5,<5.0.0)
19
20
  Description-Content-Type: text/markdown
20
21
 
21
22
  # Micromegas
@@ -0,0 +1,10 @@
1
+ import os
2
+ from . import time
3
+ from . import request
4
+ from . import client
5
+ from . import perfetto
6
+
7
+ def connect():
8
+ "connect to the analytics service using default values"
9
+ BASE_URL = "http://localhost:8082/"
10
+ return client.Client(BASE_URL)
@@ -0,0 +1,170 @@
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 materialize_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("materialize_partitions", args)
159
+
160
+ def retire_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("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,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "micromegas"
3
- version = "0.1.3"
3
+ version = "0.1.7"
4
4
  description = "Python analytics client for https://github.com/madesroches/micromegas/"
5
5
  authors = ["Marc-Antoine Desroches <madesroches@gmail.com>"]
6
6
  readme = "README.md"
@@ -14,6 +14,7 @@ pyarrow = "^16.0.0"
14
14
  python = "^3.10"
15
15
  requests = "^2.31.0"
16
16
  tabulate = "^0.9.0"
17
+ tqdm = "^4.66.5"
17
18
 
18
19
 
19
20
  [tool.poetry.group.test.dependencies]
@@ -1,4 +0,0 @@
1
- import os
2
- from . import request
3
- from . import client
4
- from . import perfetto
@@ -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