Skip to content
This repository was archived by the owner on Sep 17, 2025. It is now read-only.

Commit c198151

Browse files
lzchenreyang
authored andcommitted
Standard Metric - Private Bytes (#718)
1 parent c809229 commit c198151

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

contrib/opencensus-ext-azure/opencensus/ext/azure/metrics_exporter/standard_metrics.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,19 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import logging
1516
import psutil
1617

1718
from opencensus.metrics.export.gauge import DerivedLongGauge
1819
from opencensus.metrics.export.gauge import Registry
1920
from opencensus.metrics.export.metric_producer import MetricProducer
2021

22+
logger = logging.getLogger(__name__)
23+
2124

2225
# Namespaces used in Azure Monitor
2326
AVAILABLE_MEMORY = "\\Memory\\Available Bytes"
27+
PRIVATE_BYTES = "\\Process(??APP_WIN32_PROC??)\\Private Bytes"
2428

2529

2630
def get_available_memory():
@@ -31,7 +35,7 @@ def get_available_memory_metric():
3135
""" Returns a derived gauge for available memory
3236
3337
Available memory is defined as memory that can be given instantly to
34-
processes without the system going into swap
38+
processes without the system going into swap.
3539
3640
:rtype: :class:`opencensus.metrics.export.gauge.DerivedLongGauge`
3741
:return: The gauge representing the available memory metric
@@ -45,6 +49,32 @@ def get_available_memory_metric():
4549
return gauge
4650

4751

52+
def get_process_private_bytes():
53+
try:
54+
process = psutil.Process()
55+
return process.memory_info().rss
56+
except Exception:
57+
logger.exception('Error handling get process private bytes.')
58+
59+
60+
def get_process_private_bytes_metric():
61+
""" Returns a derived gauge for private bytes for the current process
62+
63+
Private bytes for the current process is measured by the Resident Set
64+
Size, which is the non-swapped physical memory a process has used.
65+
66+
:rtype: :class:`opencensus.metrics.export.gauge.DerivedLongGauge`
67+
:return: The gauge representing the private bytes metric
68+
"""
69+
gauge = DerivedLongGauge(
70+
PRIVATE_BYTES,
71+
'Amount of memory process has used in bytes',
72+
'byte',
73+
[])
74+
gauge.create_default_time_series(get_process_private_bytes)
75+
return gauge
76+
77+
4878
class AzureStandardMetricsProducer(MetricProducer):
4979
"""Implementation of the producer of standard metrics.
5080
@@ -54,6 +84,7 @@ class AzureStandardMetricsProducer(MetricProducer):
5484
def __init__(self):
5585
self.registry = Registry()
5686
self.registry.add_gauge(get_available_memory_metric())
87+
self.registry.add_gauge(get_process_private_bytes_metric())
5788

5889
def get_metrics(self):
5990
return self.registry.get_metrics()

contrib/opencensus-ext-azure/tests/test_azure_standard_metrics.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def test_producer_get_metrics(self):
3131
producer = standard_metrics.AzureStandardMetricsProducer()
3232
metrics = producer.get_metrics()
3333

34-
self.assertEqual(len(metrics), 1)
34+
self.assertEqual(len(metrics), 2)
3535

3636
def test_get_available_memory_metric(self):
3737
gauge = standard_metrics.get_available_memory_metric()
@@ -46,3 +46,30 @@ def test_get_available_memory(self, psutil_mock):
4646
mem = standard_metrics.get_available_memory()
4747

4848
self.assertEqual(mem, 100)
49+
50+
def test_get_process_private_bytes_metric(self):
51+
gauge = standard_metrics.get_process_private_bytes_metric()
52+
53+
# TODO: Refactor names to be platform generic
54+
self.assertEqual(gauge.descriptor.name,
55+
'\\Process(??APP_WIN32_PROC??)\\Private Bytes')
56+
57+
def test_get_process_private_bytes(self):
58+
with mock.patch('psutil.Process') as process_mock:
59+
memory = collections.namedtuple('memory', 'rss')
60+
pmem = memory(rss=100)
61+
process = mock.Mock()
62+
process.memory_info.return_value = pmem
63+
process_mock.return_value = process
64+
mem = standard_metrics.get_process_private_bytes()
65+
66+
self.assertEqual(mem, 100)
67+
68+
@mock.patch('opencensus.ext.azure.metrics_exporter'
69+
'.standard_metrics.logger')
70+
def test_get_process_private_bytes_exception(self, logger_mock):
71+
with mock.patch('psutil.Process') as process_mock:
72+
process_mock.side_effect = Exception()
73+
standard_metrics.get_process_private_bytes()
74+
75+
logger_mock.exception.assert_called()

0 commit comments

Comments
 (0)