99import io .opentelemetry .api .common .AttributeKey ;
1010import io .opentelemetry .api .common .Attributes ;
1111import io .opentelemetry .api .metrics .Meter ;
12+ import java .util .ArrayList ;
13+ import java .util .List ;
1214import oshi .SystemInfo ;
1315import oshi .hardware .GlobalMemory ;
1416import oshi .hardware .HWDiskStore ;
@@ -28,111 +30,121 @@ public class SystemMetrics {
2830 private SystemMetrics () {}
2931
3032 /** Register observers for system metrics. */
31- public static void registerObservers (OpenTelemetry openTelemetry ) {
33+ public static List < AutoCloseable > registerObservers (OpenTelemetry openTelemetry ) {
3234 Meter meter = openTelemetry .getMeterProvider ().get ("io.opentelemetry.oshi" );
3335 SystemInfo systemInfo = new SystemInfo ();
3436 HardwareAbstractionLayer hal = systemInfo .getHardware ();
37+ List <AutoCloseable > observables = new ArrayList <>();
3538
36- meter
37- .upDownCounterBuilder ("system.memory.usage" )
38- .setDescription ("System memory usage" )
39- .setUnit ("By" )
40- .buildWithCallback (
41- r -> {
42- GlobalMemory mem = hal .getMemory ();
43- r .record (mem .getTotal () - mem .getAvailable (), ATTRIBUTES_USED );
44- r .record (mem .getAvailable (), ATTRIBUTES_FREE );
45- });
39+ observables .add (
40+ meter
41+ .upDownCounterBuilder ("system.memory.usage" )
42+ .setDescription ("System memory usage" )
43+ .setUnit ("By" )
44+ .buildWithCallback (
45+ r -> {
46+ GlobalMemory mem = hal .getMemory ();
47+ r .record (mem .getTotal () - mem .getAvailable (), ATTRIBUTES_USED );
48+ r .record (mem .getAvailable (), ATTRIBUTES_FREE );
49+ }));
4650
47- meter
48- .gaugeBuilder ("system.memory.utilization" )
49- .setDescription ("System memory utilization" )
50- .setUnit ("1" )
51- .buildWithCallback (
52- r -> {
53- GlobalMemory mem = hal .getMemory ();
54- r .record (
55- ((double ) (mem .getTotal () - mem .getAvailable ())) / mem .getTotal (),
56- ATTRIBUTES_USED );
57- r .record (((double ) mem .getAvailable ()) / mem .getTotal (), ATTRIBUTES_FREE );
58- });
51+ observables .add (
52+ meter
53+ .gaugeBuilder ("system.memory.utilization" )
54+ .setDescription ("System memory utilization" )
55+ .setUnit ("1" )
56+ .buildWithCallback (
57+ r -> {
58+ GlobalMemory mem = hal .getMemory ();
59+ r .record (
60+ ((double ) (mem .getTotal () - mem .getAvailable ())) / mem .getTotal (),
61+ ATTRIBUTES_USED );
62+ r .record (((double ) mem .getAvailable ()) / mem .getTotal (), ATTRIBUTES_FREE );
63+ }));
5964
60- meter
61- .counterBuilder ("system.network.io" )
62- .setDescription ("System network IO" )
63- .setUnit ("By" )
64- .buildWithCallback (
65- r -> {
66- for (NetworkIF networkIf : hal .getNetworkIFs ()) {
67- networkIf .updateAttributes ();
68- long recv = networkIf .getBytesRecv ();
69- long sent = networkIf .getBytesSent ();
70- String device = networkIf .getName ();
71- r .record (recv , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "receive" ));
72- r .record (sent , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "transmit" ));
73- }
74- });
65+ observables .add (
66+ meter
67+ .counterBuilder ("system.network.io" )
68+ .setDescription ("System network IO" )
69+ .setUnit ("By" )
70+ .buildWithCallback (
71+ r -> {
72+ for (NetworkIF networkIf : hal .getNetworkIFs ()) {
73+ networkIf .updateAttributes ();
74+ long recv = networkIf .getBytesRecv ();
75+ long sent = networkIf .getBytesSent ();
76+ String device = networkIf .getName ();
77+ r .record (recv , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "receive" ));
78+ r .record (sent , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "transmit" ));
79+ }
80+ }));
7581
76- meter
77- .counterBuilder ("system.network.packets" )
78- .setDescription ("System network packets" )
79- .setUnit ("{packets}" )
80- .buildWithCallback (
81- r -> {
82- for (NetworkIF networkIf : hal .getNetworkIFs ()) {
83- networkIf .updateAttributes ();
84- long recv = networkIf .getPacketsRecv ();
85- long sent = networkIf .getPacketsSent ();
86- String device = networkIf .getName ();
87- r .record (recv , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "receive" ));
88- r .record (sent , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "transmit" ));
89- }
90- });
82+ observables .add (
83+ meter
84+ .counterBuilder ("system.network.packets" )
85+ .setDescription ("System network packets" )
86+ .setUnit ("{packets}" )
87+ .buildWithCallback (
88+ r -> {
89+ for (NetworkIF networkIf : hal .getNetworkIFs ()) {
90+ networkIf .updateAttributes ();
91+ long recv = networkIf .getPacketsRecv ();
92+ long sent = networkIf .getPacketsSent ();
93+ String device = networkIf .getName ();
94+ r .record (recv , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "receive" ));
95+ r .record (sent , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "transmit" ));
96+ }
97+ }));
9198
92- meter
93- .counterBuilder ("system.network.errors" )
94- .setDescription ("System network errors" )
95- .setUnit ("{errors}" )
96- .buildWithCallback (
97- r -> {
98- for (NetworkIF networkIf : hal .getNetworkIFs ()) {
99- networkIf .updateAttributes ();
100- long recv = networkIf .getInErrors ();
101- long sent = networkIf .getOutErrors ();
102- String device = networkIf .getName ();
103- r .record (recv , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "receive" ));
104- r .record (sent , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "transmit" ));
105- }
106- });
99+ observables .add (
100+ meter
101+ .counterBuilder ("system.network.errors" )
102+ .setDescription ("System network errors" )
103+ .setUnit ("{errors}" )
104+ .buildWithCallback (
105+ r -> {
106+ for (NetworkIF networkIf : hal .getNetworkIFs ()) {
107+ networkIf .updateAttributes ();
108+ long recv = networkIf .getInErrors ();
109+ long sent = networkIf .getOutErrors ();
110+ String device = networkIf .getName ();
111+ r .record (recv , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "receive" ));
112+ r .record (sent , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "transmit" ));
113+ }
114+ }));
107115
108- meter
109- .counterBuilder ("system.disk.io" )
110- .setDescription ("System disk IO" )
111- .setUnit ("By" )
112- .buildWithCallback (
113- r -> {
114- for (HWDiskStore diskStore : hal .getDiskStores ()) {
115- long read = diskStore .getReadBytes ();
116- long write = diskStore .getWriteBytes ();
117- String device = diskStore .getName ();
118- r .record (read , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "read" ));
119- r .record (write , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "write" ));
120- }
121- });
116+ observables .add (
117+ meter
118+ .counterBuilder ("system.disk.io" )
119+ .setDescription ("System disk IO" )
120+ .setUnit ("By" )
121+ .buildWithCallback (
122+ r -> {
123+ for (HWDiskStore diskStore : hal .getDiskStores ()) {
124+ long read = diskStore .getReadBytes ();
125+ long write = diskStore .getWriteBytes ();
126+ String device = diskStore .getName ();
127+ r .record (read , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "read" ));
128+ r .record (write , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "write" ));
129+ }
130+ }));
122131
123- meter
124- .counterBuilder ("system.disk.operations" )
125- .setDescription ("System disk operations" )
126- .setUnit ("{operations}" )
127- .buildWithCallback (
128- r -> {
129- for (HWDiskStore diskStore : hal .getDiskStores ()) {
130- long read = diskStore .getReads ();
131- long write = diskStore .getWrites ();
132- String device = diskStore .getName ();
133- r .record (read , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "read" ));
134- r .record (write , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "write" ));
135- }
136- });
132+ observables .add (
133+ meter
134+ .counterBuilder ("system.disk.operations" )
135+ .setDescription ("System disk operations" )
136+ .setUnit ("{operations}" )
137+ .buildWithCallback (
138+ r -> {
139+ for (HWDiskStore diskStore : hal .getDiskStores ()) {
140+ long read = diskStore .getReads ();
141+ long write = diskStore .getWrites ();
142+ String device = diskStore .getName ();
143+ r .record (read , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "read" ));
144+ r .record (write , Attributes .of (DEVICE_KEY , device , DIRECTION_KEY , "write" ));
145+ }
146+ }));
147+
148+ return observables ;
137149 }
138150}
0 commit comments