2 # -*- coding: utf-8 -*-
4 # Server monitoring system
6 # Copyright © 2011 Rodrigo Eduardo Lazo Paz
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
23 """Launching script."""
26 __author__
= "rlazo.paz@gmail.com (Rodrigo Lazo)"
35 sys
.path
.append(os
.path
.join(os
.path
.dirname(__file__
), "lib"))
37 from multiprocessing
import Process
, managers
38 from monitor
.collector
import HttpCollector
39 from monitor
import http_display
40 from monitor
import datastore
43 MANAGER_PORT
= 0 # auto-generated
44 MANAGER_AUTHKEY
= 'xlz98'
47 class MonitorManager(managers
.SyncManager
):
48 """Custom multiprocessing manager."""
52 def timed_collector(sources
, interval
):
53 """Runs collector in intervals.
55 This method executes and infinite loop collecting data each
56 `interval` seconds. The `DataStore` object used to store the
57 retrieved data is a remote object obtained from a `MonitorManager`.
61 - `sources`: Iterable, pairs of (hostname, port) to use for collection.
62 - `interval`: Integer, seconds between collections.
65 manager
= MonitorManager(address
=('localhost', MANAGER_PORT
),
66 authkey
=MANAGER_AUTHKEY
)
68 store
= manager
.get_store()
69 collector
= HttpCollector(sources
)
71 collected_data
= collector
.collect()
72 store
.insert_dict(collected_data
)
77 """Runs the http exporter interface.
79 This method executes an HTTP server
80 (`monitor.displayer.http_display`). The `DataStore` object used to
81 call this method is a remote object obtained from a
85 manager
= MonitorManager(address
=('localhost', MANAGER_PORT
),
86 authkey
=MANAGER_AUTHKEY
)
88 store
= manager
.get_store()
89 http_display
.main(store
, port
,
90 "/home/rodrigo/workspace/monitor/monitor/www_templates/")
94 """Main function, launches process for each part of the system."""
95 parser
= argparse
.ArgumentParser(description
="Server monitoring system.")
96 parser
.add_argument('--http-port', metavar
="PORT", type=int, default
=9012,
97 help="Port for the HTTP server (displayer).")
98 parser
.add_argument('--collection-interval', metavar
="SECONDS",
100 help="Interval, in seconds, between data collections.")
102 group
= parser
.add_mutually_exclusive_group(required
=True)
103 group
.add_argument('--remote-servers', nargs
="+",
104 help=("List, separated by spaces, of remote servers "
105 "(HOST:PORT) to monitor."))
106 group
.add_argument('--snapshot', metavar
="SNAPSHOT-FILE", type=str,
107 help="Filename of the snapshot to load.")
108 args
= parser
.parse_args()
111 mstore
= manager
.get_store()
112 mstore
.load(args
.snapshot
)
114 sources
= [x
.split(':') for x
in args
.remote_servers
]
115 collector_p
= Process(target
=timed_collector
,
116 args
=(sources
, args
.collection_interval
))
118 displayer_p
= Process(target
=displayer
, args
=(args
.http_port
,))
120 if not args
.snapshot
:
125 if __name__
== '__main__':
126 store
= datastore
.DataStore()
127 MonitorManager
.register('get_store', callable=lambda: store
)
128 manager
= MonitorManager(address
=('', 0),
129 authkey
=MANAGER_AUTHKEY
)
131 MANAGER_PORT
= manager
.address
[-1]