From ec2e022cda4d977035e792c0b3948f9b0293e594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Thu, 26 Jul 2018 16:16:09 +0200 Subject: [PATCH] Simplify fields.yml generator (#7713) This PR simplifies the process of generating a new `fields.yml` file for a Beat. * `libbeat/fields.yml` is not a dependency anymore * only `fields.yml` is written to disk Changes in the asset files are due to different number of newlines in generated `fields.yml` files. ### Interface changes of generator tools Both `dev-tools/cmd/asset/asset.go` and `libbeat/scripts/cmd/global_fields/main.go` is changed. The first one has two new flags: `-in`, and `-out`. By default it reads from stdin and writes to stdout. Using the flags it's possible to read and write from other files. The second one has one new flag `-out` which specifies the output file. If it's not set, the output is written to stdout. This makes it possible to generate asset files for Metricbeat without writing `libbeat/fields.yml` to disk. It will be useful in the future when more Beats have modular assets. Closes #7671 --- auditbeat/Makefile | 2 +- auditbeat/include/fields.go | 2 +- dev-tools/cmd/asset/asset.go | 58 +- dev-tools/jenkins_ci.ps1 | 5 - dev-tools/mage/fields.go | 1 + filebeat/Makefile | 2 +- filebeat/include/fields.go | 2 +- generator/beat/{beat}/Makefile | 2 +- generator/metricbeat/Makefile | 3 +- heartbeat/Makefile | 2 +- heartbeat/include/fields.go | 2 +- libbeat/Makefile | 2 +- libbeat/generator/fields/fields.go | 142 +- .../fields/module_fields_collector.go | 4 +- libbeat/kibana/fields_transformer.go | 2 +- libbeat/scripts/Makefile | 11 +- libbeat/scripts/cmd/global_fields/main.go | 53 +- libbeat/tests/system/beat/beat.py | 8 +- metricbeat/Makefile | 9 +- metricbeat/include/fields/fields.go | 2 +- packetbeat/Makefile | 2 +- packetbeat/_meta/fields.yml | 2083 ----------------- packetbeat/include/fields.go | 2 +- winlogbeat/Makefile | 2 +- .../_meta/{fields.yml => fields.common.yml} | 0 winlogbeat/include/fields.go | 2 +- 26 files changed, 158 insertions(+), 2247 deletions(-) delete mode 100644 packetbeat/_meta/fields.yml rename winlogbeat/_meta/{fields.yml => fields.common.yml} (100%) diff --git a/auditbeat/Makefile b/auditbeat/Makefile index 08c0d4be4b7..d7532bdbda2 100644 --- a/auditbeat/Makefile +++ b/auditbeat/Makefile @@ -12,7 +12,7 @@ include ${ES_BEATS}/libbeat/scripts/Makefile # Collects all dependencies and then calls update .PHONY: collect -collect: fields collect-docs configs kibana +collect: collect-docs configs kibana # Collects all module configs .PHONY: configs diff --git a/auditbeat/include/fields.go b/auditbeat/include/fields.go index f82584b4486..e57a8731a76 100644 --- a/auditbeat/include/fields.go +++ b/auditbeat/include/fields.go @@ -31,5 +31,5 @@ func init() { // Asset returns asset data func Asset() string { - return "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" + return "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" } diff --git a/dev-tools/cmd/asset/asset.go b/dev-tools/cmd/asset/asset.go index 12da7708033..3c8d7adecbd 100644 --- a/dev-tools/cmd/asset/asset.go +++ b/dev-tools/cmd/asset/asset.go @@ -20,6 +20,7 @@ package main import ( + "bufio" "bytes" "flag" "fmt" @@ -30,33 +31,54 @@ import ( "github.com/elastic/beats/libbeat/asset" ) -var pkg *string +var ( + pkg string + input string + output string +) func init() { - pkg = flag.String("pkg", "", "Package name") + flag.StringVar(&pkg, "pkg", "", "Package name") + flag.StringVar(&input, "in", "-", "Source of input. \"-\" means reading from stdin") + flag.StringVar(&output, "out", "-", "Output path. \"-\" means writing to stdout") } func main() { flag.Parse() - args := flag.Args() - if len(args) != 2 { - fmt.Fprintln(os.Stderr, "File path must be set") - os.Exit(1) - } - file := args[0] - beatName := args[1] + var ( + file, beatName string + data []byte + err error + ) + if input == "-" { + if len(args) != 2 { + fmt.Fprintln(os.Stderr, "File path must be set") + os.Exit(1) + } + file = args[0] + beatName = args[1] - data, err := ioutil.ReadFile(file) - if err != nil { - fmt.Fprintln(os.Stderr, "Invalid file path: %s", args[0]) - os.Exit(1) + r := bufio.NewReader(os.Stdin) + data, err = ioutil.ReadAll(r) + if err != nil { + fmt.Fprintf(os.Stderr, "Error while reading from stdin: %v\n", err) + os.Exit(1) + } + } else { + file = input + beatName = args[0] + data, err = ioutil.ReadFile(input) + if err != nil { + fmt.Fprintf(os.Stderr, "Invalid file path: %s\n", input) + os.Exit(1) + } } encData, err := asset.EncodeData(string(data)) if err != nil { - fmt.Fprintln(os.Stderr, "Error encoding the data: %s", err) + fmt.Fprintf(os.Stderr, "Error encoding the data: %s\n", err) os.Exit(1) } @@ -65,7 +87,7 @@ func main() { Beat: beatName, Name: file, Data: encData, - Package: *pkg, + Package: pkg, }) bs, err := format.Source(buf.Bytes()) @@ -73,5 +95,9 @@ func main() { panic(err) } - os.Stdout.Write(bs) + if output == "-" { + os.Stdout.Write(bs) + } else { + ioutil.WriteFile(output, bs, 0640) + } } diff --git a/dev-tools/jenkins_ci.ps1 b/dev-tools/jenkins_ci.ps1 index efb5d4187ff..3ac3053ee0f 100755 --- a/dev-tools/jenkins_ci.ps1 +++ b/dev-tools/jenkins_ci.ps1 @@ -28,11 +28,6 @@ echo "Fetching testing dependencies" exec { go get github.com/docker/libcompose } exec { go get github.com/jstemmer/go-junit-report } -echo "Building libbeat fields.yml" -cd libbeat -exec { mage fields } -cd .. - if (Test-Path "$env:beat") { cd "$env:beat" } else { diff --git a/dev-tools/mage/fields.go b/dev-tools/mage/fields.go index 8f658483ffb..f709e16a39f 100644 --- a/dev-tools/mage/fields.go +++ b/dev-tools/mage/fields.go @@ -42,6 +42,7 @@ func GenerateFieldsYAML(fieldsFiles ...string) error { filepath.Join(beatsDir, globalFieldsCmdPath), "-es_beats_path", beatsDir, "-beat_path", CWD(), + "-out", "fields.yml", ) return globalFieldsCmd(fieldsFiles...) diff --git a/filebeat/Makefile b/filebeat/Makefile index f5d3bf8c6f1..12f54bcbc95 100644 --- a/filebeat/Makefile +++ b/filebeat/Makefile @@ -42,7 +42,7 @@ imports: python-env # Runs all collection steps and updates afterwards .PHONY: collect -collect: fields kibana configs collect-docs imports +collect: kibana configs collect-docs imports # Creates a new module. Requires the params MODULE .PHONY: create-module diff --git a/filebeat/include/fields.go b/filebeat/include/fields.go index b8576ce4a90..09fc2d82fa4 100644 --- a/filebeat/include/fields.go +++ b/filebeat/include/fields.go @@ -31,5 +31,5 @@ func init() { // Asset returns asset data func Asset() string { - return "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" + return "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" } diff --git a/generator/beat/{beat}/Makefile b/generator/beat/{beat}/Makefile index 8fdde0a7e0c..1be18d6708c 100644 --- a/generator/beat/{beat}/Makefile +++ b/generator/beat/{beat}/Makefile @@ -35,4 +35,4 @@ git-add: # Collects all dependencies and then calls update .PHONY: collect -collect: fields +collect: diff --git a/generator/metricbeat/Makefile b/generator/metricbeat/Makefile index f91acb876a3..2441db7c351 100644 --- a/generator/metricbeat/Makefile +++ b/generator/metricbeat/Makefile @@ -10,5 +10,4 @@ prepare-test:: python-env # Collects all dependencies and then calls update .PHONY: collect -collect: fields - +collect: diff --git a/heartbeat/Makefile b/heartbeat/Makefile index 498c10747b5..a1f69a783d2 100644 --- a/heartbeat/Makefile +++ b/heartbeat/Makefile @@ -8,7 +8,7 @@ TEST_ENVIRONMENT=false # Collects all dependencies and then calls update .PHONY: collect -collect: fields imports kibana +collect: imports kibana # Generate imports for all monitors .PHONY: imports diff --git a/heartbeat/include/fields.go b/heartbeat/include/fields.go index 26e46ac2a82..4392f7a0f3f 100644 --- a/heartbeat/include/fields.go +++ b/heartbeat/include/fields.go @@ -31,5 +31,5 @@ func init() { // Asset returns asset data func Asset() string { - return "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" + return "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" } diff --git a/libbeat/Makefile b/libbeat/Makefile index 93b34f77104..654e8ae06a7 100644 --- a/libbeat/Makefile +++ b/libbeat/Makefile @@ -6,4 +6,4 @@ include scripts/Makefile # Collects all dependencies and then calls update .PHONY: collect -collect: libbeat_fields +collect: diff --git a/libbeat/generator/fields/fields.go b/libbeat/generator/fields/fields.go index 02ec5374948..724338ab42b 100644 --- a/libbeat/generator/fields/fields.go +++ b/libbeat/generator/fields/fields.go @@ -20,17 +20,9 @@ package fields import ( "bufio" "bytes" - "io/ioutil" "os" - "path" "path/filepath" "strings" - - "github.com/pkg/errors" -) - -var ( - generatedFieldsYml = filepath.Join("_meta", "fields.generated.yml") ) // YmlFile holds the info on files and how to write them into the global fields.yml @@ -39,37 +31,67 @@ type YmlFile struct { Indent int } -func collectBeatFiles(beatPath string, fieldFiles []*YmlFile) ([]*YmlFile, error) { - commonFields := filepath.Join(beatPath, "_meta", "fields.common.yml") - _, err := os.Stat(commonFields) - if os.IsNotExist(err) { - return fieldFiles, nil - } else if err != nil { - return nil, err +func collectCommonFiles(esBeatsPath, beatPath string, fieldFiles []*YmlFile) ([]*YmlFile, error) { + commonFields := []string{ + filepath.Join(beatPath, "_meta/fields.common.yml"), + } + + var libbeatFieldFiles []*YmlFile + var err error + if !isLibbeat(beatPath) { + commonFields = append(commonFields, + filepath.Join(esBeatsPath, "libbeat/_meta/fields.common.yml"), + ) + + libbeatModulesPath := filepath.Join(esBeatsPath, "libbeat/processors") + libbeatFieldFiles, err = CollectModuleFiles(libbeatModulesPath) + if err != nil { + return nil, err + } } - files := []*YmlFile{ - { - Path: commonFields, + var files []*YmlFile + for _, cf := range commonFields { + _, err := os.Stat(cf) + if os.IsNotExist(err) { + continue + } else if err != nil { + return nil, err + } + files = append(files, &YmlFile{ + Path: cf, Indent: 0, - }, + }) } + files = append(files, libbeatFieldFiles...) + return append(files, fieldFiles...), nil } -func writeGeneratedFieldsYml(beatsPath string, fieldFiles []*YmlFile) error { - outPath := path.Join(beatsPath, generatedFieldsYml) - f, err := os.Create(outPath) +func isLibbeat(beatPath string) bool { + return filepath.Base(beatPath) == "libbeat" +} + +func writeGeneratedFieldsYml(beatPath string, fieldFiles []*YmlFile, output string) error { + data, err := GenerateFieldsYml(fieldFiles) if err != nil { return err } - defer f.Close() - data, err := GenerateFieldsYml(fieldFiles) + if output == "-" { + fw := bufio.NewWriter(os.Stdout) + fw.Write(data) + return fw.Flush() + } + + outPath := filepath.Join(beatPath, output) + f, err := os.Create(outPath) if err != nil { return err } + defer f.Close() + fw := bufio.NewWriter(f) fw.Write(data) return fw.Flush() @@ -106,77 +128,11 @@ func writeIndentedLine(buf *bytes.Buffer, line string, indent int) error { } // Generate collects fields.yml files and concatenates them into one global file. -func Generate(esBeatsPath, beatPath string, files []*YmlFile) error { - files, err := collectBeatFiles(beatPath, files) - if err != nil { - return err - } - - err = writeGeneratedFieldsYml(beatPath, files) - if err != nil { - return err - } - - return AppendFromLibbeat(esBeatsPath, beatPath) -} - -// AppendFromLibbeat appends fields.yml of libbeat to the fields.yml -func AppendFromLibbeat(esBeatsPath, beatPath string) error { - fieldsMetaPath := path.Join(beatPath, "_meta", "fields.yml") - generatedPath := path.Join(beatPath, generatedFieldsYml) - - err := createIfNotExists(fieldsMetaPath, generatedPath) - if err != nil { - return err - } - - if isLibbeat(beatPath) { - out := filepath.Join(esBeatsPath, "libbeat", "fields.yml") - return copyFileWithFlag(generatedPath, out, os.O_RDWR|os.O_CREATE|os.O_TRUNC) - } - - libbeatPath := filepath.Join(esBeatsPath, "libbeat", generatedFieldsYml) - out := filepath.Join(beatPath, "fields.yml") - err = copyFileWithFlag(libbeatPath, out, os.O_RDWR|os.O_CREATE|os.O_TRUNC) +func Generate(esBeatsPath, beatPath string, files []*YmlFile, output string) error { + files, err := collectCommonFiles(esBeatsPath, beatPath, files) if err != nil { return err } - return copyFileWithFlag(generatedPath, out, os.O_WRONLY|os.O_APPEND) -} - -func isLibbeat(beatPath string) bool { - return filepath.Base(beatPath) == "libbeat" -} -func createIfNotExists(inPath, outPath string) error { - _, err := os.Stat(outPath) - if os.IsNotExist(err) { - err := copyFileWithFlag(inPath, outPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC) - if err != nil { - return err - } - return nil - } - return err -} - -func copyFileWithFlag(in, out string, flag int) error { - input, err := ioutil.ReadFile(in) - if err != nil { - return errors.Wrap(err, "failed to read source in copy") - } - - if err := os.MkdirAll(filepath.Dir(out), 0755); err != nil { - return errors.Wrapf(err, "failed to create destination dir for copy "+ - "at %v", filepath.Dir(out)) - } - - output, err := os.OpenFile(out, flag, 0644) - if err != nil { - return errors.Wrap(err, "failed to open destination file for copy") - } - defer output.Close() - - _, err = output.Write(input) - return err + return writeGeneratedFieldsYml(beatPath, files, output) } diff --git a/libbeat/generator/fields/module_fields_collector.go b/libbeat/generator/fields/module_fields_collector.go index 1e89b38a58a..f9feeefc4b6 100644 --- a/libbeat/generator/fields/module_fields_collector.go +++ b/libbeat/generator/fields/module_fields_collector.go @@ -71,7 +71,7 @@ func CollectModuleFiles(modulesDir string) ([]*YmlFile, error) { func CollectFiles(module string, modulesPath string) ([]*YmlFile, error) { var files []*YmlFile - fieldsYmlPath := filepath.Join(modulesPath, module, "_meta", "fields.yml") + fieldsYmlPath := filepath.Join(modulesPath, module, "_meta/fields.yml") if _, err := os.Stat(fieldsYmlPath); !os.IsNotExist(err) { files = append(files, &YmlFile{ Path: fieldsYmlPath, @@ -91,7 +91,7 @@ func CollectFiles(module string, modulesPath string) ([]*YmlFile, error) { if !s.IsDir() { continue } - fieldsYmlPath = filepath.Join(modulesPath, module, s.Name(), "_meta", "fields.yml") + fieldsYmlPath = filepath.Join(modulesPath, module, s.Name(), "_meta/fields.yml") if _, err = os.Stat(fieldsYmlPath); !os.IsNotExist(err) { files = append(files, &YmlFile{ Path: fieldsYmlPath, diff --git a/libbeat/kibana/fields_transformer.go b/libbeat/kibana/fields_transformer.go index 34b0c960938..8f4f7005a38 100644 --- a/libbeat/kibana/fields_transformer.go +++ b/libbeat/kibana/fields_transformer.go @@ -80,7 +80,7 @@ func (t *fieldsTransformer) transformFields(commonFields common.Fields, path str } if t.keys[f.Path] != nil { - msg := fmt.Sprintf("ERROR: Field <%s> is duplicated. Please update and try again.", f.Path) + msg := fmt.Sprintf("ERROR: Field <%s> is duplicated. Please update and try again.\n", f.Path) panic(errors.New(msg)) } diff --git a/libbeat/scripts/Makefile b/libbeat/scripts/Makefile index 8e8a0ac3887..eec0d58c397 100755 --- a/libbeat/scripts/Makefile +++ b/libbeat/scripts/Makefile @@ -307,17 +307,14 @@ coverage-report: .PHONY: fields fields: mage - mage -v fields - -.PHONY: libbeat_fields -libbeat_fields: - @$(MAKE) -C ${ES_BEATS}/libbeat fields + @mage fields .PHONY: update update: ## @build Update expects the most recent version of libbeat in the GOPATH -update: python-env libbeat_fields collect +update: python-env fields collect @echo "Updating generated files for ${BEAT_NAME}" + @mkdir -p _meta @# Update config files. @cat _meta/beat.yml ${ES_BEATS}/libbeat/_meta/config.yml | sed -e "s/beatname/${BEAT_NAME}/g;s/beat-index-prefix/${BEAT_INDEX_PREFIX}/g" > ${BEAT_NAME}.yml @chmod 0640 ${BEAT_NAME}.yml @@ -335,7 +332,7 @@ endif ifneq ($(shell [[ $(BEAT_NAME) == libbeat || $(BEAT_NAME) == metricbeat ]] && echo true ),true) mkdir -p include - go run ${ES_BEATS}/dev-tools/cmd/asset/asset.go -pkg include fields.yml $(BEAT_NAME) > include/fields.go + go run ${ES_BEATS}/dev-tools/cmd/asset/asset.go -pkg include -in fields.yml -out include/fields.go $(BEAT_NAME) endif @# Update docs diff --git a/libbeat/scripts/cmd/global_fields/main.go b/libbeat/scripts/cmd/global_fields/main.go index 74fc94a603d..22fbd8cb1bf 100644 --- a/libbeat/scripts/cmd/global_fields/main.go +++ b/libbeat/scripts/cmd/global_fields/main.go @@ -27,37 +27,58 @@ import ( ) func main() { - esBeatsPath := flag.String("es_beats_path", "..", "Path to elastic/beats") - beatPath := flag.String("beat_path", ".", "Path to your Beat") + var ( + esBeatsPath string + beatPath string + output string + ) + flag.StringVar(&esBeatsPath, "es_beats_path", "..", "Path to elastic/beats") + flag.StringVar(&beatPath, "beat_path", ".", "Path to your Beat") + flag.StringVar(&output, "out", "-", "Path to output. Default: stdout") flag.Parse() beatFieldsPaths := flag.Args() - name := filepath.Base(*beatPath) + name := filepath.Base(beatPath) - if *beatPath == "" { + if beatPath == "" { fmt.Fprintf(os.Stderr, "beat_path cannot be empty") os.Exit(1) } - err := os.MkdirAll(filepath.Join(*beatPath, "_meta"), 0755) + esBeats, err := os.Open(esBeatsPath) if err != nil { - fmt.Fprintf(os.Stderr, "Cannot create _meta dir for %s: %+v\n", name, err) + fmt.Fprintf(os.Stderr, "Error opening elastic/beats: %+v\n", err) + os.Exit(1) + } + beat, err := os.Open(beatPath) + if err != nil { + fmt.Fprintf(os.Stderr, "Error opening target Beat: %+v\n", err) + os.Exit(1) + } + esBeatsInfo, err := esBeats.Stat() + if err != nil { + fmt.Fprintf(os.Stderr, "Error getting file info of elastic/beats: %+v\n", err) + os.Exit(1) + } + beatInfo, err := beat.Stat() + if err != nil { + fmt.Fprintf(os.Stderr, "Error getting file info of target Beat: %+v\n", err) os.Exit(1) } - if len(beatFieldsPaths) == 0 { - fmt.Println("No field files to collect") - err = fields.AppendFromLibbeat(*esBeatsPath, *beatPath) - if err != nil { - fmt.Fprintf(os.Stderr, "Cannot generate global fields.yml for %s: %+v\n", name, err) - os.Exit(2) + // If a community Beat does not have its own fields.yml file, it still requires + // the fields coming from libbeat to generate e.g assets. In case of Elastic Beats, + // it's not a problem because all of them has unique fields.yml files somewhere. + if len(beatFieldsPaths) == 0 && os.SameFile(esBeatsInfo, beatInfo) { + if output != "-" { + fmt.Println("No field files to collect") } return } var fieldsFiles []*fields.YmlFile for _, fieldsFilePath := range beatFieldsPaths { - pathToModules := filepath.Join(*beatPath, fieldsFilePath) + pathToModules := filepath.Join(beatPath, fieldsFilePath) fieldsFile, err := fields.CollectModuleFiles(pathToModules) if err != nil { @@ -68,11 +89,13 @@ func main() { fieldsFiles = append(fieldsFiles, fieldsFile...) } - err = fields.Generate(*esBeatsPath, *beatPath, fieldsFiles) + err = fields.Generate(esBeatsPath, beatPath, fieldsFiles, output) if err != nil { fmt.Fprintf(os.Stderr, "Cannot generate global fields.yml file for %s: %+v\n", name, err) os.Exit(3) } - fmt.Printf("Generated fields.yml for %s\n", name) + if output != "-" { + fmt.Printf("Generated fields.yml for %s\n", name) + } } diff --git a/libbeat/tests/system/beat/beat.py b/libbeat/tests/system/beat/beat.py index d54077c4618..1626e6476fc 100644 --- a/libbeat/tests/system/beat/beat.py +++ b/libbeat/tests/system/beat/beat.py @@ -460,7 +460,7 @@ def load_fields(self, fields_doc=None): """ if fields_doc is None: - fields_doc = self.beat_path + "/_meta/fields.generated.yml" + fields_doc = self.beat_path + "/fields.yml" def extract_fields(doc_list, name): fields = [] @@ -491,15 +491,11 @@ def extract_fields(doc_list, name): dictfields.append(newName) return fields, dictfields - # Not all beats have a fields.generated.yml. Fall back to fields.yml - if not os.path.isfile(fields_doc): - fields_doc = self.beat_path + "/_meta/fields.yml" - global yaml_cache # TODO: Make fields_doc path more generic to work with beat-generator with open(fields_doc, "r") as f: - path = os.path.abspath(os.path.dirname(__file__) + "../../../../_meta/fields.generated.yml") + path = os.path.abspath(os.path.dirname(__file__) + "../../../../fields.yml") if not os.path.isfile(path): path = os.path.abspath(os.path.dirname(__file__) + "../../../../_meta/fields.common.yml") with open(path) as f2: diff --git a/metricbeat/Makefile b/metricbeat/Makefile index f42f8cca6f4..cbf765d188d 100644 --- a/metricbeat/Makefile +++ b/metricbeat/Makefile @@ -30,6 +30,7 @@ collect-docs: python-env # Collects all module configs .PHONY: configs configs: python-env + @mkdir -p _meta @cp ${ES_BEATS}/metricbeat/_meta/common.yml _meta/beat.yml @cat ${ES_BEATS}/metricbeat/_meta/setup.yml >> _meta/beat.yml @cat ${ES_BEATS}/metricbeat/_meta/common.reference.yml > _meta/beat.reference.yml @@ -48,7 +49,7 @@ imports: python-env # Runs all collection steps and updates afterwards .PHONY: collect -collect: fields assets collect-docs configs kibana imports +collect: assets collect-docs configs kibana imports # Creates a new metricset. Requires the params MODULE and METRICSET .PHONY: create-metricset @@ -73,8 +74,8 @@ test-module: python-env update metricbeat.test . ${PYTHON_ENV}/bin/activate && INTEGRATION_TESTS=1 nosetests tests/system/test_${MODULE}.py .PHONY: assets -assets: libbeat_fields +assets: go run ${ES_BEATS}/metricbeat/scripts/assets/assets.go ${ES_BEATS}/metricbeat/module mkdir -p include/fields - go run ${ES_BEATS}/dev-tools/cmd/asset/asset.go -pkg include ${ES_BEATS}/metricbeat/_meta/fields.common.yml $(BEAT_NAME) > include/fields.go - go run ${ES_BEATS}/dev-tools/cmd/asset/asset.go -pkg include ${ES_BEATS}/libbeat/fields.yml $(BEAT_NAME) > ./include/fields/fields.go + go run ${ES_BEATS}/dev-tools/cmd/asset/asset.go -pkg include -in ${ES_BEATS}/metricbeat/_meta/fields.common.yml -out include/fields.go $(BEAT_NAME) + go run ${ES_BEATS}/libbeat/scripts/cmd/global_fields/main.go -es_beats_path ${ES_BEATS} -beat_path ${PWD} | go run ${ES_BEATS}/dev-tools/cmd/asset/asset.go -out ./include/fields/fields.go -pkg include ${ES_BEATS}/libbeat/fields.yml $(BEAT_NAME) diff --git a/metricbeat/include/fields/fields.go b/metricbeat/include/fields/fields.go index 24002de7f8e..f71a8ded7ce 100644 --- a/metricbeat/include/fields/fields.go +++ b/metricbeat/include/fields/fields.go @@ -31,5 +31,5 @@ func init() { // Asset returns asset data func Asset() string { - return "eJy0WF1v3LYSffevGOTpXkAr3Ng3RrEPRVOnaBZt2qBNnjez5KzEWiIVDuX19tcXJPVpaT8cb/1gmF/nHJIzZyhfLeCe9kvYELorAKdcQUv4MbYksbCqcsroJXx/BQBwZ7RDpRmEKUujwzrYKiokAz6gKnBTECgNWBRAD6QduH1FnF5BM215FYAWoLGkSJz6P0PvLKf/+ZRTWABmCy6noBCYtFQ6Cx2FyaAkZsyIU1gNZoVlijsoJucF+nFh9FZltUVPB1tVUOL7/SA6eMCi9iuhZpIBUznf1MYNwcISyA27hqmZ/8kEqpGOxI+Fri+++aXDMWHHh3Wl00NrGU8fXKcNGSy52mqSsNkHKlORp9EZ8J4dlWA07HIl8l744OxsrbXS2Ywap0r62+gz1LQz/001D2RZGX1aTDOxDasQzuHyM9JeCklwueIYyuk4dF/94LfCDsvqVQPqY30JEl17Dpa+1sqSXIKzddu5NbZEN5pHj1hWPvXe1lnNDq5vXQ7X/3t9m8Dr6+XNm+Wbm/Tm5vq80w2SYBcDmZo09AliSRgrYYfc7+/JphxmfJzlrd0oZ9Huw9x4WgK9FYR4r8jGi0ItQ8NZ1IzC9fcRz+kJcXSH0TmazV8k2lyLjXUcuaf9zlh5XGjnVTWT7XPKG1Qke6KArDV2JCCzpq6Ok/zkF7UOKCKjj1+UUvm5WIDSW+MzWyAH/wo8nLbB0LhiC9iqacys6281OXp0g84DsnppDU46IRBGTtELo7PnoHuQKbTHmkCP7+ws9BgmTYkShallX6PufBMqax6UJL9NhxIdzpetD80obK0pI1K3lP1d9RaEUq7DhHUL6WcKYjb2YBXzU9OwKm1hnyY2iRPZ+9ugvI0VpvDRMCsfuKEmMaAlD5hAJigBY0GqTDksjCDU6UFtSrNDLWitTqTOqpkIq3etJF9EoESRK/00decYTlemjmNY189jaSasB3HWnbO7TkuSqi6Ps3+IECHEnkfePHNUodx+PSh5nYKaF4TsFq/FCSMdAEGoiKqvdoqjHMV9mTsScsEbu1vtpDQji8fzQ69Z4rX8bExWUMy0w+yWspOl9o8w59T+mkSXRtyH/Gky/V3bngGPY8AOnbffoiDha3ZI8zjmc5ZzY906VoAlbLFgf2moRW5sy7fosvxqbMrtljtZMFsfDvl4UxPIpkq+zBM/a/W1ph4QlJxz9Y6unCsfz2IcxkWAa1+njQD/kNjUqnBg9DEpAzP4RiV3HafHOsZV4IYKnrCN3hJw/D1xQssqnETk6YLWB3Mfsu9jawZk5R8Dg0D1VW5iPX1s+v6TkdlwPy8uX34n75vPiultXCjSo0HMBDlakStHwtX2AnsYwcF/KM1SePzudn37/wTQlglUlUigVBX/dyrFcFoV6PyT/mVKfv8TWqBGgyDtDCdQb2rt6gR2SkuzOyBi/MXz7RoanFmOLZaq2L+YIsI0m7Qkc3QJSNoo1AlsLdGG5bHdqmoiYdR1hP1Xxc4b2urjAqW0xEw8JShRvGyTLU2OVu7QUk+WQM01FsUePry9G2pofeS+3pDV5Ih7N/ll2DdD2493z+Dxm7YHhaGXHC+L/aKTBjQSDc+yocrIC5SHwQlURkZvm6WqX2pNA6aPRsLn1bspkf/NFYrLbapHnJL5L7CLnqBHPHCE5xbX84giGpRYTZlQa+PC/78uRjeAnOe85INlwCtGb5djtBd4ss3yRtx/AgAA//9ghmf1" + return "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" } diff --git a/packetbeat/Makefile b/packetbeat/Makefile index 03ed18219db..ab895ce7c56 100644 --- a/packetbeat/Makefile +++ b/packetbeat/Makefile @@ -8,7 +8,7 @@ include ${ES_BEATS}/libbeat/scripts/Makefile # Collects all dependencies and then calls update .PHONY: collect -collect: fields imports +collect: imports .PHONY: benchmark benchmark: diff --git a/packetbeat/_meta/fields.yml b/packetbeat/_meta/fields.yml deleted file mode 100644 index f36b26fd92c..00000000000 --- a/packetbeat/_meta/fields.yml +++ /dev/null @@ -1,2083 +0,0 @@ -- key: common - title: Common - description: > - These fields contain data about the environment in which the - transaction or flow was captured. - fields: - - name: server - description: > - The name of the server that served the transaction. - - - name: client_server - description: > - The name of the server that initiated the transaction. - - - name: service - description: > - The name of the logical service that served the transaction. - - - name: client_service - description: > - The name of the logical service that initiated the transaction. - - - name: ip - description: > - The IP address of the server that served the transaction. - format: dotted notation. - - - name: client_ip - description: > - The IP address of the server that initiated the transaction. - format: dotted notation. - - - name: real_ip - description: > - If the server initiating the transaction is a proxy, this field - contains the original client IP address. - For HTTP, for example, the IP address extracted from a configurable - HTTP header, by default `X-Forwarded-For`. - - Unless this field is disabled, it always has a value, and it matches - the `client_ip` for non proxy clients. - format: Dotted notation. - - - name: client_geoip - description: The GeoIP information of the client. - type: group - fields: - - name: location - type: geo_point - example: {lat: 51, lon: 9} - description: > - The GeoIP location of the `client_ip` address. This field is available - only if you define a - https://www.elastic.co/guide/en/elasticsearch/plugins/master/using-ingest-geoip.html[GeoIP Processor] as a pipeline in the - https://www.elastic.co/guide/en/elasticsearch/plugins/master/ingest-geoip.html[Ingest GeoIP processor plugin] or using Logstash. - - - name: client_port - description: > - The layer 4 port of the process that initiated the transaction. - format: dotted notation. - - - name: transport - description: > - The transport protocol used for the transaction. If not specified, then - tcp is assumed. - example: udp - - - name: type - description: > - The type of the transaction (for example, HTTP, MySQL, Redis, or RUM) or "flow" in case of flows. - required: true - - - name: port - description: > - The layer 4 port of the process that served the transaction. - format: dotted notation. - - - name: proc - description: > - The name of the process that served the transaction. - - - name: cmdline - description: > - The command-line of the process that served the transaction. - - - name: client_proc - description: > - The name of the process that initiated the transaction. - - - name: client_cmdline - description: > - The command-line of the process that initiated the transaction. - - - name: release - description: > - The software release of the service serving the transaction. - This can be the commit id or a semantic version. - -- key: flows_event - title: "Flow Event" - description: > - These fields contain data about the flow itself. - fields: - - name: "start_time" - type: date - required: true - format: YYYY-MM-DDTHH:MM:SS.milliZ - example: 2015-01-24T14:06:05.071Z - description: > - The time, the first packet for the flow has been seen. - - - name: "last_time" - type: date - required: true - format: YYYY-MM-DDTHH:MM:SS.milliZ - example: 2015-01-24T14:06:05.071Z - description: > - The time, the most recent processed packet for the flow has been seen. - - - name: final - description: > - Indicates if event is last event in flow. If final is false, the event - reports an intermediate flow state only. - - - name: flow_id - description: > - Internal flow id based on connection meta data and address. - - - name: vlan - description: > - Innermost VLAN address used in network packets. - - - name: outer_vlan - description: > - Second innermost VLAN address used in network packets. - - - - name: source - type: group - description: > - Properties of the source host - fields: - - name: mac - description: > - Source MAC address as indicated by first packet seen for the current flow. - - - name: ip - description: > - Innermost IPv4 source address as indicated by first packet seen for the - current flow. - - - name: ip_location - type: geo_point - example: "40.715, -74.011" - description: > - The GeoIP location of the `ip_source` IP address. The field is a string - containing the latitude and longitude separated by a comma. - - - name: outer_ip - description: > - Second innermost IPv4 source address as indicated by first packet seen - for the current flow. - - - name: outer_ip_location - type: geo_point - example: "40.715, -74.011" - description: > - The GeoIP location of the `outer_ip_source` IP address. The field is a - string containing the latitude and longitude separated by a comma. - - - name: ipv6 - description: > - Innermost IPv6 source address as indicated by first packet seen for the - current flow. - - - name: ipv6_location - type: geo_point - example: "60.715, -76.011" - description: > - The GeoIP location of the `ipv6_source` IP address. The field is a string - containing the latitude and longitude separated by a comma. - - - name: outer_ipv6 - description: > - Second innermost IPv6 source address as indicated by first packet seen - for the current flow. - - - name: outer_ipv6_location - type: geo_point - example: "60.715, -76.011" - description: > - The GeoIP location of the `outer_ipv6_source` IP address. The field is a - string containing the latitude and longitude separated by a comma. - - - name: port - description: > - Source port number as indicated by first packet seen for the current flow. - - - name: stats - type: group - description: > - Object with source to destination flow measurements. - fields: - - name: net_packets_total - type: long - description: > - Total number of packets - - - name: net_bytes_total - type: long - description: > - Total number of bytes - - - - - name: dest - type: group - description: > - Properties of the destination host - fields: - - name: mac - description: > - Destination MAC address as indicated by first packet seen for the current flow. - - - name: ip - description: > - Innermost IPv4 destination address as indicated by first packet seen for the - current flow. - - - name: ip_location - type: geo_point - example: "40.715, -74.011" - description: > - The GeoIP location of the `ip_dest` IP address. The field is a string - containing the latitude and longitude separated by a comma. - - - name: outer_ip - description: > - Second innermost IPv4 destination address as indicated by first packet - seen for the current flow. - - - name: outer_ip_location - type: geo_point - example: "40.715, -74.011" - description: > - The GeoIP location of the `outer_ip_dest` IP address. The field is a - string containing the latitude and longitude separated by a comma. - - - name: ipv6 - description: > - Innermost IPv6 destination address as indicated by first packet seen for the - current flow. - - - name: ipv6_location - type: geo_point - example: "60.715, -76.011" - description: > - The GeoIP location of the `ipv6_dest` IP address. The field is a string - containing the latitude and longitude separated by a comma. - - - name: outer_ipv6 - description: > - Second innermost IPv6 destination address as indicated by first packet - seen for the current flow. - - - name: outer_ipv6_location - type: geo_point - example: "60.715, -76.011" - description: > - The GeoIP location of the `outer_ipv6_dest` IP address. The field is a - string containing the latitude and longitude separated by a comma. - - - name: port - description: > - Destination port number as indicated by first packet seen for the current flow. - - - name: stats - type: group - description: > - Object with destination to source flow measurements. - fields: - - name: net_packets_total - type: long - description: > - Total number of packets - - - name: net_bytes_total - type: long - description: > - Total number of bytes - - name: icmp_id - description: > - ICMP id used in ICMP based flow. - - - name: connection_id - description: > - optional TCP connection id - -- key: trans_event - title: "Transaction Event" - description: > - These fields contain data about the transaction itself. - fields: - - - name: direction - required: true - description: > - Indicates whether the transaction is inbound (emitted by server) - or outbound (emitted by the client). Values can be in or out. No defaults. - possible_values: - - in - - out - - - name: status - description: > - The high level status of the transaction. The way to compute this - value depends on the protocol, but the result has a meaning - independent of the protocol. - required: true - possible_values: - - OK - - Error - - Server Error - - Client Error - - - name: method - description: > - The command/verb/method of the transaction. For HTTP, this is the - method name (GET, POST, PUT, and so on), for SQL this is the verb (SELECT, - UPDATE, DELETE, and so on). - - - name: resource - description: > - The logical resource that this transaction refers to. For HTTP, this is - the URL path up to the last slash (/). For example, if the URL is `/users/1`, - the resource is `/users`. For databases, the resource is typically the - table name. The field is not filled for all transaction types. - - - name: path - required: true - description: > - The path the transaction refers to. For HTTP, this is the URL. - For SQL databases, this is the table name. For key-value stores, this - is the key. - - - name: query - type: keyword - description: > - The query in a human readable format. For HTTP, it will typically be - something like `GET /users/_search?name=test`. For MySQL, it is - something like `SELECT id from users where name=test`. - - - name: params - type: text - description: > - The request parameters. For HTTP, these are the POST or GET parameters. - For Thrift-RPC, these are the parameters from the request. - - - name: notes - description: > - Messages from Packetbeat itself. This field usually contains error messages for - interpreting the raw data. This information can be helpful for troubleshooting. - -- key: raw - title: Raw - description: These fields contain the raw transaction data. - fields: - - name: request - type: text - description: > - For text protocols, this is the request as seen on the wire - (application layer only). For binary protocols this is our - representation of the request. - - - name: response - type: text - description: > - For text protocols, this is the response as seen on the wire - (application layer only). For binary protocols this is our - representation of the request. - -- key: trans_measurements - title: "Measurements (Transactions)" - description: > - These fields contain measurements related to the transaction. - fields: - - name: responsetime - description: > - The wall clock time it took to complete the transaction. - The precision is in milliseconds. - type: long - - - name: cpu_time - description: The CPU time it took to complete the transaction. - type: long - - - name: bytes_in - description: > - The number of bytes of the request. Note that this size is - the application layer message length, without the length of the IP or - TCP headers. - type: long - format: bytes - - - name: bytes_out - description: > - The number of bytes of the response. Note that this size is - the application layer message length, without the length of the IP or - TCP headers. - type: long - format: bytes - - - name: dnstime - type: long - description: > - The time it takes to query the name server for a given request. - This is typically used for RUM (real-user-monitoring) but can - also have values for server-to-server communication when DNS - is used for service discovery. - The precision is in microseconds. - - - name: connecttime - type: long - description: > - The time it takes for the TCP connection to be established for - the given transaction. - The precision is in microseconds. - - - name: loadtime - type: long - description: > - The time it takes for the content to be loaded. This is typically - used for RUM (real-user-monitoring) but it can make sense in other - cases as well. - The precision is in microseconds. - - - name: domloadtime - type: long - description: > - In RUM (real-user-monitoring), the total time it takes for the - DOM to be loaded. In terms of the W3 Navigation Timing API, this is - the difference between `domContentLoadedEnd` and - `domContentLoadedStart`. - -- key: amqp - title: "AMQP" - description: AMQP specific event fields. - fields: - - name: amqp - type: group - fields: - - name: reply-code - type: long - description: > - AMQP reply code to an error, similar to http reply-code - example: 404 - - - name: reply-text - type: keyword - description: > - Text explaining the error. - - - name: class-id - type: long - description: > - Failing method class. - - - name: method-id - type: long - description: > - Failing method ID. - - - name: exchange - type: keyword - description: > - Name of the exchange. - - - name: exchange-type - type: keyword - description: > - Exchange type. - example: fanout - - - name: passive - type: boolean - description: > - If set, do not create exchange/queue. - - - name: durable - type: boolean - description: > - If set, request a durable exchange/queue. - - - name: exclusive - type: boolean - description: > - If set, request an exclusive queue. - - - name: auto-delete - type: boolean - description: > - If set, auto-delete queue when unused. - - - name: no-wait - type: boolean - description: > - If set, the server will not respond to the method. - - - name: consumer-tag - description: > - Identifier for the consumer, valid within the current channel. - - - name: delivery-tag - type: long - description: > - The server-assigned and channel-specific delivery tag. - - - name: message-count - type: long - description: > - The number of messages in the queue, which will be zero for - newly-declared queues. - - - name: consumer-count - type: long - description: > - The number of consumers of a queue. - - - name: routing-key - type: keyword - description: > - Message routing key. - - - name: no-ack - type: boolean - description: > - If set, the server does not expect acknowledgements for messages. - - - name: no-local - type: boolean - description: > - If set, the server will not send messages to the connection that - published them. - - - name: if-unused - type: boolean - description: > - Delete only if unused. - - - name: if-empty - type: boolean - description: > - Delete only if empty. - - - name: queue - type: keyword - description: > - The queue name identifies the queue within the vhost. - - - name: redelivered - type: boolean - description: > - Indicates that the message has been previously delivered to this - or another client. - - - name: multiple - type: boolean - description: > - Acknowledge multiple messages. - - - name: arguments - type: object - description: > - Optional additional arguments passed to some methods. Can be of - various types. - - - name: mandatory - type: boolean - description: > - Indicates mandatory routing. - - - name: immediate - type: boolean - description: > - Request immediate delivery. - - - name: content-type - type: keyword - description: > - MIME content type. - example: text/plain - - - name: content-encoding - type: keyword - description: > - MIME content encoding. - - - name: headers - type: object - object_type: keyword - description: > - Message header field table. - - - name: delivery-mode - type: keyword - description: > - Non-persistent (1) or persistent (2). - - - name: priority - type: long - description: > - Message priority, 0 to 9. - - - name: correlation-id - type: keyword - description: > - Application correlation identifier. - - - name: reply-to - type: keyword - description: > - Address to reply to. - - - name: expiration - type: keyword - description: > - Message expiration specification. - - - name: message-id - type: keyword - description: > - Application message identifier. - - - name: timestamp - type: keyword - description: > - Message timestamp. - - - name: type - type: keyword - description: > - Message type name. - - - name: user-id - type: keyword - description: > - Creating user id. - - - name: app-id - type: keyword - description: > - Creating application id. - -- key: cassandra - title: "Cassandra" - description: Cassandra v4/3 specific event fields. - fields: - - name: cassandra - type: group - description: Information about the Cassandra request and response. - fields: - - name: request - type: group - description: Cassandra request. - fields: - - name: headers - type: group - description: Cassandra request headers. - fields: - - name: version - type: long - description: The version of the protocol. - - name: flags - type: keyword - description: Flags applying to this frame. - - name: stream - type: keyword - description: A frame has a stream id. If a client sends a request message with the stream id X, it is guaranteed that the stream id of the response to that message will be X. - - name: op - type: keyword - description: An operation type that distinguishes the actual message. - - name: length - type: long - description: A integer representing the length of the body of the frame (a frame is limited to 256MB in length). - - name: query - type: keyword - description: The CQL query which client send to cassandra. - - - name: response - type: group - description: Cassandra response. - fields: - - name: headers - type: group - description: Cassandra response headers, the structure is as same as request's header. - fields: - - name: version - type: long - description: The version of the protocol. - - name: flags - type: keyword - description: Flags applying to this frame. - - name: stream - type: keyword - description: A frame has a stream id. If a client sends a request message with the stream id X, it is guaranteed that the stream id of the response to that message will be X. - - name: op - type: keyword - description: An operation type that distinguishes the actual message. - - name: length - type: long - description: A integer representing the length of the body of the frame (a frame is limited to 256MB in length). - - - - name: result - type: group - description: Details about the returned result. - fields: - - name: type - type: keyword - description: Cassandra result type. - - name: rows - type: group - description: Details about the rows. - fields: - - name: num_rows - type: long - description: Representing the number of rows present in this result. - - name: meta - type: group - description: Composed of result metadata. - fields: - - name: keyspace - type: keyword - description: Only present after set Global_tables_spec, the keyspace name. - - name: table - type: keyword - description: Only present after set Global_tables_spec, the table name. - - name: flags - type: keyword - description: Provides information on the formatting of the remaining information. - - name: col_count - type: long - description: Representing the number of columns selected by the query that produced this result. - - name: pkey_columns - type: long - description: Representing the PK columns index and counts. - - name: paging_state - type: keyword - description: The paging_state is a bytes value that should be used in QUERY/EXECUTE to continue paging and retrieve the remainder of the result for this query. - - name: keyspace - type: keyword - description: Indicating the name of the keyspace that has been set. - - name: schema_change - type: group - description: The result to a schema_change message. - fields: - - name: change - type: keyword - description: Representing the type of changed involved. - - name: keyspace - type: keyword - description: This describes which keyspace has changed. - - name: table - type: keyword - description: This describes which table has changed. - - name: object - type: keyword - description: This describes the name of said affected object (either the table, user type, function, or aggregate name). - - name: target - type: keyword - description: Target could be "FUNCTION" or "AGGREGATE", multiple arguments. - - name: name - type: keyword - description: The function/aggregate name. - - name: args - type: keyword - description: One string for each argument type (as CQL type). - - name: prepared - type: group - description: The result to a PREPARE message. - fields: - - name: prepared_id - type: keyword - description: Representing the prepared query ID. - - name: req_meta - type: group - description: This describes the request metadata. - fields: - - name: keyspace - type: keyword - description: Only present after set Global_tables_spec, the keyspace name. - - name: table - type: keyword - description: Only present after set Global_tables_spec, the table name. - - name: flags - type: keyword - description: Provides information on the formatting of the remaining information. - - name: col_count - type: long - description: Representing the number of columns selected by the query that produced this result. - - name: pkey_columns - type: long - description: Representing the PK columns index and counts. - - name: paging_state - type: keyword - description: The paging_state is a bytes value that should be used in QUERY/EXECUTE to continue paging and retrieve the remainder of the result for this query. - - name: resp_meta - type: group - description: This describes the metadata for the result set. - fields: - - name: keyspace - type: keyword - description: Only present after set Global_tables_spec, the keyspace name. - - name: table - type: keyword - description: Only present after set Global_tables_spec, the table name. - - name: flags - type: keyword - description: Provides information on the formatting of the remaining information. - - name: col_count - type: long - description: Representing the number of columns selected by the query that produced this result. - - name: pkey_columns - type: long - description: Representing the PK columns index and counts. - - name: paging_state - type: keyword - description: The paging_state is a bytes value that should be used in QUERY/EXECUTE to continue paging and retrieve the remainder of the result for this query. - - - name: supported - type: object - object_type: keyword - description: Indicates which startup options are supported by the server. This message comes as a response to an OPTIONS message. - - - name: authentication - type: group - description: Indicates that the server requires authentication, and which authentication mechanism to use. - fields: - - name: class - type: keyword - description: Indicates the full class name of the IAuthenticator in use - - - - name: warnings - type: keyword - description: The text of the warnings, only occur when Warning flag was set. - - - name: event - type: group - description: Event pushed by the server. A client will only receive events for the types it has REGISTERed to. - fields: - - name: type - type: keyword - description: Representing the event type. - - name: change - type: keyword - description: The message corresponding respectively to the type of change followed by the address of the new/removed node. - - name: host - type: keyword - description: Representing the node ip. - - name: port - type: long - description: Representing the node port. - - name: schema_change - type: group - description: The events details related to schema change. - fields: - - name: change - type: keyword - description: Representing the type of changed involved. - - name: keyspace - type: keyword - description: This describes which keyspace has changed. - - name: table - type: keyword - description: This describes which table has changed. - - name: object - type: keyword - description: This describes the name of said affected object (either the table, user type, function, or aggregate name). - - name: target - type: keyword - description: Target could be "FUNCTION" or "AGGREGATE", multiple arguments. - - name: name - type: keyword - description: The function/aggregate name. - - name: args - type: keyword - description: One string for each argument type (as CQL type). - - - - name: error - type: group - description: Indicates an error processing a request. The body of the message will be an error code followed by a error message. Then, depending on the exception, more content may follow. - fields: - - name: code - type: long - description: The error code of the Cassandra response. - - - name: msg - type: keyword - description: The error message of the Cassandra response. - - - name: type - type: keyword - description: The error type of the Cassandra response. - - - name: details - type: group - description: The details of the error. - fields: - - name: read_consistency - type: keyword - description: Representing the consistency level of the query that triggered the exception. - - - name: required - type: long - description: Representing the number of nodes that should be alive to respect consistency level. - - - name: alive - type: long - description: Representing the number of replicas that were known to be alive when the request had been processed (since an unavailable exception has been triggered). - - - name: received - type: long - description: Representing the number of nodes having acknowledged the request. - - - name: blockfor - type: long - description: Representing the number of replicas whose acknowledgement is required to achieve consistency level. - - - name: write_type - type: keyword - description: Describe the type of the write that timed out. - - - name: data_present - type: boolean - description: It means the replica that was asked for data had responded. - - - name: keyspace - type: keyword - description: The keyspace of the failed function. - - - name: table - type: keyword - description: The keyspace of the failed function. - - - name: stmt_id - type: keyword - description: Representing the unknown ID. - - - name: num_failures - type: keyword - description: Representing the number of nodes that experience a failure while executing the request. - - - name: function - type: keyword - description: The name of the failed function. - - - name: arg_types - type: keyword - description: One string for each argument type (as CQL type) of the failed function. - - -- key: dns - title: "DNS" - description: DNS-specific event fields. - fields: - - name: dns - type: group - fields: - - name: id - type: long - description: > - The DNS packet identifier assigned by the program that generated the - query. The identifier is copied to the response. - - - name: op_code - description: > - The DNS operation code that specifies the kind of query in the message. - This value is set by the originator of a query and copied into the - response. - example: QUERY - - - name: flags.authoritative - type: boolean - description: > - A DNS flag specifying that the responding server is an authority for - the domain name used in the question. - - - name: flags.recursion_available - type: boolean - description: > - A DNS flag specifying whether recursive query support is available in the - name server. - - - name: flags.recursion_desired - type: boolean - description: > - A DNS flag specifying that the client directs the server to pursue a - query recursively. Recursive query support is optional. - - - name: flags.authentic_data - type: boolean - description: > - A DNS flag specifying that the recursive server considers the response - authentic. - - - name: flags.checking_disabled - type: boolean - description: > - A DNS flag specifying that the client disables the server - signature validation of the query. - - - name: flags.truncated_response - type: boolean - description: > - A DNS flag specifying that only the first 512 bytes of the reply were - returned. - - - name: response_code - description: The DNS status code. - example: NOERROR - - - name: question.name - description: > - The domain name being queried. If the name field contains non-printable - characters (below 32 or above 126), then those characters are represented - as escaped base 10 integers (\DDD). Back slashes and quotes are escaped. - Tabs, carriage returns, and line feeds are converted to \t, \r, and - \n respectively. - example: www.google.com. - - - name: question.type - description: The type of records being queried. - example: AAAA - - - name: question.class - description: The class of of records being queried. - example: IN - - - name: question.etld_plus_one - description: The effective top-level domain (eTLD) plus one more label. - For example, the eTLD+1 for "foo.bar.golang.org." is "golang.org.". - The data for determining the eTLD comes from an embedded copy of the - data from http://publicsuffix.org. - example: amazon.co.uk. - - - name: answers - type: object - description: > - An array containing a dictionary about each answer section returned by - the server. - - - name: answers_count - type: long - description: > - The number of resource records contained in the `dns.answers` field. - - - - name: answers.name - description: The domain name to which this resource record pertains. - example: example.com. - - - name: answers.type - description: The type of data contained in this resource record. - example: MX - - - name: answers.class - description: The class of DNS data contained in this resource record. - example: IN - - - name: answers.ttl - description: > - The time interval in seconds that this resource record may be cached - before it should be discarded. Zero values mean that the data should - not be cached. - type: long - - - name: answers.data - description: > - The data describing the resource. The meaning of this data depends - on the type and class of the resource record. - - - name: authorities - type: object - description: > - An array containing a dictionary for each authority section from the - answer. - - - name: authorities_count - type: long - description: > - The number of resource records contained in the `dns.authorities` field. - The `dns.authorities` field may or may not be included depending on the - configuration of Packetbeat. - - - name: authorities.name - description: The domain name to which this resource record pertains. - example: example.com. - - - name: authorities.type - description: The type of data contained in this resource record. - example: NS - - - name: authorities.class - description: The class of DNS data contained in this resource record. - example: IN - - - name: additionals - type: object - description: > - An array containing a dictionary for each additional section from the - answer. - - - name: additionals_count - type: long - description: > - The number of resource records contained in the `dns.additionals` field. - The `dns.additionals` field may or may not be included depending on the - configuration of Packetbeat. - - - name: additionals.name - description: The domain name to which this resource record pertains. - example: example.com. - - - name: additionals.type - description: The type of data contained in this resource record. - example: NS - - - name: additionals.class - description: The class of DNS data contained in this resource record. - example: IN - - - name: additionals.ttl - description: > - The time interval in seconds that this resource record may be cached - before it should be discarded. Zero values mean that the data should - not be cached. - type: long - - - name: additionals.data - description: > - The data describing the resource. The meaning of this data depends - on the type and class of the resource record. - - - name: opt.version - description: The EDNS version. - example: "0" - - - name: opt.do - type: boolean - description: If set, the transaction uses DNSSEC. - - - name: opt.ext_rcode - description: Extended response code field. - example: "BADVERS" - - - name: opt.udp_size - type: long - description: Requestor's UDP payload size (in bytes). - -- key: http - title: "HTTP" - description: HTTP-specific event fields. - fields: - - name: http - type: group - description: Information about the HTTP request and response. - fields: - - name: request - description: HTTP request - type: group - fields: - - name: params - description: > - The query parameters or form values. The query parameters are available in the Request-URI - and the form values are set in the HTTP body when the content-type is set to `x-www-form-urlencoded`. - - name: headers - type: object - object_type: keyword - description: > - A map containing the captured header fields from the request. - Which headers to capture is configurable. If headers with the same - header name are present in the message, they will be separated by - commas. - - name: body - type: text - description: The body of the HTTP request. - - - name: response - description: HTTP response - type: group - fields: - - name: code - description: The HTTP status code. - example: 404 - - - name: phrase - description: The HTTP status phrase. - example: Not found. - - - name: headers - type: object - object_type: keyword - description: > - A map containing the captured header fields from the response. - Which headers to capture is configurable. If headers with the - same header name are present in the message, they will be separated - by commas. - - name: body - type: text - description: The body of the HTTP response. - -- key: icmp - title: "ICMP" - description: > - ICMP specific event fields. - fields: - - name: icmp - type: group - fields: - - name: version - description: The version of the ICMP protocol. - possible_values: - - 4 - - 6 - - - name: request.message - type: keyword - description: A human readable form of the request. - - - name: request.type - type: long - description: The request type. - - - name: request.code - type: long - description: The request code. - - - name: response.message - type: keyword - description: A human readable form of the response. - - - name: response.type - type: long - description: The response type. - - - name: response.code - type: long - description: The response code. - -- key: memcache - title: "Memcache" - description: Memcached-specific event fields - fields: - - name: memcache - type: group - fields: - - name: protocol_type - type: keyword - description: > - The memcache protocol implementation. The value can be "binary" - for binary-based, "text" for text-based, or "unknown" for an unknown - memcache protocol type. - - - name: request.line - type: keyword - description: > - The raw command line for unknown commands ONLY. - - - name: request.command - type: keyword - description: > - The memcache command being requested in the memcache text protocol. - For example "set" or "get". - The binary protocol opcodes are translated into memcache text protocol - commands. - - - name: response.command - type: keyword - description: > - Either the text based protocol response message type - or the name of the originating request if binary protocol is used. - - - name: request.type - type: keyword - description: > - The memcache command classification. This value can be "UNKNOWN", "Load", - "Store", "Delete", "Counter", "Info", "SlabCtrl", "LRUCrawler", - "Stats", "Success", "Fail", or "Auth". - - - name: response.type - type: keyword - description: > - The memcache command classification. This value can be "UNKNOWN", "Load", - "Store", "Delete", "Counter", "Info", "SlabCtrl", "LRUCrawler", - "Stats", "Success", "Fail", or "Auth". - The text based protocol will employ any of these, whereas the - binary based protocol will mirror the request commands only (see - `memcache.response.status` for binary protocol). - - - name: response.error_msg - type: keyword - description: > - The optional error message in the memcache response (text based protocol only). - - - name: request.opcode - type: keyword - description: > - The binary protocol message opcode name. - - - name: response.opcode - type: keyword - description: > - The binary protocol message opcode name. - - - name: request.opcode_value - type: long - description: > - The binary protocol message opcode value. - - - name: response.opcode_value - type: long - description: > - The binary protocol message opcode value. - - - name: request.opaque - type: long - description: > - The binary protocol opaque header value used for correlating request - with response messages. - - - name: response.opaque - type: long - description: > - The binary protocol opaque header value used for correlating request - with response messages. - - - name: request.vbucket - type: long - description: > - The vbucket index sent in the binary message. - - - name: response.status - type: keyword - description: > - The textual representation of the response error code - (binary protocol only). - - - name: response.status_code - type: long - description: > - The status code value returned in the response (binary protocol only). - - - name: request.keys - type: array - description: > - The list of keys sent in the store or load commands. - - - name: response.keys - type: array - description: > - The list of keys returned for the load command (if present). - - - name: request.count_values - type: long - description: > - The number of values found in the memcache request message. - If the command does not send any data, this field is missing. - - - name: response.count_values - type: long - description: > - The number of values found in the memcache response message. - If the command does not send any data, this field is missing. - - - name: request.values - type: array - description: > - The list of base64 encoded values sent with the request (if present). - - - name: response.values - type: array - description: > - The list of base64 encoded values sent with the response (if present). - - - name: request.bytes - type: long - format: bytes - description: > - The byte count of the values being transferred. - - - name: response.bytes - type: long - format: bytes - description: > - The byte count of the values being transferred. - - - name: request.delta - type: long - description: > - The counter increment/decrement delta value. - - - name: request.initial - type: long - description: > - The counter increment/decrement initial value parameter (binary protocol only). - - - name: request.verbosity - type: long - description: > - The value of the memcache "verbosity" command. - - - name: request.raw_args - type: keyword - description: > - The text protocol raw arguments for the "stats ..." and "lru crawl ..." commands. - - - name: request.source_class - type: long - description: > - The source class id in 'slab reassign' command. - - - name: request.dest_class - type: long - description: > - The destination class id in 'slab reassign' command. - - - name: request.automove - type: keyword - description: > - The automove mode in the 'slab automove' command expressed as a string. - This value can be "standby"(=0), "slow"(=1), "aggressive"(=2), or the raw value if - the value is unknown. - - - name: request.flags - type: long - description: > - The memcache command flags sent in the request (if present). - - - name: response.flags - type: long - description: > - The memcache message flags sent in the response (if present). - - - name: request.exptime - type: long - description: > - The data expiry time in seconds sent with the memcache command (if present). - If the value is <30 days, the expiry time is relative to "now", or else it - is an absolute Unix time in seconds (32-bit). - - - name: request.sleep_us - type: long - description: > - The sleep setting in microseconds for the 'lru_crawler sleep' command. - - - name: response.value - type: long - description: > - The counter value returned by a counter operation. - - - name: request.noreply - type: boolean - description: > - Set to true if noreply was set in the request. - The `memcache.response` field will be missing. - - - name: request.quiet - type: boolean - description: > - Set to true if the binary protocol message is to be treated as a quiet message. - - - name: request.cas_unique - type: long - description: > - The CAS (compare-and-swap) identifier if present. - - - name: response.cas_unique - type: long - description: > - The CAS (compare-and-swap) identifier to be used with CAS-based updates - (if present). - - - name: response.stats - type: array - description: > - The list of statistic values returned. Each entry is a dictionary with the - fields "name" and "value". - - - name: response.version - type: keyword - description: > - The returned memcache version string. - -- key: mongodb - title: "MongoDb" - description: > - MongoDB-specific event fields. These fields mirror closely - the fields for the MongoDB wire protocol. The higher level fields - (for example, `query` and `resource`) apply to MongoDB events as well. - fields: - - name: mongodb - type: group - fields: - - name: error - description: > - If the MongoDB request has resulted in an error, this field contains the - error message returned by the server. - - name: fullCollectionName - description: > - The full collection name. - The full collection name is the concatenation of the database name with the collection name, - using a dot (.) for the concatenation. - For example, for the database foo and the collection bar, the full collection name is foo.bar. - - name: numberToSkip - type: long - description: > - Sets the number of documents to omit - starting from the first document in the resulting dataset - - when returning the result of the query. - - name: numberToReturn - type: long - description: > - The requested maximum number of documents to be returned. - - name: numberReturned - type: long - description: > - The number of documents in the reply. - - name: startingFrom - description: > - Where in the cursor this reply is starting. - - name: query - description: > - A JSON document that represents the query. - The query will contain one or more elements, all of which must match for a document - to be included in the result set. - Possible elements include $query, $orderby, $hint, $explain, and $snapshot. - - name: returnFieldsSelector - description: > - A JSON document that limits the fields in the returned documents. - The returnFieldsSelector contains one or more elements, each of which is the name of a field that should be returned, - and the integer value 1. - - name: selector - description: > - A BSON document that specifies the query for selecting the document to update or delete. - - name: update - description: > - A BSON document that specifies the update to be performed. - For information on specifying updates, see the Update Operations documentation from the MongoDB Manual. - - name: cursorId - description: > - The cursor identifier returned in the OP_REPLY. This must be the value that was returned from the database. - - - name: rpc - type: group - description: OncRPC specific event fields. - fields: - - name: xid - description: RPC message transaction identifier. - - - name: call_size - type: long - description: RPC call size with argument. - - - name: reply_size - type: long - description: RPC reply size with argument. - - - name: status - description: RPC message reply status. - - - name: time - type: long - description: RPC message processing time. - - - name: time_str - description: RPC message processing time in human readable form. - - - name: auth_flavor - description: RPC authentication flavor. - - - name: cred.uid - type: long - description: RPC caller's user id, in case of auth-unix. - - - name: cred.gid - type: long - description: RPC caller's group id, in case of auth-unix. - - - name: cred.gids - description: RPC caller's secondary group ids, in case of auth-unix. - - - name: cred.stamp - type: long - description: Arbitrary ID which the caller machine may generate. - - - name: cred.machinename - description: The name of the caller's machine. - -- key: mysql - title: "MySQL" - description: > - MySQL-specific event fields. - fields: - - name: mysql - type: group - fields: - - name: iserror - type: boolean - description: > - If the MySQL query returns an error, this field is set to true. - - - name: affected_rows - type: long - description: > - If the MySQL command is successful, this field contains the affected - number of rows of the last statement. - - - name: insert_id - description: > - If the INSERT query is successful, this field contains the id of the - newly inserted row. - - - name: num_fields - description: > - If the SELECT query is successful, this field is set to the number - of fields returned. - - - name: num_rows - description: > - If the SELECT query is successful, this field is set to the number - of rows returned. - - - name: query - description: > - The row mysql query as read from the transaction's request. - - - name: error_code - type: long - description: > - The error code returned by MySQL. - - - name: error_message - description: > - The error info message returned by MySQL. - -- key: nfs - title: "NFS" - description: NFS v4/3 specific event fields. - fields: - - name: nfs - type: group - fields: - - name: version - type: long - description: NFS protocol version number. - - - name: minor_version - type: long - description: NFS protocol minor version number. - - - name: tag - description: NFS v4 COMPOUND operation tag. - - - name: opcode - description: > - NFS operation name, or main operation name, in case of COMPOUND - calls. - - - name: status - description: NFS operation reply status. - - -- key: pgsql - title: "PostgreSQL" - description: > - PostgreSQL-specific event fields. - fields: - - name: pgsql - type: group - fields: - - name: query - description: > - The row pgsql query as read from the transaction's request. - - - name: iserror - type: boolean - description: > - If the PgSQL query returns an error, this field is set to true. - - - name: error_code - description: The PostgreSQL error code. - type: long - - - name: error_message - description: The PostgreSQL error message. - - - name: error_severity - description: The PostgreSQL error severity. - possible_values: - - ERROR - - FATAL - - PANIC - - - name: num_fields - description: > - If the SELECT query if successful, this field is set to the number - of fields returned. - - - name: num_rows - description: > - If the SELECT query if successful, this field is set to the number - of rows returned. - -- key: redis - title: "Redis" - description: > - Redis-specific event fields. - fields: - - name: redis - type: group - fields: - - name: return_value - description: > - The return value of the Redis command in a human readable format. - - - name: error - description: > - If the Redis command has resulted in an error, this field contains the - error message returned by the Redis server. - -- key: thrift - title: "Thrift-RPC" - description: > - Thrift-RPC specific event fields. - fields: - - name: thrift - type: group - fields: - - name: params - description: > - The RPC method call parameters in a human readable format. If the IDL - files are available, the parameters use names whenever possible. - Otherwise, the IDs from the message are used. - - - name: service - description: > - The name of the Thrift-RPC service as defined in the IDL files. - - - name: return_value - description: > - The value returned by the Thrift-RPC call. This is encoded in a human - readable format. - - - name: exceptions - description: > - If the call resulted in exceptions, this field contains the exceptions in a human - readable format. - -- key: tls - title: "TLS" - description: > - TLS-specific event fields. - fields: - - name: tls - type: group - fields: - - name: handshake_completed - type: boolean - description: > - Whether the TLS negotiation has been successful and the session has - transitioned to encrypted mode. - - - name: resumed - type: boolean - description: > - If the TLS session has been resumed from a previous session. - - - name: resumption_method - type: keyword - description: > - If the session has been resumed, the underlying method used. One of - "id" for TLS session ID or "ticket" for TLS ticket extension. - - - name: client_certificate_requested - type: boolean - description: > - Whether the server has requested the client to authenticate itself - using a client certificate. - - - name: client_hello - type: group - fields: - - name: version - type: keyword - description: > - The version of the TLS protocol by which the client wishes to - communicate during this session. - - - name: supported_ciphers - type: array - description: > - List of ciphers the client is willing to use for this session. - See https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4 - - - name: supported_compression_methods - type: array - description: > - The list of compression methods the client supports. - See https://www.iana.org/assignments/comp-meth-ids/comp-meth-ids.xhtml - - - name: extensions - type: group - description: The hello extensions provided by the client. - fields: - - name: server_name_indication - type: keyword - description: List of hostnames - - - name: application_layer_protocol_negotiation - type: keyword - description: > - List of application-layer protocols the client is willing to use. - - - name: session_ticket - type: keyword - description: > - Length of the session ticket, if provided, or an empty string - to advertise support for tickets. - - - name: server_hello - type: group - fields: - - name: version - type: keyword - description: > - The version of the TLS protocol that is used for this session. - It is the highest version supported by the server not exceeding - the version requested in the client hello. - - - name: selected_cipher - type: keyword - description: > - The cipher suite selected by the server from the list provided - by in the client hello. - - - name: selected_compression_method - type: keyword - description: > - The compression method selected by the server from the list - provided in the client hello. - - - name: extensions - type: group - description: The hello extensions provided by the server. - fields: - - name: application_layer_protocol_negotiation - type: array - description: Negotiated application layer protocol - - - name: session_ticket - type: keyword - description: > - Used to announce that a session ticket will be provided - by the server. Always an empty string. - - - name: client_certificate - type: group - description: Certificate provided by the client for authentication. - fields: - - - name: version - type: long - description: X509 format version. - - - name: serial_number - type: keyword - description: The certificate's serial number. - - - name: not_before - type: date - description: Date before which the certificate is not valid. - - - name: not_after - type: date - description: Date after which the certificate expires. - - - name: public_key_algorithm - type: keyword - description: > - The algorithm used for this certificate's public key. - One of RSA, DSA or ECDSA. - - - name: public_key_size - type: long - description: Size of the public key. - - - name: signature_algorithm - type: keyword - description: > - The algorithm used for the certificate's signature. - - - name: alternative_names - type: array - description: Subject Alternative Names for this certificate. - - - name: raw - type: keyword - description: The raw certificate in PEM format. - - - name: subject - type: group - description: Subject represented by this certificate. - fields: - - name: country - type: keyword - description: Country code. - - - name: organization - type: keyword - description: Organization name. - - - name: organizational_unit - type: keyword - description: Unit within organization. - - - name: province - type: keyword - description: Province or region within country. - - - name: common_name - type: keyword - description: Name or host name identified by the certificate. - - - name: issuer - type: group - description: Entity that issued and signed this certificate. - fields: - - name: country - type: keyword - description: Country code. - - - name: organization - type: keyword - description: Organization name. - - - name: organizational_unit - type: keyword - description: Unit within organization. - - - name: province - type: keyword - description: Province or region within country. - - - name: common_name - type: keyword - description: Name or host name identified by the certificate. - - - - name: server_certificate - type: group - description: Certificate provided by the server for authentication. - fields: - - - name: version - type: long - description: X509 format version. - - - name: serial_number - type: keyword - description: The certificate's serial number. - - - name: not_before - type: date - description: Date before which the certificate is not valid. - - - name: not_after - type: date - description: Date after which the certificate expires. - - - name: public_key_algorithm - type: keyword - description: > - The algorithm used for this certificate's public key. - One of RSA, DSA or ECDSA. - - - name: public_key_size - type: long - description: Size of the public key. - - - name: signature_algorithm - type: keyword - description: > - The algorithm used for the certificate's signature. - - - name: alternative_names - type: array - description: Subject Alternative Names for this certificate. - - - name: raw - type: keyword - description: The raw certificate in PEM format. - - - name: subject - type: group - description: Subject represented by this certificate. - fields: - - name: country - type: keyword - description: Country code. - - - name: organization - type: keyword - description: Organization name. - - - name: organizational_unit - type: keyword - description: Unit within organization. - - - name: province - type: keyword - description: Province or region within country. - - - name: common_name - type: keyword - description: Name or host name identified by the certificate. - - - name: issuer - type: group - description: Entity that issued and signed this certificate. - fields: - - name: country - type: keyword - description: Country code. - - - name: organization - type: keyword - description: Organization name. - - - name: organizational_unit - type: keyword - description: Unit within organization. - - - name: province - type: keyword - description: Province or region within country. - - - name: common_name - type: keyword - description: Name or host name identified by the certificate. - - - name: server_certificate_chain - type: array - description: Chain of trust for the server certificate. - - - name: client_certificate_chain - type: array - description: Chain of trust for the client certificate. - - - name: alert_types - type: keyword - description: > - An array containing the TLS alert type for every alert received. - - - name: fingerprints - type: group - description: Fingerprints for this TLS session. - fields: - - - name: ja3 - type: group - description: JA3 TLS client fingerprint - fields: - - - name: hash - type: keyword - description: > - The JA3 fingerprint hash for the client side. - - - name: str - type: keyword - description: > - The JA3 string used to calculate the hash. diff --git a/packetbeat/include/fields.go b/packetbeat/include/fields.go index 004cba6f6fa..9703085aea9 100644 --- a/packetbeat/include/fields.go +++ b/packetbeat/include/fields.go @@ -31,5 +31,5 @@ func init() { // Asset returns asset data func Asset() string { - return "eJzsvW1zGzmSIPy9fwVCz0S0HA9J2W6399Zxc3caSe7Rji1rJHlnem42aLAqSWJVBVQDKNHsi/vvF0i8FOqVpEi73bHyh26RrMpMJBKZicxE4rsxuYf1GzIDqr8jRDOdwRvyJ/spBZVIVmgm+BvyP74jhJAzwTVlXJFE5Lng+B6ZM8hSRegDZRmdZUAYJzTLCDwA10SvC1CT74h77M13CGhMOM3BIp6YP/HbTpzm390S8AUi5kQvASkkCnjK+AK/yMSC5KAUXYCakMvoKXyNqQBKgTYEmt8TwedsUUpq0JE5y2Bkvjc/Uk0eaFaaN0mpIEWYTJuPXOgYGL5ClkJph8k9fycQVY2OkfkNv/pkPn4KcASOuJ+uSZtpHuNmxgXaqCISdCk5pGS2RlSiAIOGL4haKw05EZyslixZVoRHvJMl54wvOqjRLIdfBd+CGv/kl6TmAaRigm8mxj3oxQrFGSd/AdyQAinRS6asKE/qonv0v8xQlKZ5ceSAGll/Q1KqPR8k/FIyCekbomXpv5wLmVNdew4+07wwS++0XJRKk5ev9ZK8fP7i9Yi8ePnmhx/f/PjD5IcfXm7HXSSJrKwgg1uGZoFISIRMyYqqanyNQWm6UMNYTuWMaUnlGp+13EqoUQUo7wVIO1GUp/hBS8oVTXQ1H5ZPDcRWO9T4KGb/CYlfa/bD1P5yD+uVkOkwoUFXlQpktaaMgrLIGhSAlELWCFhIURbDSC7MS14DJhajkV+apsw8SzPC+FyYlZ1QhfoL8aiJFwanFT1AT41TZuF7T5OGzzr6soesijQHZ9JCkIi0DT0TfLELdAOkDdrAaoGuz9lW0K2YOBOVZKJMKxt1Zj6SQooHloIZpqYp1bTbbL13v5K5FLmFFF5VZq4qFUTTdIoPTD1I82QCSgnZa8XMoxN8a+LBNhc2JBtW71Vk3uoUTsi1UIoZwUWbpAiVYACOyCKBERGSpGzBNM1EApRPemljXGnKE5iyDUvn0j1ILs89ScaIkJwmS8abS7cLw2bLFHDEdn07LO6BaSRngc/65SSHlJX5MPb3FgSK2G7InZvDMqbX08jkBQpKNQaq9PhFskGRRoAIWkRWWTumLDlMVWZuQORQN4ZZDaS4X8aftxc994qh5SchFhnYldaPXcJio6m9wWc2jc8t9FQk97h+3Eo/9587gNvfiNJUG/WbZZAYm43L3P5m1qxaCqmn1gK8IXOaKTNplCdLIT2+cVjl39WVsh9yIIt02oc+Pe5sAsgJS/fTiR85+6WECiBhaZdWD+jyLvOxE8ZYLhCc904dAcaRmJUs00TwIVIiZfBISs4CTgNrCFdGZ5CpFraaL0GG/YkNtFwiJyyeILRGmCuR/bP91AHk0jgDkaAaK9dSPZVsmu83SqbDvZtc7j8nf3bbivZsHEjSrYLoEHIqkyXTkOhSHmAMNXDkGCaLCfn8315PX78aESrzESmKZERyVqhnbVKEmhQZ1cal34+SD7fEA3I0JMC1UCNSzkquyxFZMZ6KVQ8R9R3P42lwcDpxzGnOsvXeKCwYN0gJ6ZLqEUlhxigfkbkEmKl0aLSsaJFQ+2oA+zumtFFol9djmqYSlALVRpDTZL9BejRLKtMVlVAhG5FSlTTL1uT96VlMg9cj9+UMJAcNqtImf4m/60Bb/R7c4LpPWwElsS4ZNovVSxsVUI1ospMaKkR6APMQcaAQqdVtnajKfVVThOlapOTj5XkbkfmvKmhyuEFVENvIzA7soBw0EHtYuK1x3Q6RhUZyWrQxUc6FxvjXwdBFILtxHtJhifAmNd9lCO0BXLZOvBau30dj5DbaSPvPnVDvlqCgEd8gVsPMRGnDm8AfmBQ8B65jF9+PJAoAma3qPBMr9BwTWhiLm056tIoC+RAc7i3jwvYdG5TCv1P8OiKhsZFJMgZcT/fFxTjTzIULh9CZd1iyY7A7EwuW0My//LjRHQbrtuNkG8JmBtnlNXEGcJfZs++HEKrQhhi/sLuHvz8xA8PehR4JNNtIzWUNvcPs0xzxWmKKYGzq83pkN9S4iAKcxIc/MbAu2YJxmjmWRMOt3J+3QpI/391dj3BX4mIINrsRcQc+a0mrTTatBVYDLAOHLIGmIEfGC0lhTstMk09/H78VckVlCqn569Ok0ocfeWYQVEMxI0yZMoDTEWGa0GxF14osqRk5hsJGGGZmZu+kkyVUtgJzLGH+P+GQuOCWX44Lqjl759tI0wJE9xQaMfoJxOU1RnwNxCizYF+e7OwfZSKhusuxX4CYFoLx2A6GuM//ycxwfnwxIpmh7F//73bGoxqBR+vJj1npBYfc1WYqpP9qIAXP1oTNyVqURggYB0JrDyy1LtSbk5PVajWBjCrNkkkiThYlS+EE+In7ToHZpZ0UWblgXJ3kVGmQJ6VifDFmfAFKj3FiJkudZ//bDuLau63/QVBiClZAxmycrTJPByCjTcAlfuOYGdxnYt/7D2MGkXTyTiyUpmrZLWqFkHqz6sroGiR5RczTURQvsYvpcNoLX9yOpPCoIUSLRGSYFA3hjpgGo/C40EQVkLA5M0tdLyHKFSUFipdSZQ4hGFBFW9OiQWYVFB6iMIr7xkr1uKb7rDp8v77967sRuYGUKYy233x8/8z8/8j4Mkdxbsd8EdRKI/lXo/JAU3sIK2kA7uYabEVCp0Dvh2pb70NCBlRtIQVKzLXZoPs3YttvfB78f9v0TiIgTPnsp42N5jnThKVGPChRkFOuWVKFVbwXjoIyxdRs5YofvTW+8YX58qjbId/GHUcHm2kF2bzPtT5Smko91SyHx6Wuf/7555/H79+Pz8/v/vznN+/fv7m9neQsy9g/muvz5fMXP46fvxi/fHX34tWb56/fPP9x8vxfXvxjiyXKcud+zJlUmhQ0uQcddAgO07gCMwBOFEBTCo6Myv7djDEXShMJifHOnNBDuvOY58bJ2+Bf8pQl1GwQ2dzVBjCzF1faf+KIBxUzwjO/Y3RoVNUTBHASjHIyu2vCuAaZQ2qWqCVVafOn8QGadGZitUUWUoM0+K1Ep2RGDU8EN5LPwSrsHDR1K4CnlVNbw/aQ0Q0JqkvOQeIU/Pu706vg7KLRYpxw0Csh7910NMGLUoOcbkZyC4kw3uquuOo7SFHKsJXbukzhWooCpGZQbW8QTpw76K1EqIVDB9zHWwvy/elZGBRVhDl5w2hkbSUb+Q2inZRSGulD0WsHSbaN8FYTeXn98MqPcmdyajA3kjZ9nJd+9Or55F9e/Dgi4395NXn+4sXR3l46K6Z2xJ/iHR6+UfnpRGnJamUeJK5cwb0/1UyXKeCaygRf2E8KCio97ygaO9rBELsetp2x1qp41MTVQG4pU57Ob2b6AkGbJ7EG0k7oYSeRFQ+vH7HkXn+lJffw+rGz9jrM2utDLbqH19/Sstt23roW3u7Tt8/C+4YmMSLpG1h80e5w0yTa6cINIi/zGcjD2VysqmlPTORtbCDuAyZqyIrppZcrLcwLmnFX22w8uxyoKiXkcUiOdDgkMW0c9NR5SFMtdHB667Q2yhk3kIsiYmB5Toq598K+6yVittbwZUlADN813EDDxP2dwHgqDukJnkdwvyV3MB7vfyGf0Az7mzBN+3iEu85dXUnvIFvfrlu4aR6/XafwKy68b8ipQGK+mcW3n1/41ZffNzSPEUm/+RLc3jWMjfC37x/G8qWFdxef/MNt/cMYL0vyYnN09ez9NWFpiDviZxthjeY7KlJyEdeNgO1ZRpqRu7PrOFLL0pD9wFxKK/txF+Xh9k2C1AolWrmQuivNJMTH0zqTAhuD6asl6CW00ptGKTA+EyVPyTHkTLtFZ8s7nlVMk0bxtZ+rageeTci/29M/Lt/EuHtrQq6Er7AIC6RwR4am9shQ7MwzHn0QpW4EmDXV5YYzgHiqlC2WJIMHyNwrHelUqx1XdG2WdCLyotSABR4Bkj1km0IBPFVEcJ/0w6TxiMzcdEpQZaZd5UcOlMcWk3H7vlFVVdoQIfSkYjey6MNfog8X0cFA8/nWluY0vz6zpTX26xpLc9BLsWHV3LnsIeXpyQPI2Yl9qZOpVaUOFsswVfOS3IuYRT3+6eJuRK4/3Jr/fryz5TJKEMGf2TKf27++i4EQg5oc3168uzi7GwWQH6/PT+8uRuT84t2F+X8FpZV5reUnhlLbrrzMv2EzvEhKvHwkzEEqokXHqAM8Q/jHm3ekoHpJysIImzW0ShOVUbUkxyfPLICQ2mfz8BpT5NNJqUCqkxefRjWogbrqmU8WkNE3RluqUetBvS7M0LJ1bVo0njzFAxN1n4ELTeYsy1x9BM2yGgfc+fkam81AH6GtDFrkUVNJDXHZs6leKGbkpsaC6tl4oObRe1iP7TJXWkj/dLV67Vv30MwR/lKCXNdiHFsd+zWDxFexDQFZljk1A6SpPfmLyd14mMw4IIbnYdZm1aQpYVaT8dwydg/k008Xd8SJytTWAv1PQ+wftXELLVRXLcJqR9WbcOwCM+YXq+gQojEh0jLOwWtOuqR5vcI+Ogw8wA0jIoAunqQ5aJCqPs3GmlJpCxiMqjBmxQw0er4293dLyeZ6fHN91ny7esOOS1fYG4Phojot0HdE07VzsKCu0dHCA/rOnsf1Z/5URSh6hPjwszLTHpkLDbKQEIoqJV2hLDuIcfWeM7VLyIp5mVnHWIpyloFaCqHtsUzn1Ei6qpyZG/zQrA9suy0ef7wakZaeyg3HzR2lwMyaeSrYxcaS9RJCld0AODu8YtH5qmNaFBlzOyNbmCR4tnZ6dcY4lesKfgAvyorzEgoJCriuba+6BUSCKgRXcPCRWrC/9VBrjnC8wYn84ffR1+Q48o7Vs1084xg6kZDZAirRVdTULXGWY5pt02tkZcxXkonkHmtbjBrUQtx7/y8DDUPVVMZzg4Sp4DkTrLhRGJJQ9fJZ3DnVNylFOe0j08A+u/64M1V9uOy+jm3RY6SxU2vKArkSOvZ+FPsVms5NWx6dZiMZ8IVejnAP7fc+9juP5/KaRMrP7MlsXXYXN+0XvgDKJR7aozZ7hscP24rT72vcKVeRYLXe3FDhhfJG78F4WM430b7O0dX5o+dHFuwBeKUlKjhOgQUXJVTT3nx8T44l0GxsfIhxLjjTQjK+eIZ7p4RWez2aKUGW9CF0kTDvW/RjLcaOELMHKblnOjaROb+6jb21gNtXSaZMJeIB5HrTSk6kCCu5K7pwEBb74FUj+qCFMeSgjHfK1NIOoSZslvk7KKbe4WSCpgcdi1Hl2EsLB2HAY4epplgESNuKB7Ote3J6bwTRmEXGidBLqDiTGAffWMsVZNmjOZKK/JFMueQDg7B7LwyudXMugDn/8L7BvUtONMg8KKa//UCu6ANbWMG/Y7lxD0+vL7u3mymbz0ECT4DMQK+MJ/EpFfmZnah3iOOCp5/MVjm82HriVlOJfr5zB2j+SxE5AKfv/3rdsvTmS18sn7iSTd/PqNuCO6hkp4MnEopsPd6zSRDSipCwU5CZAcqtbz4iiuUso9J8udS66MYYovqvnr9qR6DtK42WSI84NXlnPEb4XGRRmB6p7Ih6JxlVatxxjnh7trylLDNoXKQGIXZgsj8fFNXleQce+JwsKT9ksxAPcQDZ+ABNohwo1yeq+iEIzZzyEN8kta20UuyhjX4mRAaUb4f+cm7b/6UCQziJBKqroZ/8UkLZxYC0cVRuL9xh4+bBbsYPn5OsPNzoAwW8gkz6cNNSi3EKxt8+DPYIoEVqPZaSYw/GrtPy4xVlbW3xKOTRMU2MIBkpsO5t2F/ZZdelRQRXZW48L7rlSr5MgWs2Z85ZdG4BAhkZj46l6Az7FpIudWeEgUPWJYeQMeO0NSjYVcHcBSaMzaJacEgxPOwQj4Ol8viIpotOZYeO/TgRJW/Pz270VFuPEABybEEZGbkj6jhpMyC/ghQ1b9D847DK1uMUkoxKSO2LXUo6TORhCfdg0T2hvQtKilIzvhjfw559WVywzQOMwrGkvnxocn/w1ZMKsGFw+FxAoglN7rlYZZAuXNRiHsXyusnKRFJLsB54WSvgaSVMbnHHu4slrVc8FKXfZugl5F2FKvOx1VL7EX1udZ8/Ztur+Nh8DHmh21KyDzaE2IEMpXVPj8wvVrtLZl75qWoZx+ruYSlCBJHUHESndvblc5XodRELCKGIcB6rkPDARKmyNQlYrawwVQNm9voct1nhXHhbH5aZZsW+fsJptZICxKGVROWi9GHIOtpdmq588BUAURfUABmdL8sYJXJvItWEnNlYu5jXYD1QaXhaS4PV+ER5SrWQe0p2Nb8BoNeFXaspd8fc9kN643ynAC4YyW5DYzaOB/Cb31++v6hCCn2+s9lVneCOqJ8W4IlI68Vr+9LjQXZwwMXvNovm43v7eTNoUbnkEiY0hzyovGuXvNvmSfBxAVIxhUw4foHny+NvXj7rKgaTTEjWodW3dzv8iD2oEXlulua/dkqgxPQBE7xrU7rTgE+jyG4Et1L0XVtvt90Xe6J21YtauNCEFp3bpILJ7urDR0lUBS8Eb+LD+KTDFT4kj72xGuRvaB5+mCEHcF2o9tdiHsu6cNUGbSwYL9yXjWdmY298Yuwjzrq8K1oUh0MTJz0Qm2/cRZWiPJU0ihCe+e9aYcLwC3l4dfLDbgHDGBPZfMLkMkqYVxV4FQFViCCt0j8OUH/4Mc5zdxPRIqSFcttq0bZl6ce4GWsz0TREQUxFu4dnnZKOUtEWMR2XGjRr4dqI51nV9b+Nti3FnZjfGiAovGsMoQrXyUnWWsQ2USstgeb74ianFo8rELRAzeLBXR31Xa8UFhlW8+SVIhYg47bPv0j+7ip4yKKkknINuJNznn/1WCOpaUdNY8g2xPD3fg6IpnDtPPpT7i/OcOViloaUKaNPSrMNtdsmmuiSZu0rAZok2UTqXnJ4imU2C5BVJUSof6+laWciXfu/7RweU/cHUyRjOXPlCi9/fP3+T4Rx9/6zSedKjovGtmFmu0bgr+9citYGiSLRwXIBv9g73ZNayQrZXWnVdSP5WlrLCa+DN/IyXtqOyNh8iahwgQyune+Ve/xJyT0puScl9+WUXPfJElsP/7iVfw6askxFrlq4hsmC3XVJN3z5R01vTR2VWTsu0Ri/WPWv5S4ObMOFqHXbNsOP6eFlPu2hiWwSqRZpN01hqtICBgdxv9qcBlM9s1YnMAdNB4nrY1qLujORFwL7MM39XPmu490kDHMwJvIe1s2+2d3E9gtVJ8kfeLYOXKNzDRKvqvopEzOaTTG8o6ZmhzTypehIhttVbqJat5pefn2So5r7jfT2GcK96L22dxXVq6ddba39AqU5mJLcVVpEj2+mPBHZtJlm66Z+YKm1SB9YbonIypwrosDd1+FOZPkaPop1xmmZ+HvihpZiPJLiHtZTB/3LDub6L2EUjKfw2SZnDRM7lV2DTLpgfDHFNm6Hlhh7GKWCbw9D21pRe1zEtpdcijJLjXvhDyr+9ePFzc8nF3+/OPt4d2FLeM1wSw/OxRm0ZPAAkbildk6j42Q2j86Unc9+azOgl3Yyci7JEOQsqpgJOgcHHbX46xCm4FYmS8jptFW8U6dtK2t4VzFFC+NcxqD7fantjGMvgdswsEVqW8R9L1eLx8jIg8geIB22iBuMzc50YTWm/WaG50HN7jFMq5lRR98wWUPW5DA0WVuxNUGt7MohKYqXgaIsJXQ+t5rWoiXHwKpjtYbwkQ3DGsQjMi855t+xKy9dLCQsjCYxEJ9tYrNcwOFGhdCMWrWq6ujtx6uzu8sPV0fYJvj0p59uLn46vbs4GlVZ2JAQHSaU16+i2JP5EFh2UmfXMBFU9noMOxPxgYNvjIC9lmmyDLywS/mYKgzDmA8d01glv6Cg9cR+nahHab7rm4vr05uLfXWeJ27K+piyM+Naes/jcO7I5fnwJEr4ZXq4bUDHQq4iDk/bgd+W5KftQJ36p+3A03Zg/+0AacT6v6w2DVe5+WpfR2XnlsD+e1KsT4r1SbGSJ8X6jSvWzpSGKotCSN3y53tq/MjmOr8WK2rtmsxWGK/BKAvXssreqx7o8EJoa8HdcUuf80pEbo9F0lpejHLy4dps/G6rDUTnaGmpl0Z6Wg3uyPaJnK6iZFe47rrCqAYe27nHjr3+C8khWVLOVG6GUaqWfuu2LbVDcS2JHJbXrtCYs33zErsIUKVqQbLL04pmIY2Mlgp6MmQrKo3i686Ob1kLgI0kHG4Pb2Sr30WSlNIeNvqb/QX1PV5siBa6k6j61Rk7TTY2RCNFiWcKGpJ56nO/mIlF+iQkwB7cZR3VQWKsoibMRhhvLn66vL27uMHU42+R9GspUVucNpz62xDu3BL1XVTAj/WneGzL0GH+hESzB8DS0I4II5mLLBOrah4aNwdyWJ1IyMUD3rmUDowl6rl8OCbi/a2sGAic1FtI1rFuk/fuRmnAfrVgtZPr1GVxo7YmFhHxB1DbsJ5C1k8h66eQ9VPI+guGrHusf61hZEzLRutfuUe+f4K/JAwd8aqZ0F2j2qhZo0U5ce9jQ4bYktF60zSExUeuNyduKrk/3A+FFeFcyKo5SU7XDt6uvkSj50OdN9sWBEajcmPvqqzspSFXXVh29ilqLHwUIYdwrCpKdHTP5U5kOMu6v6X2Jtq3hrBtNdovbmOWJdB0mghuT0UlzULfbXnVorNtoCMkrsmtoz8KSWjJFgt7yDNeFh1MJY2TDaw7bUV2LhUbCqoYp0w1N/c0M7sCPPqEbm57oBvIRwBfnHYJeAbGkb8CCeSei5Vv42RHgbuvOPG0pKk/iesvUDxWjCeo9koebiiu5qqqtAiT+Wzj/OHO6mvN35LiDaTRkfi0o2tiH7GzTCT3zdYGX3TCVkuhoHmCnzAV5B7DJMkSg0a7Ct9KMg3THg1JHrXyz51jV3PLccNvcLmFznLj3pWbuJ1STaeORYMEtk8J9xN4qbHhtU+xIpvdsqCKUHXvWn1hrsCsALeXrbUB6KL20LsJ1PZh9+CrnSnDxsbOhdtA0kF3EgegR+lcHzCD315AJbdqrdaXqYsSXuZTQ3sp4WBu7ZbGAz4XIBm2OqPE0WD2ZahHISmrPrpbqSTP+oNOcxwl3G2KqVygQjkcV3fcLfST7Q9+pjzuCnt+dds67Hl+dTve6YRnyuuNpLfpCLdXHzIzSedXt/6akeoYMgldg1wwrZBiIWluZW8BHKS/8bsG0KYSEG4EjCmSiIJVDW47PN3qTMq0sfHYgv7qDIptaIfelbu53jUyZxxr40MP8mgbNmnAZD4FwzBq7FkgJFswjjFu3/1Hrl1CCQfHuB1eDVzX8bHQzQGTOW0eYI5yQku9FJJpqvduC3aKXMJQuGWLPSfl0xNRnNVlKhhuaT0F61YfJmy2KHLKuF3kPjvlfHHVc4beDkxCUuIxsWnw/b7E8PzdHw7dg98luFQSjjH4npb2GlReNYLdYigpKLZ3P5sN8+TyCfZqFBVnlrQgRSlVCY27juyIAwey9YTc9LPD3xHTO9yQnZoav+YLy6QnM7TA5YqleCFCpEFqIAN5vQNIlpDcM76YpkyZef9K84W44gmrQTGaluKhTmwYV+tN3szN1oejZcnxxqhp7ynXQ40H81c6XPv/44uXzQ7SRbbGPWFD/dlDbAMHcwf1vdfw7jKbpJG4CZr06sPFzc2Hm86uV1YbNeKfG6xKrNxmYLhgZoJhi9p5FW22rWjC/QZc8HEhGW97zMmSSprgHQzHM8jEivzwEmPNM/EA5MXL17ZrrtFCZqcWPU4lVAcZGxtcqgiohBZgb+EnL577s4+KHP/z/Pz82YT8iSb39r4VjFOm5JdSYMhSgn+5YQDpTI1IQqVk2HsOZ1DZJHXGOJA5QGrfTwR/AOlSPP/UI/JPOar11jX//slr2bvO6VutVpOFEIsMJonoaswWprGxzWxnh91mUUIiZKoak9eF+/T09HQAYTOJ3sJoM+JivhvWy6sBnKCzdFpkpZoKPjhawCyHDR4VYxsSc6J7DHfvzp8RA4UIDjYqnNEZNE5j1+7fwZDZ3bvz//8FeslHcyEmMyonC5FRvpgIuZgcGUtxFH/R9J+AhAq5FDTIPGrfe/fu3FVp4P0hlBPIZ5CmgF6UD5DXAFpg5uml1sWbkxPs4peocj5nn5GCLv7SnP5qZk9Myvuu3jBcrbbqWjWkLTmhUtJ1fJUgJSnDnQI1viGeYrVbDcRHFPirfdzZ3tm65Vf1uhyO5lYR2GO8/jhG5O5I8rLrRlM5dJ9SriYO+Ser8uJkSoO8QUXbVK1a+Fyiqx+LSSEFSNSrnRPs/ujRF56YbdUFCllj5G2KOgl5//d+9NsrD2Pk9iCiS50EHuhse8GwDdu5BvlAM0OCax0f3QnRnKacrskMSEKTZcM+zWButA6LY90pUwmV2Oz9HyCFv/YgB8orzwk5Yd+p++RCV6gm3Wuglw8Nn3WTB2BIcAnmKpZiRz5xlSp4453VWUz5N/DSvBo4l6JDWcP9op/0GGaY3Tb9bhvG4AvrqyowEjZ+XmH5i6Pq7gcydpji30hbVQQEjdUE2vMgirOQ+D8nbownWWlMVDPrWnfxBJ+zRSmD/15djjXMom9EY0YEfQWteXU7TMJvqzlDh9SvtuKqnqyPXHIVyb/RkqsI2LDkWg9+rSVXIf5GllxE0G+15CISvpUl9+SwRLz4vTototCTdlexlkhdGFFyz3XKytHzo27gabvh7IZYV9xKPr7ZsVSgjEjfXpz1DAQ+66kcClNdfNbAU6g6abpCrqYarIb1p9Pzf7+4ue0ZXJkWU8V+3e2WH9e4WsjvFfl4fk0Kus4ETe0dbseM24Dds6p3qdlPRzmsP9/dtS82Ml/ulsVyUMljW5QajAfqTtoaydYdTIc6/NWufO1E1XE9fChSim5jFXhpSO40yqT7ISqhlafwUz3+eHPZQmVY5g+eeWWFR2hA+9eRFViQGKp14kbmPvGlBfn0ebxarcYG1riUGfYBh/RTd5vHodaHBzkq1ObrKclpEbtXOBZa6FJCWmsY3nX5bRPa39DMu2HYxpKF77YYfI1ZBhgE9o9VLfy6KmwdCehImFmotQkLKUhUSutQD6rACIBux4cIOj15TlX3DJg57WR/4zauFmebFarxYtmuqWbXWtuy8+bQYuuoQm0Rjth6MgSk97qyGEuxlFTthMe+0YvpSmgyFyVvlvv8/pZKO31t/+21VlrQsJHpfmulBXO2/qprJZQ0OOvKkjy2rpdn79vW1c6S+Wm3XuAONtmpVGQLd6zRvxUJ62riWgil2CyDqbUvzaX7qvH5dZcGsbrFTWpLR2zo0n7adYV8993VXVh1V6P7Id8qvrHdnoTrhb3z7YwxbKu+evXtF2JXbzVO+OmRDPNncPs45qA/kmWRq10tuxxy3G3Vruy2X7WWn/8h7fZwexZfhIHstAD9SmrWym41he3NnqcjwCXMGJ/c329uHUpbyuSuzD+y16Qf1WDNw/Xp4xlVkI7IkVGBR/Z8KnzW/mshyZGrjbQ/YgE3fq4BbBO2YclkjB+AH5KurMIPiWohQy2n+0GRD1fvfh5cvfjcAWfHk2Rzwg5PFTwLz9UuyO/N0ZIjBdqeBluA7si9Ni7CJ6JIsGrUGFTc9dozmVis1o27EWKzfBtevgfg2UV0Ps9QgzJXDSOs9jy6YaQesJCk2b/Rl+xFjCds3mKRuz57V3uxv0hgTKW6dCauPfQL9uPVX64+/O3qaESO3gmaHo1qUI9utZBgfrSXwJm/zkTJNUjzp9lgm//fZnR2pmWGUG4+nkm6yswTTVhUK3y8TBJQ+OdbysxbePiw1MujnW3Ef00mNQfVJdHowEJeZGJNKPfepMKLMEECHrOpS7iT2y44ObMHy2quhNN4WLp1rKAO7JNn9CRMoN3afIoMQsDSdc9VeA9Pj03rZ/UeOfu+BLFxZK+pK4M2OO7irBlwN8F2NVuVuD+xTT0SDhgifHcctp9tvzUZMTOsI7+TD7YzIYhiM0N+W1I8U+gvB6fBAvW7XKvBsHB6jkdk3XVrlamqAcSdc9MIDlrl3/UY7DQ8zMrkHvZNZToorgNUHFFwo2s3BWox06rG/deqUVclzaqKzlq1b+BNdWy6BuG4NR29mq5Gd7PE9jFcjOJrbt5DERvjdep3INPO8z2s27zFzPn29GVMYVsgA6s2ycpYf2OcMRmyjT97cHICp3zHn5gUcszmPtQ1xCTM6ruAy55zWSX3XX4AQ5UdVrZ2WU3drXFl0H4Q4bZovJPJ+DMp1XTkbuLBLD9TJGfYG2F4M/H1h1nXSF94nE61dQ/wkVJmHKDXr4hLz/jhKtt9yqUn/GxuFDc3Eb8FhV6BbLciMJ+5SUZsivENaT68yfCtNdhOgV45O5LtNh530nOQcvBow7dMoWVhClnHQZ7dllli91KE8URi9OkkBfcXQfgb3S3GmWYdN8Ufjg6HwVmukF7d3VQ9gJwJtd/tvlVYLvSDcaroKIA/8hpngBZJV9NGR5093JIo1kJX0c3g3mYdGQ9AkclkcoQ55qNMliQxu2T73aBltQTbopFps9DoUe6IrT+xVSkMlfr3KqMzYnbOii3491swMAWlD0KNAYSBJsH3JImWWuSi48DnTnNqqfKwSI7N56zZsyT5nwJJBD4bjWtceX+RHRqwJtRW7EVpytPZ+uj4j8+fjciRysTq6PiPL8zf2BlKKfYAR8d/fPls5EN0Rr7cCdt5A0FQYxiUs7HbAW41u/k+Zu5aAScEWnMhdzWdByXLb127yNrNXsLnQrN8340AVozhxdlrX3wXau7q9rzF2TqdMeDLeX3q//sPz0lK1+7ayxo211fQdcw54mJlY2+QKSCsvuN055hnSmSlBvKRs88tmo9/eDmesUHGqQygmHbs/3bUWQYMUWC7QTNOcpZI4enwevb7TJbTxEYf7SvDeiN21w5kQRv7O2xD5n8LZ+0H+MUFHgdtUbPTYdRbW4GkJeoJ4mD6Xq6NpdlRa9yKb/pqY185sNlJ/6VkHdGHfUahB2JTTLlGSloC5mhQESMNgyEKtz2kalpytn/I5+z0lhwnIi+ohDHl6VitaPGs1s8hrOLBjdzXI8iyDeNQqHzOTm9tzpKURUp1o43Itloc/Z1D7X8MMKY0S7yXHk5GkwuaLAlwLde2C3h0PqCzXsbV6BwZcp0rhjAHkzPt4o/HZlm9Vgja3ReNeJchZOIFX4h0FifizTfns54yGPvrn3qqTQ1yBX7wLt+RZEKBUzT2cLotX3Kq1EEkKyajy4hxGEu2WIJ0XeRCup+Q43l8HvYTlmN+QiZ/8kXPn57Zu4aN2HkMrvMtVWQFWdZXtlNxhOxUONDsUTkwRc6QerqqJmy+Pb+N1/mGlbXARTjH3pS4ejImtgvxgdUm1fMyy85EltnzLFc7nb+3vcbDyy6Jsc1TqEZtQWtCNfBagNX4LnhSHp8MjkoDRD3lV7punqnQ5HjyLAhXDcHAmWr/fMA9FyIU6UaYZ1Rab6dvVP4wdovRNs51J27vWbGHrr0F11SkipulInG7QC2IyJkmY9ueH/so+SJB2xLCPxt5p2WGD5qRG5M9rqHD0mMrS9FRhTLTjd4XfaO9wVf3tC1VOUZOP7O8zPsGP4Ool0U3STfu94NFLSsCAkuLrIMjfkbeSpFvh+dvS5BhR5iUUvm7IKyPxVSA2cbWvMx/sJ/Iv91+uKokA4/LhNSH6pplUiuWR1fNqSXsYmDUkJBAwNY5qRGhGXYBtSe08lJpklOdLG19UkBdg2+nMxwxq8lr+yafa1frGHD6N8kfkMgR+YOQKciZ+WvJuB6RP8DnIqPM3ezwB8VpoZZCt3lpReotqv1bvGZlWz3fyVq8s1zFljCMzansIFJtjnfRUpmEbubj2cXAfVbvw02dWWk0O/W01LWsV4j+7na7BXnRIew7sulPbTbVW4NZSTPiYkF7ZVS9I5wbSbCjRQYa2mTZJw5GlENoJbUAORcybzZqeYu3bdQuHIq69jjPd0QU2DaaHy3ID37/pgIBtHbeNPgO7ykvadYeqtUXlzv4jE7DRB57M3f44Xp6c3H97md/oYtZx679Z3QdzorGuTRPrzeszv0Na6tIeh2tGr0feHJzfdZfgE0GPLPPrJcNBmYoVouOm1Vc6PDXE5pljzj5dX2Gb9qjXujW+Pht556gyNaPQ2LNw1ZYWhnzXuY4oPh8B6CdQ1Yx7Kgfu4HTA36qdK8+GYBmhLejrrrncP10ntGHfr1l8DRu/7EvdEmJhHRS7tj60QsJyO+VvfuApSMzhMQ4pUZfl3o5Ljn73IdxsQ9GXH6PQTkoQwG8jaKZPbNHpHbDpDTNd/OeT+WMaUnxktdwQhwcSSSnyZJxwMPGvmFmH2737KZD6XFpaxi4ezfadq/VL1m86V7f/vVd35bb/Lbb8U4PnuzWplQ197C7x9L81tbQHDobYnOy7u1sdYpRy870o78jZCrFap/Ybo0wH+s22G2J6LzMerfZgYYawKj5gliFQ9cZVRrVJPSoXMYVyEZr5M1kX17dXtzc+c6o21HN0q5OXRxWZvOAVEBqaO8gEnsmV/GWbam8vXh3cbaZymjOw1aqBk7MvWs80JrQ0NiQia9KIc76AH07bMHQsxcru2x9z1qFBqvyoCL35Hs1cHzKFvoeoJgsuhYkjibhCurF2z77tBUW4yJ3xq48Nqc3+Txu6Hz1tt3Q+ertLXl4dfLDbmf1LFyy51G9zVw21IWcgo/JWvnqYGnOuJDTvfEgmM3YNB0E9/CKnH14f/3h49V51MtZ067cTKtqekAIDOwKHob2bJ8ZxlvfR76Cp6UGyxjcLvd02M+tU9DwdL3kFYu6xb4WSi8k9Jvt6oHdbLdHtJswPkLbIKJ9tc0hfAavnK8Xh3IaOnVgy1WrZijSddv2f9lK3XVi6U8TWpgKHkDWi5c2A/Uv7XAA2DbjrX/39vTu9F3ju+vTq8uzL+QjzL95H2EvCps+gtMlElIW27Eb87lHjeBvu2kQD57spEEsma2DHVtlGuuVckhy5WNzQrt24J3tv3ZPotWRfckUmsUUOr+6udRLyeY6msw7/GJ8c33WM6PVA7v5KAHTbvPa6oSzYUZtLEUvRWrDVVGbm4GpDBuV87r6mLMMGv1xbAItAlu6XJ/CdJNRZEF11YOpH/QS5IopB+LyPGqC4WfNoOo5KGqmjiU7CHe8l49nzcIxRjOFedxk7/L8nR1xZ0TvMeurXeXTIMbMkQvIMhVKt6uZqkHcYgH6+71205koKfHCq+D0b1CrZ7an16+6LNafd+/a+wC31t7teL2LznbXnEvKU7Wk9zBNRF5koPe9suBv7lYMnOp3t4TDQmhm3dNw7VpllkJeRoFS7pkaPHTmsFud7QIPPJHrAhOqva0synzfUTjRMAOICLPEOwSuwTgpJDwwUSr/YB9JiGdqtVOLuJ2qZBxxfYRZBVPyFGSGmRqnEVGz4D1Fol4Ve8RS224hHu7lOZ431iy5B139bD8T+KyB94zW3koxTUBqe6oapiELfjjZcrd2WKPpc+y6uhRDizjaDYRpBVl93L7wwr0REdw/qiVkWbsx4C4Np9pb4iEx2MAR4lVtva+OmamwhZ6t4+CxvzIer2vQogXNeCMltzxLS2mTlaxLuuNBuUteIJ0mrFj2NZ5qlrZtMbh3rrzNgY3HwBSm75FCgYZ47qsMArFNcLcA2D9QvTk5Wa1WE0Y5nQi5OLEF9Jh1PtGZGlcmvvFx8nmp8+z/q3857mn7FbFF5Fj+XumAg7EorgKM0LhlX2OZo6fjJuetGGOgjw3YMUsbnyxburkQlEX3kDdeg4zldGbdRZCMeD+wtHIr7Ah3vYPYapGp+TBl9rbl7kvqhtZni2AvtEuhNDqH7cvoQoqgwKsd0TZkdA1yGpr4RJZzX4LaQkOitRXRMEYagu4YXm8D9wi7BTi15uILkQ98oZde5Xm7ZTGObA2xFRF76TonkBd67apIOyEam5E+GDOgINxbhUoFgXZG56wA/Q7NAhY8uM40W2jOS+3Lb7CyVemqLNcruXq9Jh5iNW4ypF381hF5rZ5FTuKQq30WB2tpgsE5LN8sTKJKpiFgagwv7N5Q93pZa4GbrR81qJa5OPAAW3Ziq2G2YAUtvP0Yv4o1aJYM23+brMGeyrjLdrfIv3KAII3Rkbre/W0V60fl7mvmXJQ8cbVRtKFiwzGXXtEnVvyj+SCn2YquVVMZb7WJ2KhdayM7q17scRVsAWetIGbSoat3VtYd92rXKPv7j8//1cUEqsbkPdpAMppNO8KzO6x/XO0VM7CSxYBt59Ji1Fzoqe1V34m3UYrYQnpu2O563Ud7j2hOmG1ygBcSDtBA57pn6FuRgK/3UIBn/mrRrhi5vQNseg/rKc0WQjK9zA+rggPYhgWuT5alw2Bpm2S7lSc3t6cjcn57aryci7Pz29PNQ2rU5pGthfeW/RqiijFp3fLr7538qixsibunoodKmmmQHM97Tq2z3kXjxn3ZbYkNlMlpBY5cYWC4a2Z7aJF0tc86xwaV8SLj5PrifTtgWpuksqsb9Ja22A86uj/SKtnmaOswNtlhPAoqu0zpTtbtzIJp9rxtYhNyQTn79SAbrQ8RLHemaCu8NJuWnO1tzz9yZo9HM14DP0AFGkeedN2/vxPqawfHaCEJCzN+R4ibzQEaEpHngk95V3/7Hcm4wrSHxK23O9jky6Er+79xHTKlyh67s3FNXHDN9Npvr1RpHD2eEnfd+dPSeFoav5ul0Rft+CJeud9vPnnlT175k1deG82TV/7klZMnr/zRKJ9cj9+d69FF0JNX/rQ0npbGFk75NFlS1j50MdhZ6GyJhxbmRMtS6WC1nVe+VW3Ml6Fgq+ocmoG0l5ft2ayy60ZlnzpFJAjU3qv8gKcP8EsJCbCHzsrNOeMLkIVkvKPZ0+Bu6W30ZuWvREVaW++M/pP+8Di1+W+nPyBCnzKpKOrRkL1LZknVct+10p2uMj6WoTMiDrE1JUixQa1aP6L9BeizuS7rFON1dllSZtiEYQlI8OS7/xcAAP//idOd/g==" + return "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" } diff --git a/winlogbeat/Makefile b/winlogbeat/Makefile index 4d53434f531..234ca977df6 100644 --- a/winlogbeat/Makefile +++ b/winlogbeat/Makefile @@ -12,4 +12,4 @@ gen: # Collects all dependencies and then calls update .PHONY: collect -collect: fields +collect: diff --git a/winlogbeat/_meta/fields.yml b/winlogbeat/_meta/fields.common.yml similarity index 100% rename from winlogbeat/_meta/fields.yml rename to winlogbeat/_meta/fields.common.yml diff --git a/winlogbeat/include/fields.go b/winlogbeat/include/fields.go index 72b66f72c28..13b2c1de07f 100644 --- a/winlogbeat/include/fields.go +++ b/winlogbeat/include/fields.go @@ -31,5 +31,5 @@ func init() { // Asset returns asset data func Asset() string { - return "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" + return "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" }