Simplify agent args and correct parsing

This commit is contained in:
James Campbell 2024-05-17 00:19:55 -04:00
parent 02e50d6167
commit 318cdd5633
Signed by: james
GPG Key ID: 2287C33A40DC906A
2 changed files with 27 additions and 24 deletions

View File

@ -178,8 +178,8 @@ class Request:
""" """
A metric request A metric request
""" """
def __init__(self, key, args = {}): def __init__(self, metric_name, args = {}):
self.key = key self.metric_name = metric_name
self.args = args self.args = args
self.result = None self.result = None
@ -322,14 +322,14 @@ class Agent:
The agent side of the connector The agent side of the connector
""" """
@staticmethod @staticmethod
def run(config, key, args): def run(config, key):
# Connect to the socket # Connect to the socket
ipc = IPC(config, 'agent') ipc = IPC(config, 'agent')
try: try:
conn = ipc.connect() conn = ipc.connect()
# Send a request # Send a request
ipc.send(conn, "{},{}".format(key, args)) ipc.send(conn, key)
# Wait for a response # Wait for a response
res = ipc.recv(conn) res = ipc.recv(conn)
@ -379,26 +379,30 @@ class Server:
continue continue
# Get the request string (csv) # Get the request string (csv)
req_csv = ipc.recv(conn) key = ipc.recv(conn)
# Receive ipc request (csv) # Parse ipc request (csv)
try: try:
(key, args_str) = req_csv.split(',', 1) parts = key.split(',', 1)
metric_name = parts[0]
args_dict = {} args_dict = {}
if args_str is not None and args_str != "":
for (k, v) in [a.split('=', 1) for a in args_str.split(';')]: if len(parts) > 1:
for arg in parts[1].split(','):
(k, v) = arg.split('=', 1)
args_dict[k] = v args_dict[k] = v
except socket.timeout: except socket.timeout:
print("IPC communication timeout receiving request") print("IPC communication timeout receiving request")
conn.close() conn.close()
continue continue
except Exception: except Exception:
print("Received invalid request: '{}'".format(req_csv)) print("Received invalid request: '{}'".format(key))
ipc.send(conn, "ERROR: Invalid key")
conn.close() conn.close()
continue continue
# Create request object # Create request object
req = Request(key, args_dict) req = Request(metric_name, args_dict)
# Queue the request # Queue the request
try: try:
@ -447,9 +451,9 @@ class Worker(threading.Thread):
# Find the requested metrtic # Find the requested metrtic
try: try:
metric = self.config.metrics[req.key] metric = self.config.metrics[req.metric_name]
except KeyError: except KeyError:
req.set_result("ERROR: Unknown key '{}'".format(req.key)) req.set_result("ERROR: Unknown key '{}'".format(req.metric_name))
continue continue
# Get the DB version # Get the DB version
@ -528,21 +532,20 @@ def main():
parser.add_argument('-v', '--verbose', action='store_true') parser.add_argument('-v', '--verbose', action='store_true')
# Operational mode # Operational mode
parser.add_argument('-m', '--mode', choices=['agent', 'server'], required=True) parser.add_argument('-s', '--server', action='store_true')
# Agent options # Agent options
parser.add_argument('-k', '--key') parser.add_argument('key', nargs='?')
parser.add_argument('-a', '--args')
args = parser.parse_args() args = parser.parse_args()
if args.mode == 'agent': if args.server:
config = Config(args.config, read_metrics = False)
Agent.run(config, args.key, args.args)
else:
config = Config(args.config) config = Config(args.config)
Server.run(config) Server.run(config)
else:
config = Config(args.config, read_metrics = False)
Agent.run(config, args.key)
if __name__ == '__main__': if __name__ == '__main__':
main() main()
@ -560,13 +563,13 @@ class TestRequest:
def test_request_creation(self): def test_request_creation(self):
# Create result with no args # Create result with no args
req1 = Request('foo', {}) req1 = Request('foo', {})
assert req1.key == 'foo' assert req1.metric_name == 'foo'
assert len(req1.args) == 0 assert len(req1.args) == 0
assert req1.complete.locked() assert req1.complete.locked()
# Create result with args # Create result with args
req2 = Request('foo', {'arg1': 'value1', 'arg2': 'value2'}) req2 = Request('foo', {'arg1': 'value1', 'arg2': 'value2'})
assert req2.key == 'foo' assert req2.metric_name == 'foo'
assert len(req2.args) == 2 assert len(req2.args) == 2
assert req2.complete.locked() assert req2.complete.locked()

View File

@ -1 +1 @@
UserParameter=pgmon[*],/usr/local/bin/pgmon.py -c /etc/zabbix/pgmon.cfg -k "$1" -a "$2" UserParameter=pgmon[*],/usr/local/bin/pgmon.py -c /etc/zabbix/pgmon.cfg "$0"