From e92c6b8f2c6d954d64c89e0c97dbbe7b87b19644 Mon Sep 17 00:00:00 2001 From: Andrew Kroh Date: Thu, 20 Dec 2018 04:07:18 -0500 Subject: [PATCH] Update Filebeat's magefile.go (#9700) * Update Filebeat's magefile.go This improves and fixes a few issues. - Generate field docs that include fields from x-pack/filebeat. - Generate fields.go for each Filebeat module. - Add direct packaging build targets to x-pack/filebeat (packaging is no longer done via OSS filebeat). * Add goTestUnit alias --- Makefile | 4 +- auditbeat/magefile.go | 4 +- auditbeat/scripts/mage/docs.go | 13 +- dev-tools/mage/common.go | 12 + dev-tools/mage/config.go | 8 + dev-tools/mage/docs.go | 3 +- dev-tools/mage/fields.go | 13 +- dev-tools/mage/fmt.go | 4 +- filebeat/Makefile | 49 +- filebeat/README.md | 4 - filebeat/docker-compose.yml | 6 +- filebeat/docs/fields.asciidoc | 5241 ++++++++++++++++++- filebeat/docs/modules/suricata.asciidoc | 8 + filebeat/filebeat.reference.yml | 38 +- filebeat/include/fields.go | 2 +- filebeat/include/list.go | 27 +- filebeat/magefile.go | 295 +- filebeat/module/apache2/fields.go | 35 + filebeat/module/auditd/fields.go | 35 + filebeat/module/elasticsearch/fields.go | 35 + filebeat/module/haproxy/fields.go | 35 + filebeat/module/icinga/fields.go | 35 + filebeat/module/iis/fields.go | 35 + filebeat/module/kafka/fields.go | 35 + filebeat/module/kibana/fields.go | 35 + filebeat/module/logstash/fields.go | 35 + filebeat/module/mongodb/fields.go | 35 + filebeat/module/mysql/fields.go | 35 + filebeat/module/nginx/fields.go | 35 + filebeat/module/osquery/fields.go | 35 + filebeat/module/postgresql/fields.go | 35 + filebeat/module/redis/fields.go | 35 + filebeat/module/santa/fields.go | 35 + filebeat/module/system/fields.go | 35 + filebeat/module/traefik/fields.go | 35 + filebeat/scripts/docs_collector.py | 6 +- filebeat/scripts/generate_imports_helper.py | 22 - filebeat/scripts/mage/config.go | 71 + filebeat/scripts/mage/docs.go | 43 + filebeat/scripts/mage/package.go | 120 + filebeat/tests/system/test_keystore.py | 2 - filebeat/tests/system/test_stdin.py | 13 +- libbeat/scripts/Makefile | 2 +- libbeat/scripts/generate_fields_docs.py | 11 +- magefile.go | 26 + x-pack/auditbeat/magefile.go | 2 +- x-pack/filebeat/docker-compose.yml | 1 + x-pack/filebeat/filebeat.docker.yml | 12 + x-pack/filebeat/magefile.go | 151 +- 49 files changed, 6144 insertions(+), 699 deletions(-) create mode 100644 filebeat/module/apache2/fields.go create mode 100644 filebeat/module/auditd/fields.go create mode 100644 filebeat/module/elasticsearch/fields.go create mode 100644 filebeat/module/haproxy/fields.go create mode 100644 filebeat/module/icinga/fields.go create mode 100644 filebeat/module/iis/fields.go create mode 100644 filebeat/module/kafka/fields.go create mode 100644 filebeat/module/kibana/fields.go create mode 100644 filebeat/module/logstash/fields.go create mode 100644 filebeat/module/mongodb/fields.go create mode 100644 filebeat/module/mysql/fields.go create mode 100644 filebeat/module/nginx/fields.go create mode 100644 filebeat/module/osquery/fields.go create mode 100644 filebeat/module/postgresql/fields.go create mode 100644 filebeat/module/redis/fields.go create mode 100644 filebeat/module/santa/fields.go create mode 100644 filebeat/module/system/fields.go create mode 100644 filebeat/module/traefik/fields.go delete mode 100644 filebeat/scripts/generate_imports_helper.py create mode 100644 filebeat/scripts/mage/config.go create mode 100644 filebeat/scripts/mage/docs.go create mode 100644 filebeat/scripts/mage/package.go create mode 100644 x-pack/filebeat/filebeat.docker.yml diff --git a/Makefile b/Makefile index ce6953c2c4d..28ba91767c0 100644 --- a/Makefile +++ b/Makefile @@ -16,12 +16,12 @@ XPACK_SUFFIX=x-pack/ # PROJECTS_XPACK_PKG is a list of Beats that have independent packaging support # in the x-pack directory (rather than having the OSS build produce both sets # of artifacts). This will be removed once we complete the transition. -PROJECTS_XPACK_PKG=x-pack/auditbeat +PROJECTS_XPACK_PKG=x-pack/auditbeat x-pack/filebeat # PROJECTS_XPACK_MAGE is a list of Beats whose primary build logic is based in # Mage. For compatibility with CI testing these projects support a subset of the # makefile targets. After all Beats converge to primarily using Mage we can # remove this and treat all sub-projects the same. -PROJECTS_XPACK_MAGE=x-pack/filebeat x-pack/metricbeat $(PROJECTS_XPACK_PKG) +PROJECTS_XPACK_MAGE=x-pack/metricbeat $(PROJECTS_XPACK_PKG) # Runs complete testsuites (unit, system, integration) for all beats with coverage and race detection. # Also it builds the docs and the generators diff --git a/auditbeat/magefile.go b/auditbeat/magefile.go index 3effbe0a511..e80747a902b 100644 --- a/auditbeat/magefile.go +++ b/auditbeat/magefile.go @@ -131,13 +131,13 @@ func Docs() { // combinedDocs builds combined documentation for both OSS and X-Pack. func combinedDocs() error { - return auditbeat.CollectDocs(mage.OSSBeatDir(), auditbeat.XpackBeatDir()) + return auditbeat.CollectDocs(mage.OSSBeatDir(), mage.XPackBeatDir()) } // xpackFields creates x-pack/auditbeat/fields.yml - necessary to build // a combined documentation. func xpackFields() error { - return mage.Mage(auditbeat.XpackBeatDir(), "fields") + return mage.Mage(mage.XPackBeatDir(), "fields") } // Fmt formats source code and adds file headers. diff --git a/auditbeat/scripts/mage/docs.go b/auditbeat/scripts/mage/docs.go index d8c70bbae16..64dac3300e5 100644 --- a/auditbeat/scripts/mage/docs.go +++ b/auditbeat/scripts/mage/docs.go @@ -86,16 +86,5 @@ func CollectDocs(basePaths ...string) error { return err } - esBeats, err := mage.ElasticBeatsDir() - if err != nil { - return err - } - - return sh.Run(python, mage.LibbeatDir("scripts/generate_fields_docs.py"), - XpackBeatDir(), mage.BeatName, esBeats, "--output_path", mage.OSSBeatDir()) -} - -// XpackBeatDir returns the x-pack/{beatname} directory for a Beat. -func XpackBeatDir() string { - return mage.OSSBeatDir("../x-pack", mage.BeatName) + return mage.Docs.FieldDocs(mage.XPackBeatDir("fields.yml")) } diff --git a/dev-tools/mage/common.go b/dev-tools/mage/common.go index 57ca7c85bf6..18e812531fb 100644 --- a/dev-tools/mage/common.go +++ b/dev-tools/mage/common.go @@ -693,6 +693,12 @@ func OSSBeatDir(path ...string) string { return filepath.Join(append([]string{ossDir}, path...)...) } +// XPackBeatDir returns the X-Pack beat directory. You can pass paths and they +// will be joined and appended to the X-Pack beat dir. +func XPackBeatDir(path ...string) string { + return OSSBeatDir(append([]string{XPackDir, BeatName}, path...)...) +} + // LibbeatDir returns the libbeat directory. You can pass paths and // they will be joined and appended to the libbeat dir. func LibbeatDir(path ...string) string { @@ -705,7 +711,13 @@ func LibbeatDir(path ...string) string { } // createDir creates the parent directory for the given file. +// Deprecated: Use CreateDir. func createDir(file string) string { + return CreateDir(file) +} + +// CreateDir creates the parent directory for the given file. +func CreateDir(file string) string { // Create the output directory. if dir := filepath.Dir(file); dir != "." { if err := os.MkdirAll(dir, 0755); err != nil { diff --git a/dev-tools/mage/config.go b/dev-tools/mage/config.go index 9c12df03759..68061ef3691 100644 --- a/dev-tools/mage/config.go +++ b/dev-tools/mage/config.go @@ -27,6 +27,8 @@ import ( "sort" "strings" + "github.com/magefile/mage/mg" + "github.com/pkg/errors" "gopkg.in/yaml.v2" ) @@ -63,8 +65,11 @@ func (t ConfigFileType) IsDocker() bool { return t&DockerConfigType > 0 } // ConfigFileParams defines the files that make up each config file. type ConfigFileParams struct { ShortParts []string // List of files or globs. + ShortDeps []interface{} ReferenceParts []string // List of files or globs. + ReferenceDeps []interface{} DockerParts []string // List of files or globs. + DockerDeps []interface{} ExtraVars map[string]interface{} } @@ -122,18 +127,21 @@ func makeConfigTemplates(types ConfigFileType, args ConfigFileParams) error { var err error if types.IsShort() { + mg.SerialDeps(args.ShortDeps...) if err = makeConfigTemplate(shortTemplate, 0600, args.ShortParts...); err != nil { return err } } if types.IsReference() { + mg.SerialDeps(args.ReferenceDeps...) if err = makeConfigTemplate(referenceTemplate, 0644, args.ReferenceParts...); err != nil { return err } } if types.IsDocker() { + mg.SerialDeps(args.DockerDeps...) if err = makeConfigTemplate(dockerTemplate, 0600, args.DockerParts...); err != nil { return err } diff --git a/dev-tools/mage/docs.go b/dev-tools/mage/docs.go index edf0551e6ff..51bd96c2f22 100644 --- a/dev-tools/mage/docs.go +++ b/dev-tools/mage/docs.go @@ -19,7 +19,6 @@ package mage import ( "log" - "path/filepath" "github.com/magefile/mage/sh" ) @@ -49,7 +48,7 @@ func (b docsBuilder) FieldDocs(fieldsYML string) error { log.Println(">> Generating docs/fields.asciidoc for", BeatName) return sh.Run(python, LibbeatDir("scripts/generate_fields_docs.py"), - filepath.Dir(fieldsYML), // Path to dir containing fields.yml. + fieldsYML, // Path to fields.yml. BeatName, // Beat title. esBeats, // Path to general beats folder. "--output_path", OSSBeatDir()) // It writes to {output_path}/docs/fields.asciidoc. diff --git a/dev-tools/mage/fields.go b/dev-tools/mage/fields.go index 6117afed378..60716592a95 100644 --- a/dev-tools/mage/fields.go +++ b/dev-tools/mage/fields.go @@ -32,10 +32,17 @@ import ( // moduleDirs specifies additional directories to search for modules. The // contents of each fields.yml will be included in the generated file. func GenerateFieldsYAML(moduleDirs ...string) error { - return generateFieldsYAML(OSSBeatDir(), moduleDirs...) + return generateFieldsYAML(OSSBeatDir(), "fields.yml", moduleDirs...) } -func generateFieldsYAML(baseDir string, moduleDirs ...string) error { +// GenerateFieldsYAMLTo generates a YAML file containing the field definitions +// for the Beat. It's the same as GenerateFieldsYAML but with a configurable +// output file. +func GenerateFieldsYAMLTo(output string, moduleDirs ...string) error { + return generateFieldsYAML(OSSBeatDir(), output, moduleDirs...) +} + +func generateFieldsYAML(baseDir, output string, moduleDirs ...string) error { const globalFieldsCmdPath = "libbeat/scripts/cmd/global_fields/main.go" beatsDir, err := ElasticBeatsDir() @@ -47,7 +54,7 @@ func generateFieldsYAML(baseDir string, moduleDirs ...string) error { filepath.Join(beatsDir, globalFieldsCmdPath), "-es_beats_path", beatsDir, "-beat_path", baseDir, - "-out", "fields.yml", + "-out", output, ) return globalFieldsCmd(moduleDirs...) diff --git a/dev-tools/mage/fmt.go b/dev-tools/mage/fmt.go index d0dba1cecad..0a2c04a4249 100644 --- a/dev-tools/mage/fmt.go +++ b/dev-tools/mage/fmt.go @@ -79,7 +79,9 @@ func GoImports() error { // ignores build/ directories. func PythonAutopep8() error { pyFiles, err := FindFilesRecursive(func(path string, _ os.FileInfo) bool { - return filepath.Ext(path) == ".py" && !strings.Contains(path, "build/") + return filepath.Ext(path) == ".py" && + !strings.Contains(path, "build/") && + !strings.Contains(path, "vendor/") }) if err != nil { return err diff --git a/filebeat/Makefile b/filebeat/Makefile index c9d05826e6b..6e37e664325 100644 --- a/filebeat/Makefile +++ b/filebeat/Makefile @@ -4,60 +4,25 @@ SYSTEM_TESTS?=true TEST_ENVIRONMENT?=true GOX_FLAGS=-arch="amd64 386 arm ppc64 ppc64le" ES_BEATS?=.. -FIELDS_FILE_PATH=module - -DOCS_BRANCH=$(shell grep doc-branch ../libbeat/docs/version.asciidoc | cut -c 14-) +EXCLUDE_COMMON_UPDATE_TARGET=true include ${ES_BEATS}/libbeat/scripts/Makefile -# Collects all module dashboards -.PHONY: kibana -kibana: - @rm -rf _meta/kibana.generated - @mkdir -p _meta/kibana.generated - @-cp -pr module/*/_meta/kibana/* _meta/kibana.generated - -# Collects all module configs -.PHONY: configs -configs: python-env - @cp ${ES_BEATS}/filebeat/_meta/common.p1.yml _meta/beat.yml - @cat ${ES_BEATS}/filebeat/_meta/common.p2.yml >> _meta/beat.yml - @cat ${ES_BEATS}/filebeat/_meta/common.reference.p1.yml > _meta/beat.reference.yml - @${PYTHON_ENV}/bin/python ${ES_BEATS}/script/config_collector.py --beat ${BEAT_NAME} --full $(PWD) >> _meta/beat.reference.yml - @cat ${ES_BEATS}/filebeat/_meta/common.reference.inputs.yml >> _meta/beat.reference.yml - @cat ${ES_BEATS}/filebeat/_meta/common.reference.p2.yml >> _meta/beat.reference.yml - @rm -rf modules.d - ${PYTHON_ENV}/bin/python ${ES_BEATS}/script/modules_collector.py --beat ${BEAT_NAME} --docs_branch=$(DOCS_BRANCH) - @chmod go-w modules.d/* - -# Collects all module docs -.PHONY: collect-docs -collect-docs: python-env - @rm -rf docs/modules - @mkdir -p docs/modules - @${PYTHON_ENV}/bin/python ${ES_BEATS}/filebeat/scripts/docs_collector.py --beat ${BEAT_NAME} - -# Generate imports for inputs -.PHONY: imports -imports: python-env - @mkdir -p include - @${PYTHON_ENV}/bin/python ${ES_BEATS}/script/generate_imports.py ${BEAT_PATH} - -# Runs all collection steps and updates afterwards -.PHONY: collect -collect: kibana configs collect-docs imports +.PHONY: update +update: mage + mage update -# Creates a new module. Requires the params MODULE +# Creates a new module. Requires the params MODULE. .PHONY: create-module create-module: @go run ${ES_BEATS}/filebeat/scripts/generator/module/main.go --path=$(PWD) --beats_path=$(BEAT_GOPATH)/src/$(BEAT_PATH) --module=$(MODULE) -# Creates a new fileset. Requires the params MODULE and FILESET +# Creates a new fileset. Requires the params MODULE and FILESET. .PHONY: create-fileset create-fileset: @go run ${ES_BEATS}/filebeat/scripts/generator/fileset/main.go --path=$(PWD) --beats_path=$(BEAT_GOPATH)/src/$(BEAT_PATH) --module=$(MODULE) --fileset=$(FILESET) -# Creates a fields.yml based on a pipeline.json file. Requires the params MODULE and FILESET +# Creates a fields.yml based on a pipeline.json file. Requires the params MODULE and FILESET. .PHONY: create-fields create-fields: @go run ${ES_BEATS}/filebeat/scripts/generator/fields/main.go --beats_path=$(BEAT_GOPATH)/src/$(BEAT_PATH) --module=$(MODULE) --fileset=$(FILESET) diff --git a/filebeat/README.md b/filebeat/README.md index 0fbc3a60b54..6bbe0057ba1 100644 --- a/filebeat/README.md +++ b/filebeat/README.md @@ -30,7 +30,3 @@ If you are sure you found a bug or have a feature request, open an issue on We love contributions from our community! Please read the [CONTRIBUTING.md](../CONTRIBUTING.md) file. - -## Snapshots - -For testing purposes, we generate snapshot builds that you can find [here](https://beats-nightlies.s3.amazonaws.com/index.html?prefix=filebeat). Please be aware that these are built on top of master and are not meant for production. diff --git a/filebeat/docker-compose.yml b/filebeat/docker-compose.yml index f010c8c999c..8cd7bf1a06b 100644 --- a/filebeat/docker-compose.yml +++ b/filebeat/docker-compose.yml @@ -5,9 +5,13 @@ services: depends_on: - proxy_dep env_file: - - ${PWD}/build/test.env - ${PWD}/input/redis/_meta/env environment: + - BEAT_STRICT_PERMS=false + - ES_HOST=elasticsearch + - ES_PORT=9200 + - ES_USER=beats + - ES_PASS=testing - KIBANA_HOST=kibana - KIBANA_PORT=5601 working_dir: /go/src/github.com/elastic/beats/filebeat diff --git a/filebeat/docs/fields.asciidoc b/filebeat/docs/fields.asciidoc index 270188d2f6f..88fde061b9a 100644 --- a/filebeat/docs/fields.asciidoc +++ b/filebeat/docs/fields.asciidoc @@ -30,11 +30,13 @@ grouped in the following categories: * <> * <> * <> +* <> * <> * <> * <> * <> * <> +* <> * <> * <> @@ -6279,387 +6281,3590 @@ The connection ID for the query. -- -[[exported-fields-nginx]] -== Nginx fields +[[exported-fields-netflow]] +== NetFlow fields -Module for parsing the Nginx log files. +Fields from NetFlow and IPFIX flows. [float] -== nginx fields - -Fields from the Nginx log files. +== netflow fields +Fields from NetFlow and IPFIX. -[float] -== access fields -Contains fields for the Nginx access logs. +*`netflow.type`*:: ++ +-- +type: keyword +The type of NetFlow record described by this event. -*`nginx.access.body_sent.bytes`*:: -+ -- -type: long -format: bytes +[float] +== exporter fields -The number of bytes of the server response body. +Metadata related to the exporter device that generated this record. --- -*`nginx.access.remote_ip_list`*:: +*`netflow.exporter.address`*:: + -- -type: alias +type: keyword + +Exporter's network address in IP:port format. -alias to: network.forwarded_ip -- -*`nginx.access.remote_ip`*:: +*`netflow.exporter.source_id`*:: + -- -type: alias +type: long + +Observation domain ID to which this record belongs. -alias to: source.ip -- -*`nginx.access.user_name`*:: +*`netflow.exporter.timestamp`*:: + -- -type: alias +type: date + +Time and date of export. -alias to: user.name -- -*`nginx.access.method`*:: +*`netflow.exporter.uptime_millis`*:: + -- -type: alias +type: long + +How long the exporter process has been running, in milliseconds. -alias to: http.request.method -- -*`nginx.access.url`*:: +*`netflow.exporter.version`*:: + -- -type: alias +type: long + +NetFlow version used. -alias to: url.original -- -*`nginx.access.http_version`*:: +*`netflow.octet_delta_count`*:: + -- -type: alias - -alias to: http.version +type: long -- -*`nginx.access.response_code`*:: +*`netflow.packet_delta_count`*:: + -- -type: alias - -alias to: http.response.status_code +type: long -- -*`nginx.access.referrer`*:: +*`netflow.delta_flow_count`*:: + -- -type: alias - -alias to: http.request.referrer +type: long -- -*`nginx.access.agent`*:: +*`netflow.protocol_identifier`*:: + -- -type: alias +type: short -alias to: user_agent.original +-- +*`netflow.ip_class_of_service`*:: ++ -- +type: short +-- -*`nginx.access.user_agent.device`*:: +*`netflow.tcp_control_bits`*:: + -- -type: alias - -alias to: user_agent.device +type: integer -- -*`nginx.access.user_agent.major`*:: +*`netflow.source_transport_port`*:: + -- -type: alias - -alias to: user_agent.major +type: integer -- -*`nginx.access.user_agent.minor`*:: +*`netflow.source_ipv4_address`*:: + -- -type: alias - -alias to: user_agent.minor +type: ip -- -*`nginx.access.user_agent.patch`*:: +*`netflow.source_ipv4_prefix_length`*:: + -- -type: alias - -alias to: user_agent.patch +type: short -- -*`nginx.access.user_agent.name`*:: +*`netflow.ingress_interface`*:: + -- -type: alias - -alias to: user_agent.name +type: long -- -*`nginx.access.user_agent.os`*:: +*`netflow.destination_transport_port`*:: + -- -type: alias - -alias to: user_agent.os.full_name +type: integer -- -*`nginx.access.user_agent.os_major`*:: +*`netflow.destination_ipv4_address`*:: + -- -type: alias - -alias to: user_agent.os.major +type: ip -- -*`nginx.access.user_agent.os_minor`*:: +*`netflow.destination_ipv4_prefix_length`*:: + -- -type: alias - -alias to: user_agent.os.minor +type: short -- -*`nginx.access.user_agent.os_name`*:: +*`netflow.egress_interface`*:: + -- -type: alias - -alias to: user_agent.os.name +type: long -- -*`nginx.access.user_agent.original`*:: +*`netflow.ip_next_hop_ipv4_address`*:: + -- -type: alias +type: ip -alias to: user_agent.original +-- +*`netflow.bgp_source_as_number`*:: ++ -- +type: long +-- -*`nginx.access.geoip.continent_name`*:: +*`netflow.bgp_destination_as_number`*:: + -- -type: alias - -alias to: source.geo.continent_name +type: long -- -*`nginx.access.geoip.country_iso_code`*:: +*`netflow.bgp_next_hop_ipv4_address`*:: + -- -type: alias - -alias to: source.geo.country_iso_code +type: ip -- -*`nginx.access.geoip.location`*:: +*`netflow.post_mcast_packet_delta_count`*:: + -- -type: alias - -alias to: source.geo.location +type: long -- -*`nginx.access.geoip.region_name`*:: +*`netflow.post_mcast_octet_delta_count`*:: + -- -type: alias - -alias to: source.geo.region_name +type: long -- -*`nginx.access.geoip.city_name`*:: +*`netflow.flow_end_sys_up_time`*:: + -- -type: alias - -alias to: source.geo.city_name +type: long -- -*`nginx.access.geoip.region_iso_code`*:: +*`netflow.flow_start_sys_up_time`*:: + -- -type: alias - -alias to: source.geo.region_iso_code +type: long -- -[float] -== error fields +*`netflow.post_octet_delta_count`*:: ++ +-- +type: long -Contains fields for the Nginx error logs. +-- +*`netflow.post_packet_delta_count`*:: ++ +-- +type: long +-- -*`nginx.error.level`*:: +*`netflow.minimum_ip_total_length`*:: + -- -type: keyword +type: long -Error level (e.g. error, critical). +-- +*`netflow.maximum_ip_total_length`*:: ++ +-- +type: long -- -*`nginx.error.pid`*:: +*`netflow.source_ipv6_address`*:: + -- -type: long +type: ip -Process identifier (PID). +-- +*`netflow.destination_ipv6_address`*:: ++ +-- +type: ip -- -*`nginx.error.tid`*:: +*`netflow.source_ipv6_prefix_length`*:: + -- -type: long +type: short -Thread identifier. +-- +*`netflow.destination_ipv6_prefix_length`*:: ++ +-- +type: short -- -*`nginx.error.connection_id`*:: +*`netflow.flow_label_ipv6`*:: + -- type: long -Connection identifier. +-- +*`netflow.icmp_type_code_ipv4`*:: ++ +-- +type: integer -- -*`nginx.error.message`*:: +*`netflow.igmp_type`*:: + -- -type: text +type: short -The error message +-- +*`netflow.sampling_interval`*:: ++ +-- +type: long -- -[[exported-fields-osquery]] -== Osquery fields +*`netflow.sampling_algorithm`*:: ++ +-- +type: short -Fields exported by the `osquery` module +-- +*`netflow.flow_active_timeout`*:: ++ +-- +type: integer +-- -[float] -== osquery fields +*`netflow.flow_idle_timeout`*:: ++ +-- +type: integer +-- +*`netflow.engine_type`*:: ++ +-- +type: short +-- -[float] -== result fields +*`netflow.engine_id`*:: ++ +-- +type: short -Common fields exported by the result metricset. +-- +*`netflow.exported_octet_total_count`*:: ++ +-- +type: long +-- -*`osquery.result.name`*:: +*`netflow.exported_message_total_count`*:: + -- -type: keyword +type: long -The name of the query that generated this event. +-- +*`netflow.exported_flow_record_total_count`*:: ++ +-- +type: long -- -*`osquery.result.action`*:: +*`netflow.ipv4_router_sc`*:: + -- -type: keyword +type: ip -For incremental data, marks whether the entry was added or removed. It can be one of "added", "removed", or "snapshot". +-- +*`netflow.source_ipv4_prefix`*:: ++ +-- +type: ip -- -*`osquery.result.host_identifier`*:: +*`netflow.destination_ipv4_prefix`*:: + -- -type: keyword +type: ip -The identifier for the host on which the osquery agent is running. Normally the hostname. +-- +*`netflow.mpls_top_label_type`*:: ++ +-- +type: short -- -*`osquery.result.unix_time`*:: +*`netflow.mpls_top_label_ipv4_address`*:: + -- -type: long +type: ip -Unix timestamp of the event, in seconds since the epoch. Used for computing the `@timestamp` column. +-- +*`netflow.sampler_id`*:: ++ +-- +type: short -- -*`osquery.result.calendar_time`*:: +*`netflow.sampler_mode`*:: + -- -String representation of the collection time, as formatted by osquery. +type: short + +-- + +*`netflow.sampler_random_interval`*:: ++ +-- +type: long + +-- + +*`netflow.class_id`*:: ++ +-- +type: short + +-- + +*`netflow.minimum_ttl`*:: ++ +-- +type: short + +-- + +*`netflow.maximum_ttl`*:: ++ +-- +type: short + +-- + +*`netflow.fragment_identification`*:: ++ +-- +type: long + +-- + +*`netflow.post_ip_class_of_service`*:: ++ +-- +type: short + +-- + +*`netflow.source_mac_address`*:: ++ +-- +type: keyword + +-- + +*`netflow.post_destination_mac_address`*:: ++ +-- +type: keyword + +-- + +*`netflow.vlan_id`*:: ++ +-- +type: integer + +-- + +*`netflow.post_vlan_id`*:: ++ +-- +type: integer + +-- + +*`netflow.ip_version`*:: ++ +-- +type: short + +-- + +*`netflow.flow_direction`*:: ++ +-- +type: short + +-- + +*`netflow.ip_next_hop_ipv6_address`*:: ++ +-- +type: ip + +-- + +*`netflow.bgp_next_hop_ipv6_address`*:: ++ +-- +type: ip + +-- + +*`netflow.ipv6_extension_headers`*:: ++ +-- +type: long + +-- + +*`netflow.mpls_top_label_stack_section`*:: ++ +-- +type: short + +-- + +*`netflow.mpls_label_stack_section2`*:: ++ +-- +type: short + +-- + +*`netflow.mpls_label_stack_section3`*:: ++ +-- +type: short + +-- + +*`netflow.mpls_label_stack_section4`*:: ++ +-- +type: short + +-- + +*`netflow.mpls_label_stack_section5`*:: ++ +-- +type: short + +-- + +*`netflow.mpls_label_stack_section6`*:: ++ +-- +type: short + +-- + +*`netflow.mpls_label_stack_section7`*:: ++ +-- +type: short + +-- + +*`netflow.mpls_label_stack_section8`*:: ++ +-- +type: short + +-- + +*`netflow.mpls_label_stack_section9`*:: ++ +-- +type: short + +-- + +*`netflow.mpls_label_stack_section10`*:: ++ +-- +type: short + +-- + +*`netflow.destination_mac_address`*:: ++ +-- +type: keyword + +-- + +*`netflow.post_source_mac_address`*:: ++ +-- +type: keyword + +-- + +*`netflow.interface_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.interface_description`*:: ++ +-- +type: keyword + +-- + +*`netflow.sampler_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.octet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.packet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.flags_and_sampler_id`*:: ++ +-- +type: long + +-- + +*`netflow.fragment_offset`*:: ++ +-- +type: integer + +-- + +*`netflow.forwarding_status`*:: ++ +-- +type: short + +-- + +*`netflow.mpls_vpn_route_distinguisher`*:: ++ +-- +type: short + +-- + +*`netflow.mpls_top_label_prefix_length`*:: ++ +-- +type: short + +-- + +*`netflow.src_traffic_index`*:: ++ +-- +type: long + +-- + +*`netflow.dst_traffic_index`*:: ++ +-- +type: long + +-- + +*`netflow.application_description`*:: ++ +-- +type: keyword + +-- + +*`netflow.application_id`*:: ++ +-- +type: short + +-- + +*`netflow.application_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.post_ip_diff_serv_code_point`*:: ++ +-- +type: short + +-- + +*`netflow.multicast_replication_factor`*:: ++ +-- +type: long + +-- + +*`netflow.class_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.classification_engine_id`*:: ++ +-- +type: short + +-- + +*`netflow.layer2packet_section_offset`*:: ++ +-- +type: integer + +-- + +*`netflow.layer2packet_section_size`*:: ++ +-- +type: integer + +-- + +*`netflow.layer2packet_section_data`*:: ++ +-- +type: short + +-- + +*`netflow.bgp_next_adjacent_as_number`*:: ++ +-- +type: long + +-- + +*`netflow.bgp_prev_adjacent_as_number`*:: ++ +-- +type: long + +-- + +*`netflow.exporter_ipv4_address`*:: ++ +-- +type: ip + +-- + +*`netflow.exporter_ipv6_address`*:: ++ +-- +type: ip + +-- + +*`netflow.dropped_octet_delta_count`*:: ++ +-- +type: long + +-- + +*`netflow.dropped_packet_delta_count`*:: ++ +-- +type: long + +-- + +*`netflow.dropped_octet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.dropped_packet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.flow_end_reason`*:: ++ +-- +type: short + +-- + +*`netflow.common_properties_id`*:: ++ +-- +type: long + +-- + +*`netflow.observation_point_id`*:: ++ +-- +type: long + +-- + +*`netflow.icmp_type_code_ipv6`*:: ++ +-- +type: integer + +-- + +*`netflow.mpls_top_label_ipv6_address`*:: ++ +-- +type: ip + +-- + +*`netflow.line_card_id`*:: ++ +-- +type: long + +-- + +*`netflow.port_id`*:: ++ +-- +type: long + +-- + +*`netflow.metering_process_id`*:: ++ +-- +type: long + +-- + +*`netflow.exporting_process_id`*:: ++ +-- +type: long + +-- + +*`netflow.template_id`*:: ++ +-- +type: integer + +-- + +*`netflow.wlan_channel_id`*:: ++ +-- +type: short + +-- + +*`netflow.wlan_ssid`*:: ++ +-- +type: keyword + +-- + +*`netflow.flow_id`*:: ++ +-- +type: long + +-- + +*`netflow.observation_domain_id`*:: ++ +-- +type: long + +-- + +*`netflow.flow_start_seconds`*:: ++ +-- +type: date + +-- + +*`netflow.flow_end_seconds`*:: ++ +-- +type: date + +-- + +*`netflow.flow_start_milliseconds`*:: ++ +-- +type: date + +-- + +*`netflow.flow_end_milliseconds`*:: ++ +-- +type: date + +-- + +*`netflow.flow_start_microseconds`*:: ++ +-- +type: date + +-- + +*`netflow.flow_end_microseconds`*:: ++ +-- +type: date + +-- + +*`netflow.flow_start_nanoseconds`*:: ++ +-- +type: date + +-- + +*`netflow.flow_end_nanoseconds`*:: ++ +-- +type: date + +-- + +*`netflow.flow_start_delta_microseconds`*:: ++ +-- +type: long + +-- + +*`netflow.flow_end_delta_microseconds`*:: ++ +-- +type: long + +-- + +*`netflow.system_init_time_milliseconds`*:: ++ +-- +type: date + +-- + +*`netflow.flow_duration_milliseconds`*:: ++ +-- +type: long + +-- + +*`netflow.flow_duration_microseconds`*:: ++ +-- +type: long + +-- + +*`netflow.observed_flow_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.ignored_packet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.ignored_octet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.not_sent_flow_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.not_sent_packet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.not_sent_octet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.destination_ipv6_prefix`*:: ++ +-- +type: ip + +-- + +*`netflow.source_ipv6_prefix`*:: ++ +-- +type: ip + +-- + +*`netflow.post_octet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.post_packet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.flow_key_indicator`*:: ++ +-- +type: long + +-- + +*`netflow.post_mcast_packet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.post_mcast_octet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.icmp_type_ipv4`*:: ++ +-- +type: short + +-- + +*`netflow.icmp_code_ipv4`*:: ++ +-- +type: short + +-- + +*`netflow.icmp_type_ipv6`*:: ++ +-- +type: short + +-- + +*`netflow.icmp_code_ipv6`*:: ++ +-- +type: short + +-- + +*`netflow.udp_source_port`*:: ++ +-- +type: integer + +-- + +*`netflow.udp_destination_port`*:: ++ +-- +type: integer + +-- + +*`netflow.tcp_source_port`*:: ++ +-- +type: integer + +-- + +*`netflow.tcp_destination_port`*:: ++ +-- +type: integer + +-- + +*`netflow.tcp_sequence_number`*:: ++ +-- +type: long + +-- + +*`netflow.tcp_acknowledgement_number`*:: ++ +-- +type: long + +-- + +*`netflow.tcp_window_size`*:: ++ +-- +type: integer + +-- + +*`netflow.tcp_urgent_pointer`*:: ++ +-- +type: integer + +-- + +*`netflow.tcp_header_length`*:: ++ +-- +type: short + +-- + +*`netflow.ip_header_length`*:: ++ +-- +type: short + +-- + +*`netflow.total_length_ipv4`*:: ++ +-- +type: integer + +-- + +*`netflow.payload_length_ipv6`*:: ++ +-- +type: integer + +-- + +*`netflow.ip_ttl`*:: ++ +-- +type: short + +-- + +*`netflow.next_header_ipv6`*:: ++ +-- +type: short + +-- + +*`netflow.mpls_payload_length`*:: ++ +-- +type: long + +-- + +*`netflow.ip_diff_serv_code_point`*:: ++ +-- +type: short + +-- + +*`netflow.ip_precedence`*:: ++ +-- +type: short + +-- + +*`netflow.fragment_flags`*:: ++ +-- +type: short + +-- + +*`netflow.octet_delta_sum_of_squares`*:: ++ +-- +type: long + +-- + +*`netflow.octet_total_sum_of_squares`*:: ++ +-- +type: long + +-- + +*`netflow.mpls_top_label_ttl`*:: ++ +-- +type: short + +-- + +*`netflow.mpls_label_stack_length`*:: ++ +-- +type: long + +-- + +*`netflow.mpls_label_stack_depth`*:: ++ +-- +type: long + +-- + +*`netflow.mpls_top_label_exp`*:: ++ +-- +type: short + +-- + +*`netflow.ip_payload_length`*:: ++ +-- +type: long + +-- + +*`netflow.udp_message_length`*:: ++ +-- +type: integer + +-- + +*`netflow.is_multicast`*:: ++ +-- +type: short + +-- + +*`netflow.ipv4_ihl`*:: ++ +-- +type: short + +-- + +*`netflow.ipv4_options`*:: ++ +-- +type: long + +-- + +*`netflow.tcp_options`*:: ++ +-- +type: long + +-- + +*`netflow.padding_octets`*:: ++ +-- +type: short + +-- + +*`netflow.collector_ipv4_address`*:: ++ +-- +type: ip + +-- + +*`netflow.collector_ipv6_address`*:: ++ +-- +type: ip + +-- + +*`netflow.export_interface`*:: ++ +-- +type: long + +-- + +*`netflow.export_protocol_version`*:: ++ +-- +type: short + +-- + +*`netflow.export_transport_protocol`*:: ++ +-- +type: short + +-- + +*`netflow.collector_transport_port`*:: ++ +-- +type: integer + +-- + +*`netflow.exporter_transport_port`*:: ++ +-- +type: integer + +-- + +*`netflow.tcp_syn_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.tcp_fin_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.tcp_rst_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.tcp_psh_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.tcp_ack_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.tcp_urg_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.ip_total_length`*:: ++ +-- +type: long + +-- + +*`netflow.post_nast_ource_ipv4_address`*:: ++ +-- +type: ip + +-- + +*`netflow.post_nadt_estination_ipv4_address`*:: ++ +-- +type: ip + +-- + +*`netflow.post_napst_ource_transport_port`*:: ++ +-- +type: integer + +-- + +*`netflow.post_napdt_estination_transport_port`*:: ++ +-- +type: integer + +-- + +*`netflow.nat_originating_address_realm`*:: ++ +-- +type: short + +-- + +*`netflow.nat_event`*:: ++ +-- +type: short + +-- + +*`netflow.initiator_octets`*:: ++ +-- +type: long + +-- + +*`netflow.responder_octets`*:: ++ +-- +type: long + +-- + +*`netflow.firewall_event`*:: ++ +-- +type: short + +-- + +*`netflow.ingress_vrfid`*:: ++ +-- +type: long + +-- + +*`netflow.egress_vrfid`*:: ++ +-- +type: long + +-- + +*`netflow.vr_fname`*:: ++ +-- +type: keyword + +-- + +*`netflow.post_mpls_top_label_exp`*:: ++ +-- +type: short + +-- + +*`netflow.tcp_window_scale`*:: ++ +-- +type: integer + +-- + +*`netflow.biflow_direction`*:: ++ +-- +type: short + +-- + +*`netflow.ethernet_header_length`*:: ++ +-- +type: short + +-- + +*`netflow.ethernet_payload_length`*:: ++ +-- +type: integer + +-- + +*`netflow.ethernet_total_length`*:: ++ +-- +type: integer + +-- + +*`netflow.dot1q_vlan_id`*:: ++ +-- +type: integer + +-- + +*`netflow.dot1q_priority`*:: ++ +-- +type: short + +-- + +*`netflow.dot1q_customer_vlan_id`*:: ++ +-- +type: integer + +-- + +*`netflow.dot1q_customer_priority`*:: ++ +-- +type: short + +-- + +*`netflow.metro_evc_id`*:: ++ +-- +type: keyword + +-- + +*`netflow.metro_evc_type`*:: ++ +-- +type: short + +-- + +*`netflow.pseudo_wire_id`*:: ++ +-- +type: long + +-- + +*`netflow.pseudo_wire_type`*:: ++ +-- +type: integer + +-- + +*`netflow.pseudo_wire_control_word`*:: ++ +-- +type: long + +-- + +*`netflow.ingress_physical_interface`*:: ++ +-- +type: long + +-- + +*`netflow.egress_physical_interface`*:: ++ +-- +type: long + +-- + +*`netflow.post_dot1q_vlan_id`*:: ++ +-- +type: integer + +-- + +*`netflow.post_dot1q_customer_vlan_id`*:: ++ +-- +type: integer + +-- + +*`netflow.ethernet_type`*:: ++ +-- +type: integer + +-- + +*`netflow.post_ip_precedence`*:: ++ +-- +type: short + +-- + +*`netflow.collection_time_milliseconds`*:: ++ +-- +type: date + +-- + +*`netflow.export_sctp_stream_id`*:: ++ +-- +type: integer + +-- + +*`netflow.max_export_seconds`*:: ++ +-- +type: date + +-- + +*`netflow.max_flow_end_seconds`*:: ++ +-- +type: date + +-- + +*`netflow.message_md5_checksum`*:: ++ +-- +type: short + +-- + +*`netflow.message_scope`*:: ++ +-- +type: short + +-- + +*`netflow.min_export_seconds`*:: ++ +-- +type: date + +-- + +*`netflow.min_flow_start_seconds`*:: ++ +-- +type: date + +-- + +*`netflow.opaque_octets`*:: ++ +-- +type: short + +-- + +*`netflow.session_scope`*:: ++ +-- +type: short + +-- + +*`netflow.max_flow_end_microseconds`*:: ++ +-- +type: date + +-- + +*`netflow.max_flow_end_milliseconds`*:: ++ +-- +type: date + +-- + +*`netflow.max_flow_end_nanoseconds`*:: ++ +-- +type: date + +-- + +*`netflow.min_flow_start_microseconds`*:: ++ +-- +type: date + +-- + +*`netflow.min_flow_start_milliseconds`*:: ++ +-- +type: date + +-- + +*`netflow.min_flow_start_nanoseconds`*:: ++ +-- +type: date + +-- + +*`netflow.collector_certificate`*:: ++ +-- +type: short + +-- + +*`netflow.exporter_certificate`*:: ++ +-- +type: short + +-- + +*`netflow.data_records_reliability`*:: ++ +-- +type: boolean + +-- + +*`netflow.observation_point_type`*:: ++ +-- +type: short + +-- + +*`netflow.new_connection_delta_count`*:: ++ +-- +type: long + +-- + +*`netflow.connection_sum_duration_seconds`*:: ++ +-- +type: long + +-- + +*`netflow.connection_transaction_id`*:: ++ +-- +type: long + +-- + +*`netflow.post_nast_ource_ipv6_address`*:: ++ +-- +type: ip + +-- + +*`netflow.post_nadt_estination_ipv6_address`*:: ++ +-- +type: ip + +-- + +*`netflow.nat_pool_id`*:: ++ +-- +type: long + +-- + +*`netflow.nat_pool_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.anonymization_flags`*:: ++ +-- +type: integer + +-- + +*`netflow.anonymization_technique`*:: ++ +-- +type: integer + +-- + +*`netflow.information_element_index`*:: ++ +-- +type: integer + +-- + +*`netflow.p2p_technology`*:: ++ +-- +type: keyword + +-- + +*`netflow.tunnel_technology`*:: ++ +-- +type: keyword + +-- + +*`netflow.encrypted_technology`*:: ++ +-- +type: keyword + +-- + +*`netflow.bgp_validity_state`*:: ++ +-- +type: short + +-- + +*`netflow.ip_sec_spi`*:: ++ +-- +type: long + +-- + +*`netflow.gre_key`*:: ++ +-- +type: long + +-- + +*`netflow.nat_type`*:: ++ +-- +type: short + +-- + +*`netflow.initiator_packets`*:: ++ +-- +type: long + +-- + +*`netflow.responder_packets`*:: ++ +-- +type: long + +-- + +*`netflow.observation_domain_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.selection_sequence_id`*:: ++ +-- +type: long + +-- + +*`netflow.selector_id`*:: ++ +-- +type: long + +-- + +*`netflow.information_element_id`*:: ++ +-- +type: integer + +-- + +*`netflow.selector_algorithm`*:: ++ +-- +type: integer + +-- + +*`netflow.sampling_packet_interval`*:: ++ +-- +type: long + +-- + +*`netflow.sampling_packet_space`*:: ++ +-- +type: long + +-- + +*`netflow.sampling_time_interval`*:: ++ +-- +type: long + +-- + +*`netflow.sampling_time_space`*:: ++ +-- +type: long + +-- + +*`netflow.sampling_size`*:: ++ +-- +type: long + +-- + +*`netflow.sampling_population`*:: ++ +-- +type: long + +-- + +*`netflow.sampling_probability`*:: ++ +-- +type: double + +-- + +*`netflow.data_link_frame_size`*:: ++ +-- +type: integer + +-- + +*`netflow.ip_header_packet_section`*:: ++ +-- +type: short + +-- + +*`netflow.ip_payload_packet_section`*:: ++ +-- +type: short + +-- + +*`netflow.data_link_frame_section`*:: ++ +-- +type: short + +-- + +*`netflow.mpls_label_stack_section`*:: ++ +-- +type: short + +-- + +*`netflow.mpls_payload_packet_section`*:: ++ +-- +type: short + +-- + +*`netflow.selector_id_total_pkts_observed`*:: ++ +-- +type: long + +-- + +*`netflow.selector_id_total_pkts_selected`*:: ++ +-- +type: long + +-- + +*`netflow.absolute_error`*:: ++ +-- +type: double + +-- + +*`netflow.relative_error`*:: ++ +-- +type: double + +-- + +*`netflow.observation_time_seconds`*:: ++ +-- +type: date + +-- + +*`netflow.observation_time_milliseconds`*:: ++ +-- +type: date + +-- + +*`netflow.observation_time_microseconds`*:: ++ +-- +type: date + +-- + +*`netflow.observation_time_nanoseconds`*:: ++ +-- +type: date + +-- + +*`netflow.digest_hash_value`*:: ++ +-- +type: long + +-- + +*`netflow.hash_ipp_ayload_offset`*:: ++ +-- +type: long + +-- + +*`netflow.hash_ipp_ayload_size`*:: ++ +-- +type: long + +-- + +*`netflow.hash_output_range_min`*:: ++ +-- +type: long + +-- + +*`netflow.hash_output_range_max`*:: ++ +-- +type: long + +-- + +*`netflow.hash_selected_range_min`*:: ++ +-- +type: long + +-- + +*`netflow.hash_selected_range_max`*:: ++ +-- +type: long + +-- + +*`netflow.hash_digest_output`*:: ++ +-- +type: boolean + +-- + +*`netflow.hash_initialiser_value`*:: ++ +-- +type: long + +-- + +*`netflow.selector_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.upper_cli_imit`*:: ++ +-- +type: double + +-- + +*`netflow.lower_cli_imit`*:: ++ +-- +type: double + +-- + +*`netflow.confidence_level`*:: ++ +-- +type: double + +-- + +*`netflow.information_element_data_type`*:: ++ +-- +type: short + +-- + +*`netflow.information_element_description`*:: ++ +-- +type: keyword + +-- + +*`netflow.information_element_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.information_element_range_begin`*:: ++ +-- +type: long + +-- + +*`netflow.information_element_range_end`*:: ++ +-- +type: long + +-- + +*`netflow.information_element_semantics`*:: ++ +-- +type: short + +-- + +*`netflow.information_element_units`*:: ++ +-- +type: integer + +-- + +*`netflow.private_enterprise_number`*:: ++ +-- +type: long + +-- + +*`netflow.virtual_station_interface_id`*:: ++ +-- +type: short + +-- + +*`netflow.virtual_station_interface_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.virtual_station_uuid`*:: ++ +-- +type: short + +-- + +*`netflow.virtual_station_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.layer2_segment_id`*:: ++ +-- +type: long + +-- + +*`netflow.layer2_octet_delta_count`*:: ++ +-- +type: long + +-- + +*`netflow.layer2_octet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.ingress_unicast_packet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.ingress_multicast_packet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.ingress_broadcast_packet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.egress_unicast_packet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.egress_broadcast_packet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.monitoring_interval_start_milli_seconds`*:: ++ +-- +type: date + +-- + +*`netflow.monitoring_interval_end_milli_seconds`*:: ++ +-- +type: date + +-- + +*`netflow.port_range_start`*:: ++ +-- +type: integer + +-- + +*`netflow.port_range_end`*:: ++ +-- +type: integer + +-- + +*`netflow.port_range_step_size`*:: ++ +-- +type: integer + +-- + +*`netflow.port_range_num_ports`*:: ++ +-- +type: integer + +-- + +*`netflow.sta_mac_address`*:: ++ +-- +type: keyword + +-- + +*`netflow.sta_ipv4_address`*:: ++ +-- +type: ip + +-- + +*`netflow.wtp_mac_address`*:: ++ +-- +type: keyword + +-- + +*`netflow.ingress_interface_type`*:: ++ +-- +type: long + +-- + +*`netflow.egress_interface_type`*:: ++ +-- +type: long + +-- + +*`netflow.rtp_sequence_number`*:: ++ +-- +type: integer + +-- + +*`netflow.user_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.application_category_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.application_sub_category_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.application_group_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.original_flows_present`*:: ++ +-- +type: long + +-- + +*`netflow.original_flows_initiated`*:: ++ +-- +type: long + +-- + +*`netflow.original_flows_completed`*:: ++ +-- +type: long + +-- + +*`netflow.distinct_count_of_sourc_eipa_ddress`*:: ++ +-- +type: long + +-- + +*`netflow.distinct_count_of_destinatio_nipa_ddress`*:: ++ +-- +type: long + +-- + +*`netflow.distinct_count_of_source_ipv4_address`*:: ++ +-- +type: long + +-- + +*`netflow.distinct_count_of_destination_ipv4_address`*:: ++ +-- +type: long + +-- + +*`netflow.distinct_count_of_source_ipv6_address`*:: ++ +-- +type: long + +-- + +*`netflow.distinct_count_of_destination_ipv6_address`*:: ++ +-- +type: long + +-- + +*`netflow.value_distribution_method`*:: ++ +-- +type: short + +-- + +*`netflow.rfc3550_jitter_milliseconds`*:: ++ +-- +type: long + +-- + +*`netflow.rfc3550_jitter_microseconds`*:: ++ +-- +type: long + +-- + +*`netflow.rfc3550_jitter_nanoseconds`*:: ++ +-- +type: long + +-- + +*`netflow.dot1q_dei`*:: ++ +-- +type: boolean + +-- + +*`netflow.dot1q_customer_dei`*:: ++ +-- +type: boolean + +-- + +*`netflow.flow_selector_algorithm`*:: ++ +-- +type: integer + +-- + +*`netflow.flow_selected_octet_delta_count`*:: ++ +-- +type: long + +-- + +*`netflow.flow_selected_packet_delta_count`*:: ++ +-- +type: long + +-- + +*`netflow.flow_selected_flow_delta_count`*:: ++ +-- +type: long + +-- + +*`netflow.selector_itd_otal_flows_observed`*:: ++ +-- +type: long + +-- + +*`netflow.selector_itd_otal_flows_selected`*:: ++ +-- +type: long + +-- + +*`netflow.sampling_flow_interval`*:: ++ +-- +type: long + +-- + +*`netflow.sampling_flow_spacing`*:: ++ +-- +type: long + +-- + +*`netflow.flow_sampling_time_interval`*:: ++ +-- +type: long + +-- + +*`netflow.flow_sampling_time_spacing`*:: ++ +-- +type: long + +-- + +*`netflow.hash_flow_domain`*:: ++ +-- +type: integer + +-- + +*`netflow.transport_octet_delta_count`*:: ++ +-- +type: long + +-- + +*`netflow.transport_packet_delta_count`*:: ++ +-- +type: long + +-- + +*`netflow.original_exporter_ipv4_address`*:: ++ +-- +type: ip + +-- + +*`netflow.original_exporter_ipv6_address`*:: ++ +-- +type: ip + +-- + +*`netflow.original_observation_domain_id`*:: ++ +-- +type: long + +-- + +*`netflow.intermediate_process_id`*:: ++ +-- +type: long + +-- + +*`netflow.ignored_data_record_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.data_link_frame_type`*:: ++ +-- +type: integer + +-- + +*`netflow.section_offset`*:: ++ +-- +type: integer + +-- + +*`netflow.section_exported_octets`*:: ++ +-- +type: integer + +-- + +*`netflow.dot1q_service_instance_tag`*:: ++ +-- +type: short + +-- + +*`netflow.dot1q_service_instance_id`*:: ++ +-- +type: long + +-- + +*`netflow.dot1q_service_instance_priority`*:: ++ +-- +type: short + +-- + +*`netflow.dot1q_customer_source_mac_address`*:: ++ +-- +type: keyword + +-- + +*`netflow.dot1q_customer_destination_mac_address`*:: ++ +-- +type: keyword + +-- + +*`netflow.post_layer2_octet_delta_count`*:: ++ +-- +type: long + +-- + +*`netflow.post_mcast_layer2_octet_delta_count`*:: ++ +-- +type: long + +-- + +*`netflow.post_layer2_octet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.post_mcast_layer2_octet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.minimum_layer2_total_length`*:: ++ +-- +type: long + +-- + +*`netflow.maximum_layer2_total_length`*:: ++ +-- +type: long + +-- + +*`netflow.dropped_layer2_octet_delta_count`*:: ++ +-- +type: long + +-- + +*`netflow.dropped_layer2_octet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.ignored_layer2_octet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.not_sent_layer2_octet_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.layer2_octet_delta_sum_of_squares`*:: ++ +-- +type: long + +-- + +*`netflow.layer2_octet_total_sum_of_squares`*:: ++ +-- +type: long + +-- + +*`netflow.layer2_frame_delta_count`*:: ++ +-- +type: long + +-- + +*`netflow.layer2_frame_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.pseudo_wire_destination_ipv4_address`*:: ++ +-- +type: ip + +-- + +*`netflow.ignored_layer2_frame_total_count`*:: ++ +-- +type: long + +-- + +*`netflow.mib_object_value_integer`*:: ++ +-- +type: integer + +-- + +*`netflow.mib_object_value_octet_string`*:: ++ +-- +type: short + +-- + +*`netflow.mib_object_value_oid`*:: ++ +-- +type: short + +-- + +*`netflow.mib_object_value_bits`*:: ++ +-- +type: short + +-- + +*`netflow.mib_object_valuei_pa_ddress`*:: ++ +-- +type: ip + +-- + +*`netflow.mib_object_value_counter`*:: ++ +-- +type: long + +-- + +*`netflow.mib_object_value_gauge`*:: ++ +-- +type: long + +-- + +*`netflow.mib_object_value_time_ticks`*:: ++ +-- +type: long + +-- + +*`netflow.mib_object_value_unsigned`*:: ++ +-- +type: long + +-- + +*`netflow.mib_object_identifier`*:: ++ +-- +type: short + +-- + +*`netflow.mib_sub_identifier`*:: ++ +-- +type: long + +-- + +*`netflow.mib_index_indicator`*:: ++ +-- +type: long + +-- + +*`netflow.mib_capture_time_semantics`*:: ++ +-- +type: short + +-- + +*`netflow.mib_context_engine_id`*:: ++ +-- +type: short + +-- + +*`netflow.mib_context_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.mib_object_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.mib_object_description`*:: ++ +-- +type: keyword + +-- + +*`netflow.mib_object_syntax`*:: ++ +-- +type: keyword + +-- + +*`netflow.mib_module_name`*:: ++ +-- +type: keyword + +-- + +*`netflow.mobile_imsi`*:: ++ +-- +type: keyword + +-- + +*`netflow.mobile_msisdn`*:: ++ +-- +type: keyword + +-- + +*`netflow.http_status_code`*:: ++ +-- +type: integer + +-- + +*`netflow.source_transport_ports_limit`*:: ++ +-- +type: integer + +-- + +*`netflow.http_request_method`*:: ++ +-- +type: keyword + +-- + +*`netflow.http_request_host`*:: ++ +-- +type: keyword + +-- + +*`netflow.http_request_target`*:: ++ +-- +type: keyword + +-- + +*`netflow.http_message_version`*:: ++ +-- +type: keyword + +-- + +*`netflow.nat_instance_id`*:: ++ +-- +type: long + +-- + +*`netflow.internal_address_realm`*:: ++ +-- +type: short + +-- + +*`netflow.external_address_realm`*:: ++ +-- +type: short + +-- + +*`netflow.nat_quota_exceeded_event`*:: ++ +-- +type: long + +-- + +*`netflow.nat_threshold_event`*:: ++ +-- +type: long + +-- + +*`netflow.http_user_agent`*:: ++ +-- +type: keyword + +-- + +*`netflow.http_content_type`*:: ++ +-- +type: keyword + +-- + +*`netflow.http_reason_phrase`*:: ++ +-- +type: keyword + +-- + +*`netflow.max_session_entries`*:: ++ +-- +type: long + +-- + +*`netflow.max_bieb_ntries`*:: ++ +-- +type: long + +-- + +*`netflow.max_entries_per_user`*:: ++ +-- +type: long + +-- + +*`netflow.max_subscribers`*:: ++ +-- +type: long + +-- + +*`netflow.max_fragments_pending_reassembly`*:: ++ +-- +type: long + +-- + +*`netflow.address_pool_high_threshold`*:: ++ +-- +type: long + +-- + +*`netflow.address_pool_low_threshold`*:: ++ +-- +type: long + +-- + +*`netflow.address_port_mapping_high_threshold`*:: ++ +-- +type: long + +-- + +*`netflow.address_port_mapping_low_threshold`*:: ++ +-- +type: long + +-- + +*`netflow.address_port_mapping_per_user_high_threshold`*:: ++ +-- +type: long + +-- + +*`netflow.global_address_mapping_high_threshold`*:: ++ +-- +type: long + +-- + +*`netflow.vpn_identifier`*:: ++ +-- +type: short + +-- + +[[exported-fields-nginx]] +== Nginx fields + +Module for parsing the Nginx log files. + + + +[float] +== nginx fields + +Fields from the Nginx log files. + + + +[float] +== access fields + +Contains fields for the Nginx access logs. + + + +*`nginx.access.body_sent.bytes`*:: ++ +-- +type: long + +format: bytes + +The number of bytes of the server response body. + + +-- + +*`nginx.access.remote_ip_list`*:: ++ +-- +type: alias + +alias to: network.forwarded_ip + +-- + +*`nginx.access.remote_ip`*:: ++ +-- +type: alias + +alias to: source.ip + +-- + +*`nginx.access.user_name`*:: ++ +-- +type: alias + +alias to: user.name + +-- + +*`nginx.access.method`*:: ++ +-- +type: alias + +alias to: http.request.method + +-- + +*`nginx.access.url`*:: ++ +-- +type: alias + +alias to: url.original + +-- + +*`nginx.access.http_version`*:: ++ +-- +type: alias + +alias to: http.version + +-- + +*`nginx.access.response_code`*:: ++ +-- +type: alias + +alias to: http.response.status_code + +-- + +*`nginx.access.referrer`*:: ++ +-- +type: alias + +alias to: http.request.referrer + +-- + +*`nginx.access.agent`*:: ++ +-- +type: alias + +alias to: user_agent.original + +-- + + +*`nginx.access.user_agent.device`*:: ++ +-- +type: alias + +alias to: user_agent.device + +-- + +*`nginx.access.user_agent.major`*:: ++ +-- +type: alias + +alias to: user_agent.major + +-- + +*`nginx.access.user_agent.minor`*:: ++ +-- +type: alias + +alias to: user_agent.minor + +-- + +*`nginx.access.user_agent.patch`*:: ++ +-- +type: alias + +alias to: user_agent.patch + +-- + +*`nginx.access.user_agent.name`*:: ++ +-- +type: alias + +alias to: user_agent.name + +-- + +*`nginx.access.user_agent.os`*:: ++ +-- +type: alias + +alias to: user_agent.os.full_name + +-- + +*`nginx.access.user_agent.os_major`*:: ++ +-- +type: alias + +alias to: user_agent.os.major + +-- + +*`nginx.access.user_agent.os_minor`*:: ++ +-- +type: alias + +alias to: user_agent.os.minor + +-- + +*`nginx.access.user_agent.os_name`*:: ++ +-- +type: alias + +alias to: user_agent.os.name + +-- + +*`nginx.access.user_agent.original`*:: ++ +-- +type: alias + +alias to: user_agent.original + +-- + + +*`nginx.access.geoip.continent_name`*:: ++ +-- +type: alias + +alias to: source.geo.continent_name + +-- + +*`nginx.access.geoip.country_iso_code`*:: ++ +-- +type: alias + +alias to: source.geo.country_iso_code + +-- + +*`nginx.access.geoip.location`*:: ++ +-- +type: alias + +alias to: source.geo.location + +-- + +*`nginx.access.geoip.region_name`*:: ++ +-- +type: alias + +alias to: source.geo.region_name + +-- + +*`nginx.access.geoip.city_name`*:: ++ +-- +type: alias + +alias to: source.geo.city_name + +-- + +*`nginx.access.geoip.region_iso_code`*:: ++ +-- +type: alias + +alias to: source.geo.region_iso_code + +-- + +[float] +== error fields + +Contains fields for the Nginx error logs. + + + +*`nginx.error.level`*:: ++ +-- +type: keyword + +Error level (e.g. error, critical). + + +-- + +*`nginx.error.pid`*:: ++ +-- +type: long + +Process identifier (PID). + + +-- + +*`nginx.error.tid`*:: ++ +-- +type: long + +Thread identifier. + + +-- + +*`nginx.error.connection_id`*:: ++ +-- +type: long + +Connection identifier. + + +-- + +*`nginx.error.message`*:: ++ +-- +type: text + +The error message + + +-- + +[[exported-fields-osquery]] +== Osquery fields + +Fields exported by the `osquery` module + + + +[float] +== osquery fields + + + + +[float] +== result fields + +Common fields exported by the result metricset. + + + +*`osquery.result.name`*:: ++ +-- +type: keyword + +The name of the query that generated this event. + + +-- + +*`osquery.result.action`*:: ++ +-- +type: keyword + +For incremental data, marks whether the entry was added or removed. It can be one of "added", "removed", or "snapshot". + + +-- + +*`osquery.result.host_identifier`*:: ++ +-- +type: keyword + +The identifier for the host on which the osquery agent is running. Normally the hostname. + + +-- + +*`osquery.result.unix_time`*:: ++ +-- +type: long + +Unix timestamp of the event, in seconds since the epoch. Used for computing the `@timestamp` column. + + +-- + +*`osquery.result.calendar_time`*:: ++ +-- +String representation of the collection time, as formatted by osquery. -- @@ -6667,374 +9872,1854 @@ String representation of the collection time, as formatted by osquery. [[exported-fields-postgresql]] == PostgreSQL fields -Module for parsing the PostgreSQL log files. +Module for parsing the PostgreSQL log files. + + + +[float] +== postgresql fields + +Fields from PostgreSQL logs. + + + +[float] +== log fields + +Fields from the PostgreSQL log files. + + + +*`postgresql.log.timestamp`*:: ++ +-- +The timestamp from the log line. + + +-- + +*`postgresql.log.timezone`*:: ++ +-- +The timezone of timestamp. + + +-- + +*`postgresql.log.thread_id`*:: ++ +-- +type: long + +Process id + + +-- + +*`postgresql.log.core_id`*:: ++ +-- +type: long + +Core id + + +-- + +*`postgresql.log.user`*:: ++ +-- +example: admin + +Name of user + +-- + +*`postgresql.log.database`*:: ++ +-- +example: mydb + +Name of database + +-- + +*`postgresql.log.level`*:: ++ +-- +example: FATAL + +The log level. + +-- + +*`postgresql.log.duration`*:: ++ +-- +type: float + +example: 30.0 + +Duration of a query. + +-- + +*`postgresql.log.query`*:: ++ +-- +example: SELECT * FROM users; + +Query statement. + +-- + +*`postgresql.log.message`*:: ++ +-- +type: text + +The logged message. + + +-- + +[[exported-fields-redis]] +== Redis fields + +Redis Module + + + +[float] +== redis fields + + + + +[float] +== log fields + +Redis log files + + + +*`redis.log.role`*:: ++ +-- +type: keyword + +The role of the Redis instance. Can be one of `master`, `slave`, `child` (for RDF/AOF writing child), or `sentinel`. + + +-- + +*`redis.log.pid`*:: ++ +-- +type: alias + +alias to: process.pid + +-- + +*`redis.log.level`*:: ++ +-- +type: alias + +alias to: log.level + +-- + +*`redis.log.message`*:: ++ +-- +type: alias + +alias to: message + +-- + +[float] +== slowlog fields + +Slow logs are retrieved from Redis via a network connection. + + + +*`redis.slowlog.cmd`*:: ++ +-- +type: keyword + +The command executed. + + +-- + +*`redis.slowlog.duration.us`*:: ++ +-- +type: long + +How long it took to execute the command in microseconds. + + +-- + +*`redis.slowlog.id`*:: ++ +-- +type: long + +The ID of the query. + + +-- + +*`redis.slowlog.key`*:: ++ +-- +type: keyword + +The key on which the command was executed. + + +-- + +*`redis.slowlog.args`*:: ++ +-- +type: keyword + +The arguments with which the command was called. + + +-- + +[[exported-fields-santa]] +== Google Santa fields + +Santa Module + + + +[float] +== santa fields + + + + +*`santa.action`*:: ++ +-- +type: keyword + +example: EXEC + +Action + +-- + +*`santa.decision`*:: ++ +-- +type: keyword + +example: ALLOW + +Decision that santad took. + +-- + +*`santa.reason`*:: ++ +-- +type: keyword + +example: CERT + +Reason for the decsision. + +-- + +*`santa.mode`*:: ++ +-- +type: keyword + +example: M + +Operating mode of Santa. + +-- + +[float] +== disk fields + +Fields for DISKAPPEAR actions. + + +*`santa.disk.volume`*:: ++ +-- +The volume name. + +-- + +*`santa.disk.bus`*:: ++ +-- +The disk bus protocol. + +-- + +*`santa.disk.serial`*:: ++ +-- +The disk serial number. + +-- + +*`santa.disk.bsdname`*:: ++ +-- +example: disk1s3 + +The disk BSD name. + +-- + +*`santa.disk.model`*:: ++ +-- +example: APPLE SSD SM0512L + +The disk model. + +-- + +*`santa.disk.fs`*:: ++ +-- +example: apfs + +The disk volume kind (filesystem type). + +-- + +*`santa.disk.mount`*:: ++ +-- +The disk volume path. + +-- + +*`certificate.common_name`*:: ++ +-- +type: keyword + +Common name from code signing certificate. + +-- + +*`certificate.sha256`*:: ++ +-- +type: keyword + +SHA256 hash of code signing certificate. + +-- + +*`hash.sha256`*:: ++ +-- +type: keyword + +Hash of process executable. + +-- + +[[exported-fields-suricata]] +== Suricata fields + +Module for handling the EVE JSON logs produced by Suricata. + + + +[float] +== suricata fields + +Fields from the Suricata EVE log file. + + + +[float] +== eve fields + +Fields exported by the EVE JSON logs + + + +*`suricata.eve.event_type`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.app_proto_orig`*:: ++ +-- +type: keyword + +-- + + +*`suricata.eve.tcp.tcp_flags`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.tcp.psh`*:: ++ +-- +type: boolean + +-- + +*`suricata.eve.tcp.tcp_flags_tc`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.tcp.ack`*:: ++ +-- +type: boolean + +-- + +*`suricata.eve.tcp.syn`*:: ++ +-- +type: boolean + +-- + +*`suricata.eve.tcp.state`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.tcp.tcp_flags_ts`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.tcp.rst`*:: ++ +-- +type: boolean + +-- + +*`suricata.eve.tcp.fin`*:: ++ +-- +type: boolean + +-- + + +*`suricata.eve.fileinfo.sha1`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.fileinfo.filename`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.fileinfo.tx_id`*:: ++ +-- +type: long + +-- + +*`suricata.eve.fileinfo.state`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.fileinfo.stored`*:: ++ +-- +type: boolean + +-- + +*`suricata.eve.fileinfo.gaps`*:: ++ +-- +type: boolean + +-- + +*`suricata.eve.fileinfo.sha256`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.fileinfo.md5`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.fileinfo.size`*:: ++ +-- +type: long + +-- + +*`suricata.eve.icmp_type`*:: ++ +-- +type: long + +-- + +*`suricata.eve.dest_port`*:: ++ +-- +type: long + +-- + +*`suricata.eve.src_port`*:: ++ +-- +type: long + +-- + +*`suricata.eve.proto`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.pcap_cnt`*:: ++ +-- +type: long + +-- + +*`suricata.eve.src_ip`*:: ++ +-- +type: ip + +-- + + +*`suricata.eve.dns.type`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.dns.rrtype`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.dns.rrname`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.dns.rdata`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.dns.tx_id`*:: ++ +-- +type: long + +-- + +*`suricata.eve.dns.ttl`*:: ++ +-- +type: long + +-- + +*`suricata.eve.dns.rcode`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.dns.id`*:: ++ +-- +type: long + +-- + +*`suricata.eve.flow_id`*:: ++ +-- +type: keyword + +-- + + +*`suricata.eve.email.status`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.dest_ip`*:: ++ +-- +type: ip + +-- + +*`suricata.eve.icmp_code`*:: ++ +-- +type: long + +-- + + +*`suricata.eve.http.status`*:: ++ +-- +type: long + +-- + +*`suricata.eve.http.redirect`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.http.http_user_agent`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.http.protocol`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.http.http_refer`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.http.url`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.http.hostname`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.http.length`*:: ++ +-- +type: long + +-- + +*`suricata.eve.http.http_method`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.http.http_content_type`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.timestamp`*:: ++ +-- +type: date + +-- + +*`suricata.eve.in_iface`*:: ++ +-- +type: keyword + +-- + + +*`suricata.eve.alert.category`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.alert.severity`*:: ++ +-- +type: long + +-- + +*`suricata.eve.alert.rev`*:: ++ +-- +type: long + +-- + +*`suricata.eve.alert.gid`*:: ++ +-- +type: long + +-- + +*`suricata.eve.alert.signature`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.alert.action`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.alert.signature_id`*:: ++ +-- +type: long + +-- + + + +*`suricata.eve.ssh.client.proto_version`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.ssh.client.software_version`*:: ++ +-- +type: keyword + +-- + + +*`suricata.eve.ssh.server.proto_version`*:: ++ +-- +type: keyword + +-- + +*`suricata.eve.ssh.server.software_version`*:: ++ +-- +type: keyword + +-- + + + +*`suricata.eve.stats.capture.kernel_packets`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.capture.kernel_drops`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.capture.kernel_ifdrops`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.uptime`*:: ++ +-- +type: long + +-- + + +*`suricata.eve.stats.detect.alert`*:: ++ +-- +type: long + +-- + + +*`suricata.eve.stats.http.memcap`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.http.memuse`*:: ++ +-- +type: long + +-- + + +*`suricata.eve.stats.file_store.open_files`*:: ++ +-- +type: long + +-- + + +*`suricata.eve.stats.defrag.max_frag_hits`*:: ++ +-- +type: long + +-- + + +*`suricata.eve.stats.defrag.ipv4.timeouts`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.defrag.ipv4.fragments`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.defrag.ipv4.reassembled`*:: ++ +-- +type: long + +-- + + +*`suricata.eve.stats.defrag.ipv6.timeouts`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.defrag.ipv6.fragments`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.defrag.ipv6.reassembled`*:: ++ +-- +type: long + +-- + + +*`suricata.eve.stats.flow.tcp_reuse`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.flow.udp`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.flow.memcap`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.flow.emerg_mode_entered`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.flow.emerg_mode_over`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.flow.tcp`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.flow.icmpv6`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.flow.icmpv4`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.flow.spare`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.flow.memuse`*:: ++ +-- +type: long + +-- + + +*`suricata.eve.stats.tcp.pseudo_failed`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.ssn_memcap_drop`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.insert_data_overlap_fail`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.sessions`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.pseudo`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.synack`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.insert_data_normal_fail`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.syn`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.memuse`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.invalid_checksum`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.segment_memcap_drop`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.overlap`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.insert_list_fail`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.rst`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.stream_depth_reached`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.reassembly_memuse`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.reassembly_gap`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.tcp.overlap_diff_data`*:: ++ +-- +type: long +-- +*`suricata.eve.stats.tcp.no_flow`*:: ++ +-- +type: long -[float] -== postgresql fields +-- -Fields from PostgreSQL logs. +*`suricata.eve.stats.decoder.avg_pkt_size`*:: ++ +-- +type: long +-- -[float] -== log fields +*`suricata.eve.stats.decoder.bytes`*:: ++ +-- +type: long -Fields from the PostgreSQL log files. +-- + +*`suricata.eve.stats.decoder.tcp`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.raw`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.ppp`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.vlan_qinq`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.null`*:: ++ +-- +type: long + +-- + + +*`suricata.eve.stats.decoder.ltnull.unsupported_type`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.ltnull.pkt_too_small`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.invalid`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.gre`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.ipv4`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.ipv6`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.pkts`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.ipv6_in_ipv6`*:: ++ +-- +type: long + +-- + + +*`suricata.eve.stats.decoder.ipraw.invalid_ip_version`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.pppoe`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.udp`*:: ++ +-- +type: long + +-- + + +*`suricata.eve.stats.decoder.dce.pkt_too_small`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.vlan`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.sctp`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.max_pkt_size`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.teredo`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.mpls`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.sll`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.icmpv6`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.icmpv4`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.erspan`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.ethernet`*:: ++ +-- +type: long + +-- +*`suricata.eve.stats.decoder.ipv4_in_ipv6`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.decoder.ieee8021ah`*:: ++ +-- +type: long + +-- + + +*`suricata.eve.stats.dns.memcap_global`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.dns.memcap_state`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.dns.memuse`*:: ++ +-- +type: long + +-- + + +*`suricata.eve.stats.flow_mgr.rows_busy`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.flow_mgr.flows_timeout`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.flow_mgr.flows_notimeout`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.flow_mgr.rows_skipped`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.flow_mgr.closed_pruned`*:: ++ +-- +type: long + +-- + +*`suricata.eve.stats.flow_mgr.new_pruned`*:: ++ +-- +type: long +-- -*`postgresql.log.timestamp`*:: +*`suricata.eve.stats.flow_mgr.flows_removed`*:: + -- -The timestamp from the log line. - +type: long -- -*`postgresql.log.timezone`*:: +*`suricata.eve.stats.flow_mgr.bypassed_pruned`*:: + -- -The timezone of timestamp. - +type: long -- -*`postgresql.log.thread_id`*:: +*`suricata.eve.stats.flow_mgr.est_pruned`*:: + -- type: long -Process id +-- +*`suricata.eve.stats.flow_mgr.flows_timeout_inuse`*:: ++ +-- +type: long -- -*`postgresql.log.core_id`*:: +*`suricata.eve.stats.flow_mgr.flows_checked`*:: + -- type: long -Core id +-- +*`suricata.eve.stats.flow_mgr.rows_maxlen`*:: ++ +-- +type: long -- -*`postgresql.log.user`*:: +*`suricata.eve.stats.flow_mgr.rows_checked`*:: + -- -example: admin - -Name of user +type: long -- -*`postgresql.log.database`*:: +*`suricata.eve.stats.flow_mgr.rows_empty`*:: + -- -example: mydb - -Name of database +type: long -- -*`postgresql.log.level`*:: + + +*`suricata.eve.stats.app_layer.flow.tls`*:: + -- -example: FATAL - -The log level. +type: long -- -*`postgresql.log.duration`*:: +*`suricata.eve.stats.app_layer.flow.ftp`*:: + -- -type: float +type: long -example: 30.0 +-- -Duration of a query. +*`suricata.eve.stats.app_layer.flow.http`*:: ++ +-- +type: long -- -*`postgresql.log.query`*:: +*`suricata.eve.stats.app_layer.flow.failed_udp`*:: + -- -example: SELECT * FROM users; - -Query statement. +type: long -- -*`postgresql.log.message`*:: +*`suricata.eve.stats.app_layer.flow.dns_udp`*:: + -- -type: text +type: long -The logged message. +-- +*`suricata.eve.stats.app_layer.flow.dns_tcp`*:: ++ +-- +type: long -- -[[exported-fields-redis]] -== Redis fields +*`suricata.eve.stats.app_layer.flow.smtp`*:: ++ +-- +type: long -Redis Module +-- +*`suricata.eve.stats.app_layer.flow.failed_tcp`*:: ++ +-- +type: long +-- -[float] -== redis fields +*`suricata.eve.stats.app_layer.flow.msn`*:: ++ +-- +type: long +-- +*`suricata.eve.stats.app_layer.flow.ssh`*:: ++ +-- +type: long +-- -[float] -== log fields +*`suricata.eve.stats.app_layer.flow.imap`*:: ++ +-- +type: long -Redis log files +-- +*`suricata.eve.stats.app_layer.flow.dcerpc_udp`*:: ++ +-- +type: long +-- -*`redis.log.role`*:: +*`suricata.eve.stats.app_layer.flow.dcerpc_tcp`*:: + -- -type: keyword +type: long -The role of the Redis instance. Can be one of `master`, `slave`, `child` (for RDF/AOF writing child), or `sentinel`. +-- +*`suricata.eve.stats.app_layer.flow.smb`*:: ++ +-- +type: long -- -*`redis.log.pid`*:: + +*`suricata.eve.stats.app_layer.tx.tls`*:: + -- -type: alias - -alias to: process.pid +type: long -- -*`redis.log.level`*:: +*`suricata.eve.stats.app_layer.tx.ftp`*:: + -- -type: alias - -alias to: log.level +type: long -- -*`redis.log.message`*:: +*`suricata.eve.stats.app_layer.tx.http`*:: + -- -type: alias - -alias to: message +type: long -- -[float] -== slowlog fields +*`suricata.eve.stats.app_layer.tx.dns_udp`*:: ++ +-- +type: long -Slow logs are retrieved from Redis via a network connection. +-- +*`suricata.eve.stats.app_layer.tx.dns_tcp`*:: ++ +-- +type: long +-- -*`redis.slowlog.cmd`*:: +*`suricata.eve.stats.app_layer.tx.smtp`*:: + -- -type: keyword +type: long -The command executed. +-- +*`suricata.eve.stats.app_layer.tx.ssh`*:: ++ +-- +type: long -- -*`redis.slowlog.duration.us`*:: +*`suricata.eve.stats.app_layer.tx.dcerpc_udp`*:: + -- type: long -How long it took to execute the command in microseconds. +-- +*`suricata.eve.stats.app_layer.tx.dcerpc_tcp`*:: ++ +-- +type: long -- -*`redis.slowlog.id`*:: +*`suricata.eve.stats.app_layer.tx.smb`*:: + -- type: long -The ID of the query. +-- +*`suricata.eve.tls.notbefore`*:: ++ -- +type: date -*`redis.slowlog.key`*:: +-- + +*`suricata.eve.tls.issuerdn`*:: + -- type: keyword -The key on which the command was executed. - - -- -*`redis.slowlog.args`*:: +*`suricata.eve.tls.sni`*:: + -- type: keyword -The arguments with which the command was called. +-- +*`suricata.eve.tls.version`*:: ++ +-- +type: keyword -- -[[exported-fields-santa]] -== Google Santa fields +*`suricata.eve.tls.session_resumed`*:: ++ +-- +type: boolean -Santa Module +-- +*`suricata.eve.tls.fingerprint`*:: ++ +-- +type: keyword +-- -[float] -== santa fields +*`suricata.eve.tls.serial`*:: ++ +-- +type: keyword +-- +*`suricata.eve.tls.notafter`*:: ++ +-- +type: date +-- -*`santa.action`*:: +*`suricata.eve.tls.subject`*:: + -- type: keyword -example: EXEC +-- -Action +*`suricata.eve.app_proto_ts`*:: ++ +-- +type: keyword -- -*`santa.decision`*:: + +*`suricata.eve.flow.bytes_toclient`*:: + -- -type: keyword +type: long -example: ALLOW +-- -Decision that santad took. +*`suricata.eve.flow.start`*:: ++ +-- +type: date -- -*`santa.reason`*:: +*`suricata.eve.flow.pkts_toclient`*:: + -- -type: keyword +type: long -example: CERT +-- -Reason for the decsision. +*`suricata.eve.flow.age`*:: ++ +-- +type: long -- -*`santa.mode`*:: +*`suricata.eve.flow.state`*:: + -- type: keyword -example: M - -Operating mode of Santa. +-- +*`suricata.eve.flow.bytes_toserver`*:: ++ -- +type: long -[float] -== disk fields +-- -Fields for DISKAPPEAR actions. +*`suricata.eve.flow.reason`*:: ++ +-- +type: keyword +-- -*`santa.disk.volume`*:: +*`suricata.eve.flow.pkts_toserver`*:: + -- -The volume name. +type: long -- -*`santa.disk.bus`*:: +*`suricata.eve.flow.end`*:: + -- -The disk bus protocol. +type: date -- -*`santa.disk.serial`*:: +*`suricata.eve.flow.alerted`*:: + -- -The disk serial number. +type: boolean -- -*`santa.disk.bsdname`*:: +*`suricata.eve.app_proto`*:: + -- -example: disk1s3 - -The disk BSD name. +type: keyword -- -*`santa.disk.model`*:: +*`suricata.eve.tx_id`*:: + -- -example: APPLE SSD SM0512L - -The disk model. +type: long -- -*`santa.disk.fs`*:: +*`suricata.eve.app_proto_tc`*:: + -- -example: apfs - -The disk volume kind (filesystem type). +type: keyword -- -*`santa.disk.mount`*:: + +*`suricata.eve.smtp.rcpt_to`*:: + -- -The disk volume path. +type: keyword -- -*`certificate.common_name`*:: +*`suricata.eve.smtp.mail_from`*:: + -- type: keyword -Common name from code signing certificate. - -- -*`certificate.sha256`*:: +*`suricata.eve.smtp.helo`*:: + -- type: keyword -SHA256 hash of code signing certificate. - -- -*`hash.sha256`*:: +*`suricata.eve.app_proto_expected`*:: + -- type: keyword -Hash of process executable. - -- [[exported-fields-system]] diff --git a/filebeat/docs/modules/suricata.asciidoc b/filebeat/docs/modules/suricata.asciidoc index 1dfe08a327d..af8b725cc00 100644 --- a/filebeat/docs/modules/suricata.asciidoc +++ b/filebeat/docs/modules/suricata.asciidoc @@ -48,3 +48,11 @@ include::../include/config-option-intro.asciidoc[] ==== `eve` log fileset settings include::../include/var-paths.asciidoc[] + + +[float] +=== Fields + +For a description of each field in the module, see the +<> section. + diff --git a/filebeat/filebeat.reference.yml b/filebeat/filebeat.reference.yml index 02971e608ac..ad23069eb16 100644 --- a/filebeat/filebeat.reference.yml +++ b/filebeat/filebeat.reference.yml @@ -8,10 +8,10 @@ # https://www.elastic.co/guide/en/beats/filebeat/index.html -#========================== Modules configuration ============================ +#========================== Modules configuration ============================= filebeat.modules: -#------------------------------- System Module ------------------------------- +#-------------------------------- System Module -------------------------------- #- module: system # Syslog #syslog: @@ -43,7 +43,7 @@ filebeat.modules: # can be added under this section. #input: -#------------------------------- Apache2 Module ------------------------------ +#------------------------------- Apache2 Module ------------------------------- #- module: apache2 # Access logs #access: @@ -69,7 +69,7 @@ filebeat.modules: # can be added under this section. #input: -#------------------------------- Auditd Module ------------------------------- +#-------------------------------- Auditd Module -------------------------------- #- module: auditd #log: #enabled: true @@ -82,7 +82,7 @@ filebeat.modules: # can be added under this section. #input: -#---------------------------- elasticsearch Module --------------------------- +#---------------------------- Elasticsearch Module ---------------------------- - module: elasticsearch # Server log server: @@ -116,7 +116,7 @@ filebeat.modules: # Filebeat will choose the paths depending on your OS. #var.paths: -#------------------------------- haproxy Module ------------------------------ +#------------------------------- Haproxy Module ------------------------------- - module: haproxy # All logs log: @@ -129,7 +129,7 @@ filebeat.modules: # Filebeat will choose the paths depending on your OS. #var.paths: -#------------------------------- Icinga Module ------------------------------- +#-------------------------------- Icinga Module -------------------------------- #- module: icinga # Main logs #main: @@ -167,7 +167,7 @@ filebeat.modules: # can be added under this section. #input: -#--------------------------------- IIS Module -------------------------------- +#--------------------------------- IIS Module --------------------------------- #- module: iis # Access logs #access: @@ -193,7 +193,7 @@ filebeat.modules: # can be added under this section. #input: -#-------------------------------- Kafka Module ------------------------------- +#-------------------------------- Kafka Module -------------------------------- - module: kafka # All logs log: @@ -210,7 +210,7 @@ filebeat.modules: # Convert the timestamp to UTC. Requires Elasticsearch >= 6.1. #var.convert_timezone: false -#------------------------------- kibana Module ------------------------------- +#-------------------------------- Kibana Module -------------------------------- - module: kibana # All logs log: @@ -220,7 +220,7 @@ filebeat.modules: # Filebeat will choose the paths depending on your OS. #var.paths: -#------------------------------ logstash Module ------------------------------ +#------------------------------- Logstash Module ------------------------------- #- module: logstash # logs #log: @@ -237,7 +237,7 @@ filebeat.modules: # Filebeat will choose the paths depending on your OS. #var.paths: -#------------------------------- mongodb Module ------------------------------ +#------------------------------- Mongodb Module ------------------------------- #- module: mongodb # Logs #log: @@ -251,7 +251,7 @@ filebeat.modules: # can be added under this section. #input: -#-------------------------------- MySQL Module ------------------------------- +#-------------------------------- MySQL Module -------------------------------- #- module: mysql # Error logs #error: @@ -277,7 +277,7 @@ filebeat.modules: # can be added under this section. #input: -#-------------------------------- Nginx Module ------------------------------- +#-------------------------------- Nginx Module -------------------------------- #- module: nginx # Access logs #access: @@ -303,7 +303,7 @@ filebeat.modules: # can be added under this section. #input: -#------------------------------- Osquery Module ------------------------------ +#------------------------------- Osquery Module ------------------------------- - module: osquery result: enabled: true @@ -317,7 +317,7 @@ filebeat.modules: # of the document. The default is true. #var.use_namespace: true -#----------------------------- PostgreSQL Module ----------------------------- +#------------------------------ PostgreSQL Module ------------------------------ #- module: postgresql # Logs #log: @@ -331,7 +331,7 @@ filebeat.modules: # can be added under this section. #input: -#-------------------------------- Redis Module ------------------------------- +#-------------------------------- Redis Module -------------------------------- #- module: redis # Main logs #log: @@ -351,7 +351,7 @@ filebeat.modules: # Optional, the password to use when connecting to Redis. #var.password: -#---------------------------- Google Santa Module ---------------------------- +#----------------------------- Google Santa Module ----------------------------- - module: santa log: enabled: true @@ -359,7 +359,7 @@ filebeat.modules: # Filebeat will choose the the default path. #var.paths: -#------------------------------- Traefik Module ------------------------------ +#------------------------------- Traefik Module ------------------------------- #- module: traefik # Access logs #access: diff --git a/filebeat/include/fields.go b/filebeat/include/fields.go index 80fdbd970b9..7f38d6f2438 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/filebeat/include/list.go b/filebeat/include/list.go index 93083729338..41c64b7432c 100644 --- a/filebeat/include/list.go +++ b/filebeat/include/list.go @@ -15,17 +15,12 @@ // specific language governing permissions and limitations // under the License. -// Code generated by 'make imports' - DO NOT EDIT. +// Code generated by beats/dev-tools/module_include_list/module_include_list.go - DO NOT EDIT. -/* -Package include imports all input packages so that they register -their factories with the global registry. This package can be imported in the -main package to automatically register all of the standard supported inputs -modules. -*/ package include import ( + // Import packages that need to register themselves. _ "github.com/elastic/beats/filebeat/input/docker" _ "github.com/elastic/beats/filebeat/input/log" _ "github.com/elastic/beats/filebeat/input/redis" @@ -33,4 +28,22 @@ import ( _ "github.com/elastic/beats/filebeat/input/syslog" _ "github.com/elastic/beats/filebeat/input/tcp" _ "github.com/elastic/beats/filebeat/input/udp" + _ "github.com/elastic/beats/filebeat/module/apache2" + _ "github.com/elastic/beats/filebeat/module/auditd" + _ "github.com/elastic/beats/filebeat/module/elasticsearch" + _ "github.com/elastic/beats/filebeat/module/haproxy" + _ "github.com/elastic/beats/filebeat/module/icinga" + _ "github.com/elastic/beats/filebeat/module/iis" + _ "github.com/elastic/beats/filebeat/module/kafka" + _ "github.com/elastic/beats/filebeat/module/kibana" + _ "github.com/elastic/beats/filebeat/module/logstash" + _ "github.com/elastic/beats/filebeat/module/mongodb" + _ "github.com/elastic/beats/filebeat/module/mysql" + _ "github.com/elastic/beats/filebeat/module/nginx" + _ "github.com/elastic/beats/filebeat/module/osquery" + _ "github.com/elastic/beats/filebeat/module/postgresql" + _ "github.com/elastic/beats/filebeat/module/redis" + _ "github.com/elastic/beats/filebeat/module/santa" + _ "github.com/elastic/beats/filebeat/module/system" + _ "github.com/elastic/beats/filebeat/module/traefik" ) diff --git a/filebeat/magefile.go b/filebeat/magefile.go index 984a3fdc960..1a2d076360b 100644 --- a/filebeat/magefile.go +++ b/filebeat/magefile.go @@ -22,20 +22,24 @@ package main import ( "context" "fmt" - "path/filepath" "time" "github.com/magefile/mage/mg" - "github.com/magefile/mage/sh" - "github.com/pkg/errors" "github.com/elastic/beats/dev-tools/mage" + filebeat "github.com/elastic/beats/filebeat/scripts/mage" ) func init() { mage.BeatDescription = "Filebeat sends log files to Logstash or directly to Elasticsearch." } +// Aliases provides compatibility with CI while we transition all Beats +// to having common testing targets. +var Aliases = map[string]interface{}{ + "goTestUnit": GoUnitTest, // dev-tools/jenkins_ci.ps1 uses this. +} + // Build builds the Beat binary. func Build() error { return mage.Build(mage.DefaultBuildArgs()) @@ -57,11 +61,6 @@ func CrossBuild() error { return mage.CrossBuild() } -// CrossBuildXPack cross-builds the beat with XPack for all target platforms. -func CrossBuildXPack() error { - return mage.CrossBuildXPack() -} - // CrossBuildGoDaemon cross-builds the go-daemon binary using Docker. func CrossBuildGoDaemon() error { return mage.CrossBuildGoDaemon() @@ -80,11 +79,12 @@ func Package() { start := time.Now() defer func() { fmt.Println("package ran for", time.Since(start)) }() - mage.UseElasticBeatPackaging() - customizePackaging() + mage.UseElasticBeatOSSPackaging() + mage.PackageKibanaDashboardsFromBuildDir() + filebeat.CustomizePackaging() - mg.Deps(Update, prepareModulePackagingOSS, prepareModulePackagingXPack) - mg.Deps(CrossBuild, CrossBuildXPack, CrossBuildGoDaemon) + mg.Deps(Update) + mg.Deps(CrossBuild, CrossBuildGoDaemon) mg.SerialDeps(mage.Package, TestPackages) } @@ -93,199 +93,136 @@ func TestPackages() error { return mage.TestPackages(mage.WithModules(), mage.WithModulesD()) } -// Update updates the generated files (aka make update). -func Update() error { - if err := sh.Run("make", "update"); err != nil { +// Update is an alias for executing fields, dashboards, config, includes. +func Update() { + mg.SerialDeps(Fields, Dashboards, Config, includeList, fieldDocs, + filebeat.CollectDocs, + filebeat.PrepareModulePackagingOSS) +} + +// Config generates both the short/reference/docker configs and populates the +// modules.d directory. +func Config() { + mg.Deps(mage.GenerateDirModulesD, configYML) +} + +func configYML() error { + return mage.Config(mage.AllConfigTypes, filebeat.OSSConfigFileParams(), ".") +} + +// includeList generates include/list.go with imports for inputs. +func includeList() error { + return mage.GenerateIncludeListGo([]string{"input/*"}, []string{"module"}) +} + +// Fields generates fields.yml and fields.go files for the Beat. +func Fields() { + mg.Deps(libbeatAndFilebeatCommonFieldsGo, moduleFieldsGo) + mg.Deps(fieldsYML) +} + +// libbeatAndFilebeatCommonFieldsGo generates a fields.go containing both +// libbeat and filebeat's common fields. +func libbeatAndFilebeatCommonFieldsGo() error { + if err := mage.GenerateFieldsYAML(); err != nil { return err } + return mage.GenerateAllInOneFieldsGo() +} - // XXX (andrewkroh on 2018-10-14): This is a temporary solution for enabling - // X-Pack modules for Filebeat. Packaging for X-Pack will be fully migrated - // to a magefile.go in the x-pack/filebeat directory and this will be - // removed. - return mage.Mage("../x-pack/filebeat", "update") +// moduleFieldsGo generates a fields.go for each module. +func moduleFieldsGo() error { + return mage.GenerateModuleFieldsGo("module") } -// Fields generates a fields.yml for the Beat. -func Fields() error { +// fieldsYML generates the fields.yml file containing all fields. +func fieldsYML() error { return mage.GenerateFieldsYAML("module") } -// GoTestUnit executes the Go unit tests. -// Use TEST_COVERAGE=true to enable code coverage profiling. -// Use RACE_DETECTOR=true to enable the race detector. -func GoTestUnit(ctx context.Context) error { - return mage.GoTest(ctx, mage.DefaultGoTestUnitArgs()) +// fieldDocs generates docs/fields.asciidoc containing all fields +// (including x-pack). +func fieldDocs() error { + inputs := []string{ + mage.OSSBeatDir("module"), + mage.XPackBeatDir("module"), + mage.OSSBeatDir("input"), + mage.XPackBeatDir("input"), + } + output := mage.CreateDir("build/fields/fields.all.yml") + if err := mage.GenerateFieldsYAMLTo(output, inputs...); err != nil { + return err + } + return mage.Docs.FieldDocs(output) } -// GoTestIntegration executes the Go integration tests. -// Use TEST_COVERAGE=true to enable code coverage profiling. -// Use RACE_DETECTOR=true to enable the race detector. -func GoTestIntegration(ctx context.Context) error { - return mage.GoTest(ctx, mage.DefaultGoTestIntegrationArgs()) +// Dashboards collects all the dashboards and generates index patterns. +func Dashboards() error { + return mage.KibanaDashboards("module") } -// ExportDashboard exports a dashboard and writes it into the correct directory +// ExportDashboard exports a dashboard and writes it into the correct directory. // -// Required ENV variables: -// * MODULE: Name of the module -// * ID: Dashboard id +// Required environment variables: +// - MODULE: Name of the module +// - ID: Dashboard id func ExportDashboard() error { return mage.ExportDashboard() } -// ----------------------------------------------------------------------------- -// Customizations specific to Filebeat. -// - Include modules directory in packages (minus _meta and test files). -// - Include modules.d directory in packages. - -var ( - dirModuleGeneratedOSS = filepath.Clean("build/package/modules-oss") - dirModuleGeneratedXPack = filepath.Clean("build/package/modules-x-pack") - dirModulesDGeneratedXPack = filepath.Clean("build/packaging/modules.d-x-pack") -) +// Fmt formats source code and adds file headers. +func Fmt() { + mg.Deps(mage.Format) +} -func replacePackageFileSource(args mage.OSPackageArgs, replacements map[string]string) { - missing := make(map[string]struct{}) - for key := range replacements { - missing[key] = struct{}{} - } - for key, contents := range args.Spec.Files { - oldSource := args.Spec.Files[key].Source - if newSource, found := replacements[oldSource]; found { - contents.Source = newSource - args.Spec.Files[key] = contents - delete(missing, oldSource) - } - } - if len(missing) > 0 { - asList := make([]string, 0, len(missing)) - for path := range missing { - asList = append(asList, path) - } - panic(errors.Errorf("the following file sources were not found for replacement: %v", asList)) - } +// Check runs fmt and update then returns an error if any modifications are found. +func Check() { + mg.SerialDeps(mage.Format, Update, mage.Check) } -// customizePackaging modifies the package specs to add the modules and -// modules.d directory. -func customizePackaging() { - var ( - moduleTarget = "module" - module = mage.PackageFile{ - Mode: 0644, - Source: dirModuleGeneratedOSS, - } - moduleXPack = mage.PackageFile{ - Mode: 0644, - Source: dirModuleGeneratedXPack, - } - - modulesDTarget = "modules.d" - modulesD = mage.PackageFile{ - Mode: 0644, - Source: "modules.d", - Config: true, - Modules: true, - } - modulesDXPack = mage.PackageFile{ - Mode: 0644, - Source: dirModulesDGeneratedXPack, - Config: true, - Modules: true, - } - ) - - for _, args := range mage.Packages { - mods := module - modsD := modulesD - pkgType := args.Types[0] - if args.Spec.License == "Elastic License" { - mods = moduleXPack - modsD = modulesDXPack - replacePackageFileSource(args, map[string]string{ - "fields.yml": "../x-pack/{{.BeatName}}/fields.yml", - "{{.BeatName}}.reference.yml": "../x-pack/{{.BeatName}}/{{.BeatName}}.reference.yml", - "_meta/kibana.generated": "../x-pack/{{.BeatName}}/build/kibana", - }) - if pkgType != mage.Docker { - replacePackageFileSource(args, map[string]string{ - "{{.BeatName}}.yml": "../x-pack/{{.BeatName}}/{{.BeatName}}.yml", - }) - } - } - - switch pkgType { - case mage.TarGz, mage.Zip, mage.Docker: - args.Spec.Files[moduleTarget] = mods - args.Spec.Files[modulesDTarget] = modsD - case mage.Deb, mage.RPM: - args.Spec.Files["/usr/share/{{.BeatName}}/"+moduleTarget] = mods - args.Spec.Files["/etc/{{.BeatName}}/"+modulesDTarget] = modsD - case mage.DMG: - args.Spec.Files["/Library/Application Support/{{.BeatVendor}}/{{.BeatName}}"+moduleTarget] = mods - args.Spec.Files["/etc/{{.BeatName}}/"+modulesDTarget] = modsD - default: - panic(errors.Errorf("unhandled package type: %v", pkgType)) - } - } +// IntegTest executes integration tests (it uses Docker to run the tests). +func IntegTest() { + mage.AddIntegTestUsage() + defer mage.StopIntegTestEnv() + mg.SerialDeps(GoIntegTest, PythonIntegTest) } -// prepareModulePackagingOSS copies the module dir to the build dir and excludes -// _meta and test files so that they are not included in packages. -func prepareModulePackagingOSS() error { - if err := sh.Rm(dirModuleGeneratedOSS); err != nil { - return err - } +// UnitTest executes the unit tests. +func UnitTest() { + mg.SerialDeps(GoUnitTest, PythonUnitTest) +} - copy := &mage.CopyTask{ - Source: "module", - Dest: dirModuleGeneratedOSS, - Mode: 0644, - DirMode: 0755, - Exclude: []string{ - "/_meta", - "/test", - "fields.go", - }, - } - return copy.Execute() +// GoUnitTest executes the Go unit tests. +// Use TEST_COVERAGE=true to enable code coverage profiling. +// Use RACE_DETECTOR=true to enable the race detector. +func GoUnitTest(ctx context.Context) error { + return mage.GoTest(ctx, mage.DefaultGoTestUnitArgs()) } -// prepareModulePackagingXPack generates modules and modules.d directories -// for an x-pack distribution, excluding _meta and test files so that they are -// not included in packages. -func prepareModulePackagingXPack() error { - err := mage.Clean([]string{ - dirModuleGeneratedXPack, - dirModulesDGeneratedXPack, +// GoIntegTest executes the Go integration tests. +// Use TEST_COVERAGE=true to enable code coverage profiling. +// Use RACE_DETECTOR=true to enable the race detector. +func GoIntegTest(ctx context.Context) error { + return mage.RunIntegTest("goIntegTest", func() error { + return mage.GoTest(ctx, mage.DefaultGoTestIntegrationArgs()) }) - if err != nil { - return err - } +} - for _, copyAction := range []struct { - src, dst string - }{ - {"module", dirModuleGeneratedXPack}, - {"../x-pack/filebeat/module", dirModuleGeneratedXPack}, - {"modules.d", dirModulesDGeneratedXPack}, - {"../x-pack/filebeat/modules.d", dirModulesDGeneratedXPack}, - } { - err := (&mage.CopyTask{ - Source: copyAction.src, - Dest: copyAction.dst, - Mode: 0644, - DirMode: 0755, - Exclude: []string{ - "/_meta", - "/test", - "fields.go", - }, - }).Execute() - if err != nil { - return err - } +// PythonUnitTest executes the python system tests. +func PythonUnitTest() error { + mg.Deps(mage.BuildSystemTestBinary) + return mage.PythonNoseTest(mage.DefaultPythonTestUnitArgs()) +} + +// PythonIntegTest executes the python system tests in the integration environment (Docker). +func PythonIntegTest(ctx context.Context) error { + if !mage.IsInIntegTestEnv() { + mg.Deps(Fields) } - return nil + return mage.RunIntegTest("pythonIntegTest", func() error { + mg.Deps(mage.BuildSystemTestBinary) + args := mage.DefaultPythonTestIntegrationArgs() + args.Env["MODULES_PATH"] = mage.CWD("module") + return mage.PythonNoseTest(args) + }) } diff --git a/filebeat/module/apache2/fields.go b/filebeat/module/apache2/fields.go new file mode 100644 index 00000000000..95edbce9f7e --- /dev/null +++ b/filebeat/module/apache2/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package apache2 + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "apache2", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJysl09vozwQxu/5FKPey+E95vBKq61W28NKPfSOXJgYb42HHQ9Z8e1X5l8oMaTQ5IRszfN7GE+G8SO8Y3MEVamswP8OAGLE4hEevnUrDweAHH3GphJD7gj/HwAA+l34RXlt8QDgC2JJM3Ino48gXIfFk0Gb+2Mb8QhOlTglhZ80FR5BM9VVvxKBTYGdZNKvTwEfIFmG3o/LMc4KK/y+kxNlnO8RcCIGKXD08fP19eWp54AlPVqK2ZpaYyxJMDXVh93B4Ts2f4nz2d6Kz9arNegEnl9A5TkHQ8RQkJdAvPiK2nmjvEk9OkneGkEfNWXJ6dnGibhUcoRY0A23rwWCq8s3ZKBTJxAeQnI98hkZGH1FzmNr7ob/2iOn4THqXFmj5vYqJUUXl1zFDaolSkHzU7glWYhUCeOfGr0kEYXRMtutZtkmxEYbp2xUMqDTM7I35Pa4joVeCrY7jTSjfGuW+5R0AokXJbW/1rmQTsiM/JW8RzXGtqDRyY5CSdvA6yNYrshl0rwHwUK/mErmeDbZPPfr5qMvsKAzVr36TfPk76DEZUaIcXeBRGUGSKUkK74OicsMkEjX2cGIqgwIiklsBJBPTrW1sSY5BaV3On3yNwogoO5TAwG1Wgbk42+9h7Sevlhz3kdaa/MaaWFu2NNVMnJiHDr5SpI81ZxhopGSG3oXbO2Em9R4in1SdoFvKA5oS5mS60/kDuSi0uVbpg25O2V2TWxMq5HmXge5KDV7u/sd4ZLgAETmD//zzfP8j36MZyonc3ynu2l+t3jGrfObJZ3E4j4xKXs8IxtpOu4wKJfovdKYRB1m7XXgfteLYGN6t+gsdBSQQglodMhKMG932pzGrfW+N6YvHvUJ15a0xnw9W5XZOudXTOHWl1xHfsJSHwzPT3E7stuOFIwqT/aY6kIXPZXDJf/a1u6C6jSD+bzOjNNt5czP618AAAD//2SuKtQ=" +} diff --git a/filebeat/module/auditd/fields.go b/filebeat/module/auditd/fields.go new file mode 100644 index 00000000000..3d294d6fcb6 --- /dev/null +++ b/filebeat/module/auditd/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package auditd + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "auditd", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJy8VsGO2zYQvfsrHnJKD2vk7AIFimxTGGibou3docmxNFiao5LDddWvL0jZXkWWNzWyG95Eke+9eTMc8g4P1K9gsmN1C0BZPa3w5sc68WYBOEo2cqcsYYUfFgDwq7jsCTuJ6ExMHJojALw0abkAUitRN1bCjpsVNGZaADsm79KqQtwhmD2NiMvQvqMVmii5O87MkJfxoSJhF2UPbWnKXsaYbEzopTnPzTE+wzrH/AuH/M/AX6CX+E0UxvsjP0wkOLF5T0HJoaVI2JI1OdFnuNpSPyzug9mzhQkOjyb22PZHeHqkoFXxcrR1Guc41khWotuULZ/9fzbCMv46eXqF9IlCvNuYzO42/A8Si1scBvwEbTmBU7VUvDuSr++RE7laaOVPThTRRS6fcgFaMSrqvNRAh5eWGuhwlrocuba+hzUBWxr0z4mNxhJ2WXOkM7I8RVmmwLsywRHsKChrD9ua0FDCW88P05yiFJbsy2mMIvrd9YQlSi+cr0QpsYRXyNjLai0Je9K6xFoniYIywVyA1jhUJgnb9mOw2RAS/Z0p2Gmuhr7jJTRfdzBP8Ah5v6U4r8FYq7fT1JCNtZKDViCYlMSyKX3swNpWQ6uMedru1qNWWNf3kFr16KJYSukK9muCs9L+xqIr6EMKCkMFAAeY8JxBZdntNGXX0PXBwbE1SgmHlm07/JKspyhV1PipruUMKqfTKk74l6LcbU0i9z0MHo3PVDa/w55MSGA9HaYdx6QV9Erdvbs9ugHTxKbemKeWmPpUQrPG+3mqeGuXKFyRUvZns0YceJuyLfUBidgZ9jnSlXbakHA3e7inj4r/Ieq9BDUcEn4mWf8ODjuJe1NWozFa3g4ONTGQUDV/Gh4+y/LyMM7FTxeQtVCW+Bh8jy5SKqYO18qR5CdvkrJNZKJt0flcOicnmEfD3mw9lZfIXD9000Kae4mMrbISlAMF3ZTvi2Un3x6oP0i8pPyiezidw9Krjkk9c15W/VkWa/8tFbH218VEaljCN5QzED7jTmn/sd9wko0V90qq3g8sWP/5EYXluh4vth6Iqzoakk0nHKY33g3+lGuZNbta+vBG68cXk/a6Fv1RSUYO/RcAAP//EHqm1w==" +} diff --git a/filebeat/module/elasticsearch/fields.go b/filebeat/module/elasticsearch/fields.go new file mode 100644 index 00000000000..e8f9d4b2177 --- /dev/null +++ b/filebeat/module/elasticsearch/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package elasticsearch + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "elasticsearch", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "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" +} diff --git a/filebeat/module/haproxy/fields.go b/filebeat/module/haproxy/fields.go new file mode 100644 index 00000000000..731b4c60af6 --- /dev/null +++ b/filebeat/module/haproxy/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package haproxy + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "haproxy", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "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" +} diff --git a/filebeat/module/icinga/fields.go b/filebeat/module/icinga/fields.go new file mode 100644 index 00000000000..29cc742c574 --- /dev/null +++ b/filebeat/module/icinga/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package icinga + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "icinga", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJzskjGO4zAMRXuf4kP1Jgdwsc1WWyywwO4FFJlWiMiiIdHJ+PYDO3bgJJ4BBshUCSubhB7/J/4GB+pLsOPobQEoa6AS5vfYMAVQUXaJW2WJJX4WAHAe4o9UXaACqJlClctxtkG0DS2IQ2nfUgmfpGunzgr1mrNkVbTr/KW7hvsQea5fEtVyzNMG1JKge5qNjHwE8Xm7eHarZqmoto4Da381nIUdqD9Jqm5mn8gb6l9LjmumjNPeKpw0rUSKCqlnmUG8p2oU3lDO1tN2VVymI6WHivsrOfMuEI42dJRhE8GMVzM/YKIoOxq+ONaSGjtght+TTZGjN5B0hzQusbKzwaybmByuelB6068Z+L+n+Xx3p7tstBy/MWQD/pWxJ89YVpv0KlCPjtm04ZW0J0vaewAAAP//F3AQNA==" +} diff --git a/filebeat/module/iis/fields.go b/filebeat/module/iis/fields.go new file mode 100644 index 00000000000..2773ded54e4 --- /dev/null +++ b/filebeat/module/iis/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package iis + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "iis", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJzMmE2P2zYQhu/7KwY5Nzq0Nx96CdLUQIsE2S16FGhpLE2X4mhJarf69wWpD69lSrI+AlQnWzbf5yU5JIfzEZ6xPgCReQCwZCUe4MPx+PjhASBFk2gqLbE6wK8PAAB/clpJhDNrKIU2pDI4Hh9BcgZnkmiiB4AzoUzNwf//IyhRYKfvHluXeIBMc1W2bwIY9/zmZeCsubhluKfj9C06mEgSNKZ/HWJOcN3ziZUVpEzL8P11HhplZ6V38d7Je4nOjKlOsbHCVubq586UZJUNfpjw5Z6nHOH3p6dvTrkRhoRTjIL0N1K//Lw//29SKb8ZmOVrfKnQ2NhSgXGxp4VWGZwykIKCpCSDCavUhL0Yshi7j0EXz1i/sU6XG3GyngBCpUDKWKESBFUVJ9QjTlC/ov4BXrwNPoN1vjwEWMFbTknu33VrCFBZXcObMJChQi0spmGrCfMz7ewyYWVR2c5ogwDjX2nQmCC9YvoT0BmEqsO+TpzWsWsSnWqLdwfWmXUh7AFCje4ZXz+pzrgXGAy1RlOyMujNTdjuevi/st6spmvnU8FLZdC4kCSG7kph84PzaEkJ5zEaNO6kC7Q5DwNqTje3toxa/1FAoROvtFyoXGkZuU9BuZcKdR0bq+lmpu7R9c2DwiVru2Fob5r3/TdTW86EW4M6uml32eALtrg8GgxXOsGxQNB4Rq1RbwmFoMYF0CzV2B1d6yiNQNQcgbc6Hcn9O35FbYjVGlCoaa/Nxq6YUdcsCra9ihWRoQpH4jCTgpEc6L1kiq+UDJ1Ou4WrGGz8RCM6/RYi/uFh2KyghGV6CKldIEGZfh8QNsm3Q8IyHSQQPSsYQZUOwSGJhQA20bmSMrR9vQfFO80+m5kAcKh9YsChJsOATbjXa0jTw6cpIyWGh+QaUkipw2TII4fFml3FpZKkUNktg9SeRRlyNKN3wVYugY7JcOgEWQWeUezQkhN/0G9HjipdDsmMWO00slNi/bCSrfeayFGpQe/2m8IxwQ6IWl+t892qEl54UVFiOmtbf7GT5C5xx28g0lSjGbmIt/TRRHddQaCFO9V7Lt979729SM31vaXv3PcWPtv32WR0dfd9RapVDrMnLndhKv4rilLiAb58flpuqLvRemMNO+xr7F64eiiuyH99/2NsEczdQDaUBvtKxFRlThhWcZlrYXau77QWnD40+mELLxVWP6Ii5yu1ZSmpOd+gZJYeGbaxLCOZ4fd79Bfk4zcg1ZRtnI1M2Bw1pnASBlNg5Qsw/VbcbNjRjeJXJWsoNfr6GDVVm0b8sxTGUmJQ6CSHUlYZKSAD4lWQFCfpK5I3epUZ1vp2S7PCM3bHqEGgftkzb4dkcRq2ydinhgLHx6+B9QRLcrMMOS6Zbq7VC4bI7Qpkq7QpN0th/ZdxT/ckcZvnrYEE1hgsyu42+3CIGRf3pn2bvHxvxuMSMf8FAAD//66H5Lg=" +} diff --git a/filebeat/module/kafka/fields.go b/filebeat/module/kafka/fields.go new file mode 100644 index 00000000000..54dc41a690d --- /dev/null +++ b/filebeat/module/kafka/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package kafka + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "kafka", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJysk81uwjAQhO95ihF3eIAcKlW9tWoPFVLPFtkEK/6TvVB4+8px+XNNIBV7i1f+ZjK7nqOnfY1etL2oAJasqMbsLX7PKqChsPLSsbSmxlMFAEMP2jYbRRXQSlJNqIfWHEZoOuFi8d5Rjc7bjfs9KTAvMecoZbvjWQl2FZgqmVW2g5KGwuKsmSueq7LUFFhod9EdVYq1XNPpKlpvNXhNR/lFUUvRllSGop3QbpjE1/Pnx2y6i0EygsuamkIQHWVXU7pMO/6XYEfNAVxWXVntrCGT45NuT/tv65tp0i8H5DFoGaKONN2Q/xUjSoTwoJ9/FVuRgJMssBercv75dt/hAVhGHKQZ2bfyxt+KBTfmc5e7PylxsjuSE25uK8aGdqct4D2x4YRn2Pbk7rqddqPy9/oYL/EdRfghnnyaPwEAAP//nnhlvw==" +} diff --git a/filebeat/module/kibana/fields.go b/filebeat/module/kibana/fields.go new file mode 100644 index 00000000000..6a7a424a0ab --- /dev/null +++ b/filebeat/module/kibana/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package kibana + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "kibana", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJyskEFuwyAQRfc+xVf2yQFYdNNl1TNUkzBGFMJYMFbl21cxboUt2lVm+T9674szAi8GwV8p0QCo18gGpxqcBsByuWU/qZdk8DIA2F7jXewceQBGz9EWs3ZnJLpzQ3ycLhMbuCzztCUd6p7TsqK436wH+xNY743GQA8Iok9cLk15NLZWJVd2xY868PIl2R66fwasI+qfRXHOJ7fCL11tUVJ+nvd1zpmTVixk3Ib03XdW6qrl+sk3PVQ1/NiP+w4AAP//OeSYZw==" +} diff --git a/filebeat/module/logstash/fields.go b/filebeat/module/logstash/fields.go new file mode 100644 index 00000000000..f56df16910c --- /dev/null +++ b/filebeat/module/logstash/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package logstash + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "logstash", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJzslU1v4jAQhu/8ilHPsKc95dBLtZUq7Ye0u3dk4onj4sxE/oDm36/sEEhCAGWLeqpP4AnzPpmZl1nBFpsMDCvnhSsXAF57gxk8dFcPCwCJLre69popg8cFABx/AT9YBoMLgEKjkS5L0RWQqHCQNx7f1JiBshzqw81E5mGmUbbj3Qn0ew/0GDsTuijWnuckCYXlCnyJ0CVNb/Cl9+iYrc9XoXNC4SDWsXh886PAFZx4npi80OQST6BVLaxDGYEmhY5Fwh2aSYQtNnu2ch7F3xKTZEoLXCSag/4SfKkd5GwtuppJgudYua+v7eODwvXK1E3MHRHbnMAWciOcg32JFhMr7pA8sNVKk/A4jeRLi2Is+7+Ne6GCbSViGMSGg08cNhBpUgepHmCs7g08w2qd3mOSkDevmM9k3GIDgiTshAkIEjdBqUinT+wnlDMjOsP7kRnnGu48xaezPp314c667Kr5dL/FHmSo6q6XB2kzIdLJ1yYoTev45X5d+ykq7BhagWvaUeiOE9PUI+0MXqgO3i3hWRuP1i3hV/DxJs7UE0vML0yzZ96uNa0rbYx2k4yGSc0D/PaGeUgD5HWFULDtsYImaNUwZ5I3uEgQfxhWErtGdWhnLayopqnmT/Qfb6Ox2iUx6CrkTIVWwSYz3gZaTy6p9+2v1eOQbIAEIf6lb5oe88RCu/bhXwAAAP//akTzxg==" +} diff --git a/filebeat/module/mongodb/fields.go b/filebeat/module/mongodb/fields.go new file mode 100644 index 00000000000..d71dc9baca3 --- /dev/null +++ b/filebeat/module/mongodb/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package mongodb + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "mongodb", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJyUk8FOg0AQhu88xZ/e2wfgYKJtmnhAD/oCKwzbSZcZsrutxac3SzHSiCXMceD/v29CWONIXY5GxWr1kQGRo6Mcq2GzyoCKQum5jayS4yEDgEKrkyPU6tEaH1gsihTYPcGpRc2OwiYDaiZXhbzPrCGmoTErTexaymG9ntphM4G7zr4vQ+21GdN6UJoxbAx0akctf4F3oWm2KtGwhIHwv8GUxa9HoDN5jt1N+10w8DZk4OhMDlqjoRCMpZs36WKaNn2255v19dQjdZ/qqwmhUptWhSQuMdqfpEzPjENpIln1/GXSYlZu+1oUjy+7hYoS6bJIcHuNzOqwcDRSOQ6RZJHUVO2M1PuBfmJgQTxQ/6M4FtpMsPubvwMAAP//pW75AQ==" +} diff --git a/filebeat/module/mysql/fields.go b/filebeat/module/mysql/fields.go new file mode 100644 index 00000000000..c0fd40345b9 --- /dev/null +++ b/filebeat/module/mysql/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package mysql + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "mysql", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJy0lcFu2zAMhu95CqLn1ocBw4AcBgzbChRYgQ0tsGOq2LQtRCZdUk6atx8op02WqtmStjpa0v9/pCnyAha4nkK31vswAYg+BpzC2fX65tePswlAhVqK76NnmsLnCQDANVdDQKhZoHeinhqILUK6AoEbqH1ALSYA2rLEWclU+2YKUQacANQeQ6XTJHUB5Drc2tuK6x6n0AgP/eZLhsHWZRKCWrh7CcDWrt+uJ4qwPH3N+R7wtvWVKTpPunHYB0n6hvNEkqPZJYq+Q42u6//aPchg67bF7dUthSUieMIi79UKumrmqz25MQuBqTkO4osC15vIPxafig/nEFuv4DXBjHbgqwIuWTbnlijqmRR68SwQeffmM4eUOSgfk26qvXCJqiabDTLgEsOeED64rk81/tsJeWrODgSazXVKrCnnTTtUdQ1m8xrxIR7/cwM3DVaPwsWzStbAq8DNO9ayORxVyoOiHB/oaGZ3IbYuQinoIlYJ5H5AWecz3rKekFW7Nca5alEwmRywfvwLnvIQ/oRXe/UTXFWJlfDbgaRDM2sIhWKZLcM6sDshY5GjC6nV7NBE5sU5eALFkqnSc3AKbrSw0dCzpwg0dHOUF14pl4t34XUdDxStL+0xr5y3lNoEGztlubDuM0dwS+eDmwcsTOGZ6tKFAa2nvSZe4ZXOFGk/olNbr4U6+lmopg6CcRDCCubrfz2eRGNN0RO+1TDIEGnp6P+AXpqCr4EZyD/szMjoFkjbHnd38/12u3t3CC5tHe+f+ucB2Tcbw2ZWMhGWdgKuvj0V+cb9TwAAAP//tXis5A==" +} diff --git a/filebeat/module/nginx/fields.go b/filebeat/module/nginx/fields.go new file mode 100644 index 00000000000..5a6413b1545 --- /dev/null +++ b/filebeat/module/nginx/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package nginx + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "nginx", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJysl0FzozoMx+/5FJqe+mZe+QAc3qVvd2YPu9ND74wLArR1LFYWafPtd0wSkhJDCsUnQuL/729ZkeUHeMV9Cq4i974BUFKLKdz9Cp/vNgAF+lyoUWKXwn8bAICfXLQWoWSBxognV4HWCN0UsFxBSRZ9sgHwNYtmObuSqhRUWtwAlIS28Gkn9QDObPGMD0P3DaZQCbfN8U3EQxjfOyEohbdjBsK45F0yTZ6j9/3rGHgCHsYjOzXk/BHRReRs5KAf/PRWYnYuLb1wsc88Ok1e9or+w29O/iy7avBFybI1mkJs0oT9MJ5rBNduX1CAy4NAeAir8Cg7FBD0DTuPnbnzQqL+BbesmFGTWfIatW8smaHHxmidgkN9Y3lNSpY3IwUWGTXTlJkAz63kmIyoth4lC48zVcO85GreSXWLWnMxU7JWbRLBPy16TSIKvWWxc82KTVioImdsVDKgsx2KJ3ZLXMemnvftkElZzsXcKB9DchBIvBpt/bXOmVSiCMpX4h7V6GtHhW5ufncJ1k283oLxjBwnDQsVjBSXS8kCd5QPYz9tPrqAEZ0+681vHgZ/ASUu00PIrQKJypwgjdG8/jokLtOfftdVZwEjqnJCcExiJoB9UrbWxorkJShbaffZ30iAgFonBwJqMg3Yx1e9hDQdvlhxXkb6VI2pkEfO0SXlJWen5NDpV6J1PKYr5OSG3hnbOpV9Rp5jZ8si8A3FE9pybvT6rFyAHFU6H2oVsVspslNifVhJ92tt5KjUYHXrbeGY4AmIIh/+8Ct3/538rObf4g7j/dwr7t9Yhl3kjc7+28FAEIV7TKrkYOlfyIWUcmP/SaI2Goq3q5F7xw0HT8LdDYgKdEolocD904//R7i6Gve5FjTFBTYOzNk5zLVLkrXQj73mTfwWvTdVvA9WfB/2fJ+4xx1S7qT7NwAA//+mBf1W" +} diff --git a/filebeat/module/osquery/fields.go b/filebeat/module/osquery/fields.go new file mode 100644 index 00000000000..c0d72fbac8f --- /dev/null +++ b/filebeat/module/osquery/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package osquery + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "osquery", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJyslMFu2z4Mxu95ig8+p3mAHP74AwMK7LIdtp4bVWJsIRLpSXQTv/0g2UmT1B2woTrkQJEfv19I+QEHGreQ/GugNK4A9Rpoi+b7FGlWgKNsk+/VC2/x3woAHj0Fl0GnXpKSw8sI7Qi7WWeHKG4ItAL2NXNbqx7AJtJ1t3J07GmLNsnQz5GFhrdC12KJ8hD0El7S+1BzOl8kRuG5wTumSR+RNHmbSTdXtfeern2V35uLs7MDjUdJ7u7uD/7K+dlRVYTsq6v6B0I7o2iJKZniWDufQa/ENybfLBlb5D/P1KMkeLaJIrGaAGfUrBFNOmQcO9KOUjVLrGnE0WQY5+i+CSAJiaK8ktvgq8IaxgtBuNI2taZZo5lzmnUpaDKbPneizTJrJ1mfvSNWv/eUPncSb7rYy8RY+kEYx87brkbmLYdpiRU+Iw3MntvNO8lvkqIJYbwIFYRlrIH96Vn9B6sVhNu/o3lif0LRy2pif96uukNreEYmK+wysmdL010vttvgKZOr8FZiP6jndvoC/H8R28FKGCIvg1gTiJ1JizDDP0/nh6ZiJVGfKJetLIlnLCshUH0DFXkNkwtCNDq/93lkm9XvAAAA//+BBnP8" +} diff --git a/filebeat/module/postgresql/fields.go b/filebeat/module/postgresql/fields.go new file mode 100644 index 00000000000..826ba953f82 --- /dev/null +++ b/filebeat/module/postgresql/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package postgresql + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "postgresql", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJysk8Fq3DAQhu9+ip89FrIEenOhENLsadMmzd6DshprRSWNI8kl26cv8sa1o7VNHTJHifm/j5HmAr/oWKLmEJWn8GwKIOpoqMTq7nT4cL9dFYCksPe6jppdia8FANyybAyhYo9a+KCdQjwQ+j4YVqi0obAugHBgHx/37CqtSkTfUAFUmowMZZt3AScsZTap4rGmEspzU7+ejNicatPmofJsM5HWIdUQOcQaVoOgc+Ys9y15bgxd5RpDlagthShs/eZ2Fp9qd6C+tTdJeKMdrSdZf9jR+1CpE1z12AnIwZOQj1pmQacpG3ZqGf7O855CQBbY4fbs6eNg1+xpitQE8lkDvQhbtxskpNVuNQM7Q30Xth3nWWzHkyKKJxHy1+qZ9iif3oUcTf63G/SbzCRzc7W72i6C7rpvmXLHv4xsvEjNo49YGRZx0ufz5fpykc63V1aag8BzQ/44LtVeTXIfbrY31zt8wubnj9v2DcOXRR73KR4hikiWXBx3sBSCUPkPOM0l0ks+lv9YZMNKkeyC18XfAAAA///JvYrW" +} diff --git a/filebeat/module/redis/fields.go b/filebeat/module/redis/fields.go new file mode 100644 index 00000000000..48124c1cc01 --- /dev/null +++ b/filebeat/module/redis/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package redis + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "redis", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJysk81u2zoQhfd+ioOs7gUSda9FgaJB0C6KAmkfQCw5pgYiOSpJWdXbF5Ls1HboNk47K5sjnu/MD+/Q0VQjkuG0ATJnRzVuHuf/NxvAUNKR+8wSarzdAMCSwycxg6MNsGVyJtVL6g5BefolN0eeeqphowz9/qSgeSpzLOXEPp2VxC4KrrGadWKxZUfpKHcOPPEvS2nHsZI7mkaJ5iz3G/4cX1taFCFb5Jb2njikrIKmCu9VwDeChOWLxquUKTa3aJJTO5p/6JadafDfViIe7x/evPv8gDFy5mCx5P6/fUaViCZRyBzINdVTulhvz+clreUqxyqdZXqV2xp9FE0pVc9verZRra3IcaAiz9GO3JVEJ7Yq3XsJz1NKypZHeplYvnWJd2AlJ+NfLu0XJ+Ncb4KKhEg5Mu3IYBvF77dnxwoKgfIosYOWEEjPUtULN1z78sRfveBavFfBgH6QHjKZqog1w9q7ajhv+Yp3Eux17A9Lq4IFZ2SRDlkOHpbHdvDFAZ51lERagkllexeewfWu5o58vD88+O8DxalM7Gj6t3PoaIIEjC3r9qQBo0p/GI6KtjyVV5tR0Q6eQk4YObcXTGnl3GzpZwAAAP//AoCyqA==" +} diff --git a/filebeat/module/santa/fields.go b/filebeat/module/santa/fields.go new file mode 100644 index 00000000000..dd08f0efa8a --- /dev/null +++ b/filebeat/module/santa/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package santa + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "santa", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJyUlF9v2jAQwN/5FKfuZXsoWpnoAw+TMqBrNVARqbS9TSa+EIskZ/kuW/n2k50Uwp+swBPY59/vzr7jFja4HQGrUlQPQIzkOIKb70TrHCH2yzc9AI2cOGPFUDmCrz0AqPdgTrrKsQeQGsw1j8LWLZSqwD3Vf2RrcQRrR5VtVs4w95jm556lEh+4W34DbnD7l5xureOrKqwvYvprOm6tH+iimnZi0ZgYvtITzWbPP7tEkwYIkimpL0SDEG36p3KHiq9Tj6fLly7zMtAgJQeSoa+MQyZnxAVpvEY773I+W3RKTLkOSKC07pIzSm14c6Jsd8cJ+yF0Rqhn8hT/iBaLabRs2oL7rVPtTjzW/qG8KvBg60jzkmETFY60Um9zVhW/B/EV+jiwjoQSyjtQjM6o/CJaHQplVazQdWXG2n854u2eznPu+MtFum/x5H934J/4OO/9UCwWsynE8QTi+efh3WB2kTEgO3Tp8Y3vXMqe7J3HN++6MaWGj6nJkbcsWITu+9RZZVXKNXSrJGtYb4wEnZjUJEqwn1BRUPm79Ubnxu3AMA5HAgtSRwUkfrjYrEs/aW14t5YzNRjeX2qMH6PB8B4yxZkf4nd8HyCqtJEVKoGHpzkYhop9qGSG63Hc/Q2xL8JWzhJj/yBbL7syzccmP+soQWbAV0wqUasc+71/AQAA//8U7uy0" +} diff --git a/filebeat/module/system/fields.go b/filebeat/module/system/fields.go new file mode 100644 index 00000000000..ebe7fb0387a --- /dev/null +++ b/filebeat/module/system/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package system + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "system", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJzsWE2P4zYMvedXELnsaf0DcigKLFC0QL+AmUtPWY1E28TKoiHRm3F/fSF/ZB1HdjKeFEWB9WlgD997eqJIRh/hC7YHCG0QrHYAQmLxAPun7sV+B2AwaE+1ELsD/LADAPiNTWMRcvZQKx/IFQMAWC4gJ4sh2wGEkr0cNbucigOIb3AHkBNaEw4dzkdwqsIJe3ykrfEAheemHt4kFMTnpw4Jcs8VSIlJCfGZMk5ZVSPl+WWKd4U7xf8ruea1Q2VPf6sYEsWcdaS0TPUIVRhEVfXF11GYsqTC7EutpDzAhx/PkR+SwCUHiX+9ETeGZcnYEbj2XHhVvRG39qwxhGwZlsxGyHnkiFhhCKp4qwGpqBGxCejfCBdDLhedRA6hTALPMxMW0mm6ail5buVqSvfPc4nw9PRzl8rohHSfyz1cBp+UgxcEdgicw75WIZzYmz2wh33dvFjSX7DdZwuqAhVOSePnu3GnsHN4JI/HTltCJ9ATx2q2RGw81zWaI81dHB1OfLhL0qDglz/7WhCt0+wc6hgWQEoloKLgGh0oZ4CqCg0pQduOqrJ0UnxTj1/RyYLwVM6NWdfFZarTsgC9aMgabuDGa8yuYs+HmP0WuQPsRfQCQ4G8qDx1WJaOyxRTsxNy6OSYKJi313C1jgI5u4n5jbxx4tsjBT5qNg+jv4k6CrDcH/XHEK+gjYQeC2L3QK/XAc9Gk7SP3OAVuNlKH7u1S6DpvtIYvrux3Kh7w+gTatSUkwbhvs4E0B6VoIGXtivOnyPrZ9BcVcqZeWVeb1/oPc97LAC+qqq2QweG3/94BnLd2tBfu3ZX+e54xmYf0bQK2E+UjeFRO+SKLF4t4Ty8SbuN/fn5LziV6BOMFABfUTeyTFufNvZ33Xgfm5Yhj1rYt+8QkZiFJvvkma8bwV0aRfkCpd9oYTiVpMukwHAi0SW5Yknh8L8brRqIRhvgK6lOwkLPntqiTHqU/VfP3EC88diVnChkU20LNsU4yNka9N0vwyjF4akfe5dmwRKt3UJmMFeNlR5ghW6BN1msbw8n1xP8JWxz9cPlbtSryPOUswmzy68paDJDu//6T1J0ZN6Yoxv3r3dlZQMfZPbkXsNy8Z47hk/sRJELgx8Xlx2Wp9cu368ZZrj/u2uGfwIAAP//lRvosQ==" +} diff --git a/filebeat/module/traefik/fields.go b/filebeat/module/traefik/fields.go new file mode 100644 index 00000000000..fb141ef270f --- /dev/null +++ b/filebeat/module/traefik/fields.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package traefik + +import ( + "github.com/elastic/beats/libbeat/asset" +) + +func init() { + if err := asset.SetFields("filebeat", "traefik", Asset); err != nil { + panic(err) + } +} + +// Asset returns asset data +func Asset() string { + return "eJy8mEFzqzYQx+/+FDvv7sy8aU8+9JK+95qZdpJJ/c6MjBbYRkh0Jezw7TsSYBMsbOPa4WSD2P9Pq12tliW8YbMCxwIzelsAOHIKV/Bl3d75sgCQaFOmypHRK/htAQDwl5G1QsgMQyXYks7BFQjdS6BMDhkptA8LgIxQSbsK7y1BixKHev5yTYUryNnUVXcnIumv78EUZGzKaT1/DTWHuiJN0dr97Zj0CXl/PRrtBGnbSQQXDFFaBU+0h4kBDaEYS+MwoerD057tDZudYTl6doIwUCpC7eDpBYSUjPYDy0FZ1iy8iaiwMjqfp/p7Zw5MFnzS+QK14yYOUFvkxP+83dTXBQazQcH/krArUMNGWEpB1K5A7ShtQcmGESfgSPrhGSHfDvHJBve8fn+Er79+/QVaDdf0fkvD6kWZSnSFGcudQsF3UVY+o398W893JOO/NVoHf6zXL532hK9Y3XYJPyj/fP0zLls4VyVbZDsVxFfrB93Oclyb0VZGW0xSI+PxOz+D9sq9cfDG4/obI5vEonYPm8ahvZQgM1wKt4LYSxfQ6brcIPtIDQb6kLXIW+QDtoebcluGzLdMp4HTWtNxYZGPk6pXdfg+fnBuf+2rgJ97rZe+CKJs952gA9Yx6fwBnrVqoGL0CwXUOssPOzLZvvZNCesotSg4LaBSdU5hl9LGgdgKUmKjEAyHG2e2rukJj+vd3Bl30/15mG6obzeb7WGmQsvINOP1dOgAiVtKx1kJZ+LsAjdAnwa+uHSxXxWNpVSoTnSMOsjYmlRM80ZMwXwPdQjFaZ5S/GOOl+bE3jEDJtjuN9BZUKTvB+VtXwNVCZcW91u5YP4arsjR6RKs/aHgsWATtXBFGlzCa8YV5xLaK1hMhf4oqnOwjXVYniJKPj0N5tF9dj7MorsyAO+7pEw5aTE+kMKpeu8v0hLfV5AJZa9MiedOeXgQ2ApVI2wwM4z7ZnnTAOkcrVv6kct2ZFv/4gU9RzPRH/6fWv4DzdMLkG7PhD4GcuEKZJS+XUIJRgff7zvUrs4fWYzV/db4RSX+yN41JT812pFG7T4xKPea09GYmtr3vwlZE+sUbgT22KrA09/PkZZhyKNMGuv5Dxw5mqQydHR0nOEivyuRq2V7flPChT/TTIw5GX3ndWtFguKJ1SLX3JnDS5yh6Pxx35B5bf0Rj5gDSWjDkxDFN2xyD21kp2Cj8hkb7VDL6W9E83u3cQ73GmHTiXfaIn3zEFMfOc4wRAlqVj1AZx52fufdf/ig8G1xJ1iiXPwXAAD//wEzgn8=" +} diff --git a/filebeat/scripts/docs_collector.py b/filebeat/scripts/docs_collector.py index abb514d7a39..2f3b4d61f6f 100644 --- a/filebeat/scripts/docs_collector.py +++ b/filebeat/scripts/docs_collector.py @@ -50,11 +50,7 @@ def collect(beat_name): modules_list[module] = title - # TODO (andrewkroh on 10-23-2018): Generate field docs that include - # field data from x-pack modules. Until then we cannot add links to the - # field docs for x-pack modules. - if "x-pack" not in module_dir: - module_file += """ + module_file += """ [float] === Fields diff --git a/filebeat/scripts/generate_imports_helper.py b/filebeat/scripts/generate_imports_helper.py deleted file mode 100644 index 915eb1c2016..00000000000 --- a/filebeat/scripts/generate_imports_helper.py +++ /dev/null @@ -1,22 +0,0 @@ -from os.path import abspath, isdir, join -from os import listdir - - -comment = """Package include imports all input packages so that they register -their factories with the global registry. This package can be imported in the -main package to automatically register all of the standard supported inputs -modules.""" - - -def get_importable_lines(go_beat_path, import_line): - path = abspath("input") - - imported_input_lines = [] - - # Skip the file folder, its not an input but I will do the move with another PR - inputs = [p for p in listdir(path) if isdir(join(path, p)) and p.find("file") is -1] - for input in sorted(inputs): - input_import = import_line.format(beat_path=go_beat_path, module="input", name=input) - imported_input_lines.append(input_import) - - return imported_input_lines diff --git a/filebeat/scripts/mage/config.go b/filebeat/scripts/mage/config.go new file mode 100644 index 00000000000..6b7cfc6f93a --- /dev/null +++ b/filebeat/scripts/mage/config.go @@ -0,0 +1,71 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package mage + +import ( + "github.com/elastic/beats/dev-tools/mage" +) + +const modulesConfigYml = "build/config.modules.yml" + +func configFileParams(moduleDirs ...string) mage.ConfigFileParams { + collectModuleConfig := func() error { + return mage.GenerateModuleReferenceConfig(modulesConfigYml, moduleDirs...) + } + + return mage.ConfigFileParams{ + ShortParts: []string{ + mage.OSSBeatDir("_meta/common.p1.yml"), + mage.OSSBeatDir("_meta/common.p2.yml"), + mage.LibbeatDir("_meta/config.yml"), + }, + ReferenceDeps: []interface{}{collectModuleConfig}, + ReferenceParts: []string{ + mage.OSSBeatDir("_meta/common.reference.p1.yml"), + modulesConfigYml, + mage.OSSBeatDir("_meta/common.reference.inputs.yml"), + mage.OSSBeatDir("_meta/common.reference.p2.yml"), + mage.LibbeatDir("_meta/config.reference.yml"), + }, + DockerParts: []string{ + mage.OSSBeatDir("_meta/beat.docker.yml"), + mage.LibbeatDir("_meta/config.docker.yml"), + }, + } +} + +// OSSConfigFileParams returns the default ConfigFileParams for generating +// filebeat*.yml files. +func OSSConfigFileParams(moduleDirs ...string) mage.ConfigFileParams { + return configFileParams(mage.OSSBeatDir("module")) +} + +// XPackConfigFileParams returns the default ConfigFileParams for generating +// filebeat*.yml files. +func XPackConfigFileParams() mage.ConfigFileParams { + args := configFileParams(mage.OSSBeatDir("module"), "module") + args.ReferenceParts = []string{ + mage.OSSBeatDir("_meta/common.reference.p1.yml"), + modulesConfigYml, + mage.OSSBeatDir("_meta/common.reference.inputs.yml"), + "_meta/common.reference.inputs.yml", // Added only to X-Pack. + mage.OSSBeatDir("_meta/common.reference.p2.yml"), + mage.LibbeatDir("_meta/config.reference.yml"), + } + return args +} diff --git a/filebeat/scripts/mage/docs.go b/filebeat/scripts/mage/docs.go new file mode 100644 index 00000000000..bd6bc0d3512 --- /dev/null +++ b/filebeat/scripts/mage/docs.go @@ -0,0 +1,43 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package mage + +import ( + "github.com/magefile/mage/sh" + + "github.com/elastic/beats/dev-tools/mage" +) + +// CollectDocs executes the Filebeat docs_collector script to collect/generate +// documentation from each module. +func CollectDocs() error { + ve, err := mage.PythonVirtualenv() + if err != nil { + return err + } + + python, err := mage.LookVirtualenvPath(ve, "python") + if err != nil { + return err + } + + // TODO: Port this script to Go. + return sh.Run(python, + mage.OSSBeatDir("scripts/docs_collector.py"), + "--beat", mage.BeatName) +} diff --git a/filebeat/scripts/mage/package.go b/filebeat/scripts/mage/package.go new file mode 100644 index 00000000000..5f39e0937e0 --- /dev/null +++ b/filebeat/scripts/mage/package.go @@ -0,0 +1,120 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package mage + +import ( + "github.com/magefile/mage/mg" + "github.com/pkg/errors" + + "github.com/elastic/beats/dev-tools/mage" +) + +const ( + dirModuleGenerated = "build/package/module" + dirModulesDGenerated = "build/package/modules.d" +) + +// CustomizePackaging modifies the package specs to add the modules and +// modules.d directory. You must declare a dependency on either +// PrepareModulePackagingOSS or PrepareModulePackagingXPack. +func CustomizePackaging() { + var ( + moduleTarget = "module" + module = mage.PackageFile{ + Mode: 0644, + Source: dirModuleGenerated, + } + + modulesDTarget = "modules.d" + modulesD = mage.PackageFile{ + Mode: 0644, + Source: dirModulesDGenerated, + Config: true, + Modules: true, + } + ) + + for _, args := range mage.Packages { + for _, pkgType := range args.Types { + switch pkgType { + case mage.TarGz, mage.Zip, mage.Docker: + args.Spec.Files[moduleTarget] = module + args.Spec.Files[modulesDTarget] = modulesD + case mage.Deb, mage.RPM: + args.Spec.Files["/usr/share/{{.BeatName}}/"+moduleTarget] = module + args.Spec.Files["/etc/{{.BeatName}}/"+modulesDTarget] = modulesD + case mage.DMG: + args.Spec.Files["/Library/Application Support/{{.BeatVendor}}/{{.BeatName}}/"+moduleTarget] = module + args.Spec.Files["/etc/{{.BeatName}}/"+modulesDTarget] = modulesD + default: + panic(errors.Errorf("unhandled package type: %v", pkgType)) + } + break + } + } +} + +// PrepareModulePackagingOSS generates build/package/modules and +// build/package/modules.d directories for use in packaging. +func PrepareModulePackagingOSS() error { + return prepareModulePackaging([]struct{ Src, Dst string }{ + {mage.OSSBeatDir("module"), dirModuleGenerated}, + {mage.OSSBeatDir("modules.d"), dirModulesDGenerated}, + }...) +} + +// PrepareModulePackagingXPack generates build/package/modules and +// build/package/modules.d directories for use in packaging. +func PrepareModulePackagingXPack() error { + return prepareModulePackaging([]struct{ Src, Dst string }{ + {mage.OSSBeatDir("module"), dirModuleGenerated}, + {"module", dirModuleGenerated}, + {mage.OSSBeatDir("modules.d"), dirModulesDGenerated}, + {"modules.d", dirModulesDGenerated}, + }...) +} + +// prepareModulePackaging generates build/package/modules and +// build/package/modules.d directories for use in packaging. +func prepareModulePackaging(files ...struct{ Src, Dst string }) error { + // This depends on the modules.d directory being up-to-date. + mg.Deps(mage.GenerateDirModulesD) + + // Clean any existing generated directories. + if err := mage.Clean([]string{dirModuleGenerated, dirModulesDGenerated}); err != nil { + return err + } + + for _, copyAction := range files { + err := (&mage.CopyTask{ + Source: copyAction.Src, + Dest: copyAction.Dst, + Mode: 0644, + DirMode: 0755, + Exclude: []string{ + "/_meta", + "/test", + "fields.go", + }, + }).Execute() + if err != nil { + return err + } + } + return nil +} diff --git a/filebeat/tests/system/test_keystore.py b/filebeat/tests/system/test_keystore.py index b6848b11eb4..af08aa1f0d6 100644 --- a/filebeat/tests/system/test_keystore.py +++ b/filebeat/tests/system/test_keystore.py @@ -56,8 +56,6 @@ def add_secret(self, key, value="hello world\n", force=False): """ args = [self.test_binary, "-systemTest", - "-test.coverprofile", - os.path.join(self.working_dir, "coverage.cov"), "-c", os.path.join(self.working_dir, self.beat_name + ".yml"), "-e", "-v", "-d", "*", "keystore", "add", key, "--stdin", diff --git a/filebeat/tests/system/test_stdin.py b/filebeat/tests/system/test_stdin.py index 6a79c050d00..570c53ce106 100644 --- a/filebeat/tests/system/test_stdin.py +++ b/filebeat/tests/system/test_stdin.py @@ -57,13 +57,12 @@ def test_stdin_eof(self): close_eof="true", ) - args = [self.test_binary, - "-systemTest", - "-test.coverprofile", - os.path.join(self.working_dir, "coverage.cov"), - "-c", os.path.join(self.working_dir, "filebeat.yml"), - "-e", "-v", "-d", "*", - ] + args = [self.test_binary, "-systemTest"] + if os.getenv("TEST_COVERAGE") == "true": + args += ["-test.coverprofile", + os.path.join(self.working_dir, "coverage.cov")] + args += ["-c", os.path.join(self.working_dir, "filebeat.yml"), "-e", + "-v", "-d", "*"] proc = Proc(args, os.path.join(self.working_dir, "filebeat.log")) os.write(proc.stdin_write, "Hello World\n") diff --git a/libbeat/scripts/Makefile b/libbeat/scripts/Makefile index 1ac501026d2..c402028811a 100755 --- a/libbeat/scripts/Makefile +++ b/libbeat/scripts/Makefile @@ -340,7 +340,7 @@ endif ifneq ($(shell [[ $(BEAT_NAME) == libbeat ]] && echo true ),true) @# Update docs @mkdir -p docs - @${PYTHON_ENV}/bin/python ${ES_BEATS}/libbeat/scripts/generate_fields_docs.py $(PWD) ${BEAT_TITLE} ${ES_BEATS} + @${PYTHON_ENV}/bin/python ${ES_BEATS}/libbeat/scripts/generate_fields_docs.py $(PWD)/fields.yml ${BEAT_TITLE} ${ES_BEATS} endif @mkdir -p $(PWD)/_meta/kibana.generated diff --git a/libbeat/scripts/generate_fields_docs.py b/libbeat/scripts/generate_fields_docs.py index 4fab927f396..4355fe32ba0 100644 --- a/libbeat/scripts/generate_fields_docs.py +++ b/libbeat/scripts/generate_fields_docs.py @@ -144,27 +144,22 @@ def fields_to_asciidoc(input, output, beat): parser = argparse.ArgumentParser( description="Generates the documentation for a Beat.") - parser.add_argument("path", help="Path to the beat folder") + parser.add_argument("fields", help="Path to fields.yml") parser.add_argument("beattitle", help="The beat title") parser.add_argument("es_beats", help="The path to the general beats folder") parser.add_argument("--output_path", default="", dest="output_path", help="Output path, if different from path") args = parser.parse_args() - beat_path = args.path + fields_yml = args.fields beat_title = args.beattitle.title() es_beats = args.es_beats - fields_yml = beat_path + "/fields.yml" - # Read fields.yml with open(fields_yml) as f: fields = f.read() - if args.output_path is not "": - output = open(os.path.join(args.output_path, "docs/fields.asciidoc"), 'w') - else: - output = open(os.path.join(beat_path, "docs/fields.asciidoc"), 'w') + output = open(os.path.join(args.output_path, "docs/fields.asciidoc"), 'w') try: fields_to_asciidoc(fields, output, beat_title) diff --git a/magefile.go b/magefile.go index 6b228a34da2..ce661e461bc 100644 --- a/magefile.go +++ b/magefile.go @@ -20,8 +20,13 @@ package main import ( + "fmt" "path/filepath" + "github.com/magefile/mage/mg" + "github.com/magefile/mage/sh" + "go.uber.org/multierr" + "github.com/elastic/beats/dev-tools/mage" ) @@ -68,6 +73,27 @@ func PackageBeatDashboards() error { return mage.PackageZip(spec.Evaluate()) } +// Fmt formats code and adds license headers. +func Fmt() { + mg.Deps(mage.GoImports, mage.PythonAutopep8) + mg.Deps(addLicenseHeaders) +} + +// addLicenseHeaders adds ASL2 headers to .go files outside of x-pack and +// add Elastic headers to .go files in x-pack. +func addLicenseHeaders() error { + fmt.Println(">> fmt - go-licenser: Adding missing headers") + + if err := sh.Run("go", "get", mage.GoLicenserImportPath); err != nil { + return err + } + + return multierr.Combine( + sh.RunV("go-licenser", "-license", "ASL2", "-exclude", "x-pack"), + sh.RunV("go-licenser", "-license", "Elastic", "x-pack"), + ) +} + // DumpVariables writes the template variables and values to stdout. func DumpVariables() error { return mage.DumpVariables() diff --git a/x-pack/auditbeat/magefile.go b/x-pack/auditbeat/magefile.go index 4b2e7b674e9..cbac941874b 100644 --- a/x-pack/auditbeat/magefile.go +++ b/x-pack/auditbeat/magefile.go @@ -120,7 +120,7 @@ func Update() { // Docs collects the documentation. func Docs() error { - return auditbeat.CollectDocs(mage.OSSBeatDir(), auditbeat.XpackBeatDir()) + return auditbeat.CollectDocs(mage.OSSBeatDir(), mage.XPackBeatDir()) } // Fmt formats source code and adds file headers. diff --git a/x-pack/filebeat/docker-compose.yml b/x-pack/filebeat/docker-compose.yml index e102bca826c..8a4f6f4a240 100644 --- a/x-pack/filebeat/docker-compose.yml +++ b/x-pack/filebeat/docker-compose.yml @@ -5,6 +5,7 @@ services: depends_on: - proxy_dep environment: + - BEAT_STRICT_PERMS=false - ES_HOST=elasticsearch - ES_PORT=9200 working_dir: /go/src/github.com/elastic/beats/x-pack/filebeat diff --git a/x-pack/filebeat/filebeat.docker.yml b/x-pack/filebeat/filebeat.docker.yml new file mode 100644 index 00000000000..99cf52e1cb6 --- /dev/null +++ b/x-pack/filebeat/filebeat.docker.yml @@ -0,0 +1,12 @@ +filebeat.config: + modules: + path: ${path.config}/modules.d/*.yml + reload.enabled: false + +processors: +- add_cloud_metadata: ~ + +output.elasticsearch: + hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}' + username: '${ELASTICSEARCH_USERNAME:}' + password: '${ELASTICSEARCH_PASSWORD:}' diff --git a/x-pack/filebeat/magefile.go b/x-pack/filebeat/magefile.go index 17a785eb26d..f3b6f75ca46 100644 --- a/x-pack/filebeat/magefile.go +++ b/x-pack/filebeat/magefile.go @@ -8,12 +8,13 @@ package main import ( "context" - "os" - "regexp" + "fmt" + "time" "github.com/magefile/mage/mg" "github.com/elastic/beats/dev-tools/mage" + filebeat "github.com/elastic/beats/filebeat/scripts/mage" ) func init() { @@ -43,11 +44,43 @@ func CrossBuild() error { return mage.CrossBuild() } +// BuildGoDaemon builds the go-daemon binary (use crossBuildGoDaemon). +func BuildGoDaemon() error { + return mage.BuildGoDaemon() +} + +// CrossBuildGoDaemon cross-builds the go-daemon binary using Docker. +func CrossBuildGoDaemon() error { + return mage.CrossBuildGoDaemon() +} + // Clean cleans all generated files and build artifacts. func Clean() error { return mage.Clean() } +// Package packages the Beat for distribution. +// Use SNAPSHOT=true to build snapshots. +// Use PLATFORMS to control the target platforms. +// Use VERSION_QUALIFIER to control the version qualifier. +func Package() { + start := time.Now() + defer func() { fmt.Println("package ran for", time.Since(start)) }() + + mage.UseElasticBeatXPackPackaging() + mage.PackageKibanaDashboardsFromBuildDir() + filebeat.CustomizePackaging() + + mg.Deps(Update) + mg.Deps(CrossBuild, CrossBuildGoDaemon) + mg.SerialDeps(mage.Package, TestPackages) +} + +// TestPackages tests the generated packages (i.e. file modes, owners, groups). +func TestPackages() error { + return mage.TestPackages() +} + // Fields generates the fields.yml file and a fields.go for each module and // input. func Fields() { @@ -72,14 +105,28 @@ func Dashboards() error { return mage.KibanaDashboards(mage.OSSBeatDir("module"), "module") } +// ExportDashboard exports a dashboard and writes it into the correct directory. +// +// Required environment variables: +// - MODULE: Name of the module +// - ID: Dashboard id +func ExportDashboard() error { + return mage.ExportDashboard() +} + // Config generates both the short and reference configs. func Config() { - mg.Deps(shortConfig, referenceConfig, mage.GenerateDirModulesD) + mg.Deps(configYML, mage.GenerateDirModulesD) +} + +func configYML() error { + return mage.Config(mage.AllConfigTypes, filebeat.XPackConfigFileParams(), ".") } // Update is an alias for executing fields, dashboards, config. func Update() { - mg.SerialDeps(Fields, Dashboards, Config, includeList) + mg.SerialDeps(Fields, Dashboards, Config, includeList, + filebeat.PrepareModulePackagingXPack) } func includeList() error { @@ -142,99 +189,3 @@ func PythonIntegTest(ctx context.Context) error { return mage.PythonNoseTest(args) }) } - -// ----------------------------------------------------------------------------- -// Customizations specific to Filebeat. -// - Include modules directory in packages (minus _meta and test files). -// - Include modules.d directory in packages. - -const ( - dirModuleGenerated = "build/package/module" - dirModulesDGenerated = "build/package/modules.d" -) - -// prepareModulePackaging generates modules and modules.d directories -// for an x-pack distribution, excluding _meta and test files so that they are -// not included in packages. -func prepareModulePackaging() error { - mg.Deps(mage.GenerateDirModulesD) - - err := mage.Clean([]string{ - dirModuleGenerated, - dirModulesDGenerated, - }) - if err != nil { - return err - } - - for _, copyAction := range []struct { - src, dst string - }{ - {mage.OSSBeatDir("module"), dirModuleGenerated}, - {"module", dirModuleGenerated}, - {mage.OSSBeatDir("modules.d"), dirModulesDGenerated}, - {"modules.d", dirModulesDGenerated}, - } { - err := (&mage.CopyTask{ - Source: copyAction.src, - Dest: copyAction.dst, - Mode: 0644, - DirMode: 0755, - Exclude: []string{ - "/_meta", - "/test", - "fields.go", - }, - }).Execute() - if err != nil { - return err - } - } - return nil -} - -func shortConfig() error { - var configParts = []string{ - mage.OSSBeatDir("_meta/common.p1.yml"), - mage.OSSBeatDir("_meta/common.p2.yml"), - "{{ elastic_beats_dir }}/libbeat/_meta/config.yml", - } - - for i, f := range configParts { - configParts[i] = mage.MustExpand(f) - } - - configFile := mage.BeatName + ".yml" - mage.MustFileConcat(configFile, 0640, configParts...) - mage.MustFindReplace(configFile, regexp.MustCompile("beatname"), mage.BeatName) - mage.MustFindReplace(configFile, regexp.MustCompile("beat-index-prefix"), mage.BeatIndexPrefix) - return nil -} - -func referenceConfig() error { - const modulesConfigYml = "build/config.modules.yml" - err := mage.GenerateModuleReferenceConfig(modulesConfigYml, mage.OSSBeatDir("module"), "module") - if err != nil { - return err - } - defer os.Remove(modulesConfigYml) - - var configParts = []string{ - mage.OSSBeatDir("_meta/common.reference.p1.yml"), - modulesConfigYml, - mage.OSSBeatDir("_meta/common.reference.inputs.yml"), - "_meta/common.reference.inputs.yml", - mage.OSSBeatDir("_meta/common.reference.p2.yml"), - "{{ elastic_beats_dir }}/libbeat/_meta/config.reference.yml", - } - - for i, f := range configParts { - configParts[i] = mage.MustExpand(f) - } - - configFile := mage.BeatName + ".reference.yml" - mage.MustFileConcat(configFile, 0640, configParts...) - mage.MustFindReplace(configFile, regexp.MustCompile("beatname"), mage.BeatName) - mage.MustFindReplace(configFile, regexp.MustCompile("beat-index-prefix"), mage.BeatIndexPrefix) - return nil -}