diff --git a/Makefile b/Makefile index 779191c303..2f09317d74 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ export GO111MODULE=on GOOSBUILD=./build/$(shell go env GOOS) APPROVALS=$(GOOSBUILD)/approvals +GENPACKAGE=$(GOOSBUILD)/genpackage GOIMPORTS=$(GOOSBUILD)/goimports GOLICENSER=$(GOOSBUILD)/go-licenser GOLINT=$(GOOSBUILD)/golint @@ -75,6 +76,10 @@ check-approvals: $(APPROVALS) check: $(MAGE) check-headers @$(MAGE) check +.PHONY: gen-package +gen-package: $(GENPACKAGE) + @$(GENPACKAGE) + .PHONY: bench bench: @go test -benchmem -run=XXX -benchtime=100ms -bench='.*' ./... @@ -105,7 +110,7 @@ docker-compose.override.yml: # Rules for updating config files, fields.yml, etc. ############################################################################## -update: fields go-generate add-headers copy-docs notice $(MAGE) +update: fields go-generate add-headers copy-docs gen-package notice $(MAGE) @$(MAGE) update fields_sources=\ @@ -247,6 +252,11 @@ $(MAGE): magefile.go $(BIN_MAGE) $(STATICCHECK): go.mod go build -o $@ honnef.co/go/tools/cmd/staticcheck +.PHONY: $(GENPACKAGE) +$(GENPACKAGE): + @go build -o $@ github.com/elastic/apm-server/apmpackage/cmd/gen-package + + $(GOLINT): go.mod go build -o $@ golang.org/x/lint/golint diff --git a/NOTICE.txt b/NOTICE.txt index ab8fa83e7e..b0ede4d3c0 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -975,7 +975,8 @@ License type (autodetected): Apache-2.0 -------------------------------------------------------------------- Dependency: github.com/elastic/go-ucfg -Version: v0.8.3 +Version: v0.8.4 +Revision: 1232bd4774a6 License type (autodetected): Apache-2.0 -------------------------------------------------------------------- diff --git a/README.md b/README.md index 680637e15b..4438a6112e 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,21 @@ To generate required configuration files and templates run: make update ``` +### Generate package + +APM-Server includes a script to generate an integration package to run with Fleet. +To Generate a package run: + +``` +make fields gen-package +``` + +That command takes the existing `fields.yml` files and split them into `ecs.yml` and `fields.yml` files for each data stream type. +It also generates a `README.md` with a field reference that will be shown in the integration package. + +After generating a package, `apmpackage/apm` should be manually copied to `elastic/integrations`. +Then follow instructions in https://github.com/elastic/integrations/blob/master/CONTRIBUTING.md. + ### Cleanup To clean APM Server source code, run the following commands: diff --git a/apmpackage/apm/0.1.0/agent/input/template.yml.hbs b/apmpackage/apm/0.1.0/agent/input/template.yml.hbs new file mode 100644 index 0000000000..fa5083b93a --- /dev/null +++ b/apmpackage/apm/0.1.0/agent/input/template.yml.hbs @@ -0,0 +1,2 @@ +apm-server: + rum.enabled: {{enable_rum}} diff --git a/apmpackage/apm/0.1.0/data_stream/logs/fields/base-fields.yml b/apmpackage/apm/0.1.0/data_stream/logs/fields/base-fields.yml new file mode 100644 index 0000000000..bef973826b --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/logs/fields/base-fields.yml @@ -0,0 +1,12 @@ +- name: '@timestamp' + type: date + description: Event timestamp. +- name: data_stream.type + type: constant_keyword + description: Data stream type. +- name: data_stream.dataset + type: constant_keyword + description: Data stream dataset. +- name: data_stream.namespace + type: constant_keyword + description: Data stream namespace. diff --git a/apmpackage/apm/0.1.0/data_stream/logs/fields/ecs.yml b/apmpackage/apm/0.1.0/data_stream/logs/fields/ecs.yml new file mode 100644 index 0000000000..682580ba1c --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/logs/fields/ecs.yml @@ -0,0 +1,384 @@ +- name: url + type: group + description: | + A complete Url, with scheme, host and path. + fields: + - name: scheme + type: keyword + description: | + The protocol of the request, e.g. "https:". + - name: full + type: keyword + description: | + The full, possibly agent-assembled URL of the request, e.g https://example.com:443/search?q=elasticsearch#top. + - name: domain + type: keyword + description: | + The hostname of the request, e.g. "example.com". + - name: port + type: long + description: | + The port of the request, e.g. 443. + - name: path + type: keyword + description: | + The path of the request, e.g. "/search". + - name: query + type: keyword + description: | + The query string of the request, e.g. "q=elasticsearch". + - name: fragment + type: keyword + description: | + A fragment specifying a location in a web page , e.g. "top". +- name: http + type: group + fields: + - name: version + type: keyword + description: | + The http version of the request leading to this event. + - name: request + type: group + fields: + - name: method + type: keyword + description: | + The http method of the request leading to this event. + - name: referrer + type: keyword + description: Referrer for this HTTP request. + ignore_above: 1024 + - name: response + type: group + fields: + - name: status_code + type: long + description: | + The status code of the HTTP response. +- name: labels + type: object + description: | + A flat mapping of user-defined labels with string, boolean or number values. +- name: service + type: group + description: | + Service fields. + fields: + - name: name + type: keyword + description: | + Immutable name of the service emitting this event. + - name: version + type: keyword + description: | + Version of the service emitting this event. + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Unique meaningful name of the service node. +- name: transaction + type: group + fields: + - name: id + type: keyword + description: | + The transaction ID. +- name: trace + type: group + fields: + - name: id + type: keyword + description: | + The ID of the trace to which the event belongs to. +- name: agent + type: group + fields: + - name: name + type: keyword + description: | + Name of the agent used. + - name: version + type: keyword + description: | + Version of the agent used. + - name: ephemeral_id + type: keyword + description: | + The Ephemeral ID identifies a running process. +- name: container + title: Container + type: group + description: | + Container fields are used for meta information about the specific container that is the source of information. These fields help correlate data based containers from any runtime. + fields: + - name: id + type: keyword + description: | + Unique container id. +- name: host + type: group + description: | + Optional host fields. + fields: + - name: architecture + type: keyword + description: | + The architecture of the host the event was recorded on. + - name: hostname + type: keyword + description: | + The hostname of the host the event was recorded on. + - name: name + type: keyword + description: | + Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user. + - name: ip + type: ip + description: | + IP of the host that records the event. + - name: os + title: Operating System + group: 2 + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + The platform of the host the event was recorded on. +- name: process + type: group + description: | + Information pertaining to the running process where the data was collected + fields: + - name: args + level: extended + type: keyword + description: | + Process arguments. May be filtered to protect sensitive information. + - name: pid + type: long + description: | + Numeric process ID of the service process. + - name: ppid + type: long + description: | + Numeric ID of the service's parent process. + - name: title + type: keyword + description: | + Service process title. +- name: observer + type: group + fields: + - name: hostname + type: keyword + description: | + Hostname of the APM Server. + - name: version + type: keyword + description: | + APM Server version. + - name: type + type: keyword + description: | + The type will be set to `apm-server`. +- name: user + type: group + fields: + - name: name + type: keyword + description: | + The username of the logged in user. + - name: id + type: keyword + description: | + Identifier of the logged in user. + - name: email + type: keyword + description: | + Email of the logged in user. +- name: client + type: group + fields: + - name: ip + type: ip + description: | + IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: source + type: group + fields: + - name: ip + type: ip + description: | + IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: destination + title: Destination + group: 2 + type: group + description: |- + Destination fields describe details about the destination of a packet/event. + Destination fields are usually populated in conjunction with source fields. + fields: + - name: address + level: extended + type: keyword + description: Some event destination addresses are defined ambiguously. The event + will sometimes list an IP, a domain or a unix socket. You should always store + the raw address in the `.address` field. Then it should be duplicated to `.ip` + or `.domain`, depending on which one it is. + ignore_above: 1024 + - name: ip + level: core + type: ip + description: IP addess of the destination. Can be one of multiple IPv4 or IPv6 + addresses. + - name: port + level: core + type: long + format: string + description: Port of the destination. +- name: user_agent + title: User agent + type: group + description: | + The user_agent fields normally come from a browser request. They often show up in web service logs coming from the parsed user agent string. + fields: + - name: original + type: keyword + description: | + Unparsed version of the user_agent. + multi_fields: + - name: text + type: text + - name: name + type: keyword + description: | + Name of the user agent. + - name: version + type: keyword + description: | + Version of the user agent. + - name: device + title: Device + type: group + description: | + Information concerning the device. + fields: + - name: name + type: keyword + description: | + Name of the device. + - name: os + title: Operating System + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + Operating system platform (such centos, ubuntu, windows). + - name: name + type: keyword + description: | + Operating system name, without the version. + - name: full + type: keyword + description: | + Operating system name, including the version or code name. + - name: family + type: keyword + description: | + OS family (such as redhat, debian, freebsd, windows). + - name: version + type: keyword + description: | + Operating system version as a raw string. + - name: kernel + type: keyword + description: | + Operating system kernel version as a raw string. +- name: cloud + title: Cloud + group: 2 + type: group + description: | + Cloud metadata reported by agents + fields: + - name: account + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud account ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud account name + ignore_above: 1024 + - name: availability_zone + level: extended + type: keyword + description: Cloud availability zone name + ignore_above: 1024 + - name: instance + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud instance/machine ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud instance/machine name + ignore_above: 1024 + - name: machine + type: group + fields: + - name: type + level: extended + type: keyword + description: Cloud instance/machine type + ignore_above: 1024 + - name: project + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud project ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud project name + ignore_above: 1024 + - name: provider + level: extended + type: keyword + description: Cloud provider name + ignore_above: 1024 + - name: region + level: extended + type: keyword + description: Cloud region name + ignore_above: 1024 +- name: error + type: group + description: | + Data captured by an agent representing an event occurring in a monitored service. + fields: + - name: id + type: keyword + description: | + The ID of the error. diff --git a/apmpackage/apm/0.1.0/data_stream/logs/fields/fields.yml b/apmpackage/apm/0.1.0/data_stream/logs/fields/fields.yml new file mode 100644 index 0000000000..3dd5a56df6 --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/logs/fields/fields.yml @@ -0,0 +1,223 @@ +- name: processor.name + type: keyword + description: Processor name. +- name: processor.event + type: keyword + description: Processor event. +- name: timestamp + type: group + fields: + - name: us + type: long + description: | + Timestamp of the event in microseconds since Unix epoch. +- name: http + type: group + fields: + - name: request + type: group + fields: + - name: headers + type: object + description: | + The canonical headers of the monitored HTTP request. + - name: response + type: group + fields: + - name: finished + type: boolean + description: | + Used by the Node agent to indicate when in the response life cycle an error has occurred. + - name: headers + type: object + description: | + The canonical headers of the monitored HTTP response. +- name: service + type: group + description: | + Service fields. + fields: + - name: environment + type: keyword + description: | + Service environment. + - name: language + type: group + fields: + - name: name + type: keyword + description: | + Name of the programming language used. + - name: version + type: keyword + description: | + Version of the programming language used. + - name: runtime + type: group + fields: + - name: name + type: keyword + description: | + Name of the runtime used. + - name: version + type: keyword + description: | + Version of the runtime used. + - name: framework + type: group + fields: + - name: name + type: keyword + description: | + Name of the framework used. + - name: version + type: keyword + description: | + Version of the framework used. +- name: transaction + type: group + fields: + - name: sampled + type: boolean + description: | + Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context. + - name: type + type: keyword + description: | + Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc) + - name: name + type: keyword + description: | + Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id'). + multi_fields: + - name: text + type: text + - name: duration + type: group + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: self_time + type: group + description: | + Portion of the transaction's duration where no direct child was running + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: breakdown + type: group + description: | + Counter for collected breakdowns for the transaction + fields: + - name: count + type: long +- name: parent + type: group + fields: + - name: id + type: keyword + description: | + The ID of the parent event. +- name: kubernetes + title: Kubernetes + type: group + description: | + Kubernetes metadata reported by agents + fields: + - name: namespace + type: keyword + description: | + Kubernetes namespace + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes node name + - name: pod + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes pod name + - name: uid + type: keyword + description: | + Kubernetes Pod UID +- name: observer + type: group + fields: + - name: listening + type: keyword + description: | + Address the server is listening on. + - name: version_major + type: byte + description: | + Major version number of the observer +- name: experimental + type: object + description: Additional experimental data sent by the agents. +- name: error + type: group + description: | + Data captured by an agent representing an event occurring in a monitored service. + fields: + - name: culprit + type: keyword + description: Function call which was the primary perpetrator of this event. + - name: grouping_key + type: keyword + description: | + GroupingKey of the logged error for use in grouping. + - name: exception + type: group + description: | + Information about the originally thrown error. + fields: + - name: code + type: keyword + description: The error code set when the error happened, e.g. database error + code. + - name: message + type: text + description: The original error message. + - name: module + type: keyword + description: The module namespace of the original error. + - name: type + type: keyword + - name: handled + type: boolean + description: Indicator whether the error was caught somewhere in the code or + not. + - name: log + type: group + description: | + Additional information added by logging the error. + fields: + - name: level + type: keyword + description: The severity of the record. + - name: logger_name + type: keyword + description: The name of the logger instance used. + - name: message + type: text + description: The additionally logged error message. + - name: param_message + type: keyword + description: | + A parametrized message. E.g. 'Could not connect to %s'. The property message is still required, and should be equal to the param_message, but with placeholders replaced. In some situations the param_message is used to group errors together. diff --git a/apmpackage/apm/0.1.0/data_stream/logs/manifest.yml b/apmpackage/apm/0.1.0/data_stream/logs/manifest.yml new file mode 100644 index 0000000000..cef82f3837 --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/logs/manifest.yml @@ -0,0 +1,2 @@ +title: APM logs and errors +type: logs diff --git a/apmpackage/apm/0.1.0/data_stream/metrics/fields/base-fields.yml b/apmpackage/apm/0.1.0/data_stream/metrics/fields/base-fields.yml new file mode 100644 index 0000000000..bef973826b --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/metrics/fields/base-fields.yml @@ -0,0 +1,12 @@ +- name: '@timestamp' + type: date + description: Event timestamp. +- name: data_stream.type + type: constant_keyword + description: Data stream type. +- name: data_stream.dataset + type: constant_keyword + description: Data stream dataset. +- name: data_stream.namespace + type: constant_keyword + description: Data stream namespace. diff --git a/apmpackage/apm/0.1.0/data_stream/metrics/fields/ecs.yml b/apmpackage/apm/0.1.0/data_stream/metrics/fields/ecs.yml new file mode 100644 index 0000000000..1743a71725 --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/metrics/fields/ecs.yml @@ -0,0 +1,622 @@ +- name: labels + type: object + description: | + A flat mapping of user-defined labels with string, boolean or number values. +- name: service + type: group + description: | + Service fields. + fields: + - name: name + type: keyword + description: | + Immutable name of the service emitting this event. + - name: version + type: keyword + description: | + Version of the service emitting this event. + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Unique meaningful name of the service node. +- name: transaction + type: group + fields: + - name: id + type: keyword + description: | + The transaction ID. +- name: agent + type: group + fields: + - name: name + type: keyword + description: | + Name of the agent used. + - name: version + type: keyword + description: | + Version of the agent used. + - name: ephemeral_id + type: keyword + description: | + The Ephemeral ID identifies a running process. +- name: container + title: Container + type: group + description: | + Container fields are used for meta information about the specific container that is the source of information. These fields help correlate data based containers from any runtime. + fields: + - name: id + type: keyword + description: | + Unique container id. +- name: host + type: group + description: | + Optional host fields. + fields: + - name: architecture + type: keyword + description: | + The architecture of the host the event was recorded on. + - name: hostname + type: keyword + description: | + The hostname of the host the event was recorded on. + - name: name + type: keyword + description: | + Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user. + - name: ip + type: ip + description: | + IP of the host that records the event. + - name: os + title: Operating System + group: 2 + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + The platform of the host the event was recorded on. +- name: process + type: group + description: | + Information pertaining to the running process where the data was collected + fields: + - name: args + level: extended + type: keyword + description: | + Process arguments. May be filtered to protect sensitive information. + - name: pid + type: long + description: | + Numeric process ID of the service process. + - name: ppid + type: long + description: | + Numeric ID of the service's parent process. + - name: title + type: keyword + description: | + Service process title. +- name: observer + type: group + fields: + - name: hostname + type: keyword + description: | + Hostname of the APM Server. + - name: version + type: keyword + description: | + APM Server version. + - name: type + type: keyword + description: | + The type will be set to `apm-server`. +- name: user + type: group + fields: + - name: name + type: keyword + description: | + The username of the logged in user. + - name: id + type: keyword + description: | + Identifier of the logged in user. + - name: email + type: keyword + description: | + Email of the logged in user. +- name: client + type: group + fields: + - name: ip + type: ip + description: | + IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: source + type: group + fields: + - name: ip + type: ip + description: | + IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: destination + title: Destination + group: 2 + type: group + description: |- + Destination fields describe details about the destination of a packet/event. + Destination fields are usually populated in conjunction with source fields. + fields: + - name: address + level: extended + type: keyword + description: Some event destination addresses are defined ambiguously. The event + will sometimes list an IP, a domain or a unix socket. You should always store + the raw address in the `.address` field. Then it should be duplicated to `.ip` + or `.domain`, depending on which one it is. + ignore_above: 1024 + - name: ip + level: core + type: ip + description: IP addess of the destination. Can be one of multiple IPv4 or IPv6 + addresses. + - name: port + level: core + type: long + format: string + description: Port of the destination. +- name: user_agent + title: User agent + type: group + description: | + The user_agent fields normally come from a browser request. They often show up in web service logs coming from the parsed user agent string. + fields: + - name: original + type: keyword + description: | + Unparsed version of the user_agent. + multi_fields: + - name: text + type: text + - name: name + type: keyword + description: | + Name of the user agent. + - name: version + type: keyword + description: | + Version of the user agent. + - name: device + title: Device + type: group + description: | + Information concerning the device. + fields: + - name: name + type: keyword + description: | + Name of the device. + - name: os + title: Operating System + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + Operating system platform (such centos, ubuntu, windows). + - name: name + type: keyword + description: | + Operating system name, without the version. + - name: full + type: keyword + description: | + Operating system name, including the version or code name. + - name: family + type: keyword + description: | + OS family (such as redhat, debian, freebsd, windows). + - name: version + type: keyword + description: | + Operating system version as a raw string. + - name: kernel + type: keyword + description: | + Operating system kernel version as a raw string. +- name: cloud + title: Cloud + group: 2 + type: group + description: | + Cloud metadata reported by agents + fields: + - name: account + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud account ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud account name + ignore_above: 1024 + - name: availability_zone + level: extended + type: keyword + description: Cloud availability zone name + ignore_above: 1024 + - name: instance + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud instance/machine ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud instance/machine name + ignore_above: 1024 + - name: machine + type: group + fields: + - name: type + level: extended + type: keyword + description: Cloud instance/machine type + ignore_above: 1024 + - name: project + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud project ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud project name + ignore_above: 1024 + - name: provider + level: extended + type: keyword + description: Cloud provider name + ignore_above: 1024 + - name: region + level: extended + type: keyword + description: Cloud region name + ignore_above: 1024 +- name: event + type: group + fields: + - name: outcome + level: core + type: keyword + description: | + `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event. + ignore_above: 1024 +- name: labels + type: object + description: | + A flat mapping of user-defined labels with string, boolean or number values. +- name: service + type: group + description: | + Service fields. + fields: + - name: name + type: keyword + description: | + Immutable name of the service emitting this event. + - name: version + type: keyword + description: | + Version of the service emitting this event. + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Unique meaningful name of the service node. +- name: agent + type: group + fields: + - name: name + type: keyword + description: | + Name of the agent used. + - name: version + type: keyword + description: | + Version of the agent used. + - name: ephemeral_id + type: keyword + description: | + The Ephemeral ID identifies a running process. +- name: container + title: Container + type: group + description: | + Container fields are used for meta information about the specific container that is the source of information. These fields help correlate data based containers from any runtime. + fields: + - name: id + type: keyword + description: | + Unique container id. +- name: host + type: group + description: | + Optional host fields. + fields: + - name: architecture + type: keyword + description: | + The architecture of the host the event was recorded on. + - name: hostname + type: keyword + description: | + The hostname of the host the event was recorded on. + - name: name + type: keyword + description: | + Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user. + - name: ip + type: ip + description: | + IP of the host that records the event. + - name: os + title: Operating System + group: 2 + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + The platform of the host the event was recorded on. +- name: process + type: group + description: | + Information pertaining to the running process where the data was collected + fields: + - name: args + level: extended + type: keyword + description: | + Process arguments. May be filtered to protect sensitive information. + - name: pid + type: long + description: | + Numeric process ID of the service process. + - name: ppid + type: long + description: | + Numeric ID of the service's parent process. + - name: title + type: keyword + description: | + Service process title. +- name: observer + type: group + fields: + - name: hostname + type: keyword + description: | + Hostname of the APM Server. + - name: version + type: keyword + description: | + APM Server version. + - name: type + type: keyword + description: | + The type will be set to `apm-server`. +- name: user + type: group + fields: + - name: name + type: keyword + description: | + The username of the logged in user. + - name: id + type: keyword + description: | + Identifier of the logged in user. + - name: email + type: keyword + description: | + Email of the logged in user. +- name: client + type: group + fields: + - name: ip + type: ip + description: | + IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: source + type: group + fields: + - name: ip + type: ip + description: | + IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: destination + title: Destination + group: 2 + type: group + description: |- + Destination fields describe details about the destination of a packet/event. + Destination fields are usually populated in conjunction with source fields. + fields: + - name: address + level: extended + type: keyword + description: Some event destination addresses are defined ambiguously. The event + will sometimes list an IP, a domain or a unix socket. You should always store + the raw address in the `.address` field. Then it should be duplicated to `.ip` + or `.domain`, depending on which one it is. + ignore_above: 1024 + - name: ip + level: core + type: ip + description: IP addess of the destination. Can be one of multiple IPv4 or IPv6 + addresses. + - name: port + level: core + type: long + format: string + description: Port of the destination. +- name: user_agent + title: User agent + type: group + description: | + The user_agent fields normally come from a browser request. They often show up in web service logs coming from the parsed user agent string. + fields: + - name: original + type: keyword + description: | + Unparsed version of the user_agent. + multi_fields: + - name: text + type: text + - name: name + type: keyword + description: | + Name of the user agent. + - name: version + type: keyword + description: | + Version of the user agent. + - name: device + title: Device + type: group + description: | + Information concerning the device. + fields: + - name: name + type: keyword + description: | + Name of the device. + - name: os + title: Operating System + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + Operating system platform (such centos, ubuntu, windows). + - name: name + type: keyword + description: | + Operating system name, without the version. + - name: full + type: keyword + description: | + Operating system name, including the version or code name. + - name: family + type: keyword + description: | + OS family (such as redhat, debian, freebsd, windows). + - name: version + type: keyword + description: | + Operating system version as a raw string. + - name: kernel + type: keyword + description: | + Operating system kernel version as a raw string. +- name: cloud + title: Cloud + group: 2 + type: group + description: | + Cloud metadata reported by agents + fields: + - name: account + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud account ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud account name + ignore_above: 1024 + - name: availability_zone + level: extended + type: keyword + description: Cloud availability zone name + ignore_above: 1024 + - name: instance + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud instance/machine ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud instance/machine name + ignore_above: 1024 + - name: machine + type: group + fields: + - name: type + level: extended + type: keyword + description: Cloud instance/machine type + ignore_above: 1024 + - name: project + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud project ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud project name + ignore_above: 1024 + - name: provider + level: extended + type: keyword + description: Cloud provider name + ignore_above: 1024 + - name: region + level: extended + type: keyword + description: Cloud region name + ignore_above: 1024 diff --git a/apmpackage/apm/0.1.0/data_stream/metrics/fields/fields.yml b/apmpackage/apm/0.1.0/data_stream/metrics/fields/fields.yml new file mode 100644 index 0000000000..35720942e4 --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/metrics/fields/fields.yml @@ -0,0 +1,461 @@ +- name: processor.name + type: keyword + description: Processor name. +- name: processor.event + type: keyword + description: Processor event. +- name: timestamp + type: group + fields: + - name: us + type: long + description: | + Timestamp of the event in microseconds since Unix epoch. +- name: service + type: group + description: | + Service fields. + fields: + - name: environment + type: keyword + description: | + Service environment. + - name: language + type: group + fields: + - name: name + type: keyword + description: | + Name of the programming language used. + - name: version + type: keyword + description: | + Version of the programming language used. + - name: runtime + type: group + fields: + - name: name + type: keyword + description: | + Name of the runtime used. + - name: version + type: keyword + description: | + Version of the runtime used. + - name: framework + type: group + fields: + - name: name + type: keyword + description: | + Name of the framework used. + - name: version + type: keyword + description: | + Version of the framework used. +- name: transaction + type: group + fields: + - name: sampled + type: boolean + description: | + Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context. + - name: type + type: keyword + description: | + Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc) + - name: name + type: keyword + description: | + Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id'). + multi_fields: + - name: text + type: text + - name: duration + type: group + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: self_time + type: group + description: | + Portion of the transaction's duration where no direct child was running + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: breakdown + type: group + description: | + Counter for collected breakdowns for the transaction + fields: + - name: count + type: long + - name: root + type: boolean + description: | + Identifies metrics for root transactions. This can be used for calculating metrics for traces. +- name: span + type: group + fields: + - name: type + type: keyword + description: | + Keyword of specific relevance in the service's domain (eg: 'db.postgresql.query', 'template.erb', 'cache', etc). + - name: subtype + type: keyword + description: | + A further sub-division of the type (e.g. postgresql, elasticsearch) + - name: self_time + type: group + description: | + Portion of the span's duration where no direct child was running + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long +- name: kubernetes + title: Kubernetes + type: group + description: | + Kubernetes metadata reported by agents + fields: + - name: namespace + type: keyword + description: | + Kubernetes namespace + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes node name + - name: pod + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes pod name + - name: uid + type: keyword + description: | + Kubernetes Pod UID +- name: observer + type: group + fields: + - name: listening + type: keyword + description: | + Address the server is listening on. + - name: version_major + type: byte + description: | + Major version number of the observer +- name: experimental + type: object + description: Additional experimental data sent by the agents. +- name: system + type: group + description: | + `system` contains local system metrics. + fields: + - name: cpu + type: group + description: | + `cpu` contains local CPU stats. + fields: + - name: total.norm.pct + type: scaled_float + format: percent + description: | + The percentage of CPU time spent by the process since the last event. This value is normalized by the number of CPU cores and it ranges from 0 to 100%. + - name: memory + type: group + description: | + `memory` contains local memory stats. + fields: + - name: total + type: long + format: bytes + description: | + Total memory. + - name: actual + type: group + description: | + Actual memory used and free. + fields: + - name: free + type: long + format: bytes + description: | + Actual free memory in bytes. It is calculated based on the OS. On Linux it consists of the free memory plus caches and buffers. On OSX it is a sum of free memory and the inactive memory. On Windows, it is equal to `system.memory.free`. + - name: process + type: group + description: | + `process` contains process metadata, CPU metrics, and memory metrics. + fields: + - name: cpu + type: group + description: | + `cpu` contains local CPU stats. + fields: + - name: total.norm.pct + type: scaled_float + format: percent + description: | + The percentage of CPU time spent by the process since the last event. This value is normalized by the number of CPU cores and it ranges from 0 to 100%. + - name: memory + type: group + description: Memory-specific statistics per process. + fields: + - name: size + type: long + format: bytes + description: | + The total virtual memory the process has. + - name: rss.bytes + type: long + format: bytes + description: | + The Resident Set Size. The amount of memory the process occupied in main memory (RAM). + - name: cgroup + type: group + description: Metrics and limits for the cgroup, collected by APM agents on Linux. + fields: + - name: memory + type: group + description: Memory-specific cgroup metrics and limits. + fields: + - name: mem.limit.bytes + type: long + format: bytes + description: Memory limit for the current cgroup slice. + - name: mem.usage.bytes + type: long + format: bytes + description: Memory usage by the current cgroup slice. +- name: processor.name + type: keyword + description: Processor name. +- name: processor.event + type: keyword + description: Processor event. +- name: timestamp + type: group + fields: + - name: us + type: long + description: | + Timestamp of the event in microseconds since Unix epoch. +- name: service + type: group + description: | + Service fields. + fields: + - name: environment + type: keyword + description: | + Service environment. + - name: language + type: group + fields: + - name: name + type: keyword + description: | + Name of the programming language used. + - name: version + type: keyword + description: | + Version of the programming language used. + - name: runtime + type: group + fields: + - name: name + type: keyword + description: | + Name of the runtime used. + - name: version + type: keyword + description: | + Version of the runtime used. + - name: framework + type: group + fields: + - name: name + type: keyword + description: | + Name of the framework used. + - name: version + type: keyword + description: | + Version of the framework used. +- name: kubernetes + title: Kubernetes + type: group + description: | + Kubernetes metadata reported by agents + fields: + - name: namespace + type: keyword + description: | + Kubernetes namespace + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes node name + - name: pod + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes pod name + - name: uid + type: keyword + description: | + Kubernetes Pod UID +- name: observer + type: group + fields: + - name: listening + type: keyword + description: | + Address the server is listening on. + - name: version_major + type: byte + description: | + Major version number of the observer +- name: experimental + type: object + description: Additional experimental data sent by the agents. +- name: profile + type: group + fields: + - name: id + type: keyword + description: | + Unique ID for the profile. All samples within a profile will have the same profile ID. + - name: duration + type: long + description: | + Duration of the profile, in microseconds. All samples within a profile will have the same duration. To aggregate durations, you should first group by the profile ID. + - name: cpu + type: group + fields: + - name: ns + type: long + description: | + Amount of CPU time profiled, in nanoseconds. + - name: samples + type: group + fields: + - name: count + type: long + description: | + Number of profile samples for the profiling period. + - name: alloc_objects + type: group + fields: + - name: count + type: long + description: | + Number of objects allocated since the process started. + - name: alloc_space + type: group + fields: + - name: bytes + type: long + description: | + Amount of memory allocated, in bytes, since the process started. + - name: inuse_objects + type: group + fields: + - name: count + type: long + description: | + Number of objects allocated and currently in use. + - name: inuse_space + type: group + fields: + - name: bytes + type: long + description: | + Amount of memory allocated, in bytes, and currently in use. + - name: top + type: group + fields: + - name: id + type: keyword + description: | + Unique ID for the top stack frame in the context of its callers. + - name: function + type: keyword + description: | + Function name for the top stack frame. + - name: filename + type: keyword + description: | + Source code filename for the top stack frame. + - name: line + type: long + description: | + Source code line number for the top stack frame. + - name: stack + type: group + fields: + - name: id + type: keyword + description: | + Unique ID for a stack frame in the context of its callers. + - name: function + type: keyword + description: | + Function name for a stack frame. + - name: filename + type: keyword + description: | + Source code filename for a stack frame. + - name: line + type: long + description: | + Source code line number for a stack frame. +- name: transaction + type: group + fields: + - name: duration + type: group + fields: + - name: histogram + type: histogram + description: | + Pre-aggregated histogram of transaction durations. +- name: metricset.period + type: long +- name: span + type: group + fields: + - name: destination.service + type: group + fields: + - name: response_time.count + type: long + - name: response_time.sum.us + type: long diff --git a/apmpackage/apm/0.1.0/data_stream/metrics/manifest.yml b/apmpackage/apm/0.1.0/data_stream/metrics/manifest.yml new file mode 100644 index 0000000000..fe1408e888 --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/metrics/manifest.yml @@ -0,0 +1,2 @@ +title: APM metrics +type: metrics diff --git a/apmpackage/apm/0.1.0/data_stream/traces/fields/base-fields.yml b/apmpackage/apm/0.1.0/data_stream/traces/fields/base-fields.yml new file mode 100644 index 0000000000..bef973826b --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/traces/fields/base-fields.yml @@ -0,0 +1,12 @@ +- name: '@timestamp' + type: date + description: Event timestamp. +- name: data_stream.type + type: constant_keyword + description: Data stream type. +- name: data_stream.dataset + type: constant_keyword + description: Data stream dataset. +- name: data_stream.namespace + type: constant_keyword + description: Data stream namespace. diff --git a/apmpackage/apm/0.1.0/data_stream/traces/fields/ecs.yml b/apmpackage/apm/0.1.0/data_stream/traces/fields/ecs.yml new file mode 100644 index 0000000000..c6a0e07916 --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/traces/fields/ecs.yml @@ -0,0 +1,717 @@ +- name: url + type: group + description: | + A complete Url, with scheme, host and path. + fields: + - name: scheme + type: keyword + description: | + The protocol of the request, e.g. "https:". + - name: full + type: keyword + description: | + The full, possibly agent-assembled URL of the request, e.g https://example.com:443/search?q=elasticsearch#top. + - name: domain + type: keyword + description: | + The hostname of the request, e.g. "example.com". + - name: port + type: long + description: | + The port of the request, e.g. 443. + - name: path + type: keyword + description: | + The path of the request, e.g. "/search". + - name: query + type: keyword + description: | + The query string of the request, e.g. "q=elasticsearch". + - name: fragment + type: keyword + description: | + A fragment specifying a location in a web page , e.g. "top". +- name: http + type: group + fields: + - name: version + type: keyword + description: | + The http version of the request leading to this event. + - name: request + type: group + fields: + - name: method + type: keyword + description: | + The http method of the request leading to this event. + - name: referrer + type: keyword + description: Referrer for this HTTP request. + ignore_above: 1024 + - name: response + type: group + fields: + - name: status_code + type: long + description: | + The status code of the HTTP response. +- name: labels + type: object + description: | + A flat mapping of user-defined labels with string, boolean or number values. +- name: service + type: group + description: | + Service fields. + fields: + - name: name + type: keyword + description: | + Immutable name of the service emitting this event. + - name: version + type: keyword + description: | + Version of the service emitting this event. + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Unique meaningful name of the service node. +- name: transaction + type: group + fields: + - name: id + type: keyword + description: | + The transaction ID. +- name: trace + type: group + fields: + - name: id + type: keyword + description: | + The ID of the trace to which the event belongs to. +- name: agent + type: group + fields: + - name: name + type: keyword + description: | + Name of the agent used. + - name: version + type: keyword + description: | + Version of the agent used. + - name: ephemeral_id + type: keyword + description: | + The Ephemeral ID identifies a running process. +- name: container + title: Container + type: group + description: | + Container fields are used for meta information about the specific container that is the source of information. These fields help correlate data based containers from any runtime. + fields: + - name: id + type: keyword + description: | + Unique container id. +- name: host + type: group + description: | + Optional host fields. + fields: + - name: architecture + type: keyword + description: | + The architecture of the host the event was recorded on. + - name: hostname + type: keyword + description: | + The hostname of the host the event was recorded on. + - name: name + type: keyword + description: | + Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user. + - name: ip + type: ip + description: | + IP of the host that records the event. + - name: os + title: Operating System + group: 2 + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + The platform of the host the event was recorded on. +- name: process + type: group + description: | + Information pertaining to the running process where the data was collected + fields: + - name: args + level: extended + type: keyword + description: | + Process arguments. May be filtered to protect sensitive information. + - name: pid + type: long + description: | + Numeric process ID of the service process. + - name: ppid + type: long + description: | + Numeric ID of the service's parent process. + - name: title + type: keyword + description: | + Service process title. +- name: observer + type: group + fields: + - name: hostname + type: keyword + description: | + Hostname of the APM Server. + - name: version + type: keyword + description: | + APM Server version. + - name: type + type: keyword + description: | + The type will be set to `apm-server`. +- name: user + type: group + fields: + - name: name + type: keyword + description: | + The username of the logged in user. + - name: id + type: keyword + description: | + Identifier of the logged in user. + - name: email + type: keyword + description: | + Email of the logged in user. +- name: client + type: group + fields: + - name: ip + type: ip + description: | + IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: source + type: group + fields: + - name: ip + type: ip + description: | + IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: destination + title: Destination + group: 2 + type: group + description: |- + Destination fields describe details about the destination of a packet/event. + Destination fields are usually populated in conjunction with source fields. + fields: + - name: address + level: extended + type: keyword + description: Some event destination addresses are defined ambiguously. The event + will sometimes list an IP, a domain or a unix socket. You should always store + the raw address in the `.address` field. Then it should be duplicated to `.ip` + or `.domain`, depending on which one it is. + ignore_above: 1024 + - name: ip + level: core + type: ip + description: IP addess of the destination. Can be one of multiple IPv4 or IPv6 + addresses. + - name: port + level: core + type: long + format: string + description: Port of the destination. +- name: user_agent + title: User agent + type: group + description: | + The user_agent fields normally come from a browser request. They often show up in web service logs coming from the parsed user agent string. + fields: + - name: original + type: keyword + description: | + Unparsed version of the user_agent. + multi_fields: + - name: text + type: text + - name: name + type: keyword + description: | + Name of the user agent. + - name: version + type: keyword + description: | + Version of the user agent. + - name: device + title: Device + type: group + description: | + Information concerning the device. + fields: + - name: name + type: keyword + description: | + Name of the device. + - name: os + title: Operating System + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + Operating system platform (such centos, ubuntu, windows). + - name: name + type: keyword + description: | + Operating system name, without the version. + - name: full + type: keyword + description: | + Operating system name, including the version or code name. + - name: family + type: keyword + description: | + OS family (such as redhat, debian, freebsd, windows). + - name: version + type: keyword + description: | + Operating system version as a raw string. + - name: kernel + type: keyword + description: | + Operating system kernel version as a raw string. +- name: cloud + title: Cloud + group: 2 + type: group + description: | + Cloud metadata reported by agents + fields: + - name: account + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud account ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud account name + ignore_above: 1024 + - name: availability_zone + level: extended + type: keyword + description: Cloud availability zone name + ignore_above: 1024 + - name: instance + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud instance/machine ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud instance/machine name + ignore_above: 1024 + - name: machine + type: group + fields: + - name: type + level: extended + type: keyword + description: Cloud instance/machine type + ignore_above: 1024 + - name: project + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud project ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud project name + ignore_above: 1024 + - name: provider + level: extended + type: keyword + description: Cloud provider name + ignore_above: 1024 + - name: region + level: extended + type: keyword + description: Cloud region name + ignore_above: 1024 +- name: event + type: group + fields: + - name: outcome + level: core + type: keyword + description: | + `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event. + ignore_above: 1024 +- name: labels + type: object + description: | + A flat mapping of user-defined labels with string, boolean or number values. +- name: service + type: group + description: | + Service fields. + fields: + - name: name + type: keyword + description: | + Immutable name of the service emitting this event. + - name: version + type: keyword + description: | + Version of the service emitting this event. + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Unique meaningful name of the service node. +- name: transaction + type: group + fields: + - name: id + type: keyword + description: | + The transaction ID. +- name: trace + type: group + fields: + - name: id + type: keyword + description: | + The ID of the trace to which the event belongs to. +- name: agent + type: group + fields: + - name: name + type: keyword + description: | + Name of the agent used. + - name: version + type: keyword + description: | + Version of the agent used. + - name: ephemeral_id + type: keyword + description: | + The Ephemeral ID identifies a running process. +- name: container + title: Container + type: group + description: | + Container fields are used for meta information about the specific container that is the source of information. These fields help correlate data based containers from any runtime. + fields: + - name: id + type: keyword + description: | + Unique container id. +- name: host + type: group + description: | + Optional host fields. + fields: + - name: architecture + type: keyword + description: | + The architecture of the host the event was recorded on. + - name: hostname + type: keyword + description: | + The hostname of the host the event was recorded on. + - name: name + type: keyword + description: | + Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user. + - name: ip + type: ip + description: | + IP of the host that records the event. + - name: os + title: Operating System + group: 2 + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + The platform of the host the event was recorded on. +- name: process + type: group + description: | + Information pertaining to the running process where the data was collected + fields: + - name: args + level: extended + type: keyword + description: | + Process arguments. May be filtered to protect sensitive information. + - name: pid + type: long + description: | + Numeric process ID of the service process. + - name: ppid + type: long + description: | + Numeric ID of the service's parent process. + - name: title + type: keyword + description: | + Service process title. +- name: observer + type: group + fields: + - name: hostname + type: keyword + description: | + Hostname of the APM Server. + - name: version + type: keyword + description: | + APM Server version. + - name: type + type: keyword + description: | + The type will be set to `apm-server`. +- name: user + type: group + fields: + - name: name + type: keyword + description: | + The username of the logged in user. + - name: id + type: keyword + description: | + Identifier of the logged in user. + - name: email + type: keyword + description: | + Email of the logged in user. +- name: client + type: group + fields: + - name: ip + type: ip + description: | + IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: source + type: group + fields: + - name: ip + type: ip + description: | + IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: destination + title: Destination + group: 2 + type: group + description: |- + Destination fields describe details about the destination of a packet/event. + Destination fields are usually populated in conjunction with source fields. + fields: + - name: address + level: extended + type: keyword + description: Some event destination addresses are defined ambiguously. The event + will sometimes list an IP, a domain or a unix socket. You should always store + the raw address in the `.address` field. Then it should be duplicated to `.ip` + or `.domain`, depending on which one it is. + ignore_above: 1024 + - name: ip + level: core + type: ip + description: IP addess of the destination. Can be one of multiple IPv4 or IPv6 + addresses. + - name: port + level: core + type: long + format: string + description: Port of the destination. +- name: user_agent + title: User agent + type: group + description: | + The user_agent fields normally come from a browser request. They often show up in web service logs coming from the parsed user agent string. + fields: + - name: original + type: keyword + description: | + Unparsed version of the user_agent. + multi_fields: + - name: text + type: text + - name: name + type: keyword + description: | + Name of the user agent. + - name: version + type: keyword + description: | + Version of the user agent. + - name: device + title: Device + type: group + description: | + Information concerning the device. + fields: + - name: name + type: keyword + description: | + Name of the device. + - name: os + title: Operating System + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + Operating system platform (such centos, ubuntu, windows). + - name: name + type: keyword + description: | + Operating system name, without the version. + - name: full + type: keyword + description: | + Operating system name, including the version or code name. + - name: family + type: keyword + description: | + OS family (such as redhat, debian, freebsd, windows). + - name: version + type: keyword + description: | + Operating system version as a raw string. + - name: kernel + type: keyword + description: | + Operating system kernel version as a raw string. +- name: cloud + title: Cloud + group: 2 + type: group + description: | + Cloud metadata reported by agents + fields: + - name: account + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud account ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud account name + ignore_above: 1024 + - name: availability_zone + level: extended + type: keyword + description: Cloud availability zone name + ignore_above: 1024 + - name: instance + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud instance/machine ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud instance/machine name + ignore_above: 1024 + - name: machine + type: group + fields: + - name: type + level: extended + type: keyword + description: Cloud instance/machine type + ignore_above: 1024 + - name: project + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud project ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud project name + ignore_above: 1024 + - name: provider + level: extended + type: keyword + description: Cloud provider name + ignore_above: 1024 + - name: region + level: extended + type: keyword + description: Cloud region name + ignore_above: 1024 +- name: event + type: group + fields: + - name: outcome + level: core + type: keyword + description: | + `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event. + ignore_above: 1024 +- name: span + type: group + fields: + - name: id + type: keyword + description: | + The ID of the span stored as hex encoded string. diff --git a/apmpackage/apm/0.1.0/data_stream/traces/fields/fields.yml b/apmpackage/apm/0.1.0/data_stream/traces/fields/fields.yml new file mode 100644 index 0000000000..a1839bc0cc --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/traces/fields/fields.yml @@ -0,0 +1,523 @@ +- name: processor.name + type: keyword + description: Processor name. +- name: processor.event + type: keyword + description: Processor event. +- name: timestamp + type: group + fields: + - name: us + type: long + description: | + Timestamp of the event in microseconds since Unix epoch. +- name: http + type: group + fields: + - name: request + type: group + fields: + - name: headers + type: object + description: | + The canonical headers of the monitored HTTP request. + - name: response + type: group + fields: + - name: finished + type: boolean + description: | + Used by the Node agent to indicate when in the response life cycle an error has occurred. + - name: headers + type: object + description: | + The canonical headers of the monitored HTTP response. +- name: service + type: group + description: | + Service fields. + fields: + - name: environment + type: keyword + description: | + Service environment. + - name: language + type: group + fields: + - name: name + type: keyword + description: | + Name of the programming language used. + - name: version + type: keyword + description: | + Version of the programming language used. + - name: runtime + type: group + fields: + - name: name + type: keyword + description: | + Name of the runtime used. + - name: version + type: keyword + description: | + Version of the runtime used. + - name: framework + type: group + fields: + - name: name + type: keyword + description: | + Name of the framework used. + - name: version + type: keyword + description: | + Version of the framework used. +- name: transaction + type: group + fields: + - name: sampled + type: boolean + description: | + Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context. + - name: type + type: keyword + description: | + Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc) + - name: name + type: keyword + description: | + Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id'). + multi_fields: + - name: text + type: text + - name: duration + type: group + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: self_time + type: group + description: | + Portion of the transaction's duration where no direct child was running + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: breakdown + type: group + description: | + Counter for collected breakdowns for the transaction + fields: + - name: count + type: long +- name: span + type: group + fields: + - name: type + type: keyword + description: | + Keyword of specific relevance in the service's domain (eg: 'db.postgresql.query', 'template.erb', 'cache', etc). + - name: subtype + type: keyword + description: | + A further sub-division of the type (e.g. postgresql, elasticsearch) + - name: self_time + type: group + description: | + Portion of the span's duration where no direct child was running + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long +- name: parent + type: group + fields: + - name: id + type: keyword + description: | + The ID of the parent event. +- name: kubernetes + title: Kubernetes + type: group + description: | + Kubernetes metadata reported by agents + fields: + - name: namespace + type: keyword + description: | + Kubernetes namespace + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes node name + - name: pod + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes pod name + - name: uid + type: keyword + description: | + Kubernetes Pod UID +- name: observer + type: group + fields: + - name: listening + type: keyword + description: | + Address the server is listening on. + - name: version_major + type: byte + description: | + Major version number of the observer +- name: experimental + type: object + description: Additional experimental data sent by the agents. +- name: transaction + type: group + fields: + - name: duration + type: group + fields: + - name: us + type: long + description: | + Total duration of this transaction, in microseconds. + - name: result + type: keyword + description: | + The result of the transaction. HTTP status code for HTTP-related transactions. + - name: marks + type: object + description: | + A user-defined mapping of groups of marks in milliseconds. + - name: marks.*.* + type: object + - name: experience + type: group + fields: + - name: cls + type: scaled_float + description: The Cumulative Layout Shift metric + - name: fid + type: scaled_float + description: The First Input Delay metric + - name: tbt + type: scaled_float + description: The Total Blocking Time metric + - name: longtask + type: group + description: Longtask duration/count metrics + fields: + - name: count + type: long + description: The total number of of longtasks + - name: sum + type: scaled_float + description: The sum of longtask durations + - name: max + type: scaled_float + description: The max longtask duration + - name: span_count + type: group + fields: + - name: dropped + type: long + description: The total amount of dropped spans for this transaction. + - name: message + type: group + fields: + - name: queue + type: group + fields: + - name: name + type: keyword + description: | + Name of the message queue or topic where the message is published or received. + - name: age + type: group + fields: + - name: ms + type: long + description: | + Age of a message in milliseconds. +- name: processor.name + type: keyword + description: Processor name. +- name: processor.event + type: keyword + description: Processor event. +- name: timestamp + type: group + fields: + - name: us + type: long + description: | + Timestamp of the event in microseconds since Unix epoch. +- name: service + type: group + description: | + Service fields. + fields: + - name: environment + type: keyword + description: | + Service environment. + - name: language + type: group + fields: + - name: name + type: keyword + description: | + Name of the programming language used. + - name: version + type: keyword + description: | + Version of the programming language used. + - name: runtime + type: group + fields: + - name: name + type: keyword + description: | + Name of the runtime used. + - name: version + type: keyword + description: | + Version of the runtime used. + - name: framework + type: group + fields: + - name: name + type: keyword + description: | + Name of the framework used. + - name: version + type: keyword + description: | + Version of the framework used. +- name: transaction + type: group + fields: + - name: sampled + type: boolean + description: | + Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context. + - name: type + type: keyword + description: | + Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc) + - name: name + type: keyword + description: | + Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id'). + multi_fields: + - name: text + type: text + - name: duration + type: group + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: self_time + type: group + description: | + Portion of the transaction's duration where no direct child was running + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: breakdown + type: group + description: | + Counter for collected breakdowns for the transaction + fields: + - name: count + type: long +- name: span + type: group + fields: + - name: type + type: keyword + description: | + Keyword of specific relevance in the service's domain (eg: 'db.postgresql.query', 'template.erb', 'cache', etc). + - name: subtype + type: keyword + description: | + A further sub-division of the type (e.g. postgresql, elasticsearch) + - name: self_time + type: group + description: | + Portion of the span's duration where no direct child was running + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long +- name: parent + type: group + fields: + - name: id + type: keyword + description: | + The ID of the parent event. +- name: kubernetes + title: Kubernetes + type: group + description: | + Kubernetes metadata reported by agents + fields: + - name: namespace + type: keyword + description: | + Kubernetes namespace + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes node name + - name: pod + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes pod name + - name: uid + type: keyword + description: | + Kubernetes Pod UID +- name: observer + type: group + fields: + - name: listening + type: keyword + description: | + Address the server is listening on. + - name: version_major + type: byte + description: | + Major version number of the observer +- name: experimental + type: object + description: Additional experimental data sent by the agents. +- name: view spans + type: keyword + format: url +- name: child + type: group + fields: + - name: id + type: keyword + description: | + The ID(s)s of the child event(s). +- name: span + type: group + fields: + - name: name + type: keyword + description: | + Generic designation of a span in the scope of a transaction. + - name: action + type: keyword + description: | + The specific kind of event within the sub-type represented by the span (e.g. query, connect) + - name: start + type: group + fields: + - name: us + type: long + description: | + Offset relative to the transaction's timestamp identifying the start of the span, in microseconds. + - name: duration + type: group + fields: + - name: us + type: long + description: | + Duration of the span, in microseconds. + - name: sync + type: boolean + description: | + Indicates whether the span was executed synchronously or asynchronously. + - name: db + type: group + fields: + - name: link + type: keyword + description: | + Database link. + - name: rows_affected + type: long + description: | + Number of rows affected by the database statement. + - name: destination + type: group + fields: + - name: service + type: group + description: Destination service context + fields: + - name: type + type: keyword + description: | + Type of the destination service (e.g. 'db', 'elasticsearch'). Should typically be the same as span.type. + - name: name + type: keyword + description: | + Identifier for the destination service (e.g. 'http://elastic.co', 'elasticsearch', 'rabbitmq') + - name: resource + type: keyword + description: | + Identifier for the destination service resource being operated on (e.g. 'http://elastic.co:80', 'elasticsearch', 'rabbitmq/queue_name') + - name: message + type: group + fields: + - name: queue + type: group + fields: + - name: name + type: keyword + description: | + Name of the message queue or topic where the message is published or received. + - name: age + type: group + fields: + - name: ms + type: long + description: | + Age of a message in milliseconds. diff --git a/apmpackage/apm/0.1.0/data_stream/traces/manifest.yml b/apmpackage/apm/0.1.0/data_stream/traces/manifest.yml new file mode 100644 index 0000000000..2734366240 --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/traces/manifest.yml @@ -0,0 +1,2 @@ +title: APM traces +type: traces diff --git a/apmpackage/apm/0.1.0/docs/README.md b/apmpackage/apm/0.1.0/docs/README.md new file mode 100644 index 0000000000..d14954a78e --- /dev/null +++ b/apmpackage/apm/0.1.0/docs/README.md @@ -0,0 +1,921 @@ +# APM Integration + +The APM integration installs templates and pipelines for APM data. +If a policy contains an `apm` input, any Elastic Agent(s) set up with that policy will run an APM Server binary, and bind to `localhost:8200`. +You must configure your APM Agents to communicate with that APM Server. + +If you have RUM enabled, you must run APM Server centrally. Otherwise, you can run it at the edge machines. +To do so, download and enroll an Elastic Agent in the same machines where your instrumented services run. + + +### Compatibility and limitations + +The APM integration requires Kibana 7.11 and Elasticsearch with basic license. +This version is experimental and has some limitations, listed bellow: + +- Elastic Cloud is not supported. +- Standalone mode is not supported. +- If you need to customize settings for APM Server, you need to update the agent policy manually. +Look for `apm-server` in the `apm` input. +- It is not possible to change APM Server settings dynamically. +You must update the policy with any changes you need and stop the APM Server process. + + +### Configuration parameters + +- `RUM`: Enables support for RUM monitoring. See the [documentation](https://www.elastic.co/guide/en/apm/server/current/configuration-rum.html) for details. + + +### Traces + +Traces are comprised of [spans and transactions](https://www.elastic.co/guide/en/apm/get-started/current/apm-data-model.html). +Traces are written to `traces-apm.*` indices. + +**Exported Fields** + +| Field | Description | Type | ECS | +|---|---|---|:---:| +|@timestamp|Event timestamp.|date| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.type|Data stream type.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.dataset|Data stream dataset.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.namespace|Data stream namespace.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.ephemeral_id|The Ephemeral ID identifies a running process.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.ephemeral_id|The Ephemeral ID identifies a running process.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.name|Name of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.name|Name of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.version|Version of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.version|Version of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|child.id|The ID(s)s of the child event(s).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|client.ip|IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|client.ip|IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.id|Cloud account ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.id|Cloud account ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.name|Cloud account name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.name|Cloud account name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.availability_zone|Cloud availability zone name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.availability_zone|Cloud availability zone name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.id|Cloud instance/machine ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.id|Cloud instance/machine ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.name|Cloud instance/machine name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.name|Cloud instance/machine name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.machine.type|Cloud instance/machine type|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.machine.type|Cloud instance/machine type|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.id|Cloud project ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.id|Cloud project ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.name|Cloud project name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.name|Cloud project name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.provider|Cloud provider name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.provider|Cloud provider name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.region|Cloud region name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.region|Cloud region name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|container.id|Unique container id.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|container.id|Unique container id.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.address|Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.address|Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.ip|IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.ip|IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.port|Port of the destination.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.port|Port of the destination.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|event.outcome|`event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|event.outcome|`event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|host.architecture|The architecture of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.architecture|The architecture of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.hostname|The hostname of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.hostname|The hostname of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.ip|IP of the host that records the event.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.ip|IP of the host that records the event.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.name|Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.name|Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.os.platform|The platform of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.os.platform|The platform of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.request.headers|The canonical headers of the monitored HTTP request.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|http.request.method|The http method of the request leading to this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.request.referrer|Referrer for this HTTP request.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.response.finished|Used by the Node agent to indicate when in the response life cycle an error has occurred.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|http.response.headers|The canonical headers of the monitored HTTP response.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|http.response.status_code|The status code of the HTTP response.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.version|The http version of the request leading to this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|kubernetes.namespace|Kubernetes namespace|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.namespace|Kubernetes namespace|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.node.name|Kubernetes node name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.node.name|Kubernetes node name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.name|Kubernetes pod name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.name|Kubernetes pod name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.uid|Kubernetes Pod UID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.uid|Kubernetes Pod UID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|labels|A flat mapping of user-defined labels with string, boolean or number values.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|labels|A flat mapping of user-defined labels with string, boolean or number values.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.hostname|Hostname of the APM Server.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.hostname|Hostname of the APM Server.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.listening|Address the server is listening on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.listening|Address the server is listening on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.type|The type will be set to `apm-server`.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.type|The type will be set to `apm-server`.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version|APM Server version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version|APM Server version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version_major|Major version number of the observer|byte| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.version_major|Major version number of the observer|byte| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|parent.id|The ID of the parent event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|parent.id|The ID of the parent event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|process.args|Process arguments. May be filtered to protect sensitive information.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.args|Process arguments. May be filtered to protect sensitive information.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.pid|Numeric process ID of the service process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.pid|Numeric process ID of the service process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.ppid|Numeric ID of the service's parent process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.ppid|Numeric ID of the service's parent process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.title|Service process title.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.title|Service process title.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|processor.event|Processor event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|processor.event|Processor event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|processor.name|Processor name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|processor.name|Processor name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.name|Name of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.name|Name of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.version|Version of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.version|Version of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.name|Name of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.name|Name of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.version|Version of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.version|Version of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.name|Immutable name of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.name|Immutable name of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.node.name|Unique meaningful name of the service node.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.node.name|Unique meaningful name of the service node.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.runtime.name|Name of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.runtime.name|Name of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.runtime.version|Version of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.runtime.version|Version of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.version|Version of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.version|Version of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|source.ip|IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|source.ip|IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|span.action|The specific kind of event within the sub-type represented by the span (e.g. query, connect)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.db.link|Database link.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.db.rows_affected|Number of rows affected by the database statement.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.destination.service.name|Identifier for the destination service (e.g. 'http://elastic.co', 'elasticsearch', 'rabbitmq')|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.destination.service.resource|Identifier for the destination service resource being operated on (e.g. 'http://elastic.co:80', 'elasticsearch', 'rabbitmq/queue_name')|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.destination.service.type|Type of the destination service (e.g. 'db', 'elasticsearch'). Should typically be the same as span.type.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.duration.us|Duration of the span, in microseconds.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.id|The ID of the span stored as hex encoded string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|span.message.age.ms|Age of a message in milliseconds.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.message.queue.name|Name of the message queue or topic where the message is published or received.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.name|Generic designation of a span in the scope of a transaction.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.self_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.self_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.self_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.self_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.start.us|Offset relative to the transaction's timestamp identifying the start of the span, in microseconds.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.subtype|A further sub-division of the type (e.g. postgresql, elasticsearch)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.subtype|A further sub-division of the type (e.g. postgresql, elasticsearch)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.sync|Indicates whether the span was executed synchronously or asynchronously.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.type|Keyword of specific relevance in the service's domain (eg: 'db.postgresql.query', 'template.erb', 'cache', etc).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.type|Keyword of specific relevance in the service's domain (eg: 'db.postgresql.query', 'template.erb', 'cache', etc).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|trace.id|The ID of the trace to which the event belongs to.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|trace.id|The ID of the trace to which the event belongs to.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|transaction.breakdown.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.breakdown.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.us|Total duration of this transaction, in microseconds.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.experience.cls|The Cumulative Layout Shift metric|scaled_float| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.experience.fid|The First Input Delay metric|scaled_float| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.experience.longtask.count|The total number of of longtasks|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.experience.longtask.max|The max longtask duration|scaled_float| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.experience.longtask.sum|The sum of longtask durations|scaled_float| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.experience.tbt|The Total Blocking Time metric|scaled_float| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|transaction.marks|A user-defined mapping of groups of marks in milliseconds.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.marks.*.*||object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.message.age.ms|Age of a message in milliseconds.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.message.queue.name|Name of the message queue or topic where the message is published or received.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.name|Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id').|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.name|Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id').|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.result|The result of the transaction. HTTP status code for HTTP-related transactions.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.sampled|Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.sampled|Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.span_count.dropped|The total amount of dropped spans for this transaction.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.type|Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.type|Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|url.domain|The hostname of the request, e.g. "example.com".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.fragment|A fragment specifying a location in a web page , e.g. "top".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.full|The full, possibly agent-assembled URL of the request, e.g https://example.com:443/search?q=elasticsearch#top.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.path|The path of the request, e.g. "/search".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.port|The port of the request, e.g. 443.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.query|The query string of the request, e.g. "q=elasticsearch".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.scheme|The protocol of the request, e.g. "https:".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.email|Email of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.email|Email of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.id|Identifier of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.id|Identifier of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.name|The username of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.name|The username of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.device.name|Name of the device.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.device.name|Name of the device.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.name|Name of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.name|Name of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.original|Unparsed version of the user_agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.original|Unparsed version of the user_agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.family|OS family (such as redhat, debian, freebsd, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.family|OS family (such as redhat, debian, freebsd, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.full|Operating system name, including the version or code name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.full|Operating system name, including the version or code name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.kernel|Operating system kernel version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.kernel|Operating system kernel version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.name|Operating system name, without the version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.name|Operating system name, without the version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.platform|Operating system platform (such centos, ubuntu, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.platform|Operating system platform (such centos, ubuntu, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.version|Operating system version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.version|Operating system version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.version|Version of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.version|Version of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|view spans||keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | + + +#### Examples + +```json +{ + "@timestamp": "2017-05-30T18:53:42.281Z", + "agent": { + "name": "elastic-node", + "version": "3.14.0" + }, + "container": { + "id": "container-id" + }, + "ecs": { + "version": "1.6.0" + }, + "event": { + "ingested": "2020-08-11T09:55:04.391451Z", + "outcome": "unknown" + }, + "host": { + "architecture": "x64", + "ip": "127.0.0.1", + "os": { + "platform": "darwin" + } + }, + "kubernetes": { + "namespace": "namespace1", + "pod": { + "name": "pod-name", + "uid": "pod-uid" + } + }, + "observer": { + "ephemeral_id": "f78f6762-2157-4322-95aa-aecd2f486c1a", + "hostname": "ix.lan", + "id": "80b79979-4a7d-450d-b2ce-75c589f7fffd", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "node", + "server.js" + ], + "pid": 1234, + "ppid": 6789, + "title": "node" + }, + "processor": { + "event": "transaction", + "name": "transaction" + }, + "service": { + "environment": "staging", + "framework": { + "name": "Express", + "version": "1.2.3" + }, + "language": { + "name": "ecmascript", + "version": "8" + }, + "name": "1234_service-12a3", + "node": { + "name": "container-id" + }, + "runtime": { + "name": "node", + "version": "8.0.0" + }, + "version": "5.1.3" + }, + "timestamp": { + "us": 1496170422281000 + }, + "trace": { + "id": "85925e55b43f4340aaaaaaaaaaaaaaaa" + }, + "transaction": { + "duration": { + "us": 13980 + }, + "id": "85925e55b43f4340", + "name": "GET /api/types", + "result": "failure", + "sampled": true, + "span_count": { + "started": 0 + }, + "type": "request" + }, + "user": { + "email": "foo@bar.com", + "id": "123user", + "name": "foo" + } +} +``` + +```json +{ + "@timestamp": "2017-05-30T18:53:27.154Z", + "agent": { + "name": "elastic-node", + "version": "3.14.0" + }, + "ecs": { + "version": "1.6.0" + }, + "event": { + "outcome": "unknown" + }, + "labels": { + "span_tag": "something" + }, + "observer": { + "ephemeral_id": "c0cea3b6-97d7-4e15-9e35-c868e7a3c869", + "hostname": "ix.lan", + "id": "a49b4a08-689a-4724-8050-8bd0ae043281", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "parent": { + "id": "945254c567a5417e" + }, + "processor": { + "event": "span", + "name": "transaction" + }, + "service": { + "environment": "staging", + "name": "1234_service-12a3" + }, + "span": { + "action": "query", + "db": { + "instance": "customers", + "statement": "SELECT * FROM product_types WHERE user_id=?", + "type": "sql", + "user": { + "name": "readonly_user" + } + }, + "duration": { + "us": 3781 + }, + "http": { + "method": "GET", + "response": { + "status_code": 200 + }, + "url": { + "original": "http://localhost:8000" + } + }, + "id": "0aaaaaaaaaaaaaaa", + "name": "SELECT FROM product_types", + "stacktrace": [ + { + "abs_path": "net.js", + "context": { + "post": [ + " ins.currentTransaction = prev", + " return result", + "}" + ], + "pre": [ + " var trans = this.currentTransaction", + "" + ] + }, + "exclude_from_grouping": false, + "filename": "net.js", + "function": "onread", + "library_frame": true, + "line": { + "column": 4, + "context": "line3", + "number": 547 + }, + "module": "some module", + "vars": { + "key": "value" + } + }, + { + "exclude_from_grouping": false, + "filename": "my2file.js", + "line": { + "number": 10 + } + } + ], + "start": { + "us": 2830 + }, + "subtype": "postgresql", + "sync": false, + "type": "db" + }, + "timestamp": { + "us": 1496170407154000 + }, + "trace": { + "id": "945254c567a5417eaaaaaaaaaaaaaaaa" + }, + "transaction": { + "id": "945254c567a5417e" + } +} +``` + + +### Metrics + +Metrics include application-based metrics and some basic system metrics. +Metrics are written to `metrics-apm.*`, `metrics-apm.internal.*` and `metrics-apm.profiling.*` indices. + +**Exported Fields** + +| Field | Description | Type | ECS | +|---|---|---|:---:| +|@timestamp|Event timestamp.|date| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.type|Data stream type.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.dataset|Data stream dataset.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.namespace|Data stream namespace.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.ephemeral_id|The Ephemeral ID identifies a running process.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.ephemeral_id|The Ephemeral ID identifies a running process.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.name|Name of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.name|Name of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.version|Version of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.version|Version of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|client.ip|IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|client.ip|IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.id|Cloud account ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.id|Cloud account ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.name|Cloud account name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.name|Cloud account name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.availability_zone|Cloud availability zone name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.availability_zone|Cloud availability zone name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.id|Cloud instance/machine ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.id|Cloud instance/machine ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.name|Cloud instance/machine name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.name|Cloud instance/machine name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.machine.type|Cloud instance/machine type|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.machine.type|Cloud instance/machine type|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.id|Cloud project ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.id|Cloud project ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.name|Cloud project name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.name|Cloud project name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.provider|Cloud provider name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.provider|Cloud provider name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.region|Cloud region name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.region|Cloud region name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|container.id|Unique container id.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|container.id|Unique container id.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.address|Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.address|Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.ip|IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.ip|IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.port|Port of the destination.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.port|Port of the destination.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|event.outcome|`event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|host.architecture|The architecture of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.architecture|The architecture of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.hostname|The hostname of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.hostname|The hostname of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.ip|IP of the host that records the event.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.ip|IP of the host that records the event.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.name|Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.name|Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.os.platform|The platform of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.os.platform|The platform of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|kubernetes.namespace|Kubernetes namespace|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.namespace|Kubernetes namespace|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.node.name|Kubernetes node name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.node.name|Kubernetes node name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.name|Kubernetes pod name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.name|Kubernetes pod name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.uid|Kubernetes Pod UID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.uid|Kubernetes Pod UID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|labels|A flat mapping of user-defined labels with string, boolean or number values.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|labels|A flat mapping of user-defined labels with string, boolean or number values.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|metricset.period||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.hostname|Hostname of the APM Server.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.hostname|Hostname of the APM Server.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.listening|Address the server is listening on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.listening|Address the server is listening on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.type|The type will be set to `apm-server`.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.type|The type will be set to `apm-server`.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version|APM Server version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version|APM Server version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version_major|Major version number of the observer|byte| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.version_major|Major version number of the observer|byte| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|process.args|Process arguments. May be filtered to protect sensitive information.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.args|Process arguments. May be filtered to protect sensitive information.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.pid|Numeric process ID of the service process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.pid|Numeric process ID of the service process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.ppid|Numeric ID of the service's parent process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.ppid|Numeric ID of the service's parent process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.title|Service process title.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.title|Service process title.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|processor.event|Processor event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|processor.event|Processor event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|processor.name|Processor name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|processor.name|Processor name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.alloc_objects.count|Number of objects allocated since the process started.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.alloc_space.bytes|Amount of memory allocated, in bytes, since the process started.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.cpu.ns|Amount of CPU time profiled, in nanoseconds.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.duration|Duration of the profile, in microseconds. All samples within a profile will have the same duration. To aggregate durations, you should first group by the profile ID.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.id|Unique ID for the profile. All samples within a profile will have the same profile ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.inuse_objects.count|Number of objects allocated and currently in use.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.inuse_space.bytes|Amount of memory allocated, in bytes, and currently in use.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.samples.count|Number of profile samples for the profiling period.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.stack.filename|Source code filename for a stack frame.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.stack.function|Function name for a stack frame.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.stack.id|Unique ID for a stack frame in the context of its callers.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.stack.line|Source code line number for a stack frame.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.top.filename|Source code filename for the top stack frame.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.top.function|Function name for the top stack frame.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.top.id|Unique ID for the top stack frame in the context of its callers.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.top.line|Source code line number for the top stack frame.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.name|Name of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.name|Name of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.version|Version of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.version|Version of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.name|Name of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.name|Name of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.version|Version of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.version|Version of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.name|Immutable name of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.name|Immutable name of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.node.name|Unique meaningful name of the service node.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.node.name|Unique meaningful name of the service node.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.runtime.name|Name of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.runtime.name|Name of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.runtime.version|Version of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.runtime.version|Version of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.version|Version of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.version|Version of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|source.ip|IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|source.ip|IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|span.destination.service.response_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.destination.service.response_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.self_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.self_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.subtype|A further sub-division of the type (e.g. postgresql, elasticsearch)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.type|Keyword of specific relevance in the service's domain (eg: 'db.postgresql.query', 'template.erb', 'cache', etc).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.cpu.total.norm.pct|The percentage of CPU time spent by the process since the last event. This value is normalized by the number of CPU cores and it ranges from 0 to 100%.|scaled_float| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.memory.actual.free|Actual free memory in bytes. It is calculated based on the OS. On Linux it consists of the free memory plus caches and buffers. On OSX it is a sum of free memory and the inactive memory. On Windows, it is equal to `system.memory.free`.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.memory.total|Total memory.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.process.cgroup.memory.mem.limit.bytes|Memory limit for the current cgroup slice.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.process.cgroup.memory.mem.usage.bytes|Memory usage by the current cgroup slice.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.process.cpu.total.norm.pct|The percentage of CPU time spent by the process since the last event. This value is normalized by the number of CPU cores and it ranges from 0 to 100%.|scaled_float| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.process.memory.rss.bytes|The Resident Set Size. The amount of memory the process occupied in main memory (RAM).|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.process.memory.size|The total virtual memory the process has.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.breakdown.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.histogram|Pre-aggregated histogram of transaction durations.|histogram| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|transaction.name|Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id').|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.root|Identifies metrics for root transactions. This can be used for calculating metrics for traces.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.sampled|Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.type|Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|user.email|Email of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.email|Email of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.id|Identifier of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.id|Identifier of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.name|The username of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.name|The username of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.device.name|Name of the device.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.device.name|Name of the device.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.name|Name of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.name|Name of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.original|Unparsed version of the user_agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.original|Unparsed version of the user_agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.family|OS family (such as redhat, debian, freebsd, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.family|OS family (such as redhat, debian, freebsd, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.full|Operating system name, including the version or code name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.full|Operating system name, including the version or code name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.kernel|Operating system kernel version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.kernel|Operating system kernel version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.name|Operating system name, without the version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.name|Operating system name, without the version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.platform|Operating system platform (such centos, ubuntu, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.platform|Operating system platform (such centos, ubuntu, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.version|Operating system version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.version|Operating system version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.version|Version of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.version|Version of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | + + +#### Example + +```json +{ + "@timestamp": "2017-05-30T18:53:41.364Z", + "agent": { + "name": "elastic-node", + "version": "3.14.0" + }, + "ecs": { + "version": "1.6.0" + }, + "event": { + "ingested": "2020-04-22T14:55:05.425020Z" + }, + "go": { + "memstats": { + "heap": { + "sys": { + "bytes": 6520832 + } + } + } + }, + "host": { + "ip": "127.0.0.1" + }, + "labels": { + "tag1": "one", + "tag2": 2 + }, + "observer": { + "ephemeral_id": "8785cbe1-7f89-4279-84c2-6c33979531fb", + "hostname": "ix.lan", + "id": "b0cfe4b7-76c9-4159-95ff-e558db368cbe", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "pid": 1234 + }, + "processor": { + "event": "metric", + "name": "metric" + }, + "service": { + "language": { + "name": "ecmascript" + }, + "name": "1234_service-12a3", + "node": { + "name": "node-1" + } + }, + "user": { + "email": "user@mail.com", + "id": "axb123hg", + "name": "logged-in-user" + } +} +``` + +### Logs + +Logs are application log and error events. +Logs are written to `logs-apm.*` and `logs-apm.error.*` indices. + +**Exported Fields** + +| Field | Description | Type | ECS | +|---|---|---|:---:| +|@timestamp|Event timestamp.|date| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.type|Data stream type.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.dataset|Data stream dataset.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.namespace|Data stream namespace.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.ephemeral_id|The Ephemeral ID identifies a running process.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.name|Name of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.version|Version of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|client.ip|IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.id|Cloud account ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.name|Cloud account name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.availability_zone|Cloud availability zone name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.id|Cloud instance/machine ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.name|Cloud instance/machine name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.machine.type|Cloud instance/machine type|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.id|Cloud project ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.name|Cloud project name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.provider|Cloud provider name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.region|Cloud region name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|container.id|Unique container id.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.address|Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.ip|IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.port|Port of the destination.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|error.culprit|Function call which was the primary perpetrator of this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.exception.code|The error code set when the error happened, e.g. database error code.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.exception.handled|Indicator whether the error was caught somewhere in the code or not.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.exception.message|The original error message.|text| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.exception.module|The module namespace of the original error.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.exception.type||keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.grouping_key|GroupingKey of the logged error for use in grouping.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.id|The ID of the error.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|error.log.level|The severity of the record.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.log.logger_name|The name of the logger instance used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.log.message|The additionally logged error message.|text| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.log.param_message|A parametrized message. E.g. 'Could not connect to %s'. The property message is still required, and should be equal to the param_message, but with placeholders replaced. In some situations the param_message is used to group errors together.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|host.architecture|The architecture of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.hostname|The hostname of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.ip|IP of the host that records the event.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.name|Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.os.platform|The platform of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.request.headers|The canonical headers of the monitored HTTP request.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|http.request.method|The http method of the request leading to this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.request.referrer|Referrer for this HTTP request.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.response.finished|Used by the Node agent to indicate when in the response life cycle an error has occurred.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|http.response.headers|The canonical headers of the monitored HTTP response.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|http.response.status_code|The status code of the HTTP response.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.version|The http version of the request leading to this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|kubernetes.namespace|Kubernetes namespace|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.node.name|Kubernetes node name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.name|Kubernetes pod name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.uid|Kubernetes Pod UID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|labels|A flat mapping of user-defined labels with string, boolean or number values.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.hostname|Hostname of the APM Server.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.listening|Address the server is listening on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.type|The type will be set to `apm-server`.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version|APM Server version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version_major|Major version number of the observer|byte| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|parent.id|The ID of the parent event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|process.args|Process arguments. May be filtered to protect sensitive information.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.pid|Numeric process ID of the service process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.ppid|Numeric ID of the service's parent process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.title|Service process title.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|processor.event|Processor event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|processor.name|Processor name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.name|Name of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.version|Version of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.name|Name of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.version|Version of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.name|Immutable name of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.node.name|Unique meaningful name of the service node.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.runtime.name|Name of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.runtime.version|Version of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.version|Version of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|source.ip|IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|trace.id|The ID of the trace to which the event belongs to.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|transaction.breakdown.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|transaction.name|Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id').|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.sampled|Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.type|Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|url.domain|The hostname of the request, e.g. "example.com".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.fragment|A fragment specifying a location in a web page , e.g. "top".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.full|The full, possibly agent-assembled URL of the request, e.g https://example.com:443/search?q=elasticsearch#top.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.path|The path of the request, e.g. "/search".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.port|The port of the request, e.g. 443.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.query|The query string of the request, e.g. "q=elasticsearch".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.scheme|The protocol of the request, e.g. "https:".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.email|Email of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.id|Identifier of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.name|The username of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.device.name|Name of the device.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.name|Name of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.original|Unparsed version of the user_agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.family|OS family (such as redhat, debian, freebsd, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.full|Operating system name, including the version or code name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.kernel|Operating system kernel version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.name|Operating system name, without the version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.platform|Operating system platform (such centos, ubuntu, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.version|Operating system version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.version|Version of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | + + +#### Example + +```json +{ + "@timestamp": "2017-05-09T15:04:05.999Z", + "agent": { + "name": "elastic-node", + "version": "3.14.0" + }, + "container": { + "id": "container-id" + }, + "ecs": { + "version": "1.6.0" + }, + "error": { + "grouping_key": "d6b3f958dfea98dc9ed2b57d5f0c48bb", + "id": "0f0e9d67c1854d21a6f44673ed561ec8", + "log": { + "level": "custom log level", + "message": "Cannot read property 'baz' of undefined" + } + }, + "event": { + "ingested": "2020-04-22T14:52:08.436124Z" + }, + "host": { + "architecture": "x64", + "ip": "127.0.0.1", + "os": { + "platform": "darwin" + } + }, + "kubernetes": { + "namespace": "namespace1", + "pod": { + "name": "pod-name", + "uid": "pod-uid" + } + }, + "labels": { + "tag1": "one", + "tag2": 2 + }, + "observer": { + "ephemeral_id": "f1838cde-80dd-4af5-b7ac-ffc2d3fccc9d", + "hostname": "ix.lan", + "id": "5d4dc8fe-cb14-47ee-b720-d6bf49f87ef0", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "node", + "server.js" + ], + "pid": 1234, + "ppid": 7788, + "title": "node" + }, + "processor": { + "event": "error", + "name": "error" + }, + "service": { + "environment": "staging", + "framework": { + "name": "Express", + "version": "1.2.3" + }, + "language": { + "name": "ecmascript", + "version": "8" + }, + "name": "1234_service-12a3", + "node": { + "name": "myservice-node" + }, + "runtime": { + "name": "node", + "version": "8.0.0" + }, + "version": "5.1.3" + }, + "timestamp": { + "us": 1494342245999000 + } +} +``` diff --git a/apmpackage/apm/0.1.0/manifest.yml b/apmpackage/apm/0.1.0/manifest.yml new file mode 100644 index 0000000000..774aec5d4b --- /dev/null +++ b/apmpackage/apm/0.1.0/manifest.yml @@ -0,0 +1,30 @@ +format_version: 1.0.0 +name: apm +title: Elastic APM +version: 0.1.0 +license: basic +description: Ingest APM data +type: solution # integration / solution +categories: + - monitoring # TODO do we need a new category? +release: experimental # experimental / beta / ga +conditions: + kibana.version: '^7.11.0' +policy_templates: +- name: apmserver + title: Elastic APM Integration + description: Elastic APM Integration + inputs: + - type: apm + title: Collect application traces + description: Collect application traces + vars: + - name: enable_rum + type: bool + title: Enable RUM + required: true + show_user: true + default: false + template_path: template.yml.hbs +owner: + github: elastic/apm-server diff --git a/apmpackage/cmd/gen-package/field.go b/apmpackage/cmd/gen-package/field.go new file mode 100644 index 0000000000..bde7617acd --- /dev/null +++ b/apmpackage/cmd/gen-package/field.go @@ -0,0 +1,56 @@ +// 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 main + +type field struct { + Name string `yaml:"name,omitempty"` + Key string `yaml:"key,omitempty"` + Title string `yaml:"title,omitempty"` + Group *int `yaml:"group,omitempty"` + Level string `yaml:"level,omitempty"` + Required *bool `yaml:"required,omitempty"` + Type string `yaml:"type,omitempty"` + Format string `yaml:"format,omitempty"` + Description string `yaml:"description,omitempty"` + Release string `yaml:"release,omitempty"` + Alias string `yaml:"alias,omitempty"` + Path string `yaml:"path,omitempty"` + Footnote string `yaml:"footnote,omitempty"` + IgnoreAbove *int `yaml:"ignore_above,omitempty"` + MultiFields []multiFieldDefinition `yaml:"multi_fields,omitempty"` + Fields []field `yaml:"fields,omitempty"` + IsECS bool `yaml:"-"` + HasECS bool `yaml:"-"` + HasNonECS bool `yaml:"-"` +} + +func (f field) isNonECSLeaf() bool { + return f.Type != "group" && !f.IsECS +} + +type multiFieldDefinition struct { + Name string `yaml:"name,omitempty"` + Type string `yaml:"type,omitempty"` + Norms *bool `yaml:"norms,omitempty"` + DefaultField *bool `yaml:"default_field,omitempty"` +} + +func copyFieldRoot(f field) field { + f.Fields = nil + return f +} diff --git a/apmpackage/cmd/gen-package/gendocs.go b/apmpackage/cmd/gen-package/gendocs.go new file mode 100644 index 0000000000..e6dbc8fe56 --- /dev/null +++ b/apmpackage/cmd/gen-package/gendocs.go @@ -0,0 +1,119 @@ +// 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 main + +import ( + "encoding/json" + "io/ioutil" + "os" + "path" + "sort" + "strings" + "text/template" +) + +func generateDocs(inputFields map[string][]field, version string) { + data := docsData{ + Traces: prepareFields(inputFields, version, "traces"), + Metrics: prepareFields(inputFields, version, "metrics"), + Logs: prepareFields(inputFields, version, "logs"), + TransactionExample: loadExample("transactions.json"), + SpanExample: loadExample("spans.json"), + MetricsExample: loadExample("metricsets.json"), + ErrorExample: loadExample("errors.json"), + } + t := template.New(docsTemplateFilePath) + tmpl, err := t.Funcs(map[string]interface{}{ + "Trim": strings.TrimSpace, + }).ParseFiles(docsTemplateFilePath) + if err != nil { + panic(err) + } + path := docsFilePath(version) + file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + if err != nil { + panic(err) + } + defer file.Close() + err = tmpl.ExecuteTemplate(file, "README.template.md", data) + if err != nil { + panic(err) + } +} + +type docsData struct { + Traces []field + Metrics []field + Logs []field + TransactionExample string + SpanExample string + MetricsExample string + ErrorExample string +} + +func prepareFields(inputFields map[string][]field, version, streamType string) []field { + extend := func(fs []field) []field { + var baseFields []field + for _, f := range loadFieldsFile(baseFieldsFilePath(version, streamType)) { + f.IsECS = true + baseFields = append(baseFields, f) + } + fs = append(baseFields, fs...) + return fs + } + return extend(order(flatten("", inputFields[streamType]))) +} + +func order(fs []field) []field { + sort.Slice(fs, func(i, j int) bool { + return fs[i].Name < fs[j].Name + }) + return fs +} + +func flatten(name string, fs []field) []field { + var ret []field + for _, f := range fs { + if name != "" { + f.Name = name + "." + f.Name + } + if f.Type == "group" { + ret = append(ret, flatten(f.Name, f.Fields)...) + } else { + ret = append(ret, f) + } + } + return ret +} + +func loadExample(file string) string { + in, err := ioutil.ReadFile(path.Join("docs/data/elasticsearch/generated/", file)) + if err != nil { + panic(err) + } + var aux []map[string]interface{} + err = json.Unmarshal(in, &aux) + if err != nil { + panic(err) + } + out, err := json.MarshalIndent(aux[0], "", " ") + if err != nil { + panic(err) + } + return string(out) +} diff --git a/apmpackage/cmd/gen-package/genfields.go b/apmpackage/cmd/gen-package/genfields.go new file mode 100644 index 0000000000..a55d5f7193 --- /dev/null +++ b/apmpackage/cmd/gen-package/genfields.go @@ -0,0 +1,165 @@ +// 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 main + +import ( + "io/ioutil" + "net/http" + "path/filepath" + + "gopkg.in/yaml.v2" + + "github.com/elastic/ecs/code/go/ecs" +) + +func generateFields(version string) map[string][]field { + + ecsFlatFields := loadECSFields() + + inputFieldsFiles := map[string][]field{ + "logs": concatFields("model/error/_meta/fields.yml"), + "metrics": concatFields("model/metricset/_meta/fields.yml", "model/profile/_meta/fields.yml", "x-pack/apm-server/fields/_meta/fields.yml"), + "traces": concatFields("model/transaction/_meta/fields.yml", "model/span/_meta/fields.yml"), + } + + for streamType, inputFields := range inputFieldsFiles { + var ecsFields []field + var nonECSFields []field + for _, fields := range populateECSInfo(ecsFlatFields, inputFields) { + ecs, nonECS := splitECSFields(fields) + if len(ecs.Fields) > 0 || ecs.IsECS { + ecsFields = append(ecsFields, ecs) + } + if len(nonECS.Fields) > 0 || ecs.isNonECSLeaf() { + nonECSFields = append(nonECSFields, nonECS) + } + } + var writeOutFields = func(fName string, data []field) { + bytes, err := yaml.Marshal(&data) + if err != nil { + panic(err) + } + err = ioutil.WriteFile(filepath.Join(fieldsPath(version, streamType), fName), bytes, 0644) + if err != nil { + panic(err) + } + } + if len(ecsFields) > 0 { + writeOutFields("ecs.yml", ecsFields) + } + if len(nonECSFields) > 0 { + writeOutFields("fields.yml", nonECSFields) + } + } + return inputFieldsFiles +} + +func populateECSInfo(ecsFlatFields map[string]interface{}, inputFields []field) []field { + var traverse func(string, []field) ([]field, bool, bool) + traverse = func(fName string, fs []field) ([]field, bool, bool) { + var ecsCount int + for idx, field := range fs { + fieldName := field.Name + if fName != "" { + fieldName = fName + "." + fieldName + } + if field.Type != "group" { + _, ok := ecsFlatFields[fieldName] + fs[idx].IsECS = ok + if ok { + ecsCount = ecsCount + 1 + } + } else { + fs[idx].Fields, fs[idx].HasECS, fs[idx].HasNonECS = traverse(fieldName, field.Fields) + } + } + // first boolean returned indicates whether there is at least an ECS field in the group + // second boolean returned indicates whether there is at least a non-ECS field in the group + return fs, ecsCount > 0, ecsCount < len(fs) + } + ret, _, _ := traverse("", inputFields) + return ret +} + +func splitECSFields(parent field) (field, field) { + ecsCopy := copyFieldRoot(parent) + nonECSCopy := copyFieldRoot(parent) + for _, field := range parent.Fields { + ecsChild, nonECSChild := splitECSFields(field) + if ecsChild.HasECS || ecsChild.IsECS { + ecsCopy.Fields = append(ecsCopy.Fields, ecsChild) + } + if nonECSChild.HasNonECS || nonECSChild.isNonECSLeaf() { + nonECSCopy.Fields = append(nonECSCopy.Fields, nonECSChild) + } + } + return ecsCopy, nonECSCopy +} + +func loadECSFields() map[string]interface{} { + url := "https://raw.githubusercontent.com/elastic/ecs/v" + ecs.Version + "/generated/ecs/ecs_flat.yml" + // TODO cache this to avoid fetching each time + resp, err := http.Get(url) + if err != nil { + panic(err) + } + defer resp.Body.Close() + var ret map[string]interface{} + err = yaml.NewDecoder(resp.Body).Decode(&ret) + if err != nil { + panic(err) + } + return ret +} + +func concatFields(fileNames ...string) []field { + var ret []field + for _, fname := range fileNames { + fs := loadFieldsFile(fname) + for _, key := range fs { + ret = append(ret, key.Fields...) + } + } + return ret +} + +func loadFieldsFile(path string) []field { + fields, err := ioutil.ReadFile(path) + if err != nil { + panic(err) + } + + var fs []field + err = yaml.Unmarshal(fields, &fs) + if err != nil { + panic(err) + } + return overrideFieldValues(fs) +} + +func overrideFieldValues(fs []field) []field { + var ret []field + for _, f := range fs { + if f.Type == "" { + f.Type = "keyword" + } + f.Fields = overrideFieldValues(f.Fields) + ret = append(ret, f) + } + return ret +} diff --git a/apmpackage/cmd/gen-package/main.go b/apmpackage/cmd/gen-package/main.go new file mode 100644 index 0000000000..cedadf4e36 --- /dev/null +++ b/apmpackage/cmd/gen-package/main.go @@ -0,0 +1,62 @@ +// 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 main + +import ( + "errors" + "fmt" + "github.com/elastic/apm-server/cmd" + "github.com/elastic/beats/v7/libbeat/common" + "io/ioutil" + "log" + "os" +) + +var versionMapping = map[string]string{ + "7.11": "0.1.0", + "8.0": "0.1.0", +} + +func main() { + stackVersion := common.MustNewVersion(cmd.DefaultSettings().Version) + shortVersion := fmt.Sprintf("%d.%d", stackVersion.Major, stackVersion.Minor) + packageVersion, ok := versionMapping[shortVersion] + if !ok { + panic(errors.New("package can't be generated for current apm-server version")) + } + clear(packageVersion) + inputFields := generateFields(packageVersion) + generateDocs(inputFields, packageVersion) + log.Printf("Package fields and docs generated for version %s (stack %s)", packageVersion, stackVersion.String()) +} + +func clear(version string) { + fileInfo, err := ioutil.ReadDir(dataStreamPath(version)) + if err != nil { + log.Printf("NOTE: if you are adding a new package version, you must create the folder"+ + " `apmpackage/apm/%s/` and copy all the contents from the previous version.", version) + panic(err) + } + for _, f := range fileInfo { + if f.IsDir() { + os.Remove(ecsFilePath(version, f.Name())) + os.Remove(fieldsFilePath(version, f.Name())) + } + } + ioutil.WriteFile(docsFilePath(version), nil, 0644) +} diff --git a/apmpackage/cmd/gen-package/paths.go b/apmpackage/cmd/gen-package/paths.go new file mode 100644 index 0000000000..73c01e9065 --- /dev/null +++ b/apmpackage/cmd/gen-package/paths.go @@ -0,0 +1,46 @@ +// 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 main + +import "path/filepath" + +var docsTemplateFilePath = "apmpackage/docs/README.template.md" + +func docsFilePath(version string) string { + return filepath.Join("apmpackage/apm/", version, "/docs/README.md") +} + +func dataStreamPath(version string) string { + return filepath.Join("apmpackage/apm/", version, "/data_stream/") +} + +func fieldsPath(version, dataStream string) string { + return filepath.Join(dataStreamPath(version), dataStream, "fields/") +} + +func ecsFilePath(version, dataStream string) string { + return filepath.Join(fieldsPath(version, dataStream), "ecs.yml") +} + +func fieldsFilePath(version, dataStream string) string { + return filepath.Join(fieldsPath(version, dataStream), "fields.yml") +} + +func baseFieldsFilePath(version, dataStream string) string { + return filepath.Join(fieldsPath(version, dataStream), "base-fields.yml") +} diff --git a/apmpackage/docs/README.template.md b/apmpackage/docs/README.template.md new file mode 100644 index 0000000000..d66347cdb1 --- /dev/null +++ b/apmpackage/docs/README.template.md @@ -0,0 +1,89 @@ +# APM Integration + +The APM integration installs templates and pipelines for APM data. +If a policy contains an `apm` input, any Elastic Agent(s) set up with that policy will run an APM Server binary, and bind to `localhost:8200`. +You must configure your APM Agents to communicate with that APM Server. + +If you have RUM enabled, you must run APM Server centrally. Otherwise, you can run it at the edge machines. +To do so, download and enroll an Elastic Agent in the same machines where your instrumented services run. + + +### Compatibility and limitations + +The APM integration requires Kibana 7.11 and Elasticsearch with basic license. +This version is experimental and has some limitations, listed bellow: + +- Elastic Cloud is not supported. +- Standalone mode is not supported. +- If you need to customize settings for APM Server, you need to update the agent policy manually. +Look for `apm-server` in the `apm` input. +- It is not possible to change APM Server settings dynamically. +You must update the policy with any changes you need and stop the APM Server process. + + +### Configuration parameters + +- `RUM`: Enables support for RUM monitoring. See the [documentation](https://www.elastic.co/guide/en/apm/server/current/configuration-rum.html) for details. + + +### Traces + +Traces are comprised of [spans and transactions](https://www.elastic.co/guide/en/apm/get-started/current/apm-data-model.html). +Traces are written to `traces-apm.*` indices. + +**Exported Fields** + +| Field | Description | Type | ECS | +|---|---|---|:---:| +{{range .Traces -}} +| {{- Trim .Name -}} | {{- Trim .Description -}} | {{- Trim .Type -}} | {{if .IsECS}} ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) {{else}} ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) {{end}} | +{{end}} + +#### Examples + +```json +{{.TransactionExample}} +``` + +```json +{{.SpanExample}} +``` + + +### Metrics + +Metrics include application-based metrics and some basic system metrics. +Metrics are written to `metrics-apm.*`, `metrics-apm.internal.*` and `metrics-apm.profiling.*` indices. + +**Exported Fields** + +| Field | Description | Type | ECS | +|---|---|---|:---:| +{{range .Metrics -}} +| {{- Trim .Name -}} | {{- Trim .Description -}} | {{- Trim .Type -}} | {{if .IsECS}} ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) {{else}} ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) {{end}} | +{{end}} + +#### Example + +```json +{{.MetricsExample}} +``` + +### Logs + +Logs are application log and error events. +Logs are written to `logs-apm.*` and `logs-apm.error.*` indices. + +**Exported Fields** + +| Field | Description | Type | ECS | +|---|---|---|:---:| +{{range .Logs -}} +| {{- Trim .Name -}} | {{- Trim .Description -}} | {{- Trim .Type -}} | {{if .IsECS}} ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) {{else}} ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) {{end}} | +{{end}} + +#### Example + +```json +{{.ErrorExample}} +``` diff --git a/docs/fields.asciidoc b/docs/fields.asciidoc index 24bb81f1d7..ee462b342d 100644 --- a/docs/fields.asciidoc +++ b/docs/fields.asciidoc @@ -682,8 +682,7 @@ Information pertaining to the running process where the data was collected *`process.args`*:: + -- -Process arguments. -May be filtered to protect sensitive information. +Process arguments. May be filtered to protect sensitive information. type: keyword @@ -858,8 +857,7 @@ Destination fields are usually populated in conjunction with source fields. *`destination.address`*:: + -- -Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. -Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. +Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. type: keyword @@ -870,8 +868,7 @@ type: keyword *`destination.ip`*:: + -- -IP addess of the destination. -Can be one of multiple IPv4 or IPv6 addresses. +IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. type: ip @@ -1688,8 +1685,7 @@ Information pertaining to the running process where the data was collected *`process.args`*:: + -- -Process arguments. -May be filtered to protect sensitive information. +Process arguments. May be filtered to protect sensitive information. type: keyword @@ -1864,8 +1860,7 @@ Destination fields are usually populated in conjunction with source fields. *`destination.address`*:: + -- -Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. -Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. +Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. type: keyword @@ -1876,8 +1871,7 @@ type: keyword *`destination.ip`*:: + -- -IP addess of the destination. -Can be one of multiple IPv4 or IPv6 addresses. +IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. type: ip @@ -2213,8 +2207,7 @@ example: us-east1 *`profile.id`*:: + -- -Unique ID for the profile. -All samples within a profile will have the same profile ID. +Unique ID for the profile. All samples within a profile will have the same profile ID. type: keyword @@ -2224,8 +2217,7 @@ type: keyword *`profile.duration`*:: + -- -Duration of the profile, in microseconds. -All samples within a profile will have the same duration. To aggregate durations, you should first group by the profile ID. +Duration of the profile, in microseconds. All samples within a profile will have the same duration. To aggregate durations, you should first group by the profile ID. type: long @@ -3043,8 +3035,7 @@ Information pertaining to the running process where the data was collected *`process.args`*:: + -- -Process arguments. -May be filtered to protect sensitive information. +Process arguments. May be filtered to protect sensitive information. type: keyword @@ -3219,8 +3210,7 @@ Destination fields are usually populated in conjunction with source fields. *`destination.address`*:: + -- -Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. -Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. +Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. type: keyword @@ -3231,8 +3221,7 @@ type: keyword *`destination.ip`*:: + -- -IP addess of the destination. -Can be one of multiple IPv4 or IPv6 addresses. +IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. type: ip @@ -4355,8 +4344,7 @@ Information pertaining to the running process where the data was collected *`process.args`*:: + -- -Process arguments. -May be filtered to protect sensitive information. +Process arguments. May be filtered to protect sensitive information. type: keyword @@ -4531,8 +4519,7 @@ Destination fields are usually populated in conjunction with source fields. *`destination.address`*:: + -- -Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. -Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. +Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. type: keyword @@ -4543,8 +4530,7 @@ type: keyword *`destination.ip`*:: + -- -IP addess of the destination. -Can be one of multiple IPv4 or IPv6 addresses. +IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. type: ip @@ -5398,8 +5384,7 @@ Information pertaining to the running process where the data was collected *`process.args`*:: + -- -Process arguments. -May be filtered to protect sensitive information. +Process arguments. May be filtered to protect sensitive information. type: keyword @@ -5574,8 +5559,7 @@ Destination fields are usually populated in conjunction with source fields. *`destination.address`*:: + -- -Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. -Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. +Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. type: keyword @@ -5586,8 +5570,7 @@ type: keyword *`destination.ip`*:: + -- -IP addess of the destination. -Can be one of multiple IPv4 or IPv6 addresses. +IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. type: ip diff --git a/go.mod b/go.mod index 8b7846bf62..72ac00ab99 100644 --- a/go.mod +++ b/go.mod @@ -16,12 +16,13 @@ require ( github.com/dustin/go-humanize v1.0.0 github.com/elastic/apm-server/approvaltest v0.0.0-00010101000000-000000000000 github.com/elastic/beats/v7 v7.0.0-alpha2.0.20201201203623-6d0785f9b8b2 + github.com/elastic/ecs v1.6.0 github.com/elastic/go-elasticsearch/v7 v7.9.0 github.com/elastic/go-elasticsearch/v8 v8.0.0-20200819071622-59b6a186f8dd github.com/elastic/go-hdrhistogram v0.1.0 github.com/elastic/go-licenser v0.3.1 github.com/elastic/go-sysinfo v1.4.0 // indirect - github.com/elastic/go-ucfg v0.8.3 + github.com/elastic/go-ucfg v0.8.4-0.20200415140258-1232bd4774a6 github.com/fatih/color v1.10.0 // indirect github.com/go-sourcemap/sourcemap v2.1.3+incompatible github.com/gofrs/uuid v3.3.0+incompatible @@ -29,6 +30,7 @@ require ( github.com/golang/protobuf v1.4.2 github.com/google/addlicense v0.0.0-20190907113143-be125746c2c4 // indirect github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99 + github.com/gorilla/mux v1.7.4 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.0 github.com/hashicorp/golang-lru v0.5.3 diff --git a/go.sum b/go.sum index 2df0f1cee5..792c720782 100644 --- a/go.sum +++ b/go.sum @@ -272,6 +272,8 @@ github.com/elastic/go-txfile v0.0.7/go.mod h1:H0nCoFae0a4ga57apgxFsgmRjevNCsEaT6 github.com/elastic/go-ucfg v0.7.0/go.mod h1:iaiY0NBIYeasNgycLyTvhJftQlQEUO2hpF+FX0JKxzo= github.com/elastic/go-ucfg v0.8.3 h1:leywnFjzr2QneZZWhE6uWd+QN/UpP0sdJRHYyuFvkeo= github.com/elastic/go-ucfg v0.8.3/go.mod h1:iaiY0NBIYeasNgycLyTvhJftQlQEUO2hpF+FX0JKxzo= +github.com/elastic/go-ucfg v0.8.4-0.20200415140258-1232bd4774a6 h1:Ehbr7du4rSSEypR8zePr0XRbMhO4PJgcHC9f8fDbgAg= +github.com/elastic/go-ucfg v0.8.4-0.20200415140258-1232bd4774a6/go.mod h1:iaiY0NBIYeasNgycLyTvhJftQlQEUO2hpF+FX0JKxzo= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= @@ -528,6 +530,8 @@ github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= diff --git a/include/fields.go b/include/fields.go index 15e662b3af..3c89b5e2c0 100644 --- a/include/fields.go +++ b/include/fields.go @@ -32,5 +32,5 @@ func init() { // AssetBuildFieldsFieldsYml returns asset data. // This is the base64 encoded gzipped contents of build/fields/fields.yml. func AssetBuildFieldsFieldsYml() string { - return "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" + return "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" } diff --git a/model/error/_meta/fields.yml b/model/error/_meta/fields.yml index 8975da87a7..330ba9a1f8 100644 --- a/model/error/_meta/fields.yml +++ b/model/error/_meta/fields.yml @@ -417,7 +417,6 @@ type: keyword description: > Process arguments. - May be filtered to protect sensitive information. overwrite: true @@ -532,7 +531,6 @@ description: 'Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. - Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.' overwrite: true @@ -541,7 +539,6 @@ level: core type: ip description: 'IP addess of the destination. - Can be one of multiple IPv4 or IPv6 addresses.' overwrite: true diff --git a/model/metricset/_meta/fields.yml b/model/metricset/_meta/fields.yml index dc8396d566..0ab675b084 100644 --- a/model/metricset/_meta/fields.yml +++ b/model/metricset/_meta/fields.yml @@ -333,7 +333,6 @@ type: keyword description: > Process arguments. - May be filtered to protect sensitive information. overwrite: true @@ -448,7 +447,6 @@ description: 'Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. - Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.' overwrite: true @@ -457,7 +455,6 @@ level: core type: ip description: 'IP addess of the destination. - Can be one of multiple IPv4 or IPv6 addresses.' overwrite: true diff --git a/model/profile/_meta/fields.yml b/model/profile/_meta/fields.yml index fc3fc7adab..1dddaac956 100644 --- a/model/profile/_meta/fields.yml +++ b/model/profile/_meta/fields.yml @@ -239,7 +239,6 @@ type: keyword description: > Process arguments. - May be filtered to protect sensitive information. overwrite: true @@ -354,7 +353,6 @@ description: 'Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. - Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.' overwrite: true @@ -363,7 +361,6 @@ level: core type: ip description: 'IP addess of the destination. - Can be one of multiple IPv4 or IPv6 addresses.' overwrite: true @@ -579,7 +576,6 @@ count: 1 description: > Unique ID for the profile. - All samples within a profile will have the same profile ID. - name: duration @@ -587,7 +583,6 @@ count: 1 description: > Duration of the profile, in microseconds. - All samples within a profile will have the same duration. To aggregate durations, you should first group by the profile ID. diff --git a/model/span/_meta/fields.yml b/model/span/_meta/fields.yml index be958fe1fe..5747956385 100644 --- a/model/span/_meta/fields.yml +++ b/model/span/_meta/fields.yml @@ -342,7 +342,6 @@ type: keyword description: > Process arguments. - May be filtered to protect sensitive information. overwrite: true @@ -457,7 +456,6 @@ description: 'Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. - Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.' overwrite: true @@ -466,7 +464,6 @@ level: core type: ip description: 'IP addess of the destination. - Can be one of multiple IPv4 or IPv6 addresses.' overwrite: true diff --git a/model/transaction/_meta/fields.yml b/model/transaction/_meta/fields.yml index 32d4181fe3..28941558be 100644 --- a/model/transaction/_meta/fields.yml +++ b/model/transaction/_meta/fields.yml @@ -446,7 +446,6 @@ type: keyword description: > Process arguments. - May be filtered to protect sensitive information. overwrite: true @@ -561,7 +560,6 @@ description: 'Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. - Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.' overwrite: true @@ -570,7 +568,6 @@ level: core type: ip description: 'IP addess of the destination. - Can be one of multiple IPv4 or IPv6 addresses.' overwrite: true diff --git a/tests/system/test_tls.py b/tests/system/test_tls.py index 686e39458d..d7f13e0e0f 100644 --- a/tests/system/test_tls.py +++ b/tests/system/test_tls.py @@ -1,3 +1,5 @@ +from apmserver import TimeoutError, integration_test +from apmserver import ServerBaseTest import os import requests import shutil @@ -6,8 +8,8 @@ import socket import pytest from requests.packages.urllib3.exceptions import SubjectAltNameWarning -from apmserver import ServerBaseTest -from apmserver import TimeoutError, integration_test +requests.packages.urllib3.disable_warnings(SubjectAltNameWarning) + INTEGRATION_TESTS = os.environ.get('INTEGRATION_TESTS', False)