client.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. if IS_WINDOWS_PLATFORM:
  8. from docker.transport import NpipeHTTPAdapter
  9. class Status(Enum):
  10. SUCCESS = "success"
  11. FAILURE = "failure"
  12. CANCELED = "canceled"
  13. class MetricsSource:
  14. CLI = "docker-compose"
  15. if IS_WINDOWS_PLATFORM:
  16. METRICS_SOCKET_FILE = 'npipe://\\\\.\\pipe\\docker_cli'
  17. else:
  18. METRICS_SOCKET_FILE = 'http+unix:///var/run/docker-cli.sock'
  19. class MetricsCommand(requests.Session):
  20. """
  21. Representation of a command in the metrics.
  22. """
  23. def __init__(self, command,
  24. context_type=None, status=Status.SUCCESS,
  25. source=MetricsSource.CLI, uri=None):
  26. super().__init__()
  27. self.command = ("compose " + command).strip() if command else "compose --help"
  28. self.context = context_type or ContextAPI.get_current_context().context_type or 'moby'
  29. self.source = source
  30. self.status = status.value
  31. self.uri = uri or os.environ.get("METRICS_SOCKET_FILE", METRICS_SOCKET_FILE)
  32. if IS_WINDOWS_PLATFORM:
  33. self.mount("http+unix://", NpipeHTTPAdapter(self.uri))
  34. else:
  35. self.mount("http+unix://", UnixHTTPAdapter(self.uri))
  36. def send_metrics(self):
  37. try:
  38. return self.post("http+unix://localhost/usage",
  39. json=self.to_map(),
  40. timeout=.05,
  41. headers={'Content-Type': 'application/json'})
  42. except Exception as e:
  43. return e
  44. def to_map(self):
  45. return {
  46. 'command': self.command,
  47. 'context': self.context,
  48. 'source': self.source,
  49. 'status': self.status,
  50. }