Skip to content

Commit 37206dd

Browse files
committed
Let custom resource override detected resources
1 parent 3761a8f commit 37206dd

File tree

3 files changed

+124
-26
lines changed

3 files changed

+124
-26
lines changed

opencensus/common/monitored_resource/monitored_resource.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,18 +64,26 @@ def get_instance():
6464
:rtype: :class:`opencensus.common.resource.Resource` or None
6565
:return: A `Resource` configured for the current environment.
6666
"""
67+
resources = []
68+
env_resource = resource.get_from_env()
69+
if env_resource is not None:
70+
resources.append(env_resource)
71+
6772
if is_gke_environment():
68-
return resource.Resource(
73+
resources.append(resource.Resource(
6974
_GKE_CONTAINER,
70-
gcp_metadata_config.GcpMetadataConfig().get_gke_metadata())
75+
gcp_metadata_config.GcpMetadataConfig().get_gke_metadata()))
76+
7177
if is_gce_environment():
72-
return resource.Resource(
78+
resources.append(resource.Resource(
7379
_GCE_INSTANCE,
74-
gcp_metadata_config.GcpMetadataConfig().get_gce_metadata())
75-
if is_aws_environment():
76-
return resource.Resource(
80+
gcp_metadata_config.GcpMetadataConfig().get_gce_metadata()))
81+
elif is_aws_environment():
82+
resources.append(resource.Resource(
7783
_AWS_EC2_INSTANCE,
7884
(aws_identity_doc_utils.AwsIdentityDocumentUtils()
79-
.get_aws_metadata()))
85+
.get_aws_metadata())))
8086

81-
return None
87+
if not resources:
88+
return None
89+
return resource.merge_resources(resources)

tests/unit/common/monitored_resource_util/test_monitored_resource.py

Lines changed: 92 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,27 @@ def mock_use_aws(use):
3939
return mock_mr_method('is_aws_environment', use)
4040

4141

42+
@contextmanager
43+
def no_oc_env():
44+
with mock.patch.dict(os.environ):
45+
try:
46+
del os.environ['OC_RESOURCE_TYPE']
47+
except KeyError:
48+
pass
49+
try:
50+
del os.environ['OC_RESOURCE_LABELS']
51+
except KeyError:
52+
pass
53+
yield
54+
55+
56+
def mock_oc_env():
57+
return mock.patch.dict('os.environ', {
58+
'OC_RESOURCE_TYPE': 'mock_resource_type',
59+
'OC_RESOURCE_LABELS': 'mock_label_key=mock_label_value'
60+
})
61+
62+
4263
@contextmanager
4364
def mock_gke_env():
4465
with mock_use_gke(True):
@@ -77,11 +98,20 @@ def test_gcp_gce_monitored_resource(self, gcp_metadata_mock):
7798
gcp_metadata_mock.return_value = mock.Mock()
7899
gcp_metadata_mock.return_value.get_gce_metadata.return_value =\
79100
mocked_labels
80-
with mock_gce_env():
81-
resource = monitored_resource.get_instance()
101+
with no_oc_env():
102+
with mock_gce_env():
103+
resource = monitored_resource.get_instance()
82104
self.assertEquals(resource.get_type(), 'gce_instance')
83105
self.assertEquals(resource.get_labels(), mocked_labels)
84106

107+
with mock_oc_env():
108+
with mock_gce_env():
109+
resource = monitored_resource.get_instance()
110+
self.assertEqual(resource.get_type(), 'mock_resource_type')
111+
self.assertDictContainsSubset(
112+
{'mock_label_key': 'mock_label_value'}, resource.get_labels())
113+
self.assertDictContainsSubset(mocked_labels, resource.get_labels())
114+
85115
@mock.patch('opencensus.common.monitored_resource.monitored_resource'
86116
'.gcp_metadata_config.GcpMetadataConfig')
87117
def test_gcp_gke_monitored_resource(self, gcp_metadata_mock):
@@ -99,11 +129,20 @@ def test_gcp_gke_monitored_resource(self, gcp_metadata_mock):
99129
gcp_metadata_mock.return_value = mock.Mock()
100130
gcp_metadata_mock.return_value.get_gke_metadata.return_value =\
101131
mocked_labels
102-
with mock_gke_env():
103-
resource = monitored_resource.get_instance()
132+
with no_oc_env():
133+
with mock_gke_env():
134+
resource = monitored_resource.get_instance()
104135
self.assertEquals(resource.get_type(), 'gke_container')
105136
self.assertEquals(resource.get_labels(), mocked_labels)
106137

138+
with mock_oc_env():
139+
with mock_gke_env():
140+
resource = monitored_resource.get_instance()
141+
self.assertEqual(resource.get_type(), 'mock_resource_type')
142+
self.assertDictContainsSubset(
143+
{'mock_label_key': 'mock_label_value'}, resource.get_labels())
144+
self.assertDictContainsSubset(mocked_labels, resource.get_labels())
145+
107146
@mock.patch('opencensus.common.monitored_resource.monitored_resource'
108147
'.aws_identity_doc_utils.AwsIdentityDocumentUtils')
109148
def test_aws_monitored_resource(self, aws_metadata_mock):
@@ -118,32 +157,54 @@ def test_aws_monitored_resource(self, aws_metadata_mock):
118157
aws_metadata_mock.return_value.get_aws_metadata.return_value =\
119158
mocked_labels
120159

121-
with mock_aws_env():
122-
resource = monitored_resource.get_instance()
160+
with no_oc_env():
161+
with mock_aws_env():
162+
resource = monitored_resource.get_instance()
123163
self.assertEquals(resource.get_type(), 'aws_ec2_instance')
124164
self.assertEquals(resource.get_labels(), mocked_labels)
125165

166+
with mock_oc_env():
167+
with mock_aws_env():
168+
resource = monitored_resource.get_instance()
169+
self.assertEqual(resource.get_type(), 'mock_resource_type')
170+
self.assertDictContainsSubset(
171+
{'mock_label_key': 'mock_label_value'}, resource.get_labels())
172+
self.assertDictContainsSubset(mocked_labels, resource.get_labels())
173+
126174
def test_gke_environment(self):
127175
patch = mock.patch.dict(os.environ,
128176
{'KUBERNETES_SERVICE_HOST': '127.0.0.1'})
129177

130-
with patch:
131-
mr = monitored_resource.get_instance()
178+
with no_oc_env():
179+
with patch:
180+
mr = monitored_resource.get_instance()
181+
self.assertIsNotNone(mr)
182+
self.assertEqual(mr.get_type(), "gke_container")
132183

133-
self.assertIsNotNone(mr)
134-
self.assertEqual(mr.get_type(), "gke_container")
184+
with mock_oc_env():
185+
mr = monitored_resource.get_instance()
186+
self.assertEqual(mr.get_type(), 'mock_resource_type')
187+
self.assertDictContainsSubset(
188+
{'mock_label_key': 'mock_label_value'}, mr.get_labels())
135189

136190
def test_gce_environment(self):
137191
patch = mock.patch(
138192
'opencensus.common.monitored_resource.'
139193
'gcp_metadata_config.GcpMetadataConfig.'
140194
'is_running_on_gcp',
141195
return_value=True)
142-
with patch:
143-
mr = monitored_resource.get_instance()
196+
with no_oc_env():
197+
with patch:
198+
mr = monitored_resource.get_instance()
144199

145-
self.assertIsNotNone(mr)
146-
self.assertEqual(mr.get_type(), "gce_instance")
200+
self.assertIsNotNone(mr)
201+
self.assertEqual(mr.get_type(), "gce_instance")
202+
203+
with mock_oc_env():
204+
mr = monitored_resource.get_instance()
205+
self.assertEqual(mr.get_type(), 'mock_resource_type')
206+
self.assertDictContainsSubset(
207+
{'mock_label_key': 'mock_label_value'}, mr.get_labels())
147208

148209
@mock.patch('opencensus.common.monitored_resource.'
149210
'gcp_metadata_config.GcpMetadataConfig.is_running_on_gcp',
@@ -153,11 +214,17 @@ def test_gce_environment(self):
153214
'is_running_on_aws',
154215
return_value=True)
155216
def test_aws_environment(self, aws_util_mock, gcp_metadata_mock):
156-
mr = monitored_resource.get_instance()
157-
217+
with no_oc_env():
218+
mr = monitored_resource.get_instance()
158219
self.assertIsNotNone(mr)
159220
self.assertEqual(mr.get_type(), "aws_ec2_instance")
160221

222+
with mock_oc_env():
223+
mr = monitored_resource.get_instance()
224+
self.assertEqual(mr.get_type(), 'mock_resource_type')
225+
self.assertDictContainsSubset(
226+
{'mock_label_key': 'mock_label_value'}, mr.get_labels())
227+
161228
@mock.patch('opencensus.common.monitored_resource.'
162229
'gcp_metadata_config.GcpMetadataConfig.is_running_on_gcp',
163230
return_value=False)
@@ -166,6 +233,13 @@ def test_aws_environment(self, aws_util_mock, gcp_metadata_mock):
166233
'is_running_on_aws',
167234
return_value=False)
168235
def test_non_supported_environment(self, aws_util_mock, gcp_metadata_mock):
169-
mr = monitored_resource.get_instance()
170-
236+
with no_oc_env():
237+
mr = monitored_resource.get_instance()
171238
self.assertIsNone(mr)
239+
240+
with mock_oc_env():
241+
mr = monitored_resource.get_instance()
242+
self.assertIsNotNone(mr)
243+
self.assertEqual(mr.get_type(), 'mock_resource_type')
244+
self.assertDictEqual(
245+
mr.get_labels(), {'mock_label_key': 'mock_label_value'})

tests/unit/common/test_resource.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
except ImportError:
2020
from unittest import mock
2121

22+
import os
2223
import unittest
2324

2425
from opencensus.common import resource as resource_module
@@ -138,6 +139,13 @@ def test_merge_resource(self):
138139
self.assertDictEqual(
139140
merged.labels, {'lk1': 'lv11', 'lk2': 'lv22', 'lk3': 'lv33'})
140141

142+
def test_merge_resource_no_type(self):
143+
r1 = Resource(None)
144+
r2 = Resource(None)
145+
146+
merged = resource_module.merge_resources([r1, r2])
147+
self.assertEqual(merged.type, None)
148+
141149
def test_check_ascii_256(self):
142150
self.assertIsNone(resource_module.check_ascii_256(None))
143151

@@ -171,12 +179,20 @@ def test_get_from_env_no_type(self):
171179
with mock.patch.dict('os.environ', {
172180
'OC_RESOURCE_LABELS': 'k1=v1,k2=v2'
173181
}):
182+
try:
183+
del os.environ['OC_RESOURCE_TYPE']
184+
except KeyError:
185+
pass
174186
self.assertIsNone(resource_module.get_from_env())
175187

176188
def test_get_from_env_no_labels(self):
177189
with mock.patch.dict('os.environ', {
178190
'OC_RESOURCE_TYPE': 'opencensus.io/example',
179191
}):
192+
try:
193+
del os.environ['OC_RESOURCE_LABELS']
194+
except KeyError:
195+
pass
180196
resource = resource_module.get_from_env()
181197
self.assertEqual(resource.type, 'opencensus.io/example')
182198
self.assertDictEqual(resource.labels, {})

0 commit comments

Comments
 (0)