Skip to content

Commit

Permalink
- Introduced filter capability: The Graphite lines can be filtered by…
Browse files Browse the repository at this point in the history
… regular expressions now. The matching behabior also be inverted (like grep -v). See README.md for usage details.

- The --print-only argument has been implemented, now. ;)
- Several other minor changes.
  • Loading branch information
descilla committed Apr 20, 2017
1 parent 7d5ab7b commit ba3dd27
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 11 deletions.
38 changes: 31 additions & 7 deletions GraphiteHandler.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,14 @@

import socket
import datetime
import re


class GraphiteHandler(object):

def __init__(self, server, port, alternative_now = None):
self.server = server
self.port = port
self.message = ''
self.entries = []
self.specialChars = dict.fromkeys(map(ord, ' +.\\/-'), '_')

Expand All @@ -40,11 +41,15 @@ def __init__(self, server, port, alternative_now = None):
else:
self.utc_stamp_now = datetime.datetime.now().strftime("%s")

@property
def message(self):
return ''.join(self.entries)

def prepareMessage(self, domains, nodes):
self.__nestedWalker__('nodes', domains)
self.__nestedWalker__('node', nodes)
self.message = self.message.join(self.entries)
self.send(self.message)
# print(self.message)
# self.send(self.message)

def __nestedWalker__(self, prefix, tree):
if isinstance(tree, dict):
Expand All @@ -54,9 +59,28 @@ def __nestedWalker__(self, prefix, tree):
# credits to https://wiki.python.org/moin/PythonSpeed/PerformanceTips#String_Concatenation
self.entries.append(''.join((prefix, ' ', str(tree), ' ', self.utc_stamp_now , '\n')))

def send(self, message):
print("hi")
def filterMessage(self, pattern, fMode = 'normal', fType = 'graphite_filter'):
if fType == 'graphite_filter':
self.__graphiteFilter__(pattern, fMode)
else:
raise Exception('Selected filter type is not implemented, yet.')


def __graphiteFilter__(self, pattern, fMode):
inverse = True if fMode == 'inverse' else False
regex = re.compile(pattern)
filteredEntries = []
for entry in self.entries:
match = regex.search(entry)
if match and not inverse or inverse and not match:
filteredEntries.append(entry)
self.entries = filteredEntries

def printMessage(self):
print(self.message)

def sendMessage(self):
sock = socket.socket()
sock.connect((self.server, int(self.port)))
sock.sendall(message.encode())
sock.close()
sock.sendall(self.message.encode())
sock.close()
13 changes: 11 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ This script can be configured via ``config.json`` (see below). However some feat
### CLI Arguments

```text
# ./main.py -h
usage: main.py [-h] [-g HOPGLASS_RAW] [-c CONFIG] [-p]
# ./main.py --help
usage: main.py [-h] [-g HOPGLASS_RAW] [-c CONFIG] [-n ALTERNATIVE_NOW]
[-fp FILTER_PATTERN] [-fm FILTER_MODE] [-p]
This Script is a link between Hopglass-Server and Graphite.
Expand All @@ -24,7 +25,15 @@ optional arguments:
Hopglass raw.json source. Default: ./raw.json
-c CONFIG, --config CONFIG
node-stats config file location Default: ./config.json
-n ALTERNATIVE_NOW, --alternative-now ALTERNATIVE_NOW
Set a fake now date.
-fp FILTER_PATTERN, --filter-pattern FILTER_PATTERN
Filter generated messages by given (regex) pattern.
-fm FILTER_MODE, --filter-mode FILTER_MODE
normal: Only include if filter matches, inverse:
exclude if filter matches.
-p, --print-only Print only
```

### config.json
Expand Down
15 changes: 13 additions & 2 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,20 +32,31 @@ def main():
args = __parseArguments__()
config = JsonHandler(args.config)
rawJson = JsonHandler(args.hopglass_raw)
#determine type of inpot nodes.json (meshviewer) or raw.json
rawType = DataHandler.TYPE_NODES_JSON if 'nodes' in rawJson.data else DataHandler.TYPE_RAW_JSON
#detected nodes.json instead raw.json

handler = DataHandler(rawJson.data, config.data, args.alternative_now, rawType)
handler.convert()

graphiteHandler = GraphiteHandler(config.data['graphite_target']['server'], config.data['graphite_target']['port'], args.alternative_now)
graphiteHandler.prepareMessage(handler.domains, handler.nodes)
# print(graphiteHandler.message)

if args.filter_pattern:
graphiteHandler.filterMessage(args.filter_pattern, args.filter_mode)

if args.print_only:
graphiteHandler.printMessage()
else:
graphiteHandler.sendMessage()


def __parseArguments__():
parser = argparse.ArgumentParser(description='This Script is a link between Hopglass-Server and Graphite.')
parser.add_argument('-g', '--hopglass-raw', help='Hopglass raw.json source. Default: ./raw.json', default='./raw.json')
parser.add_argument('-c', '--config', help='node-stats config file location Default: ./config.json', default='./config.json')
parser.add_argument('-n', '--alternative-now', help='Set a fake now date.', required=False)
parser.add_argument('-fp', '--filter-pattern', help='Filter generated messages by given (regex) pattern.', required=False)
parser.add_argument('-fm', '--filter-mode', help='normal: Only include if filter matches, inverse: exclude if filter matches.', default='normal')
parser.add_argument('-p', '--print-only', help='Print only', action='store_true')

return parser.parse_args()
Expand Down

0 comments on commit ba3dd27

Please sign in to comment.