Skip to content

Commit 50a9fb9

Browse files
committed
wipwip
1 parent 6dccbd2 commit 50a9fb9

4 files changed

Lines changed: 199 additions & 37 deletions

File tree

elasticsearch_metrics/imps/elastic8.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -161,13 +161,13 @@ def check_djelme_setup(cls, using: str | None = None) -> bool:
161161
return bool(cls._index.get(using=using))
162162

163163
@classmethod
164-
def refresh_all(cls, using: str | None = None) -> None:
164+
def refresh_timeseries_indexes(cls, using: str | None = None) -> None:
165165
cls._get_connection(using).indices.refresh(
166166
index=cls.format_timeseries_index_pattern()
167167
)
168168

169169
@classmethod
170-
def each_index(
170+
def each_timeseries_index(
171171
cls, using: str | None = None
172172
) -> collections.abc.Iterator[tuple[str, dict[str, typing.Any]]]:
173173
_resp = cls._get_connection(using).indices.get(
@@ -289,11 +289,10 @@ def search_timeseries_range(
289289
_index_pattern = cls.format_timeseries_index_pattern_for_range(
290290
from_when, until_when
291291
)
292-
_timedepth = cls.get_timedepth()
293292
_timestamp_q = esdsl.query.Range(
294293
timestamp_parts={
295-
"gte": timeseries_naming.semverlike_timeparts(from_when, _timedepth),
296-
"lt": timeseries_naming.semverlike_timeparts(until_when, _timedepth),
294+
"gte": timeseries_naming.full_semverlike_timeparts(from_when),
295+
"lt": timeseries_naming.full_semverlike_timeparts(until_when),
297296
}
298297
)
299298
return cls.search(index=_index_pattern).filter(_timestamp_q)

elasticsearch_metrics/registry.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -255,10 +255,6 @@ def _get_recordtypes_for_app(
255255
)
256256
return self.all_recordtypes[app_label]
257257

258-
def _is_type_downstream_of_module(self, given_type: type, module_name: str) -> bool:
259-
_upstream_modules = (_cls.__module__ for _cls in given_type.__mro__)
260-
return module_name in _upstream_modules
261-
262258

263259
def _import_imp_module(imp_module_name: str) -> ProtoDjelmeImp:
264260
try:

elasticsearch_metrics/tests/dummy8app/metrics.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,23 @@ class Dummy8Event(djelme.EventRecord):
1212

1313
class Index:
1414
using = "my_elastic8_events"
15-
settings = {"refresh_interval": "0"} # immediate refresh
1615

1716

18-
class Dummy8EventWithExplicitNamePrefix(djelme.EventRecord):
17+
class Monthly8Event(djelme.EventRecord):
1918
intenzity: int
2019

2120
class Meta:
2221
timeseries_name_prefix = "dummy8evenz"
2322
timeseries_recordtype_name = "eventlog"
23+
timedepth = 2
2424

2525
class Index:
2626
using = "my_elastic8_events"
2727

2828

2929
class ThingHappened(djelme.EventRecord):
3030
thing_id: str = ""
31-
happen_code: str = ""
31+
happen_code: str | None = None
3232
dot_path: str | None = mapped_field(Text(analyzer=dot_path_analyzer), default=None)
3333
commentary: str | None = mapped_field(Text(), default=None)
3434

@@ -38,17 +38,17 @@ class Index:
3838

3939
class Meta:
4040
timeseries_recordtype_name = "happen"
41-
timedepth = 1
41+
timedepth = 1 # yearly timeseries indexes
4242

4343

4444
# TODO: tests using ThingHappeningsReport
4545
class ThingHappeningsReport(djelme.CyclicRecord):
46-
item_id: str
47-
item_type: str
46+
thing_id: str
47+
happen_count: int
4848

4949
class Index:
50-
settings = {"refresh_interval": "-1"}
5150
using = "my_elastic8_reports"
5251

5352
class Meta:
5453
timeseries_name_prefix = "blarg"
54+
timedepth = 2 # monthly timeseries indexes

elasticsearch_metrics/tests/test_imps_elastic8.py

Lines changed: 188 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
)
2424
from elasticsearch_metrics.tests.dummy8app.metrics import (
2525
Dummy8Event,
26-
Dummy8EventWithExplicitNamePrefix,
26+
Monthly8Event,
2727
ThingHappened,
2828
ThingHappeningsReport,
2929
)
@@ -37,55 +37,103 @@ def _es8_client(
3737
return _backend.elastic8_client
3838

3939

40-
class TestFormatIndexName(SimpleDjelmeTestCase):
40+
class TestNamesAndPatterns(SimpleDjelmeTestCase):
4141
def test_format_timeseries_index_name(self):
4242
date = dt.date(2020, 2, 14)
4343
self.assertEqual(
4444
Dummy8Event.format_timeseries_index_name(date),
4545
"dummy8app_dummy8event_2020_02_14_",
4646
)
47-
48-
def test_format_timeseries_index_name__cls_timedepth(self):
49-
date = dt.date(2020, 2, 14)
47+
self.assertEqual(
48+
Monthly8Event.format_timeseries_index_name(date),
49+
"dummy8evenz_eventlog_2020_02_",
50+
)
5051
self.assertEqual(
5152
ThingHappened.format_timeseries_index_name(date),
5253
"dummy8app_happen_2020_",
5354
)
5455
self.assertEqual(
5556
ThingHappeningsReport.format_timeseries_index_name(date),
56-
"blarg_thinghappeningsreport_2020_02_14_",
57+
"blarg_thinghappeningsreport_2020_02_",
5758
)
5859

5960
def test_format_index_name_respects_date_format_setting(self):
6061
with self.settings(DJELME_DEFAULT_TIMEDEPTH=4):
6162
date = dt.date(2020, 2, 14)
63+
# no timedepth set; use default setting
6264
self.assertEqual(
6365
Dummy8Event.format_timeseries_index_name(date),
6466
"dummy8app_dummy8event_2020_02_14_00_",
6567
)
68+
# timedepth set; ignore default setting
69+
self.assertEqual(
70+
Monthly8Event.format_timeseries_index_name(date),
71+
"dummy8evenz_eventlog_2020_02_",
72+
)
6673
self.assertEqual(
6774
ThingHappened.format_timeseries_index_name(date),
68-
"dummy8app_happen_2020_", # ThingHappened.Meta has timedepth=1
75+
"dummy8app_happen_2020_",
76+
)
77+
self.assertEqual(
78+
ThingHappeningsReport.format_timeseries_index_name(date),
79+
"blarg_thinghappeningsreport_2020_02_",
6980
)
7081

71-
72-
class TestFormatIndexPattern(SimpleDjelmeTestCase):
73-
def test_format_timeseries_index_pattern(self):
82+
def test_format_timeseries_index_pattern__lotsa_parts(self):
7483
_timeparts = (2020, 2, 14, 0, 1, 2)
7584
self.assertEqual(
7685
Dummy8Event.format_timeseries_index_pattern(_timeparts),
7786
"dummy8app_dummy8event_2020_02_14_*",
7887
)
88+
self.assertEqual(
89+
Monthly8Event.format_timeseries_index_pattern(_timeparts),
90+
"dummy8evenz_eventlog_2020_02_*",
91+
)
92+
self.assertEqual(
93+
ThingHappened.format_timeseries_index_pattern(_timeparts),
94+
"dummy8app_happen_2020_*",
95+
)
96+
self.assertEqual(
97+
ThingHappeningsReport.format_timeseries_index_pattern(_timeparts),
98+
"blarg_thinghappeningsreport_2020_02_*",
99+
)
79100

80-
def test_format_timeseries_index_pattern__cls_timedepth(self):
101+
def test_format_timeseries_index_pattern__some_parts(self):
81102
_timeparts = (2020, 2, 14)
103+
self.assertEqual(
104+
Dummy8Event.format_timeseries_index_pattern(_timeparts),
105+
"dummy8app_dummy8event_2020_02_14_*",
106+
)
107+
self.assertEqual(
108+
Monthly8Event.format_timeseries_index_pattern(_timeparts),
109+
"dummy8evenz_eventlog_2020_02_*",
110+
)
82111
self.assertEqual(
83112
ThingHappened.format_timeseries_index_pattern(_timeparts),
84113
"dummy8app_happen_2020_*",
85114
)
86115
self.assertEqual(
87116
ThingHappeningsReport.format_timeseries_index_pattern(_timeparts),
88-
"blarg_thinghappeningsreport_2020_02_14_*",
117+
"blarg_thinghappeningsreport_2020_02_*",
118+
)
119+
120+
def test_format_timeseries_index_pattern__one_part(self):
121+
_timeparts = (2020,)
122+
self.assertEqual(
123+
Dummy8Event.format_timeseries_index_pattern(_timeparts),
124+
"dummy8app_dummy8event_2020_*",
125+
)
126+
self.assertEqual(
127+
Monthly8Event.format_timeseries_index_pattern(_timeparts),
128+
"dummy8evenz_eventlog_2020_*",
129+
)
130+
self.assertEqual(
131+
ThingHappened.format_timeseries_index_pattern(_timeparts),
132+
"dummy8app_happen_2020_*",
133+
)
134+
self.assertEqual(
135+
ThingHappeningsReport.format_timeseries_index_pattern(_timeparts),
136+
"blarg_thinghappeningsreport_2020_*",
89137
)
90138

91139
def test_format_index_pattern_respects_date_format_setting(self):
@@ -95,9 +143,13 @@ def test_format_index_pattern_respects_date_format_setting(self):
95143
Dummy8Event.format_timeseries_index_pattern(_timeparts),
96144
"dummy8app_dummy8event_2020_02_14_00_*",
97145
)
146+
self.assertEqual(
147+
Monthly8Event.format_timeseries_index_pattern(_timeparts),
148+
"dummy8evenz_eventlog_2020_02_*",
149+
)
98150
self.assertEqual(
99151
ThingHappened.format_timeseries_index_pattern(_timeparts),
100-
"dummy8app_happen_2020_*", # ThingHappened.Meta has timedepth=1
152+
"dummy8app_happen_2020_*",
101153
)
102154

103155

@@ -138,12 +190,9 @@ def test_get_index_template_creates_template_with_mapping(self):
138190
assert properties["thing_id"] == {"type": "keyword"}
139191
assert properties["happen_code"] == {"type": "keyword"}
140192

141-
# regression test
142193
def test_mappings_are_not_shared(self):
143194
template1 = Dummy8Event.get_timeseries_template().to_dict()
144-
template2 = (
145-
Dummy8EventWithExplicitNamePrefix.get_timeseries_template().to_dict()
146-
)
195+
template2 = Monthly8Event.get_timeseries_template().to_dict()
147196
assert "intensity" in template1["template"]["mappings"]["properties"]
148197
assert "intenzity" not in template1["template"]["mappings"]["properties"]
149198
assert "intensity" not in template2["template"]["mappings"]["properties"]
@@ -169,7 +218,7 @@ class Meta:
169218
def test_template_name_defined_with_no_template_falls_back_to_default_template(
170219
self,
171220
):
172-
template = Dummy8EventWithExplicitNamePrefix.get_timeseries_template()
221+
template = Monthly8Event.get_timeseries_template()
173222
# prefix and recordtype specified in class Meta
174223
assert template._template_name == "dummy8evenz_eventlog__template"
175224
# template pattern generated using same options
@@ -338,7 +387,7 @@ def test_init(self):
338387
self.assertEqual(_properties["thing_id"], {"type": "keyword"})
339388
self.assertEqual(_properties["happen_code"], {"type": "keyword"})
340389
# no indexes; only the template
341-
self.assertFalse(list(ThingHappened.each_index()))
390+
self.assertFalse(list(ThingHappened.each_timeseries_index()))
342391

343392
def test_check_djelme_setup(self):
344393
with self.assertRaises(IndexTemplateNotFoundError):
@@ -371,10 +420,10 @@ def setUp(self):
371420
Dummy8Event.record(timestamp=dt.datetime(1235, 5, 6), intensity=111)
372421
Dummy8Event.record(timestamp=dt.datetime(2345, 6, 9), intensity=11)
373422
Dummy8Event.record(timestamp=dt.datetime(2345, 7, 9), intensity=13)
374-
Dummy8Event.refresh_all()
423+
Dummy8Event.refresh_timeseries_indexes()
375424

376425
def test_indexes(self):
377-
_index_names = {_name for _name, _ in Dummy8Event.each_index()}
426+
_index_names = {_name for _name, _ in Dummy8Event.each_timeseries_index()}
378427
self.assertEqual(
379428
_index_names,
380429
{
@@ -414,3 +463,121 @@ def _assert_intens(hits, expected_intensities):
414463
Dummy8Event.search_timeseries_range((1234, 6), dt.date(2345, 7, 1)),
415464
{7, 111, 11},
416465
)
466+
_assert_intens(
467+
Dummy8Event.search_timeseries_range((1234, 5, 6, 2), (1234, 5, 7)),
468+
{2},
469+
)
470+
471+
472+
class TestMonthlyIndexes(RealElasticTestCase, autosetup_djelme_backends=True):
473+
def setUp(self):
474+
super().setUp()
475+
Monthly8Event.record(timestamp=dt.datetime(1234, 5, 6), intenzity=1)
476+
Monthly8Event.record(timestamp=dt.datetime(1234, 5, 6, 7), intenzity=2)
477+
Monthly8Event.record(timestamp=dt.datetime(1234, 5, 7), intenzity=3)
478+
Monthly8Event.record(timestamp=dt.datetime(1234, 6, 1), intenzity=7)
479+
Monthly8Event.record(timestamp=dt.datetime(1235, 5, 6), intenzity=111)
480+
Monthly8Event.record(timestamp=dt.datetime(2345, 6, 9), intenzity=11)
481+
Monthly8Event.record(timestamp=dt.datetime(2345, 7, 9), intenzity=13)
482+
Monthly8Event.refresh_timeseries_indexes()
483+
484+
def test_indexes(self):
485+
_index_names = {_name for _name, _ in Monthly8Event.each_timeseries_index()}
486+
self.assertEqual(
487+
_index_names,
488+
{
489+
"dummy8evenz_eventlog_1234_05_",
490+
"dummy8evenz_eventlog_1234_06_",
491+
"dummy8evenz_eventlog_1235_05_",
492+
"dummy8evenz_eventlog_2345_06_",
493+
"dummy8evenz_eventlog_2345_07_",
494+
},
495+
)
496+
497+
def test_search(self):
498+
def _assert_intenz(hits, expected_intenzities):
499+
_actual = {_hit.intenzity for _hit in hits}
500+
self.assertEqual(_actual, expected_intenzities)
501+
502+
_assert_intenz(
503+
Monthly8Event.search(),
504+
{1, 2, 3, 7, 11, 13, 111},
505+
)
506+
_assert_intenz(
507+
Monthly8Event.search_timeseries_range((1234,), (1235,)),
508+
{1, 2, 3, 7},
509+
)
510+
_assert_intenz(
511+
Monthly8Event.search_timeseries_range((1233,), (1234,)),
512+
set(),
513+
)
514+
_assert_intenz(
515+
Monthly8Event.search_timeseries_range(
516+
dt.date(1234, 5, 6), dt.date(1234, 5, 7)
517+
),
518+
{1, 2},
519+
)
520+
_assert_intenz(
521+
Monthly8Event.search_timeseries_range((1234, 6), dt.date(2345, 7, 1)),
522+
{7, 111, 11},
523+
)
524+
_assert_intenz(
525+
Monthly8Event.search_timeseries_range((1234, 5, 6, 2), (1234, 5, 7)),
526+
{2},
527+
)
528+
529+
530+
class TestYearlyIndexes(RealElasticTestCase, autosetup_djelme_backends=True):
531+
def setUp(self):
532+
super().setUp()
533+
ThingHappened.record(timestamp=dt.datetime(1234, 5, 6), thing_id="a")
534+
ThingHappened.record(timestamp=dt.datetime(1234, 5, 6, 7), thing_id="b")
535+
ThingHappened.record(timestamp=dt.datetime(1234, 5, 7), thing_id="c")
536+
ThingHappened.record(timestamp=dt.datetime(1234, 6, 1), thing_id="d")
537+
ThingHappened.record(timestamp=dt.datetime(1235, 5, 6), thing_id="e")
538+
ThingHappened.record(timestamp=dt.datetime(2345, 6, 9), thing_id="f")
539+
ThingHappened.record(timestamp=dt.datetime(2345, 7, 9), thing_id="g")
540+
ThingHappened.refresh_timeseries_indexes()
541+
542+
def test_indexes(self):
543+
_index_names = {_name for _name, _ in ThingHappened.each_timeseries_index()}
544+
self.assertEqual(
545+
_index_names,
546+
{
547+
"dummy8app_happen_1234_",
548+
"dummy8app_happen_1235_",
549+
"dummy8app_happen_2345_",
550+
},
551+
)
552+
553+
def test_search(self):
554+
def _assert_things(hits, expected_thing_ids):
555+
_actual = {_hit.thing_id for _hit in hits}
556+
self.assertEqual(_actual, expected_thing_ids)
557+
558+
_assert_things(
559+
ThingHappened.search(),
560+
{"a", "b", "c", "d", "e", "f", "g"},
561+
)
562+
_assert_things(
563+
ThingHappened.search_timeseries_range((1234,), (1235,)),
564+
{"a", "b", "c", "d"},
565+
)
566+
_assert_things(
567+
ThingHappened.search_timeseries_range((1233,), (1234,)),
568+
set(),
569+
)
570+
_assert_things(
571+
ThingHappened.search_timeseries_range(
572+
dt.date(1234, 5, 6), dt.date(1234, 5, 7)
573+
),
574+
{"a", "b"},
575+
)
576+
_assert_things(
577+
ThingHappened.search_timeseries_range((1234, 6), dt.date(2345, 7, 1)),
578+
{"d", "e", "f"},
579+
)
580+
_assert_things(
581+
ThingHappened.search_timeseries_range((1234, 5, 6, 2), (1234, 5, 7)),
582+
{"b"},
583+
)

0 commit comments

Comments
 (0)