loki-reader-core 0.2.1__tar.gz → 0.2.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/PKG-INFO +1 -1
  2. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/pyproject.toml +1 -1
  3. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/src/loki_reader_core/__init__.py +1 -1
  4. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/src/loki_reader_core/client.py +35 -11
  5. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/.gitignore +0 -0
  6. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/README.md +0 -0
  7. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/build-publish.sh +0 -0
  8. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/dev-requirements.txt +0 -0
  9. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/src/loki_reader_core/exceptions.py +0 -0
  10. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/src/loki_reader_core/models/__init__.py +0 -0
  11. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/src/loki_reader_core/models/log_entry.py +0 -0
  12. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/src/loki_reader_core/models/log_stream.py +0 -0
  13. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/src/loki_reader_core/models/metric_sample.py +0 -0
  14. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/src/loki_reader_core/models/metric_series.py +0 -0
  15. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/src/loki_reader_core/models/query_result.py +0 -0
  16. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/src/loki_reader_core/models/query_stats.py +0 -0
  17. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/src/loki_reader_core/utils.py +0 -0
  18. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/tests/__init__.py +0 -0
  19. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/tests/test_client.py +0 -0
  20. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/tests/test_models.py +0 -0
  21. {loki_reader_core-0.2.1 → loki_reader_core-0.2.3}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: loki-reader-core
3
- Version: 0.2.1
3
+ Version: 0.2.3
4
4
  Summary: Python library for querying Grafana Loki logs via REST API
5
5
  Project-URL: Homepage, https://github.com/jmazzahacks/loki-reader-core
6
6
  Project-URL: Issues, https://github.com/jmazzahacks/loki-reader-core/issues
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "loki-reader-core"
3
- version = "0.2.1"
3
+ version = "0.2.3"
4
4
  authors = [
5
5
  { name="Jason Byteforge", email="jason@mzmail.me" },
6
6
  ]
@@ -6,7 +6,7 @@ from .client import LokiClient
6
6
  from .exceptions import LokiAuthError, LokiConnectionError, LokiError, LokiQueryError
7
7
  from .models import LogEntry, LogStream, MetricSample, MetricSeries, QueryResult, QueryStats
8
8
 
9
- __version__ = "0.2.1"
9
+ __version__ = "0.2.3"
10
10
 
11
11
  __all__ = [
12
12
  "LokiClient",
@@ -269,6 +269,20 @@ class LokiClient:
269
269
 
270
270
  return data
271
271
 
272
+ def _discovery_time_range(self) -> tuple[int, int]:
273
+ """Get a 30-day time range for label discovery queries.
274
+
275
+ Without a time range, Loki's label API only returns labels for
276
+ recently active streams. Using a 30-day window ensures we find
277
+ apps that haven't logged in a while.
278
+
279
+ Returns:
280
+ Tuple of (start_ns, end_ns) covering the last 30 days.
281
+ """
282
+ end = now_ns()
283
+ start = end - (30 * 24 * NANOSECONDS_PER_HOUR)
284
+ return (start, end)
285
+
272
286
  def _find_app_label(self, app_value: str) -> str:
273
287
  """Discover which label name contains the given app value.
274
288
 
@@ -436,6 +450,10 @@ class LokiClient:
436
450
  """
437
451
  Get list of available label names.
438
452
 
453
+ Defaults to a 30-day lookback when no time range is provided,
454
+ since Loki's label API may only return labels for recently
455
+ active streams without an explicit range.
456
+
439
457
  Args:
440
458
  start: Optional start timestamp in nanoseconds.
441
459
  end: Optional end timestamp in nanoseconds.
@@ -443,14 +461,15 @@ class LokiClient:
443
461
  Returns:
444
462
  List of label names.
445
463
  """
446
- params = {}
464
+ if start is None and end is None:
465
+ start, end = self._discovery_time_range()
447
466
 
448
- if start is not None:
449
- params["start"] = str(start)
450
- if end is not None:
451
- params["end"] = str(end)
467
+ params = {
468
+ "start": str(start),
469
+ "end": str(end),
470
+ }
452
471
 
453
- response = self._request("GET", "/loki/api/v1/labels", params or None)
472
+ response = self._request("GET", "/loki/api/v1/labels", params)
454
473
  return response.get("data", [])
455
474
 
456
475
  def get_label_values(
@@ -462,6 +481,10 @@ class LokiClient:
462
481
  """
463
482
  Get list of values for a specific label.
464
483
 
484
+ Defaults to a 30-day lookback when no time range is provided,
485
+ since Loki's label API may only return values for recently
486
+ active streams without an explicit range.
487
+
465
488
  Args:
466
489
  label: Label name to get values for.
467
490
  start: Optional start timestamp in nanoseconds.
@@ -470,12 +493,13 @@ class LokiClient:
470
493
  Returns:
471
494
  List of label values.
472
495
  """
473
- params = {}
496
+ if start is None and end is None:
497
+ start, end = self._discovery_time_range()
474
498
 
475
- if start is not None:
476
- params["start"] = str(start)
477
- if end is not None:
478
- params["end"] = str(end)
499
+ params = {
500
+ "start": str(start),
501
+ "end": str(end),
502
+ }
479
503
 
480
504
  endpoint = f"/loki/api/v1/label/{label}/values"
481
505
  response = self._request("GET", endpoint, params or None)