Skip to content

Commit e64fbb1

Browse files
authored
Merge pull request #88 from michi88/fix-mutating-metrics
Fix metrics being mutated during report
2 parents 5736eed + 730cc8a commit e64fbb1

8 files changed

Lines changed: 23 additions & 25 deletions

File tree

.travis.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@ before_script:
1919
- python -m pydocstyle
2020
script:
2121
- python -m unittest discover
22-
- if [[ "${TRAVIS_PULL_REQUEST}" != "false" ]]; then
23-
test -n "$(git diff -G version= $TRAVIS_COMMIT_RANGE setup.py)";
24-
fi
22+
2523
deploy:
2624
- provider: pypi
2725
user: wavefront-cs

wavefront_sdk/client.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,9 @@ def __init__(self, server, token, max_queue_size=50000, batch_size=10000,
9292
if enable_internal_metrics:
9393
self._sdk_metrics_registry = registry.WavefrontSdkMetricsRegistry(
9494
wf_metric_sender=self,
95-
prefix='{}.core.sender.{}'.format(
96-
constants.SDK_METRIC_PREFIX, ingestion_type))
95+
prefix=f'{constants.SDK_METRIC_PREFIX}'
96+
f'.core.sender.{ingestion_type}'
97+
)
9798
else:
9899
self._sdk_metrics_registry = registry.WavefrontSdkMetricsRegistry(
99100
wf_metric_sender=None)
@@ -198,8 +199,8 @@ def _report(self, points, data_format, entity_prefix, report_errors):
198199
params=params, headers=self._headers,
199200
data=compressed_data)
200201

201-
self._sdk_metrics_registry.new_delta_counter('{}.report.{}'.format(
202-
entity_prefix, response.status_code)).inc()
202+
self._sdk_metrics_registry.new_delta_counter(
203+
f'{entity_prefix}.report.{response.status_code}').inc()
203204
response.raise_for_status()
204205
except Exception as error:
205206
report_errors.inc()

wavefront_sdk/client_factory.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,12 @@ def get_server_info_from_endpoint(self, url):
4343
base_url = urlparse(url)
4444
scheme = base_url.scheme
4545
if scheme == self.DIRECT_DATA_INGESTION_SCHEME:
46-
server = '{}://{}'.format(self.DIRECT_DATA_INGESTION_SCHEME,
47-
base_url.hostname)
46+
server = f'{self.DIRECT_DATA_INGESTION_SCHEME}://' \
47+
f'{base_url.hostname}'
4848
token = base_url.username
4949
elif scheme in (self.PROXY_SCHEME, self.HTTP_PROXY_SCHEME):
50-
server = '{}://{}:{}'.format(self.HTTP_PROXY_SCHEME,
51-
base_url.hostname, base_url.port)
50+
server = f'{self.HTTP_PROXY_SCHEME}://' \
51+
f'{base_url.hostname}:{base_url.port}'
5252
token = None
5353
else:
5454
raise RuntimeError("Unknown scheme specified while attempting to"

wavefront_sdk/common/constants.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
WAVEFRONT_TRACING_SPAN_FORMAT = 'trace'
1414

1515
# GREEK LETTER DELTA.
16-
DELTA_PREFIX = u'\u2206'
16+
DELTA_PREFIX = '\u2206'
1717

1818
# GREEK CAPITAL LETTER DELTA.
19-
DELTA_PREFIX_2 = u'\u0394'
19+
DELTA_PREFIX_2 = '\u0394'
2020

2121
# Heartbeat metric.
2222
HEART_BEAT_METRIC = '~component.heartbeat'

wavefront_sdk/common/metrics/registry.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ def _schedule_timer(self):
4141
# pylint: disable=broad-except
4242
def _report(self, timeout_secs=None):
4343
timestamp = time.time()
44-
for key, val in self.metrics.items():
44+
45+
# Copying the dict prevents concurrent modification while iterating
46+
for key, val in self.metrics.copy().items():
4547
if timeout_secs and time.time() - timestamp > timeout_secs:
4648
break
4749
name = self.prefix + key

wavefront_sdk/direct.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ def __init__(self,
9696
if enable_internal_metrics:
9797
self._sdk_metrics_registry = registry.WavefrontSdkMetricsRegistry(
9898
wf_metric_sender=self,
99-
prefix='{}.core.sender.direct'.format(
100-
constants.SDK_METRIC_PREFIX))
99+
prefix=f'{constants.SDK_METRIC_PREFIX}.core.sender.direct')
101100
else:
102101
self._sdk_metrics_registry = registry.WavefrontSdkMetricsRegistry(
103102
wf_metric_sender=None)
@@ -205,8 +204,8 @@ def _report(self, points, data_format, entity_prefix, report_errors):
205204
headers=self._headers,
206205
data=compressed_data)
207206
status_code = response.status_code
208-
self._sdk_metrics_registry.new_delta_counter('{}.report.{}'.format(
209-
entity_prefix, status_code)).inc()
207+
self._sdk_metrics_registry.new_delta_counter(
208+
f'{entity_prefix}.report.{status_code}').inc()
210209
except requests.exceptions.RequestException:
211210
report_errors.inc()
212211
return status_code

wavefront_sdk/entities/histogram/histogram_impl.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,17 +155,16 @@ def bulk_update_dist_by_thread_id(self, thread_id, means, counts):
155155
def get_centroids(self):
156156
"""Get list of centroids for dists of all threads in this minute."""
157157
centroids = []
158-
for thread_id in self.per_thread_dist:
159-
centroids.extend(
160-
self.per_thread_dist[thread_id].centroids_to_list())
158+
for _, digest in self.per_thread_dist.items():
159+
centroids.extend(digest.centroids_to_list())
161160
return centroids
162161

163162
def to_distribution(self):
164163
"""Convert to Distribution."""
165164
distributions = []
166-
for thread_id in self.per_thread_dist:
165+
for _, digest in self.per_thread_dist.items():
167166
centroids = [(centroid['m'], int(centroid['c'])) for centroid in
168-
self.per_thread_dist[thread_id].centroids_to_list()]
167+
digest.centroids_to_list()]
169168
distributions.append(
170169
Distribution(self.minute_millis, centroids))
171170
return distributions

wavefront_sdk/proxy.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ def __init__(self, host, metrics_port, distribution_port, tracing_port,
5858
if enable_internal_metrics:
5959
self._sdk_metrics_registry = registry.WavefrontSdkMetricsRegistry(
6060
wf_metric_sender=self,
61-
prefix='{}.core.sender.proxy'.format(
62-
constants.SDK_METRIC_PREFIX))
61+
prefix=f'{constants.SDK_METRIC_PREFIX}.core.sender.proxy')
6362
else:
6463
self._sdk_metrics_registry = registry.WavefrontSdkMetricsRegistry(
6564
wf_metric_sender=None)

0 commit comments

Comments
 (0)