Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/killme2008/clj.monitor
Monitoring applications in clojure based on clojure-control.
https://github.com/killme2008/clj.monitor
Last synced: about 1 month ago
JSON representation
Monitoring applications in clojure based on clojure-control.
- Host: GitHub
- URL: https://github.com/killme2008/clj.monitor
- Owner: killme2008
- License: mit
- Created: 2012-05-12T05:39:19.000Z (over 12 years ago)
- Default Branch: master
- Last Pushed: 2012-05-12T14:16:05.000Z (over 12 years ago)
- Last Synced: 2024-09-16T18:57:11.852Z (about 2 months ago)
- Language: Clojure
- Homepage:
- Size: 142 KB
- Stars: 14
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
#Introduction
Monitoring applications in clojure based on [clojure-control](https://github.com/killme2008/clojure-control/).
#Leiningen dependency
[clj.monitor "1.0.0-beta"]
#Setup SSH
You must install a ssh agent on the machine where your `clj.monitor` runs on.
And then ,you must setup ssh to make sure logining your monitored application server from `clj.monitor` machine without typing password.Please see [HOWTO: set up ssh keys](http://pkeck.myweb.uga.edu/ssh/).#Getting started
Use `clj.monitor` in your clojure ns:
(ns clj.monitor.example
(:use [clj.monitor.core]
[control.core]
[clj.monitor.tasks]))First,we define a cluster using [clojure-control](https://github.com/killme2008/clojure-control/) `defcluster`:
(defcluster mysql
:clients [{:user "deploy" :host "mysql.app.com"}])Second,we define a monitor for `mysql` cluster:
(defmonitor mysql-monitor
;;Tasks to monitor mysql,we just ping mysql and make sure that average load in 5 minutes is less than 3
:tasks [(ping-mysql "root" "password")
(system-load :5 3)]
;;Mysql clusters for monitoring
:clusters [:mysql])The `mysql-monitor` try to ping mysql with `root` and `passowrd` and get average system load in 5 minutes,and execute the task on `mysql` cluster.
At last,start the monitors:
(start-monitors
:cron "* 0/5 * * * ?"
:alerts [(mail :from "[email protected]" :to "[email protected]")]
:monitors [mysql-monitor])If pinging mysql fails or mysql machine's average load in 5 minutes is greater than 3,it will send an alert email to address `[email protected]` from ` [email protected]`.Monitors will run every five minutes set by `* 0/5 * * * ?` -- a crontab-like string using [Quartz](http://quartz-scheduler.org/).
The alert message is like:
[Alert]:
{:msyql-monitor
{"(system-load :5 3)" {"mysql.app.com" false},
"(ping-mysql "root" "password)" {"msyql.app.com" true}}}It means that system load in 5 minutes is greater than 3(`false`),but mysql is still alive(`true`).
#Pre-defined tasks and alerts
##Tasks
* (ping-mysql "user" "pass"): `mysqladmin -u user -p'pass' ping`, make sure that returns mysql is alive.
* (mysql-slave-status "user" "pass"): `mysql -u user -p'pass' -e 'show slave status\G'` ,and make sure that it returns two `YES`.
* (count-process "process" min): `ps aux |grep [process] |grep -v -c grep`,make sure the returned number is greater than min.
* (service-status "app" sudo "error"): `sudo /etc/init.d/app status` ,make sure the returned output doesn't contains the error string.`sudo` is a boolean value to set whether running with sudo.
* (ping-redis "redis://host:port"): use redis ping command to ping redis,make sure it returns `PONG`.
* (system-load kind max): `uptime`, the `kind` is `:1`,`:5` or `:15`,make sure that system average load in 1,5,15 minutes is less than max value.You can define your own tasks by `deftask` in clojure-control,pelase see [Define tasks](https://github.com/killme2008/clojure-control/wiki/Define-tasks).
##Alerts
* (mail :from from :to to [:subject subject :body body]): send alert messages as email.When you set body,the email body will be replaced by your setting instead of alert messages.
* (console): write alert messages to console
* (log): write alert messages to log using tools.logging.You can install your own alert function by `clj.monitor.alerts/install-alert-fn`:
(use '[clj.monitor.alerts :only [install-alert-fn]])
(install-alert-fn :name (fn [rt & args] (println rt)))#API document
* [API document](http://fnil.net/clj.monitor)
#License
MIT licensed,the same with [clojure-control](https://github.com/killme2008/clojure-control/).