Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
with:
python-version: ${{ matrix.python-version }}
- name: Install Tox and other dependencies
run: pip install tox tox-docker wheel twine 'setuptools; python_version >= "3.12"'
run: pip install tox tox-docker wheel twine 'setuptools; python_version >= "3.12"' 'vcs-versioning; python_version >= "3.12"'
- name: Run tests with Tox
# Run tox using the version of Python in `PATH`
run: tox -e py
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ mock
isort
black
flake8
mypy
mypy<2.0.0
Comment thread
fmors marked this conversation as resolved.
Resolved

# Distribution
setuptools; python_version >= "3.12"
Expand Down
7 changes: 6 additions & 1 deletion tests/test_elasticsearch.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ def test_error_warning(self, mocked_logger):
"writing metric %r failure %r",
{
"timestamp": datetime(2016, 7, 13),
"@timestamp": datetime(2016, 7, 13),
Comment thread
fmors marked this conversation as resolved.
Resolved
"value": None,
"name": "test:metric",
},
Expand Down Expand Up @@ -159,7 +160,11 @@ def test_bulk_write_error(self, mocked_logger):
"time_execution.backends.elasticsearch.Elasticsearch.bulk",
side_effect=transport_error,
)
metrics = [1, 2, 3]
metrics = [
Comment thread
fmors marked this conversation as resolved.
Resolved
{"name": "metric.name", "value": 1, "timestamp": 1},
{"name": "metric.name", "value": 2, "timestamp": 2},
{"name": "metric.name", "value": 3, "timestamp": 3},
]
with es_index_error_ctx:
self.backend.bulk_write(metrics)
mocked_logger.warning.assert_called_once_with("bulk_write metrics %r failure %r", metrics, transport_error)
Expand Down
2 changes: 1 addition & 1 deletion tests/test_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ def generator_hook(func, func_args, func_kwargs) -> GeneratorHookReturnType:
assert func_args == (42,)
assert func_kwargs == {"bar": 100500}
assert not is_started, "the decorated function should not run just yet"
(response, _exception, _metrics) = yield
response, _exception, _metrics = yield
assert is_started
assert response == "response"
return {"key": "value"}
Expand Down
24 changes: 17 additions & 7 deletions time_execution/backends/elasticsearch.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import logging
from datetime import datetime
from datetime import datetime, timezone

from elasticsearch import Elasticsearch
from elasticsearch.exceptions import TransportError
from elasticsearch.exceptions import BadRequestError, TransportError

from time_execution.backends.base import BaseMetricsBackend

Expand All @@ -29,7 +29,7 @@ def __init__(
self.client = Elasticsearch(hosts=hosts, *args, **kwargs)

def get_index(self):
return self.index_pattern.format(index=self.index, date=datetime.now())
return self.index_pattern.format(index=self.index, date=datetime.now(timezone.utc).replace(tzinfo=None))

def write(self, name, **data):
"""
Expand All @@ -41,20 +41,24 @@ def write(self, name, **data):
"""

data["name"] = name
now = datetime.now(timezone.utc).replace(tzinfo=None)
if not ("timestamp" in data):
data["timestamp"] = datetime.utcnow()
data["timestamp"] = now
if not ("@timestamp" in data):
data["@timestamp"] = now
Comment thread
fmors marked this conversation as resolved.
Resolved

try:
index_params = {
"index": self.get_index(),
"id": None,
"body": data,
"op_type": "create",
Comment thread
fmors marked this conversation as resolved.
Resolved
}
if self.pipeline:
index_params["pipeline"] = self.pipeline

self.client.index(**index_params)
except TransportError as exc:
except (BadRequestError, TransportError) as exc:
logger.warning("writing metric %r failure %r", data, exc)

def bulk_write(self, metrics):
Expand All @@ -66,8 +70,14 @@ def bulk_write(self, metrics):
"""
actions = []
index = self.get_index()
now = datetime.now(timezone.utc).replace(tzinfo=None)
for metric in metrics:
actions.append({"index": {"_index": index}})
if not ("timestamp" in metric):
metric["timestamp"] = now
if not ("@timestamp" in metric):
metric["@timestamp"] = now
Comment thread
fmors marked this conversation as resolved.
Resolved

actions.append({"create": {"_index": index}})
Comment thread
fmors marked this conversation as resolved.
Resolved
actions.append(metric)

bulk_params = {"operations": actions}
Expand All @@ -76,5 +86,5 @@ def bulk_write(self, metrics):

try:
self.client.bulk(**bulk_params)
except TransportError as exc:
except (BadRequestError, TransportError) as exc:
logger.warning("bulk_write metrics %r failure %r", metrics, exc)
Loading