# -*- coding: utf-8 -*-
# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Send swarming-proxy latency monitoring data to ts_mon."""

from __future__ import absolute_import
from __future__ import print_function


import sys
import time

from chromite.cbuildbot import commands
from chromite.cbuildbot import swarming_lib
from chromite.lib import commandline
from chromite.lib import cros_build_lib
from chromite.lib import metrics
from chromite.lib import timeout_util
from chromite.lib import ts_mon_config


assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'


def main(argv):
  parser = commandline.ArgumentParser(description=__doc__)
  parser.add_argument('swarming_server', action='store',
                      help='Swarming server to send no-op requests to.')
  options = parser.parse_args(argv)

  m_timer = 'chromeos/autotest/swarming_proxy/no_op_durations'
  m_count = 'chromeos/autotest/swarming_proxy/no_op_attempts'
  command = commands.RUN_SUITE_PATH
  fields = {'success': False, 'swarming_server': options.swarming_server}
  with ts_mon_config.SetupTsMonGlobalState('swarm_mon', indirect=True):
    while True:
      with metrics.SecondsTimer(m_timer, fields=fields) as f:
        try:
          with metrics.SuccessCounter(m_count):
            swarming_lib.RunSwarmingCommand([command, '--do_nothing'],
                                            options.swarming_server,
                                            dimensions=[('pool', 'default')],
                                            timeout_secs=120)
          f['success'] = True
        except (cros_build_lib.RunCommandError, timeout_util.TimeoutError):
          pass
      time.sleep(60)


if __name__ == '__main__':
  main(sys.argv)
