forked from M-Labs/artiq
influxdb: simplify and document pattern matching. Closes #166
This commit is contained in:
parent
deb9a60ca3
commit
29a76bb02d
|
@ -3,6 +3,20 @@
|
||||||
Release notes
|
Release notes
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
unreleased [2.x]
|
||||||
|
----------------
|
||||||
|
|
||||||
|
* The format of the influxdb pattern file is simplified. The procedure to
|
||||||
|
edit patterns is also changed to modifying the pattern file and calling:
|
||||||
|
``artiq_rpctool.py ::1 3248 call scan_patterns`` (or restarting the bridge)
|
||||||
|
The patterns can be converted to the new format using this code snippet::
|
||||||
|
|
||||||
|
from artiq.protocols import pyon
|
||||||
|
patterns = pyon.load_file("influxdb_patterns.pyon")
|
||||||
|
for p in patterns:
|
||||||
|
print(p)
|
||||||
|
|
||||||
|
|
||||||
unreleased
|
unreleased
|
||||||
----------
|
----------
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,15 @@ logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
def get_argparser():
|
def get_argparser():
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description="ARTIQ data to InfluxDB bridge")
|
description="ARTIQ data to InfluxDB bridge",
|
||||||
|
epilog="Pattern matching works as follows. "
|
||||||
|
"The default action on a key (dataset name) is to log it. "
|
||||||
|
"Then the patterns are traversed in order and glob-matched "
|
||||||
|
"with the key. "
|
||||||
|
"Optional + and - pattern prefixes specify whether to ignore or "
|
||||||
|
"log keys matching the rest of the pattern. "
|
||||||
|
"Default (in the absence of prefix) is to ignore. Last matched "
|
||||||
|
"pattern takes precedence.")
|
||||||
group = parser.add_argument_group("master")
|
group = parser.add_argument_group("master")
|
||||||
group.add_argument(
|
group.add_argument(
|
||||||
"--server-master", default="::1",
|
"--server-master", default="::1",
|
||||||
|
@ -46,8 +54,10 @@ def get_argparser():
|
||||||
"--table", default="lab", help="table name to use")
|
"--table", default="lab", help="table name to use")
|
||||||
group = parser.add_argument_group("filter")
|
group = parser.add_argument_group("filter")
|
||||||
group.add_argument(
|
group.add_argument(
|
||||||
"--pattern-file", default="influxdb_patterns.pyon",
|
"--pattern-file", default="influxdb_patterns.cfg",
|
||||||
help="file to save the patterns in (default: %(default)s)")
|
help="file to load the patterns from (default: %(default)s). "
|
||||||
|
"If the file is not found, no patterns are loaded "
|
||||||
|
"(everything is logged).")
|
||||||
simple_network_args(parser, [("control", "control", 3248)])
|
simple_network_args(parser, [("control", "control", 3248)])
|
||||||
verbosity_args(parser)
|
verbosity_args(parser)
|
||||||
return parser
|
return parser
|
||||||
|
@ -177,14 +187,20 @@ class MasterReader(TaskObject):
|
||||||
class Filter:
|
class Filter:
|
||||||
def __init__(self, pattern_file):
|
def __init__(self, pattern_file):
|
||||||
self.pattern_file = pattern_file
|
self.pattern_file = pattern_file
|
||||||
self.patterns = []
|
self.scan_patterns()
|
||||||
|
|
||||||
|
def scan_patterns(self):
|
||||||
|
"""(Re)load the patterns file."""
|
||||||
try:
|
try:
|
||||||
self.patterns = pyon.load_file(self.pattern_file)
|
with open(self.pattern_file, "r") as f:
|
||||||
|
self.patterns = []
|
||||||
|
for line in f:
|
||||||
|
line = line.rstrip()
|
||||||
|
if line:
|
||||||
|
self.patterns.append(line)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
logger.info("no pattern file found, logging everything")
|
logger.info("no pattern file found, logging everything")
|
||||||
|
self.patterns = []
|
||||||
def _save(self):
|
|
||||||
pyon.store_file(self.pattern_file, self.patterns)
|
|
||||||
|
|
||||||
# Privatize so that it is not shown in artiq_rpctool list-methods.
|
# Privatize so that it is not shown in artiq_rpctool list-methods.
|
||||||
def _filter(self, k):
|
def _filter(self, k):
|
||||||
|
@ -197,32 +213,6 @@ class Filter:
|
||||||
take = sign
|
take = sign
|
||||||
return take == "+"
|
return take == "+"
|
||||||
|
|
||||||
def add_pattern(self, pattern, index=None):
|
|
||||||
"""Add a pattern.
|
|
||||||
|
|
||||||
Optional + and - pattern prefixes specify whether to ignore or log
|
|
||||||
keys matching the rest of the pattern.
|
|
||||||
Default (in the absence of prefix) is to ignore. Keys that match no
|
|
||||||
pattern are logged. Last matched pattern takes precedence.
|
|
||||||
|
|
||||||
The optional index parameter specifies where to insert the pattern.
|
|
||||||
By default, patterns are added at the end. If index is an integer, it
|
|
||||||
specifies the index where the pattern is inserted. If it is a string,
|
|
||||||
that string must match an existing pattern and the new pattern is
|
|
||||||
inserted immediately after it."""
|
|
||||||
if pattern not in self.patterns:
|
|
||||||
if index is None:
|
|
||||||
index = len(self.patterns)
|
|
||||||
if isinstance(index, str):
|
|
||||||
index = self.patterns.index(index) + 1
|
|
||||||
self.patterns.insert(index, pattern)
|
|
||||||
self._save()
|
|
||||||
|
|
||||||
def remove_pattern(self, pattern):
|
|
||||||
"""Remove a pattern."""
|
|
||||||
self.patterns.remove(pattern)
|
|
||||||
self._save()
|
|
||||||
|
|
||||||
def get_patterns(self):
|
def get_patterns(self):
|
||||||
"""Show existing patterns."""
|
"""Show existing patterns."""
|
||||||
return self.patterns
|
return self.patterns
|
||||||
|
|
Loading…
Reference in New Issue