micromegas 0.1.9__py3-none-any.whl → 0.2.0__py3-none-any.whl

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/client.py CHANGED
@@ -22,17 +22,6 @@ class Client:
22
22
  headers=self.headers,
23
23
  )
24
24
 
25
- def query_processes(self, begin, end, limit):
26
- return request.request(
27
- self.analytics_base_url + "query_processes",
28
- {
29
- "begin": time.format_datetime(begin),
30
- "end": time.format_datetime(end),
31
- "limit": limit,
32
- },
33
- headers=self.headers,
34
- )
35
-
36
25
  def query_streams(self, begin, end, limit, process_id=None, tag_filter=None):
37
26
  args = {
38
27
  "begin": time.format_datetime(begin),
@@ -62,72 +51,26 @@ class Client:
62
51
  headers=self.headers,
63
52
  )
64
53
 
65
- def query_spans(self, begin, end, limit, stream_id):
66
- return request.request(
67
- self.analytics_base_url + "query_spans",
68
- {
69
- "begin": time.format_datetime(begin),
70
- "end": time.format_datetime(end),
71
- "limit": limit,
72
- "stream_id": stream_id,
73
- },
74
- headers=self.headers,
75
- )
76
-
77
- def query_thread_events(self, begin, end, limit, stream_id):
78
- return request.request(
79
- self.analytics_base_url + "query_thread_events",
80
- {
81
- "begin": time.format_datetime(begin),
82
- "end": time.format_datetime(end),
83
- "limit": limit,
84
- "stream_id": stream_id,
85
- },
86
- headers=self.headers,
87
- )
88
-
89
- def query_log_entries(
90
- self,
91
- begin,
92
- end,
93
- limit=None, # Necessary if stream_id is specified, ignored otherwise
94
- stream_id=None, # If none, query is run on cached lakehouse using query engine
95
- sql=None, # Necessary if stream_id is None, ignored otherwise
96
- ):
54
+ def query_view(self, view_set_name, view_instance_id, begin, end, sql):
97
55
  return request.request(
98
- self.analytics_base_url + "query_log_entries",
56
+ self.analytics_base_url + "query_view",
99
57
  {
58
+ "view_set_name": view_set_name,
59
+ "view_instance_id": view_instance_id,
100
60
  "begin": time.format_datetime(begin),
101
61
  "end": time.format_datetime(end),
102
- "limit": limit,
103
- "stream_id": stream_id,
104
62
  "sql": sql,
105
63
  },
106
64
  headers=self.headers,
107
65
  )
108
66
 
109
- def query_metrics(self, begin, end, limit=None, stream_id=None, sql=None):
67
+ def query(self, sql, begin=None, end=None):
110
68
  return request.request(
111
- self.analytics_base_url + "query_metrics",
69
+ self.analytics_base_url + "query",
112
70
  {
113
- "begin": time.format_datetime(begin),
114
- "end": time.format_datetime(end),
115
- "limit": limit,
116
- "stream_id": stream_id,
117
71
  "sql": sql,
118
- },
119
- headers=self.headers,
120
- )
121
-
122
- def query_view(self, view_set_name, view_instance_id, begin, end, sql):
123
- return request.request(
124
- self.analytics_base_url + "query_view",
125
- {
126
- "view_set_name": view_set_name,
127
- "view_instance_id": view_instance_id,
128
72
  "begin": time.format_datetime(begin),
129
73
  "end": time.format_datetime(end),
130
- "sql": sql,
131
74
  },
132
75
  headers=self.headers,
133
76
  )
@@ -0,0 +1,38 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # NO CHECKED-IN PROTOBUF GENCODE
4
+ # source: protos/perfetto/config/test_config.proto
5
+ # Protobuf Python Version: 5.27.1
6
+ """Generated protocol buffer code."""
7
+ from google.protobuf import descriptor as _descriptor
8
+ from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import runtime_version as _runtime_version
10
+ from google.protobuf import symbol_database as _symbol_database
11
+ from google.protobuf.internal import builder as _builder
12
+ _runtime_version.ValidateProtobufRuntimeVersion(
13
+ _runtime_version.Domain.PUBLIC,
14
+ 5,
15
+ 27,
16
+ 1,
17
+ '',
18
+ 'protos/perfetto/config/test_config.proto'
19
+ )
20
+ # @@protoc_insertion_point(imports)
21
+
22
+ _sym_db = _symbol_database.Default()
23
+
24
+
25
+
26
+
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(protos/perfetto/config/test_config.proto\x12\x0fperfetto.protos\"\x8d\x04\n\nTestConfig\x12\x15\n\rmessage_count\x18\x01 \x01(\r\x12\x1f\n\x17max_messages_per_second\x18\x02 \x01(\r\x12\x0c\n\x04seed\x18\x03 \x01(\r\x12\x14\n\x0cmessage_size\x18\x04 \x01(\r\x12\x1e\n\x16send_batch_on_register\x18\x05 \x01(\x08\x12=\n\x0c\x64ummy_fields\x18\x06 \x01(\x0b\x32\'.perfetto.protos.TestConfig.DummyFields\x1a\xc3\x02\n\x0b\x44ummyFields\x12\x14\n\x0c\x66ield_uint32\x18\x01 \x01(\r\x12\x13\n\x0b\x66ield_int32\x18\x02 \x01(\x05\x12\x14\n\x0c\x66ield_uint64\x18\x03 \x01(\x04\x12\x13\n\x0b\x66ield_int64\x18\x04 \x01(\x03\x12\x15\n\rfield_fixed64\x18\x05 \x01(\x06\x12\x16\n\x0e\x66ield_sfixed64\x18\x06 \x01(\x10\x12\x15\n\rfield_fixed32\x18\x07 \x01(\x07\x12\x16\n\x0e\x66ield_sfixed32\x18\x08 \x01(\x0f\x12\x14\n\x0c\x66ield_double\x18\t \x01(\x01\x12\x13\n\x0b\x66ield_float\x18\n \x01(\x02\x12\x14\n\x0c\x66ield_sint64\x18\x0b \x01(\x12\x12\x14\n\x0c\x66ield_sint32\x18\x0c \x01(\x11\x12\x14\n\x0c\x66ield_string\x18\r \x01(\t\x12\x13\n\x0b\x66ield_bytes\x18\x0e \x01(\x0c')
28
+
29
+ _globals = globals()
30
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
31
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'protos.perfetto.config.test_config_pb2', _globals)
32
+ if not _descriptor._USE_C_DESCRIPTORS:
33
+ DESCRIPTOR._loaded_options = None
34
+ _globals['_TESTCONFIG']._serialized_start=62
35
+ _globals['_TESTCONFIG']._serialized_end=587
36
+ _globals['_TESTCONFIG_DUMMYFIELDS']._serialized_start=264
37
+ _globals['_TESTCONFIG_DUMMYFIELDS']._serialized_end=587
38
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,39 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # NO CHECKED-IN PROTOBUF GENCODE
4
+ # source: protos/perfetto/trace/test_event.proto
5
+ # Protobuf Python Version: 5.27.1
6
+ """Generated protocol buffer code."""
7
+ from google.protobuf import descriptor as _descriptor
8
+ from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import runtime_version as _runtime_version
10
+ from google.protobuf import symbol_database as _symbol_database
11
+ from google.protobuf.internal import builder as _builder
12
+ _runtime_version.ValidateProtobufRuntimeVersion(
13
+ _runtime_version.Domain.PUBLIC,
14
+ 5,
15
+ 27,
16
+ 1,
17
+ '',
18
+ 'protos/perfetto/trace/test_event.proto'
19
+ )
20
+ # @@protoc_insertion_point(imports)
21
+
22
+ _sym_db = _symbol_database.Default()
23
+
24
+
25
+ from protos.perfetto.trace.track_event import debug_annotation_pb2 as protos_dot_perfetto_dot_trace_dot_track__event_dot_debug__annotation__pb2
26
+
27
+
28
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&protos/perfetto/trace/test_event.proto\x12\x0fperfetto.protos\x1a\x38protos/perfetto/trace/track_event/debug_annotation.proto\"\xfb\x02\n\tTestEvent\x12\x0b\n\x03str\x18\x01 \x01(\t\x12\x11\n\tseq_value\x18\x02 \x01(\r\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x04\x12\x0f\n\x07is_last\x18\x04 \x01(\x08\x12\x37\n\x07payload\x18\x05 \x01(\x0b\x32&.perfetto.protos.TestEvent.TestPayload\x1a\xf2\x01\n\x0bTestPayload\x12\x0b\n\x03str\x18\x01 \x03(\t\x12\x36\n\x06nested\x18\x02 \x03(\x0b\x32&.perfetto.protos.TestEvent.TestPayload\x12\x15\n\rsingle_string\x18\x04 \x01(\t\x12\x12\n\nsingle_int\x18\x05 \x01(\x05\x12\x15\n\rrepeated_ints\x18\x06 \x03(\x05\x12\x1f\n\x17remaining_nesting_depth\x18\x03 \x01(\r\x12;\n\x11\x64\x65\x62ug_annotations\x18\x07 \x03(\x0b\x32 .perfetto.protos.DebugAnnotation')
29
+
30
+ _globals = globals()
31
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
32
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'protos.perfetto.trace.test_event_pb2', _globals)
33
+ if not _descriptor._USE_C_DESCRIPTORS:
34
+ DESCRIPTOR._loaded_options = None
35
+ _globals['_TESTEVENT']._serialized_start=118
36
+ _globals['_TESTEVENT']._serialized_end=497
37
+ _globals['_TESTEVENT_TESTPAYLOAD']._serialized_start=255
38
+ _globals['_TESTEVENT_TESTPAYLOAD']._serialized_end=497
39
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,247 @@
1
+ Metadata-Version: 2.1
2
+ Name: micromegas
3
+ Version: 0.2.0
4
+ Summary: Python analytics client for https://github.com/madesroches/micromegas/
5
+ Author: Marc-Antoine Desroches
6
+ Author-email: madesroches@gmail.com
7
+ Requires-Python: >=3.10,<4.0
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.10
10
+ Classifier: Programming Language :: Python :: 3.11
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Requires-Dist: cbor2 (>=5.6.3,<6.0.0)
13
+ Requires-Dist: crc (>=7.0.0,<8.0.0)
14
+ Requires-Dist: pandas (>=2.2.2,<3.0.0)
15
+ Requires-Dist: protobuf (>=5.27.1,<6.0.0)
16
+ Requires-Dist: pyarrow (>=16.0.0,<17.0.0)
17
+ Requires-Dist: requests (>=2.31.0,<3.0.0)
18
+ Requires-Dist: tabulate (>=0.9.0,<0.10.0)
19
+ Requires-Dist: tqdm (>=4.66.5,<5.0.0)
20
+ Description-Content-Type: text/markdown
21
+
22
+ # Micromegas
23
+
24
+ Python analytics client for https://github.com/madesroches/micromegas/
25
+
26
+ ## Example usage
27
+
28
+ Query the most recent 2 log entries from the analytics service
29
+
30
+ ```python
31
+ import datetime
32
+ import pandas as pd
33
+ import micromegas
34
+
35
+ BASE_URL = "http://localhost:8082/"
36
+ client = micromegas.client.Client(BASE_URL)
37
+ sql = """
38
+ SELECT time, process_id, level, target, msg
39
+ FROM log_entries
40
+ WHERE level <= 4
41
+ AND exe LIKE '%analytics%'
42
+ ORDER BY time DESC
43
+ LIMIT 2
44
+ """
45
+
46
+ now = datetime.datetime.now(datetime.timezone.utc)
47
+ begin = now - datetime.timedelta(minutes=2)
48
+ end = now
49
+ client.query(sql, begin, end)
50
+ ```
51
+
52
+ | | time | process_id | level | target | msg |
53
+ |---:|:------------------------------------|:-------------------------------------|--------:|:---------------------------------------|:--------------------------------------------|
54
+ | 0 | 2024-10-03 18:17:56.087543714+00:00 | 1db06afc-1c88-47d1-81b3-f398c5f93616 | 4 | acme_telemetry::trace_middleware | response status=200 OK uri=/analytics/query |
55
+ | 1 | 2024-10-03 18:17:53.924037729+00:00 | 1db06afc-1c88-47d1-81b3-f398c5f93616 | 4 | micromegas_analytics::lakehouse::query | query sql= |
56
+ | | | | | | SELECT time, process_id, level, target, msg |
57
+ | | | | | | FROM log_entries |
58
+ | | | | | | WHERE level <= 4 |
59
+ | | | | | | AND exe LIKE '%analytics%' |
60
+ | | | | | | ORDER BY time DESC |
61
+ | | | | | | LIMIT 2 |
62
+
63
+
64
+ Query the 10 slowest top level spans in a trace within a specified time window
65
+
66
+ ```python
67
+ sql = """
68
+ SELECT begin, end, duration, name
69
+ FROM view_instance('thread_spans', '{stream_id}')
70
+ WHERE depth=1
71
+ ORDER BY duration DESC
72
+ LIMIT 10
73
+ ;""".format(stream_id=stream_id)
74
+ client.query(sql, begin_spans, end_spans)
75
+ ```
76
+
77
+ | | begin | end | duration | name |
78
+ |---:|:------------------------------------|:------------------------------------|-----------:|:------------------|
79
+ | 0 | 2024-10-03 18:00:59.308952900+00:00 | 2024-10-03 18:00:59.371890+00:00 | 62937100 | FEngineLoop::Tick |
80
+ | 1 | 2024-10-03 18:00:58.752476800+00:00 | 2024-10-03 18:00:58.784389+00:00 | 31912200 | FEngineLoop::Tick |
81
+ | 2 | 2024-10-03 18:00:58.701507300+00:00 | 2024-10-03 18:00:58.731479500+00:00 | 29972200 | FEngineLoop::Tick |
82
+ | 3 | 2024-10-03 18:00:59.766343100+00:00 | 2024-10-03 18:00:59.792513700+00:00 | 26170600 | FEngineLoop::Tick |
83
+ | 4 | 2024-10-03 18:00:59.282902100+00:00 | 2024-10-03 18:00:59.308952500+00:00 | 26050400 | FEngineLoop::Tick |
84
+ | 5 | 2024-10-03 18:00:59.816034500+00:00 | 2024-10-03 18:00:59.841376900+00:00 | 25342400 | FEngineLoop::Tick |
85
+ | 6 | 2024-10-03 18:00:58.897813100+00:00 | 2024-10-03 18:00:58.922769700+00:00 | 24956600 | FEngineLoop::Tick |
86
+ | 7 | 2024-10-03 18:00:59.860637+00:00 | 2024-10-03 18:00:59.885523700+00:00 | 24886700 | FEngineLoop::Tick |
87
+ | 8 | 2024-10-03 18:00:58.630051300+00:00 | 2024-10-03 18:00:58.654871500+00:00 | 24820200 | FEngineLoop::Tick |
88
+ | 9 | 2024-10-03 18:00:57.952279800+00:00 | 2024-10-03 18:00:57.977024+00:00 | 24744200 | FEngineLoop::Tick |
89
+
90
+ ## SQL reference
91
+
92
+ The Micromegas analytics service is built on Apache DataFusion, please see [Apache DataFusion SQL Reference](https://datafusion.apache.org/user-guide/sql/index.html) for details.
93
+
94
+ ## View sets
95
+
96
+ All view instances in a set have the same schema. Some view instances are global (their view_instance_id is 'global').
97
+ Global view instances are implicitly accessible to SQL queries. Non-global view instances are accessible using the table function `view_instance`.
98
+
99
+ ### log_entries
100
+
101
+ ```python
102
+ client.query("DESCRIBE log_entries")
103
+ ```
104
+ | | column_name | data_type | is_nullable |
105
+ |---:|:--------------|:--------------------------------------|:--------------|
106
+ | 0 | process_id | Dictionary(Int16, Utf8) | NO |
107
+ | 1 | exe | Dictionary(Int16, Utf8) | NO |
108
+ | 2 | username | Dictionary(Int16, Utf8) | NO |
109
+ | 3 | computer | Dictionary(Int16, Utf8) | NO |
110
+ | 4 | time | Timestamp(Nanosecond, Some("+00:00")) | NO |
111
+ | 5 | target | Dictionary(Int16, Utf8) | NO |
112
+ | 6 | level | Int32 | NO |
113
+ | 7 | msg | Utf8 | NO |
114
+
115
+
116
+ #### log_entries view instances
117
+ The implicit use of the `log_entries` table corresponds to the 'global' instance, which contains the log entries of all the processes.
118
+
119
+ Except the 'global' instance, the instance_id refers to any process_id. `view_instance('log_entries', process_id)` contains that process's log. Process-specific views are materialized just-in-time and can provide much better query performance compared to the global instance.
120
+
121
+ ### measures
122
+
123
+ ```python
124
+ client.query("DESCRIBE measures")
125
+ ```
126
+ | | column_name | data_type | is_nullable |
127
+ |---:|:--------------|:--------------------------------------|:--------------|
128
+ | 0 | process_id | Dictionary(Int16, Utf8) | NO |
129
+ | 1 | exe | Dictionary(Int16, Utf8) | NO |
130
+ | 2 | username | Dictionary(Int16, Utf8) | NO |
131
+ | 3 | computer | Dictionary(Int16, Utf8) | NO |
132
+ | 4 | time | Timestamp(Nanosecond, Some("+00:00")) | NO |
133
+ | 5 | target | Dictionary(Int16, Utf8) | NO |
134
+ | 6 | name | Dictionary(Int16, Utf8) | NO |
135
+ | 7 | unit | Dictionary(Int16, Utf8) | NO |
136
+ | 8 | value | Float64 | NO |
137
+
138
+
139
+ #### measures view instances
140
+
141
+ The implicit use of the `measures` table corresponds to the 'global' instance, which contains the metrics of all the processes.
142
+
143
+ Except the 'global' instance, the instance_id refers to any process_id. `view_instance('measures', process_id)` contains that process's metrics. Process-specific views are materialized just-in-time and can provide much better query performance compared to the 'global' instance.
144
+
145
+ ### thread_spans
146
+
147
+ | | column_name | data_type | is_nullable |
148
+ |---:|:--------------|:--------------------------------------|:--------------|
149
+ | 0 | id | Int64 | NO |
150
+ | 1 | parent | Int64 | NO |
151
+ | 2 | depth | UInt32 | NO |
152
+ | 3 | hash | Uint32 | NO |
153
+ | 4 | begin | Timestamp(Nanosecond, Some("+00:00")) | NO |
154
+ | 5 | end | Timestamp(Nanosecond, Some("+00:00")) | NO |
155
+ | 6 | duration | Int64 | NO |
156
+ | 7 | name | Dictionary(Int16, Utf8) | NO |
157
+ | 8 | target | Dictionary(Int16, Utf8) | NO |
158
+ | 9 | filename | Dictionary(Int16, Utf8) | NO |
159
+ | 10| line | UInt32 | NO |
160
+
161
+ #### thread_spans view instances
162
+
163
+ There is no 'global' instance in the 'thread_spans' view set, there is therefore no implicit thread_spans table availble.
164
+ Users can call the table function `view_instance('thread_spans', stream_id)` to query the spans in the thread associated with the specified stream_id.
165
+
166
+
167
+ ### processes
168
+
169
+ ```python
170
+ client.query("DESCRIBE processes")
171
+ ```
172
+ | | column_name | data_type | is_nullable |
173
+ |---:|:------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------|
174
+ | 0 | process_id | Utf8 | NO |
175
+ | 1 | exe | Utf8 | NO |
176
+ | 2 | username | Utf8 | NO |
177
+ | 3 | realname | Utf8 | NO |
178
+ | 4 | computer | Utf8 | NO |
179
+ | 5 | distro | Utf8 | NO |
180
+ | 6 | cpu_brand | Utf8 | NO |
181
+ | 7 | tsc_frequency | Int64 | NO |
182
+ | 8 | start_time | Timestamp(Nanosecond, Some("+00:00")) | NO |
183
+ | 9 | start_ticks | Int64 | NO |
184
+ | 10 | insert_time | Timestamp(Nanosecond, Some("+00:00")) | NO |
185
+ | 11 | parent_process_id | Utf8 | NO |
186
+ | 12 | properties | List(Field { name: "Property", data_type: Struct([Field { name: "key", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, Field { name: "value", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }]), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }) | NO |
187
+
188
+
189
+ There is only one instance in this view set and it is implicitly available.
190
+
191
+
192
+ ### streams
193
+
194
+ ```python
195
+ client.query("DESCRIBE streams")
196
+ ```
197
+ | | column_name | data_type | is_nullable |
198
+ |---:|:----------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------|
199
+ | 0 | stream_id | Utf8 | NO |
200
+ | 1 | process_id | Utf8 | NO |
201
+ | 2 | dependencies_metadata | Binary | NO |
202
+ | 3 | objects_metadata | Binary | NO |
203
+ | 4 | tags | List(Field { name: "tag", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }) | YES |
204
+ | 5 | properties | List(Field { name: "Property", data_type: Struct([Field { name: "key", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, Field { name: "value", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }]), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }) | NO |
205
+ | 6 | insert_time | Timestamp(Nanosecond, Some("+00:00")) | NO |
206
+
207
+ There is only one instance in this view set and it is implicitly available.
208
+
209
+ ### blocks
210
+
211
+
212
+ ```python
213
+ client.query("DESCRIBE blocks")
214
+ ```
215
+
216
+ | | column_name | data_type | is_nullable |
217
+ |---:|:------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------|
218
+ | 0 | block_id | Utf8 | NO |
219
+ | 1 | stream_id | Utf8 | NO |
220
+ | 2 | process_id | Utf8 | NO |
221
+ | 3 | begin_time | Timestamp(Nanosecond, Some("+00:00")) | NO |
222
+ | 4 | begin_ticks | Int64 | NO |
223
+ | 5 | end_time | Timestamp(Nanosecond, Some("+00:00")) | NO |
224
+ | 6 | end_ticks | Int64 | NO |
225
+ | 7 | nb_objects | Int32 | NO |
226
+ | 8 | object_offset | Int64 | NO |
227
+ | 9 | payload_size | Int64 | NO |
228
+ | 10 | insert_time | Timestamp(Nanosecond, Some("+00:00")) | NO |
229
+ | 11 | streams.dependencies_metadata | Binary | NO |
230
+ | 12 | streams.objects_metadata | Binary | NO |
231
+ | 13 | streams.tags | List(Field { name: "tag", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }) | YES |
232
+ | 14 | streams.properties | List(Field { name: "Property", data_type: Struct([Field { name: "key", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, Field { name: "value", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }]), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }) | NO |
233
+ | 15 | processes.start_time | Timestamp(Nanosecond, Some("+00:00")) | NO |
234
+ | 16 | processes.start_ticks | Int64 | NO |
235
+ | 17 | processes.tsc_frequency | Int64 | NO |
236
+ | 18 | processes.exe | Utf8 | NO |
237
+ | 19 | processes.username | Utf8 | NO |
238
+ | 20 | processes.realname | Utf8 | NO |
239
+ | 21 | processes.computer | Utf8 | NO |
240
+ | 22 | processes.distro | Utf8 | NO |
241
+ | 23 | processes.cpu_brand | Utf8 | NO |
242
+ | 24 | processes.insert_time | Timestamp(Nanosecond, Some("+00:00")) | NO |
243
+ | 25 | processes.parent_process_id | Utf8 | NO |
244
+ | 26 | processes.properties | List(Field { name: "Property", data_type: Struct([Field { name: "key", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, Field { name: "value", data_type: Utf8, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }]), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }) | NO |
245
+
246
+ There is only one instance in this view set and it is implicitly available.
247
+
@@ -1,5 +1,5 @@
1
1
  micromegas/__init__.py,sha256=E_j3LFxMk9rSMJunwDCi_90NsRHm1fKwjj_6KGMYCjQ,246
2
- micromegas/client.py,sha256=xDhKBDWG98mcwyXCjOVdcoWLMjAAyc-gAWp11ViePYY,5612
2
+ micromegas/client.py,sha256=7d0aah179a5cfjmBRxcaq7jTPvmGg625D_ixzdvtgCw,3670
3
3
  micromegas/perfetto.py,sha256=yuIe5iKvca61aWMBQNziSGM-DHcOEsiobtKx2SsNQ3E,7829
4
4
  micromegas/request.py,sha256=NV0urom5P3_P2q94gX51hxW_Fnrp_DDRorsP3mUb5NM,941
5
5
  micromegas/thirdparty/perfetto/protos/perfetto/common/android_energy_consumer_descriptor_pb2.py,sha256=l8QNXqnB-mJIkuFr2s1YoLQXHm3G-ZcOGp_OW_hQ0TE,1887
@@ -42,6 +42,7 @@ micromegas/thirdparty/perfetto/protos/perfetto/config/statsd/atom_ids_pb2.py,sha
42
42
  micromegas/thirdparty/perfetto/protos/perfetto/config/statsd/statsd_tracing_config_pb2.py,sha256=R_5SdcZtVBBBJ6PTkYlpVCmuzzftpRR14WTYpCppFnU,2159
43
43
  micromegas/thirdparty/perfetto/protos/perfetto/config/sys_stats/sys_stats_config_pb2.py,sha256=o6erypHQHn0scqZabZwwphxRvL50AtC38UR-Pl79F-A,2561
44
44
  micromegas/thirdparty/perfetto/protos/perfetto/config/system_info/system_info_pb2.py,sha256=vzqFeZbIVX638cyk2Y7PnFBGD3ZF-0kT6K8__UV5H6Y,1397
45
+ micromegas/thirdparty/perfetto/protos/perfetto/config/test_config_pb2.py,sha256=d5NO3cG-1Gsg5AvpzarJzIDQZTKwkpiAEkw8KKwNghc,2437
45
46
  micromegas/thirdparty/perfetto/protos/perfetto/config/trace_config_pb2.py,sha256=gCbplyGYzbNXbygk0_SWO1L6fP9UO5kMhxE9MDeGNFY,12753
46
47
  micromegas/thirdparty/perfetto/protos/perfetto/config/track_event/track_event_config_pb2.py,sha256=B76vM-h26uHWAmPye5qdX8G-2917FeVUPLTO4dz36tE,1907
47
48
  micromegas/thirdparty/perfetto/protos/perfetto/trace/android/android_game_intervention_list_pb2.py,sha256=o3Og8gaoY85tptvGqbhav4fDmuQu7bdFtSmrC1yaIY0,2437
@@ -170,6 +171,7 @@ micromegas/thirdparty/perfetto/protos/perfetto/trace/statsd/statsd_atom_pb2.py,s
170
171
  micromegas/thirdparty/perfetto/protos/perfetto/trace/sys_stats/sys_stats_pb2.py,sha256=mT0oYvJtTq3te7tnBWI2lVxEtxyDYZjZOehvdISEbEk,5404
171
172
  micromegas/thirdparty/perfetto/protos/perfetto/trace/system_info/cpu_info_pb2.py,sha256=jN3hh8oZeETAqzSi4wkiUaBVYgBBheYZBpK0x2f_Dis,1621
172
173
  micromegas/thirdparty/perfetto/protos/perfetto/trace/system_info_pb2.py,sha256=A7zU7AVq-9i41uxj8P0mZhoU98cRULkZmE25rRHVfF4,2017
174
+ micromegas/thirdparty/perfetto/protos/perfetto/trace/test_event_pb2.py,sha256=ovbLi6_TS0MC-P685D_gxJcm4zxeGTyLWK87HW5tGJM,2293
173
175
  micromegas/thirdparty/perfetto/protos/perfetto/trace/trace_packet_defaults_pb2.py,sha256=ENsJNaUGaFIkpUpcZa7t-Ue72GhdH0pJw0FrUnfKMng,2250
174
176
  micromegas/thirdparty/perfetto/protos/perfetto/trace/trace_packet_pb2.py,sha256=5hkSMh_D0J2UCnm7K2CfIQQtDoAtD9yNDoNNiVLQrLA,21973
175
177
  micromegas/thirdparty/perfetto/protos/perfetto/trace/trace_pb2.py,sha256=ZC7Dal05CR77mENj53oy-AXbcfSQL29NT9H4_PgFGG8,1509
@@ -206,6 +208,6 @@ micromegas/thirdparty/perfetto/protos/perfetto/trace/translation/translation_tab
206
208
  micromegas/thirdparty/perfetto/protos/perfetto/trace/trigger_pb2.py,sha256=We7Yi8o3cEcrSNxY1zLUUO6tEWnD36C2f3O_s8_qv0I,1435
207
209
  micromegas/thirdparty/perfetto/protos/perfetto/trace/ui_state_pb2.py,sha256=Af-SXwhroNhRXMrtw6e2eU1liCImMRxSdmkt_AuSHf8,1752
208
210
  micromegas/time.py,sha256=eD9fWF2UHxaf-92yd1X2SEgUcpKypqPsvjBosLdpnQA,1026
209
- micromegas-0.1.9.dist-info/METADATA,sha256=98_k5dywx3gbHUH36KDDLOkJEFm2zFVVJXSAipGECcM,877
210
- micromegas-0.1.9.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
211
- micromegas-0.1.9.dist-info/RECORD,,
211
+ micromegas-0.2.0.dist-info/METADATA,sha256=zvwsr7aIJE_1828_dz5g3-vG83kdHnDAq8EONlxmFII,30467
212
+ micromegas-0.2.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
213
+ micromegas-0.2.0.dist-info/RECORD,,
@@ -1,25 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: micromegas
3
- Version: 0.1.9
4
- Summary: Python analytics client for https://github.com/madesroches/micromegas/
5
- Author: Marc-Antoine Desroches
6
- Author-email: madesroches@gmail.com
7
- Requires-Python: >=3.10,<4.0
8
- Classifier: Programming Language :: Python :: 3
9
- Classifier: Programming Language :: Python :: 3.10
10
- Classifier: Programming Language :: Python :: 3.11
11
- Classifier: Programming Language :: Python :: 3.12
12
- Requires-Dist: cbor2 (>=5.6.3,<6.0.0)
13
- Requires-Dist: crc (>=7.0.0,<8.0.0)
14
- Requires-Dist: pandas (>=2.2.2,<3.0.0)
15
- Requires-Dist: protobuf (>=5.27.1,<6.0.0)
16
- Requires-Dist: pyarrow (>=16.0.0,<17.0.0)
17
- Requires-Dist: requests (>=2.31.0,<3.0.0)
18
- Requires-Dist: tabulate (>=0.9.0,<0.10.0)
19
- Requires-Dist: tqdm (>=4.66.5,<5.0.0)
20
- Description-Content-Type: text/markdown
21
-
22
- # Micromegas
23
-
24
- Python analytics client for https://github.com/madesroches/micromegas/
25
-