assemblyline-core 4.5.1.dev72__tar.gz → 4.5.1.dev76__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.

Potentially problematic release.


This version of assemblyline-core might be problematic. Click here for more details.

Files changed (88) hide show
  1. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/PKG-INFO +1 -1
  2. assemblyline-core-4.5.1.dev76/assemblyline_core/VERSION +1 -0
  3. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/metrics/heartbeat_formatter.py +48 -0
  4. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/metrics/metrics_server.py +64 -0
  5. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/scaler/controllers/docker_ctl.py +4 -1
  6. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core.egg-info/PKG-INFO +1 -1
  7. assemblyline-core-4.5.1.dev72/assemblyline_core/VERSION +0 -1
  8. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/LICENCE.md +0 -0
  9. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/README.md +0 -0
  10. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/__init__.py +0 -0
  11. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/alerter/__init__.py +0 -0
  12. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/alerter/processing.py +0 -0
  13. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/alerter/run_alerter.py +0 -0
  14. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/archiver/__init__.py +0 -0
  15. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/archiver/run_archiver.py +0 -0
  16. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/badlist_client.py +0 -0
  17. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/dispatching/__init__.py +0 -0
  18. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/dispatching/__main__.py +0 -0
  19. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/dispatching/client.py +0 -0
  20. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/dispatching/dispatcher.py +0 -0
  21. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/dispatching/schedules.py +0 -0
  22. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/dispatching/timeout.py +0 -0
  23. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/expiry/__init__.py +0 -0
  24. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/expiry/run_expiry.py +0 -0
  25. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/ingester/__init__.py +0 -0
  26. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/ingester/__main__.py +0 -0
  27. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/ingester/constants.py +0 -0
  28. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/ingester/ingester.py +0 -0
  29. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/metrics/__init__.py +0 -0
  30. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/metrics/es_metrics.py +0 -0
  31. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/metrics/helper.py +0 -0
  32. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/metrics/run_heartbeat_manager.py +0 -0
  33. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/metrics/run_metrics_aggregator.py +0 -0
  34. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/metrics/run_statistics_aggregator.py +0 -0
  35. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/plumber/__init__.py +0 -0
  36. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/plumber/run_plumber.py +0 -0
  37. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/replay/__init__.py +0 -0
  38. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/replay/client.py +0 -0
  39. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/replay/creator/__init__.py +0 -0
  40. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/replay/creator/run.py +0 -0
  41. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/replay/creator/run_worker.py +0 -0
  42. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/replay/loader/__init__.py +0 -0
  43. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/replay/loader/run.py +0 -0
  44. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/replay/loader/run_worker.py +0 -0
  45. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/replay/replay.py +0 -0
  46. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/safelist_client.py +0 -0
  47. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/scaler/__init__.py +0 -0
  48. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/scaler/collection.py +0 -0
  49. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/scaler/controllers/__init__.py +0 -0
  50. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/scaler/controllers/interface.py +0 -0
  51. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/scaler/controllers/kubernetes_ctl.py +0 -0
  52. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/scaler/run_scaler.py +0 -0
  53. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/scaler/scaler_server.py +0 -0
  54. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/server_base.py +0 -0
  55. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/signature_client.py +0 -0
  56. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/submission_client.py +0 -0
  57. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/tasking_client.py +0 -0
  58. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/updater/__init__.py +0 -0
  59. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/updater/helper.py +0 -0
  60. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/updater/run_updater.py +0 -0
  61. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/vacuum/__init__.py +0 -0
  62. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/vacuum/crawler.py +0 -0
  63. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/vacuum/department_map.py +0 -0
  64. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/vacuum/safelist.py +0 -0
  65. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/vacuum/stream_map.py +0 -0
  66. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/vacuum/worker.py +0 -0
  67. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/workflow/__init__.py +0 -0
  68. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core/workflow/run_workflow.py +0 -0
  69. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core.egg-info/SOURCES.txt +0 -0
  70. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core.egg-info/dependency_links.txt +0 -0
  71. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core.egg-info/requires.txt +0 -0
  72. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/assemblyline_core.egg-info/top_level.txt +0 -0
  73. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/setup.cfg +0 -0
  74. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/setup.py +0 -0
  75. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/test/test_alerter.py +0 -0
  76. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/test/test_badlist_client.py +0 -0
  77. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/test/test_dispatcher.py +0 -0
  78. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/test/test_expiry.py +0 -0
  79. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/test/test_plumber.py +0 -0
  80. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/test/test_replay.py +0 -0
  81. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/test/test_safelist_client.py +0 -0
  82. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/test/test_scaler.py +0 -0
  83. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/test/test_scheduler.py +0 -0
  84. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/test/test_signature_client.py +0 -0
  85. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/test/test_simulation.py +0 -0
  86. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/test/test_vacuum.py +0 -0
  87. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/test/test_worker_ingest.py +0 -0
  88. {assemblyline-core-4.5.1.dev72 → assemblyline-core-4.5.1.dev76}/test/test_worker_submit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: assemblyline-core
3
- Version: 4.5.1.dev72
3
+ Version: 4.5.1.dev76
4
4
  Summary: Assemblyline 4 - Core components
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-core/
6
6
  Author: CCCS Assemblyline development team
@@ -0,0 +1 @@
1
+ 4.5.1.dev76
@@ -7,6 +7,7 @@ from assemblyline.common.archiving import ARCHIVE_QUEUE_NAME
7
7
  from assemblyline.common.constants import DISPATCH_TASK_HASH, SUBMISSION_QUEUE, \
8
8
  SERVICE_STATE_HASH, ServiceStatus
9
9
  from assemblyline.datastore.exceptions import SearchException
10
+ from assemblyline.odm.messages.retrohunt_heartbeat import RetrohuntMessage
10
11
  from assemblyline.odm.messages.scaler_heartbeat import ScalerMessage
11
12
  from assemblyline.odm.messages.scaler_status_heartbeat import ScalerStatusMessage
12
13
  from assemblyline.odm.messages.alerter_heartbeat import AlerterMessage
@@ -15,6 +16,7 @@ from assemblyline.odm.messages.dispatcher_heartbeat import DispatcherMessage
15
16
  from assemblyline.odm.messages.expiry_heartbeat import ExpiryMessage
16
17
  from assemblyline.odm.messages.ingest_heartbeat import IngestMessage
17
18
  from assemblyline.odm.messages.service_heartbeat import ServiceMessage
19
+ from assemblyline.odm.messages.shard_heartbeat import ShardMessage
18
20
  from assemblyline.odm.messages.vacuum_heartbeat import VacuumMessage
19
21
  from assemblyline.remote.datatypes import get_client
20
22
  from assemblyline.remote.datatypes.hash import Hash, ExpiringHash
@@ -289,5 +291,51 @@ class HeartbeatFormatter(object):
289
291
  except Exception:
290
292
  self.log.exception("An exception occurred while generating VacuumMessage")
291
293
 
294
+ elif m_type == "elastic_shards":
295
+ try:
296
+ msg = {
297
+ "sender": self.sender,
298
+ "msg": {
299
+ "instances": instances,
300
+ "request_time": m_data['request_time'],
301
+ "shard_sizes": m_data['shard_sizes'],
302
+ }
303
+ }
304
+ self.status_queue.publish(ShardMessage(msg).as_primitives())
305
+ self.log.info(f"Sent elastic shard heartbeat: {msg['msg']}")
306
+ except Exception:
307
+ self.log.exception("An exception occurred while generating ShardMessage")
308
+
309
+ elif m_type == "retrohunt":
310
+ try:
311
+
312
+ status = m_data.get('status', {})
313
+ fetcher = status.get('fetcher', {})
314
+ resources = status.get('resources', {})
315
+ storage = status.get('storage', {})
316
+ last_minute_cpu = sum(report.get('cpu_load_1m', 0) for report in resources.values())
317
+ memory = sum(report.get('memory', 0) for report in resources.values())
318
+ free_storage = [report.get('high_water', 0) - report.get('used', 0)
319
+ for report in storage.values()]
320
+
321
+ msg = {
322
+ "sender": self.sender,
323
+ "msg": {
324
+ 'instances': instances,
325
+ 'request_time': m_data['request_time'],
326
+ 'pending_files': fetcher.get('pending_files'),
327
+ 'ingested_last_minute': fetcher.get('last_minute_throughput'),
328
+ 'worker_storage_available': min(free_storage),
329
+ 'total_storage_available': sum(free_storage),
330
+ 'active_searches': status.get('active_searches'),
331
+ 'last_minute_cpu': last_minute_cpu,
332
+ 'total_memory_used': memory,
333
+ }
334
+ }
335
+ self.status_queue.publish(RetrohuntMessage(msg).as_primitives())
336
+ self.log.info(f"Sent retrohunt heartbeat: {msg['msg']}")
337
+ except Exception:
338
+ self.log.exception("An exception occurred while generating RetrohuntMessage")
339
+
292
340
  else:
293
341
  self.log.warning(f"Skipping unknown counter: {m_name} [{m_type}] ==> {m_data}")
@@ -3,6 +3,7 @@
3
3
  import tempfile
4
4
  import sys
5
5
  import time
6
+ import threading
6
7
  from collections import Counter
7
8
  from threading import Lock, Thread
8
9
  from os import environ, path
@@ -259,6 +260,7 @@ class HeartbeatManager(ServerBase):
259
260
  self.metrics_queue = CommsQueue(METRICS_QUEUE)
260
261
  self.scheduler = BackgroundScheduler(daemon=True)
261
262
  self.hm = HeartbeatFormatter("heartbeat_manager", self.log, config=self.config)
263
+ self.hauntedhouse_client = forge.get_hauntedhouse_client(self.config)
262
264
 
263
265
  self.counters_lock = Lock()
264
266
  self.counters = {}
@@ -281,6 +283,10 @@ class HeartbeatManager(ServerBase):
281
283
  self.scheduler.add_job(self._export_hearbeats, 'interval', seconds=self.config.core.metrics.export_interval)
282
284
  self.scheduler.start()
283
285
 
286
+ threading.Thread(target=self._call_interval, args=('es_shards', self._fetch_shards), daemon=True).start()
287
+ if self.config.retrohunt.enabled:
288
+ threading.Thread(target=self._call_interval, args=('retrohunt', self._fetch_retrohunt), daemon=True).start()
289
+
284
290
  while self.running:
285
291
  for msg in self.metrics_queue.listen():
286
292
  # APM Transaction start
@@ -316,6 +322,64 @@ class HeartbeatManager(ServerBase):
316
322
  if self.apm_client:
317
323
  self.apm_client.end_transaction('process_message', 'success')
318
324
 
325
+ def _call_interval(self, name, method):
326
+ while self.running:
327
+ # Run the heartbeat
328
+ send_time = time.time()
329
+ try:
330
+ method()
331
+ except Exception:
332
+ self.log.exception('Error running metric fetcher %s', name)
333
+
334
+ # Wait until we are inline with the heartbeat interval
335
+ elapsed = time.time() - send_time
336
+ remaining = self.config.core.metrics.export_interval - elapsed
337
+ if remaining > 0:
338
+ self.sleep(remaining)
339
+
340
+ def _fetch_shards(self):
341
+ request_time = None
342
+ sizes = {}
343
+ nodes = []
344
+ try:
345
+ # Pull shard data from elastisearch
346
+ start_time = time.time()
347
+ response = self.datastore.ds.client.cat.shards(bytes='b', format='json', master_timeout='5s')
348
+ for shard in response.body:
349
+ index = shard['index']
350
+ sizes.setdefault(index, 0)
351
+ sizes[index] = max(sizes[index], int(shard['store']))
352
+ nodes.append(shard['node'])
353
+ request_time = time.time() - start_time
354
+
355
+ finally:
356
+ # Export metrics heartbeat, send None and empty if an error occurs while getting the data
357
+ # the error will be logged in the outer function
358
+ metrics = {
359
+ 'shard_sizes': sizes,
360
+ 'request_time': request_time,
361
+ }
362
+ self.hm.send_heartbeat('elastic_shards', 'datastore', metrics, len(set(nodes)))
363
+
364
+ def _fetch_retrohunt(self):
365
+ status = {}
366
+ request_time = None
367
+ try:
368
+ # Pull status message from retrohunt
369
+ start_time = time.time()
370
+ status = self.hauntedhouse_client.status()
371
+ request_time = time.time() - start_time
372
+
373
+ finally:
374
+ metrics = {
375
+ 'request_time': request_time,
376
+ 'status': status,
377
+ }
378
+ instances = len(status.get('storage', {}))
379
+
380
+ # Export heartbeat
381
+ self.hm.send_heartbeat('retrohount', 'hauntedhouse', metrics, instances)
382
+
319
383
  def _export_hearbeats(self):
320
384
  try:
321
385
  self.heartbeat()
@@ -121,7 +121,10 @@ class DockerController(ControllerInterface):
121
121
  aliases=['service-server'])
122
122
 
123
123
  # As long as the current service server is still running, just block its exit code in this thread
124
- self.service_server.wait()
124
+ try:
125
+ self.service_server.wait()
126
+ except docker.errors.NotFound:
127
+ pass
125
128
 
126
129
  # If it does return, find the new service server
127
130
  self.service_server = self.find_service_server()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: assemblyline-core
3
- Version: 4.5.1.dev72
3
+ Version: 4.5.1.dev76
4
4
  Summary: Assemblyline 4 - Core components
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-core/
6
6
  Author: CCCS Assemblyline development team
@@ -1 +0,0 @@
1
- 4.5.1.dev72