#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
# +------------------------------------------------------------------+
# |             ____ _               _        __  __ _  __           |
# |            / ___| |__   ___  ___| | __   |  \/  | |/ /           |
# |           | |   | '_ \ / _ \/ __| |/ /   | |\/| | ' /            |
# |           | |___| | | |  __/ (__|   <    | |  | | . \            |
# |            \____|_| |_|\___|\___|_|\_\___|_|  |_|_|\_\           |
# |                                                                  |
# | Copyright Mathias Kettner 2015             mk@mathias-kettner.de |
# +------------------------------------------------------------------+
#
# This file is part of Check_MK.
# The official homepage is at http://mathias-kettner.de/check_mk.
#
# check_mk is free software;  you can redistribute it and/or modify it
# under the  terms of the  GNU General Public License  as published by
# the Free Software Foundation in version 2.  check_mk is  distributed
# in the hope that it will be useful, but WITHOUT ANY WARRANTY;  with-
# out even the implied warranty of  MERCHANTABILITY  or  FITNESS FOR A
# PARTICULAR PURPOSE. See the  GNU General Public License for more de-
# tails. You should have  received  a copy of the  GNU  General Public
# License along with GNU Make; see the file  COPYING.  If  not,  write
# to the Free Software Foundation, Inc., 51 Franklin St,  Fifth Floor,
# Boston, MA 02110-1301 USA.

# https://www.unigma.com/2016/07/11/best-practices-for-monitoring-microsoft-azure/
factory_settings["azure_databases_default_levels"] = {
    "storage_percent_levels": (85., 95.),
    "cpu_percent_levels": (85., 95.),
    "dtu_percent_levels": (85., 95.),
}


@get_parsed_item_data
def check_azure_databases_storage(_item, params, resource):

    cmk_key = 'storage_percent'
    levels = params.get("%s_levels" % cmk_key)
    mcheck = check_azure_metric(
        resource, 'average_storage_percent', cmk_key, 'Storage', levels=levels, minv=0)
    if mcheck:
        state, text, perf = mcheck
        abs_storage_metric = resource.get('metrics', {}).get('average_storage')
        if abs_storage_metric is not None:
            text += " (%s)" % get_bytes_human_readable(abs_storage_metric.value)
        yield state, text, perf


check_info['azure_databases.storage'] = {
    'inventory_function': discover_azure_by_metrics('average_storage_percent'),
    'check_function': check_azure_databases_storage,
    'has_perfdata': True,
    'service_description': "DB %s Storage",
    'default_levels_variable': 'azure_databases_default_levels',
    'group': 'azure_databases',
}


@get_parsed_item_data
def check_azure_databases_deadlock(_item, params, resource):

    cmk_key = 'deadlocks'
    levels = params.get("%s_levels" % cmk_key)
    mcheck = check_azure_metric(
        resource, 'average_deadlock', cmk_key, 'Deadlocks', levels=levels, minv=0)
    if mcheck:
        yield mcheck


check_info['azure_databases.deadlock'] = {
    'inventory_function': discover_azure_by_metrics('average_deadlock'),
    'check_function': check_azure_databases_deadlock,
    'has_perfdata': True,
    'service_description': "DB %s Deadlocks",
    'default_levels_variable': 'azure_databases_default_levels',
    'group': 'azure_databases',
}


@get_parsed_item_data
def check_azure_databases_cpu(_item, params, resource):

    metrics = resource.get('metrics', {})

    cpu_percent = metrics.get('average_cpu_percent')
    util_params = {}
    if cpu_percent is not None:
        if "cpu_percent_levels" in params:
            util_params["levels"] = params["cpu_percent_levels"]
        for y in check_cpu_util(cpu_percent.value, util_params):
            yield y


check_info['azure_databases.cpu'] = {
    'inventory_function': discover_azure_by_metrics('average_cpu_percent'),
    'check_function': check_azure_databases_cpu,
    'has_perfdata': True,
    'service_description': "DB %s CPU",
    'default_levels_variable': 'azure_databases_default_levels',
    'group': 'azure_databases',
}


@get_parsed_item_data
def check_azure_databases_dtu(_item, params, resource):

    cmk_key = 'dtu_percent'
    levels = params.get("%s_levels" % cmk_key)
    mcheck = check_azure_metric(
        resource,
        'average_dtu_consumption_percent',
        cmk_key,
        'Database throughput units',
        levels=levels,
        minv=0)
    if mcheck:
        yield mcheck


check_info['azure_databases.dtu'] = {
    'inventory_function': discover_azure_by_metrics('average_dtu_consumption_percent'),
    'check_function': check_azure_databases_dtu,
    'has_perfdata': True,
    'service_description': "DB %s DTU",
    'default_levels_variable': 'azure_databases_default_levels',
    'group': 'azure_databases',
}

_AZURE_CONNECTIONS_METRICS = (
    # metric key                      cmk key,                   display                       use_rate
    ("average_connection_successful", "connections", "Successful connections", False),
    ("average_connection_failed", "connections_failed_rate", "Rate of failed connections", True),
)


@get_parsed_item_data
def check_azure_databases_connections(_item, params, resource):

    for key, cmk_key, displ, use_rate in _AZURE_CONNECTIONS_METRICS:
        levels = params.get("%s_levels" % cmk_key)
        mcheck = check_azure_metric(
            resource, key, cmk_key, displ, levels=levels, minv=0, use_rate=use_rate)
        if mcheck:
            yield mcheck


check_info['azure_databases.connections'] = {
    'inventory_function': discover_azure_by_metrics('average_connection_successful',
                                                    'average_connection_failed'),
    'check_function': check_azure_databases_connections,
    'has_perfdata': True,
    'service_description': "DB %s Connections",
    'default_levels_variable': 'azure_databases_default_levels',
    'group': 'azure_databases',
}


@get_parsed_item_data
def check_azure_databases(_item, _no_params, resource):
    for k, v in azure_iter_informative_attrs(resource):
        yield 0, "%s: %s" % (k, v)


check_info['azure_databases'] = {
    'parse_function': parse_azure,
    'inventory_function': discover(),
    'check_function': check_azure_databases,
    'service_description': "DB %s",
    'includes': ['azure.include', 'cpu_util.include'],
    'default_levels_variable': 'azure_databases_default_levels',
    'group': 'azure_databases',
}
