# Copyright (c) 2014 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.
"""Helper functions for testing stats module and elasticsearch
"""
import logging
import time
import common
import elasticsearch
from autotest_lib.client.common_lib.cros.graphite import es_utils
from autotest_lib.client.common_lib.cros.graphite import autotest_stats
# Defines methods in the stats class that can take in metadata.
TARGET_TO_STATS_CLASS = {
'timer': autotest_stats.Timer,
'gauge': autotest_stats.Gauge,
'raw': autotest_stats.Raw,
'average': autotest_stats.Average,
'counter': autotest_stats.Counter,
}
# Maps target type to method to trigger sending of metadata.
# This differs based on what each object does.
# For example, in order for timer to send something, its stop
# method must be called. This differs for other stats objects.
TARGET_TO_METHOD = {
'timer': 'stop',
'gauge': 'send',
'raw': 'send',
'average': 'send',
'counter': '_send',
}
# Default maximum number of entries to return from ES query
DEFAULT_NUM_ENTRIES = 100
class EsTestUtilException(Exception):
"""Exception raised when functions here fail. """
pass
def sequential_random_insert_ints(keys, num_entries, target_type, index,
host, port, use_http, udp_port,
between_insert_secs=0,
print_interval=10):
"""Inserts a bunch of random entries into the es database.
Keys are given, values are randomly generated.
@param keys: A list of keys
@param num_entries: Number of entries to insert
@param target_type: This must be in
['timer', 'gauge', 'raw', 'average', 'counter']
@param between_insert_secs: Time to sleep after each insert.
defaults to no sleep time.
@param print_interval: how often to print
defaults to every 10 entries.
@param index: Index of es db to insert to
@param host: host of es db
@param port: port of es db
"""
# We are going to start the value at 0 and increment it by one per val.
for i in range(num_entries):
if print_interval == 0 or i % print_interval == 0:
print(' Inserting entry #%s with keys %s into index "%s."'
% (i, str(keys), index))
metadata = {}
for value, key in enumerate(keys):
metadata[key] = value
# Subname and value are not important from metadata pov.
subname = 'metadata.test'
value = 10
stats_target = TARGET_TO_STATS_CLASS[target_type](subname,
metadata=metadata,
es=es_utils.ESMetadata(use_http=use_http, host=host,
port=port, index=index,
udp_port=udp_port))
if target_type == 'timer':
stats_target.start()
stats_target.stop()
else:
getattr(stats_target, TARGET_TO_METHOD[target_type])(subname, value)
time.sleep(between_insert_secs)
def clear_index(index, host, port, timeout, sleep_time=0.5, clear_timeout=5):
"""Clears index in es db located at host:port.
Warning: Will delete all data in es for a given index
@param index: Index of es db to clear
@param host: elasticsearch host
@param port: elasticsearch port
@param timeout: how long to wait while connecting to es.
@param sleep_time: time between tries of clear_index
defaults to 0.5 seconds
@param clear_timeout: how long to wait for index to be cleared.
defualts to 5 seconds
Will quit and throw error if not cleared. (Number of seconds)
"""
es = elasticsearch.Elasticsearch(host=host,
port=port,
timeout=timeout)
if es.indices.exists(index=index):
print 'deleting index %s' % (index)
es.indices.delete(index=index)
time_start = time.time()
while es.indices.exists(index=index):
print 'waiting until index is deleted...'
time.sleep(sleep_time)
if time.time() - time_start > clear_timeout:
raise EsTestUtilException('clear_index failed.')
print 'successfully deleted index %s' % (index)