/usr/lib/python2.7/dist-packages/carbon/rewrite.py is in graphite-carbon 1.0.2-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | import re
from collections import defaultdict
from os.path import exists, getmtime
from twisted.internet.task import LoopingCall
from carbon.pipeline import Processor
from carbon import log
# rulesets
PRE = 'pre'
POST = 'post'
class RewriteProcessor(Processor):
plugin_name = 'rewrite'
def __init__(self, ruleset):
self.ruleset = ruleset
def process(self, metric, datapoint):
for rule in RewriteRuleManager.rules(self.ruleset):
metric = rule.apply(metric)
yield (metric, datapoint)
class RewriteRuleManager:
def __init__(self):
self.rulesets = defaultdict(list)
self.rules_file = None
self.read_task = LoopingCall(self.read_rules)
self.rules_last_read = 0.0
def clear(self, ruleset=None):
if ruleset:
self.rulesets[ruleset] = []
else:
self.rulesets.clear()
def rules(self, ruleset):
return self.rulesets[ruleset]
def read_from(self, rules_file):
self.rules_file = rules_file
self.read_rules()
if not self.read_task.running:
self.read_task.start(10, now=False)
def read_rules(self):
if not exists(self.rules_file):
self.clear()
return
# Only read if the rules file has been modified
try:
mtime = getmtime(self.rules_file)
except (OSError, IOError):
log.err("Failed to get mtime of %s" % self.rules_file)
return
if mtime <= self.rules_last_read:
return
section = None
for line in open(self.rules_file):
line = line.strip()
if line.startswith('#') or not line:
continue
if line.startswith('[') and line.endswith(']'):
section = line[1:-1].lower()
self.clear(section)
elif '=' in line:
pattern, replacement = line.split('=', 1)
pattern, replacement = pattern.strip(), replacement.strip()
try:
rule = RewriteRule(pattern, replacement)
except re.error:
log.err("Invalid regular expression in rewrite rule: '{0}'".format(pattern))
continue
self.rulesets[section].append(rule)
else:
log.err("Invalid syntax: not a section heading or rule: '{0}'".format(line))
self.rules_last_read = mtime
class RewriteRule:
def __init__(self, pattern, replacement):
self.pattern = pattern
self.replacement = replacement
self.regex = re.compile(pattern)
def apply(self, metric):
return self.regex.sub(self.replacement, metric)
# Ghetto singleton
RewriteRuleManager = RewriteRuleManager()
|