PHP 7.4.33
Preview: couch.py Size: 9.56 KB
//lib/fm-agent/plugins/couch.py

import agent_util

try:
    # Python 2.x
    import httplib
except:
    import http.client as httplib


class CouchPlugin(agent_util.Plugin):
    textkey = "couch"
    label = "CouchDB"
    description = "Monitoring agent for CouchDB"

    @classmethod
    def get_metadata(self, config):
        status = agent_util.SUPPORTED
        msg = None
        response = None
        self.base_url = "/_stats"

        if not config:
            self.log.info("The [couch] config block is not found in the config file")
            return {}

        if "host" not in config or "port" not in config:
            msg = "The host and port settings were not found in the [couch] block of the agent config file."
            self.log.info(msg)
            status = agent_util.MISCONFIGURED

        if "base_url" in config:
            self.base_url = config["base_url"]

        if status == agent_util.SUPPORTED:
            try:
                couch_client = httplib.HTTPConnection(config["host"], config["port"])
                couch_client.request("GET", "/")
                response = couch_client.getresponse()
            except Exception:
                import sys

                _, exception, _ = sys.exc_info()
                status = agent_util.MISCONFIGURED
                msg = "Unable to connect to CouchDB server to request metrics"
                self.log.info("%s" % exception)

            if response and response.status != 200:
                status = agent_util.MISCONFIGURED
                mgs = "CouchDB Stats not found at %s:%s" % (
                    config["host"],
                    config["port"],
                )
                self.log.info(msg)

        return {
            "couchdb.database_writes": {
                "label": "Number of times a database was changed",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "times",
            },
            "couchdb.database_reads": {
                "label": "Number of times a document was read from a database",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "times",
            },
            "couchdb.open_databases": {
                "label": "Number of open databases",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "databases",
            },
            "couchdb.open_os_files": {
                "label": "Number of file descriptors CouchDB has open",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "files",
            },
            "couchdb.request_time": {
                "label": "Length of a request inside CouchDB without MochiWeb",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "ms",
            },
            "httpd.bulk_requests": {
                "label": "Number of bulk requests",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "requests",
            },
            "httpd.requests": {
                "label": "Number of HTTP requests",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "requests",
            },
            "httpd.temporary_view_reads": {
                "label": "Number of temporary view reads",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "reads",
            },
            "httpd.view_reads": {
                "label": "Number of view reads",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "reads",
            },
            "httpd_request_methods.COPY": {
                "label": "Number of HTTP COPY requests",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "requests",
            },
            "httpd_request_methods.DELETE": {
                "label": "Number of HTTP DELETE requests",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "requests",
            },
            "httpd_request_methods.GET": {
                "label": "Number of HTTP GET requests",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "requests",
            },
            "httpd_request_methods.HEAD": {
                "label": "Number of HTTP HEAD requests",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "requests",
            },
            "httpd_request_methods.MOVE": {
                "label": "Number of HTTP MOVE requests",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "requests",
            },
            "httpd_request_methods.POST": {
                "label": "Number of HTTP POST requests",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "requests",
            },
            "httpd_request_methods.PUT": {
                "label": "Number of HTTP PUT requests",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "requests",
            },
            "httpd_status_codes.200": {
                "label": "Number of HTTP 200 OK responses",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "responses",
            },
            "httpd_status_codes.201": {
                "label": "Number of HTTP 201 Created responses",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "responses",
            },
            "httpd_status_codes.202": {
                "label": "Number of HTTP 202 Accepted responses",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "responses",
            },
            "httpd_status_codes.301": {
                "label": "Number of HTTP 301 Moved Permanently responses",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "responses",
            },
            "httpd_status_codes.304": {
                "label": "Number of HTTP 304 Not Modified responses",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "responses",
            },
            "httpd_status_codes.400": {
                "label": "Number of HTTP 400 Bad Request responses",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "responses",
            },
            "httpd_status_codes.401": {
                "label": "Number of HTTP 401 Unauthorized responses",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "responses",
            },
            "httpd_status_codes.403": {
                "label": "Number of HTTP 403 Forbidden responses",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "responses",
            },
            "httpd_status_codes.404": {
                "label": "Number of HTTP 404 Not Found responses",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "responses",
            },
            "httpd_status_codes.405": {
                "label": "Number of HTTP 405 Method Not Allowed responses",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "responses",
            },
            "httpd_status_codes.409": {
                "label": "Number of HTTP 409 Conflict responses",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "responses",
            },
            "httpd_status_codes.412": {
                "label": "Number of HTTP 412 Precondition Failed responses",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "responses",
            },
            "httpd_status_codes.500": {
                "label": "Number of HTTP 500 Internal Server Error responses",
                "options": None,
                "status": status,
                "error_message": msg,
                "unit": "responses",
            },
        }

    def check(self, textkey, data, config):
        stat_area, stat_name = textkey.split(".")
        url = "/".join([self.base_url, stat_area, stat_name]) + "?range=60"
        try:
            couch_client = httplib.HTTPConnection(config["host"], config["port"])
            couch_client.request("GET", url)
        except Exception:
            return None
        response = couch_client.getresponse()
        stat = agent_util.json_loads(response.read())

        return stat[stat_area][stat_name]["current"]

Directory Contents

Dirs: 1 × Files: 55

Name Size Perms Modified Actions
- drwxr-xr-x 2025-06-19 05:08:01
Edit Download
20.07 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
13.66 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
6.34 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
22.59 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
9.46 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.89 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
9.56 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
32.09 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
7.33 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
16.80 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
38.95 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.90 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
930 B lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.00 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
5.07 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
4.68 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
13.46 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
13.21 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
13.58 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
8.39 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
3.34 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.54 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.64 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
6.04 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
26.56 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
16.61 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
20.40 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
5.58 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
12.33 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
6.44 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.98 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.30 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
15.51 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
8.88 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
5.61 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.60 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.99 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
21.37 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
17.23 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
19.85 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
11.31 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.42 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.42 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
6.59 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
3.28 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
7.09 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
19.11 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
4.62 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
3.61 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.09 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
4.73 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
4.91 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
13.84 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
19.20 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
0 B lrw-r--r-- 2025-06-18 20:44:50
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).