Splunkでマルチバリューを整列する(失敗しました)
以前の記事でマルチバリューをsort
みたく整列できなくて結構大変だったので、作れるんじゃないかと頑張りましたが、無理でした。
でも途中まで書いときます。
2020/1/19
https://github.com/gjanders/SplunkAdmins/blob/master/bin/streamfilter.py
が参考になると。
multivalue fields come through as a list, iterate through the list and run the regex against each entryin the multivalued field
あとは
Multivalue fields are sent as a ;
delim string with each term incased in $
, and the field name is set to __mv_fieldname
.The original field name is sent as a \n
delim string. Also need to set supports_multivalues in commands.conf
聞いてみるもんです。
Code
mvsort.py
#!/usr/bin/env python
import sys
from splunklib.searchcommands import dispatch, StreamingCommand, Configuration, Option, validators
@Configuration()
class mvsortCommand(StreamingCommand):
""" sort multivalue
"""
def stream(self, records):
self.logger.debug('mvsortCommand: %s', self) # logs command line
for record in records:
args=self.fieldnames[0] # 引数のフィールド名
if isinstance(record[args],(str)): # フィールドがシングルバリューかの判定
pass
else:
record[args]=sorted(record[args])
yield record
dispatch(mvsortCommand, sys.argv, sys.stdin, sys.stdout, __name__)
#!/usr/bin/env python
import sys
from splunklib.searchcommands import dispatch, StreamingCommand, Configuration, Option, validators
@Configuration()
class mvsortCommand(StreamingCommand):
""" sort multivalue
"""
def stream(self, records):
self.logger.debug('mvsortCommand: %s', self) # logs command line
for record in records:
args=self.fieldnames[0] # 引数のフィールド名
if isinstance(record[args],(str)): # フィールドがシングルバリューかの判定
pass
else:
record[args]=sorted(record[args])
yield record
dispatch(mvsortCommand, sys.argv, sys.stdin, sys.stdout, __name__)
うまくいかない・・・・
pythonによる検証
Colaboratoryで作ってみた。
# generator テスト
import random
num=[random.randrange(0,20) for i in range(20)]
def orig_gen():
for i in num:
yield i
g1=orig_gen()
j=[]
def gen_out():
try:
for i in g1:
j.append(i)
yield j
except:
pass
finally:
yield sorted(j)
g2=gen_out()
for i in g2:
print(i)
結果
[5]
[5, 16]
[5, 16, 6]
[5, 16, 6, 19]
[5, 16, 6, 19, 18]
[5, 16, 6, 19, 18, 3]
[5, 16, 6, 19, 18, 3, 16]
[5, 16, 6, 19, 18, 3, 16, 17]
[5, 16, 6, 19, 18, 3, 16, 17, 6]
[5, 16, 6, 19, 18, 3, 16, 17, 6, 8]
[5, 16, 6, 19, 18, 3, 16, 17, 6, 8, 8]
[5, 16, 6, 19, 18, 3, 16, 17, 6, 8, 8, 3]
[5, 16, 6, 19, 18, 3, 16, 17, 6, 8, 8, 3, 12]
[5, 16, 6, 19, 18, 3, 16, 17, 6, 8, 8, 3, 12, 13]
[5, 16, 6, 19, 18, 3, 16, 17, 6, 8, 8, 3, 12, 13, 8]
[5, 16, 6, 19, 18, 3, 16, 17, 6, 8, 8, 3, 12, 13, 8, 7]
[5, 16, 6, 19, 18, 3, 16, 17, 6, 8, 8, 3, 12, 13, 8, 7, 15]
[5, 16, 6, 19, 18, 3, 16, 17, 6, 8, 8, 3, 12, 13, 8, 7, 15, 10]
[5, 16, 6, 19, 18, 3, 16, 17, 6, 8, 8, 3, 12, 13, 8, 7, 15, 10, 1]
[5, 16, 6, 19, 18, 3, 16, 17, 6, 8, 8, 3, 12, 13, 8, 7, 15, 10, 1, 9]
[1, 3, 3, 5, 6, 6, 7, 8, 8, 8, 9, 10, 12, 13, 15, 16, 16, 17, 18, 19]
きちんと最後のsorted()
が効いてくれている。
考察
https://docs.splunk.com/DocumentationStatic/PythonSDK/1.6.14/searchcommands.html
の説明をみてもよくわからないので色々と試したところ、
- もともとのイベントは
dict
- マルチバリューの時は
list
で値がくる。 -
append()
でくっつけるのは十分可能だけど、最後のsorted
だけが効かない。 -
str
のリストのはずなんだけどな〜 - pstreeなんかは思いっきりマルチバリューを作っていてすごい。
まとめ
手詰まりになったので、いったんSplunk>AnswersにあげてPythonの勉強をします。
Author And Source
この問題について(Splunkでマルチバリューを整列する(失敗しました)), 我々は、より多くの情報をここで見つけました https://qiita.com/toshikawa/items/2a7c134e64211f41db7f著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .