diff --git a/.gitignore b/.gitignore index 41c0065e9ab..239b968a971 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,5 @@ /vendor/github.com/elastic/beats/libbeat/fields.yml /docs/elastic/ html_docs +/x-pack/apm-server/apm-server +/x-pack/apm-server/build diff --git a/Makefile b/Makefile index 4e6f432ffe8..3247d174c21 100644 --- a/Makefile +++ b/Makefile @@ -28,12 +28,34 @@ update-beats: @govendor fetch github.com/elastic/beats/libbeat/outputs/transport/transptest@$(BEATS_VERSION) @govendor fetch github.com/elastic/beats/libbeat/scripts/cmd/global_fields@$(BEATS_VERSION) @govendor fetch github.com/elastic/beats/licenses@$(BEATS_VERSION) - + @govendor fetch github.com/elastic/beats/x-pack/libbeat/cmd@$(BEATS_VERSION) @BEATS_VERSION=$(BEATS_VERSION) script/update_beats.sh @$(MAKE) update @echo --- Use this commit message: Update beats framework to `cat vendor/vendor.json | python -c 'import sys, json; print([p["revision"] for p in json.load(sys.stdin)["package"] if p["path"] == "github.com/elastic/beats/libbeat/beat"][0][:7])'` +.PHONY: ${BEAT_NAME}.x-pack +${BEAT_NAME}.x-pack: $(GOFILES_ALL) ## @build build the x-pack enabled version + go build -o ./x-pack/${BEAT_NAME}/${BEAT_NAME} $(GOBUILD_FLAGS) ./x-pack/${BEAT_NAME} + + +.PHONY: check-headers +check-headers: +ifndef CHECK_HEADERS_DISABLED + @go get -u github.com/elastic/go-licenser + @go-licenser -d -exclude x-pack + @go-licenser -d -license Elastic x-pack +endif + +.PHONY: add-headers +add-headers: +ifndef CHECK_HEADERS_DISABLED + @go get github.com/elastic/go-licenser + @go-licenser -exclude x-pack + @go-licenser -license Elastic x-pack +endif + + .PHONY: is-beats-updated is-beats-updated: python-env @$(PYTHON_ENV)/bin/python ./script/is_beats_updated.py ${BEATS_VERSION} diff --git a/NOTICE.txt b/NOTICE.txt index bd23f2dcc10..794ebb3b6e6 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -264,7 +264,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------- Dependency: github.com/elastic/beats Version: master -Revision: a4b06ae0f035889416ceb0df0b552ec3c573ca1a +Revision: 17939559496bb2bf0424bc5de84105e6040eaa9e License type (autodetected): Apache-2.0 ./vendor/github.com/elastic/beats/LICENSE.txt: -------------------------------------------------------------------- diff --git a/_beats/dev-tools/ecs-migration.yml b/_beats/dev-tools/ecs-migration.yml index 0c38db7e2e5..40e33fc1ef8 100644 --- a/_beats/dev-tools/ecs-migration.yml +++ b/_beats/dev-tools/ecs-migration.yml @@ -6,44 +6,46 @@ # # - from: source-field-in-6.x # to: target-filed-in-ECS -# # Alias field is useful for fields where there is a 1-1 mapping from old to new -# alias: true-if-alias-is-required-in-6x +# # Alias field is useful for fields where many-1 mapping from new to old are needed +# alias: true-if-alias-is-required-in-7 +# # Alias6 field is useful for fields where there is a 1-1 mapping from old to new. If absent, defaults to false. +# alias6: true-if-alias-is-required-in-6 # # Copy to is useful for fields where multiple fields map to the same ECS field # copy_to: true-if-field-should-be-copied-to-target-in-6x - from: offset to: log.offset + alias6: true alias: true - copy_to: false - from: fileset.name to: event.dataset + alias6: true alias: true - copy_to: false - from: fileset.module to: event.module + alias6: true alias: true - from: source to: ["log.file.path", "log.source.ip"] alias: false - copy_to: false - from: beat.name to: agent.type + alias6: true alias: true - copy_to: false - from: beat.hostname to: agent.hostname + alias6: true alias: true - copy_to: false - from: beat.version to: agent.version + alias6: true alias: true - copy_to: false # Filebeat modules @@ -52,62 +54,50 @@ - from: source_ecs.ip to: source.ip alias: true - copy_to: false - from: source_ecs.port to: source.port alias: true - copy_to: false - from: source_ecs.geo.continent_name to: source.geo.continent_name alias: true - copy_to: false - from: source_ecs.geo.country_iso_code to: source.geo.country_iso_code alias: true - copy_to: false - from: source_ecs.geo.location to: source.geo.location alias: true - copy_to: false - from: source_ecs.geo.region_name to: source.geo.region_name alias: true - copy_to: false - from: source_ecs.geo.city_name to: source.geo.city_name alias: true - copy_to: false - from: source_ecs.geo.region_iso_code to: source.geo.region_iso_code alias: true - copy_to: false - from: system.syslog.hostname to: host.hostname alias: true - copy_to: false - from: system.syslog.program to: process.name alias: true - copy_to: false - from: system.syslog.pid to: process.pid alias: true - copy_to: false - from: system.syslog.message to: message alias: true - copy_to: false - from: system.auth.hostname to: host.hostname @@ -117,280 +107,224 @@ - from: system.auth.pid to: process.pid alias: true - copy_to: false - from: system.auth.groupadd.gid to: group.id alias: true - copy_to: false - from: system.auth.useradd.uid to: user.id alias: true - copy_to: false - from: system.auth.useradd.user to: user.name alias: true - copy_to: false - from: system.auth.ssh.event to: event.action alias: true - copy_to: false - from: system.auth.program to: process.name alias: true - copy_to: false - from: system.auth.ssh.ip to: source.ip alias: true - copy_to: false - from: system.auth.ssh.port to: source.port alias: true - copy_to: false - from: system.auth.ssh.geoip.* to: source.geo.* alias: true - copy_to: false ## Apache - from: apache2.access.user_name to: user.name alias: true - copy_to: false - from: apache2.access.method to: http.request.method alias: true - copy_to: false - from: apache2.access.url to: url.original alias: true - copy_to: false - from: apache2.access.http_version to: http.version alias: true - copy_to: false - from: apache2.access.response_code to: http.response.status_code alias: true - copy_to: false - from: apache2.access.referrer to: http.request.referrer alias: true - copy_to: false - from: apache2.access.agent to: user_agent.original alias: true - copy_to: false - from: read_timestamp to: event.created - alias: false - copy_to: false + alias: true # These expand all fields under geoip and user_agent - from: apache2.access.geoip.* to: source.geo.* - alias: false - copy_to: false + alias: true - from: apache2.access.user_agent.* to: user_agent.* - alias: false - copy_to: false - -# From Auditbeat's auditd module. -- from: source.hostname - to: source.domain alias: true - copy_to: false + +# IIS module - from: iis.access.server_ip to: destination.ip alias: true - copy_to: false - from: iis.access.remote_ip to: source.ip alias: true - copy_to: false - from: iis.access.url to: url.path alias: true - copy_to: false - from: iis.access.query_string to: url.query alias: true - copy_to: false - from: iis.access.port to: destination.port alias: true - copy_to: false - from: iis.access.user_name to: user.name alias: true - copy_to: false - from: iis.access.hostname to: destination.domain alias: true - copy_to: false - from: iis.access.user_agent.original to: user_agent.original alias: true - copy_to: false - from: iis.access.geoip.continent_name to: source.geo.continent_name alias: true - copy_to: false - from: iis.access.geoip.country_iso_code to: source.geo.country_iso_code alias: true - copy_to: false - from: iis.access.geoip.location to: source.geo.location alias: true - copy_to: false - from: iis.access.geoip.region_name to: source.geo.region_name alias: true - copy_to: false - from: iis.access.geoip.city_name to: source.geo.city_name alias: true - copy_to: false - from: iis.access.geoip.region_iso_code to: source.geo.region_iso_code alias: true - copy_to: false # Note: `http` is not officially in ECS yet - from: iis.access.method to: http.request.method alias: true - copy_to: false - from: iis.access.response_code to: http.response.status_code alias: true - copy_to: false - from: iis.access.referrer to: http.request.referrer alias: true - copy_to: false +# HAProxy module - from: haproxy.client.port to: source.port alias: true - copy_to: false - from: haproxy.process_name to: process.name alias: true - copy_to: false - from: haproxy.pid to: process.pid alias: true - copy_to: false - from: haproxy.destination.ip to: destination.ip alias: true - copy_to: false - from: haproxy.destination.port to: destination.port alias: true - copy_to: false - from: haproxy.geoip.continent_name to: source.geo.continent_name alias: true - copy_to: false - from: haproxy.geoip.country_iso_code to: source.geo.country_iso_code alias: true - copy_to: false - from: haproxy.geoip.location to: source.geo.location alias: true - copy_to: false - from: haproxy.geoip.region_name to: source.geo.region_name alias: true - copy_to: false - from: haproxy.geoip.city_name to: source.geo.city_name alias: true - copy_to: false - from: haproxy.geoip.region_iso_code to: source.geo.region_iso_code alias: true - copy_to: false - from: nginx.access.remote_ip_list to: network.forwarded_ip alias: true - copy_to: false - from: nginx.access.user_name to: user.name alias: true - copy_to: false - from: nginx.access.url to: url.original alias: true - copy_to: false - from: nginx.access.agent to: user_agent.original alias: true - copy_to: false # Note: `http` is not officially in ECS yet - from: nginx.access.response_code to: http.response.status_code alias: true - copy_to: false - from: nginx.access.referrer to: http.request.referrer alias: true - copy_to: false - from: nginx.access.method to: http.request.method @@ -400,39 +334,36 @@ - from: nginx.access.http_version to: http.version alias: true - copy_to: false - from: nginx.access.geoip.continent_name to: source.geo.continent_name alias: true - copy_to: false - from: nginx.access.geoip.country_iso_code to: source.geo.country_iso_code alias: true - copy_to: false - from: nginx.access.geoip.location to: source.geo.location alias: true - copy_to: false - from: nginx.access.geoip.region_name to: source.geo.region_name alias: true - copy_to: false - from: nginx.access.geoip.city_name to: source.geo.city_name alias: true - copy_to: false - from: nginx.access.geoip.region_iso_code to: source.geo.region_iso_code alias: true - copy_to: false - from: nginx.access.agent to: user_agent.original alias: true - copy_to: false + +# From Auditbeat's auditd module. +- from: source.hostname + to: source.domain + alias: true diff --git a/_beats/dev-tools/packaging/packages.yml b/_beats/dev-tools/packaging/packages.yml index 6ffbe155718..7d71440230e 100644 --- a/_beats/dev-tools/packaging/packages.yml +++ b/_beats/dev-tools/packaging/packages.yml @@ -395,7 +395,7 @@ specs: <<: *elastic_license_for_binaries files: '{{.BeatName}}{{.BinaryExt}}': - source: ../x-pack/{{.BeatName}}/build/golang-crossbuild/{{.BeatName}}-{{.GOOS}}-{{.Platform.Arch}}{{.BinaryExt}} + source: ./{{.XPackDir}}/{{.BeatName}}/build/golang-crossbuild/{{.BeatName}}-{{.GOOS}}-{{.Platform.Arch}}{{.BinaryExt}} - os: darwin types: [tgz] @@ -404,7 +404,7 @@ specs: <<: *elastic_license_for_binaries files: '{{.BeatName}}{{.BinaryExt}}': - source: ../x-pack/{{.BeatName}}/build/golang-crossbuild/{{.BeatName}}-{{.GOOS}}-{{.Platform.Arch}}{{.BinaryExt}} + source: ./{{.XPackDir}}/{{.BeatName}}/build/golang-crossbuild/{{.BeatName}}-{{.GOOS}}-{{.Platform.Arch}}{{.BinaryExt}} - os: darwin types: [dmg] @@ -419,7 +419,7 @@ specs: <<: *elastic_license_for_binaries files: '{{.BeatName}}{{.BinaryExt}}': - source: ../x-pack/{{.BeatName}}/build/golang-crossbuild/{{.BeatName}}-{{.GOOS}}-{{.Platform.Arch}}{{.BinaryExt}} + source: ./{{.XPackDir}}/{{.BeatName}}/build/golang-crossbuild/{{.BeatName}}-{{.GOOS}}-{{.Platform.Arch}}{{.BinaryExt}} - os: linux types: [deb, rpm] @@ -428,7 +428,7 @@ specs: <<: *elastic_license_for_deb_rpm files: /usr/share/{{.BeatName}}/bin/{{.BeatName}}{{.BinaryExt}}: - source: ../x-pack/{{.BeatName}}/build/golang-crossbuild/{{.BeatName}}-{{.GOOS}}-{{.Platform.Arch}}{{.BinaryExt}} + source: ./{{.XPackDir}}/{{.BeatName}}/build/golang-crossbuild/{{.BeatName}}-{{.GOOS}}-{{.Platform.Arch}}{{.BinaryExt}} - os: linux types: [docker] @@ -438,4 +438,4 @@ specs: <<: *elastic_license_for_binaries files: '{{.BeatName}}{{.BinaryExt}}': - source: ../x-pack/{{.BeatName}}/build/golang-crossbuild/{{.BeatName}}-{{.GOOS}}-{{.Platform.Arch}}{{.BinaryExt}} + source: ./{{.XPackDir}}/{{.BeatName}}/build/golang-crossbuild/{{.BeatName}}-{{.GOOS}}-{{.Platform.Arch}}{{.BinaryExt}} diff --git a/_beats/dev-tools/packaging/templates/linux/systemd.unit.tmpl b/_beats/dev-tools/packaging/templates/linux/systemd.unit.tmpl index 5725ba3e2a3..2b91a480fee 100644 --- a/_beats/dev-tools/packaging/templates/linux/systemd.unit.tmpl +++ b/_beats/dev-tools/packaging/templates/linux/systemd.unit.tmpl @@ -5,7 +5,10 @@ Wants=network-online.target After=network-online.target [Service] -ExecStart=/usr/share/{{.BeatName}}/bin/{{.BeatName}} -c /etc/{{.BeatName}}/{{.BeatName}}.yml -path.home /usr/share/{{.BeatName}} -path.config /etc/{{.BeatName}} -path.data /var/lib/{{.BeatName}} -path.logs /var/log/{{.BeatName}} +Environment=BEAT_LOG_OPTS="-e" +Environment=BEAT_CONFIG_OPTS="-c /etc/{{.BeatName}}/{{.BeatName}}.yml" +Environment=BEAT_PATH_OPTS="-path.home /usr/share/{{.BeatName}} -path.config /etc/{{.BeatName}} -path.data /var/lib/{{.BeatName}} -path.logs /var/log/{{.BeatName}}" +ExecStart=/usr/share/{{.BeatName}}/bin/{{.BeatName}} $BEAT_LOG_OPTS $BEAT_CONFIG_OPTS $BEAT_PATH_OPTS Restart=always [Install] diff --git a/_beats/libbeat/_meta/fields.ecs.yml b/_beats/libbeat/_meta/fields.ecs.yml index 18a6e1c5975..754bc9a9a5b 100644 --- a/_beats/libbeat/_meta/fields.ecs.yml +++ b/_beats/libbeat/_meta/fields.ecs.yml @@ -8,8 +8,7 @@ title: Agent group: 2 description: > - The agent fields contain the data about the agent/client/shipper that - created the event. + The agent fields contain the data about the software entity, if any, that collects, detects, or observes events on a host, or takes measurements on a host. Examples include Beats. Agents may also run on observers. ECS agent.* fields shall be populated with details of the agent running on the host or observer where the event happened or the measurement was taken. footnote: > Examples: In the case of Beats for logs, the agent.name is filebeat. For APM, it is the agent running in the app/service. The agent information does not change if @@ -17,31 +16,51 @@ such as Logstash or APM Server. type: group fields: + - name: version + level: core type: keyword description: > Version of the agent. example: 6.0.0-rc2 - - name: type + + - name: name + level: core type: keyword description: > Name of the agent. - example: filebeat - - name: hostname + This is a name that can be given to an agent. This can be helpful if + for example two Filebeat instances are running on the same host + but a human readable separation is needed on which Filebeat instance + data is coming from. + + If no name is given, the name is often left empty. + example: foo + + - name: type + level: core type: keyword description: > - Hostname of the agent. - + Type of the agent. + + The agent type stays always the same and should be given by the agent used. + In case of Filebeat the agent would always be Filebeat also if two + Filebeat instances are run on the same machine. + example: filebeat + - name: id + level: core type: keyword description: > Unique identifier of this agent (if one exists). Example: For Beats this would be beat.id. example: 8a4f500d + - name: ephemeral_id + level: extended type: keyword description: > Ephemeral identifier of this agent (if one exists). @@ -58,8 +77,8 @@ fields: - name: "@timestamp" type: date + level: core required: true - phase: 3 example: "2016-05-23T08:05:34.853Z" description: > Date/time when the event originated. @@ -70,14 +89,16 @@ Required field for all events. - name: tags + level: core type: keyword example: "[\"production\", \"env2\"]" description: > List of keywords used to tag each event. - name: labels + level: core type: object - example: {key1: value1, key2: value2} + example: {env: production, application: foo-bar} description: > Key/value pairs. @@ -87,8 +108,8 @@ Example: `docker` and `k8s` labels. - name: message + level: core type: text - phase: 1 example: "Hello World" description: > For log events the message field contains the log message. @@ -97,6 +118,125 @@ different values which are then freely searchable. If multiple messages exist, they can be combined into one message. + - name: client + title: Client + group: 2 + description: > + A client is defined as the initiator of a network connection for events regarding sessions, connections, or bidirectional flow records. For TCP events, the client is the initiator of the TCP connection that sends the SYN packet(s). For other protocols, the client is generally the initiator or requestor in the network transaction. Some systems use the term "originator" to refer the client in TCP connections. The client fields describe details about the system acting as the client in the network event. Client fields are usually populated in conjuction with server fields. Client fields are generally not populated for packet-level events. + type: group + fields: + + - name: ip + level: core + type: ip + description: > + IP address of the client. + + Can be one or multiple IPv4 or IPv6 addresses. + + - name: port + level: core + type: long + description: > + Port of the client. + + - name: mac + level: core + type: keyword + description: > + MAC address of the client. + + - name: domain + level: core + type: keyword + description: > + Client domain. + + # Metrics + - name: bytes + level: core + type: long + example: 184 + description: > + Bytes sent from the client to the server. + + - name: packets + level: core + type: long + example: 12 + description: > + Packets sent from the client to the server. + + - name: geo + title: Geo + group: 2 + description: > + Geo fields can carry data about a specific location related to an event + or geo information derived from an IP field. + type: group + fields: + + - name: location + level: core + type: geo_point + description: > + Longitude and latitude. + example: '{ "lon": -73.614830, "lat": 45.505918 }' + + - name: continent_name + level: core + type: keyword + description: > + Name of the continent. + example: North America + + - name: country_name + level: core + type: keyword + description: > + Country name. + example: Canada + + - name: region_name + level: core + type: keyword + description: > + Region name. + example: Quebec + + - name: city_name + level: core + type: keyword + description: > + City name. + example: Montreal + + - name: country_iso_code + level: core + type: keyword + description: > + Country ISO code. + example: CA + + - name: region_iso_code + level: core + type: keyword + description: > + Region ISO code. + example: CA-QC + + - name: name + level: extended + type: keyword + description: > + User-defined description of a location, at the level of granularity they care about. + + Could be the name of their data centers, the floor number, if this describes + a local physical entity, city names. + + Not typically used in automated geolocation. + example: boston-dc + - name: cloud title: Cloud group: 2 @@ -112,6 +252,7 @@ type: group fields: - name: provider + level: extended example: ec2 type: keyword description: > @@ -119,35 +260,41 @@ digitalocean. - name: availability_zone + level: extended example: us-east-1c type: keyword description: > Availability zone in which this host is running. - name: region + level: extended type: keyword example: us-east-1 description: > Region in which this host is running. - name: instance.id + level: extended type: keyword example: i-1234567890abcdef0 description: > Instance ID of the host machine. - name: instance.name + level: extended type: keyword description: > Instance name of the host machine. - name: machine.type + level: extended type: keyword example: t2.medium description: > Machine type of the host machine. - name: account.id + level: extended type: keyword example: 666777888999 description: > @@ -166,28 +313,40 @@ containers from any runtime. type: group fields: + - name: runtime + level: extended type: keyword description: > Runtime managing this container. example: docker + - name: id + level: core type: keyword description: > Unique container id. + - name: image.name + level: extended type: keyword description: > Name of the image the container was built on. + - name: image.tag + level: extended type: keyword description: > Container image tag. + - name: name + level: extended type: keyword description: > Container name. + - name: labels + level: extended type: object object_type: keyword description: > @@ -198,115 +357,142 @@ group: 2 description: > Destination fields describe details about the destination of a - packet/event. + packet/event. Destination fields are usually populated in conjunction with source fields. type: group fields: + - name: ip + level: core type: ip description: > IP address of the destination. Can be one or multiple IPv4 or IPv6 addresses. - + - name: port + level: core type: long description: > Port of the destination. - + - name: mac + level: core type: keyword description: > MAC address of the destination. - + - name: domain + level: core type: keyword - phase: 1 description: > Destination domain. + + # Metrics + - name: bytes + level: core + type: long + example: 184 + description: > + Bytes sent from the destination to the source. + + - name: packets + level: core + type: long + example: 12 + description: > + Packets sent from the destination to the source. - name: geo + title: Geo + group: 2 + description: > + Geo fields can carry data about a specific location related to an event + or geo information derived from an IP field. type: group - description: - Geolocation for destination. fields: + + - name: location + level: core + type: geo_point + description: > + Longitude and latitude. + example: '{ "lon": -73.614830, "lat": 45.505918 }' + - name: continent_name + level: core type: keyword description: > Name of the continent. + example: North America - - name: country_iso_code + - name: country_name + level: core type: keyword description: > - Country ISO code. - - - name: location - type: geo_point - description: > - Longitude and latitude. + Country name. + example: Canada - name: region_name + level: core type: keyword description: > Region name. + example: Quebec - name: city_name + level: core type: keyword description: > City name. + example: Montreal + + - name: country_iso_code + level: core + type: keyword + description: > + Country ISO code. + example: CA - name: region_iso_code + level: core type: keyword description: > Region ISO code. + example: CA-QC + + - name: name + level: extended + type: keyword + description: > + User-defined description of a location, at the level of granularity they care about. + + Could be the name of their data centers, the floor number, if this describes + a local physical entity, city names. - - name: device - title: Device + Not typically used in automated geolocation. + example: boston-dc + + - name: ecs + title: ECS group: 2 description: > - Device fields are used to provide additional information about the device - that is the source of the information. This could be a firewall, network device, etc. + Meta-information specific to ECS. type: group fields: - - name: mac - type: keyword - description: > - MAC address of the device - - name: ip - type: ip - description: > - IP address of the device. - - name: hostname - type: keyword - description: > - Hostname of the device. - - name: vendor - type: text - description: > - Device vendor information. + - name: version + level: core type: keyword + required: true description: > - Device version. - - name: serial_number - type: keyword - description: > - Device serial number. - - name: timezone.offset.sec - type: long - description: > - Timezone offset of the host in seconds. + ECS version this event conforms to. `ecs.version` is a required field and must exist in all events. - Number of seconds relative to UTC. If the offset is -01:30 the - value will be -5400. - example: -5400 - - name: type - type: keyword - description: > - The type of the device the data is coming from. + When querying across multiple indices -- which may conform to slightly + different ECS versions -- this field lets integrations adjust to the + schema version of the events. - There is no predefined list of device types. Some examples are - `endpoint`, `firewall`, `ids`, `ips`, `proxy`. - example: firewall + The current version is 1.0.0-beta1 . + example: 1.0.0-beta1 - name: error title: Error @@ -318,56 +504,99 @@ type: group fields: - name: id + level: core type: keyword description: > Unique identifier for the error. - name: message + level: core type: text description: > Error message. + - name: code + level: core + type: keyword + description: > + Error code describing the error. + - name: event title: Event group: 2 description: > - The event fields are used for context information about the data itself. + The event fields are used for context information about the log or metric event itself. A log is defined as an event containing details of something that happened. Log events must include the time at which the thing happened. Examples of log events include a process starting on a host, a network packet being sent from a source to a destination, or a network connection between a client and a server being initiated or closed. A metric is defined as an event containing one or more numerical or categorical measurements and the time at which the measurement was taken. Examples of metric events include memory pressure measured on a host, or vulnerabilities measured on a scanned host. type: group fields: + - name: id + level: core type: keyword description: > Unique ID to describe the event. example: 8a4f500d - phase: 1 + + - name: kind + level: extended + type: keyword + description: > + The kind of the event. + + This gives information about what type of information the event + contains, without being specific to the contents of the event. Examples + are `event`, `state`, `alarm`. Warning: In future versions of ECS, we + plan to provide a list of acceptable values for this field, please use + with caution. + example: state + - name: category + level: core type: keyword description: > Event category. - This can be a user defined category. - example: metrics + This contains high-level information about the contents of the event. It + is more generic than `event.action`, in the sense that typically a + category contains multiple actions. Warning: In future versions of ECS, + we plan to provide a list of acceptable values for this field, please + use with caution. - - name: type + example: user-management + + - name: action + level: core type: keyword description: > - A type given to this kind of event which can be used for grouping. + The action captured by the event. - This is normally defined by the user. - example: nginx-stats-metrics + This describes the information in the event. It is more specific than + `event.category`. Examples are `group-add`, `process-started`, + `file-created`. The value is normally defined by the implementer. + example: user-password-change - - name: action + - name: outcome + level: extended + type: keyword + description: > + The outcome of the event. + + If the event describes an action, this fields contains the outcome of + that action. Examples outcomes are `success` and `failure`. Warning: In + future versions of ECS, we plan to provide a list of acceptable values + for this field, please use with caution. + + example: success + + - name: type + level: core type: keyword description: > - The action captured by the event. The type of action will vary from - system to system but is likely to include actions by security services, - such as blocking or quarantining; as well as more generic actions such - as login events, file i/o or proxy forwarding events. + Reserved for future usage. - The value is normally defined by the user. - example: reject + Please avoid using this field for user data. - name: module + level: core type: keyword description: > Name of the module this data is coming from. @@ -376,6 +605,7 @@ example: mysql - name: dataset + level: core type: keyword description: > Name of the dataset. @@ -386,8 +616,8 @@ example: stats - name: severity + level: core type: long - phase: 1 example: "7" description: > Severity describes the severity of the event. What the different @@ -395,8 +625,8 @@ the implementer to make sure severities are consistent across events. - name: original + level: core type: keyword - phase: 1 # Unfortunately this example is not shown correctly yet as | do not work # in tables well # Is | is the representation of | it works except for cases where @@ -414,34 +644,35 @@ doc_values: false - name: hash + level: extended type: keyword - phase: 1 example: "123456789012345678901234567890ABCD" description: > Hash (perhaps logstash fingerprint) of raw field to be able to demonstrate log integrity. - - name: version - type: keyword - required: true - description: > - The version field contains the version an event for ECS adheres to. - - This field should be provided as part of each event to make it possible - to detect to which ECS version an event belongs. - - event.version is a required field and must exist in all events. It - describes which ECS version the event adheres to. - - The current version is 0.1.0. - example: 0.1.0 - - name: duration + level: core type: long description: > Duration of the event in nanoseconds. + If event.start and event.end are known this value should be the + difference between the end and start time. + + - name: timezone + level: extended + type: keyword + description: > + This field should be populated when the event's timestamp does not include + timezone information already (e.g. default Syslog timestamps). It's + optional otherwise. + + Acceptable timezone formats are: a canonical ID (e.g. "Europe/Amsterdam"), + abbreviated (e.g. "EST") or an HH:mm differential (e.g. "-05:00"). + - name: created + level: core type: date description: > event.created contains the date when the event was created. @@ -457,13 +688,29 @@ In case the two timestamps are identical, @timestamp should be used. + - name: start + level: extended + type: date + description: > + event.start contains the date when the event started or when the + activity was first observed. + + - name: end + level: extended + type: date + description: > + event.end contains the date when the event ended or when the activity + was last observed. + - name: risk_score + level: core type: float description: > Risk score or priority of the event (e.g. security solutions). Use your system's original value here. - name: risk_score_norm + level: extended type: float description: > Normalized risk score or priority of the event, on a scale of 0 to 100. @@ -475,30 +722,22 @@ group: 2 title: File description: > - File fields provide details about each file. + A file is defined as a set of information that has been created on, or has existed on a filesystem. File objects can be associated with host events, network events, and/or file events (e.g., those produced by File Integrity Monitoring [FIM] products or services). File fields provide details about the affected file associated with the event or metric. type: group fields: + - name: path - type: text + level: extended + type: keyword description: Path to the file. - multi_fields: - - name: raw - type: keyword - description: > - Path to the file. This is a non-analyzed field that is useful - for aggregations. - name: target_path - type: text + level: extended + type: keyword description: Target path for symlinks. - multi_fields: - - name: raw - type: keyword - description: > - Path to the file. This is a non-analyzed field that is useful - for aggregations. - name: extension + level: extended type: keyword description: > File extension. @@ -507,115 +746,113 @@ example: png - name: type + level: extended type: keyword description: File type (file, dir, or symlink). - name: device + level: extended type: keyword description: Device that is the source of the file. - name: inode + level: extended type: keyword description: Inode representing the file in the filesystem. - name: uid + level: extended type: keyword description: > The user ID (UID) or security identifier (SID) of the file owner. - name: owner + level: extended type: keyword description: File owner's username. - name: gid + level: extended type: keyword description: Primary group ID (GID) of the file. - name: group + level: extended type: keyword description: Primary group name of the file. - name: mode + level: extended type: keyword example: 0640 description: Mode of the file in octal representation. - name: size + level: extended type: long description: File size in bytes (field is only added when `type` is `file`). - name: mtime + level: extended type: date description: Last time file content was modified. - name: ctime + level: extended type: date description: Last time file metadata changed. - - name: geo - title: Geo + - name: group + title: Group group: 2 description: > - Geo fields can carry data about a specific location related to an event - or geo information for an IP field. + The group fields are meant to represent groups that are relevant to the + event. type: group fields: - - name: continent_name - type: keyword - description: > - Name of the continent. - - name: country_iso_code - type: keyword - description: > - Country ISO code. - - name: location - type: geo_point - description: > - Longitude and latitude. - - name: region_name + + - name: id + level: extended type: keyword description: > - Region name. - - name: city_name + Unique identifier for the group on the system/platform. + + - name: name + level: extended type: keyword description: > - City name. + Name of the group. - name: host title: Host group: 2 description: > - Host fields provide information related to a host. A host can be a - physical machine, a virtual machine, or a Docker container. - - Normally the host information is related to the machine on which the event - was generated/collected, but they can be used differently if needed. + A host is defined as a general computing instance. ECS host.* fields should be populated with details about the host on which the event happened, or on which the measurement was taken. Host types include hardware, virtual machines, Docker containers, and Kubernetes nodes. type: group fields: - - name: timezone.offset.sec - type: long + + - name: hostname + level: core + type: keyword description: > - Timezone offset of the host in seconds. + Hostname of the host. - Number of seconds relative to UTC. If the offset is -01:30 the - value will be -5400. - phase: 1 - example: -5400 + It normally contains what the `hostname` command returns on the host machine. - name: name + level: core type: keyword description: > - host.name is the hostname of the host. + Name of the host. It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use. - phase: 1 - name: id + level: core type: keyword - phase: 1 description: > Unique host id. @@ -624,16 +861,19 @@ Example: The current usage of `beat.name`. - name: ip + level: core type: ip description: > Host ip address. - name: mac + level: core type: keyword description: > Host mac address. - name: type + level: core type: keyword description: > Type of host. @@ -641,62 +881,171 @@ For Cloud providers this can be the machine type like `t2.medium`. If vm, this could be the container, for example, or other information meaningful in your environment. - phase: 1 - - # Operating System information - - name: os.platform - type: keyword - description: > - Operating system platform (centos, ubuntu, windows, etc.) - example: darwin - - - name: os.name - type: keyword - example: "Mac OS X" - description: > - Operating system name. - - - name: os.family - type: keyword - example: "debian" - description: > - OS family (redhat, debian, freebsd, windows, etc.) - - - name: os.version - type: keyword - example: "10.12.6" - description: > - Operating system version. - name: architecture + level: core type: keyword example: "x86_64" description: > Operating system architecture. - - - name: http - title: HTTP - group: 2 - description: > - Fields related to HTTP requests and responses. - type: group - fields: - - name: request.method - type: keyword - description: > - Http request method. - example: GET, POST, PUT - - name: response.status_code - type: long - description: > - Http response status code. - example: 404 - - name: response.body - type: text - description: > - The full http response body. - example: Hello world - - name: version + + - name: os + title: Operating System + group: 2 + description: > + The OS fields contain information about the operating system. + reusable: + top_level: false + expected: + - observer + - host + - user_agent + type: group + fields: + + - name: platform + level: extended + type: keyword + description: > + Operating system platform (such centos, ubuntu, windows). + example: darwin + + - name: name + level: extended + type: keyword + example: "Mac OS X" + description: > + Operating system name. + + - name: family + level: extended + type: keyword + example: "debian" + description: > + OS family (such as redhat, debian, freebsd, windows). + + - name: version + level: extended + type: keyword + example: "10.12.6-rc2" + description: > + Operating system version as a raw string. + + - name: kernel + level: extended + type: keyword + example: "4.4.0-112-generic" + description: > + Operating system kernel version as a raw string. + + - name: geo + title: Geo + group: 2 + description: > + Geo fields can carry data about a specific location related to an event + or geo information derived from an IP field. + type: group + fields: + + - name: location + level: core + type: geo_point + description: > + Longitude and latitude. + example: '{ "lon": -73.614830, "lat": 45.505918 }' + + - name: continent_name + level: core + type: keyword + description: > + Name of the continent. + example: North America + + - name: country_name + level: core + type: keyword + description: > + Country name. + example: Canada + + - name: region_name + level: core + type: keyword + description: > + Region name. + example: Quebec + + - name: city_name + level: core + type: keyword + description: > + City name. + example: Montreal + + - name: country_iso_code + level: core + type: keyword + description: > + Country ISO code. + example: CA + + - name: region_iso_code + level: core + type: keyword + description: > + Region ISO code. + example: CA-QC + + - name: name + level: extended + type: keyword + description: > + User-defined description of a location, at the level of granularity they care about. + + Could be the name of their data centers, the floor number, if this describes + a local physical entity, city names. + + Not typically used in automated geolocation. + example: boston-dc + + - name: http + title: HTTP + group: 2 + description: > + Fields related to HTTP activity. + type: group + fields: + + - name: request.method + level: extended + type: keyword + description: > + Http request method. + example: GET, POST, PUT + + - name: request.referrer + level: extended + type: keyword + description: > + Referrer for this HTTP request. + example: https://blog.example.com/ + + - name: response.status_code + level: extended + type: long + description: > + Http response status code. + example: 404 + + - name: response.body + level: extended + type: keyword + description: > + The full http response body. + example: Hello world + + - name: version + level: extended type: keyword description: > Http version. @@ -708,16 +1057,19 @@ Fields which are specific to log events. type: group fields: + - name: level + level: core type: keyword description: > Log level of the log event. Some examples are `WARN`, `ERR`, `INFO`. example: ERR + - name: original + level: core type: keyword - phase: 1 example: "Sep 19 08:26:10 localhost My log" index: false doc_values: false @@ -738,26 +1090,61 @@ title: Network group: 2 description: > - Fields related to network data. + The network is defined as the communication path over which a host or network event happens. The network.* fields should be populated with details about the network activity associated with an event. type: group fields: + - name: name - type: text + level: extended + type: keyword description: > Name given by operators to sections of their network. example: Guest Wifi - multi_fields: - - name: raw - type: keyword - description: > - Name given by operators to sections of their network. + + - name: type + level: core + type: keyword + description: > + In the OSI Model this would be the Network Layer. IPv4, IPv6, IPSec, PIM, etc + example: IPv4 + + - name: iana_number + level: extended + type: keyword + description: > + IANA Protocol Number (https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). + Standardized list of protocols. This aligns well with NetFlow and + sFlow related logs which use the IANA Protocol Number. + example: 6 + + - name: transport + level: core + type: keyword + description: > + Same as network.iana_number, but instead using the Keyword name of the + transport layer (UDP, TCP, IPv6-ICMP, etc.) + example: TCP + + - name: application + level: extended + type: keyword + description: > + A name given to an application. This can be arbitrarily assigned for + things like microservices, but also apply to things like skype, icq, + facebook, twitter. This would be used in situations where the vendor + or service can be decoded such as from the source/dest IP owners, + ports, or wire format. + example: AIM - name: protocol + level: core type: keyword description: > - Network protocol name. + L7 Network protocol name. ex. http, lumberjack, transport protocol example: http + - name: direction + level: core type: keyword description: > Direction of the network traffic. @@ -765,47 +1152,220 @@ Recommended values are: * inbound * outbound + * internal + * external * unknown + + When mapping events from a host-based monitoring context, populate this + field from the host's point of view. + + When mapping events from a network or perimeter-based monitoring context, + populate this field from the point of view of your network perimeter. example: inbound - name: forwarded_ip + level: core type: ip description: > Host IP address when the source IP address is the proxy. example: 192.1.1.2 + - name: community_id + level: extended + type: keyword + description: > + A hash of source and destination IPs and ports, as well as the protocol + used in a communication. This is a tool-agnostic standard to identify + flows. + + Learn more at https://github.com/corelight/community-id-spec. + example: '1:hO+sN4H+MG5MY/8hIrXPqc4ZQz0=' + # Metrics - - name: inbound.bytes + - name: bytes + level: core type: long description: > - Network inbound bytes. - example: 184 - - name: inbound.packets + Total bytes transferred in both directions. + + If `source.bytes` and `destination.bytes` are known, `network.bytes` is their sum. + example: 368 + + - name: packets + level: core type: long description: > - Network inbound packets. - example: 12 - - name: outbound.bytes - type: long + Total packets transferred in both directions. + + If `source.packets` and `destination.packets` are known, `network.packets` is their sum. + example: 24 + + - name: observer + title: Observer + group: 2 + description: > + An observer is defined as a special network, security, or application device used to detect, observe, or create network, security, or application-related events and metrics. This could be a custom hardware appliance or a server that has been configured to run special network, security, or application software. Examples include firewalls, intrusion detection/prevention systems, network monitoring sensors, web application firewalls, data loss prevention systems, and APM servers. The observer.* fields shall be populated with details of the system, if any, that detects, observes and/or creates a network, security, or application event or metric. Message queues and ETL components used in processing events or metrics are not considered observers in ECS. + type: group + fields: + - name: mac + level: core + type: keyword description: > - Network outbound bytes. - example: 184 - - name: outbound.packets - type: long + MAC address of the observer + - name: ip + level: core + type: ip description: > - Network outbound packets. - example: 12 - - name: total.bytes - type: long + IP address of the observer. + - name: hostname + level: core + type: keyword description: > - Network total bytes. The sum of inbound.bytes + outbound.bytes. - example: 368 - - name: total.packets - type: long + Hostname of the observer. + - name: vendor + level: core + type: keyword description: > - Network outbound packets. The sum of inbound.packets + outbound.packets - example: 24 + observer vendor information. + - name: version + level: core + type: keyword + description: > + Observer version. + - name: serial_number + level: extended + type: keyword + description: > + Observer serial number. + - name: type + level: core + type: keyword + description: > + The type of the observer the data is coming from. + There is no predefined list of observer types. Some examples are + `forwarder`, `firewall`, `ids`, `ips`, `proxy`, `poller`, `sensor`, `APM server`. + example: firewall + + - name: os + title: Operating System + group: 2 + description: > + The OS fields contain information about the operating system. + reusable: + top_level: false + expected: + - observer + - host + - user_agent + type: group + fields: + + - name: platform + level: extended + type: keyword + description: > + Operating system platform (such centos, ubuntu, windows). + example: darwin + + - name: name + level: extended + type: keyword + example: "Mac OS X" + description: > + Operating system name. + + - name: family + level: extended + type: keyword + example: "debian" + description: > + OS family (such as redhat, debian, freebsd, windows). + + - name: version + level: extended + type: keyword + example: "10.12.6-rc2" + description: > + Operating system version as a raw string. + + - name: kernel + level: extended + type: keyword + example: "4.4.0-112-generic" + description: > + Operating system kernel version as a raw string. + + - name: geo + title: Geo + group: 2 + description: > + Geo fields can carry data about a specific location related to an event + or geo information derived from an IP field. + type: group + fields: + + - name: location + level: core + type: geo_point + description: > + Longitude and latitude. + example: '{ "lon": -73.614830, "lat": 45.505918 }' + + - name: continent_name + level: core + type: keyword + description: > + Name of the continent. + example: North America + + - name: country_name + level: core + type: keyword + description: > + Country name. + example: Canada + + - name: region_name + level: core + type: keyword + description: > + Region name. + example: Quebec + + - name: city_name + level: core + type: keyword + description: > + City name. + example: Montreal + + - name: country_iso_code + level: core + type: keyword + description: > + Country ISO code. + example: CA + + - name: region_iso_code + level: core + type: keyword + description: > + Region ISO code. + example: CA-QC + + - name: name + level: extended + type: keyword + description: > + User-defined description of a location, at the level of granularity they care about. + + Could be the name of their data centers, the floor number, if this describes + a local physical entity, city names. + + Not typically used in automated geolocation. + example: boston-dc + - name: organization title: Organization group: 2 @@ -815,12 +1375,15 @@ organizations. type: group fields: + - name: name - type: text + level: extended + type: keyword description: > Organization name. - name: id + level: extended type: keyword description: > Unique identifier for the organization. @@ -829,30 +1392,45 @@ group: 2 description: > The OS fields contain information about the operating system. - These fields are often used inside other prefixes, such as `host.os.*` or `user_agent.os.*`. + reusable: + top_level: false + expected: + - observer + - host + - user_agent type: group fields: + - name: platform + level: extended type: keyword description: > Operating system platform (such centos, ubuntu, windows). example: darwin + - name: name + level: extended type: keyword example: "Mac OS X" description: > Operating system name. + - name: family + level: extended type: keyword example: "debian" description: > OS family (such as redhat, debian, freebsd, windows). + - name: version + level: extended type: keyword example: "10.12.6-rc2" description: > Operating system version as a raw string. + - name: kernel + level: extended type: keyword example: "4.4.0-112-generic" description: > @@ -866,40 +1444,214 @@ These fields can help you correlate metrics information with a process id/name from a log message. The `process.pid` often stays in the metric itself and is copied to the global field for correlation. + type: group + fields: + + - name: pid + level: core + type: long + description: > + Process id. + exmple: ssh + + - name: name + level: extended + type: keyword + description: > + Process name. + + Sometimes called program name or similar. + example: ssh + + - name: ppid + level: extended + type: long + description: > + Process parent id. + + - name: args + level: extended + type: keyword + description: > + Process arguments. + + May be filtered to protect sensitive information. + example: ["ssh", "-l", "user", "10.0.0.16"] + + - name: executable + level: extended + type: keyword + description: > + Absolute path to the process executable. + example: /usr/bin/ssh + + - name: title + level: extended + type: keyword + description: > + Process title. + + The proctitle, some times the same as process name. Can also be different: + for example a browser setting its title to the web page currently opened. + - name: thread.id + level: extended + type: long + example: 4242 + description: > + Thread ID. + + - name: start + level: extended + type: date + example: "2016-05-23T08:05:34.853Z" + description: > + The time the process started. + + - name: working_directory + level: extended + type: keyword + example: /home/alice + description: > + The working directory of the process. + + - name: related + title: Related + group: 2 + description: > + This field set is meant to facilitate pivoting around a piece of data. + Some pieces of information can be seen in many places in ECS. To facilitate + searching for them, append values to their corresponding field in + `related.`. + A concrete example is IP addresses, which can be under host, observer, source, destination, client, server, and network.forwarded_ip. If you append all IPs to `related.ip`, you can then search for a given IP trivially, no matter where it appeared, by querying `related.ip:a.b.c.d`. + type: group + fields: + + - name: ip + level: extended + type: ip + description: > + All of the IPs seen on your event. + + - name: server + title: Server + group: 2 + description: > + A Server is defined as the responder in a network connection for events regarding sessions, connections, or bidirectional flow records. For TCP events, the server is the receiver of the initial SYN packet(s) of the TCP connection. For other protocols, the server is generally the responder in the network transaction. Some systems actually use the term "responder" to refer the server in TCP connections. The server fields describe details about the system acting as the server in the network event. Server fields are usually populated in conjunction with client fields. Server fields are generally not populated for packet-level events. type: group fields: - - name: args - type: keyword - description: > - Process arguments. - May be filtered to protect sensitive information. - example: ["-l", "user", "10.0.0.16"] - - name: name - type: keyword + - name: ip + level: core + type: ip description: > - Process name. + IP address of the server. - Sometimes called program name or similar. - example: ssh - - name: pid + Can be one or multiple IPv4 or IPv6 addresses. + + - name: port + level: core type: long description: > - Process id. - exmple: ssh - - name: ppid - type: long + Port of the server. + + - name: mac + level: core + type: keyword description: > - Process parent id. + MAC address of the server. - - name: title + - name: domain + level: core type: keyword description: > - Process title. + Server domain. - The proctitle, often the same as process name. + # Metrics + - name: bytes + level: core + type: long + example: 184 + description: > + Bytes sent from the server to the client. + - name: packets + level: core + type: long + example: 12 + description: > + Packets sent from the server to the client. + + - name: geo + title: Geo + group: 2 + description: > + Geo fields can carry data about a specific location related to an event + or geo information derived from an IP field. + type: group + fields: + + - name: location + level: core + type: geo_point + description: > + Longitude and latitude. + example: '{ "lon": -73.614830, "lat": 45.505918 }' + + - name: continent_name + level: core + type: keyword + description: > + Name of the continent. + example: North America + + - name: country_name + level: core + type: keyword + description: > + Country name. + example: Canada + + - name: region_name + level: core + type: keyword + description: > + Region name. + example: Quebec + + - name: city_name + level: core + type: keyword + description: > + City name. + example: Montreal + + - name: country_iso_code + level: core + type: keyword + description: > + Country ISO code. + example: CA + + - name: region_iso_code + level: core + type: keyword + description: > + Region ISO code. + example: CA-QC + + - name: name + level: extended + type: keyword + description: > + User-defined description of a location, at the level of granularity they care about. + + Could be the name of their data centers, the floor number, if this describes + a local physical entity, city names. + + Not typically used in automated geolocation. + example: boston-dc + - name: service title: Service group: 2 @@ -907,10 +1659,11 @@ The service fields describe the service for or from which the data was collected. These fields help you find and correlate logs for a specific service and version. - type: group fields: + - name: id + level: core type: keyword description: > Unique identifier of the running service. @@ -922,158 +1675,249 @@ can filter on that id to see metrics and logs for that single instance. example: d37e5ebfe0ae6c4972dbe9f0174a1637bb8247f6 - phase: 1 - name: name + level: core type: keyword - phase: 1 - example: "elasticsearch" + example: "elasticsearch-metrics" description: > Name of the service data is collected from. - The name can be used to group and correlate logs and metrics from one - service. + The name of the service is normally user given. This allows if two + instances of the same service are running on the same machine + they can be differentiated by the `service.name`. - Example: If logs or metrics are collected from Redis, `service.name` would be - `redis`. + Also it allows for distributed services that run on multiple hosts to + correlate the related instances based on the name. + + In the case of Elasticsearch the service.name could contain the cluster + name. For Beats the service.name is by default a copy of the `service.type` + field if no name is specified. - name: type + level: core type: keyword - phase: 1 + example: "elasticsearch" description: > - Service type. + The type of the service data is collected from. + + The type can be used to group and correlate logs and metrics from one + service type. + + Example: If logs or metrics are collected from Elasticsearch, `service.type` would be + `elasticsearch`. - name: state + level: core type: keyword - phase: 1 description: > Current state of the service. + - name: version + level: core type: keyword - phase: 1 example: "3.2.4" description: > Version of the service the data was collected from. This allows to look at a data set only for a specific version of a service. + - name: ephemeral_id + level: extended type: keyword description: > Ephemeral identifier of this service (if one exists). This id normally changes across restarts, but `service.id` does not. example: 8a4f500f - + - name: source title: Source + group: 2 description: > - Source fields describe details about the source of the event. - + Source fields describe details about the source of a + packet/event. Source fields are usually populated in conjunction with destination fields. type: group fields: - - name: ip - level: core - type: ip - description: > - IP address of the source. + + - name: ip + level: core + type: ip + description: > + IP address of the source. + + Can be one or multiple IPv4 or IPv6 addresses. + + - name: port + level: core + type: long + description: > + Port of the source. + + - name: mac + level: core + type: keyword + description: > + MAC address of the source. + + - name: domain + level: core + type: keyword + description: > + Source domain. + + # Metrics + - name: bytes + level: core + type: long + example: 184 + description: > + Bytes sent from the source to the destination. + + - name: packets + level: core + type: long + example: 12 + description: > + Packets sent from the source to the destination. - Can be one or multiple IPv4 or IPv6 addresses. + - name: geo + title: Geo + group: 2 + description: > + Geo fields can carry data about a specific location related to an event + or geo information derived from an IP field. + type: group + fields: - - name: port - level: core - type: long - description: > - Port of the source. + - name: location + level: core + type: geo_point + description: > + Longitude and latitude. + example: '{ "lon": -73.614830, "lat": 45.505918 }' - - name: mac - level: core - type: keyword - description: > - MAC address of the source. + - name: continent_name + level: core + type: keyword + description: > + Name of the continent. + example: North America - - name: domain - level: core - type: keyword - description: > - Source domain. + - name: country_name + level: core + type: keyword + description: > + Country name. + example: Canada - - name: geo - type: group - description: - Geolocation for source. - fields: - - name: continent_name - type: keyword - description: > - Name of the continent. + - name: region_name + level: core + type: keyword + description: > + Region name. + example: Quebec - - name: country_iso_code - type: keyword - description: > - Country ISO code. + - name: city_name + level: core + type: keyword + description: > + City name. + example: Montreal - - name: location - type: geo_point - description: > - Longitude and latitude. + - name: country_iso_code + level: core + type: keyword + description: > + Country ISO code. + example: CA - - name: region_name - type: keyword - description: > - Region name. + - name: region_iso_code + level: core + type: keyword + description: > + Region ISO code. + example: CA-QC - - name: city_name - type: keyword - description: > - City name. + - name: name + level: extended + type: keyword + description: > + User-defined description of a location, at the level of granularity they care about. + + Could be the name of their data centers, the floor number, if this describes + a local physical entity, city names. + + Not typically used in automated geolocation. + example: boston-dc - - name: region_iso_code - type: keyword - description: > - Region ISO code. - name: url title: URL description: > - URL fields provide a complete URL, with scheme, host, and path. The URL - object can be reused in other prefixes, such as `host.url.*` for - example. Keep the structure consistent whenever you use URL fields. - + URL fields provide a complete URL, with scheme, host, and path. type: group fields: + + - name: original + level: extended + type: keyword + description: > + Unmodified original url as seen in the event source. + + Note that in network monitoring, the observed URL may be a full URL, + whereas in access logs, the URL is often just represented as a path. + + This field is meant to represent the URL as it was observed, complete + or not. + example: > + https://www.elastic.co:443/search?q=elasticsearch#top or /search?q=elasticsearch + + - name: full + level: extended + type: keyword + description: > + If full URLs are important to your use case, they should be stored in + `url.full`, whether this field is reconstructed or present in the + event source. + example: https://www.elastic.co:443/search?q=elasticsearch#top + - name: scheme + level: extended type: keyword description: > Scheme of the request, such as "https". Note: The `:` is not part of the scheme. example: https - - name: hostname + + - name: domain + level: extended type: keyword description: > - Hostname of the request, such as "elastic.co". - + Domain of the request, such as "www.elastic.co". + In some cases a URL may refer to an IP and/or port directly, without a - domain name. In this case, the IP address would go to the `hostname` field. - example: elastic.co + domain name. In this case, the IP address would go to the `domain` field. + example: www.elastic.co + - name: port + level: extended type: integer description: > Port of the request, such as 443. example: 443 + - name: path - type: text + level: extended + type: keyword description: > Path of the request, such as "/search". - multi_fields: - - name: raw - type: keyword - description: > - URL path. A non-analyzed field that is useful - for aggregations. + - name: query - type: text + level: extended + type: keyword description: > The query field describes the query string of the request, such as "q=elasticsearch". @@ -1082,23 +1926,23 @@ no `?`, there is no query field. If there is a `?` but no query, the query field exists with an empty string. The `exists` query can be used to differentiate between the two cases. - multi_fields: - - name: raw - type: keyword - description: > - URL query part. A non-analyzed field that is useful - for aggregations. + - name: fragment + level: extended type: keyword description: > Portion of the url after the `#`, such as "top". The `#` is not part of the fragment. + - name: username + level: extended type: keyword description: > Username of the request. + - name: password + level: extended type: keyword description: > Password of the request. @@ -1111,32 +1955,59 @@ to the event. Fields can have one entry or multiple entries. If a user has more than one id, provide an array that includes all of them. + reusable: + top_level: true + expected: + - client + - destination + - host + - server + - source type: group fields: + - name: id + level: core type: keyword description: > One or multiple unique identifiers of the user. + - name: name + level: core + type: keyword + example: albert + description: > + Short name or login of the user. + + - name: full_name + level: extended type: keyword + example: Albert Einstein description: > - Name of the user. + User's full name, if available. - The field is a keyword, and will not be tokenized. - name: email + level: extended type: keyword - phase: 1 description: > User email address. + - name: hash + level: extended type: keyword - phase: 1 description: > Unique user hash to correlate information for a user in anonymized form. Useful if `user.id` or `user.name` contain confidential information and cannot be used. + - name: group + level: extended + type: keyword + description: > + Group the user is a part of. This field can contain a list of groups, if + necessary. + - name: user_agent title: User agent group: 2 @@ -1145,54 +2016,86 @@ show up in web service logs coming from the parsed user agent string. type: group fields: + - name: original - type: text - description: > - Unparsed version of the user_agent. - - name: device - type: keyword - description: > - Name of the physical device. - - name: version - type: keyword - description: > - Version of the physical device. - - name: major - type: long - description: > - Major version of the user agent. - - name: minor - type: long - description: > - Minor version of the user agent. - - name: patch + level: extended type: keyword + index: false description: > - Patch version of the user agent. + Unparsed version of the user_agent. + example: "Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1" + - name: name + level: extended type: keyword - example: Chrome + example: Safari description: > Name of the user agent. - - name: os.name + - name: version + level: extended type: keyword description: > - Name of the operating system. - - name: os.version + Version of the user agent. + example: 12.0 + + - name: device.name + level: extended type: keyword + example: iPhone description: > - Version of the operating system. - - name: os.major - type: long - description: > - Major version of the operating system. - - name: os.minor - type: long - description: > - Minor version of the operating system. + Name of the device. + + - name: os + title: Operating System + group: 2 + description: > + The OS fields contain information about the operating system. + reusable: + top_level: false + expected: + - observer + - host + - user_agent + type: group + fields: + + - name: platform + level: extended + type: keyword + description: > + Operating system platform (such centos, ubuntu, windows). + example: darwin + + - name: name + level: extended + type: keyword + example: "Mac OS X" + description: > + Operating system name. + + - name: family + level: extended + type: keyword + example: "debian" + description: > + OS family (such as redhat, debian, freebsd, windows). - # Temporary fix to get 7.0 dashboards working. - # This must go in the ecs.yml as otherwise tests don't work. + - name: version + level: extended + type: keyword + example: "10.12.6-rc2" + description: > + Operating system version as a raw string. + + - name: kernel + level: extended + type: keyword + example: "4.4.0-112-generic" + description: > + Operating system kernel version as a raw string. + + # Temporary fix to get 7.0 dashboards working. + # This must go in the ecs.yml as otherwise tests don't work. - name: beat.name type: alias path: agent.type @@ -1201,3 +2104,43 @@ type: alias path: agent.hostname + # This is not in ECS. + # TODO: https://github.com/elastic/ecs/issues/178 + - name: agent.hostname + type: keyword + description: > + Hostname of the agent. + + # Several user_agent fields were removed from ECS. + # TODO: Update filebeat/iis/access accordingly. + - name: user_agent.patch + type: keyword + description: > + Patch version of the user agent. + - name: user_agent.minor + type: keyword + description: > + Minor version of the user agent. + - name: user_agent.major + type: keyword + description: > + Major version of the user agent. + - name: user_agent.device + type: keyword + description: > + Name of the physical device. + - name: user_agent.os.major + type: long + description: > + Major version of the operating system. + - name: user_agent.os.minor + type: long + description: > + Minor version of the operating system. + + # url.hostname was removed from ECS. + # TODO: Update Suricata module to use url.domain. + - name: url.hostname + type: keyword + description: > + Hostname of the request, such as "elastic.co". diff --git a/_beats/libbeat/processors/add_host_metadata/_meta/fields.yml b/_beats/libbeat/processors/add_host_metadata/_meta/fields.yml index a99a133fbb2..6cffd2ed718 100644 --- a/_beats/libbeat/processors/add_host_metadata/_meta/fields.yml +++ b/_beats/libbeat/processors/add_host_metadata/_meta/fields.yml @@ -3,11 +3,4 @@ description: > Info collected for the host machine. anchor: host-processor - fields: - - name: host - type: group - fields: - - name: os.kernel - type: keyword - description: > - The operating system's kernel version. + fields: {} diff --git a/_beats/libbeat/scripts/generate_fields_docs.py b/_beats/libbeat/scripts/generate_fields_docs.py index cf7841acb7a..bdcff718fd4 100644 --- a/_beats/libbeat/scripts/generate_fields_docs.py +++ b/_beats/libbeat/scripts/generate_fields_docs.py @@ -68,8 +68,8 @@ def document_field(output, field, field_path): if not field["index"]: output.write("{}\n\n".format("Field is not indexed.")) - if "enable" in field: - if not field["enable"]: + if "enabled" in field: + if not field["enabled"]: output.write("{}\n\n".format("Object is not enabled.")) if "multi_fields" in field: diff --git a/changelogs/head.asciidoc b/changelogs/head.asciidoc index 3bab859263f..795b8089e15 100644 --- a/changelogs/head.asciidoc +++ b/changelogs/head.asciidoc @@ -13,6 +13,7 @@ https://github.com/elastic/apm-server/compare/6.5\...master[View commits] - Use _doc as document type for Elasticsearch >= 7.0.0 https://github.com/elastic/beats/pull/9056[beats/9057]. - Automatically cap signed integers to 63bits https://github.com/elastic/beats/pull/8991[beats/8991]. - Add optional `span.subtype` and `span.action` properties. {pull}1618[1618]. +- Build default distribution under the Elastic License. {pull}1645[1645]. [float] ==== Bug fixes diff --git a/docs/fields.asciidoc b/docs/fields.asciidoc index 75d4eac8fd2..02a286435fe 100644 --- a/docs/fields.asciidoc +++ b/docs/fields.asciidoc @@ -1135,7 +1135,7 @@ ECS fields. [float] == agent fields -The agent fields contain the data about the agent/client/shipper that created the event. +The agent fields contain the data about the software entity, if any, that collects, detects, or observes events on a host, or takes measurements on a host. Examples include Beats. Agents may also run on observers. ECS agent.* fields shall be populated with details of the agent running on the host or observer where the event happened or the measurement was taken. @@ -1151,24 +1151,29 @@ Version of the agent. -- -*`agent.type`*:: +*`agent.name`*:: + -- type: keyword -example: filebeat +example: foo Name of the agent. +This is a name that can be given to an agent. This can be helpful if for example two Filebeat instances are running on the same host but a human readable separation is needed on which Filebeat instance data is coming from. +If no name is given, the name is often left empty. -- -*`agent.hostname`*:: +*`agent.type`*:: + -- type: keyword -Hostname of the agent. +example: filebeat + +Type of the agent. +The agent type stays always the same and should be given by the agent used. In case of Filebeat the agent would always be Filebeat also if two Filebeat instances are run on the same machine. -- @@ -1239,7 +1244,7 @@ List of keywords used to tag each event. -- type: object -example: {'key2': 'value2', 'key1': 'value1'} +example: {'application': 'foo-bar', 'env': 'production'} Key/value pairs. Can be used to add meta information to events. Should not contain nested objects. All values are stored as keyword. @@ -1259,6 +1264,183 @@ For log events the message field contains the log message. In other use cases the message field can be used to concatenate different values which are then freely searchable. If multiple messages exist, they can be combined into one message. +-- + +[float] +== client fields + +A client is defined as the initiator of a network connection for events regarding sessions, connections, or bidirectional flow records. For TCP events, the client is the initiator of the TCP connection that sends the SYN packet(s). For other protocols, the client is generally the initiator or requestor in the network transaction. Some systems use the term "originator" to refer the client in TCP connections. The client fields describe details about the system acting as the client in the network event. Client fields are usually populated in conjuction with server fields. Client fields are generally not populated for packet-level events. + + + +*`client.ip`*:: ++ +-- +type: ip + +IP address of the client. +Can be one or multiple IPv4 or IPv6 addresses. + + +-- + +*`client.port`*:: ++ +-- +type: long + +Port of the client. + + +-- + +*`client.mac`*:: ++ +-- +type: keyword + +MAC address of the client. + + +-- + +*`client.domain`*:: ++ +-- +type: keyword + +Client domain. + + +-- + +*`client.bytes`*:: ++ +-- +type: long + +example: 184 + +Bytes sent from the client to the server. + + +-- + +*`client.packets`*:: ++ +-- +type: long + +example: 12 + +Packets sent from the client to the server. + + +-- + +[float] +== geo fields + +Geo fields can carry data about a specific location related to an event or geo information derived from an IP field. + + + +*`client.geo.location`*:: ++ +-- +type: geo_point + +example: { "lon": -73.614830, "lat": 45.505918 } + +Longitude and latitude. + + +-- + +*`client.geo.continent_name`*:: ++ +-- +type: keyword + +example: North America + +Name of the continent. + + +-- + +*`client.geo.country_name`*:: ++ +-- +type: keyword + +example: Canada + +Country name. + + +-- + +*`client.geo.region_name`*:: ++ +-- +type: keyword + +example: Quebec + +Region name. + + +-- + +*`client.geo.city_name`*:: ++ +-- +type: keyword + +example: Montreal + +City name. + + +-- + +*`client.geo.country_iso_code`*:: ++ +-- +type: keyword + +example: CA + +Country ISO code. + + +-- + +*`client.geo.region_iso_code`*:: ++ +-- +type: keyword + +example: CA-QC + +Region ISO code. + + +-- + +*`client.geo.name`*:: ++ +-- +type: keyword + +example: boston-dc + +User-defined description of a location, at the level of granularity they care about. +Could be the name of their data centers, the floor number, if this describes a local physical entity, city names. +Not typically used in automated geolocation. + + -- [float] @@ -1423,7 +1605,7 @@ Image labels. [float] == destination fields -Destination fields describe details about the destination of a packet/event. +Destination fields describe details about the destination of a packet/event. Destination fields are usually populated in conjunction with source fields. @@ -1468,161 +1650,154 @@ Destination domain. -- -[float] -== geo fields - -Geolocation for destination. - - -*`destination.geo.continent_name`*:: +*`destination.bytes`*:: + -- -type: keyword +type: long -Name of the continent. +example: 184 + +Bytes sent from the destination to the source. -- -*`destination.geo.country_iso_code`*:: +*`destination.packets`*:: + -- -type: keyword +type: long -Country ISO code. +example: 12 + +Packets sent from the destination to the source. -- +[float] +== geo fields + +Geo fields can carry data about a specific location related to an event or geo information derived from an IP field. + + + *`destination.geo.location`*:: + -- type: geo_point +example: { "lon": -73.614830, "lat": 45.505918 } + Longitude and latitude. -- -*`destination.geo.region_name`*:: +*`destination.geo.continent_name`*:: + -- type: keyword -Region name. +example: North America + +Name of the continent. -- -*`destination.geo.city_name`*:: +*`destination.geo.country_name`*:: + -- type: keyword -City name. +example: Canada + +Country name. -- -*`destination.geo.region_iso_code`*:: +*`destination.geo.region_name`*:: + -- type: keyword -Region ISO code. - - --- - -[float] -== device fields +example: Quebec -Device fields are used to provide additional information about the device that is the source of the information. This could be a firewall, network device, etc. +Region name. +-- -*`device.mac`*:: +*`destination.geo.city_name`*:: + -- type: keyword -MAC address of the device +example: Montreal - --- - -*`device.ip`*:: -+ --- -type: ip - -IP address of the device. +City name. -- -*`device.hostname`*:: +*`destination.geo.country_iso_code`*:: + -- type: keyword -Hostname of the device. - - --- - -*`device.vendor`*:: -+ --- -type: text +example: CA -Device vendor information. +Country ISO code. -- -*`device.version`*:: +*`destination.geo.region_iso_code`*:: + -- type: keyword -Device version. +example: CA-QC + +Region ISO code. -- -*`device.serial_number`*:: +*`destination.geo.name`*:: + -- type: keyword -Device serial number. +example: boston-dc +User-defined description of a location, at the level of granularity they care about. +Could be the name of their data centers, the floor number, if this describes a local physical entity, city names. +Not typically used in automated geolocation. --- -*`device.timezone.offset.sec`*:: -+ -- -type: long -example: -5400 +[float] +== ecs fields -Timezone offset of the host in seconds. -Number of seconds relative to UTC. If the offset is -01:30 the value will be -5400. +Meta-information specific to ECS. --- -*`device.type`*:: +*`ecs.version`*:: + -- type: keyword -example: firewall +example: 1.0.0-beta1 + +required: True -The type of the device the data is coming from. -There is no predefined list of device types. Some examples are `endpoint`, `firewall`, `ids`, `ips`, `proxy`. +ECS version this event conforms to. `ecs.version` is a required field and must exist in all events. +When querying across multiple indices -- which may conform to slightly different ECS versions -- this field lets integrations adjust to the schema version of the events. +The current version is 1.0.0-beta1 . -- @@ -1652,12 +1827,22 @@ type: text Error message. +-- + +*`error.code`*:: ++ +-- +type: keyword + +Error code describing the error. + + -- [float] == event fields -The event fields are used for context information about the data itself. +The event fields are used for context information about the log or metric event itself. A log is defined as an event containing details of something that happened. Log events must include the time at which the thing happened. Examples of log events include a process starting on a host, a network packet being sent from a source to a destination, or a network connection between a client and a server being initiated or closed. A metric is defined as an event containing one or more numerical or categorical measurements and the time at which the measurement was taken. Examples of metric events include memory pressure measured on a host, or vulnerabilities measured on a scanned host. @@ -1671,6 +1856,19 @@ example: 8a4f500d Unique ID to describe the event. +-- + +*`event.kind`*:: ++ +-- +type: keyword + +example: state + +The kind of the event. +This gives information about what type of information the event contains, without being specific to the contents of the event. Examples are `event`, `state`, `alarm`. Warning: In future versions of ECS, we plan to provide a list of acceptable values for this field, please use with caution. + + -- *`event.category`*:: @@ -1678,36 +1876,47 @@ Unique ID to describe the event. -- type: keyword -example: metrics +example: user-management Event category. -This can be a user defined category. +This contains high-level information about the contents of the event. It is more generic than `event.action`, in the sense that typically a category contains multiple actions. Warning: In future versions of ECS, we plan to provide a list of acceptable values for this field, please use with caution. -- -*`event.type`*:: +*`event.action`*:: + -- type: keyword -example: nginx-stats-metrics +example: user-password-change -A type given to this kind of event which can be used for grouping. -This is normally defined by the user. +The action captured by the event. +This describes the information in the event. It is more specific than `event.category`. Examples are `group-add`, `process-started`, `file-created`. The value is normally defined by the implementer. -- -*`event.action`*:: +*`event.outcome`*:: + -- type: keyword -example: reject +example: success -The action captured by the event. The type of action will vary from system to system but is likely to include actions by security services, such as blocking or quarantining; as well as more generic actions such as login events, file i/o or proxy forwarding events. -The value is normally defined by the user. +The outcome of the event. +If the event describes an action, this fields contains the outcome of that action. Examples outcomes are `success` and `failure`. Warning: In future versions of ECS, we plan to provide a list of acceptable values for this field, please use with caution. + + +-- + +*`event.type`*:: ++ +-- +type: keyword + +Reserved for future usage. +Please avoid using this field for user data. -- @@ -1777,29 +1986,24 @@ Hash (perhaps logstash fingerprint) of raw field to be able to demonstrate log i -- -*`event.version`*:: +*`event.duration`*:: + -- -type: keyword - -example: 0.1.0 - -required: True +type: long -The version field contains the version an event for ECS adheres to. -This field should be provided as part of each event to make it possible to detect to which ECS version an event belongs. -event.version is a required field and must exist in all events. It describes which ECS version the event adheres to. -The current version is 0.1.0. +Duration of the event in nanoseconds. +If event.start and event.end are known this value should be the difference between the end and start time. -- -*`event.duration`*:: +*`event.timezone`*:: + -- -type: long +type: keyword -Duration of the event in nanoseconds. +This field should be populated when the event's timestamp does not include timezone information already (e.g. default Syslog timestamps). It's optional otherwise. +Acceptable timezone formats are: a canonical ID (e.g. "Europe/Amsterdam"), abbreviated (e.g. "EST") or an HH:mm differential (e.g. "-05:00"). -- @@ -1814,6 +2018,26 @@ This timestamp is distinct from @timestamp in that @timestamp contains the proce In case the two timestamps are identical, @timestamp should be used. +-- + +*`event.start`*:: ++ +-- +type: date + +event.start contains the date when the event started or when the activity was first observed. + + +-- + +*`event.end`*:: ++ +-- +type: date + +event.end contains the date when the event ended or when the activity was last observed. + + -- *`event.risk_score`*:: @@ -1840,45 +2064,25 @@ This is mainly useful if you use more than one system that assigns risk scores, [float] == file fields -File fields provide details about each file. +A file is defined as a set of information that has been created on, or has existed on a filesystem. File objects can be associated with host events, network events, and/or file events (e.g., those produced by File Integrity Monitoring [FIM] products or services). File fields provide details about the affected file associated with the event or metric. *`file.path`*:: + -- -type: text - -Path to the file. - -*`file.path.raw`*:: -+ --- type: keyword -Path to the file. This is a non-analyzed field that is useful for aggregations. - - --- +Path to the file. -- *`file.target_path`*:: + -- -type: text - -Target path for symlinks. - -*`file.target_path.raw`*:: -+ --- type: keyword -Path to the file. This is a non-analyzed field that is useful for aggregations. - - --- +Target path for symlinks. -- @@ -1998,193 +2202,284 @@ Last time file metadata changed. -- [float] -== geo fields +== group fields -Geo fields can carry data about a specific location related to an event or geo information for an IP field. +The group fields are meant to represent groups that are relevant to the event. -*`geo.continent_name`*:: +*`group.id`*:: + -- type: keyword -Name of the continent. +Unique identifier for the group on the system/platform. -- -*`geo.country_iso_code`*:: +*`group.name`*:: + -- type: keyword -Country ISO code. +Name of the group. -- -*`geo.location`*:: +[float] +== host fields + +A host is defined as a general computing instance. ECS host.* fields should be populated with details about the host on which the event happened, or on which the measurement was taken. Host types include hardware, virtual machines, Docker containers, and Kubernetes nodes. + + + +*`host.hostname`*:: + -- -type: geo_point +type: keyword -Longitude and latitude. +Hostname of the host. +It normally contains what the `hostname` command returns on the host machine. -- -*`geo.region_name`*:: +*`host.name`*:: + -- type: keyword -Region name. +Name of the host. +It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use. -- -*`geo.city_name`*:: +*`host.id`*:: + -- type: keyword -City name. +Unique host id. +As hostname is not always unique, use values that are meaningful in your environment. +Example: The current usage of `beat.name`. + + +-- + +*`host.ip`*:: ++ +-- +type: ip + +Host ip address. + + +-- + +*`host.mac`*:: ++ +-- +type: keyword + +Host mac address. + + +-- + +*`host.type`*:: ++ +-- +type: keyword + +Type of host. +For Cloud providers this can be the machine type like `t2.medium`. If vm, this could be the container, for example, or other information meaningful in your environment. + + +-- + +*`host.architecture`*:: ++ +-- +type: keyword + +example: x86_64 + +Operating system architecture. -- [float] -== host fields +== os fields -Host fields provide information related to a host. A host can be a physical machine, a virtual machine, or a Docker container. -Normally the host information is related to the machine on which the event was generated/collected, but they can be used differently if needed. +The OS fields contain information about the operating system. -*`host.timezone.offset.sec`*:: +*`host.os.platform`*:: + -- -type: long +type: keyword -example: -5400 +example: darwin -Timezone offset of the host in seconds. -Number of seconds relative to UTC. If the offset is -01:30 the value will be -5400. +Operating system platform (such centos, ubuntu, windows). -- -*`host.name`*:: +*`host.os.name`*:: + -- type: keyword -host.name is the hostname of the host. -It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use. +example: Mac OS X + +Operating system name. -- -*`host.id`*:: +*`host.os.family`*:: + -- type: keyword -Unique host id. -As hostname is not always unique, use values that are meaningful in your environment. -Example: The current usage of `beat.name`. +example: debian + +OS family (such as redhat, debian, freebsd, windows). -- -*`host.ip`*:: +*`host.os.version`*:: + -- -type: ip +type: keyword -Host ip address. +example: 10.12.6-rc2 + +Operating system version as a raw string. -- -*`host.mac`*:: +*`host.os.kernel`*:: + -- type: keyword -Host mac address. +example: 4.4.0-112-generic + +Operating system kernel version as a raw string. -- -*`host.type`*:: +[float] +== geo fields + +Geo fields can carry data about a specific location related to an event or geo information derived from an IP field. + + + +*`host.geo.location`*:: ++ +-- +type: geo_point + +example: { "lon": -73.614830, "lat": 45.505918 } + +Longitude and latitude. + + +-- + +*`host.geo.continent_name`*:: + -- type: keyword -Type of host. -For Cloud providers this can be the machine type like `t2.medium`. If vm, this could be the container, for example, or other information meaningful in your environment. +example: North America + +Name of the continent. -- -*`host.os.platform`*:: +*`host.geo.country_name`*:: + -- type: keyword -example: darwin +example: Canada -Operating system platform (centos, ubuntu, windows, etc.) +Country name. -- -*`host.os.name`*:: +*`host.geo.region_name`*:: + -- type: keyword -example: Mac OS X +example: Quebec -Operating system name. +Region name. -- -*`host.os.family`*:: +*`host.geo.city_name`*:: + -- type: keyword -example: debian +example: Montreal -OS family (redhat, debian, freebsd, windows, etc.) +City name. -- -*`host.os.version`*:: +*`host.geo.country_iso_code`*:: + -- type: keyword -example: 10.12.6 +example: CA -Operating system version. +Country ISO code. -- -*`host.architecture`*:: +*`host.geo.region_iso_code`*:: + -- type: keyword -example: x86_64 +example: CA-QC -Operating system architecture. +Region ISO code. + + +-- + +*`host.geo.name`*:: ++ +-- +type: keyword + +example: boston-dc + +User-defined description of a location, at the level of granularity they care about. +Could be the name of their data centers, the floor number, if this describes a local physical entity, city names. +Not typically used in automated geolocation. -- @@ -2192,7 +2487,7 @@ Operating system architecture. [float] == http fields -Fields related to HTTP requests and responses. +Fields related to HTTP activity. @@ -2206,6 +2501,18 @@ example: GET, POST, PUT Http request method. +-- + +*`http.request.referrer`*:: ++ +-- +type: keyword + +example: https://blog.example.com/ + +Referrer for this HTTP request. + + -- *`http.response.status_code`*:: @@ -2223,7 +2530,7 @@ Http response status code. *`http.response.body`*:: + -- -type: text +type: keyword example: Hello world @@ -2284,179 +2591,441 @@ Field is not indexed. [float] == network fields -Fields related to network data. +The network is defined as the communication path over which a host or network event happens. The network.* fields should be populated with details about the network activity associated with an event. *`network.name`*:: + -- -type: text +type: keyword example: Guest Wifi Name given by operators to sections of their network. -*`network.name.raw`*:: +-- + +*`network.type`*:: + -- type: keyword -Name given by operators to sections of their network. +example: IPv4 +In the OSI Model this would be the Network Layer. IPv4, IPv6, IPSec, PIM, etc --- -- -*`network.protocol`*:: +*`network.iana_number`*:: + -- type: keyword -example: http +example: 6 -Network protocol name. +IANA Protocol Number (https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). Standardized list of protocols. This aligns well with NetFlow and sFlow related logs which use the IANA Protocol Number. -- -*`network.direction`*:: +*`network.transport`*:: + -- type: keyword -example: inbound +example: TCP -Direction of the network traffic. -Recommended values are: - * inbound - * outbound - * unknown +Same as network.iana_number, but instead using the Keyword name of the transport layer (UDP, TCP, IPv6-ICMP, etc.) -- -*`network.forwarded_ip`*:: +*`network.application`*:: + -- -type: ip +type: keyword -example: 192.1.1.2 +example: AIM -Host IP address when the source IP address is the proxy. +A name given to an application. This can be arbitrarily assigned for things like microservices, but also apply to things like skype, icq, facebook, twitter. This would be used in situations where the vendor or service can be decoded such as from the source/dest IP owners, ports, or wire format. -- -*`network.inbound.bytes`*:: +*`network.protocol`*:: + -- -type: long +type: keyword -example: 184 +example: http -Network inbound bytes. +L7 Network protocol name. ex. http, lumberjack, transport protocol -- -*`network.inbound.packets`*:: +*`network.direction`*:: + -- -type: long +type: keyword -example: 12 +example: inbound -Network inbound packets. +Direction of the network traffic. +Recommended values are: + * inbound + * outbound + * internal + * external + * unknown + +When mapping events from a host-based monitoring context, populate this field from the host's point of view. +When mapping events from a network or perimeter-based monitoring context, populate this field from the point of view of your network perimeter. -- -*`network.outbound.bytes`*:: +*`network.forwarded_ip`*:: + -- -type: long +type: ip -example: 184 +example: 192.1.1.2 -Network outbound bytes. +Host IP address when the source IP address is the proxy. -- -*`network.outbound.packets`*:: +*`network.community_id`*:: + -- -type: long +type: keyword -example: 12 +example: 1:hO+sN4H+MG5MY/8hIrXPqc4ZQz0= -Network outbound packets. +A hash of source and destination IPs and ports, as well as the protocol used in a communication. This is a tool-agnostic standard to identify flows. +Learn more at https://github.com/corelight/community-id-spec. -- -*`network.total.bytes`*:: +*`network.bytes`*:: + -- type: long example: 368 -Network total bytes. The sum of inbound.bytes + outbound.bytes. +Total bytes transferred in both directions. +If `source.bytes` and `destination.bytes` are known, `network.bytes` is their sum. -- -*`network.total.packets`*:: +*`network.packets`*:: + -- type: long example: 24 -Network outbound packets. The sum of inbound.packets + outbound.packets +Total packets transferred in both directions. +If `source.packets` and `destination.packets` are known, `network.packets` is their sum. -- [float] -== organization fields +== observer fields -The organization fields enrich data with information about the company or entity the data is associated with. These fields help you arrange or filter data stored in an index by one or multiple organizations. +An observer is defined as a special network, security, or application device used to detect, observe, or create network, security, or application-related events and metrics. This could be a custom hardware appliance or a server that has been configured to run special network, security, or application software. Examples include firewalls, intrusion detection/prevention systems, network monitoring sensors, web application firewalls, data loss prevention systems, and APM servers. The observer.* fields shall be populated with details of the system, if any, that detects, observes and/or creates a network, security, or application event or metric. Message queues and ETL components used in processing events or metrics are not considered observers in ECS. -*`organization.name`*:: +*`observer.mac`*:: + -- -type: text +type: keyword -Organization name. +MAC address of the observer -- -*`organization.id`*:: +*`observer.ip`*:: + -- -type: keyword +type: ip -Unique identifier for the organization. +IP address of the observer. -- -[float] -== os fields +*`observer.hostname`*:: ++ +-- +type: keyword -The OS fields contain information about the operating system. These fields are often used inside other prefixes, such as `host.os.*` or `user_agent.os.*`. +Hostname of the observer. +-- -*`os.platform`*:: +*`observer.vendor`*:: ++ +-- +type: keyword + +observer vendor information. + + +-- + +*`observer.version`*:: ++ +-- +type: keyword + +Observer version. + + +-- + +*`observer.serial_number`*:: ++ +-- +type: keyword + +Observer serial number. + + +-- + +*`observer.type`*:: ++ +-- +type: keyword + +example: firewall + +The type of the observer the data is coming from. +There is no predefined list of observer types. Some examples are `forwarder`, `firewall`, `ids`, `ips`, `proxy`, `poller`, `sensor`, `APM server`. + + +-- + +[float] +== os fields + +The OS fields contain information about the operating system. + + + +*`observer.os.platform`*:: ++ +-- +type: keyword + +example: darwin + +Operating system platform (such centos, ubuntu, windows). + + +-- + +*`observer.os.name`*:: ++ +-- +type: keyword + +example: Mac OS X + +Operating system name. + + +-- + +*`observer.os.family`*:: ++ +-- +type: keyword + +example: debian + +OS family (such as redhat, debian, freebsd, windows). + + +-- + +*`observer.os.version`*:: ++ +-- +type: keyword + +example: 10.12.6-rc2 + +Operating system version as a raw string. + + +-- + +*`observer.os.kernel`*:: ++ +-- +type: keyword + +example: 4.4.0-112-generic + +Operating system kernel version as a raw string. + + +-- + +[float] +== geo fields + +Geo fields can carry data about a specific location related to an event or geo information derived from an IP field. + + + +*`observer.geo.location`*:: ++ +-- +type: geo_point + +example: { "lon": -73.614830, "lat": 45.505918 } + +Longitude and latitude. + + +-- + +*`observer.geo.continent_name`*:: ++ +-- +type: keyword + +example: North America + +Name of the continent. + + +-- + +*`observer.geo.country_name`*:: ++ +-- +type: keyword + +example: Canada + +Country name. + + +-- + +*`observer.geo.region_name`*:: ++ +-- +type: keyword + +example: Quebec + +Region name. + + +-- + +*`observer.geo.city_name`*:: ++ +-- +type: keyword + +example: Montreal + +City name. + + +-- + +*`observer.geo.country_iso_code`*:: ++ +-- +type: keyword + +example: CA + +Country ISO code. + + +-- + +*`observer.geo.region_iso_code`*:: ++ +-- +type: keyword + +example: CA-QC + +Region ISO code. + + +-- + +*`observer.geo.name`*:: ++ +-- +type: keyword + +example: boston-dc + +User-defined description of a location, at the level of granularity they care about. +Could be the name of their data centers, the floor number, if this describes a local physical entity, city names. +Not typically used in automated geolocation. + + +-- + +[float] +== organization fields + +The organization fields enrich data with information about the company or entity the data is associated with. These fields help you arrange or filter data stored in an index by one or multiple organizations. + + + +*`organization.name`*:: ++ +-- +type: keyword + +Organization name. + + +-- + +*`organization.id`*:: ++ +-- +type: keyword + +Unique identifier for the organization. + + +-- + +[float] +== os fields + +The OS fields contain information about the operating system. + + + +*`os.platform`*:: + -- type: keyword @@ -2523,12 +3092,45 @@ These fields contain information about a process. These fields can help you corr +*`process.pid`*:: ++ +-- +type: long + +Process id. + + +-- + +*`process.name`*:: ++ +-- +type: keyword + +example: ssh + +Process name. +Sometimes called program name or similar. + + +-- + +*`process.ppid`*:: ++ +-- +type: long + +Process parent id. + + +-- + *`process.args`*:: + -- type: keyword -example: ['-l', 'user', '10.0.0.16'] +example: ['ssh', '-l', 'user', '10.0.0.16'] Process arguments. May be filtered to protect sensitive information. @@ -2536,46 +3138,255 @@ May be filtered to protect sensitive information. -- -*`process.name`*:: +*`process.executable`*:: + -- type: keyword -example: ssh +example: /usr/bin/ssh -Process name. -Sometimes called program name or similar. +Absolute path to the process executable. -- -*`process.pid`*:: +*`process.title`*:: ++ +-- +type: keyword + +Process title. +The proctitle, some times the same as process name. Can also be different: for example a browser setting its title to the web page currently opened. + + +-- + +*`process.thread.id`*:: + -- type: long -Process id. +example: 4242 + +Thread ID. -- -*`process.ppid`*:: +*`process.start`*:: ++ +-- +type: date + +example: 2016-05-23T08:05:34.853Z + +The time the process started. + + +-- + +*`process.working_directory`*:: ++ +-- +type: keyword + +example: /home/alice + +The working directory of the process. + + +-- + +[float] +== related fields + +This field set is meant to facilitate pivoting around a piece of data. Some pieces of information can be seen in many places in ECS. To facilitate searching for them, append values to their corresponding field in `related.`. A concrete example is IP addresses, which can be under host, observer, source, destination, client, server, and network.forwarded_ip. If you append all IPs to `related.ip`, you can then search for a given IP trivially, no matter where it appeared, by querying `related.ip:a.b.c.d`. + + + +*`related.ip`*:: ++ +-- +type: ip + +All of the IPs seen on your event. + + +-- + +[float] +== server fields + +A Server is defined as the responder in a network connection for events regarding sessions, connections, or bidirectional flow records. For TCP events, the server is the receiver of the initial SYN packet(s) of the TCP connection. For other protocols, the server is generally the responder in the network transaction. Some systems actually use the term "responder" to refer the server in TCP connections. The server fields describe details about the system acting as the server in the network event. Server fields are usually populated in conjunction with client fields. Server fields are generally not populated for packet-level events. + + + +*`server.ip`*:: ++ +-- +type: ip + +IP address of the server. +Can be one or multiple IPv4 or IPv6 addresses. + + +-- + +*`server.port`*:: + -- type: long -Process parent id. +Port of the server. + + +-- + +*`server.mac`*:: ++ +-- +type: keyword + +MAC address of the server. + + +-- + +*`server.domain`*:: ++ +-- +type: keyword + +Server domain. + + +-- + +*`server.bytes`*:: ++ +-- +type: long + +example: 184 + +Bytes sent from the server to the client. + + +-- + +*`server.packets`*:: ++ +-- +type: long + +example: 12 + +Packets sent from the server to the client. + + +-- + +[float] +== geo fields + +Geo fields can carry data about a specific location related to an event or geo information derived from an IP field. + + + +*`server.geo.location`*:: ++ +-- +type: geo_point + +example: { "lon": -73.614830, "lat": 45.505918 } + +Longitude and latitude. + + +-- + +*`server.geo.continent_name`*:: ++ +-- +type: keyword + +example: North America + +Name of the continent. + + +-- + +*`server.geo.country_name`*:: ++ +-- +type: keyword + +example: Canada + +Country name. + + +-- + +*`server.geo.region_name`*:: ++ +-- +type: keyword + +example: Quebec + +Region name. + + +-- + +*`server.geo.city_name`*:: ++ +-- +type: keyword + +example: Montreal + +City name. + + +-- + +*`server.geo.country_iso_code`*:: ++ +-- +type: keyword + +example: CA + +Country ISO code. + + +-- + +*`server.geo.region_iso_code`*:: ++ +-- +type: keyword + +example: CA-QC + +Region ISO code. -- -*`process.title`*:: +*`server.geo.name`*:: + -- type: keyword -Process title. -The proctitle, often the same as process name. +example: boston-dc + +User-defined description of a location, at the level of granularity they care about. +Could be the name of their data centers, the floor number, if this describes a local physical entity, city names. +Not typically used in automated geolocation. -- @@ -2606,11 +3417,12 @@ Example: If you are experiencing issues with one redis instance, you can filter -- type: keyword -example: elasticsearch +example: elasticsearch-metrics Name of the service data is collected from. -The name can be used to group and correlate logs and metrics from one service. -Example: If logs or metrics are collected from Redis, `service.name` would be `redis`. +The name of the service is normally user given. This allows if two instances of the same service are running on the same machine they can be differentiated by the `service.name`. +Also it allows for distributed services that run on multiple hosts to correlate the related instances based on the name. +In the case of Elasticsearch the service.name could contain the cluster name. For Beats the service.name is by default a copy of the `service.type` field if no name is specified. -- @@ -2620,7 +3432,11 @@ Example: If logs or metrics are collected from Redis, `service.name` would be `r -- type: keyword -Service type. +example: elasticsearch + +The type of the service data is collected from. +The type can be used to group and correlate logs and metrics from one service type. +Example: If logs or metrics are collected from Elasticsearch, `service.type` would be `elasticsearch`. -- @@ -2664,7 +3480,7 @@ This id normally changes across restarts, but `service.id` does not. [float] == source fields -Source fields describe details about the source of the event. +Source fields describe details about the source of a packet/event. Source fields are usually populated in conjunction with destination fields. @@ -2707,40 +3523,71 @@ type: keyword Source domain. +-- + +*`source.bytes`*:: ++ +-- +type: long + +example: 184 + +Bytes sent from the source to the destination. + + +-- + +*`source.packets`*:: ++ +-- +type: long + +example: 12 + +Packets sent from the source to the destination. + + -- [float] == geo fields -Geolocation for source. +Geo fields can carry data about a specific location related to an event or geo information derived from an IP field. -*`source.geo.continent_name`*:: + +*`source.geo.location`*:: + -- -type: keyword +type: geo_point -Name of the continent. +example: { "lon": -73.614830, "lat": 45.505918 } + +Longitude and latitude. -- -*`source.geo.country_iso_code`*:: +*`source.geo.continent_name`*:: + -- type: keyword -Country ISO code. +example: North America + +Name of the continent. -- -*`source.geo.location`*:: +*`source.geo.country_name`*:: + -- -type: geo_point +type: keyword -Longitude and latitude. +example: Canada + +Country name. -- @@ -2750,6 +3597,8 @@ Longitude and latitude. -- type: keyword +example: Quebec + Region name. @@ -2760,9 +3609,23 @@ Region name. -- type: keyword +example: Montreal + City name. +-- + +*`source.geo.country_iso_code`*:: ++ +-- +type: keyword + +example: CA + +Country ISO code. + + -- *`source.geo.region_iso_code`*:: @@ -2770,17 +3633,60 @@ City name. -- type: keyword +example: CA-QC + Region ISO code. +-- + +*`source.geo.name`*:: ++ +-- +type: keyword + +example: boston-dc + +User-defined description of a location, at the level of granularity they care about. +Could be the name of their data centers, the floor number, if this describes a local physical entity, city names. +Not typically used in automated geolocation. + + -- [float] == url fields -URL fields provide a complete URL, with scheme, host, and path. The URL object can be reused in other prefixes, such as `host.url.*` for example. Keep the structure consistent whenever you use URL fields. +URL fields provide a complete URL, with scheme, host, and path. + + + +*`url.original`*:: ++ +-- +type: keyword + +example: https://www.elastic.co:443/search?q=elasticsearch#top or /search?q=elasticsearch + + +Unmodified original url as seen in the event source. +Note that in network monitoring, the observed URL may be a full URL, whereas in access logs, the URL is often just represented as a path. +This field is meant to represent the URL as it was observed, complete or not. + + +-- + +*`url.full`*:: ++ +-- +type: keyword + +example: https://www.elastic.co:443/search?q=elasticsearch#top + +If full URLs are important to your use case, they should be stored in `url.full`, whether this field is reconstructed or present in the event source. +-- *`url.scheme`*:: + @@ -2795,15 +3701,15 @@ Note: The `:` is not part of the scheme. -- -*`url.hostname`*:: +*`url.domain`*:: + -- type: keyword -example: elastic.co +example: www.elastic.co -Hostname of the request, such as "elastic.co". -In some cases a URL may refer to an IP and/or port directly, without a domain name. In this case, the IP address would go to the `hostname` field. +Domain of the request, such as "www.elastic.co". +In some cases a URL may refer to an IP and/or port directly, without a domain name. In this case, the IP address would go to the `domain` field. -- @@ -2823,42 +3729,22 @@ Port of the request, such as 443. *`url.path`*:: + -- -type: text - -Path of the request, such as "/search". - - -*`url.path.raw`*:: -+ --- type: keyword -URL path. A non-analyzed field that is useful for aggregations. - +Path of the request, such as "/search". --- -- *`url.query`*:: + -- -type: text +type: keyword The query field describes the query string of the request, such as "q=elasticsearch". The `?` is excluded from the query string. If a URL contains no `?`, there is no query field. If there is a `?` but no query, the query field exists with an empty string. The `exists` query can be used to differentiate between the two cases. -*`url.query.raw`*:: -+ --- -type: keyword - -URL query part. A non-analyzed field that is useful for aggregations. - - --- - -- *`url.fragment`*:: @@ -2914,8 +3800,21 @@ One or multiple unique identifiers of the user. -- type: keyword -Name of the user. -The field is a keyword, and will not be tokenized. +example: albert + +Short name or login of the user. + + +-- + +*`user.full_name`*:: ++ +-- +type: keyword + +example: Albert Einstein + +User's full name, if available. -- @@ -2939,6 +3838,16 @@ Unique user hash to correlate information for a user in anonymized form. Useful if `user.id` or `user.name` contain confidential information and cannot be used. +-- + +*`user.group`*:: ++ +-- +type: keyword + +Group the user is a part of. This field can contain a list of groups, if necessary. + + -- [float] @@ -2951,19 +3860,25 @@ The user_agent fields normally come from a browser request. They often show up i *`user_agent.original`*:: + -- -type: text +type: keyword + +example: Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1 Unparsed version of the user_agent. +Field is not indexed. + -- -*`user_agent.device`*:: +*`user_agent.name`*:: + -- type: keyword -Name of the physical device. +example: Safari + +Name of the user agent. -- @@ -2973,129 +3888,196 @@ Name of the physical device. -- type: keyword -Version of the physical device. +example: 12.0 + +Version of the user agent. -- -*`user_agent.major`*:: +*`user_agent.device.name`*:: + -- -type: long +type: keyword -Major version of the user agent. +example: iPhone + +Name of the device. -- -*`user_agent.minor`*:: +[float] +== os fields + +The OS fields contain information about the operating system. + + + +*`user_agent.os.platform`*:: + -- -type: long +type: keyword -Minor version of the user agent. +example: darwin + +Operating system platform (such centos, ubuntu, windows). -- -*`user_agent.patch`*:: +*`user_agent.os.name`*:: + -- type: keyword -Patch version of the user agent. +example: Mac OS X + +Operating system name. -- -*`user_agent.name`*:: +*`user_agent.os.family`*:: + -- type: keyword -example: Chrome +example: debian -Name of the user agent. +OS family (such as redhat, debian, freebsd, windows). -- -*`user_agent.os.name`*:: +*`user_agent.os.version`*:: + -- type: keyword -Name of the operating system. +example: 10.12.6-rc2 + +Operating system version as a raw string. -- -*`user_agent.os.version`*:: +*`user_agent.os.kernel`*:: + -- type: keyword -Version of the operating system. +example: 4.4.0-112-generic + +Operating system kernel version as a raw string. -- -*`user_agent.os.major`*:: +*`beat.name`*:: + -- -type: long +type: alias -Major version of the operating system. +alias to: agent.type + +-- + +*`beat.hostname`*:: ++ +-- +type: alias +alias to: agent.hostname -- -*`user_agent.os.minor`*:: +*`agent.hostname`*:: + -- -type: long +type: keyword -Minor version of the operating system. +Hostname of the agent. -- -*`beat.name`*:: +*`user_agent.patch`*:: + -- -type: alias +type: keyword + +Patch version of the user agent. -alias to: agent.type -- -*`beat.hostname`*:: +*`user_agent.minor`*:: + -- -type: alias +type: keyword + +Minor version of the user agent. -alias to: agent.hostname -- -[[exported-fields-host-processor]] -== Host fields +*`user_agent.major`*:: ++ +-- +type: keyword -Info collected for the host machine. +Major version of the user agent. +-- +*`user_agent.device`*:: ++ +-- +type: keyword -*`host.os.kernel`*:: +Name of the physical device. + + +-- + +*`user_agent.os.major`*:: ++ +-- +type: long + +Major version of the operating system. + + +-- + +*`user_agent.os.minor`*:: ++ +-- +type: long + +Minor version of the operating system. + + +-- + +*`url.hostname`*:: + -- type: keyword -The operating system's kernel version. +Hostname of the request, such as "elastic.co". -- +[[exported-fields-host-processor]] +== Host fields + +Info collected for the host machine. + + [[exported-fields-kubernetes-processor]] == Kubernetes fields diff --git a/include/fields.go b/include/fields.go index d6d50e2c2d1..cf762b41c4e 100644 --- a/include/fields.go +++ b/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/magefile.go b/magefile.go index b929b9b9724..59b57346066 100644 --- a/magefile.go +++ b/magefile.go @@ -34,7 +34,6 @@ import ( ) func init() { - mage.SetElasticBeatsDir("./_beats") mage.SetBuildVariableSources(&mage.BuildVariableSources{ BeatVersion: "vendor/github.com/elastic/beats/libbeat/version/version.go", @@ -45,6 +44,7 @@ func init() { mage.BeatDescription = "Elastic APM Server" mage.BeatURL = "https://www.elastic.co/solutions/apm" mage.BeatIndexPrefix = "apm" + mage.XPackDir = "x-pack" } // Build builds the Beat binary. @@ -68,6 +68,10 @@ func CrossBuild() error { return mage.CrossBuild() } +func CrossBuildXPack() error { + return mage.CrossBuildXPack() +} + // CrossBuildGoDaemon cross-builds the go-daemon binary using Docker. func CrossBuildGoDaemon() error { return mage.CrossBuildGoDaemon() @@ -85,11 +89,11 @@ func Package() { start := time.Now() defer func() { fmt.Println("package ran for", time.Since(start)) }() - mage.UseElasticBeatWithoutXPackPackaging() + mage.UseElasticBeatPackaging() customizePackaging() mg.Deps(Update, prepareIngestPackaging) - mg.Deps(CrossBuild, CrossBuildGoDaemon) + mg.Deps(CrossBuild, CrossBuildXPack, CrossBuildGoDaemon) mg.SerialDeps(mage.Package, TestPackages) } diff --git a/vendor/github.com/elastic/beats/dev-tools/mage/settings.go b/vendor/github.com/elastic/beats/dev-tools/mage/settings.go index 19f1e4829e6..c5c46667783 100644 --- a/vendor/github.com/elastic/beats/dev-tools/mage/settings.go +++ b/vendor/github.com/elastic/beats/dev-tools/mage/settings.go @@ -53,6 +53,7 @@ var ( GOARM = EnvOr("GOARM", "") Platform = MakePlatformAttributes(GOOS, GOARCH, GOARM) BinaryExt = "" + XPackDir = "../x-pack" RaceDetector = false TestCoverage = false @@ -128,6 +129,7 @@ func varMap(args ...map[string]interface{}) map[string]interface{} { "GOARM": GOARM, "Platform": Platform, "BinaryExt": BinaryExt, + "XPackDir": XPackDir, "BeatName": BeatName, "BeatServiceName": BeatServiceName, "BeatIndexPrefix": BeatIndexPrefix, @@ -157,6 +159,7 @@ GOARCH = {{.GOARCH}} GOARM = {{.GOARM}} Platform = {{.Platform}} BinaryExt = {{.BinaryExt}} +XPackDir = {{.XPackDir}} BeatName = {{.BeatName}} BeatServiceName = {{.BeatServiceName}} BeatIndexPrefix = {{.BeatIndexPrefix}} @@ -248,8 +251,10 @@ func findElasticBeatsDir() (string, error) { const devToolsImportPath = elasticBeatsImportPath + "/dev-tools/mage" - // Search in project vendor directories. + // Search in project vendor directories. Order is relevant searchPaths := []string{ + // beats directory of apm-server + filepath.Join(repo.RootDir, "_beats/dev-tools/vendor"), filepath.Join(repo.RootDir, repo.SubDir, "vendor", devToolsImportPath), filepath.Join(repo.RootDir, "vendor", devToolsImportPath), } @@ -263,24 +268,6 @@ func findElasticBeatsDir() (string, error) { return "", errors.Errorf("failed to find %v in the project's vendor", devToolsImportPath) } -// SetElasticBeatsDir explicitly sets the location of the Elastic Beats -// directory. If not set then it will attempt to locate it. -func SetElasticBeatsDir(dir string) { - elasticBeatsDirLock.Lock() - defer elasticBeatsDirLock.Unlock() - - info, err := os.Stat(dir) - if err != nil { - panic(errors.Wrapf(err, "failed to read elastic beats dir at %v", dir)) - } - - if !info.IsDir() { - panic(errors.Errorf("elastic beats dir=%v is not a directory", dir)) - } - - elasticBeatsDirValue = filepath.Clean(dir) -} - var ( buildDate = time.Now().UTC().Format(time.RFC3339) ) diff --git a/vendor/github.com/elastic/beats/libbeat/cmd/export.go b/vendor/github.com/elastic/beats/libbeat/cmd/export.go index e9d6015992d..07f9cd16da0 100644 --- a/vendor/github.com/elastic/beats/libbeat/cmd/export.go +++ b/vendor/github.com/elastic/beats/libbeat/cmd/export.go @@ -33,6 +33,7 @@ func genExportCmd(settings instance.Settings, name, idxPrefix, beatVersion strin exportCmd.AddCommand(export.GenExportConfigCmd(settings, name, idxPrefix, beatVersion)) exportCmd.AddCommand(export.GenTemplateConfigCmd(settings, name, idxPrefix, beatVersion)) exportCmd.AddCommand(export.GenDashboardCmd(name, idxPrefix, beatVersion)) + exportCmd.AddCommand(export.GenGetILMPolicyCmd()) return exportCmd } diff --git a/vendor/github.com/elastic/beats/libbeat/cmd/export/ilm_policy.go b/vendor/github.com/elastic/beats/libbeat/cmd/export/ilm_policy.go new file mode 100644 index 00000000000..a9e4542fc29 --- /dev/null +++ b/vendor/github.com/elastic/beats/libbeat/cmd/export/ilm_policy.go @@ -0,0 +1,39 @@ +// 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 export + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/elastic/beats/libbeat/cmd/instance" +) + +// GenGetILMPolicyCmd is the command used to export the ilm policy. +func GenGetILMPolicyCmd() *cobra.Command { + genTemplateConfigCmd := &cobra.Command{ + Use: "ilm-policy", + Short: "Export ILM policy", + Run: func(cmd *cobra.Command, args []string) { + fmt.Println(instance.ILMPolicy.StringToPrint()) + }, + } + + return genTemplateConfigCmd +} diff --git a/vendor/github.com/elastic/beats/libbeat/cmd/instance/beat.go b/vendor/github.com/elastic/beats/libbeat/cmd/instance/beat.go index 9e9c23d756e..9a53bd400a5 100644 --- a/vendor/github.com/elastic/beats/libbeat/cmd/instance/beat.go +++ b/vendor/github.com/elastic/beats/libbeat/cmd/instance/beat.go @@ -105,6 +105,9 @@ type beatConfig struct { Dashboards *common.Config `config:"setup.dashboards"` Template *common.Config `config:"setup.template"` Kibana *common.Config `config:"setup.kibana"` + + // ILM Config options + ILM *common.Config `config:"output.elasticsearch.ilm"` } var ( @@ -430,7 +433,7 @@ func (b *Beat) TestConfig(bt beat.Creator) error { } // Setup registers ES index template, kibana dashboards, ml jobs and pipelines. -func (b *Beat) Setup(bt beat.Creator, template, setupDashboards, machineLearning, pipelines bool) error { +func (b *Beat) Setup(bt beat.Creator, template, setupDashboards, machineLearning, pipelines, policy bool) error { return handleError(func() error { err := b.Init() if err != nil { @@ -509,6 +512,13 @@ func (b *Beat) Setup(bt beat.Creator, template, setupDashboards, machineLearning fmt.Println("Loaded Ingest pipelines") } + if policy { + if err := b.loadILMPolicy(); err != nil { + return err + } + fmt.Println("Loaded Index Lifecycle Management (ILM) policy") + } + return nil }()) } @@ -719,11 +729,11 @@ func (b *Beat) loadDashboards(ctx context.Context, force bool) error { // the elasticsearch output. It is important the the registration happens before // the publisher is created. func (b *Beat) registerTemplateLoading() error { - var cfg template.TemplateConfig + var templateCfg template.TemplateConfig // Check if outputting to file is enabled, and output to file if it is if b.Config.Template.Enabled() { - err := b.Config.Template.Unpack(&cfg) + err := b.Config.Template.Unpack(&templateCfg) if err != nil { return fmt.Errorf("unpacking template config fails: %v", err) } @@ -741,8 +751,82 @@ func (b *Beat) registerTemplateLoading() error { return err } - if esCfg.Index != "" && (cfg.Name == "" || cfg.Pattern == "") && (b.Config.Template == nil || b.Config.Template.Enabled()) { - return fmt.Errorf("setup.template.name and setup.template.pattern have to be set if index name is modified.") + if esCfg.Index != "" && + (templateCfg.Name == "" || templateCfg.Pattern == "") && + (b.Config.Template == nil || b.Config.Template.Enabled()) { + return errors.New("setup.template.name and setup.template.pattern have to be set if index name is modified") + } + + if b.Config.ILM.Enabled() { + cfgwarn.Beta("Index lifecycle management is enabled which is in beta.") + + ilmCfg, err := getILMConfig(b) + if err != nil { + return err + } + + // In case no template settings are set, config must be created + if b.Config.Template == nil { + b.Config.Template = common.NewConfig() + } + // Template name and pattern can't be configure when using ILM + logp.Info("Set setup.template.name to '%s' as ILM is enabled.", ilmCfg.RolloverAlias) + err = b.Config.Template.SetString("name", -1, ilmCfg.RolloverAlias) + if err != nil { + return errw.Wrap(err, "error setting setup.template.name") + } + pattern := fmt.Sprintf("%s-*", ilmCfg.RolloverAlias) + logp.Info("Set setup.template.pattern to '%s' as ILM is enabled.", pattern) + err = b.Config.Template.SetString("pattern", -1, pattern) + if err != nil { + return errw.Wrap(err, "error setting setup.template.pattern") + } + + // rollover_alias and lifecycle.name can't be configured and will be overwritten + logp.Info("Set settings.index.lifecycle.rollover_alias in template to %s as ILM is enabled.", ilmCfg.RolloverAlias) + err = b.Config.Template.SetString("settings.index.lifecycle.rollover_alias", -1, ilmCfg.RolloverAlias) + if err != nil { + return errw.Wrap(err, "error setting settings.index.lifecycle.rollover_alias") + } + logp.Info("Set settings.index.lifecycle.name in template to %s as ILM is enabled.", ILMPolicyName) + err = b.Config.Template.SetString("settings.index.lifecycle.name", -1, ILMPolicyName) + if err != nil { + return errw.Wrap(err, "error setting settings.index.lifecycle.name") + } + + // Set the ingestion index to the rollover alias + logp.Info("Set output.elasticsearch.index to '%s' as ILM is enabled.", ilmCfg.RolloverAlias) + esCfg.Index = ilmCfg.RolloverAlias + err = b.Config.Output.Config().SetString("index", -1, ilmCfg.RolloverAlias) + if err != nil { + return errw.Wrap(err, "error setting output.elasticsearch.index") + } + + writeAliasCallback, err := b.writeAliasLoadingCallback() + if err != nil { + return err + } + + // Load write alias already on + esConfig := b.Config.Output.Config() + + // Check that ILM is enabled and the right elasticsearch version exists + esClient, err := elasticsearch.NewConnectedClient(esConfig) + if err != nil { + return err + } + + err = checkElasticsearchVersionIlm(esClient) + if err != nil { + return err + } + + err = checkILMFeatureEnabled(esClient) + if err != nil { + return err + } + + elasticsearch.RegisterConnectCallback(writeAliasCallback) } if b.Config.Template == nil || (b.Config.Template != nil && b.Config.Template.Enabled()) { @@ -754,6 +838,8 @@ func (b *Beat) registerTemplateLoading() error { return err } elasticsearch.RegisterConnectCallback(callback) + } else if b.Config.ILM.Enabled() { + return errors.New("templates cannot be disable when using ILM") } } diff --git a/vendor/github.com/elastic/beats/libbeat/cmd/instance/ilm.go b/vendor/github.com/elastic/beats/libbeat/cmd/instance/ilm.go new file mode 100644 index 00000000000..addaa24258e --- /dev/null +++ b/vendor/github.com/elastic/beats/libbeat/cmd/instance/ilm.go @@ -0,0 +1,206 @@ +// 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 instance + +import ( + "encoding/json" + "fmt" + "net/url" + + "github.com/pkg/errors" + + "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/libbeat/logp" + "github.com/elastic/beats/libbeat/outputs/elasticsearch" +) + +type ilmConfig struct { + RolloverAlias string `config:"ilm.rollover_alias" ` + Pattern string `config:"ilm.pattern"` +} + +// ILMPolicy contains the default policy +var ILMPolicy = common.MapStr{ + "policy": common.MapStr{ + "phases": common.MapStr{ + "hot": common.MapStr{ + "actions": common.MapStr{ + "rollover": common.MapStr{ + "max_size": "50gb", + "max_age": "30d", + }, + }, + }, + }, + }, +} + +const ( + // ILMPolicyName is the default policy name + ILMPolicyName = "beats-default-policy" + // ILMDefaultPattern is the default pattern + ILMDefaultPattern = "{now/d}-000001" +) + +// Build and return a callback to load ILM write alias +func (b *Beat) writeAliasLoadingCallback() (func(esClient *elasticsearch.Client) error, error) { + callback := func(esClient *elasticsearch.Client) error { + if b.Config.ILM == nil { + b.Config.ILM = common.NewConfig() + } + + config, err := getILMConfig(b) + if err != nil { + return err + } + + // Escaping because of date pattern + pattern := url.PathEscape(config.Pattern) + // This always assume it's a date pattern by sourrounding it by <...> + firstIndex := fmt.Sprintf("%%3C%s-%s%%3E", config.RolloverAlias, pattern) + + // Check if alias already exists + status, b, err := esClient.Request("HEAD", "/_alias/"+config.RolloverAlias, "", nil, nil) + if err != nil && status != 404 { + logp.Err("Failed to check for alias: %s: %+v", err, string(b)) + return errors.Wrap(err, "failed to check for alias") + } + if status == 200 { + logp.Info("Write alias already exists") + return nil + } + + body := common.MapStr{ + "aliases": common.MapStr{ + config.RolloverAlias: common.MapStr{ + "is_write_index": true, + }, + }, + } + + // Create alias with write index + code, res, err := esClient.Request("PUT", "/"+firstIndex, "", nil, body) + if code == 400 { + logp.Err("Error creating alias with write index. As return code is 400, assuming already exists: %s, %s", err, string(res)) + return nil + + } else if err != nil { + logp.Err("Error creating alias with write index: %s, %s", err, string(res)) + return errors.Wrap(err, "failed to create write alias: "+string(res)) + } + + logp.Info("Alias with write index created: %s", firstIndex) + + return nil + } + + return callback, nil +} + +func (b *Beat) loadILMPolicy() error { + esClient, err := getElasticsearchClient(b) + if err != nil { + return err + } + + _, _, err = esClient.Request("PUT", "/_ilm/policy/"+ILMPolicyName, "", nil, ILMPolicy) + return err +} + +func getElasticsearchClient(b *Beat) (*elasticsearch.Client, error) { + outCfg := b.Config.Output + if outCfg.Name() != "elasticsearch" { + return nil, fmt.Errorf("Policy loading requested but the Elasticsearch output is not configured/enabled") + } + + esConfig := outCfg.Config() + + return elasticsearch.NewConnectedClient(esConfig) +} + +func loadConfigWithDefaults(config *ilmConfig, b *Beat) { + if config.RolloverAlias == "" { + config.RolloverAlias = fmt.Sprintf("%s-%s", b.Info.Beat, b.Info.Version) + } + + if config.Pattern == "" { + config.Pattern = ILMDefaultPattern + } +} + +func checkElasticsearchVersionIlm(client *elasticsearch.Client) error { + esV := client.GetVersion() + requiredVersion, err := common.NewVersion("6.6.0") + if err != nil { + return err + } + + if esV.LessThan(requiredVersion) { + return fmt.Errorf("ILM requires at least Elasticsearch 6.6.0. Used version: %s", esV.String()) + } + + return nil +} + +func checkILMFeatureEnabled(client *elasticsearch.Client) error { + code, body, err := client.Request("GET", "/_xpack", "", nil, nil) + + // If we get a 400, it's assumed to be the OSS version of Elasticsearch + if code == 400 { + return fmt.Errorf("ILM feature is not available in this Elasticsearch version") + } + if err != nil { + return err + } + + var response struct { + Features struct { + ILM struct { + Available bool `json:"available"` + Enabled bool `json:"enabled"` + } `json:"ilm"` + } `json:"features"` + } + + err = json.Unmarshal(body, &response) + if err != nil { + return fmt.Errorf("failed to parse JSON response: %v", err) + } + + if !response.Features.ILM.Available { + return fmt.Errorf("ILM feature is not available in Elasticsearch") + } + + if !response.Features.ILM.Enabled { + return fmt.Errorf("ILM feature is not enabled in Elasticsearch") + } + + return nil +} + +func getILMConfig(b *Beat) (*ilmConfig, error) { + config := &ilmConfig{} + err := b.Config.Output.Config().Unpack(config) + if err != nil { + return nil, errors.Wrap(err, "problem unpacking ilm configs") + } + + loadConfigWithDefaults(config, b) + + return config, nil +} diff --git a/vendor/github.com/elastic/beats/libbeat/cmd/setup.go b/vendor/github.com/elastic/beats/libbeat/cmd/setup.go index 2b4f5cd326b..fd096a34370 100644 --- a/vendor/github.com/elastic/beats/libbeat/cmd/setup.go +++ b/vendor/github.com/elastic/beats/libbeat/cmd/setup.go @@ -37,6 +37,7 @@ func genSetupCmd(name, idxPrefix, version string, beatCreator beat.Creator) *cob * Kibana dashboards (where available). * ML jobs (where available). * Ingest pipelines (where available). + * ILM policy (for Elasticsearch 6.5 and newer). `, Run: func(cmd *cobra.Command, args []string) { beat, err := instance.NewBeat(name, idxPrefix, version) @@ -49,16 +50,18 @@ func genSetupCmd(name, idxPrefix, version string, beatCreator beat.Creator) *cob dashboards, _ := cmd.Flags().GetBool("dashboards") machineLearning, _ := cmd.Flags().GetBool("machine-learning") pipelines, _ := cmd.Flags().GetBool("pipelines") + policy, _ := cmd.Flags().GetBool("ilm-policy") // No flags: setup all - if !template && !dashboards && !machineLearning && !pipelines { + if !template && !dashboards && !machineLearning && !pipelines && !policy { template = true dashboards = true machineLearning = true pipelines = true + policy = true } - if err = beat.Setup(beatCreator, template, dashboards, machineLearning, pipelines); err != nil { + if err = beat.Setup(beatCreator, template, dashboards, machineLearning, pipelines, policy); err != nil { os.Exit(1) } }, @@ -68,6 +71,7 @@ func genSetupCmd(name, idxPrefix, version string, beatCreator beat.Creator) *cob setup.Flags().Bool("dashboards", false, "Setup dashboards") setup.Flags().Bool("machine-learning", false, "Setup machine learning job configurations") setup.Flags().Bool("pipelines", false, "Setup Ingest pipelines") + setup.Flags().Bool("ilm-policy", false, "Setup ILM policy") return &setup } diff --git a/vendor/github.com/elastic/beats/libbeat/generator/fields/fields.go b/vendor/github.com/elastic/beats/libbeat/generator/fields/fields.go index c28889b1c9b..0acd8119b2e 100644 --- a/vendor/github.com/elastic/beats/libbeat/generator/fields/fields.go +++ b/vendor/github.com/elastic/beats/libbeat/generator/fields/fields.go @@ -32,12 +32,11 @@ type YmlFile struct { } func collectCommonFiles(esBeatsPath, beatPath string, fieldFiles []*YmlFile) ([]*YmlFile, error) { - var commonFields []string var libbeatFieldFiles []*YmlFile var err error + commonFields := []string{filepath.Join(esBeatsPath, "libbeat/_meta/fields.ecs.yml")} if !isLibbeat(beatPath) { commonFields = append(commonFields, - filepath.Join(esBeatsPath, "libbeat/_meta/fields.ecs.yml"), filepath.Join(esBeatsPath, "libbeat/_meta/fields.common.yml"), ) diff --git a/vendor/github.com/elastic/beats/libbeat/kibana/fields_transformer.go b/vendor/github.com/elastic/beats/libbeat/kibana/fields_transformer.go index ef133a68676..0a8b120af2e 100644 --- a/vendor/github.com/elastic/beats/libbeat/kibana/fields_transformer.go +++ b/vendor/github.com/elastic/beats/libbeat/kibana/fields_transformer.go @@ -153,6 +153,10 @@ func transformField(version *common.Version, f common.Field) (common.MapStr, com field["searchable"] = false } + if f.Type == "object" && f.Enabled != nil { + field["enabled"] = getVal(f.Enabled, true) + } + if f.Type == "text" { field["aggregatable"] = false } diff --git a/vendor/github.com/elastic/beats/libbeat/metric/system/host/host.go b/vendor/github.com/elastic/beats/libbeat/metric/system/host/host.go index fb2a5e246ac..8589ef5a5a0 100644 --- a/vendor/github.com/elastic/beats/libbeat/metric/system/host/host.go +++ b/vendor/github.com/elastic/beats/libbeat/metric/system/host/host.go @@ -34,6 +34,7 @@ func MapHostInfo(info types.HostInfo) common.MapStr { "platform": info.OS.Platform, "version": info.OS.Version, "family": info.OS.Family, + "name": info.OS.Name, "kernel": info.KernelVersion, }, }, @@ -73,6 +74,7 @@ func ReportInfo(_ monitoring.Mode, V monitoring.Visitor) { monitoring.ReportString(V, "platform", info.OS.Platform) monitoring.ReportString(V, "version", info.OS.Version) monitoring.ReportString(V, "family", info.OS.Family) + monitoring.ReportString(V, "name", info.OS.Name) monitoring.ReportString(V, "kernel", info.KernelVersion) if info.OS.Codename != "" { diff --git a/vendor/github.com/elastic/beats/libbeat/metric/system/memory/memory.go b/vendor/github.com/elastic/beats/libbeat/metric/system/memory/memory.go index 594fc616c19..585c80d5c74 100644 --- a/vendor/github.com/elastic/beats/libbeat/metric/system/memory/memory.go +++ b/vendor/github.com/elastic/beats/libbeat/metric/system/memory/memory.go @@ -21,6 +21,7 @@ package memory import ( "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/libbeat/logp" sigar "github.com/elastic/gosigar" ) @@ -69,6 +70,17 @@ func GetSwap() (*SwapStat, error) { return nil, err } + // This shouldn't happen, but it has been reported to happen and + // this can provoke too big values for used swap. + // Workaround this by assuming that all swap is free in that case. + if swap.Free > swap.Total || swap.Used > swap.Total { + logp.Debug("memory", + "Unexpected values for swap memory - total: %v free: %v used: %v. Setting swap used to 0.", + swap.Total, swap.Free, swap.Used) + swap.Free = swap.Total + swap.Used = 0 + } + return &SwapStat{Swap: swap}, nil } diff --git a/vendor/github.com/elastic/beats/libbeat/processors/add_host_metadata/add_host_metadata.go b/vendor/github.com/elastic/beats/libbeat/processors/add_host_metadata/add_host_metadata.go index 5127d8b7e53..3482a73b300 100644 --- a/vendor/github.com/elastic/beats/libbeat/processors/add_host_metadata/add_host_metadata.go +++ b/vendor/github.com/elastic/beats/libbeat/processors/add_host_metadata/add_host_metadata.go @@ -32,7 +32,6 @@ import ( "github.com/elastic/beats/libbeat/metric/system/host" "github.com/elastic/beats/libbeat/processors" "github.com/elastic/go-sysinfo" - "github.com/elastic/go-sysinfo/types" ) func init() { @@ -40,7 +39,6 @@ func init() { } type addHostMetadata struct { - info types.HostInfo lastUpdate struct { time.Time sync.Mutex @@ -50,8 +48,7 @@ type addHostMetadata struct { } const ( - processorName = "add_host_metadata" - cacheExpiration = time.Minute * 5 + processorName = "add_host_metadata" ) func newHostMetadataProcessor(cfg *common.Config) (processors.Processor, error) { @@ -60,12 +57,7 @@ func newHostMetadataProcessor(cfg *common.Config) (processors.Processor, error) return nil, errors.Wrapf(err, "fail to unpack the %v configuration", processorName) } - h, err := sysinfo.Host() - if err != nil { - return nil, err - } p := &addHostMetadata{ - info: h.Info(), config: config, data: common.NewMapStrPointer(nil), } @@ -75,28 +67,41 @@ func newHostMetadataProcessor(cfg *common.Config) (processors.Processor, error) // Run enriches the given event with the host meta data func (p *addHostMetadata) Run(event *beat.Event) (*beat.Event, error) { - p.loadData() + err := p.loadData() + if err != nil { + return nil, err + } + event.Fields.DeepUpdate(p.data.Get().Clone()) return event, nil } func (p *addHostMetadata) expired() bool { + if p.config.CacheTTL <= 0 { + return true + } + p.lastUpdate.Lock() defer p.lastUpdate.Unlock() - if p.lastUpdate.Add(cacheExpiration).After(time.Now()) { + if p.lastUpdate.Add(p.config.CacheTTL).After(time.Now()) { return false } p.lastUpdate.Time = time.Now() return true } -func (p *addHostMetadata) loadData() { +func (p *addHostMetadata) loadData() error { if !p.expired() { - return + return nil + } + + h, err := sysinfo.Host() + if err != nil { + return err } - data := host.MapHostInfo(p.info) + data := host.MapHostInfo(h.Info()) if p.config.NetInfoEnabled { // IP-address and MAC-address var ipList, hwList, err = p.getNetInfo() @@ -113,6 +118,7 @@ func (p *addHostMetadata) loadData() { } p.data.Set(data) + return nil } func (p *addHostMetadata) getNetInfo() ([]string, []string, error) { @@ -161,6 +167,6 @@ func (p *addHostMetadata) getNetInfo() ([]string, []string, error) { } func (p *addHostMetadata) String() string { - return fmt.Sprintf("%v=[netinfo.enabled=[%v]]", - processorName, p.config.NetInfoEnabled) + return fmt.Sprintf("%v=[netinfo.enabled=[%v], cache.ttl=[%v]]", + processorName, p.config.NetInfoEnabled, p.config.CacheTTL) } diff --git a/vendor/github.com/elastic/beats/libbeat/processors/add_host_metadata/config.go b/vendor/github.com/elastic/beats/libbeat/processors/add_host_metadata/config.go index 30f2e293b69..d2454ad3715 100644 --- a/vendor/github.com/elastic/beats/libbeat/processors/add_host_metadata/config.go +++ b/vendor/github.com/elastic/beats/libbeat/processors/add_host_metadata/config.go @@ -17,13 +17,19 @@ package add_host_metadata +import ( + "time" +) + // Config for add_host_metadata processor. type Config struct { - NetInfoEnabled bool `config:"netinfo.enabled"` // Add IP and MAC to event + NetInfoEnabled bool `config:"netinfo.enabled"` // Add IP and MAC to event + CacheTTL time.Duration `config:"cache.ttl"` } func defaultConfig() Config { return Config{ NetInfoEnabled: false, + CacheTTL: 5 * time.Minute, } } diff --git a/vendor/github.com/elastic/beats/libbeat/publisher/pipeline/client.go b/vendor/github.com/elastic/beats/libbeat/publisher/pipeline/client.go index 9901fa207c7..26569714f1f 100644 --- a/vendor/github.com/elastic/beats/libbeat/publisher/pipeline/client.go +++ b/vendor/github.com/elastic/beats/libbeat/publisher/pipeline/client.go @@ -190,6 +190,7 @@ func (c *client) onPublished() { } func (c *client) onFilteredOut(e beat.Event) { + c.pipeline.logger.Debug("Pipeline client receives callback 'onFilteredOut' for event: %+v", e) c.pipeline.observer.filteredEvent() if c.eventer != nil { c.eventer.FilteredOut(e) @@ -197,6 +198,7 @@ func (c *client) onFilteredOut(e beat.Event) { } func (c *client) onDroppedOnPublish(e beat.Event) { + c.pipeline.logger.Debug("Pipeline client receives callback 'onDroppedOnPublish' for event: %+v", e) c.pipeline.observer.failedPublishEvent() if c.eventer != nil { c.eventer.DroppedOnPublish(e) diff --git a/vendor/github.com/elastic/beats/x-pack/libbeat/cmd/enroll.go b/vendor/github.com/elastic/beats/x-pack/libbeat/cmd/enroll.go new file mode 100644 index 00000000000..8c99a27b587 --- /dev/null +++ b/vendor/github.com/elastic/beats/x-pack/libbeat/cmd/enroll.go @@ -0,0 +1,106 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package cmd + +import ( + "fmt" + + "github.com/pkg/errors" + "github.com/spf13/cobra" + + "github.com/elastic/beats/libbeat/cmd/instance" + "github.com/elastic/beats/libbeat/common/cli" + "github.com/elastic/beats/x-pack/libbeat/management" + "github.com/elastic/beats/x-pack/libbeat/management/api" +) + +func getBeat(name, version string) (*instance.Beat, error) { + b, err := instance.NewBeat(name, "", version) + + if err != nil { + return nil, fmt.Errorf("error creating beat: %s", err) + } + + if err = b.Init(); err != nil { + return nil, fmt.Errorf("error initializing beat: %s", err) + } + + return b, nil +} + +func genEnrollCmd(name, version string) *cobra.Command { + var username, password string + var force bool + + enrollCmd := cobra.Command{ + Use: "enroll []", + Short: "Enroll in Kibana for Central Management", + Long: `This will enroll in Kibana Beats Central Management. If you pass an enrollment token + it will be used. You can also enroll using a username and password combination.`, + Args: cobra.RangeArgs(1, 2), + Run: cli.RunWith(func(cmd *cobra.Command, args []string) error { + beat, err := getBeat(name, version) + if err != nil { + return err + } + + kibanaURL := args[0] + + if username == "" && len(args) == 1 { + return errors.New("You should pass either an enrollment token or use --username flag") + } + + var enrollmentToken string + if len(args) == 2 { + // use given enrollment token + enrollmentToken = args[1] + if err != nil { + return err + } + } else { + // retrieve an enrollment token using username/password + config, err := api.ConfigFromURL(kibanaURL) + if err != nil { + return err + } + + // pass username/password + config.IgnoreVersion = true + config.Username = username + config.Password, err = cli.ReadPassword(password) + if err != nil { + return err + } + + client, err := api.NewClient(config) + if err != nil { + return err + } + enrollmentToken, err = client.CreateEnrollmentToken() + if err != nil { + return errors.Wrap(err, "Error creating a new enrollment token") + } + } + + enrolled, err := management.Enroll(beat, kibanaURL, enrollmentToken, force) + if err != nil { + return errors.Wrap(err, "Error while enrolling") + } + + if enrolled { + fmt.Println("Enrolled and ready to retrieve settings from Kibana") + } else { + fmt.Println("Enrollment was canceled by the user") + } + return nil + }), + } + + enrollCmd.Flags().StringVar(&username, "username", "elastic", "Username to use when enrolling without token") + enrollCmd.Flags().StringVar(&password, "password", "stdin", "Method to read the password to use when enrolling without token (stdin or env:VAR_NAME)") + enrollCmd.Flags().BoolVar(&force, "force", false, "Force overwrite of current configuraiton, do not prompt for confirmation") + + return &enrollCmd +} diff --git a/vendor/github.com/elastic/beats/x-pack/libbeat/cmd/inject.go b/vendor/github.com/elastic/beats/x-pack/libbeat/cmd/inject.go new file mode 100644 index 00000000000..715f3d2df5c --- /dev/null +++ b/vendor/github.com/elastic/beats/x-pack/libbeat/cmd/inject.go @@ -0,0 +1,17 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package cmd + +import ( + "github.com/elastic/beats/libbeat/cmd" + + // register central management + _ "github.com/elastic/beats/x-pack/libbeat/management" +) + +// AddXPack extends the given root folder with XPack features +func AddXPack(root *cmd.BeatsRootCmd, name string) { + root.AddCommand(genEnrollCmd(name, "")) +} diff --git a/vendor/github.com/elastic/beats/x-pack/libbeat/management/api/client.go b/vendor/github.com/elastic/beats/x-pack/libbeat/management/api/client.go new file mode 100644 index 00000000000..1516c13ce11 --- /dev/null +++ b/vendor/github.com/elastic/beats/x-pack/libbeat/management/api/client.go @@ -0,0 +1,94 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package api + +import ( + "bytes" + "encoding/json" + "net/http" + "net/url" + "time" + + "github.com/pkg/errors" + + "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/libbeat/kibana" +) + +const defaultTimeout = 10 * time.Second + +// Client to Central Management API +type Client struct { + client *kibana.Client +} + +// ConfigFromURL generates a full kibana client config from an URL +func ConfigFromURL(kibanaURL string) (*kibana.ClientConfig, error) { + data, err := url.Parse(kibanaURL) + if err != nil { + return nil, err + } + + var username, password string + if data.User != nil { + username = data.User.Username() + password, _ = data.User.Password() + } + + return &kibana.ClientConfig{ + Protocol: data.Scheme, + Host: data.Host, + Path: data.Path, + Username: username, + Password: password, + Timeout: defaultTimeout, + }, nil +} + +// NewClient creates and returns a kibana client +func NewClient(cfg *kibana.ClientConfig) (*Client, error) { + client, err := kibana.NewClientWithConfig(cfg) + if err != nil { + return nil, err + } + return &Client{ + client: client, + }, nil +} + +// do a request to the API and unmarshall the message, error if anything fails +func (c *Client) request(method, extraPath string, + params common.MapStr, headers http.Header, message interface{}) (int, error) { + + paramsJSON, err := json.Marshal(params) + if err != nil { + return 400, err + } + + statusCode, result, err := c.client.Request(method, extraPath, nil, headers, bytes.NewBuffer(paramsJSON)) + if err != nil { + return statusCode, err + } + + if statusCode >= 300 { + err = extractError(result) + } else { + if err = json.Unmarshal(result, message); err != nil { + return statusCode, errors.Wrap(err, "error unmarshaling Kibana response") + } + } + + return statusCode, err +} + +func extractError(result []byte) error { + var kibanaResult struct { + Message string + } + if err := json.Unmarshal(result, &kibanaResult); err != nil { + return errors.Wrap(err, "parsing Kibana response") + } + return errors.New(kibanaResult.Message) +} diff --git a/vendor/github.com/elastic/beats/x-pack/libbeat/management/api/configuration.go b/vendor/github.com/elastic/beats/x-pack/libbeat/management/api/configuration.go new file mode 100644 index 00000000000..b5a48747b2a --- /dev/null +++ b/vendor/github.com/elastic/beats/x-pack/libbeat/management/api/configuration.go @@ -0,0 +1,90 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package api + +import ( + "fmt" + "net/http" + "reflect" + + "github.com/elastic/beats/libbeat/common/reload" + + "github.com/gofrs/uuid" + + "github.com/elastic/beats/libbeat/common" +) + +// ConfigBlock stores a piece of config from central management +type ConfigBlock struct { + Raw map[string]interface{} +} + +// ConfigBlocksWithType is a list of config blocks with the same type +type ConfigBlocksWithType struct { + Type string + Blocks []*ConfigBlock +} + +// ConfigBlocks holds a list of type + configs objects +type ConfigBlocks []ConfigBlocksWithType + +// Config returns a common.Config object holding the config from this block +func (c *ConfigBlock) Config() (*common.Config, error) { + return common.NewConfigFrom(c.Raw) +} + +// ConfigWithMeta returns a reload.ConfigWithMeta object holding the config from this block, meta will be nil +func (c *ConfigBlock) ConfigWithMeta() (*reload.ConfigWithMeta, error) { + config, err := c.Config() + if err != nil { + return nil, err + } + return &reload.ConfigWithMeta{ + Config: config, + }, nil +} + +// Configuration retrieves the list of configuration blocks from Kibana +func (c *Client) Configuration(accessToken string, beatUUID uuid.UUID, configOK bool) (ConfigBlocks, error) { + headers := http.Header{} + headers.Set("kbn-beats-access-token", accessToken) + + resp := struct { + ConfigBlocks []*struct { + Type string `json:"type"` + Raw map[string]interface{} `json:"config"` + } `json:"configuration_blocks"` + }{} + url := fmt.Sprintf("/api/beats/agent/%s/configuration?validSetting=%t", beatUUID, configOK) + _, err := c.request("GET", url, nil, headers, &resp) + if err != nil { + return nil, err + } + + blocks := map[string][]*ConfigBlock{} + for _, block := range resp.ConfigBlocks { + blocks[block.Type] = append(blocks[block.Type], &ConfigBlock{Raw: block.Raw}) + } + + res := ConfigBlocks{} + for t, b := range blocks { + res = append(res, ConfigBlocksWithType{Type: t, Blocks: b}) + } + + return res, nil +} + +// ConfigBlocksEqual returns true if the given config blocks are equal, false if not +func ConfigBlocksEqual(a, b ConfigBlocks) bool { + if len(a) != len(b) { + return false + } + + if len(a) == 0 { + return true + } + + return reflect.DeepEqual(a, b) +} diff --git a/vendor/github.com/elastic/beats/x-pack/libbeat/management/api/enroll.go b/vendor/github.com/elastic/beats/x-pack/libbeat/management/api/enroll.go new file mode 100644 index 00000000000..c03cb0795ce --- /dev/null +++ b/vendor/github.com/elastic/beats/x-pack/libbeat/management/api/enroll.go @@ -0,0 +1,37 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package api + +import ( + "net/http" + + "github.com/gofrs/uuid" + + "github.com/elastic/beats/libbeat/common" +) + +// Enroll a beat in central management, this call returns a valid access token to retrieve configurations +func (c *Client) Enroll(beatType, beatName, beatVersion, hostname string, beatUUID uuid.UUID, enrollmentToken string) (string, error) { + params := common.MapStr{ + "type": beatType, + "name": beatName, + "version": beatVersion, + "host_name": hostname, + } + + resp := struct { + AccessToken string `json:"access_token"` + }{} + + headers := http.Header{} + headers.Set("kbn-beats-enrollment-token", enrollmentToken) + + _, err := c.request("POST", "/api/beats/agent/"+beatUUID.String(), params, headers, &resp) + if err != nil { + return "", err + } + + return resp.AccessToken, err +} diff --git a/vendor/github.com/elastic/beats/x-pack/libbeat/management/api/enrollment_token.go b/vendor/github.com/elastic/beats/x-pack/libbeat/management/api/enrollment_token.go new file mode 100644 index 00000000000..dec537d1d52 --- /dev/null +++ b/vendor/github.com/elastic/beats/x-pack/libbeat/management/api/enrollment_token.go @@ -0,0 +1,29 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package api + +import ( + "fmt" + "net/http" +) + +// CreateEnrollmentToken talks to Kibana API and generates an enrollment token +func (c *Client) CreateEnrollmentToken() (string, error) { + headers := http.Header{} + + resp := struct { + Tokens []string `json:"tokens"` + }{} + _, err := c.request("POST", "/api/beats/enrollment_tokens", nil, headers, &resp) + if err != nil { + return "", err + } + + if len(resp.Tokens) != 1 { + return "", fmt.Errorf("Unexpected number of tokens, got %d, only one expected", len(resp.Tokens)) + } + + return resp.Tokens[0], nil +} diff --git a/vendor/github.com/elastic/beats/x-pack/libbeat/management/blacklist.go b/vendor/github.com/elastic/beats/x-pack/libbeat/management/blacklist.go new file mode 100644 index 00000000000..677faf9ac48 --- /dev/null +++ b/vendor/github.com/elastic/beats/x-pack/libbeat/management/blacklist.go @@ -0,0 +1,166 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package management + +import ( + "fmt" + "regexp" + "strings" + + "github.com/joeshaw/multierror" + "github.com/pkg/errors" + + "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/x-pack/libbeat/management/api" +) + +// ConfigBlacklist takes a ConfigBlocks object and filter it based on the given +// blacklist settings +type ConfigBlacklist struct { + patterns map[string]*regexp.Regexp +} + +// ConfigBlacklistSettings holds a list of fields and regular expressions to blacklist +type ConfigBlacklistSettings struct { + Patterns map[string]string `yaml:",inline"` +} + +// Unpack unpacks nested fields set with dot notation like foo.bar into the proper nesting +// in a nested map/slice structure. +func (f *ConfigBlacklistSettings) Unpack(from interface{}) error { + m, ok := from.(map[string]interface{}) + if !ok { + return fmt.Errorf("wrong type, map is expected") + } + + f.Patterns = map[string]string{} + for k, v := range common.MapStr(m).Flatten() { + f.Patterns[k] = fmt.Sprintf("%s", v) + } + + return nil +} + +// NewConfigBlacklist filters configs from CM according to a given blacklist +func NewConfigBlacklist(cfg ConfigBlacklistSettings) (*ConfigBlacklist, error) { + list := ConfigBlacklist{ + patterns: map[string]*regexp.Regexp{}, + } + + for field, pattern := range cfg.Patterns { + exp, err := regexp.Compile(pattern) + if err != nil { + return nil, errors.Wrap(err, fmt.Sprintf("Given expression is not a valid regexp: %s", pattern)) + } + + list.patterns[field] = exp + } + + return &list, nil +} + +// Filter an error if any of the given config blocks is blacklisted +func (c *ConfigBlacklist) Filter(configBlocks api.ConfigBlocks) error { + var errs multierror.Errors + + for _, configs := range configBlocks { + for _, block := range configs.Blocks { + if c.isBlacklisted(configs.Type, block) { + errs = append(errs, fmt.Errorf("Config for '%s' is blacklisted", configs.Type)) + } + } + } + + return errs.Err() +} + +func (c *ConfigBlacklist) isBlacklisted(blockType string, block *api.ConfigBlock) bool { + cfg, err := block.ConfigWithMeta() + if err != nil { + return false + } + + for field, pattern := range c.patterns { + prefix := blockType + if strings.Contains(field, ".") { + prefix += "." + } + + if strings.HasPrefix(field, prefix) { + // This pattern affects a field on this block type + field = field[len(prefix):] + var segments []string + if len(field) > 0 { + segments = strings.Split(field, ".") + } + if c.isBlacklistedBlock(pattern, segments, cfg.Config) { + return true + } + } + } + + return false +} + +func (c *ConfigBlacklist) isBlacklistedBlock(pattern *regexp.Regexp, segments []string, current *common.Config) bool { + if current.IsDict() { + switch len(segments) { + case 0: + for _, field := range current.GetFields() { + if pattern.MatchString(field) { + return true + } + } + + case 1: + // Check field in the dict + val, err := current.String(segments[0], -1) + if err == nil { + return pattern.MatchString(val) + } + // not a string, traverse + child, _ := current.Child(segments[0], -1) + return child != nil && c.isBlacklistedBlock(pattern, segments[1:], child) + + default: + // traverse the tree + child, _ := current.Child(segments[0], -1) + return child != nil && c.isBlacklistedBlock(pattern, segments[1:], child) + + } + } + + if current.IsArray() { + switch len(segments) { + case 0: + // List of elements, match strings + for count, _ := current.CountField(""); count > 0; count-- { + val, err := current.String("", count-1) + if err == nil && pattern.MatchString(val) { + return true + } + + // not a string, traverse + child, _ := current.Child("", count-1) + if child != nil { + if c.isBlacklistedBlock(pattern, segments, child) { + return true + } + } + } + + default: + // List of elements, explode traversal to all of them + for count, _ := current.CountField(""); count > 0; count-- { + child, _ := current.Child("", count-1) + if child != nil && c.isBlacklistedBlock(pattern, segments, child) { + return true + } + } + } + } + + return false +} diff --git a/vendor/github.com/elastic/beats/x-pack/libbeat/management/cache.go b/vendor/github.com/elastic/beats/x-pack/libbeat/management/cache.go new file mode 100644 index 00000000000..530e523ddf0 --- /dev/null +++ b/vendor/github.com/elastic/beats/x-pack/libbeat/management/cache.go @@ -0,0 +1,63 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package management + +import ( + "io/ioutil" + "os" + + "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/libbeat/common/file" + "github.com/elastic/beats/libbeat/paths" + "github.com/elastic/beats/x-pack/libbeat/management/api" + + "github.com/pkg/errors" + "gopkg.in/yaml.v2" +) + +// Cache keeps a copy of configs provided by Kibana, it's used when Kibana is down +type Cache struct { + // ConfigOK is true if last config update was successful + ConfigOK bool + Configs api.ConfigBlocks +} + +// Load settings from its source file +func (c *Cache) Load() error { + path := paths.Resolve(paths.Data, "management.yml") + config, err := common.LoadFile(path) + if err != nil { + if os.IsNotExist(err) { + // File is not present, beat is not enrolled + return nil + } + return err + } + + if err = config.Unpack(&c); err != nil { + return err + } + + return nil +} + +// Save settings to management.yml file +func (c *Cache) Save() error { + path := paths.Resolve(paths.Data, "management.yml") + + data, err := yaml.Marshal(c) + if err != nil { + return err + } + + // write temporary file first + tempFile := path + ".new" + if err := ioutil.WriteFile(tempFile, data, 0600); err != nil { + return errors.Wrap(err, "failed to store central management settings") + } + + // move temporary file into final location + return file.SafeFileRotate(path, tempFile) +} diff --git a/vendor/github.com/elastic/beats/x-pack/libbeat/management/config.go b/vendor/github.com/elastic/beats/x-pack/libbeat/management/config.go new file mode 100644 index 00000000000..3781938f59c --- /dev/null +++ b/vendor/github.com/elastic/beats/x-pack/libbeat/management/config.go @@ -0,0 +1,121 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package management + +import ( + "io" + "text/template" + "time" + + "gopkg.in/yaml.v2" + + "github.com/elastic/beats/libbeat/kibana" +) + +// ManagedConfigTemplate is used to overwrite settings file during enrollment +const ManagedConfigTemplate = ` + +#========================= Central Management ================================= + +# Beats is configured under central management, you can define most settings +# from the Kibana UI. You can update this file to configure the settings that +# are not supported by Kibana Beats management. + +{{.CentralManagementSettings}} +#================================ General ===================================== + +# The name of the shipper that publishes the network data. It can be used to group +# all the transactions sent by a single shipper in the web interface. +#name: + +# The tags of the shipper are included in their own field with each +# transaction published. +#tags: ["service-X", "web-tier"] + +# Optional fields that you can specify to add additional information to the +# output. +#fields: +# env: staging + +#================================ Logging ===================================== + +# Sets log level. The default log level is info. +# Available log levels are: error, warning, info, debug +#logging.level: debug + +# At debug level, you can selectively enable logging only for some components. +# To enable all selectors use ["*"]. Examples of other selectors are "beat", +# "publish", "service". +#logging.selectors: ["*"] + +#============================== Xpack Monitoring =============================== +# {{.BeatName}} can export internal metrics to a central Elasticsearch monitoring +# cluster. This requires xpack monitoring to be enabled in Elasticsearch. The +# reporting is disabled by default. + +# Set to true to enable the monitoring reporter. +#xpack.monitoring.enabled: false + +# Uncomment to send the metrics to Elasticsearch. Most settings from the +# Elasticsearch output are accepted here as well. Any setting that is not set is +# automatically inherited from the Elasticsearch output configuration, so if you +# have the Elasticsearch output configured, you can simply uncomment the +# following line. +#xpack.monitoring.elasticsearch: +` + +// Config for central management +type Config struct { + // true when enrolled + Enabled bool `config:"enabled" yaml:"enabled"` + + // Poll configs period + Period time.Duration `config:"period" yaml:"period"` + + AccessToken string `config:"access_token" yaml:"access_token"` + + Kibana *kibana.ClientConfig `config:"kibana" yaml:"kibana"` + + Blacklist ConfigBlacklistSettings `config:"blacklist" yaml:"blacklist"` +} + +func defaultConfig() *Config { + return &Config{ + Period: 60 * time.Second, + Blacklist: ConfigBlacklistSettings{ + Patterns: map[string]string{ + "output": "console|file", + }, + }, + } +} + +type templateParams struct { + CentralManagementSettings string + BeatName string +} + +// OverwriteConfigFile will overwrite beat settings file with the enrolled template +func (c *Config) OverwriteConfigFile(wr io.Writer, beatName string) error { + t := template.Must(template.New("beat.management.yml").Parse(ManagedConfigTemplate)) + + tmp := struct { + Management *Config `yaml:"management"` + }{ + Management: c, + } + + data, err := yaml.Marshal(tmp) + if err != nil { + return err + } + + params := templateParams{ + CentralManagementSettings: string(data), + BeatName: beatName, + } + + return t.Execute(wr, params) +} diff --git a/vendor/github.com/elastic/beats/x-pack/libbeat/management/enroll.go b/vendor/github.com/elastic/beats/x-pack/libbeat/management/enroll.go new file mode 100644 index 00000000000..7638da29836 --- /dev/null +++ b/vendor/github.com/elastic/beats/x-pack/libbeat/management/enroll.go @@ -0,0 +1,106 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package management + +import ( + "fmt" + "os" + + "github.com/pkg/errors" + + "github.com/elastic/beats/libbeat/cfgfile" + "github.com/elastic/beats/libbeat/cmd/instance" + "github.com/elastic/beats/libbeat/common/cli" + "github.com/elastic/beats/libbeat/common/file" + "github.com/elastic/beats/x-pack/libbeat/management/api" +) + +const accessTokenKey = "management.accesstoken" + +// Enroll this beat to the given kibana +// This will use Central Management API to enroll and retrieve an access key for config retrieval +func Enroll(beat *instance.Beat, kibanaURL, enrollmentToken string, force bool) (bool, error) { + kibanaConfig, err := api.ConfigFromURL(kibanaURL) + if err != nil { + return false, err + } + + // Ignore kibana version to avoid permission errors + kibanaConfig.IgnoreVersion = true + + client, err := api.NewClient(kibanaConfig) + if err != nil { + return false, err + } + + accessToken, err := client.Enroll(beat.Info.Beat, beat.Info.Name, beat.Info.Version, beat.Info.Hostname, beat.Info.UUID, enrollmentToken) + if err != nil { + return false, err + } + + // Store access token in keystore + if err := storeAccessToken(beat, accessToken); err != nil { + return false, err + } + + // Enrolled, persist state + config := defaultConfig() + config.Enabled = true + config.AccessToken = "${" + accessTokenKey + "}" + config.Kibana = kibanaConfig + + confirm, err := confirmConfigOverwrite(force) + if err != nil { + return false, err + } + + if confirm { + configFile := cfgfile.GetDefaultCfgfile() + + // backup current settings: + backConfigFile := configFile + ".bak" + fmt.Println("Saving a copy of current settings to " + backConfigFile) + err := file.SafeFileRotate(backConfigFile, configFile) + if err != nil { + return false, errors.Wrap(err, "creating a backup copy of current settings") + } + + // create the new ones: + f, err := os.OpenFile(configFile, os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0600) + if err != nil { + return false, errors.Wrap(err, "opening settings file") + } + defer f.Close() + + if err := config.OverwriteConfigFile(f, beat.Beat.Info.Beat); err != nil { + return false, errors.Wrap(err, "overriding settings file") + } + } + + return true, nil +} + +func storeAccessToken(beat *instance.Beat, accessToken string) error { + keystore := beat.Keystore() + if !keystore.IsPersisted() { + if err := keystore.Create(false); err != nil { + return errors.Wrap(err, "error creating keystore") + } + } + + if err := keystore.Store(accessTokenKey, []byte(accessToken)); err != nil { + return errors.Wrap(err, "error storing the access token") + } + + return keystore.Save() +} + +func confirmConfigOverwrite(force bool) (bool, error) { + if force { + return true, nil + } + + return cli.Confirm("This will replace your current settings. Do you want to continue?", true) +} diff --git a/vendor/github.com/elastic/beats/x-pack/libbeat/management/manager.go b/vendor/github.com/elastic/beats/x-pack/libbeat/management/manager.go new file mode 100644 index 00000000000..81aff95bc5d --- /dev/null +++ b/vendor/github.com/elastic/beats/x-pack/libbeat/management/manager.go @@ -0,0 +1,274 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package management + +import ( + "fmt" + "sync" + "time" + + "github.com/elastic/beats/libbeat/common/reload" + + "github.com/gofrs/uuid" + + "github.com/pkg/errors" + + "github.com/elastic/beats/libbeat/common/cfgwarn" + "github.com/elastic/beats/libbeat/feature" + "github.com/elastic/beats/libbeat/logp" + "github.com/elastic/beats/x-pack/libbeat/management/api" + + "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/libbeat/management" +) + +func init() { + management.Register("x-pack", NewConfigManager, feature.Beta) +} + +// ConfigManager handles internal config updates. By retrieving +// new configs from Kibana and applying them to the Beat +type ConfigManager struct { + config *Config + cache *Cache + logger *logp.Logger + client *api.Client + beatUUID uuid.UUID + done chan struct{} + registry *reload.Registry + wg sync.WaitGroup + blacklist *ConfigBlacklist +} + +// NewConfigManager returns a X-Pack Beats Central Management manager +func NewConfigManager(config *common.Config, registry *reload.Registry, beatUUID uuid.UUID) (management.ConfigManager, error) { + c := defaultConfig() + if config != nil { + if err := config.Unpack(&c); err != nil { + return nil, errors.Wrap(err, "parsing central management settings") + } + } + return NewConfigManagerWithConfig(c, registry, beatUUID) +} + +// NewConfigManagerWithConfig returns a X-Pack Beats Central Management manager +func NewConfigManagerWithConfig(c *Config, registry *reload.Registry, beatUUID uuid.UUID) (management.ConfigManager, error) { + var client *api.Client + var cache *Cache + var blacklist *ConfigBlacklist + + if c.Enabled { + var err error + + // Initialize configs blacklist + blacklist, err = NewConfigBlacklist(c.Blacklist) + if err != nil { + return nil, errors.Wrap(err, "wrong settings for configurations blacklist") + } + + // Initialize central management settings cache + cache = &Cache{ + ConfigOK: true, + } + if err := cache.Load(); err != nil { + return nil, errors.Wrap(err, "reading central management internal cache") + } + + // Ignore kibana version to avoid permission errors + c.Kibana.IgnoreVersion = true + + client, err = api.NewClient(c.Kibana) + if err != nil { + return nil, errors.Wrap(err, "initializing kibana client") + } + + } + + return &ConfigManager{ + config: c, + cache: cache, + blacklist: blacklist, + logger: logp.NewLogger(management.DebugK), + client: client, + done: make(chan struct{}), + beatUUID: beatUUID, + registry: registry, + }, nil +} + +// Enabled returns true if config management is enabled +func (cm *ConfigManager) Enabled() bool { + return cm.config.Enabled +} + +// Start the config manager +func (cm *ConfigManager) Start() { + if !cm.Enabled() { + return + } + cfgwarn.Beta("Central management is enabled") + cm.logger.Info("Starting central management service") + + cm.wg.Add(1) + go cm.worker() +} + +// Stop the config manager +func (cm *ConfigManager) Stop() { + if !cm.Enabled() { + return + } + cm.logger.Info("Stopping central management service") + close(cm.done) + cm.wg.Wait() +} + +// CheckRawConfig check settings are correct to start the beat. This method +// checks there are no collision between the existing configuration and what +// central management can configure. +func (cm *ConfigManager) CheckRawConfig(cfg *common.Config) error { + // TODO implement this method + return nil +} + +func (cm *ConfigManager) worker() { + defer cm.wg.Done() + + // Initial fetch && apply (even if errors happen while fetching) + firstRun := true + period := 0 * time.Second + + // Start worker loop: fetch + apply + cache new settings + for { + select { + case <-cm.done: + return + case <-time.After(period): + } + + changed := cm.fetch() + if changed || firstRun { + // configs changed, apply changes + // TODO only reload the blocks that changed + cm.apply() + } + + if changed { + // store new configs (already applied) + cm.logger.Info("Storing new state") + if err := cm.cache.Save(); err != nil { + cm.logger.Errorf("error storing central management state: %s", err) + } + } + + if firstRun { + period = cm.config.Period + firstRun = false + } + } +} + +// fetch configurations from kibana, return true if they changed +func (cm *ConfigManager) fetch() bool { + cm.logger.Debug("Retrieving new configurations from Kibana") + configs, err := cm.client.Configuration(cm.config.AccessToken, cm.beatUUID, cm.cache.ConfigOK) + if err != nil { + cm.logger.Errorf("error retriving new configurations, will use cached ones: %s", err) + return false + } + + if api.ConfigBlocksEqual(configs, cm.cache.Configs) { + cm.logger.Debug("configuration didn't change, sleeping") + return false + } + + cm.logger.Info("New configurations retrieved") + cm.cache.Configs = configs + + return true +} + +func (cm *ConfigManager) apply() { + configOK := true + + missing := map[string]bool{} + for _, name := range cm.registry.GetRegisteredNames() { + missing[name] = true + } + + // Filter unwanted configs from the list + errors := cm.blacklist.Filter(cm.cache.Configs) + if errors != nil { + cm.logger.Error(errors) + return + } + + // Reload configs + for _, b := range cm.cache.Configs { + err := cm.reload(b.Type, b.Blocks) + configOK = configOK && err == nil + missing[b.Type] = false + } + + // Unset missing configs + for name := range missing { + if missing[name] { + cm.reload(name, []*api.ConfigBlock{}) + } + } + + if !configOK { + cm.logger.Info("Failed to apply settings, reporting error on next fetch") + } + + // Update configOK flag with the result of this apply + cm.cache.ConfigOK = configOK +} + +func (cm *ConfigManager) reload(t string, blocks []*api.ConfigBlock) error { + cm.logger.Infof("Applying settings for %s", t) + + if obj := cm.registry.GetReloadable(t); obj != nil { + // Single object + if len(blocks) > 1 { + err := fmt.Errorf("got an invalid number of configs for %s: %d, expected: 1", t, len(blocks)) + cm.logger.Error(err) + return err + } + + var config *reload.ConfigWithMeta + var err error + if len(blocks) == 1 { + config, err = blocks[0].ConfigWithMeta() + if err != nil { + cm.logger.Error(err) + return err + } + } + + if err := obj.Reload(config); err != nil { + cm.logger.Error(err) + return err + } + } else if obj := cm.registry.GetReloadableList(t); obj != nil { + // List + var configs []*reload.ConfigWithMeta + for _, block := range blocks { + config, err := block.ConfigWithMeta() + if err != nil { + cm.logger.Error(err) + continue + } + configs = append(configs, config) + } + + if err := obj.Reload(configs); err != nil { + cm.logger.Error(err) + return err + } + } + + return nil +} diff --git a/vendor/vendor.json b/vendor/vendor.json index 6fca6c74aa7..cf712a750f0 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -6,253 +6,253 @@ "checksumSHA1": "AzjRkOQtVBTwIw4RJLTygFhJs3s=", "origin": "github.com/elastic/beats/vendor/github.com/Microsoft/go-winio", "path": "github.com/Microsoft/go-winio", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "xtc8w70mCuQvuQBNGR4L2uFFacg=", "origin": "github.com/elastic/beats/vendor/github.com/Shopify/sarama", "path": "github.com/Shopify/sarama", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "DYv6Q1+VfnUVxMwvk5IshAClLvw=", "origin": "github.com/elastic/beats/vendor/github.com/Sirupsen/logrus", "path": "github.com/Sirupsen/logrus", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Te1xRugxHQMAg7EvbIUuPWm8fvU=", "origin": "github.com/elastic/beats/vendor/github.com/StackExchange/wmi", "path": "github.com/StackExchange/wmi", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "dvabztWVQX8f6oMLRyv4dLH+TGY=", "origin": "github.com/elastic/beats/vendor/github.com/davecgh/go-spew/spew", "path": "github.com/davecgh/go-spew/spew", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Gj+xR1VgFKKmFXYOJMnAczC3Znk=", "origin": "github.com/elastic/beats/vendor/github.com/docker/distribution/digestset", "path": "github.com/docker/distribution/digestset", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "2Fe4D6PGaVE2he4fUeenLmhC1lE=", "origin": "github.com/elastic/beats/vendor/github.com/docker/distribution/reference", "path": "github.com/docker/distribution/reference", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "UL2NF1EGiSsQoEfvycnuZIcUbZY=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/api", "path": "github.com/docker/docker/api", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "KMFpbV3mlrbc41d2DYnq05QYpSc=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/api/types", "path": "github.com/docker/docker/api/types", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "jVJDbe0IcyjoKc2xbohwzQr+FF0=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/api/types/blkiodev", "path": "github.com/docker/docker/api/types/blkiodev", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "AeSC0BOu1uapkGqfSXtfVSpwJzs=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/api/types/container", "path": "github.com/docker/docker/api/types/container", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "4XuWn5+wgYwUsw604jvYMklq4Hc=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/api/types/events", "path": "github.com/docker/docker/api/types/events", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "J2OKngfI3vgswudr9PZVUFcRRu0=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/api/types/filters", "path": "github.com/docker/docker/api/types/filters", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "yeB781yxPhnN6OXQ9/qSsyih3ek=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/api/types/image", "path": "github.com/docker/docker/api/types/image", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "UK+VdM648oWzyqE4OqttgmPqjoA=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/api/types/mount", "path": "github.com/docker/docker/api/types/mount", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Gskp+nvbVe8Gk1xPLHylZvNmqTg=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/api/types/network", "path": "github.com/docker/docker/api/types/network", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "r2vWq7Uc3ExKzMqYgH0b4AKjLKY=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/api/types/registry", "path": "github.com/docker/docker/api/types/registry", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "VTxWyFud/RedrpllGdQonVtGM/A=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/api/types/strslice", "path": "github.com/docker/docker/api/types/strslice", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "ZaizCpJ3eBcfR9ywpLaJd4AhM9k=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/api/types/swarm", "path": "github.com/docker/docker/api/types/swarm", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "B7ZwKzrv3t3Vlox6/bYMHhMjsM8=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/api/types/time", "path": "github.com/docker/docker/api/types/time", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "uDPQ3nHsrvGQc9tg/J9OSC4N5dQ=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/api/types/versions", "path": "github.com/docker/docker/api/types/versions", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "IBJy2zPEnYmcFJ3lM1eiRWnCxTA=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/api/types/volume", "path": "github.com/docker/docker/api/types/volume", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "c6OyeEvpQDvVLhrJSxgjEZv1tF8=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/client", "path": "github.com/docker/docker/client", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "jmo/t2zXAxirEPoFucNPXA/1SEc=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/pkg/ioutils", "path": "github.com/docker/docker/pkg/ioutils", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "ndnAFCfsGC3upNQ6jAEwzxcurww=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/pkg/longpath", "path": "github.com/docker/docker/pkg/longpath", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "kr46EAa+FsUcWxOq6edyX6BUzE4=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/pkg/system", "path": "github.com/docker/docker/pkg/system", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "8I0Ez+aUYGpsDEVZ8wN/Ztf6Zqs=", "origin": "github.com/elastic/beats/vendor/github.com/docker/docker/pkg/tlsconfig", "path": "github.com/docker/docker/pkg/tlsconfig", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "JbiWTzH699Sqz25XmDlsARpMN9w=", "origin": "github.com/elastic/beats/vendor/github.com/docker/go-connections/nat", "path": "github.com/docker/go-connections/nat", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "jUfDG3VQsA2UZHvvIXncgiddpYA=", "origin": "github.com/elastic/beats/vendor/github.com/docker/go-connections/sockets", "path": "github.com/docker/go-connections/sockets", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "tuSzlS1UQ03+5Fvtqr5hI5sLLhA=", "origin": "github.com/elastic/beats/vendor/github.com/docker/go-connections/tlsconfig", "path": "github.com/docker/go-connections/tlsconfig", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "ambe8F4AofPxChCJssXXwWphQQ8=", "origin": "github.com/elastic/beats/vendor/github.com/docker/go-units", "path": "github.com/docker/go-units", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "sNAU9ojYVUhO6dVXey6T3JhRQpw=", "origin": "github.com/elastic/beats/vendor/github.com/docker/libtrust", "path": "github.com/docker/libtrust", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "rhLUtXvcmouYuBwOq9X/nYKzvNg=", "origin": "github.com/elastic/beats/vendor/github.com/dustin/go-humanize", "path": "github.com/dustin/go-humanize", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "y2Kh4iPlgCPXSGTCcFpzePYdzzg=", "origin": "github.com/elastic/beats/vendor/github.com/eapache/go-resiliency/breaker", "path": "github.com/eapache/go-resiliency/breaker", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "WHl96RVZlOOdF4Lb1OOadMpw8ls=", "origin": "github.com/elastic/beats/vendor/github.com/eapache/go-xerial-snappy", "path": "github.com/eapache/go-xerial-snappy", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "oCCs6kDanizatplM5e/hX76busE=", "origin": "github.com/elastic/beats/vendor/github.com/eapache/queue", "path": "github.com/eapache/queue", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Gzuf7VIvfGHNJjz3F75GhGOEvP0=", @@ -367,18 +367,18 @@ "versionExact": "v0.5.1" }, { - "checksumSHA1": "tgR+aWqyz4pRy4lxQG0bIyjQajI=", + "checksumSHA1": "i31WADUrKq53g6MNEGhF40s0Yys=", "path": "github.com/elastic/beats/dev-tools/mage", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "PBTxyr6OotF2pda9n8gMeGUkfLA=", "path": "github.com/elastic/beats/filebeat/generator", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, @@ -393,752 +393,776 @@ { "checksumSHA1": "y34pfVnTprxa4BvLKfiBbqTJaGA=", "path": "github.com/elastic/beats/libbeat/api", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "q0f/UbM5Yzp9FCEcirO8T16PIVU=", "path": "github.com/elastic/beats/libbeat/asset", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "OOgoVXWHRzkMd/wR/4kVHPUcjeo=", "path": "github.com/elastic/beats/libbeat/autodiscover", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "pW/XBpb2BIceplyuoqvwTtowH7c=", "path": "github.com/elastic/beats/libbeat/autodiscover/builder", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "IifZH9hzzPymGV2XQfQ/tFR4uSE=", "path": "github.com/elastic/beats/libbeat/autodiscover/meta", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "qa5L8m7V3k+IDBxSXm28wbZt0m0=", "path": "github.com/elastic/beats/libbeat/autodiscover/providers/docker", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "yC2xrFmXgRHXMBuwui68Npbu+kE=", "path": "github.com/elastic/beats/libbeat/autodiscover/providers/jolokia", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "W42L3gTFnIDgUmDWuzNNHBMTp/g=", "path": "github.com/elastic/beats/libbeat/autodiscover/providers/kubernetes", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "eaKz8KWZXYHpLvBCIRN3V8J7G18=", "path": "github.com/elastic/beats/libbeat/autodiscover/template", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "nlMgHz3B0rUKvGL6UMkyGUMUdwk=", "path": "github.com/elastic/beats/libbeat/beat", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "on1AvBp8HIr6d+LHAc2J00kYmNk=", "path": "github.com/elastic/beats/libbeat/cfgfile", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "/IuTlhYU7mcJKhOHniR06bWGnxg=", "path": "github.com/elastic/beats/libbeat/cloudid", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { - "checksumSHA1": "uhwj8agpAPaQnorWficl+oIAYxw=", + "checksumSHA1": "ec1+6SblhtM39DdlqZ/x7TojGKw=", "path": "github.com/elastic/beats/libbeat/cmd", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { - "checksumSHA1": "rGxq5xpQKDT1B1cwg/BiX1g7tIk=", + "checksumSHA1": "UevBsvMHLoB5FLXkdGTZSjzzt4A=", "path": "github.com/elastic/beats/libbeat/cmd/export", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { - "checksumSHA1": "+famwDu8VxKh39kSVpOus/IRuwE=", + "checksumSHA1": "gCb4RclqXEgpf5MRfpEpGHBj77c=", "path": "github.com/elastic/beats/libbeat/cmd/instance", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "TGW7SUpyY5XCLRjLW2n62yDKqBk=", "path": "github.com/elastic/beats/libbeat/cmd/test", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "pi7gMScKSU95ygSkYFsdJPErO/Y=", "path": "github.com/elastic/beats/libbeat/common", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "lFYRu/M9CL6/povZOeBYui9/laI=", "path": "github.com/elastic/beats/libbeat/common/atomic", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "Fxbw/7lPbh9dY3HH5k8sc4PU6Yo=", "path": "github.com/elastic/beats/libbeat/common/bus", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "zRpP/UzB/wFQNLceGdVgC4QqviM=", "path": "github.com/elastic/beats/libbeat/common/cfgtype", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "d0pIynyart5HMe7IKw3wtIH2R48=", "path": "github.com/elastic/beats/libbeat/common/cfgwarn", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "/mBln/rCzmDjCB/4p16fSapi3BY=", "path": "github.com/elastic/beats/libbeat/common/cli", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "Ps5fuDikiF/KR7BeQqRkIztHxVY=", "path": "github.com/elastic/beats/libbeat/common/docker", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "Gxdi0z5FpIG68TQBD+zho4pEBlU=", "path": "github.com/elastic/beats/libbeat/common/dtfmt", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "YL9BcbDLwux/K10D2uXPpZHSU8E=", "path": "github.com/elastic/beats/libbeat/common/file", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "pt4OCbyb9z7fgJEidmOx6mua0h8=", "path": "github.com/elastic/beats/libbeat/common/fmtstr", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "K8hsg9OHpVHm7A43uq+TdX5DRc4=", "path": "github.com/elastic/beats/libbeat/common/jsontransform", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "IUy7SaiQLG2N7awyTi+KIxSa2/Y=", "path": "github.com/elastic/beats/libbeat/common/kafka", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "A5rheQIdXg5C5m+qlJKsdnDSiFU=", "path": "github.com/elastic/beats/libbeat/common/kubernetes", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "tX/nsD/KEE0KCWECoPyx5CHNPdc=", "path": "github.com/elastic/beats/libbeat/common/match", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "t6Ww0oDbdOkUF9TRIk70q7XYbic=", "path": "github.com/elastic/beats/libbeat/common/reload", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "uMo9yaQAFfFG9iOsmdhQokffvpc=", "path": "github.com/elastic/beats/libbeat/common/safemapstr", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "719FzIxi7bvpmh3Z1Ugn1VzY7Ro=", "path": "github.com/elastic/beats/libbeat/common/schema", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "uffmniMUvoDPoH/udr7ogkh062E=", "path": "github.com/elastic/beats/libbeat/common/schema/mapstriface", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "7AAflfE+cNTNalC2Iwq2vOhgMGI=", "path": "github.com/elastic/beats/libbeat/common/seccomp", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "idXNC65t9dEVukD08AM6/L2p/RE=", "path": "github.com/elastic/beats/libbeat/common/streambuf", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "IQGJeUodp0fl4Zy8W1rBzWtWSWA=", "path": "github.com/elastic/beats/libbeat/common/terminal", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "ODPRKH/GaduyvOJE5v/Kkfz61nQ=", "path": "github.com/elastic/beats/libbeat/common/transport/tlscommon", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "E50QfAprh0Wnfcwcj270Fd0LDwk=", "path": "github.com/elastic/beats/libbeat/conditions", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "f9GUDX5swkqSdMAQPfOZBesIsgs=", "path": "github.com/elastic/beats/libbeat/dashboards", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "Tn+4O4FlSxSOxGF9qkH363wQCtA=", "path": "github.com/elastic/beats/libbeat/feature", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { - "checksumSHA1": "y+fM5yqH15WrSUYqBUfGpmWxTYs=", + "checksumSHA1": "QGYddx9E5UPPyl0QeFxnt/956wM=", "path": "github.com/elastic/beats/libbeat/generator/fields", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "oCxiX/n/vxFGtjEN7kEHI6zjTzc=", "path": "github.com/elastic/beats/libbeat/keystore", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { - "checksumSHA1": "VvMdNTDjrWVgG7psFc7fF6l8aW8=", + "checksumSHA1": "qEtgVpRux/5eFKu54kWWUTBUjdw=", "path": "github.com/elastic/beats/libbeat/kibana", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "M9mSRhP65Jnf/yk2qtZU6FM9OUw=", "path": "github.com/elastic/beats/libbeat/logp", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "bM+Zvy63NmXBfPQZYZmWBCo/UIk=", "path": "github.com/elastic/beats/libbeat/logp/configure", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "F/nzOXIrS9ui9wBLhuYa6M0fDEw=", "path": "github.com/elastic/beats/libbeat/management", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "/qNmzEvnTPNTKsZG8NgDzJZ+6f8=", "path": "github.com/elastic/beats/libbeat/metric/system/cpu", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { - "checksumSHA1": "58SKUzx3J1xqGQVwhWosExYQxYQ=", + "checksumSHA1": "2cKcYUGYn9pOpQgo7yjAZebBLkk=", "path": "github.com/elastic/beats/libbeat/metric/system/host", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { - "checksumSHA1": "AeCEL+vyIBE0WH16IaR4ygy+6IA=", + "checksumSHA1": "lXmDdjbZAQJWerhniNifgiD+Fgs=", "path": "github.com/elastic/beats/libbeat/metric/system/memory", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "rKh4Kc2nLHGP/l9XUQuYwLFZ2sk=", "path": "github.com/elastic/beats/libbeat/metric/system/process", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "JaqeGyZo3TRATCeVaKSZ9+K+O5E=", "path": "github.com/elastic/beats/libbeat/monitoring", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "F5IrP0kPaBMWp0NkeET2M10gRMQ=", "path": "github.com/elastic/beats/libbeat/monitoring/adapter", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "8rqXWL9EN+JXokIj4mNhd7GKXNY=", "path": "github.com/elastic/beats/libbeat/monitoring/report", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "6ziW29O9rkH/yYdkDYnRfpqL0Yk=", "path": "github.com/elastic/beats/libbeat/monitoring/report/elasticsearch", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "FJhQn6mS1pcNkFLFjFPulLZjC9w=", "path": "github.com/elastic/beats/libbeat/monitoring/report/log", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "FZaXmupAGOg8vf8rAMrLYAgbLMA=", "path": "github.com/elastic/beats/libbeat/outputs", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "CsWdZfYNuwBA2/RhAybzEf93qq4=", "path": "github.com/elastic/beats/libbeat/outputs/codec", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "dO9pXcIpo6PH5yxMbJUSb/BYbkc=", "path": "github.com/elastic/beats/libbeat/outputs/codec/format", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "i2d3BQjYIR1zQAQ4CpybU33y9kQ=", "path": "github.com/elastic/beats/libbeat/outputs/codec/json", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "wPfUoEHJoJmdt4p+GDR3cRRh32Q=", "path": "github.com/elastic/beats/libbeat/outputs/console", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "XdwopbTsKSiDM8x8K60VC5J+lVA=", "path": "github.com/elastic/beats/libbeat/outputs/elasticsearch", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "OMBMu8h0ji4xQwmv7ifk0wIefek=", "path": "github.com/elastic/beats/libbeat/outputs/fileout", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "EaH7PayqnRdJUmktczmJtjWZWds=", "path": "github.com/elastic/beats/libbeat/outputs/kafka", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "IVwYXvCEiyfqN+O/bpbG0OVzxF8=", "path": "github.com/elastic/beats/libbeat/outputs/logstash", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "NJv+STaa3bEOeVra8WkEgOtzQic=", "path": "github.com/elastic/beats/libbeat/outputs/outil", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "YNn7Zso2lmcE3evgBDbCd1p4k1A=", "path": "github.com/elastic/beats/libbeat/outputs/redis", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "ThEQrqa9WEUapIawwzyIvVZjnXQ=", "path": "github.com/elastic/beats/libbeat/outputs/transport", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "qPVudVlj4dE+HHMe4WGlaf4mFCo=", "path": "github.com/elastic/beats/libbeat/outputs/transport/transptest", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "hb8M4qSLzgDXpQmdQfEyB7aChhI=", "path": "github.com/elastic/beats/libbeat/paths", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "OVd5zDYdT/3QK2zj1M+BMPP0AIo=", "path": "github.com/elastic/beats/libbeat/plugin", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "lhUKTNKAJqUl7dgyZN8En9B2Vnw=", "path": "github.com/elastic/beats/libbeat/processors", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "IYLNfiWN8aRJYFfwtZ8Ou/Teo4k=", "path": "github.com/elastic/beats/libbeat/processors/actions", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "kqLhGMINNaYM8cFZz+In7NAhZTM=", "path": "github.com/elastic/beats/libbeat/processors/add_cloud_metadata", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "pExveUs4ztPZsGTsCHXyHhi2bXc=", "path": "github.com/elastic/beats/libbeat/processors/add_docker_metadata", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { - "checksumSHA1": "8BC7i1Fm1cmQ9RqS3YGBzIHRlJ8=", + "checksumSHA1": "D2Yejk+SmpHlBvOTJYyIday616c=", "path": "github.com/elastic/beats/libbeat/processors/add_host_metadata", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "PGsBuH7EkCUdOTdnZIePSemWT9A=", "path": "github.com/elastic/beats/libbeat/processors/add_kubernetes_metadata", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "Gq+gEFL9CgrhQZOMYj0tfvyNIZs=", "path": "github.com/elastic/beats/libbeat/processors/add_locale", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "DBwVa3qeDITixLDliPsRVDOOWpo=", "path": "github.com/elastic/beats/libbeat/processors/add_process_metadata", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "tDlkiqQL3vTTh8jLS1JBwhZMC7o=", "path": "github.com/elastic/beats/libbeat/processors/dissect", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "6YfWrbwMSQ7clCDTVFK3afNai3o=", "path": "github.com/elastic/beats/libbeat/processors/dns", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "7kYMLJJXmsDd9GyXgq9Z9eJdqrk=", "path": "github.com/elastic/beats/libbeat/publisher", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "3lRU4d8X4NyPiCAml4LjDm3o928=", "path": "github.com/elastic/beats/libbeat/publisher/includes", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { - "checksumSHA1": "G9ZQoP29Ydb4ul9mL6VsULefG+c=", + "checksumSHA1": "QANVCdALWeLQnB47/oNmuicu0B8=", "path": "github.com/elastic/beats/libbeat/publisher/pipeline", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "RaONy2th8fDi9BF5U+lYu5bto4Y=", "path": "github.com/elastic/beats/libbeat/publisher/queue", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "ZUwitg43Gan3j0V+ZjM+5Y/ibb8=", "path": "github.com/elastic/beats/libbeat/publisher/queue/memqueue", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "MsDBerW6GVdoNOH9yVNFIuB4V5c=", "path": "github.com/elastic/beats/libbeat/publisher/queue/spool", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "fZ5S9LEZUcy5JlhwpHBn4MGNjOg=", "path": "github.com/elastic/beats/libbeat/publisher/testing", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "vZZFb4M2d2t7tG3n2UEQeTk/lEM=", "path": "github.com/elastic/beats/libbeat/scripts/cmd/global_fields", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "/645Ga6dGiQjHQIBSct5CYaRoj8=", "path": "github.com/elastic/beats/libbeat/service", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "UqtVhuJ8k2splUV2AOE0uADSa54=", "path": "github.com/elastic/beats/libbeat/template", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "Ifly/yeBS+Ok0/PKez4lSqzu8JI=", "path": "github.com/elastic/beats/libbeat/testing", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "+0zBIGqXGbgm86imWcTq9kQyTgw=", "path": "github.com/elastic/beats/libbeat/version", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, { "checksumSHA1": "YRKEeQXsNj81zjG9gpkCyVpLKJs=", "path": "github.com/elastic/beats/licenses", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", + "version": "master", + "versionExact": "master" + }, + { + "checksumSHA1": "lfgOq9q3kd8U+SB9ig3GfKfM84s=", + "path": "github.com/elastic/beats/x-pack/libbeat/cmd", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", + "version": "master", + "versionExact": "master" + }, + { + "checksumSHA1": "p+sjxNvn8wHtM7NDn57Web6uhJw=", + "path": "github.com/elastic/beats/x-pack/libbeat/management", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", + "version": "master", + "versionExact": "master" + }, + { + "checksumSHA1": "MJduc3Yy4pLA5dDRYeyjquBTEI4=", + "path": "github.com/elastic/beats/x-pack/libbeat/management/api", + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z", "version": "master", "versionExact": "master" }, @@ -1146,498 +1170,498 @@ "checksumSHA1": "3jizmlZPCyo6FAZY8Trk9jA8NH4=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-lumber/client/v2", "path": "github.com/elastic/go-lumber/client/v2", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "m6HLKpDAZlkTTQMqabf3aT6TQ/s=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-lumber/protocol/v2", "path": "github.com/elastic/go-lumber/protocol/v2", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "TatpgVf9fhQp1GtNwSyNw5cgVKM=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-seccomp-bpf", "path": "github.com/elastic/go-seccomp-bpf", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "qTs7QT+GC2Dr4aFoLFHCkAOoVeU=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-seccomp-bpf/arch", "path": "github.com/elastic/go-seccomp-bpf/arch", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "W459MQNQ8qF6qmzLO/QLevTKZlU=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-structform", "path": "github.com/elastic/go-structform", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "BnoVvQlbw1jk1oveTVQtG+dhGRs=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-structform/cborl", "path": "github.com/elastic/go-structform/cborl", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "xjEIhANt0tAq4FjndVCLQhCXkQo=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-structform/gotype", "path": "github.com/elastic/go-structform/gotype", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "BIRSw/+jqs6VTgRx4MXJy453oGQ=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-structform/internal/unsafe", "path": "github.com/elastic/go-structform/internal/unsafe", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "VPkz0hvtlbDDObJJZoTrjF2CN68=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-structform/json", "path": "github.com/elastic/go-structform/json", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "zRLY43OHR3VYw3fu3XznhxziC4E=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-structform/ubjson", "path": "github.com/elastic/go-structform/ubjson", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "QC8/6yQsm4f+zZo14ExnFtyiaXk=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-structform/visitors", "path": "github.com/elastic/go-structform/visitors", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "QhFIpuHPaV6hKejKcc2wm6y4MSQ=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-sysinfo", "path": "github.com/elastic/go-sysinfo", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "GiZCjX17K265TtamGZZw4R2Jwbk=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-sysinfo/internal/registry", "path": "github.com/elastic/go-sysinfo/internal/registry", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "432ecsMRmLpy5OvXMhQE/k9KWLQ=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-sysinfo/providers/darwin", "path": "github.com/elastic/go-sysinfo/providers/darwin", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "1eCL0MsvmiyjNvh0tcnnR4rmcWk=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-sysinfo/providers/linux", "path": "github.com/elastic/go-sysinfo/providers/linux", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "RWLvcP1w9ynKbuCqiW6prwd+EDU=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-sysinfo/providers/shared", "path": "github.com/elastic/go-sysinfo/providers/shared", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "lWVD4w1xiAkFZgQPZAYz+fTZsrU=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-sysinfo/providers/windows", "path": "github.com/elastic/go-sysinfo/providers/windows", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "tIqFxnZi9XvC70dMoZDSoUtEVQY=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-sysinfo/types", "path": "github.com/elastic/go-sysinfo/types", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "tNszmkpuJYZMX8l8rlnvBDtoc1M=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-txfile", "path": "github.com/elastic/go-txfile", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "re2W5hqGml/Q8vnx+DT3ooUNWxo=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-txfile/internal/cleanup", "path": "github.com/elastic/go-txfile/internal/cleanup", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "HjNNDapvfXgOJqs7l7pS3ho6SSI=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-txfile/internal/invariant", "path": "github.com/elastic/go-txfile/internal/invariant", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "HLMF+V6Pt3YLUNOgmd2nR+vz9vM=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-txfile/internal/iter", "path": "github.com/elastic/go-txfile/internal/iter", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "EAIqvdq5S3FNBoTBAI/U02AwTSU=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-txfile/internal/strbld", "path": "github.com/elastic/go-txfile/internal/strbld", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "lejstOrGPfa+tJohvIOK/AjdLa4=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-txfile/internal/vfs", "path": "github.com/elastic/go-txfile/internal/vfs", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Wqp2VCpbcmfOFuZJrYkaxpvQQrE=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-txfile/internal/vfs/osfs", "path": "github.com/elastic/go-txfile/internal/vfs/osfs", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "NO6sRhSBLtJxWPpTvwWEqSQh65I=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-txfile/pq", "path": "github.com/elastic/go-txfile/pq", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "fCx++6A9uzyCsDUanAIJb77u0MI=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-txfile/txerr", "path": "github.com/elastic/go-txfile/txerr", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Yb61Nqnh+3igFci61hv9WYgk/hc=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-ucfg", "path": "github.com/elastic/go-ucfg", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "X+R/CD8SokJrmlxFTx2nSevRDhQ=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-ucfg/cfgutil", "path": "github.com/elastic/go-ucfg/cfgutil", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "zC8mCPW/pPPNcuHQOc/B/Ej1W1U=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-ucfg/flag", "path": "github.com/elastic/go-ucfg/flag", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "esXpiQlEvTOUwsE0nNesso8albo=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-ucfg/internal/parse", "path": "github.com/elastic/go-ucfg/internal/parse", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "5mXUhhlPdvcAFKiQENInTJWrtQM=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-ucfg/json", "path": "github.com/elastic/go-ucfg/json", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Bg6vistPQLftv2fEYB7GWwSExv8=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-ucfg/yaml", "path": "github.com/elastic/go-ucfg/yaml", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "rnd3qf1FE22X3MxXWbetqq6EoBk=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/go-windows", "path": "github.com/elastic/go-windows", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "RPOLNUpw00QUUaA/U4YbPVf6WlA=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/gosigar", "path": "github.com/elastic/gosigar", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "TX9y4oPL5YmT4Gb/OU4GIPTdQB4=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/gosigar/cgroup", "path": "github.com/elastic/gosigar/cgroup", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "hPqGM3DENaGfipEODoyZ4mKogTQ=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/gosigar/sys", "path": "github.com/elastic/gosigar/sys", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "mLq5lOyD0ZU39ysXuf1ETOLJ+f0=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/gosigar/sys/linux", "path": "github.com/elastic/gosigar/sys/linux", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "qDsgp2kAeI9nhj565HUScaUyjU4=", "origin": "github.com/elastic/beats/vendor/github.com/elastic/gosigar/sys/windows", "path": "github.com/elastic/gosigar/sys/windows", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Klc34HULvwvY4cGA/D8HmqtXLqw=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s", "path": "github.com/ericchiang/k8s", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "y8fNiBLSoGojnUsGDsdLlsJYyqQ=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/apiextensions/v1beta1", "path": "github.com/ericchiang/k8s/apis/apiextensions/v1beta1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "JxQ/zEWQSrncYNKifCuMctq+Tsw=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/apps/v1beta1", "path": "github.com/ericchiang/k8s/apis/apps/v1beta1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "bjklGt/pc6kWOZewAw87Hchw5oY=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/authentication/v1", "path": "github.com/ericchiang/k8s/apis/authentication/v1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "LExhnM9Vn0LQoLQWszQ7aIxDxb4=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/authentication/v1beta1", "path": "github.com/ericchiang/k8s/apis/authentication/v1beta1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "GM+PzOiBoq3cxx4h5RKVUb3UH60=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/authorization/v1", "path": "github.com/ericchiang/k8s/apis/authorization/v1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "zfr5oUVjbWRfvXi2LJiGMfFeDQY=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/authorization/v1beta1", "path": "github.com/ericchiang/k8s/apis/authorization/v1beta1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "izkXNDp5a5WP45jU0hSfTrwyfvM=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/autoscaling/v1", "path": "github.com/ericchiang/k8s/apis/autoscaling/v1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "FryZuAxWn4Ig8zc913w9BdfYzvs=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/batch/v1", "path": "github.com/ericchiang/k8s/apis/batch/v1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "ylo7Z8wyJD+tmICB7wsOVIBpO+U=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/batch/v2alpha1", "path": "github.com/ericchiang/k8s/apis/batch/v2alpha1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "+d8+mSdkdcPWQIpczXDZZW0lrjg=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/certificates/v1beta1", "path": "github.com/ericchiang/k8s/apis/certificates/v1beta1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "S7AvxmCe/+WoFP/v9lZr0Mv66qg=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/core/v1", "path": "github.com/ericchiang/k8s/apis/core/v1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "cWPoP6XZN7WMnEVMPcgPgg3Aw9Q=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/extensions/v1beta1", "path": "github.com/ericchiang/k8s/apis/extensions/v1beta1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "vaNrBPcGWeDd1rXl8+uN08uxWhE=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/imagepolicy/v1alpha1", "path": "github.com/ericchiang/k8s/apis/imagepolicy/v1alpha1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "UNTTH+Ppu4vImnF+bPkG3/NR3gg=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/meta/v1", "path": "github.com/ericchiang/k8s/apis/meta/v1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Mmyg9Wh+FCVR6fV8MGEKRxvqZ2k=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/policy/v1beta1", "path": "github.com/ericchiang/k8s/apis/policy/v1beta1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "bvwYS/wrBkyAfvCjzMbi/vKamrQ=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/rbac/v1alpha1", "path": "github.com/ericchiang/k8s/apis/rbac/v1alpha1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "m1Tde18NwewnvJoOYL3uykNcBuM=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/rbac/v1beta1", "path": "github.com/ericchiang/k8s/apis/rbac/v1beta1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "JirJkoeIkWJRNrbprsQvqwisxds=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/resource", "path": "github.com/ericchiang/k8s/apis/resource", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "rQZ69PjEClQQ+PGEHRKzkGVVQyw=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/settings/v1alpha1", "path": "github.com/ericchiang/k8s/apis/settings/v1alpha1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "pp0AetmPoKy7Rz0zNhBwUpExkbc=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/storage/v1", "path": "github.com/ericchiang/k8s/apis/storage/v1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "WeACcIrS4EkeBm8TTftwuVniaWk=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/apis/storage/v1beta1", "path": "github.com/ericchiang/k8s/apis/storage/v1beta1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Su6wSR8V8HL2QZsF8icJ0R9AFq8=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/runtime", "path": "github.com/ericchiang/k8s/runtime", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "8ETrRvIaXPfD21N7fa8kdbumL00=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/runtime/schema", "path": "github.com/ericchiang/k8s/runtime/schema", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "cMk3HE8/81ExHuEs0F5sZCclOFs=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/util/intstr", "path": "github.com/ericchiang/k8s/util/intstr", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "fobEKiMk5D7IGvCSwh4HdG1o98c=", "origin": "github.com/elastic/beats/vendor/github.com/ericchiang/k8s/watch/versioned", "path": "github.com/ericchiang/k8s/watch/versioned", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "AANTVr9CVVyzsgviODY6Wi2thuM=", "origin": "github.com/elastic/beats/vendor/github.com/fatih/color", "path": "github.com/fatih/color", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "2UmMbNHc8FBr98mJFN1k8ISOIHk=", "origin": "github.com/elastic/beats/vendor/github.com/garyburd/redigo/internal", "path": "github.com/garyburd/redigo/internal", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "507OiSqTxfGCje7xDT5eq9CCaNQ=", "origin": "github.com/elastic/beats/vendor/github.com/garyburd/redigo/redis", "path": "github.com/garyburd/redigo/redis", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "ImX1uv6O09ggFeBPUJJ2nu7MPSA=", "origin": "github.com/elastic/beats/vendor/github.com/ghodss/yaml", "path": "github.com/ghodss/yaml", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "2VgF+qja44x3wPTp8U8TZEU6FWw=", "origin": "github.com/elastic/beats/vendor/github.com/go-ole/go-ole", "path": "github.com/go-ole/go-ole", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Q0ZOcJW0fqOefDzEdn+PJHOeSgI=", "origin": "github.com/elastic/beats/vendor/github.com/go-ole/go-ole/oleutil", "path": "github.com/go-ole/go-ole/oleutil", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "OFaReqy4hyrLlTTYFmcqkvidHsQ=", @@ -1663,15 +1687,15 @@ "checksumSHA1": "kBeNcaKk56FguvPSUCEaH6AxpRc=", "origin": "github.com/elastic/beats/vendor/github.com/golang/protobuf/proto", "path": "github.com/golang/protobuf/proto", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "p/8vSviYF91gFflhrt5vkyksroo=", "origin": "github.com/elastic/beats/vendor/github.com/golang/snappy", "path": "github.com/golang/snappy", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "d9PxF1XQGLMJZRct2R8qVM/eYlE=", @@ -1689,29 +1713,29 @@ "checksumSHA1": "40vJyUB4ezQSn/NSadsKEOrudMc=", "origin": "github.com/elastic/beats/vendor/github.com/inconshreveable/mousetrap", "path": "github.com/inconshreveable/mousetrap", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "l9wW52CYGbmO/NGwYZ/Op2QTmaA=", "origin": "github.com/elastic/beats/vendor/github.com/joeshaw/multierror", "path": "github.com/joeshaw/multierror", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "IH4jnWcj4d4h+hgsHsHOWg/F+rk=", "origin": "github.com/elastic/beats/vendor/github.com/jstemmer/go-junit-report/formatter", "path": "github.com/jstemmer/go-junit-report/formatter", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Tx9cQqKFUHzu1l6H2XEl8G7ivlI=", "origin": "github.com/elastic/beats/vendor/github.com/jstemmer/go-junit-report/parser", "path": "github.com/jstemmer/go-junit-report/parser", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "pa+ZwMzIv+u+BlL8Q2xgL9cQtJg=", @@ -1723,141 +1747,141 @@ "checksumSHA1": "KKxbAKrKrfd33YPpkNsDmTN3S+M=", "origin": "github.com/elastic/beats/vendor/github.com/klauspost/compress/flate", "path": "github.com/klauspost/compress/flate", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "+azPXaZpPF14YHRghNAer13ThQU=", "origin": "github.com/elastic/beats/vendor/github.com/klauspost/compress/zlib", "path": "github.com/klauspost/compress/zlib", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "R6zKqn31GjJH1G8W/api7fAW0RU=", "origin": "github.com/elastic/beats/vendor/github.com/klauspost/cpuid", "path": "github.com/klauspost/cpuid", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "BM6ZlNJmtKy3GBoWwg2X55gnZ4A=", "origin": "github.com/elastic/beats/vendor/github.com/klauspost/crc32", "path": "github.com/klauspost/crc32", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Kq6KC9PlUP58qiX0WzApE85SsLg=", "origin": "github.com/elastic/beats/vendor/github.com/magefile/mage", "path": "github.com/magefile/mage", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "KODorM0Am1g55qObNz3jVOdRVFs=", "origin": "github.com/elastic/beats/vendor/github.com/magefile/mage/build", "path": "github.com/magefile/mage/build", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "9yeXUlqhNcsR7MlYMouJTO3AXv0=", "origin": "github.com/elastic/beats/vendor/github.com/magefile/mage/mage", "path": "github.com/magefile/mage/mage", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "TkAemcxaY44gsEjO1BiBxwlEI4A=", "origin": "github.com/elastic/beats/vendor/github.com/magefile/mage/mg", "path": "github.com/magefile/mage/mg", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "b1qY9BFtpJnIZEa8yvpJCRbOhRM=", "origin": "github.com/elastic/beats/vendor/github.com/magefile/mage/parse", "path": "github.com/magefile/mage/parse", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "fEuDveZzYX6oqYOT9jqyZROun/Q=", "origin": "github.com/elastic/beats/vendor/github.com/magefile/mage/parse/srcimporter", "path": "github.com/magefile/mage/parse/srcimporter", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "0/j3qlGc8fsWG42uIDZ5p8tVzPM=", "origin": "github.com/elastic/beats/vendor/github.com/magefile/mage/sh", "path": "github.com/magefile/mage/sh", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "oAjx69UIs6F6hPh+2GQSBMaHAfc=", "origin": "github.com/elastic/beats/vendor/github.com/magefile/mage/target", "path": "github.com/magefile/mage/target", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "He+VtZO7BsPDCZhZtJ1IkNp629o=", "origin": "github.com/elastic/beats/vendor/github.com/magefile/mage/types", "path": "github.com/magefile/mage/types", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "qNkx9+OTwZI6aFv7K9zuFCGODUw=", "origin": "github.com/elastic/beats/vendor/github.com/mattn/go-colorable", "path": "github.com/mattn/go-colorable", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "U6lX43KDDlNOn+Z0Yyww+ZzHfFo=", "origin": "github.com/elastic/beats/vendor/github.com/mattn/go-isatty", "path": "github.com/mattn/go-isatty", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "VsImZoqjaqgwK+u/4eIEzQhuRNM=", "origin": "github.com/elastic/beats/vendor/github.com/miekg/dns", "path": "github.com/miekg/dns", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "sWdAYPKyaT4SW8hNQNpRS0sU4lU=", "origin": "github.com/elastic/beats/vendor/github.com/mitchellh/hashstructure", "path": "github.com/mitchellh/hashstructure", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "2AyUkWjutec6p+470tgio8mYOxI=", "origin": "github.com/elastic/beats/vendor/github.com/opencontainers/go-digest", "path": "github.com/opencontainers/go-digest", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "eOMCORUm8KxiGSy0hBuQsMsxauo=", "origin": "github.com/elastic/beats/vendor/github.com/opencontainers/image-spec/specs-go", "path": "github.com/opencontainers/image-spec/specs-go", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "9YujSsJjiLGkQMzwWycsjqR340k=", "origin": "github.com/elastic/beats/vendor/github.com/opencontainers/image-spec/specs-go/v1", "path": "github.com/opencontainers/image-spec/specs-go/v1", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "JVGDxPn66bpe6xEiexs1r+y6jF0=", @@ -1869,15 +1893,15 @@ "checksumSHA1": "WmrPO1ovmQ7t7hs9yZGbr2SAoM4=", "origin": "github.com/elastic/beats/vendor/github.com/pierrec/lz4", "path": "github.com/pierrec/lz4", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "IT4sX58d+e8osXHV5U6YCSdB/uE=", "origin": "github.com/elastic/beats/vendor/github.com/pierrec/xxHash/xxHash32", "path": "github.com/pierrec/xxHash/xxHash32", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "e6T/9bM7ah7mQJVVIaTuCw/63Uo=", @@ -1889,50 +1913,50 @@ "checksumSHA1": "PdQm3s8DoVJ17Vk8n7o5iPa7PK0=", "origin": "github.com/elastic/beats/vendor/github.com/pkg/errors", "path": "github.com/pkg/errors", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "LuFv4/jlrmFNnDb/5SCSEPAM9vU=", "origin": "github.com/elastic/beats/vendor/github.com/pmezard/go-difflib/difflib", "path": "github.com/pmezard/go-difflib/difflib", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Etvt6mgzvD7ARf4Ux03LHfgSlzU=", "origin": "github.com/elastic/beats/vendor/github.com/prometheus/procfs", "path": "github.com/prometheus/procfs", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "lv9rIcjbVEGo8AT1UCUZXhXrfQc=", "origin": "github.com/elastic/beats/vendor/github.com/prometheus/procfs/internal/util", "path": "github.com/prometheus/procfs/internal/util", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "EekY1iRG9JY74mDD0jsbFCWbAFs=", "origin": "github.com/elastic/beats/vendor/github.com/prometheus/procfs/nfs", "path": "github.com/prometheus/procfs/nfs", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "yItvTQLUVqm/ArLEbvEhqG0T5a0=", "origin": "github.com/elastic/beats/vendor/github.com/prometheus/procfs/xfs", "path": "github.com/prometheus/procfs/xfs", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "KAzbLjI9MzW2tjfcAsK75lVRp6I=", "origin": "github.com/elastic/beats/vendor/github.com/rcrowley/go-metrics", "path": "github.com/rcrowley/go-metrics", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "6JP37UqrI0H80Gpk0Y2P+KXgn5M=", @@ -1986,43 +2010,43 @@ "checksumSHA1": "e7mAb9jMke2ASQGZepFgOmfBFzM=", "origin": "github.com/elastic/beats/vendor/github.com/spf13/cobra", "path": "github.com/spf13/cobra", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "STxYqRb4gnlSr3mRpT+Igfdz/kM=", "origin": "github.com/elastic/beats/vendor/github.com/spf13/pflag", "path": "github.com/spf13/pflag", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "c6pbpF7eowwO59phRTpF8cQ80Z0=", "origin": "github.com/elastic/beats/vendor/github.com/stretchr/testify/assert", "path": "github.com/stretchr/testify/assert", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "wnEANt4k5X/KGwoFyfSSnpxULm4=", "origin": "github.com/elastic/beats/vendor/github.com/stretchr/testify/require", "path": "github.com/stretchr/testify/require", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "CpcG17Q/0k1g2uy8AL26Uu7TouU=", "origin": "github.com/elastic/beats/vendor/github.com/theckman/go-flock", "path": "github.com/theckman/go-flock", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "H7tCgNt2ajKK4FBJIDNlevu9MAc=", "origin": "github.com/elastic/beats/vendor/github.com/urso/go-bin", "path": "github.com/urso/go-bin", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "8Kj0VH496b0exuyv4wAF4CXa7Y4=", @@ -2047,169 +2071,169 @@ "checksumSHA1": "HedK9m8E8iyib4bIBtIX7xprOgo=", "origin": "github.com/elastic/beats/vendor/go.uber.org/atomic", "path": "go.uber.org/atomic", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "JDGx7hehaQunZySwPs7yvdUs2m8=", "origin": "github.com/elastic/beats/vendor/go.uber.org/multierr", "path": "go.uber.org/multierr", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "5BYbiKEkYykvfjSaNYDuQpBqglo=", "origin": "github.com/elastic/beats/vendor/go.uber.org/zap", "path": "go.uber.org/zap", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "HYo/9nwrY08NQA+2ItPOAH8IFW8=", "origin": "github.com/elastic/beats/vendor/go.uber.org/zap/buffer", "path": "go.uber.org/zap/buffer", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "MuxOAtZEsJitlWBzhmpm2vGiHok=", "origin": "github.com/elastic/beats/vendor/go.uber.org/zap/internal/bufferpool", "path": "go.uber.org/zap/internal/bufferpool", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "uC0L9eCSAYcCWNC8udJk/t1vvIU=", "origin": "github.com/elastic/beats/vendor/go.uber.org/zap/internal/color", "path": "go.uber.org/zap/internal/color", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "b80CJExrVpXu3SA1iCQ6uLqTn2c=", "origin": "github.com/elastic/beats/vendor/go.uber.org/zap/internal/exit", "path": "go.uber.org/zap/internal/exit", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "mRD6lujPvXPkbC3+byNwO/bNVu8=", "origin": "github.com/elastic/beats/vendor/go.uber.org/zap/zapcore", "path": "go.uber.org/zap/zapcore", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "gyBmIfDZslmQGKnqisJ/p7oHbQc=", "origin": "github.com/elastic/beats/vendor/go.uber.org/zap/zaptest/observer", "path": "go.uber.org/zap/zaptest/observer", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "2LpxYGSf068307b7bhAuVjvzLLc=", "origin": "github.com/elastic/beats/vendor/golang.org/x/crypto/ed25519", "path": "golang.org/x/crypto/ed25519", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "0JTAFXPkankmWcZGQJGScLDiaN8=", "origin": "github.com/elastic/beats/vendor/golang.org/x/crypto/ed25519/internal/edwards25519", "path": "golang.org/x/crypto/ed25519/internal/edwards25519", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "1MGpGDQqnUoRpv7VEcQrXOBydXE=", "origin": "github.com/elastic/beats/vendor/golang.org/x/crypto/pbkdf2", "path": "golang.org/x/crypto/pbkdf2", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "6U7dCaxxIMjf5V02iWgyAwppczw=", "origin": "github.com/elastic/beats/vendor/golang.org/x/crypto/ssh/terminal", "path": "golang.org/x/crypto/ssh/terminal", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "uX2McdP4VcQ6zkAF0Q4oyd0rFtU=", "origin": "github.com/elastic/beats/vendor/golang.org/x/net/bpf", "path": "golang.org/x/net/bpf", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "dr5+PfIRzXeN+l1VG+s0lea9qz8=", "origin": "github.com/elastic/beats/vendor/golang.org/x/net/context", "path": "golang.org/x/net/context", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "WHc3uByvGaMcnSoI21fhzYgbOgg=", "origin": "github.com/elastic/beats/vendor/golang.org/x/net/context/ctxhttp", "path": "golang.org/x/net/context/ctxhttp", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "TWcqN2+KUWtdqnu18rruwn14UEQ=", "origin": "github.com/elastic/beats/vendor/golang.org/x/net/http2", "path": "golang.org/x/net/http2", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "ezWhc7n/FtqkLDQKeU2JbW+80tE=", "origin": "github.com/elastic/beats/vendor/golang.org/x/net/http2/hpack", "path": "golang.org/x/net/http2/hpack", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "RcrB7tgYS/GMW4QrwVdMOTNqIU8=", "origin": "github.com/elastic/beats/vendor/golang.org/x/net/idna", "path": "golang.org/x/net/idna", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "5JWn/wMC+EWNDKI/AYE4JifQF54=", "origin": "github.com/elastic/beats/vendor/golang.org/x/net/internal/iana", "path": "golang.org/x/net/internal/iana", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "YsXlbexuTtUXHyhSv927ILOkf6A=", "origin": "github.com/elastic/beats/vendor/golang.org/x/net/internal/socket", "path": "golang.org/x/net/internal/socket", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "zPTKyZ1C55w1fk1W+/qGE15jaek=", "origin": "github.com/elastic/beats/vendor/golang.org/x/net/ipv4", "path": "golang.org/x/net/ipv4", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "3L3n7qKMO9X8E1ibA5mExKvwbmI=", "origin": "github.com/elastic/beats/vendor/golang.org/x/net/ipv6", "path": "golang.org/x/net/ipv6", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "3xyuaSNmClqG4YWC7g0isQIbUTc=", "origin": "github.com/elastic/beats/vendor/golang.org/x/net/lex/httplex", "path": "golang.org/x/net/lex/httplex", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "whCSspa9pYarl527EuhPz91cbUE=", @@ -2221,8 +2245,8 @@ "checksumSHA1": "QEm/dePZ0lOnyOs+m22KjXfJ/IU=", "origin": "github.com/elastic/beats/vendor/golang.org/x/net/proxy", "path": "golang.org/x/net/proxy", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "S0DP7Pn7sZUmXc55IzZnNvERu6s=", @@ -2234,78 +2258,78 @@ "checksumSHA1": "nc3RG2Qgzn2aup/3/4RusWr+X0g=", "origin": "github.com/elastic/beats/vendor/golang.org/x/sys/unix", "path": "golang.org/x/sys/unix", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Hi7BmkvZh4plNNLGDHfPnCKy3i8=", "origin": "github.com/elastic/beats/vendor/golang.org/x/sys/windows", "path": "golang.org/x/sys/windows", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "P9OIhD26uWlIST/me4TYnvseCoY=", "origin": "github.com/elastic/beats/vendor/golang.org/x/sys/windows/registry", "path": "golang.org/x/sys/windows/registry", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "Fes9OIPy6lS/ghzodqAbMlZZTTQ=", "origin": "github.com/elastic/beats/vendor/golang.org/x/sys/windows/svc", "path": "golang.org/x/sys/windows/svc", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "e9KJPWrdqg5PMkbE2w60Io8rY4M=", "origin": "github.com/elastic/beats/vendor/golang.org/x/sys/windows/svc/debug", "path": "golang.org/x/sys/windows/svc/debug", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "uVlUSSKplihZG7N+QJ6fzDZ4Kh8=", "origin": "github.com/elastic/beats/vendor/golang.org/x/sys/windows/svc/eventlog", "path": "golang.org/x/sys/windows/svc/eventlog", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "CbpjEkkOeh0fdM/V8xKDdI0AA88=", "origin": "github.com/elastic/beats/vendor/golang.org/x/text/secure/bidirule", "path": "golang.org/x/text/secure/bidirule", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "ziMb9+ANGRJSSIuxYdRbA+cDRBQ=", "origin": "github.com/elastic/beats/vendor/golang.org/x/text/transform", "path": "golang.org/x/text/transform", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "w8kDfZ1Ug+qAcVU0v8obbu3aDOY=", "origin": "github.com/elastic/beats/vendor/golang.org/x/text/unicode/bidi", "path": "golang.org/x/text/unicode/bidi", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "BCNYmf4Ek93G4lk5x3ucNi/lTwA=", "origin": "github.com/elastic/beats/vendor/golang.org/x/text/unicode/norm", "path": "golang.org/x/text/unicode/norm", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "vGfePfr0+weQUeTM/71mu+LCFuE=", "origin": "github.com/elastic/beats/vendor/golang.org/x/time/rate", "path": "golang.org/x/time/rate", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "5QK10eoScnyEh8dD3PfZf8gMXn8=", @@ -2349,15 +2373,15 @@ "checksumSHA1": "fALlQNY1fM99NesfLJ50KguWsio=", "origin": "github.com/elastic/beats/vendor/gopkg.in/yaml.v2", "path": "gopkg.in/yaml.v2", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" }, { "checksumSHA1": "ZDOewomjpADMDyjKRW5rP15519M=", "origin": "github.com/elastic/beats/vendor/howett.net/plist", "path": "howett.net/plist", - "revision": "a4b06ae0f035889416ceb0df0b552ec3c573ca1a", - "revisionTime": "2018-12-03T15:18:31Z" + "revision": "17939559496bb2bf0424bc5de84105e6040eaa9e", + "revisionTime": "2018-12-12T10:52:02Z" } ], "rootPath": "github.com/elastic/apm-server" diff --git a/x-pack/apm-server/cmd/root.go b/x-pack/apm-server/cmd/root.go new file mode 100644 index 00000000000..c85dc435118 --- /dev/null +++ b/x-pack/apm-server/cmd/root.go @@ -0,0 +1,18 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package cmd + +import ( + "github.com/elastic/apm-server/cmd" + + xpackcmd "github.com/elastic/beats/x-pack/libbeat/cmd" +) + +// RootCmd to handle beats cli +var RootCmd = cmd.RootCmd + +func init() { + xpackcmd.AddXPack(RootCmd, cmd.Name) +} diff --git a/x-pack/apm-server/main.go b/x-pack/apm-server/main.go new file mode 100644 index 00000000000..c72808907ce --- /dev/null +++ b/x-pack/apm-server/main.go @@ -0,0 +1,17 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package main + +import ( + "os" + + "github.com/elastic/apm-server/x-pack/apm-server/cmd" +) + +func main() { + if err := cmd.RootCmd.Execute(); err != nil { + os.Exit(1) + } +}