28
28
"system.disk.io": ["read", "write"],
29
29
"system.disk.operations": ["read", "write"],
30
30
"system.disk.time": ["read", "write"],
31
- "system.disk.merged": ["read", "write"],
32
31
"system.network.dropped.packets": ["transmit", "receive"],
33
32
"system.network.packets": ["transmit", "receive"],
34
33
"system.network.errors": ["transmit", "receive"],
64
63
"runtime.memory": ["rss", "vms"],
65
64
"runtime.cpu.time": ["user", "system"],
66
65
}
67
- SystemMetrics(exporter, config=configuration)
66
+ SystemMetrics(config=configuration)
68
67
69
68
API
70
69
---
71
70
"""
72
71
72
+ from typing import Collection
73
+
73
74
import gc
74
75
import os
75
76
from typing import Dict , List , Iterable , Optional
76
77
from platform import python_implementation
77
78
78
79
import psutil
79
80
80
- from opentelemetry ._metrics import get_meter_provider
81
+ from opentelemetry ._metrics import get_meter
81
82
from opentelemetry ._metrics .measurement import Measurement
83
+ from opentelemetry .instrumentation .instrumentor import BaseInstrumentor
84
+ from opentelemetry .instrumentation .system_metrics .version import __version__
85
+ from opentelemetry .instrumentation .system_metrics .package import _instruments
82
86
from opentelemetry .sdk .util import get_dict_as_key
83
87
84
88
85
- class SystemMetrics :
89
+ class SystemMetrics ( BaseInstrumentor ) :
86
90
# pylint: disable=too-many-statements
87
91
def __init__ (
88
92
self ,
89
- interval : int = 30 ,
90
93
labels : Optional [Dict [str , str ]] = None ,
91
94
config : Optional [Dict [str , List [str ]]] = None ,
92
95
):
93
- self ._labels = {} if labels is None else labels
94
- self .meter = get_meter_provider ().get_meter (
95
- "io.otel.python.instrumentation.system-metrics"
96
- ) # TODO: find a better name here
97
- self ._python_implementation = python_implementation ().lower ()
96
+ super ().__init__ ()
98
97
if config is None :
99
98
self ._config = {
100
99
"system.cpu.time" : ["idle" , "user" , "system" , "irq" ],
@@ -108,7 +107,6 @@ def __init__(
108
107
"system.disk.io" : ["read" , "write" ],
109
108
"system.disk.operations" : ["read" , "write" ],
110
109
"system.disk.time" : ["read" , "write" ],
111
- "system.disk.merged" : ["read" , "write" ],
112
110
# "system.filesystem.usage": [],
113
111
# "system.filesystem.utilization": [],
114
112
"system.network.dropped.packets" : ["transmit" , "receive" ],
@@ -121,6 +119,20 @@ def __init__(
121
119
}
122
120
else :
123
121
self ._config = config
122
+ self ._labels = {} if labels is None else labels
123
+ self ._meter = None
124
+
125
+ def instrumentation_dependencies (self ) -> Collection [str ]:
126
+ return _instruments
127
+
128
+ def _instrument (self , ** kwargs ):
129
+ meter_provider = kwargs .get ("meter_provider" )
130
+ self ._meter = get_meter (
131
+ "io.otel.python.instrumentation.system_metrics" ,
132
+ __version__ ,
133
+ meter_provider ,
134
+ )
135
+ self ._python_implementation = python_implementation ().lower ()
124
136
125
137
self ._proc = psutil .Process (os .getpid ())
126
138
@@ -153,92 +165,84 @@ def __init__(
153
165
self ._runtime_cpu_time_labels = self ._labels .copy ()
154
166
self ._runtime_gc_count_labels = self ._labels .copy ()
155
167
156
- self .meter .create_observable_counter (
168
+ self ._meter .create_observable_counter (
157
169
callback = self ._get_system_cpu_time ,
158
170
name = "system.cpu.time" ,
159
171
description = "System CPU time" ,
160
172
unit = "seconds" ,
161
173
)
162
174
163
- self .meter .create_observable_gauge (
175
+ self ._meter .create_observable_gauge (
164
176
callback = self ._get_system_cpu_utilization ,
165
177
name = "system.cpu.utilization" ,
166
178
description = "System CPU utilization" ,
167
179
unit = "1" ,
168
180
)
169
181
170
- self .meter .create_observable_gauge (
182
+ self ._meter .create_observable_gauge (
171
183
callback = self ._get_system_memory_usage ,
172
184
name = "system.memory.usage" ,
173
185
description = "System memory usage" ,
174
186
unit = "bytes" ,
175
187
)
176
188
177
- self .meter .create_observable_gauge (
189
+ self ._meter .create_observable_gauge (
178
190
callback = self ._get_system_memory_utilization ,
179
191
name = "system.memory.utilization" ,
180
192
description = "System memory utilization" ,
181
193
unit = "1" ,
182
194
)
183
195
184
- self .meter .create_observable_gauge (
196
+ self ._meter .create_observable_gauge (
185
197
callback = self ._get_system_swap_usage ,
186
198
name = "system.swap.usage" ,
187
199
description = "System swap usage" ,
188
200
unit = "pages" ,
189
201
)
190
202
191
- self .meter .create_observable_gauge (
203
+ self ._meter .create_observable_gauge (
192
204
callback = self ._get_system_swap_utilization ,
193
205
name = "system.swap.utilization" ,
194
206
description = "System swap utilization" ,
195
207
unit = "1" ,
196
208
)
197
209
198
- # # self.meter .create_observable_counter(
210
+ # # self._meter .create_observable_counter(
199
211
# # callback=self._get_system_swap_page_faults,
200
212
# # name="system.swap.page_faults",
201
213
# # description="System swap page faults",
202
214
# # unit="faults",
203
215
# # value_type=int,
204
216
# # )
205
217
206
- # # self.meter .create_observable_counter(
218
+ # # self._meter .create_observable_counter(
207
219
# # callback=self._get_system_swap_page_operations,
208
220
# # name="system.swap.page_operations",
209
221
# # description="System swap page operations",
210
222
# # unit="operations",
211
223
# # value_type=int,
212
224
# # )
213
-
214
- self .meter .create_observable_counter (
225
+ self ._meter .create_observable_counter (
215
226
callback = self ._get_system_disk_io ,
216
227
name = "system.disk.io" ,
217
228
description = "System disk IO" ,
218
229
unit = "bytes" ,
219
230
)
220
231
221
- self .meter .create_observable_counter (
232
+ self ._meter .create_observable_counter (
222
233
callback = self ._get_system_disk_operations ,
223
234
name = "system.disk.operations" ,
224
235
description = "System disk operations" ,
225
236
unit = "operations" ,
226
237
)
227
238
228
- self .meter .create_observable_counter (
239
+ self ._meter .create_observable_counter (
229
240
callback = self ._get_system_disk_time ,
230
241
name = "system.disk.time" ,
231
242
description = "System disk time" ,
232
243
unit = "seconds" ,
233
244
)
234
245
235
- self .meter .create_observable_counter (
236
- callback = self ._get_system_disk_merged ,
237
- name = "system.disk.merged" ,
238
- description = "System disk merged" ,
239
- unit = "1" ,
240
- )
241
-
242
246
# self.accumulator.register_valueobserver(
243
247
# callback=self._get_system_filesystem_usage,
244
248
# name="system.filesystem.usage",
@@ -247,50 +251,50 @@ def __init__(
247
251
# value_type=int,
248
252
# )
249
253
250
- # self.meter .create_observable_gauge(
254
+ # self._meter .create_observable_gauge(
251
255
# callback=self._get_system_filesystem_utilization,
252
256
# name="system.filesystem.utilization",
253
257
# description="System filesystem utilization",
254
258
# unit="1",
255
259
# value_type=float,
256
260
# )
257
261
258
- self .meter .create_observable_counter (
262
+ self ._meter .create_observable_counter (
259
263
callback = self ._get_system_network_dropped_packets ,
260
264
name = "system.network.dropped_packets" ,
261
265
description = "System network dropped_packets" ,
262
266
unit = "packets" ,
263
267
)
264
268
265
- self .meter .create_observable_counter (
269
+ self ._meter .create_observable_counter (
266
270
callback = self ._get_system_network_packets ,
267
271
name = "system.network.packets" ,
268
272
description = "System network packets" ,
269
273
unit = "packets" ,
270
274
)
271
275
272
- self .meter .create_observable_counter (
276
+ self ._meter .create_observable_counter (
273
277
callback = self ._get_system_network_errors ,
274
278
name = "system.network.errors" ,
275
279
description = "System network errors" ,
276
280
unit = "errors" ,
277
281
)
278
282
279
- self .meter .create_observable_counter (
283
+ self ._meter .create_observable_counter (
280
284
callback = self ._get_system_network_io ,
281
285
name = "system.network.io" ,
282
286
description = "System network io" ,
283
287
unit = "bytes" ,
284
288
)
285
289
286
- self .meter .create_observable_up_down_counter (
290
+ self ._meter .create_observable_up_down_counter (
287
291
callback = self ._get_system_network_connections ,
288
292
name = "system.network.connections" ,
289
293
description = "System network connections" ,
290
294
unit = "connections" ,
291
295
)
292
296
293
- self .meter .create_observable_counter (
297
+ self ._meter .create_observable_counter (
294
298
callback = self ._get_runtime_memory ,
295
299
name = "runtime.{}.memory" .format (self ._python_implementation ),
296
300
description = "Runtime {} memory" .format (
@@ -299,7 +303,7 @@ def __init__(
299
303
unit = "bytes" ,
300
304
)
301
305
302
- self .meter .create_observable_counter (
306
+ self ._meter .create_observable_counter (
303
307
callback = self ._get_runtime_cpu_time ,
304
308
name = "runtime.{}.cpu_time" .format (self ._python_implementation ),
305
309
description = "Runtime {} CPU time" .format (
@@ -308,14 +312,17 @@ def __init__(
308
312
unit = "seconds" ,
309
313
)
310
314
311
- self .meter .create_observable_counter (
315
+ self ._meter .create_observable_counter (
312
316
callback = self ._get_runtime_gc_count ,
313
317
name = "runtime.{}.gc_count" .format (self ._python_implementation ),
314
318
description = "Runtime {} GC count" .format (
315
319
self ._python_implementation
316
320
),
317
321
unit = "bytes" ,
318
322
)
323
+
324
+ def _uninstrument (self , ** __ ):
325
+ pass
319
326
320
327
def _get_system_cpu_time (self ) -> Iterable [Measurement ]:
321
328
"""Observer callback for system CPU time
0 commit comments