Skip to content

Commit 9c932ae

Browse files
committed
Made changes suggested in Diego's review
1 parent f6f27be commit 9c932ae

File tree

2 files changed

+46
-58
lines changed

2 files changed

+46
-58
lines changed

exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/__init__.py

+16-20
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,15 @@ def basic_auth(self, basic_auth: Dict):
9191
if basic_auth:
9292
if "username" not in basic_auth:
9393
raise ValueError("username required in basic_auth")
94-
if (
95-
"password" not in basic_auth
96-
and "password_file" not in basic_auth
97-
):
94+
if "password_file" in basic_auth:
95+
if "password" in basic_auth:
96+
raise ValueError(
97+
"basic_auth cannot contain password and password_file"
98+
)
99+
with open(basic_auth["password_file"]) as file:
100+
basic_auth["password"] = file.readline().strip()
101+
elif "password" not in basic_auth:
98102
raise ValueError("password required in basic_auth")
99-
if "password" in basic_auth and "password_file" in basic_auth:
100-
raise ValueError(
101-
"basic_auth cannot contain password and password_file"
102-
)
103103
self._basic_auth = basic_auth
104104

105105
@property
@@ -154,10 +154,10 @@ def headers(self, headers: Dict):
154154
def export(
155155
self, export_records: Sequence[ExportRecord]
156156
) -> MetricsExportResult:
157-
timeseries = self.convert_to_timeseries(export_records)
158-
message = self.build_message(timeseries)
159-
headers = self.get_headers()
160-
return self.send_message(message, headers)
157+
timeseries = self._convert_to_timeseries(export_records)
158+
message = self._build_message(timeseries)
159+
headers = self._build_headers()
160+
return self._send_message(message, headers)
161161

162162
def shutdown(self) -> None:
163163
pass
@@ -301,13 +301,13 @@ def add_label(label_name, label_value):
301301
timeseries.samples.append(sample)
302302
return timeseries
303303

304-
def build_message(self, timeseries: Sequence[TimeSeries]) -> bytes:
304+
def _build_message(self, timeseries: Sequence[TimeSeries]) -> bytes:
305305
write_request = WriteRequest()
306306
write_request.timeseries.extend(timeseries)
307307
serialized_message = write_request.SerializeToString()
308308
return snappy.compress(serialized_message)
309309

310-
def get_headers(self) -> Dict:
310+
def _build_headers(self) -> Dict:
311311
headers = {
312312
"Content-Encoding": "snappy",
313313
"Content-Type": "application/x-protobuf",
@@ -318,16 +318,12 @@ def get_headers(self) -> Dict:
318318
headers[header_name] = header_value
319319
return headers
320320

321-
def send_message(
321+
def _send_message(
322322
self, message: bytes, headers: Dict
323323
) -> MetricsExportResult:
324324
auth = None
325325
if self.basic_auth:
326-
if "password" in self.basic_auth:
327-
auth = (self.basic_auth["username"], self.basic_auth["password"])
328-
elif "password_file":
329-
with open(self.basic_auth["password_file"]) as file:
330-
auth = (self.basic_auth["username"], file.readline())
326+
auth = (self.basic_auth["username"], self.basic_auth["password"])
331327

332328
cert = None
333329
verify = True

exporter/opentelemetry-exporter-prometheus-remote-write/tests/test_prometheus_remote_write_exporter.py

+30-38
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,7 @@ def test_convert_from_histogram(self):
266266
)
267267
timeseries = self.exporter._convert_from_histogram(histogram_record)
268268
self.assertEqual(timeseries[0], expected_le_0_timeseries)
269-
self.assertEqual(
270-
timeseries[1], expected_le_inf_timeseries,
271-
)
269+
self.assertEqual(timeseries[1], expected_le_inf_timeseries)
272270
self.assertEqual(timeseries[2], expected_count_timeseries)
273271

274272
# Ensures last value aggregator is correctly converted to timeseries
@@ -361,70 +359,64 @@ def create_label(name, value):
361359
sample.value = 5.0
362360

363361
timeseries = self.exporter._create_timeseries(
364-
export_record, "testname", 5.0,
362+
export_record, "testname", 5.0
365363
)
366364
self.assertEqual(timeseries, expected_timeseries)
367365

368366

369-
class ResponseStub:
370-
def __init__(self, status_code):
371-
self.status_code = status_code
372-
self.reason = "dummy_reason"
373-
self.content = "dummy_content"
374-
375-
376367
class TestExport(unittest.TestCase):
377368
# Initializes test data that is reused across tests
378369
def setUp(self):
379-
self._exporter = PrometheusRemoteWriteMetricsExporter(
370+
self.exporter = PrometheusRemoteWriteMetricsExporter(
380371
endpoint="/prom/test_endpoint"
381372
)
382373

383374
# Ensures export is successful with valid export_records and config
384-
@mock.patch("requests.post", return_value=ResponseStub(200))
375+
@patch("requests.post", return_value=Mock())
385376
def test_export(self, mock_post):
377+
mock_post.return_value.configure_mock(**{"status_code": 200})
386378
test_metric = Counter("testname", "testdesc", "testunit", int, None)
387-
labels = {"environment": "testing"}
379+
labels = get_dict_as_key({"environment": "testing"})
388380
record = ExportRecord(
389-
test_metric, labels, SumAggregator(), Resource({}),
381+
test_metric, labels, SumAggregator(), Resource({})
390382
)
391-
result = self._exporter.export([record])
383+
result = self.exporter.export([record])
392384
self.assertIs(result, MetricsExportResult.SUCCESS)
393385
self.assertEqual(mock_post.call_count, 1)
394386

395-
@mock.patch("requests.post", return_value=ResponseStub(200))
387+
@patch("requests.post", return_value=Mock())
396388
def test_valid_send_message(self, mock_post):
397-
result = self._exporter.send_message(bytes(), {})
389+
mock_post.return_value.configure_mock(**{"status_code": 200})
390+
result = self.exporter._send_message(bytes(), {})
398391
self.assertEqual(mock_post.call_count, 1)
399392
self.assertEqual(result, MetricsExportResult.SUCCESS)
400393

401-
@mock.patch("requests.post", return_value=ResponseStub(404))
394+
@patch("requests.post", return_value=Mock())
402395
def test_invalid_send_message(self, mock_post):
403-
result = self._exporter.send_message(bytes(), {})
396+
mock_post.return_value.configure_mock(
397+
**{
398+
"status_code": 404,
399+
"reason": "test_reason",
400+
"content": "test_content",
401+
}
402+
)
403+
result = self.exporter._send_message(bytes(), {})
404404
self.assertEqual(mock_post.call_count, 1)
405405
self.assertEqual(result, MetricsExportResult.FAILURE)
406406

407407
# Verifies that build_message calls snappy.compress and returns SerializedString
408-
@mock.patch("snappy.compress", return_value=bytes())
408+
@patch("snappy.compress", return_value=bytes())
409409
def test_build_message(self, mock_compress):
410-
test_timeseries = [
411-
TimeSeries(),
412-
TimeSeries(),
413-
]
414-
message = self._exporter.build_message(test_timeseries)
410+
message = self.exporter._build_message([TimeSeries()])
415411
self.assertEqual(mock_compress.call_count, 1)
416412
self.assertIsInstance(message, bytes)
417413

418414
# Ensure correct headers are added when valid config is provided
419-
def test_get_headers(self):
420-
self._exporter.headers = {"Custom Header": "test_header"}
421-
422-
headers = self._exporter.get_headers()
423-
self.assertEqual(headers.get("Content-Encoding", ""), "snappy")
424-
self.assertEqual(
425-
headers.get("Content-Type", ""), "application/x-protobuf"
426-
)
427-
self.assertEqual(
428-
headers.get("X-Prometheus-Remote-Write-Version", ""), "0.1.0"
429-
)
430-
self.assertEqual(headers.get("Custom Header", ""), "test_header")
415+
def test_build_headers(self):
416+
self.exporter.headers = {"Custom Header": "test_header"}
417+
418+
headers = self.exporter._build_headers()
419+
self.assertEqual(headers["Content-Encoding"], "snappy")
420+
self.assertEqual(headers["Content-Type"], "application/x-protobuf")
421+
self.assertEqual(headers["X-Prometheus-Remote-Write-Version"], "0.1.0")
422+
self.assertEqual(headers["Custom Header"], "test_header")

0 commit comments

Comments
 (0)