blob: a387e2afd5ead2cb9e7a1c12ee613a380874b091 [file] [log] [blame]
Allen Li24bf8182017-03-02 16:41:20 -08001# Copyright 2017 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Git repo metrics."""
6
7from __future__ import absolute_import
8from __future__ import print_function
9from __future__ import unicode_literals
10
11import os
12import subprocess
13
Allen Li24bf8182017-03-02 16:41:20 -080014from chromite.lib import cros_logging as logging
15from infra_libs import ts_mon
16
17logger = logging.getLogger(__name__)
18
19
20class _GitRepo(object):
Paul Hobbse46a42b2017-03-21 14:04:13 -070021 """Helper class for running git commands."""
Allen Li24bf8182017-03-02 16:41:20 -080022
23 def __init__(self, gitdir):
24 self._gitdir = gitdir
25
26 def _get_git_command(self):
27 return ['git', '--git-dir', self._gitdir]
28
29 def _check_output(self, args, **kwargs):
30 return subprocess.check_output(
31 self._get_git_command() + list(args), **kwargs)
32
33 def get_commit_hash(self):
Allen Lid2333982017-04-04 17:03:32 -070034 """Return commit hash string."""
Allen Li24bf8182017-03-02 16:41:20 -080035 return self._check_output(['rev-parse', 'HEAD']).strip()
36
37 def get_commit_time(self):
Allen Lid2333982017-04-04 17:03:32 -070038 """Return commit time as UNIX timestamp int."""
Allen Li24bf8182017-03-02 16:41:20 -080039 return int(self._check_output(['show', '-s', '--format=%ct', 'HEAD'])
40 .strip())
41
42
43class _GitMetricCollector(object):
Paul Hobbse46a42b2017-03-21 14:04:13 -070044 """Class for collecting metrics about a git repository."""
Allen Li24bf8182017-03-02 16:41:20 -080045
46 _commit_hash_metric = ts_mon.StringMetric(
47 'git/hash',
48 description='Current Git commit hash.')
49
Allen Lid523d962017-04-04 16:48:36 -070050 _timestamp_metric = ts_mon.GaugeMetric(
51 'git/timestamp',
Allen Li24bf8182017-03-02 16:41:20 -080052 description='Current Git commit time as seconds since Unix Epoch.')
53
54 def __init__(self, gitdir, metric_path):
55 self._gitdir = gitdir
56 self._gitrepo = _GitRepo(gitdir)
57 self._fields = {'repo': gitdir}
58 self._metric_path = metric_path
59
60 def collect(self):
61 """Collect metrics."""
62 try:
63 self._collect_commit_hash_metric()
Allen Lid523d962017-04-04 16:48:36 -070064 self._collect_timestamp_metric()
Allen Li24bf8182017-03-02 16:41:20 -080065 except subprocess.CalledProcessError as e:
66 logger.warning('Error collecting git metrics for %s: %s',
67 self._gitdir, e)
68
69 def _collect_commit_hash_metric(self):
70 commit_hash = self._gitrepo.get_commit_hash()
71 logger.debug('Collecting Git hash %r for %r', commit_hash, self._gitdir)
72 self._commit_hash_metric.set(commit_hash, self._fields)
73
Allen Lid523d962017-04-04 16:48:36 -070074 def _collect_timestamp_metric(self):
Allen Li24bf8182017-03-02 16:41:20 -080075 commit_time = self._gitrepo.get_commit_time()
Allen Lid523d962017-04-04 16:48:36 -070076 logger.debug('Collecting Git timestamp %r for %r',
Allen Li24bf8182017-03-02 16:41:20 -080077 commit_time, self._gitdir)
Allen Lid523d962017-04-04 16:48:36 -070078 self._timestamp_metric.set(commit_time, self._fields)
Allen Li24bf8182017-03-02 16:41:20 -080079
80
81_CHROMIUMOS_DIR = os.path.expanduser('~chromeos-test/chromiumos/')
82
83_repo_collectors = (
Allen Lia02d34a2017-04-04 17:13:46 -070084 # TODO(ayatane): We cannot access chromeos-admin because we are
85 # running as non-root.
86 _GitMetricCollector(gitdir='/root/chromeos-admin/.git',
87 metric_path='chromeos-admin'),
88 _GitMetricCollector(gitdir=_CHROMIUMOS_DIR + 'chromite/.git',
89 metric_path='chromite'),
90 _GitMetricCollector(gitdir='/usr/local/autotest/.git',
91 metric_path='installed_autotest'),
Allen Li24bf8182017-03-02 16:41:20 -080092)
93
94
95def collect_git_metrics():
96 """Collect metrics for Git repository state."""
97 for collector in _repo_collectors:
98 collector.collect()