Skip to content

Commit

Permalink
influxdb: simplify and document pattern matching. Closes #166
Browse files Browse the repository at this point in the history
sbourdeauducq committed Mar 30, 2016
1 parent deb9a60 commit 29a76bb
Showing 2 changed files with 38 additions and 34 deletions.
14 changes: 14 additions & 0 deletions RELEASE_NOTES.rst
Original file line number Diff line number Diff line change
@@ -3,6 +3,20 @@
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
----------

58 changes: 24 additions & 34 deletions artiq/frontend/artiq_influxdb.py
Original file line number Diff line number Diff line change
@@ -21,7 +21,15 @@

def get_argparser():
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.add_argument(
"--server-master", default="::1",
@@ -46,8 +54,10 @@ def get_argparser():
"--table", default="lab", help="table name to use")
group = parser.add_argument_group("filter")
group.add_argument(
"--pattern-file", default="influxdb_patterns.pyon",
help="file to save the patterns in (default: %(default)s)")
"--pattern-file", default="influxdb_patterns.cfg",
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)])
verbosity_args(parser)
return parser
@@ -177,14 +187,20 @@ async def _do(self):
class Filter:
def __init__(self, pattern_file):
self.pattern_file = pattern_file
self.patterns = []
self.scan_patterns()

def scan_patterns(self):
"""(Re)load the patterns file."""
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:
logger.info("no pattern file found, logging everything")

def _save(self):
pyon.store_file(self.pattern_file, self.patterns)
self.patterns = []

# Privatize so that it is not shown in artiq_rpctool list-methods.
def _filter(self, k):
@@ -197,32 +213,6 @@ def _filter(self, k):
take = sign
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):
"""Show existing patterns."""
return self.patterns

0 comments on commit 29a76bb

Please sign in to comment.