client.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import os
  2. from enum import Enum
  3. import requests
  4. from docker import ContextAPI
  5. from docker.transport import UnixHTTPAdapter
  6. from compose.const import IS_WINDOWS_PLATFORM
  7. class Status(Enum):
  8. SUCCESS = "success"
  9. FAILURE = "failure"
  10. CANCELED = "canceled"
  11. class MetricsSource:
  12. CLI = "docker-compose"
  13. if IS_WINDOWS_PLATFORM:
  14. METRICS_SOCKET_FILE = 'http+unix://\\\\.\\pipe\\docker_cli'
  15. else:
  16. METRICS_SOCKET_FILE = 'http+unix:///var/run/metrics-docker-cli.sock'
  17. class MetricsCommand(requests.Session):
  18. """
  19. Representation of a command in the metrics.
  20. """
  21. def __init__(self, command,
  22. context_type=None, status=Status.SUCCESS,
  23. source=MetricsSource.CLI, uri=None):
  24. super().__init__()
  25. self.command = "compose " + command if command else "compose --help"
  26. self.context = context_type or ContextAPI.get_current_context().context_type or 'moby'
  27. self.source = source
  28. self.status = status.value
  29. self.uri = uri or os.environ.get("METRICS_SOCKET_FILE", METRICS_SOCKET_FILE)
  30. self.mount("http+unix://", UnixHTTPAdapter(self.uri))
  31. def send_metrics(self):
  32. try:
  33. return self.post("http+unix://localhost/", json=self.to_map(), timeout=.05)
  34. except Exception as e:
  35. return e
  36. def to_map(self):
  37. return {
  38. 'command': self.command,
  39. 'context': self.context,
  40. 'source': self.source,
  41. 'status': self.status,
  42. }